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]