@@ -124,13 +124,14 @@ static inline void atomic_##op(int i, atomic_t * v) \
124
124
int result; \
125
125
\
126
126
__asm__ __volatile__( \
127
- "1: l32i %[tmp], %[addr], 0 \n" \
127
+ "1: l32i %[tmp], %[mem] \n" \
128
128
" wsr %[tmp], scompare1\n" \
129
129
" " #op " %[result], %[tmp], %[i]\n" \
130
- " s32c1i %[result], %[addr], 0 \n" \
130
+ " s32c1i %[result], %[mem] \n" \
131
131
" bne %[result], %[tmp], 1b\n" \
132
- : [result] "=&a" (result), [tmp] "=&a" (tmp) \
133
- : [i] "a" (i), [addr] "a" (v) \
132
+ : [result] "=&a" (result), [tmp] "=&a" (tmp), \
133
+ [mem] "+m" (*v) \
134
+ : [i] "a" (i) \
134
135
: "memory" \
135
136
); \
136
137
} \
@@ -142,14 +143,15 @@ static inline int atomic_##op##_return(int i, atomic_t * v) \
142
143
int result; \
143
144
\
144
145
__asm__ __volatile__( \
145
- "1: l32i %[tmp], %[addr], 0 \n" \
146
+ "1: l32i %[tmp], %[mem] \n" \
146
147
" wsr %[tmp], scompare1\n" \
147
148
" " #op " %[result], %[tmp], %[i]\n" \
148
- " s32c1i %[result], %[addr], 0 \n" \
149
+ " s32c1i %[result], %[mem] \n" \
149
150
" bne %[result], %[tmp], 1b\n" \
150
151
" " #op " %[result], %[result], %[i]\n" \
151
- : [result] "=&a" (result), [tmp] "=&a" (tmp) \
152
- : [i] "a" (i), [addr] "a" (v) \
152
+ : [result] "=&a" (result), [tmp] "=&a" (tmp), \
153
+ [mem] "+m" (*v) \
154
+ : [i] "a" (i) \
153
155
: "memory" \
154
156
); \
155
157
\
@@ -163,13 +165,14 @@ static inline int atomic_fetch_##op(int i, atomic_t * v) \
163
165
int result; \
164
166
\
165
167
__asm__ __volatile__( \
166
- "1: l32i %[tmp], %[addr], 0 \n" \
168
+ "1: l32i %[tmp], %[mem] \n" \
167
169
" wsr %[tmp], scompare1\n" \
168
170
" " #op " %[result], %[tmp], %[i]\n" \
169
- " s32c1i %[result], %[addr], 0 \n" \
171
+ " s32c1i %[result], %[mem] \n" \
170
172
" bne %[result], %[tmp], 1b\n" \
171
- : [result] "=&a" (result), [tmp] "=&a" (tmp) \
172
- : [i] "a" (i), [addr] "a" (v) \
173
+ : [result] "=&a" (result), [tmp] "=&a" (tmp), \
174
+ [mem] "+m" (*v) \
175
+ : [i] "a" (i) \
173
176
: "memory" \
174
177
); \
175
178
\
@@ -185,13 +188,13 @@ static inline void atomic_##op(int i, atomic_t * v) \
185
188
\
186
189
__asm__ __volatile__( \
187
190
" rsil a15, "__stringify(TOPLEVEL)"\n" \
188
- " l32i %[result], %[addr], 0 \n" \
191
+ " l32i %[result], %[mem] \n" \
189
192
" " #op " %[result], %[result], %[i]\n" \
190
- " s32i %[result], %[addr], 0 \n" \
193
+ " s32i %[result], %[mem] \n" \
191
194
" wsr a15, ps\n" \
192
195
" rsync\n" \
193
- : [result] "=&a" (vval) \
194
- : [i] "a" (i), [addr] "a" (v) \
196
+ : [result] "=&a" (vval), [mem] "+m" (*v) \
197
+ : [i] "a" (i) \
195
198
: "a15", "memory" \
196
199
); \
197
200
} \
@@ -203,13 +206,13 @@ static inline int atomic_##op##_return(int i, atomic_t * v) \
203
206
\
204
207
__asm__ __volatile__( \
205
208
" rsil a15,"__stringify(TOPLEVEL)"\n" \
206
- " l32i %[result], %[addr], 0 \n" \
209
+ " l32i %[result], %[mem] \n" \
207
210
" " #op " %[result], %[result], %[i]\n" \
208
- " s32i %[result], %[addr], 0 \n" \
211
+ " s32i %[result], %[mem] \n" \
209
212
" wsr a15, ps\n" \
210
213
" rsync\n" \
211
- : [result] "=&a" (vval) \
212
- : [i] "a" (i), [addr] "a" (v) \
214
+ : [result] "=&a" (vval), [mem] "+m" (*v) \
215
+ : [i] "a" (i) \
213
216
: "a15", "memory" \
214
217
); \
215
218
\
@@ -223,13 +226,14 @@ static inline int atomic_fetch_##op(int i, atomic_t * v) \
223
226
\
224
227
__asm__ __volatile__( \
225
228
" rsil a15,"__stringify(TOPLEVEL)"\n" \
226
- " l32i %[result], %[addr], 0 \n" \
229
+ " l32i %[result], %[mem] \n" \
227
230
" " #op " %[tmp], %[result], %[i]\n" \
228
- " s32i %[tmp], %[addr], 0 \n" \
231
+ " s32i %[tmp], %[mem] \n" \
229
232
" wsr a15, ps\n" \
230
233
" rsync\n" \
231
- : [result] "=&a" (vval), [tmp] "=&a" (tmp) \
232
- : [i] "a" (i), [addr] "a" (v) \
234
+ : [result] "=&a" (vval), [tmp] "=&a" (tmp), \
235
+ [mem] "+m" (*v) \
236
+ : [i] "a" (i) \
233
237
: "a15", "memory" \
234
238
); \
235
239
\
0 commit comments