xref: /openbmc/linux/arch/x86/lib/atomic64_386_32.S (revision a7e926abc3adfbd2e5e20d2b46177adb4e313915)
1*a7e926abSLuca Barbieri/*
2*a7e926abSLuca Barbieri * atomic64_t for 386/486
3*a7e926abSLuca Barbieri *
4*a7e926abSLuca Barbieri * Copyright © 2010  Luca Barbieri
5*a7e926abSLuca Barbieri *
6*a7e926abSLuca Barbieri * This program is free software; you can redistribute it and/or modify
7*a7e926abSLuca Barbieri * it under the terms of the GNU General Public License as published by
8*a7e926abSLuca Barbieri * the Free Software Foundation; either version 2 of the License, or
9*a7e926abSLuca Barbieri * (at your option) any later version.
10*a7e926abSLuca Barbieri */
11*a7e926abSLuca Barbieri
12*a7e926abSLuca Barbieri#include <linux/linkage.h>
13*a7e926abSLuca Barbieri#include <asm/alternative-asm.h>
14*a7e926abSLuca Barbieri#include <asm/dwarf2.h>
15*a7e926abSLuca Barbieri
16*a7e926abSLuca Barbieri/* if you want SMP support, implement these with real spinlocks */
17*a7e926abSLuca Barbieri.macro LOCK reg
18*a7e926abSLuca Barbieri	pushfl
19*a7e926abSLuca Barbieri	CFI_ADJUST_CFA_OFFSET 4
20*a7e926abSLuca Barbieri	cli
21*a7e926abSLuca Barbieri.endm
22*a7e926abSLuca Barbieri
23*a7e926abSLuca Barbieri.macro UNLOCK reg
24*a7e926abSLuca Barbieri	popfl
25*a7e926abSLuca Barbieri	CFI_ADJUST_CFA_OFFSET -4
26*a7e926abSLuca Barbieri.endm
27*a7e926abSLuca Barbieri
28*a7e926abSLuca Barbieri.macro BEGIN func reg
29*a7e926abSLuca Barbieri$v = \reg
30*a7e926abSLuca Barbieri
31*a7e926abSLuca BarbieriENTRY(atomic64_\func\()_386)
32*a7e926abSLuca Barbieri	CFI_STARTPROC
33*a7e926abSLuca Barbieri	LOCK $v
34*a7e926abSLuca Barbieri
35*a7e926abSLuca Barbieri.macro RETURN
36*a7e926abSLuca Barbieri	UNLOCK $v
37*a7e926abSLuca Barbieri	ret
38*a7e926abSLuca Barbieri.endm
39*a7e926abSLuca Barbieri
40*a7e926abSLuca Barbieri.macro END_
41*a7e926abSLuca Barbieri	CFI_ENDPROC
42*a7e926abSLuca BarbieriENDPROC(atomic64_\func\()_386)
43*a7e926abSLuca Barbieri.purgem RETURN
44*a7e926abSLuca Barbieri.purgem END_
45*a7e926abSLuca Barbieri.purgem END
46*a7e926abSLuca Barbieri.endm
47*a7e926abSLuca Barbieri
48*a7e926abSLuca Barbieri.macro END
49*a7e926abSLuca BarbieriRETURN
50*a7e926abSLuca BarbieriEND_
51*a7e926abSLuca Barbieri.endm
52*a7e926abSLuca Barbieri.endm
53*a7e926abSLuca Barbieri
54*a7e926abSLuca BarbieriBEGIN read %ecx
55*a7e926abSLuca Barbieri	movl  ($v), %eax
56*a7e926abSLuca Barbieri	movl 4($v), %edx
57*a7e926abSLuca BarbieriEND
58*a7e926abSLuca Barbieri
59*a7e926abSLuca BarbieriBEGIN set %esi
60*a7e926abSLuca Barbieri	movl %ebx,  ($v)
61*a7e926abSLuca Barbieri	movl %ecx, 4($v)
62*a7e926abSLuca BarbieriEND
63*a7e926abSLuca Barbieri
64*a7e926abSLuca BarbieriBEGIN xchg %esi
65*a7e926abSLuca Barbieri	movl  ($v), %eax
66*a7e926abSLuca Barbieri	movl 4($v), %edx
67*a7e926abSLuca Barbieri	movl %ebx,  ($v)
68*a7e926abSLuca Barbieri	movl %ecx, 4($v)
69*a7e926abSLuca BarbieriEND
70*a7e926abSLuca Barbieri
71*a7e926abSLuca BarbieriBEGIN add %ecx
72*a7e926abSLuca Barbieri	addl %eax,  ($v)
73*a7e926abSLuca Barbieri	adcl %edx, 4($v)
74*a7e926abSLuca BarbieriEND
75*a7e926abSLuca Barbieri
76*a7e926abSLuca BarbieriBEGIN add_return %ecx
77*a7e926abSLuca Barbieri	addl  ($v), %eax
78*a7e926abSLuca Barbieri	adcl 4($v), %edx
79*a7e926abSLuca Barbieri	movl %eax,  ($v)
80*a7e926abSLuca Barbieri	movl %edx, 4($v)
81*a7e926abSLuca BarbieriEND
82*a7e926abSLuca Barbieri
83*a7e926abSLuca BarbieriBEGIN sub %ecx
84*a7e926abSLuca Barbieri	subl %eax,  ($v)
85*a7e926abSLuca Barbieri	sbbl %edx, 4($v)
86*a7e926abSLuca BarbieriEND
87*a7e926abSLuca Barbieri
88*a7e926abSLuca BarbieriBEGIN sub_return %ecx
89*a7e926abSLuca Barbieri	negl %edx
90*a7e926abSLuca Barbieri	negl %eax
91*a7e926abSLuca Barbieri	sbbl $0, %edx
92*a7e926abSLuca Barbieri	addl  ($v), %eax
93*a7e926abSLuca Barbieri	adcl 4($v), %edx
94*a7e926abSLuca Barbieri	movl %eax,  ($v)
95*a7e926abSLuca Barbieri	movl %edx, 4($v)
96*a7e926abSLuca BarbieriEND
97*a7e926abSLuca Barbieri
98*a7e926abSLuca BarbieriBEGIN inc %esi
99*a7e926abSLuca Barbieri	addl $1,  ($v)
100*a7e926abSLuca Barbieri	adcl $0, 4($v)
101*a7e926abSLuca BarbieriEND
102*a7e926abSLuca Barbieri
103*a7e926abSLuca BarbieriBEGIN inc_return %esi
104*a7e926abSLuca Barbieri	movl  ($v), %eax
105*a7e926abSLuca Barbieri	movl 4($v), %edx
106*a7e926abSLuca Barbieri	addl $1, %eax
107*a7e926abSLuca Barbieri	adcl $0, %edx
108*a7e926abSLuca Barbieri	movl %eax,  ($v)
109*a7e926abSLuca Barbieri	movl %edx, 4($v)
110*a7e926abSLuca BarbieriEND
111*a7e926abSLuca Barbieri
112*a7e926abSLuca BarbieriBEGIN dec %esi
113*a7e926abSLuca Barbieri	subl $1,  ($v)
114*a7e926abSLuca Barbieri	sbbl $0, 4($v)
115*a7e926abSLuca BarbieriEND
116*a7e926abSLuca Barbieri
117*a7e926abSLuca BarbieriBEGIN dec_return %esi
118*a7e926abSLuca Barbieri	movl  ($v), %eax
119*a7e926abSLuca Barbieri	movl 4($v), %edx
120*a7e926abSLuca Barbieri	subl $1, %eax
121*a7e926abSLuca Barbieri	sbbl $0, %edx
122*a7e926abSLuca Barbieri	movl %eax,  ($v)
123*a7e926abSLuca Barbieri	movl %edx, 4($v)
124*a7e926abSLuca BarbieriEND
125*a7e926abSLuca Barbieri
126*a7e926abSLuca BarbieriBEGIN add_unless %ecx
127*a7e926abSLuca Barbieri	addl %eax, %esi
128*a7e926abSLuca Barbieri	adcl %edx, %edi
129*a7e926abSLuca Barbieri	addl  ($v), %eax
130*a7e926abSLuca Barbieri	adcl 4($v), %edx
131*a7e926abSLuca Barbieri	cmpl %eax, %esi
132*a7e926abSLuca Barbieri	je 3f
133*a7e926abSLuca Barbieri1:
134*a7e926abSLuca Barbieri	movl %eax,  ($v)
135*a7e926abSLuca Barbieri	movl %edx, 4($v)
136*a7e926abSLuca Barbieri	xorl %eax, %eax
137*a7e926abSLuca Barbieri2:
138*a7e926abSLuca BarbieriRETURN
139*a7e926abSLuca Barbieri3:
140*a7e926abSLuca Barbieri	cmpl %edx, %edi
141*a7e926abSLuca Barbieri	jne 1b
142*a7e926abSLuca Barbieri	movl $1, %eax
143*a7e926abSLuca Barbieri	jmp 2b
144*a7e926abSLuca BarbieriEND_
145*a7e926abSLuca Barbieri
146*a7e926abSLuca BarbieriBEGIN inc_not_zero %esi
147*a7e926abSLuca Barbieri	movl  ($v), %eax
148*a7e926abSLuca Barbieri	movl 4($v), %edx
149*a7e926abSLuca Barbieri	testl %eax, %eax
150*a7e926abSLuca Barbieri	je 3f
151*a7e926abSLuca Barbieri1:
152*a7e926abSLuca Barbieri	addl $1, %eax
153*a7e926abSLuca Barbieri	adcl $0, %edx
154*a7e926abSLuca Barbieri	movl %eax,  ($v)
155*a7e926abSLuca Barbieri	movl %edx, 4($v)
156*a7e926abSLuca Barbieri	xorl %eax, %eax
157*a7e926abSLuca Barbieri2:
158*a7e926abSLuca BarbieriRETURN
159*a7e926abSLuca Barbieri3:
160*a7e926abSLuca Barbieri	testl %edx, %edx
161*a7e926abSLuca Barbieri	jne 1b
162*a7e926abSLuca Barbieri	movl $1, %eax
163*a7e926abSLuca Barbieri	jmp 2b
164*a7e926abSLuca BarbieriEND_
165*a7e926abSLuca Barbieri
166*a7e926abSLuca BarbieriBEGIN dec_if_positive %esi
167*a7e926abSLuca Barbieri	movl  ($v), %eax
168*a7e926abSLuca Barbieri	movl 4($v), %edx
169*a7e926abSLuca Barbieri	subl $1, %eax
170*a7e926abSLuca Barbieri	sbbl $0, %edx
171*a7e926abSLuca Barbieri	js 1f
172*a7e926abSLuca Barbieri	movl %eax,  ($v)
173*a7e926abSLuca Barbieri	movl %edx, 4($v)
174*a7e926abSLuca Barbieri1:
175*a7e926abSLuca BarbieriEND
176