diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/libc/arm/cas.s |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/libc/arm/cas.s')
-rwxr-xr-x | sys/src/libc/arm/cas.s | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/sys/src/libc/arm/cas.s b/sys/src/libc/arm/cas.s new file mode 100755 index 000000000..7bb3a05f7 --- /dev/null +++ b/sys/src/libc/arm/cas.s @@ -0,0 +1,28 @@ + +/* + * int swp(int r, int *p); + * uchar swpb(uchar r, uchar *p); + * + * int cas(uintptr *p, uintptr ov, uintptr nv); + */ + +#define LDREX(a,r) WORD $(0xe<<28|0x01900f9f | (a)<<16 | (r)<<12) +#define STREX(a,v,r) WORD $(0xe<<28|0x01800f90 | (a)<<16 | (r)<<12 | (v)<<0) + +TEXT cas+0(SB),0,$12 /* r0 holds p */ + MOVW ov+4(FP), R1 + MOVW nv+8(FP), R2 +spin: +/* LDREX 0(R0),R3 */ + LDREX(0,3) + CMP.S R3, R1 + BNE fail +/* STREX 0(R0),R2,R4 */ + STREX(0,2,4) + CMP.S $0, R4 + BNE spin + MOVW $1, R0 + RET +fail: + MOVW $0, R0 + RET |