Skip to content

Commit 13e2813

Browse files
committed
xtensa: use "m" constraint instead of "a" in atomic.h assembly
Use "m" constraint instead of "r" for the address, as "m" allows compiler to access adjacent locations using base + offset, while "r" requires updating the base register every time. Signed-off-by: Max Filippov <[email protected]>
1 parent 643d697 commit 13e2813

File tree

1 file changed

+28
-24
lines changed

1 file changed

+28
-24
lines changed

arch/xtensa/include/asm/atomic.h

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,14 @@ static inline void atomic_##op(int i, atomic_t * v) \
124124
int result; \
125125
\
126126
__asm__ __volatile__( \
127-
"1: l32i %[tmp], %[addr], 0\n" \
127+
"1: l32i %[tmp], %[mem]\n" \
128128
" wsr %[tmp], scompare1\n" \
129129
" " #op " %[result], %[tmp], %[i]\n" \
130-
" s32c1i %[result], %[addr], 0\n" \
130+
" s32c1i %[result], %[mem]\n" \
131131
" 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) \
134135
: "memory" \
135136
); \
136137
} \
@@ -142,14 +143,15 @@ static inline int atomic_##op##_return(int i, atomic_t * v) \
142143
int result; \
143144
\
144145
__asm__ __volatile__( \
145-
"1: l32i %[tmp], %[addr], 0\n" \
146+
"1: l32i %[tmp], %[mem]\n" \
146147
" wsr %[tmp], scompare1\n" \
147148
" " #op " %[result], %[tmp], %[i]\n" \
148-
" s32c1i %[result], %[addr], 0\n" \
149+
" s32c1i %[result], %[mem]\n" \
149150
" bne %[result], %[tmp], 1b\n" \
150151
" " #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) \
153155
: "memory" \
154156
); \
155157
\
@@ -163,13 +165,14 @@ static inline int atomic_fetch_##op(int i, atomic_t * v) \
163165
int result; \
164166
\
165167
__asm__ __volatile__( \
166-
"1: l32i %[tmp], %[addr], 0\n" \
168+
"1: l32i %[tmp], %[mem]\n" \
167169
" wsr %[tmp], scompare1\n" \
168170
" " #op " %[result], %[tmp], %[i]\n" \
169-
" s32c1i %[result], %[addr], 0\n" \
171+
" s32c1i %[result], %[mem]\n" \
170172
" 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) \
173176
: "memory" \
174177
); \
175178
\
@@ -185,13 +188,13 @@ static inline void atomic_##op(int i, atomic_t * v) \
185188
\
186189
__asm__ __volatile__( \
187190
" rsil a15, "__stringify(TOPLEVEL)"\n" \
188-
" l32i %[result], %[addr], 0\n" \
191+
" l32i %[result], %[mem]\n" \
189192
" " #op " %[result], %[result], %[i]\n" \
190-
" s32i %[result], %[addr], 0\n" \
193+
" s32i %[result], %[mem]\n" \
191194
" wsr a15, ps\n" \
192195
" rsync\n" \
193-
: [result] "=&a" (vval) \
194-
: [i] "a" (i), [addr] "a" (v) \
196+
: [result] "=&a" (vval), [mem] "+m" (*v) \
197+
: [i] "a" (i) \
195198
: "a15", "memory" \
196199
); \
197200
} \
@@ -203,13 +206,13 @@ static inline int atomic_##op##_return(int i, atomic_t * v) \
203206
\
204207
__asm__ __volatile__( \
205208
" rsil a15,"__stringify(TOPLEVEL)"\n" \
206-
" l32i %[result], %[addr], 0\n" \
209+
" l32i %[result], %[mem]\n" \
207210
" " #op " %[result], %[result], %[i]\n" \
208-
" s32i %[result], %[addr], 0\n" \
211+
" s32i %[result], %[mem]\n" \
209212
" wsr a15, ps\n" \
210213
" rsync\n" \
211-
: [result] "=&a" (vval) \
212-
: [i] "a" (i), [addr] "a" (v) \
214+
: [result] "=&a" (vval), [mem] "+m" (*v) \
215+
: [i] "a" (i) \
213216
: "a15", "memory" \
214217
); \
215218
\
@@ -223,13 +226,14 @@ static inline int atomic_fetch_##op(int i, atomic_t * v) \
223226
\
224227
__asm__ __volatile__( \
225228
" rsil a15,"__stringify(TOPLEVEL)"\n" \
226-
" l32i %[result], %[addr], 0\n" \
229+
" l32i %[result], %[mem]\n" \
227230
" " #op " %[tmp], %[result], %[i]\n" \
228-
" s32i %[tmp], %[addr], 0\n" \
231+
" s32i %[tmp], %[mem]\n" \
229232
" wsr a15, ps\n" \
230233
" 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) \
233237
: "a15", "memory" \
234238
); \
235239
\

0 commit comments

Comments
 (0)