static inline int a_ll(volatile int *p) { int x; asm volatile ("lwarx %0, 0, %1" : "=r"(x) : "r"(p) : "memory"); return x; } static inline int a_sc(volatile int *p, int x) { asm goto ("stwcx. %0, 0, %1\nbne- %l2" : : "r"(x), "r"(p) : "cc","memory" : fail); return 1; fail: return 0; } int a_cas(volatile int *p, int t, int s) { int x; do { x = a_ll(p); if (x != t) break; } while (!a_sc(p, s)); return x; }