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