xref: /openbmc/linux/arch/x86/lib/atomic64_386_32.S (revision 30246557a06bb20618bed906a06d1e1e0faa8bb4)
1a7e926abSLuca Barbieri/*
2a7e926abSLuca Barbieri * atomic64_t for 386/486
3a7e926abSLuca Barbieri *
4a7e926abSLuca Barbieri * Copyright © 2010  Luca Barbieri
5a7e926abSLuca Barbieri *
6a7e926abSLuca Barbieri * This program is free software; you can redistribute it and/or modify
7a7e926abSLuca Barbieri * it under the terms of the GNU General Public License as published by
8a7e926abSLuca Barbieri * the Free Software Foundation; either version 2 of the License, or
9a7e926abSLuca Barbieri * (at your option) any later version.
10a7e926abSLuca Barbieri */
11a7e926abSLuca Barbieri
12a7e926abSLuca Barbieri#include <linux/linkage.h>
13a7e926abSLuca Barbieri#include <asm/alternative-asm.h>
14a7e926abSLuca Barbieri#include <asm/dwarf2.h>
15a7e926abSLuca Barbieri
16a7e926abSLuca Barbieri/* if you want SMP support, implement these with real spinlocks */
17a7e926abSLuca Barbieri.macro LOCK reg
18a7e926abSLuca Barbieri	pushfl
19a7e926abSLuca Barbieri	CFI_ADJUST_CFA_OFFSET 4
20a7e926abSLuca Barbieri	cli
21a7e926abSLuca Barbieri.endm
22a7e926abSLuca Barbieri
23a7e926abSLuca Barbieri.macro UNLOCK reg
24a7e926abSLuca Barbieri	popfl
25a7e926abSLuca Barbieri	CFI_ADJUST_CFA_OFFSET -4
26a7e926abSLuca Barbieri.endm
27a7e926abSLuca Barbieri
28*30246557SLuca Barbieri#define BEGIN(op) \
29*30246557SLuca Barbieri.macro END; \
30*30246557SLuca Barbieri	CFI_ENDPROC; \
31*30246557SLuca BarbieriENDPROC(atomic64_##op##_386); \
32*30246557SLuca Barbieri.purgem END; \
33*30246557SLuca Barbieri.endm; \
34*30246557SLuca BarbieriENTRY(atomic64_##op##_386); \
35*30246557SLuca Barbieri	CFI_STARTPROC; \
36*30246557SLuca Barbieri	LOCK v;
37a7e926abSLuca Barbieri
38*30246557SLuca Barbieri#define RET \
39*30246557SLuca Barbieri	UNLOCK v; \
40a7e926abSLuca Barbieri	ret
41a7e926abSLuca Barbieri
42*30246557SLuca Barbieri#define RET_END \
43*30246557SLuca Barbieri	RET; \
44a7e926abSLuca Barbieri	END
45a7e926abSLuca Barbieri
46*30246557SLuca Barbieri#define v %ecx
47*30246557SLuca BarbieriBEGIN(read)
48*30246557SLuca Barbieri	movl  (v), %eax
49*30246557SLuca Barbieri	movl 4(v), %edx
50*30246557SLuca BarbieriRET_END
51*30246557SLuca Barbieri#undef v
52a7e926abSLuca Barbieri
53*30246557SLuca Barbieri#define v %esi
54*30246557SLuca BarbieriBEGIN(set)
55*30246557SLuca Barbieri	movl %ebx,  (v)
56*30246557SLuca Barbieri	movl %ecx, 4(v)
57*30246557SLuca BarbieriRET_END
58*30246557SLuca Barbieri#undef v
59a7e926abSLuca Barbieri
60*30246557SLuca Barbieri#define v  %esi
61*30246557SLuca BarbieriBEGIN(xchg)
62*30246557SLuca Barbieri	movl  (v), %eax
63*30246557SLuca Barbieri	movl 4(v), %edx
64*30246557SLuca Barbieri	movl %ebx,  (v)
65*30246557SLuca Barbieri	movl %ecx, 4(v)
66*30246557SLuca BarbieriRET_END
67*30246557SLuca Barbieri#undef v
68a7e926abSLuca Barbieri
69*30246557SLuca Barbieri#define v %ecx
70*30246557SLuca BarbieriBEGIN(add)
71*30246557SLuca Barbieri	addl %eax,  (v)
72*30246557SLuca Barbieri	adcl %edx, 4(v)
73*30246557SLuca BarbieriRET_END
74*30246557SLuca Barbieri#undef v
75a7e926abSLuca Barbieri
76*30246557SLuca Barbieri#define v %ecx
77*30246557SLuca BarbieriBEGIN(add_return)
78*30246557SLuca Barbieri	addl  (v), %eax
79*30246557SLuca Barbieri	adcl 4(v), %edx
80*30246557SLuca Barbieri	movl %eax,  (v)
81*30246557SLuca Barbieri	movl %edx, 4(v)
82*30246557SLuca BarbieriRET_END
83*30246557SLuca Barbieri#undef v
84a7e926abSLuca Barbieri
85*30246557SLuca Barbieri#define v %ecx
86*30246557SLuca BarbieriBEGIN(sub)
87*30246557SLuca Barbieri	subl %eax,  (v)
88*30246557SLuca Barbieri	sbbl %edx, 4(v)
89*30246557SLuca BarbieriRET_END
90*30246557SLuca Barbieri#undef v
91*30246557SLuca Barbieri
92*30246557SLuca Barbieri#define v %ecx
93*30246557SLuca BarbieriBEGIN(sub_return)
94a7e926abSLuca Barbieri	negl %edx
95a7e926abSLuca Barbieri	negl %eax
96a7e926abSLuca Barbieri	sbbl $0, %edx
97*30246557SLuca Barbieri	addl  (v), %eax
98*30246557SLuca Barbieri	adcl 4(v), %edx
99*30246557SLuca Barbieri	movl %eax,  (v)
100*30246557SLuca Barbieri	movl %edx, 4(v)
101*30246557SLuca BarbieriRET_END
102*30246557SLuca Barbieri#undef v
103a7e926abSLuca Barbieri
104*30246557SLuca Barbieri#define v %esi
105*30246557SLuca BarbieriBEGIN(inc)
106*30246557SLuca Barbieri	addl $1,  (v)
107*30246557SLuca Barbieri	adcl $0, 4(v)
108*30246557SLuca BarbieriRET_END
109*30246557SLuca Barbieri#undef v
110a7e926abSLuca Barbieri
111*30246557SLuca Barbieri#define v %esi
112*30246557SLuca BarbieriBEGIN(inc_return)
113*30246557SLuca Barbieri	movl  (v), %eax
114*30246557SLuca Barbieri	movl 4(v), %edx
115a7e926abSLuca Barbieri	addl $1, %eax
116a7e926abSLuca Barbieri	adcl $0, %edx
117*30246557SLuca Barbieri	movl %eax,  (v)
118*30246557SLuca Barbieri	movl %edx, 4(v)
119*30246557SLuca BarbieriRET_END
120*30246557SLuca Barbieri#undef v
121a7e926abSLuca Barbieri
122*30246557SLuca Barbieri#define v %esi
123*30246557SLuca BarbieriBEGIN(dec)
124*30246557SLuca Barbieri	subl $1,  (v)
125*30246557SLuca Barbieri	sbbl $0, 4(v)
126*30246557SLuca BarbieriRET_END
127*30246557SLuca Barbieri#undef v
128a7e926abSLuca Barbieri
129*30246557SLuca Barbieri#define v %esi
130*30246557SLuca BarbieriBEGIN(dec_return)
131*30246557SLuca Barbieri	movl  (v), %eax
132*30246557SLuca Barbieri	movl 4(v), %edx
133a7e926abSLuca Barbieri	subl $1, %eax
134a7e926abSLuca Barbieri	sbbl $0, %edx
135*30246557SLuca Barbieri	movl %eax,  (v)
136*30246557SLuca Barbieri	movl %edx, 4(v)
137*30246557SLuca BarbieriRET_END
138*30246557SLuca Barbieri#undef v
139a7e926abSLuca Barbieri
140*30246557SLuca Barbieri#define v %ecx
141*30246557SLuca BarbieriBEGIN(add_unless)
142a7e926abSLuca Barbieri	addl %eax, %esi
143a7e926abSLuca Barbieri	adcl %edx, %edi
144*30246557SLuca Barbieri	addl  (v), %eax
145*30246557SLuca Barbieri	adcl 4(v), %edx
146a7e926abSLuca Barbieri	cmpl %eax, %esi
147a7e926abSLuca Barbieri	je 3f
148a7e926abSLuca Barbieri1:
149*30246557SLuca Barbieri	movl %eax,  (v)
150*30246557SLuca Barbieri	movl %edx, 4(v)
1516e6104feSLuca Barbieri	movl $1, %eax
152a7e926abSLuca Barbieri2:
153*30246557SLuca Barbieri	RET
154a7e926abSLuca Barbieri3:
155a7e926abSLuca Barbieri	cmpl %edx, %edi
156a7e926abSLuca Barbieri	jne 1b
1576e6104feSLuca Barbieri	xorl %eax, %eax
158a7e926abSLuca Barbieri	jmp 2b
159*30246557SLuca BarbieriEND
160*30246557SLuca Barbieri#undef v
161a7e926abSLuca Barbieri
162*30246557SLuca Barbieri#define v %esi
163*30246557SLuca BarbieriBEGIN(inc_not_zero)
164*30246557SLuca Barbieri	movl  (v), %eax
165*30246557SLuca Barbieri	movl 4(v), %edx
166a7e926abSLuca Barbieri	testl %eax, %eax
167a7e926abSLuca Barbieri	je 3f
168a7e926abSLuca Barbieri1:
169a7e926abSLuca Barbieri	addl $1, %eax
170a7e926abSLuca Barbieri	adcl $0, %edx
171*30246557SLuca Barbieri	movl %eax,  (v)
172*30246557SLuca Barbieri	movl %edx, 4(v)
173f3e83131SLuca Barbieri	movl $1, %eax
174a7e926abSLuca Barbieri2:
175*30246557SLuca Barbieri	RET
176a7e926abSLuca Barbieri3:
177a7e926abSLuca Barbieri	testl %edx, %edx
178a7e926abSLuca Barbieri	jne 1b
179a7e926abSLuca Barbieri	jmp 2b
180*30246557SLuca BarbieriEND
181*30246557SLuca Barbieri#undef v
182a7e926abSLuca Barbieri
183*30246557SLuca Barbieri#define v %esi
184*30246557SLuca BarbieriBEGIN(dec_if_positive)
185*30246557SLuca Barbieri	movl  (v), %eax
186*30246557SLuca Barbieri	movl 4(v), %edx
187a7e926abSLuca Barbieri	subl $1, %eax
188a7e926abSLuca Barbieri	sbbl $0, %edx
189a7e926abSLuca Barbieri	js 1f
190*30246557SLuca Barbieri	movl %eax,  (v)
191*30246557SLuca Barbieri	movl %edx, 4(v)
192a7e926abSLuca Barbieri1:
193*30246557SLuca BarbieriRET_END
194*30246557SLuca Barbieri#undef v
195