xtensa: use "m" constraint instead of "a" in bitops.h assembly
authorMax Filippov <jcmvbkbc@gmail.com>
Wed, 16 Oct 2019 05:17:33 +0000 (22:17 -0700)
committerMax Filippov <jcmvbkbc@gmail.com>
Tue, 26 Nov 2019 19:33:38 +0000 (11:33 -0800)
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 <jcmvbkbc@gmail.com>
arch/xtensa/include/asm/bitops.h

index 5a35d02..3f71d36 100644 (file)
@@ -150,13 +150,14 @@ static inline void op##_bit(unsigned int bit, volatile unsigned long *p)\
        p += bit >> 5;                                                  \
                                                                        \
        __asm__ __volatile__(                                           \
-                       "1:     l32i    %[value], %[addr], 0\n"         \
+                       "1:     l32i    %[value], %[mem]\n"             \
                        "       wsr     %[value], scompare1\n"          \
                        "      "insn"   %[tmp], %[value], %[mask]\n"    \
-                       "       s32c1i  %[tmp], %[addr], 0\n"           \
+                       "       s32c1i  %[tmp], %[mem]\n"               \
                        "       bne     %[tmp], %[value], 1b\n"         \
-                       : [tmp] "=&a" (tmp), [value] "=&a" (value)      \
-                       : [mask] "a" (inv mask), [addr] "a" (p)         \
+                       : [tmp] "=&a" (tmp), [value] "=&a" (value),     \
+                         [mem] "+m" (*p)                               \
+                       : [mask] "a" (inv mask)                         \
                        : "memory");                                    \
 }
 
@@ -170,13 +171,14 @@ test_and_##op##_bit(unsigned int bit, volatile unsigned long *p)  \
        p += bit >> 5;                                                  \
                                                                        \
        __asm__ __volatile__(                                           \
-                       "1:     l32i    %[value], %[addr], 0\n"         \
+                       "1:     l32i    %[value], %[mem]\n"             \
                        "       wsr     %[value], scompare1\n"          \
                        "      "insn"   %[tmp], %[value], %[mask]\n"    \
-                       "       s32c1i  %[tmp], %[addr], 0\n"           \
+                       "       s32c1i  %[tmp], %[mem]\n"               \
                        "       bne     %[tmp], %[value], 1b\n"         \
-                       : [tmp] "=&a" (tmp), [value] "=&a" (value)      \
-                       : [mask] "a" (inv mask), [addr] "a" (p)         \
+                       : [tmp] "=&a" (tmp), [value] "=&a" (value),     \
+                         [mem] "+m" (*p)                               \
+                       : [mask] "a" (inv mask)                         \
                        : "memory");                                    \
                                                                        \
        return tmp & mask;                                              \