powerpc/32s: Allow constant folding in mtsr()/mfsr()
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Sat, 6 Feb 2021 11:47:28 +0000 (11:47 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 8 Feb 2021 14:10:15 +0000 (01:10 +1100)
On the same way as we did in wrtee(), add an alternative
using mtsr/mfsr instructions instead of mtsrin/mfsrin
when the segment register can be determined at compile time.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/9baed0ff9d76723ec90f1b567ddd4ac1ecc7a190.1612612022.git.christophe.leroy@csgroup.eu
arch/powerpc/include/asm/reg.h

index 83a7fc37d4900ebb3d4eabd04dd8e7f3bbed8a0a..eb4aa889916da0199455880266a7e65bbd240b41 100644 (file)
@@ -1417,14 +1417,20 @@ static inline u32 mfsr(u32 idx)
 {
        u32 val;
 
-       asm volatile("mfsrin %0, %1" : "=r" (val): "r" (idx));
+       if (__builtin_constant_p(idx))
+               asm volatile("mfsr %0, %1" : "=r" (val): "i" (idx >> 28));
+       else
+               asm volatile("mfsrin %0, %1" : "=r" (val): "r" (idx));
 
        return val;
 }
 
 static inline void mtsr(u32 val, u32 idx)
 {
-       asm volatile("mtsrin %0, %1" : : "r" (val), "r" (idx));
+       if (__builtin_constant_p(idx))
+               asm volatile("mtsr %1, %0" : : "r" (val), "i" (idx >> 28));
+       else
+               asm volatile("mtsrin %0, %1" : : "r" (val), "r" (idx));
 }
 #endif