xref: /openbmc/linux/arch/x86/lib/atomic64_386_32.S (revision cb8095bba6d24118135a5683a956f4f4fb5f17bb)
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#include <asm/dwarf2.h>
15a7e926abSLuca Barbieri
16a7e926abSLuca Barbieri/* if you want SMP support, implement these with real spinlocks */
17a7e926abSLuca Barbieri.macro LOCK reg
1860cf637aSJan Beulich	pushfl_cfi
19a7e926abSLuca Barbieri	cli
20a7e926abSLuca Barbieri.endm
21a7e926abSLuca Barbieri
22a7e926abSLuca Barbieri.macro UNLOCK reg
2360cf637aSJan Beulich	popfl_cfi
24a7e926abSLuca Barbieri.endm
25a7e926abSLuca Barbieri
2630246557SLuca Barbieri#define BEGIN(op) \
27417484d4SLuca Barbieri.macro endp; \
2830246557SLuca Barbieri	CFI_ENDPROC; \
2930246557SLuca BarbieriENDPROC(atomic64_##op##_386); \
30417484d4SLuca Barbieri.purgem endp; \
3130246557SLuca Barbieri.endm; \
3230246557SLuca BarbieriENTRY(atomic64_##op##_386); \
3330246557SLuca Barbieri	CFI_STARTPROC; \
3430246557SLuca Barbieri	LOCK v;
35a7e926abSLuca Barbieri
36417484d4SLuca Barbieri#define ENDP endp
37417484d4SLuca Barbieri
3830246557SLuca Barbieri#define RET \
3930246557SLuca Barbieri	UNLOCK v; \
40a7e926abSLuca Barbieri	ret
41a7e926abSLuca Barbieri
42417484d4SLuca Barbieri#define RET_ENDP \
4330246557SLuca Barbieri	RET; \
44417484d4SLuca Barbieri	ENDP
45a7e926abSLuca Barbieri
4630246557SLuca Barbieri#define v %ecx
4730246557SLuca BarbieriBEGIN(read)
4830246557SLuca Barbieri	movl  (v), %eax
4930246557SLuca Barbieri	movl 4(v), %edx
50417484d4SLuca BarbieriRET_ENDP
5130246557SLuca Barbieri#undef v
52a7e926abSLuca Barbieri
5330246557SLuca Barbieri#define v %esi
5430246557SLuca BarbieriBEGIN(set)
5530246557SLuca Barbieri	movl %ebx,  (v)
5630246557SLuca Barbieri	movl %ecx, 4(v)
57417484d4SLuca BarbieriRET_ENDP
5830246557SLuca Barbieri#undef v
59a7e926abSLuca Barbieri
6030246557SLuca Barbieri#define v  %esi
6130246557SLuca BarbieriBEGIN(xchg)
6230246557SLuca Barbieri	movl  (v), %eax
6330246557SLuca Barbieri	movl 4(v), %edx
6430246557SLuca Barbieri	movl %ebx,  (v)
6530246557SLuca Barbieri	movl %ecx, 4(v)
66417484d4SLuca BarbieriRET_ENDP
6730246557SLuca Barbieri#undef v
68a7e926abSLuca Barbieri
6930246557SLuca Barbieri#define v %ecx
7030246557SLuca BarbieriBEGIN(add)
7130246557SLuca Barbieri	addl %eax,  (v)
7230246557SLuca Barbieri	adcl %edx, 4(v)
73417484d4SLuca BarbieriRET_ENDP
7430246557SLuca Barbieri#undef v
75a7e926abSLuca Barbieri
7630246557SLuca Barbieri#define v %ecx
7730246557SLuca BarbieriBEGIN(add_return)
7830246557SLuca Barbieri	addl  (v), %eax
7930246557SLuca Barbieri	adcl 4(v), %edx
8030246557SLuca Barbieri	movl %eax,  (v)
8130246557SLuca Barbieri	movl %edx, 4(v)
82417484d4SLuca BarbieriRET_ENDP
8330246557SLuca Barbieri#undef v
84a7e926abSLuca Barbieri
8530246557SLuca Barbieri#define v %ecx
8630246557SLuca BarbieriBEGIN(sub)
8730246557SLuca Barbieri	subl %eax,  (v)
8830246557SLuca Barbieri	sbbl %edx, 4(v)
89417484d4SLuca BarbieriRET_ENDP
9030246557SLuca Barbieri#undef v
9130246557SLuca Barbieri
9230246557SLuca Barbieri#define v %ecx
9330246557SLuca BarbieriBEGIN(sub_return)
94a7e926abSLuca Barbieri	negl %edx
95a7e926abSLuca Barbieri	negl %eax
96a7e926abSLuca Barbieri	sbbl $0, %edx
9730246557SLuca Barbieri	addl  (v), %eax
9830246557SLuca Barbieri	adcl 4(v), %edx
9930246557SLuca Barbieri	movl %eax,  (v)
10030246557SLuca Barbieri	movl %edx, 4(v)
101417484d4SLuca BarbieriRET_ENDP
10230246557SLuca Barbieri#undef v
103a7e926abSLuca Barbieri
10430246557SLuca Barbieri#define v %esi
10530246557SLuca BarbieriBEGIN(inc)
10630246557SLuca Barbieri	addl $1,  (v)
10730246557SLuca Barbieri	adcl $0, 4(v)
108417484d4SLuca BarbieriRET_ENDP
10930246557SLuca Barbieri#undef v
110a7e926abSLuca Barbieri
11130246557SLuca Barbieri#define v %esi
11230246557SLuca BarbieriBEGIN(inc_return)
11330246557SLuca Barbieri	movl  (v), %eax
11430246557SLuca Barbieri	movl 4(v), %edx
115a7e926abSLuca Barbieri	addl $1, %eax
116a7e926abSLuca Barbieri	adcl $0, %edx
11730246557SLuca Barbieri	movl %eax,  (v)
11830246557SLuca Barbieri	movl %edx, 4(v)
119417484d4SLuca BarbieriRET_ENDP
12030246557SLuca Barbieri#undef v
121a7e926abSLuca Barbieri
12230246557SLuca Barbieri#define v %esi
12330246557SLuca BarbieriBEGIN(dec)
12430246557SLuca Barbieri	subl $1,  (v)
12530246557SLuca Barbieri	sbbl $0, 4(v)
126417484d4SLuca BarbieriRET_ENDP
12730246557SLuca Barbieri#undef v
128a7e926abSLuca Barbieri
12930246557SLuca Barbieri#define v %esi
13030246557SLuca BarbieriBEGIN(dec_return)
13130246557SLuca Barbieri	movl  (v), %eax
13230246557SLuca Barbieri	movl 4(v), %edx
133a7e926abSLuca Barbieri	subl $1, %eax
134a7e926abSLuca Barbieri	sbbl $0, %edx
13530246557SLuca Barbieri	movl %eax,  (v)
13630246557SLuca Barbieri	movl %edx, 4(v)
137417484d4SLuca BarbieriRET_ENDP
13830246557SLuca Barbieri#undef v
139a7e926abSLuca Barbieri
140*cb8095bbSJan Beulich#define v %esi
14130246557SLuca BarbieriBEGIN(add_unless)
142*cb8095bbSJan Beulich	addl %eax, %ecx
143a7e926abSLuca Barbieri	adcl %edx, %edi
14430246557SLuca Barbieri	addl  (v), %eax
14530246557SLuca Barbieri	adcl 4(v), %edx
146*cb8095bbSJan Beulich	cmpl %eax, %ecx
147a7e926abSLuca Barbieri	je 3f
148a7e926abSLuca Barbieri1:
14930246557SLuca Barbieri	movl %eax,  (v)
15030246557SLuca Barbieri	movl %edx, 4(v)
1516e6104feSLuca Barbieri	movl $1, %eax
152a7e926abSLuca Barbieri2:
15330246557SLuca Barbieri	RET
154a7e926abSLuca Barbieri3:
155a7e926abSLuca Barbieri	cmpl %edx, %edi
156a7e926abSLuca Barbieri	jne 1b
1576e6104feSLuca Barbieri	xorl %eax, %eax
158a7e926abSLuca Barbieri	jmp 2b
159417484d4SLuca BarbieriENDP
16030246557SLuca Barbieri#undef v
161a7e926abSLuca Barbieri
16230246557SLuca Barbieri#define v %esi
16330246557SLuca BarbieriBEGIN(inc_not_zero)
16430246557SLuca Barbieri	movl  (v), %eax
16530246557SLuca Barbieri	movl 4(v), %edx
166a7e926abSLuca Barbieri	testl %eax, %eax
167a7e926abSLuca Barbieri	je 3f
168a7e926abSLuca Barbieri1:
169a7e926abSLuca Barbieri	addl $1, %eax
170a7e926abSLuca Barbieri	adcl $0, %edx
17130246557SLuca Barbieri	movl %eax,  (v)
17230246557SLuca Barbieri	movl %edx, 4(v)
173f3e83131SLuca Barbieri	movl $1, %eax
174a7e926abSLuca Barbieri2:
17530246557SLuca Barbieri	RET
176a7e926abSLuca Barbieri3:
177a7e926abSLuca Barbieri	testl %edx, %edx
178a7e926abSLuca Barbieri	jne 1b
179a7e926abSLuca Barbieri	jmp 2b
180417484d4SLuca BarbieriENDP
18130246557SLuca Barbieri#undef v
182a7e926abSLuca Barbieri
18330246557SLuca Barbieri#define v %esi
18430246557SLuca BarbieriBEGIN(dec_if_positive)
18530246557SLuca Barbieri	movl  (v), %eax
18630246557SLuca Barbieri	movl 4(v), %edx
187a7e926abSLuca Barbieri	subl $1, %eax
188a7e926abSLuca Barbieri	sbbl $0, %edx
189a7e926abSLuca Barbieri	js 1f
19030246557SLuca Barbieri	movl %eax,  (v)
19130246557SLuca Barbieri	movl %edx, 4(v)
192a7e926abSLuca Barbieri1:
193417484d4SLuca BarbieriRET_ENDP
19430246557SLuca Barbieri#undef v
195