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