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