ref: c9f4e6f1cfa96e6a12b23801e16f8e0fe36a266d
dir: /posix-arm64/tas.c/
#include "u.h"
#include "libc.h"
#ifndef __has_builtin
#define __has_builtin(x) 0
#endif
int
tas(int *x)
{
#if __has_builtin(__atomic_test_and_set) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 7)))
return __atomic_test_and_set(x, __ATOMIC_ACQ_REL);
#else
int v,t, i = 1;
__asm__ (
"1: ldxr %0, [%2]\n"
" stxr %w1, %3, [%2]\n"
" cmp %1, #0\n"
" bne 1b"
: "=&r" (v), "=&r" (t)
: "r" (x), "r" (i)
: "cc");
switch(v) {
case 0:
case 1:
return v;
default:
print("canlock: corrupted 0x%lux\n", v);
return 1;
}
#endif
}