Skip to content

Commit cf3b3ba

Browse files
committed
xtensa: use "m" constraint instead of "a" in cmpxchg.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 812e708 commit cf3b3ba

File tree

1 file changed

+16
-15
lines changed

1 file changed

+16
-15
lines changed

arch/xtensa/include/asm/cmpxchg.h

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,24 +43,24 @@ __cmpxchg_u32(volatile int *p, int old, int new)
4343
#elif XCHAL_HAVE_S32C1I
4444
__asm__ __volatile__(
4545
" wsr %[cmp], scompare1\n"
46-
" s32c1i %[new], %[addr], 0\n"
47-
: [new] "+a" (new)
48-
: [addr] "a" (p), [cmp] "a" (old)
46+
" s32c1i %[new], %[mem]\n"
47+
: [new] "+a" (new), [mem] "+m" (*p)
48+
: [cmp] "a" (old)
4949
: "memory"
5050
);
5151

5252
return new;
5353
#else
5454
__asm__ __volatile__(
5555
" rsil a15, "__stringify(TOPLEVEL)"\n"
56-
" l32i %[old], %[addr], 0\n"
56+
" l32i %[old], %[mem]\n"
5757
" bne %[old], %[cmp], 1f\n"
58-
" s32i %[new], %[addr], 0\n"
58+
" s32i %[new], %[mem]\n"
5959
"1:\n"
6060
" wsr a15, ps\n"
6161
" rsync\n"
62-
: [old] "=&a" (old)
63-
: [addr] "a" (p), [cmp] "a" (old), [new] "r" (new)
62+
: [old] "=&a" (old), [mem] "+m" (*p)
63+
: [cmp] "a" (old), [new] "r" (new)
6464
: "a15", "memory");
6565
return old;
6666
#endif
@@ -143,26 +143,27 @@ static inline unsigned long xchg_u32(volatile int * m, unsigned long val)
143143
#elif XCHAL_HAVE_S32C1I
144144
unsigned long tmp, result;
145145
__asm__ __volatile__(
146-
"1: l32i %[tmp], %[addr], 0\n"
146+
"1: l32i %[tmp], %[mem]\n"
147147
" mov %[result], %[val]\n"
148148
" wsr %[tmp], scompare1\n"
149-
" s32c1i %[result], %[addr], 0\n"
149+
" s32c1i %[result], %[mem]\n"
150150
" bne %[result], %[tmp], 1b\n"
151-
: [result] "=&a" (result), [tmp] "=&a" (tmp)
152-
: [addr] "a" (m), [val] "a" (val)
151+
: [result] "=&a" (result), [tmp] "=&a" (tmp),
152+
[mem] "+m" (*m)
153+
: [val] "a" (val)
153154
: "memory"
154155
);
155156
return result;
156157
#else
157158
unsigned long tmp;
158159
__asm__ __volatile__(
159160
" rsil a15, "__stringify(TOPLEVEL)"\n"
160-
" l32i %[tmp], %[addr], 0\n"
161-
" s32i %[val], %[addr], 0\n"
161+
" l32i %[tmp], %[mem]\n"
162+
" s32i %[val], %[mem]\n"
162163
" wsr a15, ps\n"
163164
" rsync\n"
164-
: [tmp] "=&a" (tmp)
165-
: [addr] "a" (m), [val] "a" (val)
165+
: [tmp] "=&a" (tmp), [mem] "+m" (*m)
166+
: [val] "a" (val)
166167
: "a15", "memory");
167168
return tmp;
168169
#endif

0 commit comments

Comments
 (0)