mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
s390/fpu: Use CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS instead of CONFIG_CC_IS_CLANG
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>
This commit is contained in:
parent
f340d27049
commit
836968fa0a
|
|
@ -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,23 @@ 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)
|
||||
{
|
||||
unsigned int size;
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
#else /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
|
||||
|
||||
static __always_inline void fpu_vll(u8 v1, u32 index, const void *vxr)
|
||||
{
|
||||
|
|
@ -249,25 +265,27 @@ static __always_inline void fpu_vll(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_vll(u8 v1, u32 index, const void *vxr)
|
||||
{
|
||||
unsigned int size;
|
||||
#ifdef CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS
|
||||
|
||||
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");
|
||||
}
|
||||
#define fpu_vlm(_v1, _v3, _vxrs) \
|
||||
({ \
|
||||
unsigned int size = ((_v3) - (_v1) + 1) * sizeof(__vector128); \
|
||||
struct { \
|
||||
__vector128 _v[(_v3) - (_v1) + 1]; \
|
||||
} *_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"); \
|
||||
(_v3) - (_v1) + 1; \
|
||||
})
|
||||
|
||||
#endif /* CONFIG_CC_IS_CLANG */
|
||||
|
||||
#ifdef CONFIG_CC_IS_CLANG
|
||||
#else /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
|
||||
|
||||
#define fpu_vlm(_v1, _v3, _vxrs) \
|
||||
({ \
|
||||
|
|
@ -287,25 +305,7 @@ static __always_inline void fpu_vll(u8 v1, u32 index, const void *vxr)
|
|||
(_v3) - (_v1) + 1; \
|
||||
})
|
||||
|
||||
#else /* CONFIG_CC_IS_CLANG */
|
||||
|
||||
#define fpu_vlm(_v1, _v3, _vxrs) \
|
||||
({ \
|
||||
unsigned int size = ((_v3) - (_v1) + 1) * sizeof(__vector128); \
|
||||
struct { \
|
||||
__vector128 _v[(_v3) - (_v1) + 1]; \
|
||||
} *_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"); \
|
||||
(_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,26 @@ 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;
|
||||
#ifdef CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS
|
||||
|
||||
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");
|
||||
}
|
||||
#define fpu_vstm(_v1, _v3, _vxrs) \
|
||||
({ \
|
||||
unsigned int size = ((_v3) - (_v1) + 1) * sizeof(__vector128); \
|
||||
struct { \
|
||||
__vector128 _v[(_v3) - (_v1) + 1]; \
|
||||
} *_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"); \
|
||||
(_v3) - (_v1) + 1; \
|
||||
})
|
||||
|
||||
#endif /* CONFIG_CC_IS_CLANG */
|
||||
|
||||
#ifdef CONFIG_CC_IS_CLANG
|
||||
#else /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
|
||||
|
||||
#define fpu_vstm(_v1, _v3, _vxrs) \
|
||||
({ \
|
||||
|
|
@ -432,24 +449,7 @@ static __always_inline void fpu_vstl(u8 v1, u32 index, const void *vxr)
|
|||
(_v3) - (_v1) + 1; \
|
||||
})
|
||||
|
||||
#else /* CONFIG_CC_IS_CLANG */
|
||||
|
||||
#define fpu_vstm(_v1, _v3, _vxrs) \
|
||||
({ \
|
||||
unsigned int size = ((_v3) - (_v1) + 1) * sizeof(__vector128); \
|
||||
struct { \
|
||||
__vector128 _v[(_v3) - (_v1) + 1]; \
|
||||
} *_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"); \
|
||||
(_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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user