Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[deliverable/linux.git] / arch / x86 / lib / atomic64_386_32.S
CommitLineData
a7e926ab
LB
1/*
2 * atomic64_t for 386/486
3 *
4 * Copyright © 2010 Luca Barbieri
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 */
11
12#include <linux/linkage.h>
13#include <asm/alternative-asm.h>
a7e926ab
LB
14
15/* if you want SMP support, implement these with real spinlocks */
16.macro LOCK reg
131484c8 17 pushfl
a7e926ab
LB
18 cli
19.endm
20
21.macro UNLOCK reg
131484c8 22 popfl
a7e926ab
LB
23.endm
24
30246557 25#define BEGIN(op) \
417484d4 26.macro endp; \
30246557 27ENDPROC(atomic64_##op##_386); \
417484d4 28.purgem endp; \
30246557
LB
29.endm; \
30ENTRY(atomic64_##op##_386); \
30246557
LB
31 LOCK v;
32
417484d4
LB
33#define ENDP endp
34
30246557
LB
35#define RET \
36 UNLOCK v; \
a7e926ab 37 ret
a7e926ab 38
417484d4 39#define RET_ENDP \
30246557 40 RET; \
417484d4 41 ENDP
30246557
LB
42
43#define v %ecx
44BEGIN(read)
45 movl (v), %eax
46 movl 4(v), %edx
417484d4 47RET_ENDP
30246557
LB
48#undef v
49
50#define v %esi
51BEGIN(set)
52 movl %ebx, (v)
53 movl %ecx, 4(v)
417484d4 54RET_ENDP
30246557
LB
55#undef v
56
57#define v %esi
58BEGIN(xchg)
59 movl (v), %eax
60 movl 4(v), %edx
61 movl %ebx, (v)
62 movl %ecx, 4(v)
417484d4 63RET_ENDP
30246557
LB
64#undef v
65
66#define v %ecx
67BEGIN(add)
68 addl %eax, (v)
69 adcl %edx, 4(v)
417484d4 70RET_ENDP
30246557
LB
71#undef v
72
73#define v %ecx
74BEGIN(add_return)
75 addl (v), %eax
76 adcl 4(v), %edx
77 movl %eax, (v)
78 movl %edx, 4(v)
417484d4 79RET_ENDP
30246557
LB
80#undef v
81
82#define v %ecx
83BEGIN(sub)
84 subl %eax, (v)
85 sbbl %edx, 4(v)
417484d4 86RET_ENDP
30246557
LB
87#undef v
88
89#define v %ecx
90BEGIN(sub_return)
a7e926ab
LB
91 negl %edx
92 negl %eax
93 sbbl $0, %edx
30246557
LB
94 addl (v), %eax
95 adcl 4(v), %edx
96 movl %eax, (v)
97 movl %edx, 4(v)
417484d4 98RET_ENDP
30246557
LB
99#undef v
100
101#define v %esi
102BEGIN(inc)
103 addl $1, (v)
104 adcl $0, 4(v)
417484d4 105RET_ENDP
30246557
LB
106#undef v
107
108#define v %esi
109BEGIN(inc_return)
110 movl (v), %eax
111 movl 4(v), %edx
a7e926ab
LB
112 addl $1, %eax
113 adcl $0, %edx
30246557
LB
114 movl %eax, (v)
115 movl %edx, 4(v)
417484d4 116RET_ENDP
30246557
LB
117#undef v
118
119#define v %esi
120BEGIN(dec)
121 subl $1, (v)
122 sbbl $0, 4(v)
417484d4 123RET_ENDP
30246557
LB
124#undef v
125
126#define v %esi
127BEGIN(dec_return)
128 movl (v), %eax
129 movl 4(v), %edx
a7e926ab
LB
130 subl $1, %eax
131 sbbl $0, %edx
30246557
LB
132 movl %eax, (v)
133 movl %edx, 4(v)
417484d4 134RET_ENDP
30246557 135#undef v
a7e926ab 136
cb8095bb 137#define v %esi
30246557 138BEGIN(add_unless)
cb8095bb 139 addl %eax, %ecx
a7e926ab 140 adcl %edx, %edi
30246557
LB
141 addl (v), %eax
142 adcl 4(v), %edx
cb8095bb 143 cmpl %eax, %ecx
a7e926ab
LB
144 je 3f
1451:
30246557
LB
146 movl %eax, (v)
147 movl %edx, 4(v)
6e6104fe 148 movl $1, %eax
a7e926ab 1492:
30246557 150 RET
a7e926ab
LB
1513:
152 cmpl %edx, %edi
153 jne 1b
6e6104fe 154 xorl %eax, %eax
a7e926ab 155 jmp 2b
417484d4 156ENDP
30246557 157#undef v
a7e926ab 158
30246557
LB
159#define v %esi
160BEGIN(inc_not_zero)
161 movl (v), %eax
162 movl 4(v), %edx
a7e926ab
LB
163 testl %eax, %eax
164 je 3f
1651:
166 addl $1, %eax
167 adcl $0, %edx
30246557
LB
168 movl %eax, (v)
169 movl %edx, 4(v)
f3e83131 170 movl $1, %eax
a7e926ab 1712:
30246557 172 RET
a7e926ab
LB
1733:
174 testl %edx, %edx
175 jne 1b
a7e926ab 176 jmp 2b
417484d4 177ENDP
30246557 178#undef v
a7e926ab 179
30246557
LB
180#define v %esi
181BEGIN(dec_if_positive)
182 movl (v), %eax
183 movl 4(v), %edx
a7e926ab
LB
184 subl $1, %eax
185 sbbl $0, %edx
186 js 1f
30246557
LB
187 movl %eax, (v)
188 movl %edx, 4(v)
a7e926ab 1891:
417484d4 190RET_ENDP
30246557 191#undef v
This page took 0.380634 seconds and 5 git commands to generate.