shithub: drawcpu

ref: 8d93ccdbb2a2dee8d2eb1387da1b316fdf84b208
dir: /posix-arm64/cas.c/

View raw version
#include "u.h"
#include "libc.h"

#ifndef __has_builtin
#define __has_builtin(x) 0
#endif

int
cas(int *x, int old, int new)
{
#if __has_builtin(__atomic_compare_exchange_n) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 7)))
	return __atomic_compare_exchange_n(x, &old, new, 0, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE);
#else
	int     v, t;

	__asm__ (
		"1:	ldxr	%0, [%3]\n"
		"	cmp	%0, %4\n"
		"	bne	2f\n"
		"	stxr	%w1, %5, [%3]\n"
		"	cmp	%1, #0\n"
		"	bne	1b\n"
		"2:"
		: "=&r" (v), "=&r" (t)
		: "m" (*x), "r" (x), "r" (old), "r" (new)
		: "cc");

	return (v == old);
#endif
}