1*51f48f69SDavid du Colombier#define CLREX WORD $0xf57ff01f 2*51f48f69SDavid du Colombier#define LDREX(a,r) WORD $(0xe<<28|0x01900f9f | (a)<<16 | (r)<<12) 3*51f48f69SDavid du Colombier/* `The order of operands is from left to right in dataflow order' - asm man */ 4*51f48f69SDavid du Colombier#define STREX(v,a,r) WORD $(0xe<<28|0x01800f90 | (a)<<16 | (r)<<12 | (v)<<0) 5*51f48f69SDavid du Colombier 6*51f48f69SDavid du Colombier/* 7*51f48f69SDavid du Colombier * int cas(ulong *p, ulong ov, ulong nv); 8*51f48f69SDavid du Colombier */ 9*51f48f69SDavid du Colombier 10*51f48f69SDavid du ColombierTEXT cas+0(SB),0,$0 /* r0 holds p */ 11*51f48f69SDavid du ColombierTEXT casp+0(SB),0,$0 /* r0 holds p */ 12*51f48f69SDavid du Colombier MOVW ov+4(FP), R1 13*51f48f69SDavid du Colombier MOVW nv+8(FP), R2 14*51f48f69SDavid du Colombierspincas: 15*51f48f69SDavid du Colombier LDREX(0,3) /* LDREX 0(R0),R3 */ 16*51f48f69SDavid du Colombier CMP.S R3, R1 17*51f48f69SDavid du Colombier BNE fail 18*51f48f69SDavid du Colombier STREX(2,0,4) /* STREX 0(R0),R2,R4 */ 19*51f48f69SDavid du Colombier CMP.S $0, R4 20*51f48f69SDavid du Colombier BNE spincas 21*51f48f69SDavid du Colombier MOVW $1, R0 22*51f48f69SDavid du Colombier RET 23*51f48f69SDavid du Colombierfail: 24*51f48f69SDavid du Colombier CLREX 25*51f48f69SDavid du Colombier MOVW $0, R0 26*51f48f69SDavid du Colombier RET 27*51f48f69SDavid du Colombier 28*51f48f69SDavid du ColombierTEXT _xinc(SB), $0 /* void _xinc(long *); */ 29*51f48f69SDavid du ColombierTEXT ainc(SB), $0 /* long ainc(long *); */ 30*51f48f69SDavid du Colombierspinainc: 31*51f48f69SDavid du Colombier LDREX(0,3) /* LDREX 0(R0),R3 */ 32*51f48f69SDavid du Colombier ADD $1,R3 33*51f48f69SDavid du Colombier STREX(3,0,4) /* STREX 0(R0),R3,R4 */ 34*51f48f69SDavid du Colombier CMP.S $0, R4 35*51f48f69SDavid du Colombier BNE spinainc 36*51f48f69SDavid du Colombier MOVW R3, R0 37*51f48f69SDavid du Colombier RET 38*51f48f69SDavid du Colombier 39*51f48f69SDavid du ColombierTEXT _xdec(SB), $0 /* long _xdec(long *); */ 40*51f48f69SDavid du ColombierTEXT adec(SB), $0 /* long adec(long *); */ 41*51f48f69SDavid du Colombierspinadec: 42*51f48f69SDavid du Colombier LDREX(0,3) /* LDREX 0(R0),R3 */ 43*51f48f69SDavid du Colombier SUB $1,R3 44*51f48f69SDavid du Colombier STREX(3,0,4) /* STREX 0(R0),R3,R4 */ 45*51f48f69SDavid du Colombier CMP.S $0, R4 46*51f48f69SDavid du Colombier BNE spinadec 47*51f48f69SDavid du Colombier MOVW R3, R0 48*51f48f69SDavid du Colombier RET 49*51f48f69SDavid du Colombier 50*51f48f69SDavid du ColombierTEXT loadlinked(SB), $0 /* long loadlinked(long *); */ 51*51f48f69SDavid du Colombier LDREX(0,0) /* LDREX 0(R0),R0 */ 52*51f48f69SDavid du Colombier RET 53*51f48f69SDavid du Colombier 54*51f48f69SDavid du ColombierTEXT storecond(SB), $0 /* int storecond(long *, long); */ 55*51f48f69SDavid du Colombier MOVW ov+4(FP), R3 56*51f48f69SDavid du Colombier STREX(3,0,0) /* STREX 0(R0),R3,R0 */ 57*51f48f69SDavid du Colombier RSB $1, R0 58*51f48f69SDavid du Colombier RET 59