s390/fpu: Use CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS instead of CONFIG_CC_IS_CLANG
authorHeiko Carstens <hca@linux.ibm.com>
Mon, 13 Jan 2025 12:36:57 +0000 (13:36 +0100)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Sun, 26 Jan 2025 16:24:05 +0000 (17:24 +0100)
Use the more precise CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS to tell if the
compiler has support for the A, O, and R inline assembly format flags.
This allows recent Clang compilers to generate better code.

Move code around so the good (aka better) case at the top of each ifdef
construct.

Reviewed-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/include/asm/fpu-insn.h

index 0f1b59eb4c5ae5fe64b6daedbf72ae18054c4270..f668bffd6dd3d329fe65bf28795fe946ae3741d1 100644 (file)
@@ -176,7 +176,19 @@ static __always_inline void fpu_vgfmg(u8 v1, u8 v2, u8 v3)
                     : "memory");
 }
 
-#ifdef CONFIG_CC_IS_CLANG
+#ifdef CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS
+
+static __always_inline void fpu_vl(u8 v1, const void *vxr)
+{
+       instrument_read(vxr, sizeof(__vector128));
+       asm volatile("VL        %[v1],%O[vxr],,%R[vxr]\n"
+                    :
+                    : [vxr] "Q" (*(__vector128 *)vxr),
+                      [v1] "I" (v1)
+                    : "memory");
+}
+
+#else /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
 
 static __always_inline void fpu_vl(u8 v1, const void *vxr)
 {
@@ -190,19 +202,7 @@ static __always_inline void fpu_vl(u8 v1, const void *vxr)
                : "memory", "1");
 }
 
-#else /* CONFIG_CC_IS_CLANG */
-
-static __always_inline void fpu_vl(u8 v1, const void *vxr)
-{
-       instrument_read(vxr, sizeof(__vector128));
-       asm volatile("VL        %[v1],%O[vxr],,%R[vxr]\n"
-                    :
-                    : [vxr] "Q" (*(__vector128 *)vxr),
-                      [v1] "I" (v1)
-                    : "memory");
-}
-
-#endif /* CONFIG_CC_IS_CLANG */
+#endif /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
 
 static __always_inline void fpu_vleib(u8 v, s16 val, u8 index)
 {
@@ -231,7 +231,7 @@ static __always_inline u64 fpu_vlgvf(u8 v, u16 index)
        return val;
 }
 
-#ifdef CONFIG_CC_IS_CLANG
+#ifdef CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS
 
 static __always_inline void fpu_vll(u8 v1, u32 index, const void *vxr)
 {
@@ -239,17 +239,15 @@ static __always_inline void fpu_vll(u8 v1, u32 index, const void *vxr)
 
        size = min(index + 1, sizeof(__vector128));
        instrument_read(vxr, size);
-       asm volatile(
-               "       la      1,%[vxr]\n"
-               "       VLL     %[v1],%[index],0,1\n"
-               :
-               : [vxr] "R" (*(u8 *)vxr),
-                 [index] "d" (index),
-                 [v1] "I" (v1)
-               : "memory", "1");
+       asm volatile("VLL       %[v1],%[index],%O[vxr],%R[vxr]\n"
+                    :
+                    : [vxr] "Q" (*(u8 *)vxr),
+                      [index] "d" (index),
+                      [v1] "I" (v1)
+                    : "memory");
 }
 
-#else /* CONFIG_CC_IS_CLANG */
+#else /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
 
 static __always_inline void fpu_vll(u8 v1, u32 index, const void *vxr)
 {
@@ -257,17 +255,19 @@ static __always_inline void fpu_vll(u8 v1, u32 index, const void *vxr)
 
        size = min(index + 1, sizeof(__vector128));
        instrument_read(vxr, size);
-       asm volatile("VLL       %[v1],%[index],%O[vxr],%R[vxr]\n"
-                    :
-                    : [vxr] "Q" (*(u8 *)vxr),
-                      [index] "d" (index),
-                      [v1] "I" (v1)
-                    : "memory");
+       asm volatile(
+               "       la      1,%[vxr]\n"
+               "       VLL     %[v1],%[index],0,1\n"
+               :
+               : [vxr] "R" (*(u8 *)vxr),
+                 [index] "d" (index),
+                 [v1] "I" (v1)
+               : "memory", "1");
 }
 
