shithub: drawcpu

ref: 746e0c9217ab9ee1884b721a955b712d59b13549
dir: /posix-arm/cas.c/

View raw version
#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);
}