xref: /plan9/sys/src/cmd/unix/drawterm/posix-arm/tas.c (revision 58da3067adcdccaaa043d0bfde28ba83b7ced07d)
103ff217eSDavid du Colombier #include "u.h"
203ff217eSDavid du Colombier #include "libc.h"
303ff217eSDavid du Colombier 
403ff217eSDavid du Colombier int
tas(long * x)503ff217eSDavid du Colombier tas(long *x)
603ff217eSDavid du Colombier {
7*58da3067SDavid du Colombier 	int     v, t, i = 1;
803ff217eSDavid du Colombier 
9*58da3067SDavid du Colombier #if ARMv5
1003ff217eSDavid du Colombier 	__asm__(
1103ff217eSDavid du Colombier 		"swp  %0, %1, [%2]"
1203ff217eSDavid du Colombier 		: "=&r" (v)
1303ff217eSDavid du Colombier 		: "r" (1), "r" (x)
1403ff217eSDavid du Colombier 		: "memory"
1503ff217eSDavid du Colombier 	);
16*58da3067SDavid du Colombier #else
17*58da3067SDavid du Colombier 	__asm__ (
18*58da3067SDavid du Colombier 		"1:	ldrex	%0, [%2]\n"
19*58da3067SDavid du Colombier 		"	strex	%1, %3, [%2]\n"
20*58da3067SDavid du Colombier 		"	teq	%1, #0\n"
21*58da3067SDavid du Colombier 		"	bne	1b"
22*58da3067SDavid du Colombier 		: "=&r" (v), "=&r" (t)
23*58da3067SDavid du Colombier 		: "r" (x), "r" (i)
24*58da3067SDavid du Colombier 		: "cc");
25*58da3067SDavid du Colombier #endif
2603ff217eSDavid du Colombier 	switch(v) {
2703ff217eSDavid du Colombier 	case 0:
2803ff217eSDavid du Colombier 	case 1:
2903ff217eSDavid du Colombier 		return v;
3003ff217eSDavid du Colombier 	default:
3103ff217eSDavid du Colombier 		print("canlock: corrupted 0x%lux\n", v);
3203ff217eSDavid du Colombier 		return 1;
3303ff217eSDavid du Colombier 	}
3403ff217eSDavid du Colombier }
35*58da3067SDavid du Colombier 
36