xref: /plan9-contrib/sys/src/libc/amd64/atom.s (revision 272efad760864ee41cfe633b56aea9b4f5cf3ae7)
1TEXT ainc(SB), 1, $0	/* long ainc(long *); */
2ainclp:
3	MOVL	(RARG), AX	/* exp */
4	MOVL	AX, BX
5	INCL	BX		/* new */
6	LOCK; CMPXCHGL BX, (RARG)
7	JNZ	ainclp
8	MOVL	BX, AX
9	RET
10
11TEXT adec(SB), 1, $0	/* long adec(long*); */
12adeclp:
13	MOVL	(RARG), AX
14	MOVL	AX, BX
15	DECL	BX
16	LOCK; CMPXCHGL BX, (RARG)
17	JNZ	adeclp
18	MOVL	BX, AX
19	RET
20
21/*
22 * int cas32(u32int *p, u32int ov, u32int nv);
23 * int cas(uint *p, int ov, int nv);
24 * int casul(ulong *p, ulong ov, ulong nv);
25 */
26
27TEXT cas32(SB), 1, $0
28TEXT cas(SB), 1, $0
29TEXT casul(SB), 1, $0
30TEXT casl(SB), 1, $0			/* back compat */
31	MOVL	exp+8(FP), AX
32	MOVL	new+16(FP), BX
33	LOCK; CMPXCHGL BX, (RARG)
34	MOVL	$1, AX				/* use CMOVLEQ etc. here? */
35	JNZ	_cas32r0
36_cas32r1:
37	RET
38_cas32r0:
39	DECL	AX
40	RET
41
42/*
43 * int cas64(u64int *p, u64int ov, u64int nv);
44 * int casp(void **p, void *ov, void *nv);
45 */
46
47TEXT cas64(SB), 1, $0
48TEXT casp(SB), 1, $0
49	MOVQ	exp+8(FP), AX
50	MOVQ	new+16(FP), BX
51	LOCK; CMPXCHGQ BX, (RARG)
52	MOVL	$1, AX				/* use CMOVLEQ etc. here? */
53	JNZ	_cas64r0
54_cas64r1:
55	RET
56_cas64r0:
57	DECL	AX
58	RET
59
60/*
61 * void mfence(void);
62 */
63TEXT mfence(SB),0,$0
64	MFENCE
65	RET
66
67