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/atom.s |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/libc/arm/atom.s')
-rwxr-xr-x | sys/src/libc/arm/atom.s | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/sys/src/libc/arm/atom.s b/sys/src/libc/arm/atom.s new file mode 100755 index 000000000..674021391 --- /dev/null +++ b/sys/src/libc/arm/atom.s @@ -0,0 +1,55 @@ + +/* + * int cas(ulong *p, ulong ov, ulong 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 */ +TEXT casp+0(SB),0,$12 /* r0 holds p */ +TEXT casl+0(SB),0,$12 /* r0 holds p */ + MOVW ov+4(FP), R1 + MOVW nv+8(FP), R2 +spincas: + LDREX(0,3) /* LDREX 0(R0),R3 */ + CMP.S R3, R1 + BNE fail + STREX(0,2,4) /* STREX 0(R0),R2,R4 */ + CMP.S $0, R4 + BNE spincas + MOVW $1, R0 + RET +fail: + MOVW $0, R0 + RET + +TEXT ainc(SB), $0 /* long ainc(long *); */ +spinainc: + LDREX(0,3) /* LDREX 0(R0),R3 */ + ADD $1,R3 + STREX(0,3,4) /* STREX 0(R0),R2,R4 */ + CMP.S $0, R4 + BNE spinainc + MOVW R3, R0 + RET + +TEXT adec(SB), $0 /* long ainc(long *); */ +spinadec: + LDREX(0,3) /* LDREX 0(R0),R3 */ + SUB $1,R3 + STREX(0,3,4) /* STREX 0(R0),R3,R4 */ + CMP.S $0, R4 + BNE spinadec + MOVW R3, R0 + RET + +TEXT loadlinked(SB), $0 /* long loadlinked(long *); */ + LDREX(0,0) /* LDREX 0(R0),R0 */ + RET + +TEXT storecond(SB), $0 /* int storecond(long *, long); */ + MOVW ov+4(FP), R3 + STREX(0,3,4) /* STREX 0(R0),R3,R0 */ + RSB $1, R0 + RET |