xref: /openbmc/linux/arch/x86/lib/atomic64_386_32.S (revision 131484c8da97ed600c18dd9d03b661e8ae052df6)
1a7e926abSLuca Barbieri/*
2a7e926abSLuca Barbieri * atomic64_t for 386/486
3a7e926abSLuca Barbieri *
4a7e926abSLuca Barbieri * Copyright © 2010  Luca Barbieri
5a7e926abSLuca Barbieri *
6a7e926abSLuca Barbieri * This program is free software; you can redistribute it and/or modify
7a7e926abSLuca Barbieri * it under the terms of the GNU General Public License as published by
8a7e926abSLuca Barbieri * the Free Software Foundation; either version 2 of the License, or
9a7e926abSLuca Barbieri * (at your option) any later version.
10a7e926abSLuca Barbieri */
11a7e926abSLuca Barbieri
12a7e926abSLuca Barbieri#include <linux/linkage.h>
13a7e926abSLuca Barbieri#include <asm/alternative-asm.h>
14a7e926abSLuca Barbieri
15a7e926abSLuca Barbieri/* if you want SMP support, implement these with real spinlocks */
16a7e926abSLuca Barbieri.macro LOCK reg
17*131484c8SIngo Molnar	pushfl
18a7e926abSLuca Barbieri	cli
19a7e926abSLuca Barbieri.endm
20a7e926abSLuca Barbieri
21a7e926abSLuca Barbieri.macro UNLOCK reg
22*131484c8SIngo Molnar	popfl
23a7e926abSLuca Barbieri.endm
24a7e926abSLuca Barbieri
2530246557SLuca Barbieri#define BEGIN(op) \
26417484d4SLuca Barbieri.macro endp; \
2730246557SLuca BarbieriENDPROC(atomic64_##op##_386); \
28417484d4SLuca Barbieri.purgem endp; \
2930246557SLuca Barbieri.endm; \
3030246557SLuca BarbieriENTRY(atomic64_##op##_386); \
3130246557SLuca Barbieri	LOCK v;
32a7e926abSLuca Barbieri
33417484d4SLuca Barbieri#define ENDP endp
34417484d4SLuca Barbieri
3530246557SLuca Barbieri#define RET \
3630246557SLuca Barbieri	UNLOCK v; \
37a7e926abSLuca Barbieri	ret
38a7e926abSLuca Barbieri
39417484d4SLuca Barbieri#define RET_ENDP \
4030246557SLuca Barbieri	RET; \
41417484d4SLuca Barbieri	ENDP
42a7e926abSLuca Barbieri
4330246557SLuca Barbieri#define v %ecx
4430246557SLuca BarbieriBEGIN(read)
4530246557SLuca Barbieri	movl  (v), %eax
4630246557SLuca Barbieri	movl 4(v), %edx
47417484d4SLuca BarbieriRET_ENDP
4830246557SLuca Barbieri#undef v
49a7e926abSLuca Barbieri
5030246557SLuca Barbieri#define v %esi
5130246557SLuca BarbieriBEGIN(set)
5230246557SLuca Barbieri	movl %ebx,  (v)
5330246557SLuca Barbieri	movl %ecx, 4(v)
54417484d4SLuca BarbieriRET_ENDP
5530246557SLuca Barbieri#undef v
56a7e926abSLuca Barbieri
5730246557SLuca Barbieri#define v  %esi
5830246557SLuca BarbieriBEGIN(xchg)
5930246557SLuca Barbieri	movl  (v), %eax
6030246557SLuca Barbieri	movl 4(v), %edx
6130246557SLuca Barbieri	movl %ebx,  (v)
6230246557SLuca Barbieri	movl %ecx, 4(v)
63417484d4SLuca BarbieriRET_ENDP
6430246557SLuca Barbieri#undef v
65a7e926abSLuca Barbieri
6630246557SLuca Barbieri#define v %ecx
6730246557SLuca BarbieriBEGIN(add)
6830246557SLuca Barbieri	addl %eax,  (v)
6930246557SLuca Barbieri	adcl %edx, 4(v)
70417484d4SLuca BarbieriRET_ENDP
7130246557SLuca Barbieri#undef v
72a7e926abSLuca Barbieri
7330246557SLuca Barbieri#define v %ecx
7430246557SLuca BarbieriBEGIN(add_return)
7530246557SLuca Barbieri	addl  (v), %eax
7630246557SLuca Barbieri	adcl 4(v), %edx
7730246557SLuca Barbieri	movl %eax,  (v)
7830246557SLuca Barbieri	movl %edx, 4(v)
79417484d4SLuca BarbieriRET_ENDP
8030246557SLuca Barbieri#undef v
81a7e926abSLuca Barbieri
8230246557SLuca Barbieri#define v %ecx
8330246557SLuca BarbieriBEGIN(sub)
8430246557SLuca Barbieri	subl %eax,  (v)
8530246557SLuca Barbieri	sbbl %edx, 4(v)
86417484d4SLuca BarbieriRET_ENDP
8730246557SLuca Barbieri#undef v
8830246557SLuca Barbieri
8930246557SLuca Barbieri#define v %ecx
9030246557SLuca BarbieriBEGIN(sub_return)
91a7e926abSLuca Barbieri	negl %edx
92a7e926abSLuca Barbieri	negl %eax
93a7e926abSLuca Barbieri	sbbl $0, %edx
9430246557SLuca Barbieri	addl  (v), %eax
9530246557SLuca Barbieri	adcl 4(v), %edx
9630246557SLuca Barbieri	movl %eax,  (v)
9730246557SLuca Barbieri	movl %edx, 4(v)
98417484d4SLuca BarbieriRET_ENDP
9930246557SLuca Barbieri#undef v
100a7e926abSLuca Barbieri
10130246557SLuca Barbieri#define v %esi
10230246557SLuca BarbieriBEGIN(inc)
10330246557SLuca Barbieri	addl $1,  (v)
10430246557SLuca Barbieri	adcl $0, 4(v)
105417484d4SLuca BarbieriRET_ENDP
10630246557SLuca Barbieri#undef v
107a7e926abSLuca Barbieri
10830246557SLuca Barbieri#define v %esi
10930246557SLuca BarbieriBEGIN(inc_return)
11030246557SLuca Barbieri	movl  (v), %eax
11130246557SLuca Barbieri	movl 4(v), %edx
112a7e926abSLuca Barbieri	addl $1, %eax
113a7e926abSLuca Barbieri	adcl $0, %edx
11430246557SLuca Barbieri	movl %eax,  (v)
11530246557SLuca Barbieri	movl %edx, 4(v)
116417484d4SLuca BarbieriRET_ENDP
11730246557SLuca Barbieri#undef v
118a7e926abSLuca Barbieri
11930246557SLuca Barbieri#define v %esi
12030246557SLuca BarbieriBEGIN(dec)
12130246557SLuca Barbieri	subl $1,  (v)
12230246557SLuca Barbieri	sbbl $0, 4(v)
123417484d4SLuca BarbieriRET_ENDP
12430246557SLuca Barbieri#undef v
125a7e926abSLuca Barbieri
12630246557SLuca Barbieri#define v %esi
12730246557SLuca BarbieriBEGIN(dec_return)
12830246557SLuca Barbieri	movl  (v), %eax
12930246557SLuca Barbieri	movl 4(v), %edx
130a7e926abSLuca Barbieri	subl $1, %eax
131a7e926abSLuca Barbieri	sbbl $0, %edx
13230246557SLuca Barbieri	movl %eax,  (v)
13330246557SLuca Barbieri	movl %edx, 4(v)
134417484d4SLuca BarbieriRET_ENDP
13530246557SLuca Barbieri#undef v
136a7e926abSLuca Barbieri
137cb8095bbSJan Beulich#define v %esi
13830246557SLuca BarbieriBEGIN(add_unless)
139cb8095bbSJan Beulich	addl %eax, %ecx
140a7e926abSLuca Barbieri	adcl %edx, %edi
14130246557SLuca Barbieri	addl  (v), %eax
14230246557SLuca Barbieri	adcl 4(v), %edx
143cb8095bbSJan Beulich	cmpl %eax, %ecx
144a7e926abSLuca Barbieri	je 3f
145a7e926abSLuca Barbieri1:
14630246557SLuca Barbieri	movl %eax,  (v)
14730246557SLuca Barbieri	movl %edx, 4(v)
1486e6104feSLuca Barbieri	movl $1, %eax
149a7e926abSLuca Barbieri2:
15030246557SLuca Barbieri	RET
151a7e926abSLuca Barbieri3:
152a7e926abSLuca Barbieri	cmpl %edx, %edi
153a7e926abSLuca Barbieri	jne 1b
1546e6104feSLuca Barbieri	xorl %eax, %eax
155a7e926abSLuca Barbieri	jmp 2b
156417484d4SLuca BarbieriENDP
15730246557SLuca Barbieri#undef v
158a7e926abSLuca Barbieri
15930246557SLuca Barbieri#define v %esi
16030246557SLuca BarbieriBEGIN(inc_not_zero)
16130246557SLuca Barbieri	movl  (v), %eax
16230246557SLuca Barbieri	movl 4(v), %edx
163a7e926abSLuca Barbieri	testl %eax, %eax
164a7e926abSLuca Barbieri	je 3f
165a7e926abSLuca Barbieri1:
166a7e926abSLuca Barbieri	addl $1, %eax
167a7e926abSLuca Barbieri	adcl $0, %edx
16830246557SLuca Barbieri	movl %eax,  (v)
16930246557SLuca Barbieri	movl %edx, 4(v)
170f3e83131SLuca Barbieri	movl $1, %eax
171a7e926abSLuca Barbieri2:
17230246557SLuca Barbieri	RET
173a7e926abSLuca Barbieri3:
174a7e926abSLuca Barbieri	testl %edx, %edx
175a7e926abSLuca Barbieri	jne 1b
176a7e926abSLuca Barbieri	jmp 2b
177417484d4SLuca BarbieriENDP
17830246557SLuca Barbieri#undef v
179a7e926abSLuca Barbieri
18030246557SLuca Barbieri#define v %esi
18130246557SLuca BarbieriBEGIN(dec_if_positive)
18230246557SLuca Barbieri	movl  (v), %eax
18330246557SLuca Barbieri	movl 4(v), %edx
184a7e926abSLuca Barbieri	subl $1, %eax
185a7e926abSLuca Barbieri	sbbl $0, %edx
186a7e926abSLuca Barbieri	js 1f
18730246557SLuca Barbieri	movl %eax,  (v)
18830246557SLuca Barbieri	movl %edx, 4(v)
189a7e926abSLuca Barbieri1:
190417484d4SLuca BarbieriRET_ENDP
19130246557SLuca Barbieri#undef v
192