xref: /openbmc/linux/arch/x86/lib/atomic64_386_32.S (revision 5e21a3ecad1500e35b46701e7f3f232e15d78e69)
12874c5fdSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */
2a7e926abSLuca Barbieri/*
3a7e926abSLuca Barbieri * atomic64_t for 386/486
4a7e926abSLuca Barbieri *
5a7e926abSLuca Barbieri * Copyright © 2010  Luca Barbieri
6a7e926abSLuca Barbieri */
7a7e926abSLuca Barbieri
8a7e926abSLuca Barbieri#include <linux/linkage.h>
9*5e21a3ecSJuergen Gross#include <asm/alternative.h>
10a7e926abSLuca Barbieri
11a7e926abSLuca Barbieri/* if you want SMP support, implement these with real spinlocks */
12a7e926abSLuca Barbieri.macro LOCK reg
13131484c8SIngo Molnar	pushfl
14a7e926abSLuca Barbieri	cli
15a7e926abSLuca Barbieri.endm
16a7e926abSLuca Barbieri
17a7e926abSLuca Barbieri.macro UNLOCK reg
18131484c8SIngo Molnar	popfl
19a7e926abSLuca Barbieri.endm
20a7e926abSLuca Barbieri
2130246557SLuca Barbieri#define BEGIN(op) \
22417484d4SLuca Barbieri.macro endp; \
236d685e53SJiri SlabySYM_FUNC_END(atomic64_##op##_386); \
24417484d4SLuca Barbieri.purgem endp; \
2530246557SLuca Barbieri.endm; \
266d685e53SJiri SlabySYM_FUNC_START(atomic64_##op##_386); \
2730246557SLuca Barbieri	LOCK v;
28a7e926abSLuca Barbieri
29417484d4SLuca Barbieri#define ENDP endp
30417484d4SLuca Barbieri
3130246557SLuca Barbieri#define RET \
3230246557SLuca Barbieri	UNLOCK v; \
33a7e926abSLuca Barbieri	ret
34a7e926abSLuca Barbieri
35417484d4SLuca Barbieri#define RET_ENDP \
3630246557SLuca Barbieri	RET; \
37417484d4SLuca Barbieri	ENDP
38a7e926abSLuca Barbieri
3930246557SLuca Barbieri#define v %ecx
4030246557SLuca BarbieriBEGIN(read)
4130246557SLuca Barbieri	movl  (v), %eax
4230246557SLuca Barbieri	movl 4(v), %edx
43417484d4SLuca BarbieriRET_ENDP
4430246557SLuca Barbieri#undef v
45a7e926abSLuca Barbieri
4630246557SLuca Barbieri#define v %esi
4730246557SLuca BarbieriBEGIN(set)
4830246557SLuca Barbieri	movl %ebx,  (v)
4930246557SLuca Barbieri	movl %ecx, 4(v)
50417484d4SLuca BarbieriRET_ENDP
5130246557SLuca Barbieri#undef v
52a7e926abSLuca Barbieri
5330246557SLuca Barbieri#define v  %esi
5430246557SLuca BarbieriBEGIN(xchg)
5530246557SLuca Barbieri	movl  (v), %eax
5630246557SLuca Barbieri	movl 4(v), %edx
5730246557SLuca Barbieri	movl %ebx,  (v)
5830246557SLuca Barbieri	movl %ecx, 4(v)
59417484d4SLuca BarbieriRET_ENDP
6030246557SLuca Barbieri#undef v
61a7e926abSLuca Barbieri
6230246557SLuca Barbieri#define v %ecx
6330246557SLuca BarbieriBEGIN(add)
6430246557SLuca Barbieri	addl %eax,  (v)
6530246557SLuca Barbieri	adcl %edx, 4(v)
66417484d4SLuca BarbieriRET_ENDP
6730246557SLuca Barbieri#undef v
68a7e926abSLuca Barbieri
6930246557SLuca Barbieri#define v %ecx
7030246557SLuca BarbieriBEGIN(add_return)
7130246557SLuca Barbieri	addl  (v), %eax
7230246557SLuca Barbieri	adcl 4(v), %edx
7330246557SLuca Barbieri	movl %eax,  (v)
7430246557SLuca Barbieri	movl %edx, 4(v)
75417484d4SLuca BarbieriRET_ENDP
7630246557SLuca Barbieri#undef v
77a7e926abSLuca Barbieri
7830246557SLuca Barbieri#define v %ecx
7930246557SLuca BarbieriBEGIN(sub)
8030246557SLuca Barbieri	subl %eax,  (v)
8130246557SLuca Barbieri	sbbl %edx, 4(v)
82417484d4SLuca BarbieriRET_ENDP
8330246557SLuca Barbieri#undef v
8430246557SLuca Barbieri
8530246557SLuca Barbieri#define v %ecx
8630246557SLuca BarbieriBEGIN(sub_return)
87a7e926abSLuca Barbieri	negl %edx
88a7e926abSLuca Barbieri	negl %eax
89a7e926abSLuca Barbieri	sbbl $0, %edx
9030246557SLuca Barbieri	addl  (v), %eax
9130246557SLuca Barbieri	adcl 4(v), %edx
9230246557SLuca Barbieri	movl %eax,  (v)
9330246557SLuca Barbieri	movl %edx, 4(v)
94417484d4SLuca BarbieriRET_ENDP
9530246557SLuca Barbieri#undef v
96a7e926abSLuca Barbieri
9730246557SLuca Barbieri#define v %esi
9830246557SLuca BarbieriBEGIN(inc)
9930246557SLuca Barbieri	addl $1,  (v)
10030246557SLuca Barbieri	adcl $0, 4(v)
101417484d4SLuca BarbieriRET_ENDP
10230246557SLuca Barbieri#undef v
103a7e926abSLuca Barbieri
10430246557SLuca Barbieri#define v %esi
10530246557SLuca BarbieriBEGIN(inc_return)
10630246557SLuca Barbieri	movl  (v), %eax
10730246557SLuca Barbieri	movl 4(v), %edx
108a7e926abSLuca Barbieri	addl $1, %eax
109a7e926abSLuca Barbieri	adcl $0, %edx
11030246557SLuca Barbieri	movl %eax,  (v)
11130246557SLuca Barbieri	movl %edx, 4(v)
112417484d4SLuca BarbieriRET_ENDP
11330246557SLuca Barbieri#undef v
114a7e926abSLuca Barbieri
11530246557SLuca Barbieri#define v %esi
11630246557SLuca BarbieriBEGIN(dec)
11730246557SLuca Barbieri	subl $1,  (v)
11830246557SLuca Barbieri	sbbl $0, 4(v)
119417484d4SLuca BarbieriRET_ENDP
12030246557SLuca Barbieri#undef v
121a7e926abSLuca Barbieri
12230246557SLuca Barbieri#define v %esi
12330246557SLuca BarbieriBEGIN(dec_return)
12430246557SLuca Barbieri	movl  (v), %eax
12530246557SLuca Barbieri	movl 4(v), %edx
126a7e926abSLuca Barbieri	subl $1, %eax
127a7e926abSLuca Barbieri	sbbl $0, %edx
12830246557SLuca Barbieri	movl %eax,  (v)
12930246557SLuca Barbieri	movl %edx, 4(v)
130417484d4SLuca BarbieriRET_ENDP
13130246557SLuca Barbieri#undef v
132a7e926abSLuca Barbieri
133cb8095bbSJan Beulich#define v %esi
13430246557SLuca BarbieriBEGIN(add_unless)
135cb8095bbSJan Beulich	addl %eax, %ecx
136a7e926abSLuca Barbieri	adcl %edx, %edi
13730246557SLuca Barbieri	addl  (v), %eax
13830246557SLuca Barbieri	adcl 4(v), %edx
139cb8095bbSJan Beulich	cmpl %eax, %ecx
140a7e926abSLuca Barbieri	je 3f
141a7e926abSLuca Barbieri1:
14230246557SLuca Barbieri	movl %eax,  (v)
14330246557SLuca Barbieri	movl %edx, 4(v)
1446e6104feSLuca Barbieri	movl $1, %eax
145a7e926abSLuca Barbieri2:
14630246557SLuca Barbieri	RET
147a7e926abSLuca Barbieri3:
148a7e926abSLuca Barbieri	cmpl %edx, %edi
149a7e926abSLuca Barbieri	jne 1b
1506e6104feSLuca Barbieri	xorl %eax, %eax
151a7e926abSLuca Barbieri	jmp 2b
152417484d4SLuca BarbieriENDP
15330246557SLuca Barbieri#undef v
154a7e926abSLuca Barbieri
15530246557SLuca Barbieri#define v %esi
15630246557SLuca BarbieriBEGIN(inc_not_zero)
15730246557SLuca Barbieri	movl  (v), %eax
15830246557SLuca Barbieri	movl 4(v), %edx
159a7e926abSLuca Barbieri	testl %eax, %eax
160a7e926abSLuca Barbieri	je 3f
161a7e926abSLuca Barbieri1:
162a7e926abSLuca Barbieri	addl $1, %eax
163a7e926abSLuca Barbieri	adcl $0, %edx
16430246557SLuca Barbieri	movl %eax,  (v)
16530246557SLuca Barbieri	movl %edx, 4(v)
166f3e83131SLuca Barbieri	movl $1, %eax
167a7e926abSLuca Barbieri2:
16830246557SLuca Barbieri	RET
169a7e926abSLuca Barbieri3:
170a7e926abSLuca Barbieri	testl %edx, %edx
171a7e926abSLuca Barbieri	jne 1b
172a7e926abSLuca Barbieri	jmp 2b
173417484d4SLuca BarbieriENDP
17430246557SLuca Barbieri#undef v
175a7e926abSLuca Barbieri
17630246557SLuca Barbieri#define v %esi
17730246557SLuca BarbieriBEGIN(dec_if_positive)
17830246557SLuca Barbieri	movl  (v), %eax
17930246557SLuca Barbieri	movl 4(v), %edx
180a7e926abSLuca Barbieri	subl $1, %eax
181a7e926abSLuca Barbieri	sbbl $0, %edx
182a7e926abSLuca Barbieri	js 1f
18330246557SLuca Barbieri	movl %eax,  (v)
18430246557SLuca Barbieri	movl %edx, 4(v)
185a7e926abSLuca Barbieri1:
186417484d4SLuca BarbieriRET_ENDP
18730246557SLuca Barbieri#undef v
188