Commit 836968fa authored by Heiko Carstens's avatar Heiko Carstens Committed by Alexander Gordeev
Browse files

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: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
parent f340d270
Loading
Loading
Loading
Loading
+84 −84
Original line number Diff line number Diff line
@@ -176,33 +176,33 @@ 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(
		"	la	1,%[vxr]\n"
		"	VL	%[v1],0,,1\n"
	asm volatile("VL	%[v1],%O[vxr],,%R[vxr]\n"
		     :
		: [vxr] "R" (*(__vector128 *)vxr),
		     : [vxr] "Q" (*(__vector128 *)vxr),
		       [v1] "I" (v1)
		: "memory", "1");
		     : "memory");
}

#else /* CONFIG_CC_IS_CLANG */
#else /* 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"
	asm volatile(
		"	la	1,%[vxr]\n"
		"	VL	%[v1],0,,1\n"
		:
		     : [vxr] "Q" (*(__vector128 *)vxr),
		: [vxr] "R" (*(__vector128 *)vxr),
		  [v1] "I" (v1)
		     : "memory");
		: "memory", "1");
}

#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"
	asm volatile("VLL	%[v1],%[index],%O[vxr],%R[vxr]\n"
		     :
		: [vxr] "R" (*(u8 *)vxr),
		     : [vxr] "Q" (*(u8 *)vxr),
		       [index] "d" (index),
		       [v1] "I" (v1)
		: "memory", "1");
		     : "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"
	asm volatile(
		"	la	1,%[vxr]\n"
		"	VLL	%[v1],%[index],0,1\n"
		:
		     : [vxr] "Q" (*(u8 *)vxr),
		: [vxr] "R" (*(u8 *)vxr),
		  [index] "d" (index),
		  [v1] "I" (v1)
		     : "memory");
		: "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"			\
	asm volatile("VLM	%[v1],%[v3],%O[vxrs],%R[vxrs]\n"	\
		     :							\
		: [vxrs] "R" (*_v),					\
		     : [vxrs] "Q" (*_v),				\
		       [v1] "I" (_v1), [v3] "I" (_v3)			\
		: "memory", "1");					\
		     : "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"	\
	asm volatile(							\
		"	la	1,%[vxrs]\n"				\
		"	VLM	%[v1],%[v3],0,1\n"			\
		:							\
		     : [vxrs] "Q" (*_v),				\
		: [vxrs] "R" (*_v),					\
		  [v1] "I" (_v1), [v3] "I" (_v3)			\
		     : "memory");					\
		: "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,33 +355,33 @@ 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(
		"	la	1,%[vxr]\n"
		"	VST	%[v1],0,,1\n"
		: [vxr] "=R" (*(__vector128 *)vxr)
	asm volatile("VST	%[v1],%O[vxr],,%R[vxr]\n"
		     : [vxr] "=Q" (*(__vector128 *)vxr)
		     : [v1] "I" (v1)
		: "memory", "1");
		     : "memory");
}

#else /* CONFIG_CC_IS_CLANG */
#else /* 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)
	asm volatile(
		"	la	1,%[vxr]\n"
		"	VST	%[v1],0,,1\n"
		: [vxr] "=R" (*(__vector128 *)vxr)
		: [v1] "I" (v1)
		     : "memory");
		: "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

static __always_inline void fpu_vstl(u8 v1, u32 index, const void *vxr)
{
@@ -389,15 +389,13 @@ static __always_inline void fpu_vstl(u8 v1, u32 index, const void *vxr)

	size = min(index + 1, sizeof(__vector128));
	instrument_write(vxr, size);
	asm volatile(
		"	la	1,%[vxr]\n"
		"	VSTL	%[v1],%[index],0,1\n"
		: [vxr] "=R" (*(u8 *)vxr)
	asm volatile("VSTL	%[v1],%[index],%O[vxr],%R[vxr]\n"
		     : [vxr] "=Q" (*(u8 *)vxr)
		     : [index] "d" (index), [v1] "I" (v1)
		: "memory", "1");
		     : "memory");
}

#else /* 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)
{
@@ -405,15 +403,17 @@ static __always_inline void fpu_vstl(u8 v1, u32 index, const void *vxr)

	size = min(index + 1, sizeof(__vector128));
	instrument_write(vxr, size);
	asm volatile("VSTL	%[v1],%[index],%O[vxr],%R[vxr]\n"
		     : [vxr] "=Q" (*(u8 *)vxr)
	asm volatile(
		"	la	1,%[vxr]\n"
		"	VSTL	%[v1],%[index],0,1\n"
		: [vxr] "=R" (*(u8 *)vxr)
		: [index] "d" (index), [v1] "I" (v1)
		     : "memory");
		: "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_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)					\
	asm volatile("VSTM	%[v1],%[v3],%O[vxrs],%R[vxrs]\n"	\
		     : [vxrs] "=Q" (*_v)				\
		     : [v1] "I" (_v1), [v3] "I" (_v3)			\
		: "memory", "1");					\
		     : "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)				\
	asm volatile(							\
		"	la	1,%[vxrs]\n"				\
		"	VSTM	%[v1],%[v3],0,1\n"			\
		: [vxrs] "=R" (*_v)					\
		: [v1] "I" (_v1), [v3] "I" (_v3)			\
		     : "memory");					\
		: "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)
{