1*f05caca4SDavid du ColombierTEXT ainc(SB), $0 /* long ainc(long *); */ 2*f05caca4SDavid du Colombier MOVL addr+0(FP), BX 3*f05caca4SDavid du Colombierainclp: 4*f05caca4SDavid du Colombier MOVL (BX), AX 5*f05caca4SDavid du Colombier MOVL AX, CX 6*f05caca4SDavid du Colombier INCL CX 7*f05caca4SDavid du Colombier LOCK 8*f05caca4SDavid du Colombier BYTE $0x0F; BYTE $0xB1; BYTE $0x0B /* CMPXCHGL CX, (BX) */ 9*f05caca4SDavid du Colombier JNZ ainclp 10*f05caca4SDavid du Colombier MOVL CX, AX 11*f05caca4SDavid du Colombier RET 12*f05caca4SDavid du Colombier 13*f05caca4SDavid du ColombierTEXT adec(SB), $0 /* long adec(long*); */ 14*f05caca4SDavid du Colombier MOVL addr+0(FP), BX 15*f05caca4SDavid du Colombieradeclp: 16*f05caca4SDavid du Colombier MOVL (BX), AX 17*f05caca4SDavid du Colombier MOVL AX, CX 18*f05caca4SDavid du Colombier DECL CX 19*f05caca4SDavid du Colombier LOCK 20*f05caca4SDavid du Colombier BYTE $0x0F; BYTE $0xB1; BYTE $0x0B /* CMPXCHGL CX, (BX) */ 21*f05caca4SDavid du Colombier JNZ adeclp 22*f05caca4SDavid du Colombier MOVL CX, AX 23*f05caca4SDavid du Colombier RET 24*f05caca4SDavid du Colombier 25*f05caca4SDavid du Colombier/* 26*f05caca4SDavid du Colombier * int cas32(u32int *p, u32int ov, u32int nv); 27*f05caca4SDavid du Colombier * int cas(uint *p, int ov, int nv); 28*f05caca4SDavid du Colombier * int casp(void **p, void *ov, void *nv); 29*f05caca4SDavid du Colombier * int casl(ulong *p, ulong ov, ulong nv); 30*f05caca4SDavid du Colombier */ 31*f05caca4SDavid du Colombier 32*f05caca4SDavid du Colombier/* 33*f05caca4SDavid du Colombier * CMPXCHG (CX), DX: 0000 1111 1011 000w oorr rmmm, 34*f05caca4SDavid du Colombier * mmm = CX = 001; rrr = DX = 010 35*f05caca4SDavid du Colombier */ 36*f05caca4SDavid du Colombier 37*f05caca4SDavid du Colombier#define CMPXCHG BYTE $0x0F; BYTE $0xB1; BYTE $0x11 38*f05caca4SDavid du Colombier 39*f05caca4SDavid du ColombierTEXT cas32+0(SB),0,$0 40*f05caca4SDavid du ColombierTEXT cas+0(SB),0,$0 41*f05caca4SDavid du ColombierTEXT casp+0(SB),0,$0 42*f05caca4SDavid du ColombierTEXT casl+0(SB),0,$0 43*f05caca4SDavid du Colombier MOVL p+0(FP), CX 44*f05caca4SDavid du Colombier MOVL ov+4(FP), AX 45*f05caca4SDavid du Colombier MOVL nv+8(FP), DX 46*f05caca4SDavid du Colombier LOCK 47*f05caca4SDavid du Colombier CMPXCHG 48*f05caca4SDavid du Colombier JNE fail 49*f05caca4SDavid du Colombier MOVL $1,AX 50*f05caca4SDavid du Colombier RET 51*f05caca4SDavid du Colombierfail: 52*f05caca4SDavid du Colombier MOVL $0,AX 53*f05caca4SDavid du Colombier RET 54*f05caca4SDavid du Colombier 55*f05caca4SDavid du Colombier/* 56*f05caca4SDavid du Colombier * int cas64(u64int *p, u64int ov, u64int nv); 57*f05caca4SDavid du Colombier */ 58*f05caca4SDavid du Colombier 59*f05caca4SDavid du Colombier/* 60*f05caca4SDavid du Colombier * CMPXCHG64 (DI): 0000 1111 1100 0111 0000 1110, 61*f05caca4SDavid du Colombier */ 62*f05caca4SDavid du Colombier 63*f05caca4SDavid du Colombier#define CMPXCHG64 BYTE $0x0F; BYTE $0xC7; BYTE $0x0F 64*f05caca4SDavid du Colombier 65*f05caca4SDavid du ColombierTEXT cas64+0(SB),0,$0 66*f05caca4SDavid du Colombier MOVL p+0(FP), DI 67*f05caca4SDavid du Colombier MOVL ov+0x4(FP), AX 68*f05caca4SDavid du Colombier MOVL ov+0x8(FP), DX 69*f05caca4SDavid du Colombier MOVL nv+0xc(FP), BX 70*f05caca4SDavid du Colombier MOVL nv+0x10(FP), CX 71*f05caca4SDavid du Colombier LOCK 72*f05caca4SDavid du Colombier CMPXCHG64 73*f05caca4SDavid du Colombier JNE fail 74*f05caca4SDavid du Colombier MOVL $1,AX 75*f05caca4SDavid du Colombier RET 76