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