#define a_cas a_cas static inline int a_cas(volatile int *p, int t, int s) { register int old, tmp; __asm__ __volatile__ ( " addi %0, r0, 0\n" "1: lwx %0, %2, r0\n" " rsubk %1, %0, %3\n" " bnei %1, 1f\n" " swx %4, %2, r0\n" " addic %1, r0, 0\n" " bnei %1, 1b\n" "1: " : "=&r"(old), "=&r"(tmp) : "r"(p), "r"(t), "r"(s) : "cc", "memory" ); return old; } #define a_swap a_swap static inline int a_swap(volatile int *x, int v) { register int old, tmp; __asm__ __volatile__ ( " addi %0, r0, 0\n" "1: lwx %0, %2, r0\n" " swx %3, %2, r0\n" " addic %1, r0, 0\n" " bnei %1, 1b\n" "1: " : "=&r"(old), "=&r"(tmp) : "r"(x), "r"(v) : "cc", "memory" ); return old; } #define a_fetch_add a_fetch_add static inline int a_fetch_add(volatile int *x, int v) { register int new, tmp; __asm__ __volatile__ ( " addi %0, r0, 0\n" "1: lwx %0, %2, r0\n" " addk %0, %0, %3\n" " swx %0, %2, r0\n" " addic %1, r0, 0\n" " bnei %1, 1b\n" "1: " : "=&r"(new), "=&r"(tmp) : "r"(x), "r"(v) : "cc", "memory" ); return new-v; }