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