View | Details | Raw Unified | Return to bug 16506 | Differences between
and this patch

Collapse All | Expand All

(-)a/arch/x86/lib/atomic64_386_32.S (-109 / +130 lines)
Lines 25-174 Link Here
25
	CFI_ADJUST_CFA_OFFSET -4
25
	CFI_ADJUST_CFA_OFFSET -4
26
.endm
26
.endm
27
27
28
.macro BEGIN func reg
28
#define BEGIN(op) \
29
$v = \reg
29
.macro endp; \
30
30
	CFI_ENDPROC; \
31
ENTRY(atomic64_\func\()_386)
31
ENDPROC(atomic64_##op##_386); \
32
	CFI_STARTPROC
32
.purgem endp; \
33
	LOCK $v
33
.endm; \
34
34
ENTRY(atomic64_##op##_386); \
35
.macro RETURN
35
	CFI_STARTPROC; \
36
	UNLOCK $v
36
	LOCK v;
37
38
#define ENDP endp
39
40
#define RET \
41
	UNLOCK v; \
37
	ret
42
	ret
38
.endm
39
40
.macro END_
41
	CFI_ENDPROC
42
ENDPROC(atomic64_\func\()_386)
43
.purgem RETURN
44
.purgem END_
45
.purgem END
46
.endm
47
48
.macro END
49
RETURN
50
END_
51
.endm
52
.endm
53
43
54
BEGIN read %ecx
44
#define RET_ENDP \
55
	movl  ($v), %eax
45
	RET; \
56
	movl 4($v), %edx
46
	ENDP
57
END
47
58
48
#define v %ecx
59
BEGIN set %esi
49
BEGIN(read)
60
	movl %ebx,  ($v)
50
	movl  (v), %eax
61
	movl %ecx, 4($v)
51
	movl 4(v), %edx
62
END
52
RET_ENDP
63
53
#undef v
64
BEGIN xchg %esi
54
65
	movl  ($v), %eax
55
#define v %esi
66
	movl 4($v), %edx
56
BEGIN(set)
67
	movl %ebx,  ($v)
57
	movl %ebx,  (v)
68
	movl %ecx, 4($v)
58
	movl %ecx, 4(v)
69
END
59
RET_ENDP
70
60
#undef v
71
BEGIN add %ecx
61
72
	addl %eax,  ($v)
62
#define v  %esi
73
	adcl %edx, 4($v)
63
BEGIN(xchg)
74
END
64
	movl  (v), %eax
75
65
	movl 4(v), %edx
76
BEGIN add_return %ecx
66
	movl %ebx,  (v)
77
	addl  ($v), %eax
67
	movl %ecx, 4(v)
78
	adcl 4($v), %edx
68
RET_ENDP
79
	movl %eax,  ($v)
69
#undef v
80
	movl %edx, 4($v)
70
81
END
71
#define v %ecx
82
72
BEGIN(add)
83
BEGIN sub %ecx
73
	addl %eax,  (v)
84
	subl %eax,  ($v)
74
	adcl %edx, 4(v)
85
	sbbl %edx, 4($v)
75
RET_ENDP
86
END
76
#undef v
87
77
88
BEGIN sub_return %ecx
78
#define v %ecx
79
BEGIN(add_return)
80
	addl  (v), %eax
81
	adcl 4(v), %edx
82
	movl %eax,  (v)
83
	movl %edx, 4(v)
84
RET_ENDP
85
#undef v
86
87
#define v %ecx
88
BEGIN(sub)
89
	subl %eax,  (v)
90
	sbbl %edx, 4(v)
91
RET_ENDP
92
#undef v
93
94
#define v %ecx
95
BEGIN(sub_return)
89
	negl %edx
96
	negl %edx
90
	negl %eax
97
	negl %eax
91
	sbbl $0, %edx
98
	sbbl $0, %edx
92
	addl  ($v), %eax
99
	addl  (v), %eax
93
	adcl 4($v), %edx
100
	adcl 4(v), %edx
94
	movl %eax,  ($v)
101
	movl %eax,  (v)
95
	movl %edx, 4($v)
102
	movl %edx, 4(v)
96
END
103
RET_ENDP
97
104
#undef v
98
BEGIN inc %esi
105
99
	addl $1,  ($v)
106
#define v %esi
100
	adcl $0, 4($v)
107
BEGIN(inc)
101
END
108
	addl $1,  (v)
102
109
	adcl $0, 4(v)
103
BEGIN inc_return %esi
110
RET_ENDP
104
	movl  ($v), %eax
111
#undef v
105
	movl 4($v), %edx
112
113
#define v %esi
114
BEGIN(inc_return)
115
	movl  (v), %eax
116
	movl 4(v), %edx
106
	addl $1, %eax
117
	addl $1, %eax
107
	adcl $0, %edx
118
	adcl $0, %edx
108
	movl %eax,  ($v)
119
	movl %eax,  (v)
109
	movl %edx, 4($v)
120
	movl %edx, 4(v)
110
END
121
RET_ENDP
111
122
#undef v
112
BEGIN dec %esi
123
113
	subl $1,  ($v)
124
#define v %esi
114
	sbbl $0, 4($v)
125
BEGIN(dec)
115
END
126
	subl $1,  (v)
116
127
	sbbl $0, 4(v)
117
BEGIN dec_return %esi
128
RET_ENDP
118
	movl  ($v), %eax
129
#undef v
119
	movl 4($v), %edx
130
131
#define v %esi
132
BEGIN(dec_return)
133
	movl  (v), %eax
134
	movl 4(v), %edx
120
	subl $1, %eax
135
	subl $1, %eax
121
	sbbl $0, %edx
136
	sbbl $0, %edx
122
	movl %eax,  ($v)
137
	movl %eax,  (v)
123
	movl %edx, 4($v)
138
	movl %edx, 4(v)
124
END
139
RET_ENDP
140
#undef v
125
141
126
BEGIN add_unless %ecx
142
#define v %ecx
143
BEGIN(add_unless)
127
	addl %eax, %esi
144
	addl %eax, %esi
128
	adcl %edx, %edi
145
	adcl %edx, %edi
129
	addl  ($v), %eax
146
	addl  (v), %eax
130
	adcl 4($v), %edx
147
	adcl 4(v), %edx
131
	cmpl %eax, %esi
148
	cmpl %eax, %esi
132
	je 3f
149
	je 3f
133
1:
150
1:
134
	movl %eax,  ($v)
151
	movl %eax,  (v)
135
	movl %edx, 4($v)
152
	movl %edx, 4(v)
136
	movl $1, %eax
153
	movl $1, %eax
137
2:
154
2:
138
RETURN
155
	RET
139
3:
156
3:
140
	cmpl %edx, %edi
157
	cmpl %edx, %edi
141
	jne 1b
158
	jne 1b
142
	xorl %eax, %eax
159
	xorl %eax, %eax
143
	jmp 2b
160
	jmp 2b
144
END_
161
ENDP
162
#undef v
145
163
146
BEGIN inc_not_zero %esi
164
#define v %esi
147
	movl  ($v), %eax
165
BEGIN(inc_not_zero)
148
	movl 4($v), %edx
166
	movl  (v), %eax
167
	movl 4(v), %edx
149
	testl %eax, %eax
168
	testl %eax, %eax
150
	je 3f
169
	je 3f
151
1:
170
1:
152
	addl $1, %eax
171
	addl $1, %eax
153
	adcl $0, %edx
172
	adcl $0, %edx
154
	movl %eax,  ($v)
173
	movl %eax,  (v)
155
	movl %edx, 4($v)
174
	movl %edx, 4(v)
156
	movl $1, %eax
175
	movl $1, %eax
157
2:
176
2:
158
RETURN
177
	RET
159
3:
178
3:
160
	testl %edx, %edx
179
	testl %edx, %edx
161
	jne 1b
180
	jne 1b
162
	jmp 2b
181
	jmp 2b
163
END_
182
ENDP
183
#undef v
164
184
165
BEGIN dec_if_positive %esi
185
#define v %esi
166
	movl  ($v), %eax
186
BEGIN(dec_if_positive)
167
	movl 4($v), %edx
187
	movl  (v), %eax
188
	movl 4(v), %edx
168
	subl $1, %eax
189
	subl $1, %eax
169
	sbbl $0, %edx
190
	sbbl $0, %edx
170
	js 1f
191
	js 1f
171
	movl %eax,  ($v)
192
	movl %eax,  (v)
172
	movl %edx, 4($v)
193
	movl %edx, 4(v)
173
1:
194
1:
174
END
195
RET_ENDP
196
#undef v
175
- 

Return to bug 16506