xref: /plan9/sys/src/cmd/unix/drawterm/posix-arm/tas.c (revision 58da3067adcdccaaa043d0bfde28ba83b7ced07d)
1 #include "u.h"
2 #include "libc.h"
3 
4 int
tas(long * x)5 tas(long *x)
6 {
7 	int     v, t, i = 1;
8 
9 #if ARMv5
10 	__asm__(
11 		"swp  %0, %1, [%2]"
12 		: "=&r" (v)
13 		: "r" (1), "r" (x)
14 		: "memory"
15 	);
16 #else
17 	__asm__ (
18 		"1:	ldrex	%0, [%2]\n"
19 		"	strex	%1, %3, [%2]\n"
20 		"	teq	%1, #0\n"
21 		"	bne	1b"
22 		: "=&r" (v), "=&r" (t)
23 		: "r" (x), "r" (i)
24 		: "cc");
25 #endif
26 	switch(v) {
27 	case 0:
28 	case 1:
29 		return v;
30 	default:
31 		print("canlock: corrupted 0x%lux\n", v);
32 		return 1;
33 	}
34 }
35 
36