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/libthread/xincmips.s |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/libthread/xincmips.s')
-rwxr-xr-x | sys/src/libthread/xincmips.s | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/sys/src/libthread/xincmips.s b/sys/src/libthread/xincmips.s new file mode 100755 index 000000000..8e53c1adf --- /dev/null +++ b/sys/src/libthread/xincmips.s @@ -0,0 +1,46 @@ +/* + * R4000 user level lock code + */ + +#define LL(base, rt) WORD $((060<<26)|((base)<<21)|((rt)<<16)) +#define SC(base, rt) WORD $((070<<26)|((base)<<21)|((rt)<<16)) +#define NOOP WORD $0x27 + +#ifdef oldstyle +TEXT xadd(SB), $0 + + MOVW R1, R2 /* address of counter */ +loop: MOVW n+4(FP), R3 /* increment */ + LL(2, 1) + NOOP + ADD R1,R3,R3 + SC(2, 3) + NOOP + BEQ R3,loop + RET +#endif + +TEXT _xinc(SB), $0 + + MOVW R1, R2 /* address of counter */ +loop: MOVW $1, R3 + LL(2, 1) + NOOP + ADD R1,R3,R3 + SC(2, 3) + NOOP + BEQ R3,loop + RET + +TEXT _xdec(SB), $0 + + MOVW R1, R2 /* address of counter */ +loop1: MOVW $-1, R3 + LL(2, 1) + NOOP + ADD R1,R3,R3 + MOVW R3, R1 + SC(2, 3) + NOOP + BEQ R3,loop1 + RET |