treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152
[sfrench/cifs-2.6.git] / arch / x86 / lib / atomic64_386_32.S
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * atomic64_t for 386/486
4  *
5  * Copyright © 2010  Luca Barbieri
6  */
7
8 #include <linux/linkage.h>
9 #include <asm/alternative-asm.h>
10
11 /* if you want SMP support, implement these with real spinlocks */
12 .macro LOCK reg
13         pushfl
14         cli
15 .endm
16
17 .macro UNLOCK reg
18         popfl
19 .endm
20
21 #define BEGIN(op) \
22 .macro endp; \
23 ENDPROC(atomic64_##op##_386); \
24 .purgem endp; \
25 .endm; \
26 ENTRY(atomic64_##op##_386); \
27         LOCK v;
28
29 #define ENDP endp
30
31 #define RET \
32         UNLOCK v; \
33         ret
34
35 #define RET_ENDP \
36         RET; \
37         ENDP
38
39 #define v %ecx
40 BEGIN(read)
41         movl  (v), %eax
42         movl 4(v), %edx
43 RET_ENDP
44 #undef v
45
46 #define v %esi
47 BEGIN(set)
48         movl %ebx,  (v)
49         movl %ecx, 4(v)
50 RET_ENDP
51 #undef v
52
53 #define v  %esi
54 BEGIN(xchg)
55         movl  (v), %eax
56         movl 4(v), %edx
57         movl %ebx,  (v)
58         movl %ecx, 4(v)
59 RET_ENDP
60 #undef v
61
62 #define v %ecx
63 BEGIN(add)
64         addl %eax,  (v)
65         adcl %edx, 4(v)
66 RET_ENDP
67 #undef v
68
69 #define v %ecx
70 BEGIN(add_return)
71         addl  (v), %eax
72         adcl 4(v), %edx
73         movl %eax,  (v)
74         movl %edx, 4(v)
75 RET_ENDP
76 #undef v
77
78 #define v %ecx
79 BEGIN(sub)
80         subl %eax,  (v)
81         sbbl %edx, 4(v)
82 RET_ENDP
83 #undef v
84
85 #define v %ecx
86 BEGIN(sub_return)
87         negl %edx
88         negl %eax
89         sbbl $0, %edx
90         addl  (v), %eax
91         adcl 4(v), %edx
92         movl %eax,  (v)
93         movl %edx, 4(v)
94 RET_ENDP
95 #undef v
96
97 #define v %esi
98 BEGIN(inc)
99         addl $1,  (v)
100         adcl $0, 4(v)
101 RET_ENDP
102 #undef v
103
104 #define v %esi
105 BEGIN(inc_return)
106         movl  (v), %eax
107         movl 4(v), %edx
108         addl $1, %eax
109         adcl $0, %edx
110         movl %eax,  (v)
111         movl %edx, 4(v)
112 RET_ENDP
113 #undef v
114
115 #define v %esi
116 BEGIN(dec)
117         subl $1,  (v)
118         sbbl $0, 4(v)
119 RET_ENDP
120 #undef v
121
122 #define v %esi
123 BEGIN(dec_return)
124         movl  (v), %eax
125         movl 4(v), %edx
126         subl $1, %eax
127         sbbl $0, %edx
128         movl %eax,  (v)
129         movl %edx, 4(v)
130 RET_ENDP
131 #undef v
132
133 #define v %esi
134 BEGIN(add_unless)
135         addl %eax, %ecx
136         adcl %edx, %edi
137         addl  (v), %eax
138         adcl 4(v), %edx
139         cmpl %eax, %ecx
140         je 3f
141 1:
142         movl %eax,  (v)
143         movl %edx, 4(v)
144         movl $1, %eax
145 2:
146         RET
147 3:
148         cmpl %edx, %edi
149         jne 1b
150         xorl %eax, %eax
151         jmp 2b
152 ENDP
153 #undef v
154
155 #define v %esi
156 BEGIN(inc_not_zero)
157         movl  (v), %eax
158         movl 4(v), %edx
159         testl %eax, %eax
160         je 3f
161 1:
162         addl $1, %eax
163         adcl $0, %edx
164         movl %eax,  (v)
165         movl %edx, 4(v)
166         movl $1, %eax
167 2:
168         RET
169 3:
170         testl %edx, %edx
171         jne 1b
172         jmp 2b
173 ENDP
174 #undef v
175
176 #define v %esi
177 BEGIN(dec_if_positive)
178         movl  (v), %eax
179         movl 4(v), %edx
180         subl $1, %eax
181         sbbl $0, %edx
182         js 1f
183         movl %eax,  (v)
184         movl %edx, 4(v)
185 1:
186 RET_ENDP
187 #undef v