ref: fe54357c8428219c5a27c4cbbebc8d49cc29bdf7
dir: /posix-arm/cas.c/
#include "u.h"
#include "libc.h"
int
cas(int *x, int old, int new)
{
int v, t;
#if ARMv5
__asm__(
"1: ldr %0, [%2]\n"
" cmp %0, %3\n"
" bne 2f\n"
" swp %1, %4, [%2]\n"
" cmp %1, %3\n"
" bne 1b\n"
"2:"
: "=&r" (v), "=&r" (t)
: "r" (x), "r" (old), "r" (new)
: "cc", "memory"
);
#else
__asm__ (
"1: ldrex %0, [%2]\n"
" cmp %0, %3\n"
" bne 2f\n"
" strex %1, %4, [%2]\n"
" teq %1, #0\n"
" bne 1b\n"
"2:"
: "=&r" (v), "=&r" (t)
: "r" (x), "r" (old), "r" (new)
: "cc");
#endif
return (v == old);
}