1/* 2 * R4000 user level lock code 3 */ 4 5#define LL(base, rt) WORD $((060<<26)|((base)<<21)|((rt)<<16)) 6#define SC(base, rt) WORD $((070<<26)|((base)<<21)|((rt)<<16)) 7#define NOOP WORD $0x27 8 9#ifdef oldstyle 10TEXT xadd(SB), $0 11 12 MOVW R1, R2 /* address of counter */ 13loop: MOVW n+4(FP), R3 /* increment */ 14 LL(2, 1) 15 NOOP 16 ADD R1,R3,R3 17 SC(2, 3) 18 NOOP 19 BEQ R3,loop 20 RET 21#endif 22 23TEXT _xinc(SB), $0 24 25 MOVW R1, R2 /* address of counter */ 26loop: MOVW $1, R3 27 LL(2, 1) 28 NOOP 29 ADD R1,R3,R3 30 SC(2, 3) 31 NOOP 32 BEQ R3,loop 33 RET 34 35TEXT _xdec(SB), $0 36 37 MOVW R1, R2 /* address of counter */ 38loop1: MOVW $-1, R3 39 LL(2, 1) 40 NOOP 41 ADD R1,R3,R3 42 MOVW R3, R1 43 SC(2, 3) 44 NOOP 45 BEQ R3,loop1 46 RET 47