-#endif /* CONFIG_CC_IS_CLANG */
+#endif /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
 
-#ifdef CONFIG_CC_IS_CLANG
+#ifdef CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS
 
 #define fpu_vlm(_v1, _v3, _vxrs)                                       \
 ({                                                                     \
@@ -277,17 +277,15 @@ static __always_inline void fpu_vll(u8 v1, u32 index, const void *vxr)
        } *_v = (void *)(_vxrs);                                        \
                                                                        \
        instrument_read(_v, size);                                      \
-       asm volatile(                                                   \
-               "       la      1,%[vxrs]\n"                            \
-               "       VLM     %[v1],%[v3],0,1\n"                      \
-               :                                                       \
-               : [vxrs] "R" (*_v),                                     \
-                 [v1] "I" (_v1), [v3] "I" (_v3)                        \
-               : "memory", "1");                                       \
+       asm volatile("VLM       %[v1],%[v3],%O[vxrs],%R[vxrs]\n"        \
+                    :                                                  \
+                    : [vxrs] "Q" (*_v),                                \
+                      [v1] "I" (_v1), [v3] "I" (_v3)                   \
+                    : "memory");                                       \
        (_v3) - (_v1) + 1;                                              \
 })
 
-#else /* CONFIG_CC_IS_CLANG */
+#else /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
 
 #define fpu_vlm(_v1, _v3, _vxrs)                                       \
 ({                                                                     \
@@ -297,15 +295,17 @@ static __always_inline void fpu_vll(u8 v1, u32 index, const void *vxr)
        } *_v = (void *)(_vxrs);                                        \
                                                                        \
        instrument_read(_v, size);                                      \
-       asm volatile("VLM       %[v1],%[v3],%O[vxrs],%R[vxrs]\n"        \
-                    :                                                  \
-                    : [vxrs] "Q" (*_v),                                \
-                      [v1] "I" (_v1), [v3] "I" (_v3)                   \
-                    : "memory");                                       \
+       asm volatile(                                                   \
+               "       la      1,%[vxrs]\n"                            \
+               "       VLM     %[v1],%[v3],0,1\n"                      \
+               :                                                       \
+               : [vxrs] "R" (*_v),                                     \
+                 [v1] "I" (_v1), [v3] "I" (_v3)                        \
+               : "memory", "1");                                       \
        (_v3) - (_v1) + 1;                                              \
 })
 
-#endif /* CONFIG_CC_IS_CLANG */
+#endif /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
 
 static __always_inline void fpu_vlr(u8 v1, u8 v2)
 {
@@ -355,7 +355,18 @@ static __always_inline void fpu_vsrlb(u8 v1, u8 v2, u8 v3)
                     : "memory");
 }
 
-#ifdef CONFIG_CC_IS_CLANG
+#ifdef CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS
+
+static __always_inline void fpu_vst(u8 v1, const void *vxr)
+{
+       instrument_write(vxr, sizeof(__vector128));
+       asm volatile("VST       %[v1],%O[vxr],,%R[vxr]\n"
+                    : [vxr] "=Q" (*(__vector128 *)vxr)
+                    : [v1] "I" (v1)
+                    : "memory");
+}
+
+#else /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
 
 static __always_inline void fpu_vst(u8 v1, const void *vxr)
 {
@@ -368,20 +379,23 @@ static __always_inline void fpu_vst(u8 v1, const void *vxr)
                : "memory", "1");
 }
 
-#else /* CONFIG_CC_IS_CLANG */
+#endif /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
 
