xref: /openbmc/linux/arch/x86/lib/atomic64_386_32.S (revision f3e83131469e29032a700217aa394996107b8fc5)
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
18a7e926abSLuca Barbieri	pushfl
19a7e926abSLuca Barbieri	CFI_ADJUST_CFA_OFFSET 4
20a7e926abSLuca Barbieri	cli
21a7e926abSLuca Barbieri.endm
22a7e926abSLuca Barbieri
23a7e926abSLuca Barbieri.macro UNLOCK reg
24a7e926abSLuca Barbieri	popfl
25a7e926abSLuca Barbieri	CFI_ADJUST_CFA_OFFSET -4
26a7e926abSLuca Barbieri.endm
27a7e926abSLuca Barbieri
28a7e926abSLuca Barbieri.macro BEGIN func reg
29a7e926abSLuca Barbieri$v = \reg
30a7e926abSLuca Barbieri
31a7e926abSLuca BarbieriENTRY(atomic64_\func\()_386)
32a7e926abSLuca Barbieri	CFI_STARTPROC
33a7e926abSLuca Barbieri	LOCK $v
34a7e926abSLuca Barbieri
35a7e926abSLuca Barbieri.macro RETURN
36a7e926abSLuca Barbieri	UNLOCK $v
37a7e926abSLuca Barbieri	ret
38a7e926abSLuca Barbieri.endm
39a7e926abSLuca Barbieri
40a7e926abSLuca Barbieri.macro END_
41a7e926abSLuca Barbieri	CFI_ENDPROC
42a7e926abSLuca BarbieriENDPROC(atomic64_\func\()_386)
43a7e926abSLuca Barbieri.purgem RETURN
44a7e926abSLuca Barbieri.purgem END_
45a7e926abSLuca Barbieri.purgem END
46a7e926abSLuca Barbieri.endm
47a7e926abSLuca Barbieri
48a7e926abSLuca Barbieri.macro END
49a7e926abSLuca BarbieriRETURN
50a7e926abSLuca BarbieriEND_
51a7e926abSLuca Barbieri.endm
52a7e926abSLuca Barbieri.endm
53a7e926abSLuca Barbieri
54a7e926abSLuca BarbieriBEGIN read %ecx
55a7e926abSLuca Barbieri	movl  ($v), %eax
56a7e926abSLuca Barbieri	movl 4($v), %edx
57a7e926abSLuca BarbieriEND
58a7e926abSLuca Barbieri
59a7e926abSLuca BarbieriBEGIN set %esi
60a7e926abSLuca Barbieri	movl %ebx,  ($v)
61a7e926abSLuca Barbieri	movl %ecx, 4($v)
62a7e926abSLuca BarbieriEND
63a7e926abSLuca Barbieri
64a7e926abSLuca BarbieriBEGIN xchg %esi
65a7e926abSLuca Barbieri	movl  ($v), %eax
66a7e926abSLuca Barbieri	movl 4($v), %edx
67a7e926abSLuca Barbieri	movl %ebx,  ($v)
68a7e926abSLuca Barbieri	movl %ecx, 4($v)
69a7e926abSLuca BarbieriEND
70a7e926abSLuca Barbieri
71a7e926abSLuca BarbieriBEGIN add %ecx
72a7e926abSLuca Barbieri	addl %eax,  ($v)
73a7e926abSLuca Barbieri	adcl %edx, 4($v)
74a7e926abSLuca BarbieriEND
75a7e926abSLuca Barbieri
76a7e926abSLuca BarbieriBEGIN add_return %ecx
77a7e926abSLuca Barbieri	addl  ($v), %eax
78a7e926abSLuca Barbieri	adcl 4($v), %edx
79a7e926abSLuca Barbieri	movl %eax,  ($v)
80a7e926abSLuca Barbieri	movl %edx, 4($v)
81a7e926abSLuca BarbieriEND
82a7e926abSLuca Barbieri
83a7e926abSLuca BarbieriBEGIN sub %ecx
84a7e926abSLuca Barbieri	subl %eax,  ($v)
85a7e926abSLuca Barbieri	sbbl %edx, 4($v)
86a7e926abSLuca BarbieriEND
87a7e926abSLuca Barbieri
88a7e926abSLuca BarbieriBEGIN sub_return %ecx
89a7e926abSLuca Barbieri	negl %edx
90a7e926abSLuca Barbieri	negl %eax
91a7e926abSLuca Barbieri	sbbl $0, %edx
92a7e926abSLuca Barbieri	addl  ($v), %eax
93a7e926abSLuca Barbieri	adcl 4($v), %edx
94a7e926abSLuca Barbieri	movl %eax,  ($v)
95a7e926abSLuca Barbieri	movl %edx, 4($v)
96a7e926abSLuca BarbieriEND
97a7e926abSLuca Barbieri
98a7e926abSLuca BarbieriBEGIN inc %esi
99a7e926abSLuca Barbieri	addl $1,  ($v)
100a7e926abSLuca Barbieri	adcl $0, 4($v)
101a7e926abSLuca BarbieriEND
102a7e926abSLuca Barbieri
103a7e926abSLuca BarbieriBEGIN inc_return %esi
104a7e926abSLuca Barbieri	movl  ($v), %eax
105a7e926abSLuca Barbieri	movl 4($v), %edx
106a7e926abSLuca Barbieri	addl $1, %eax
107a7e926abSLuca Barbieri	adcl $0, %edx
108a7e926abSLuca Barbieri	movl %eax,  ($v)
109a7e926abSLuca Barbieri	movl %edx, 4($v)
110a7e926abSLuca BarbieriEND
111a7e926abSLuca Barbieri
112a7e926abSLuca BarbieriBEGIN dec %esi
113a7e926abSLuca Barbieri	subl $1,  ($v)
114a7e926abSLuca Barbieri	sbbl $0, 4($v)
115a7e926abSLuca BarbieriEND
116a7e926abSLuca Barbieri
117a7e926abSLuca BarbieriBEGIN dec_return %esi
118a7e926abSLuca Barbieri	movl  ($v), %eax
119a7e926abSLuca Barbieri	movl 4($v), %edx
120a7e926abSLuca Barbieri	subl $1, %eax
121a7e926abSLuca Barbieri	sbbl $0, %edx
122a7e926abSLuca Barbieri	movl %eax,  ($v)
123a7e926abSLuca Barbieri	movl %edx, 4($v)
124a7e926abSLuca BarbieriEND
125a7e926abSLuca Barbieri
126a7e926abSLuca BarbieriBEGIN add_unless %ecx
127a7e926abSLuca Barbieri	addl %eax, %esi
128a7e926abSLuca Barbieri	adcl %edx, %edi
129a7e926abSLuca Barbieri	addl  ($v), %eax
130a7e926abSLuca Barbieri	adcl 4($v), %edx
131a7e926abSLuca Barbieri	cmpl %eax, %esi
132a7e926abSLuca Barbieri	je 3f
133a7e926abSLuca Barbieri1:
134a7e926abSLuca Barbieri	movl %eax,  ($v)
135a7e926abSLuca Barbieri	movl %edx, 4($v)
1366e6104feSLuca Barbieri	movl $1, %eax
137a7e926abSLuca Barbieri2:
138a7e926abSLuca BarbieriRETURN
139a7e926abSLuca Barbieri3:
140a7e926abSLuca Barbieri	cmpl %edx, %edi
141a7e926abSLuca Barbieri	jne 1b
1426e6104feSLuca Barbieri	xorl %eax, %eax
143a7e926abSLuca Barbieri	jmp 2b
144a7e926abSLuca BarbieriEND_
145a7e926abSLuca Barbieri
146a7e926abSLuca BarbieriBEGIN inc_not_zero %esi
147a7e926abSLuca Barbieri	movl  ($v), %eax
148a7e926abSLuca Barbieri	movl 4($v), %edx
149a7e926abSLuca Barbieri	testl %eax, %eax
150a7e926abSLuca Barbieri	je 3f
151a7e926abSLuca Barbieri1:
152a7e926abSLuca Barbieri	addl $1, %eax
153a7e926abSLuca Barbieri	adcl $0, %edx
154a7e926abSLuca Barbieri	movl %eax,  ($v)
155a7e926abSLuca Barbieri	movl %edx, 4($v)
156*f3e83131SLuca Barbieri	movl $1, %eax
157a7e926abSLuca Barbieri2:
158a7e926abSLuca BarbieriRETURN
159a7e926abSLuca Barbieri3:
160a7e926abSLuca Barbieri	testl %edx, %edx
161a7e926abSLuca Barbieri	jne 1b
162a7e926abSLuca Barbieri	jmp 2b
163a7e926abSLuca BarbieriEND_
164a7e926abSLuca Barbieri
165a7e926abSLuca BarbieriBEGIN dec_if_positive %esi
166a7e926abSLuca Barbieri	movl  ($v), %eax
167a7e926abSLuca Barbieri	movl 4($v), %edx
168a7e926abSLuca Barbieri	subl $1, %eax
169a7e926abSLuca Barbieri	sbbl $0, %edx
170a7e926abSLuca Barbieri	js 1f
171a7e926abSLuca Barbieri	movl %eax,  ($v)
172a7e926abSLuca Barbieri	movl %edx, 4($v)
173a7e926abSLuca Barbieri1:
174a7e926abSLuca BarbieriEND
175