1*6c6e36e1SDavid du Colombier/* 2*6c6e36e1SDavid du Colombier * R4000 user-level atomic operations 3*6c6e36e1SDavid du Colombier */ 4*6c6e36e1SDavid du Colombier 5*6c6e36e1SDavid du Colombier#define LL(base, rt) WORD $((060<<26)|((base)<<21)|((rt)<<16)) 6*6c6e36e1SDavid du Colombier#define SC(base, rt) WORD $((070<<26)|((base)<<21)|((rt)<<16)) 7*6c6e36e1SDavid du Colombier#define NOOP WORD $0x27 8*6c6e36e1SDavid du Colombier 9*6c6e36e1SDavid du ColombierTEXT ainc(SB), 1, $-8 /* long ainc(long *); */ 10*6c6e36e1SDavid du ColombierTEXT _xinc(SB), 1, $-8 /* void _xinc(long *); */ 11*6c6e36e1SDavid du Colombier MOVV R1, R2 /* address of counter */ 12*6c6e36e1SDavid du Colombierloop: MOVW $1, R3 13*6c6e36e1SDavid du Colombier LL(2, 1) 14*6c6e36e1SDavid du Colombier NOOP 15*6c6e36e1SDavid du Colombier ADDU R1, R3 16*6c6e36e1SDavid du Colombier MOVV R3, R1 /* return new value */ 17*6c6e36e1SDavid du Colombier SC(2, 3) 18*6c6e36e1SDavid du Colombier NOOP 19*6c6e36e1SDavid du Colombier BEQ R3,loop 20*6c6e36e1SDavid du Colombier RET 21*6c6e36e1SDavid du Colombier 22*6c6e36e1SDavid du ColombierTEXT adec(SB), 1, $-8 /* long adec(long*); */ 23*6c6e36e1SDavid du ColombierTEXT _xdec(SB), 1, $-8 /* long _xdec(long *); */ 24*6c6e36e1SDavid du Colombier MOVV R1, R2 /* address of counter */ 25*6c6e36e1SDavid du Colombierloop1: MOVW $-1, R3 26*6c6e36e1SDavid du Colombier LL(2, 1) 27*6c6e36e1SDavid du Colombier NOOP 28*6c6e36e1SDavid du Colombier ADDU R1, R3 29*6c6e36e1SDavid du Colombier MOVV R3, R1 /* return new value */ 30*6c6e36e1SDavid du Colombier SC(2, 3) 31*6c6e36e1SDavid du Colombier NOOP 32*6c6e36e1SDavid du Colombier BEQ R3,loop1 33*6c6e36e1SDavid du Colombier RET 34*6c6e36e1SDavid du Colombier 35*6c6e36e1SDavid du Colombier/* 36*6c6e36e1SDavid du Colombier * int cas(uint* p, int ov, int nv); 37*6c6e36e1SDavid du Colombier */ 38*6c6e36e1SDavid du ColombierTEXT cas(SB), 1, $-8 39*6c6e36e1SDavid du Colombier MOVW ov+12(FP), R2 40*6c6e36e1SDavid du Colombier MOVW nv+20(FP), R3 41*6c6e36e1SDavid du Colombierspincas: 42*6c6e36e1SDavid du Colombier LL(1, 4) /* R4 = *R1 */ 43*6c6e36e1SDavid du Colombier NOOP 44*6c6e36e1SDavid du Colombier BNE R2, R4, fail 45*6c6e36e1SDavid du Colombier SC(1, 3) /* *R1 = R3 */ 46*6c6e36e1SDavid du Colombier NOOP 47*6c6e36e1SDavid du Colombier BEQ R3, spincas /* R3 == 0 means store failed */ 48*6c6e36e1SDavid du Colombier MOVW $1, R1 49*6c6e36e1SDavid du Colombier RET 50*6c6e36e1SDavid du Colombierfail: 51*6c6e36e1SDavid du Colombier MOVV $0, R1 52*6c6e36e1SDavid du Colombier RET 53