Merge branch 'topic/livepatch' of git://git.kernel.org/pub/scm/linux/kernel/git/power...
[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
15 /* if you want SMP support, implement these with real spinlocks */
16 .macro LOCK reg
17 pushfl
18 cli
19 .endm
20
21 .macro UNLOCK reg
22 popfl
23 .endm
24
25 #define BEGIN(op) \
26 .macro endp; \
27 ENDPROC(atomic64_##op##_386); \
28 .purgem endp; \
29 .endm; \
30 ENTRY(atomic64_##op##_386); \
31 LOCK v;
32
33 #define ENDP endp
34
35 #define RET \
36 UNLOCK v; \
37 ret
38
39 #define RET_ENDP \
40 RET; \
41 ENDP
42
43 #define v %ecx
44 BEGIN(read)
45 movl (v), %eax
46 movl 4(v), %edx
47 RET_ENDP
48 #undef v
49
50 #define v %esi
51 BEGIN(set)
52 movl %ebx, (v)
53 movl %ecx, 4(v)
54 RET_ENDP
55 #undef v
56
57 #define v %esi
58 BEGIN(xchg)
59 movl (v), %eax
60 movl 4(v), %edx
61 movl %ebx, (v)
62 movl %ecx, 4(v)
63 RET_ENDP
64 #undef v
65
66 #define v %ecx
67 BEGIN(add)
68 addl %eax, (v)
69 adcl %edx, 4(v)
70 RET_ENDP
71 #undef v
72
73 #define v %ecx
74 BEGIN(add_return)
75 addl (v), %eax
76 adcl 4(v), %edx
77 movl %eax, (v)
78 movl %edx, 4(v)
79 RET_ENDP
80 #undef v
81
82 #define v %ecx
83 BEGIN(sub)
84 subl %eax, (v)
85 sbbl %edx, 4(v)
86 RET_ENDP
87 #undef v
88
89 #define v %ecx
90 BEGIN(sub_return)
91 negl %edx
92 negl %eax
93 sbbl $0, %edx
94 addl (v), %eax
95 adcl 4(v), %edx
96 movl %eax, (v)
97 movl %edx, 4(v)
98 RET_ENDP
99 #undef v
100
101 #define v %esi
102 BEGIN(inc)
103 addl $1, (v)
104 adcl $0, 4(v)
105 RET_ENDP
106 #undef v
107
108 #define v %esi
109 BEGIN(inc_return)
110 movl (v), %eax
111 movl 4(v), %edx
112 addl $1, %eax
113 adcl $0, %edx
114 movl %eax, (v)
115 movl %edx, 4(v)
116 RET_ENDP
117 #undef v
118
119 #define v %esi
120 BEGIN(dec)
121 subl $1, (v)
122 sbbl $0, 4(v)
123 RET_ENDP
124 #undef v
125
126 #define v %esi
127 BEGIN(dec_return)
128 movl (v), %eax
129 movl 4(v), %edx
130 subl $1, %eax
131 sbbl $0, %edx
132 movl %eax, (v)
133 movl %edx, 4(v)
134 RET_ENDP
135 #undef v
136
137 #define v %esi
138 BEGIN(add_unless)
139 addl %eax, %ecx
140 adcl %edx, %edi
141 addl (v), %eax
142 adcl 4(v), %edx
143 cmpl %eax, %ecx
144 je 3f
145 1:
146 movl %eax, (v)
147 movl %edx, 4(v)
148 movl $1, %eax
149 2:
150 RET
151 3:
152 cmpl %edx, %edi
153 jne 1b
154 xorl %eax, %eax
155 jmp 2b
156 ENDP
157 #undef v
158
159 #define v %esi
160 BEGIN(inc_not_zero)
161 movl (v), %eax
162 movl 4(v), %edx
163 testl %eax, %eax
164 je 3f
165 1:
166 addl $1, %eax
167 adcl $0, %edx
168 movl %eax, (v)
169 movl %edx, 4(v)
170 movl $1, %eax
171 2:
172 RET
173 3:
174 testl %edx, %edx
175 jne 1b
176 jmp 2b
177 ENDP
178 #undef v
179
180 #define v %esi
181 BEGIN(dec_if_positive)
182 movl (v), %eax
183 movl 4(v), %edx
184 subl $1, %eax
185 sbbl $0, %edx
186 js 1f
187 movl %eax, (v)
188 movl %edx, 4(v)
189 1:
190 RET_ENDP
191 #undef v
This page took 0.034883 seconds and 5 git commands to generate.