1*43fc641dSDavid du Colombier#define DMB MCR 15, 0, R0, C7, C10, 5 251f48f69SDavid du Colombier#define CLREX WORD $0xf57ff01f 351f48f69SDavid du Colombier#define LDREX(a,r) WORD $(0xe<<28|0x01900f9f | (a)<<16 | (r)<<12) 451f48f69SDavid du Colombier/* `The order of operands is from left to right in dataflow order' - asm man */ 551f48f69SDavid du Colombier#define STREX(v,a,r) WORD $(0xe<<28|0x01800f90 | (a)<<16 | (r)<<12 | (v)<<0) 651f48f69SDavid du Colombier 751f48f69SDavid du Colombier/* 851f48f69SDavid du Colombier * int cas(ulong *p, ulong ov, ulong nv); 951f48f69SDavid du Colombier */ 1051f48f69SDavid du Colombier 1151f48f69SDavid du ColombierTEXT cas+0(SB),0,$0 /* r0 holds p */ 1251f48f69SDavid du ColombierTEXT casp+0(SB),0,$0 /* r0 holds p */ 1351f48f69SDavid du Colombier MOVW ov+4(FP), R1 1451f48f69SDavid du Colombier MOVW nv+8(FP), R2 1551f48f69SDavid du Colombierspincas: 1651f48f69SDavid du Colombier LDREX(0,3) /* LDREX 0(R0),R3 */ 1751f48f69SDavid du Colombier CMP.S R3, R1 1851f48f69SDavid du Colombier BNE fail 1951f48f69SDavid du Colombier STREX(2,0,4) /* STREX 0(R0),R2,R4 */ 2051f48f69SDavid du Colombier CMP.S $0, R4 2151f48f69SDavid du Colombier BNE spincas 22*43fc641dSDavid du Colombier MOVW $0, R0 23*43fc641dSDavid du Colombier DMB 2451f48f69SDavid du Colombier MOVW $1, R0 2551f48f69SDavid du Colombier RET 2651f48f69SDavid du Colombierfail: 2751f48f69SDavid du Colombier CLREX 2851f48f69SDavid du Colombier MOVW $0, R0 29*43fc641dSDavid du Colombier DMB 3051f48f69SDavid du Colombier RET 3151f48f69SDavid du Colombier 3251f48f69SDavid du ColombierTEXT _xinc(SB), $0 /* void _xinc(long *); */ 3351f48f69SDavid du ColombierTEXT ainc(SB), $0 /* long ainc(long *); */ 3451f48f69SDavid du Colombierspinainc: 3551f48f69SDavid du Colombier LDREX(0,3) /* LDREX 0(R0),R3 */ 3651f48f69SDavid du Colombier ADD $1,R3 3751f48f69SDavid du Colombier STREX(3,0,4) /* STREX 0(R0),R3,R4 */ 3851f48f69SDavid du Colombier CMP.S $0, R4 3951f48f69SDavid du Colombier BNE spinainc 40*43fc641dSDavid du Colombier MOVW $0, R0 41*43fc641dSDavid du Colombier DMB 4251f48f69SDavid du Colombier MOVW R3, R0 4351f48f69SDavid du Colombier RET 4451f48f69SDavid du Colombier 4551f48f69SDavid du ColombierTEXT _xdec(SB), $0 /* long _xdec(long *); */ 4651f48f69SDavid du ColombierTEXT adec(SB), $0 /* long adec(long *); */ 4751f48f69SDavid du Colombierspinadec: 4851f48f69SDavid du Colombier LDREX(0,3) /* LDREX 0(R0),R3 */ 4951f48f69SDavid du Colombier SUB $1,R3 5051f48f69SDavid du Colombier STREX(3,0,4) /* STREX 0(R0),R3,R4 */ 5151f48f69SDavid du Colombier CMP.S $0, R4 5251f48f69SDavid du Colombier BNE spinadec 53*43fc641dSDavid du Colombier MOVW $0, R0 54*43fc641dSDavid du Colombier DMB 5551f48f69SDavid du Colombier MOVW R3, R0 5651f48f69SDavid du Colombier RET 5751f48f69SDavid du Colombier 5851f48f69SDavid du ColombierTEXT loadlinked(SB), $0 /* long loadlinked(long *); */ 5951f48f69SDavid du Colombier LDREX(0,0) /* LDREX 0(R0),R0 */ 6051f48f69SDavid du Colombier RET 6151f48f69SDavid du Colombier 6251f48f69SDavid du ColombierTEXT storecond(SB), $0 /* int storecond(long *, long); */ 6351f48f69SDavid du Colombier MOVW ov+4(FP), R3 64*43fc641dSDavid du Colombier STREX(3,0,4) /* STREX 0(R0),R3,R4 */ 65*43fc641dSDavid du Colombier MOVW $0, R0 66*43fc641dSDavid du Colombier DMB 67*43fc641dSDavid du Colombier RSB $1, R4, R0 6851f48f69SDavid du Colombier RET 69