-static __always_inline void fpu_vst(u8 v1, const void *vxr)
+#ifdef CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS
+
+static __always_inline void fpu_vstl(u8 v1, u32 index, const void *vxr)
 {
-       instrument_write(vxr, sizeof(__vector128));
-       asm volatile("VST       %[v1],%O[vxr],,%R[vxr]\n"
-                    : [vxr] "=Q" (*(__vector128 *)vxr)
-                    : [v1] "I" (v1)
+       unsigned int size;
+
+       size = min(index + 1, sizeof(__vector128));
+       instrument_write(vxr, size);
+       asm volatile("VSTL      %[v1],%[index],%O[vxr],%R[vxr]\n"
+                    : [vxr] "=Q" (*(u8 *)vxr)
+                    : [index] "d" (index), [v1] "I" (v1)
                     : "memory");
 }
 
-#endif /* CONFIG_CC_IS_CLANG */
-
-#ifdef CONFIG_CC_IS_CLANG
+#else /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
 
 static __always_inline void fpu_vstl(u8 v1, u32 index, const void *vxr)
 {
@@ -397,23 +411,9 @@ static __always_inline void fpu_vstl(u8 v1, u32 index, const void *vxr)
                : "memory", "1");
 }
 
-#else /* CONFIG_CC_IS_CLANG */
+#endif /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
 
-static __always_inline void fpu_vstl(u8 v1, u32 index, const void *vxr)
-{
-       unsigned int size;
-
-       size = min(index + 1, sizeof(__vector128));
-       instrument_write(vxr, size);
-       asm volatile("VSTL      %[v1],%[index],%O[vxr],%R[vxr]\n"
-                    : [vxr] "=Q" (*(u8 *)vxr)
-                    : [index] "d" (index), [v1] "I" (v1)
-                    : "memory");
-}
-
-#endif /* CONFIG_CC_IS_CLANG */
-
-#ifdef CONFIG_CC_IS_CLANG
+#ifdef CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS
 
 #define fpu_vstm(_v1, _v3, _vxrs)                                      \
 ({                                                                     \
@@ -423,16 +423,14 @@ static __always_inline void fpu_vstl(u8 v1, u32 index, const void *vxr)
        } *_v = (void *)(_vxrs);                                        \
                                                                        \
        instrument_write(_v, size);                                     \
-       asm volatile(                                                   \
-               "       la      1,%[vxrs]\n"                            \
-               "       VSTM    %[v1],%[v3],0,1\n"                      \
-               : [vxrs] "=R" (*_v)                                     \
-               : [v1] "I" (_v1), [v3] "I" (_v3)                        \
-               : "memory", "1");                                       \
+       asm volatile("VSTM      %[v1],%[v3],%O[vxrs],%R[vxrs]\n"        \
+                    : [vxrs] "=Q" (*_v)                                \
+                    : [v1] "I" (_v1), [v3] "I" (_v3)                   \
+                    : "memory");                                       \
        (_v3) - (_v1) + 1;                                              \
 })
 
-#else /* CONFIG_CC_IS_CLANG */
+#else /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
 
 #define fpu_vstm(_v1, _v3, _vxrs)                                      \
 ({                                                                     \
@@ -442,14 +440,16 @@ static __always_inline void fpu_vstl(u8 v1, u32 index, const void *vxr)
        } *_v = (void *)(_vxrs);                                        \
                                                                        \
        instrument_write(_v, size);                                     \
-       asm volatile("VSTM      %[v1],%[v3],%O[vxrs],%R[vxrs]\n"        \
-                    : [vxrs] "=Q" (*_v)                                \
-                    : [v1] "I" (_v1), [v3] "I" (_v3)                   \
-                    : "memory");                                       \
+       asm volatile(                                                   \
+               "       la      1,%[vxrs]\n"                            \
+               "       VSTM    %[v1],%[v3],0,1\n"                      \
+               : [vxrs] "=R" (*_v)                                     \
+               : [v1] "I" (_v1), [v3] "I" (_v3)                        \
+               : "memory", "1");                                       \
        (_v3) - (_v1) + 1;                                              \
 })
 
-#endif /* CONFIG_CC_IS_CLANG */
+#endif /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
 
 static __always_inline void fpu_vupllf(u8 v1, u8 v2)
 {