tags 337867 + patch
thanks

Hi,

here's a patch, but I haven't tested it yet.

--- common/include/atomicbase.h~        2004-12-22 21:00:41.000000000 +0100
+++ common/include/atomicbase.h 2005-11-07 01:12:23.000000000 +0100
@@ -852,7 +852,7 @@
  * know whether you need to retry or not.
  *
  */
-#elif defined (__alpha)
+#elif defined (__alpha) && defined (__DECC)
 
 #include <c_asm.h>
 
@@ -971,6 +971,101 @@
 #define HXAtomicSubUINT32(p,n) HXAtomicSubRetUINT32((p),(n))
 
 
+#elif defined (__alpha) && defined (__GNUC__)
+
+/* Add n and return new value */
+inline INT32
+HXAtomicAddRetINT32(INT32* pNum, INT32 n)
+{
+    INT32 tmp, ret;
+    asm volatile(
+       "1: ldl_l   %[ret], %[val]          \n"
+       "   addl    %[ret], %[inc], %[tmp]  \n"
+       "   addl    %[ret], %[inc], %[ret]  \n"
+       "   stl_c   %[tmp], %[val]          \n"
+       "   beq     %[tmp], 2f              \n"
+       ".subsection 2                      \n"
+       "2: br      1b                      \n"
+       ".previous"
+       : [ret] "=&r" (ret),
+         [tmp] "=&r" (tmp),
+         [val] "=m" (*pNum)
+       : [inc] "Ir" (n), "m" (*pNum));
+    return ret;
+}
+
+/* Subtract n and return new value */
+inline INT32
+HXAtomicSubRetINT32(INT32* pNum, INT32 n)
+{
+    INT32 tmp, ret;
+    asm volatile(
+       "1: ldl_l   %[ret], %[val]          \n"
+       "   subl    %[ret], %[inc], %[tmp]  \n"
+       "   subl    %[ret], %[inc], %[ret]  \n"
+       "   stl_c   %[tmp], %[val]          \n"
+       "   beq     %[tmp], 2f              \n"
+       ".subsection 2                      \n"
+       "2: br      1b                      \n"
+       ".previous"
+       : [ret] "=&r" (ret),
+         [tmp] "=&r" (tmp),
+         [val] "=m" (*pNum)
+       : [inc] "Ir" (n), "m" (*pNum));
+    return ret;
+}
+
+/* Increment by 1 and return new value */
+inline INT32
+HXAtomicIncRetINT32(INT32* pNum)
+{
+    return HXAtomicAddRetINT32(pNum, 1);
+}
+
+/* Decrement by 1 and return new value */
+inline INT32
+HXAtomicDecRetINT32(INT32* pNum)
+{
+    return HXAtomicSubRetINT32(pNum, 1);
+}
+
+/* Increment by 1 and return new value */
+inline UINT32
+HXAtomicIncRetUINT32(UINT32* pNum)
+{
+    return HXAtomicIncRetINT32((INT32*) pNum);
+}
+
+/* Decrement by 1 and return new value */
+inline UINT32
+HXAtomicDecRetUINT32(UINT32* pNum)
+{
+    return HXAtomicDecRetINT32((INT32*) pNum);
+}
+
+/* Add n and return new value */
+inline UINT32
+HXAtomicAddRetUINT32(UINT32* pNum, UINT32 n)
+{
+    return HXAtomicAddRetINT32((INT32*) pNum, n);
+}
+
+/* Subtract n and return new value */
+inline UINT32
+HXAtomicSubRetUINT32(UINT32* pNum, UINT32 n)
+{
+    return HXAtomicSubRetINT32((INT32*) pNum, n);
+}
+
+#define HXAtomicIncINT32(p)    HXAtomicIncRetINT32((p))
+#define HXAtomicDecINT32(p)    HXAtomicDecRetINT32((p))
+#define HXAtomicAddINT32(p,n)  HXAtomicAddRetINT32((p),(n))
+#define HXAtomicSubINT32(p,n)  HXAtomicSubRetINT32((p),(n))
+
+#define HXAtomicIncUINT32(p)   HXAtomicIncRetUINT32((p))
+#define HXAtomicDecUINT32(p)   HXAtomicDecRetUINT32((p))
+#define HXAtomicAddUINT32(p,n) HXAtomicAddRetUINT32((p),(n))
+#define HXAtomicSubUINT32(p,n) HXAtomicSubRetUINT32((p),(n))
 
 /***********************************************************************
  * AIX / PowerPC (Native compiler)




-- 
        Falk


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to