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