xref: /plan9/sys/src/libc/386/atom.s (revision f05caca4bab602bc56469dc68809deb3e5a68c3d)
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