--- mono-1.1.8.3/mono/io-layer/atomic.h.orig 2005-05-30 22:19:57.000000000 +0200 +++ mono-1.1.8.3/mono/io-layer/atomic.h 2005-09-03 08:49:48.556163120 +0200 @@ -689,6 +689,117 @@ return old; } +#elif defined(__alpha__) +#define WAPI_ATOMIC_ASM + +static inline gint32 InterlockedCompareExchange(volatile gint32 *dest, + gint32 exch, gint32 comp) +{ + gint32 old, temp, temp2; + long compq = comp, exchq = exch; + + __asm__ __volatile__ ( + "1: ldl_l %2, %0\n" + " mov %2, %1\n" + " cmpeq %2, %5, %3\n" + " cmovne %3, %4, %2\n" + " stl_c %2, %0\n" + " beq %2, 1b\n" + : "=m" (*dest), "=&r" (old), "=&r" (temp), "=&r" (temp2) + : "r" (exchq), "r" (compq), "m" (*dest)); + return(old); +} + +static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp) +{ + gpointer old, temp, temp2; + + __asm__ __volatile__ ( + "1: ldq_l %2, %0\n" + " mov %2, %1\n" + " cmpeq %2, %5, %3\n" + " cmovne %3, %4, %2\n" + " stq_c %2, %0\n" + " beq %2, 1b\n" + : "=m" (*dest), "=&r" (old), "=&r" (temp), "=&r" (temp2) + : "r" (exch), "r" (comp), "m" (*dest)); + return(old); +} + +static inline gint32 InterlockedIncrement(volatile gint32 *val) +{ + gint32 temp, cur; + + __asm__ __volatile__ ( + "1: ldl_l %0, %1\n" + " addl %0, %3, %0\n" + " mov %0, %2\n" + " stl_c %0, %1\n" + " beq %0, 1b\n" + : "=&r" (temp), "=m" (*val), "=r" (cur) + : "Ir" (1), "m" (*val)); + return(cur); +} + +static inline gint32 InterlockedDecrement(volatile gint32 *val) +{ + gint32 temp, cur; + + __asm__ __volatile__ ( + "1: ldl_l %0, %1\n" + " addl %0, %3, %0\n" + " mov %0, %2\n" + " stl_c %0, %1\n" + " beq %0, 1b\n" + : "=&r" (temp), "=m" (*val), "=r" (cur) + : "Ir" (-1), "m" (*val)); + return(cur); +} + +static inline gint32 InterlockedExchange(volatile gint32 *val, gint32 new_val) +{ + gint32 ret, temp; + + __asm__ __volatile__ ( + "1: ldl_l %1, %0\n" + " mov %3, %2\n" + " stl_c %2, %0\n" + " beq %2, 1b\n" + : "=m" (*val), "=&r" (ret), "=&r" (temp) + : "r" (new_val), "m" (*val)); + return(ret); +} + +static inline gpointer InterlockedExchangePointer(volatile gpointer *val, gpointer new_val) +{ + gpointer ret, temp; + + __asm__ __volatile__ ( + "1: ldq_l %1, %0\n" + " mov %3, %2\n" + " stq_c %2, %0\n" + " beq %2, 1b\n" + : "=m" (*val), "=&r" (ret), "=&r" (temp) + : "r" (new_val), "m" (*val)); + return(ret); +} + +static inline gint32 InterlockedExchangeAdd(volatile gint32 *val, gint32 add) +{ + gint32 ret, temp; + + __asm__ __volatile__ ( + "1: ldl_l %2, %0\n" + " mov %2, %1\n" + " addl %2, %3, %2\n" + " stl_c %2, %0\n" + " beq %2, 1b\n" + : "=m" (*val), "=&r" (ret), "=&r" (temp) + : "r" (add), "m" (*val)); + + return(ret); +} + #else extern gint32 InterlockedCompareExchange(volatile gint32 *dest, gint32 exch, gint32 comp);