15 #define __INLINE__ extern inline __attribute__((always_inline))
19 #if defined(__bgq__) || defined(__bgp__) || defined(__powerpc__)
20 __INLINE__ int32_t LoadReservedSigned32(
volatile int32_t *pVar )
23 asm volatile (
"lwarx %[rc],0,%[pVar];"
29 __INLINE__ int StoreConditionalSigned32(
volatile int32_t *pVar, int32_t Val )
32 asm volatile (
" stwcx. %2,0,%1;"
44 __INLINE__ int32_t CompareAndSwapSigned32(
volatile int32_t *var, int32_t Compare, int32_t NewValue )
46 asm volatile (
"msync" : : :
"memory");
48 int32_t OldValue = *var;
51 int32_t TmpValue = LoadReservedSigned32( var );
52 if ( Compare != TmpValue )
return(OldValue);
54 while( !StoreConditionalSigned32( var, NewValue ) );
59 __INLINE__ int32_t FetchAndAddSigned32(
volatile int32_t *pVar, int32_t value )
61 asm volatile (
"msync" : : :
"memory");
63 register int32_t old_val, tmp_val;
67 old_val = LoadReservedSigned32( pVar );
68 tmp_val = old_val + value;
70 while ( !StoreConditionalSigned32( pVar, tmp_val ) );
77 asm volatile (
"msync" : : :
"memory");
83 #error You cannot use PowerPC assembly on a non-PowerPC architecture!
#define __INLINE__
Definition: bgq_atomics.h:15