shithub: drawcpu

ref: f6da1ab12d14fe4db7a76f390d6dfc85de660f1c
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);
}