Message ID | 20210331141701.1339437-1-stli@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | [v2] S390: Allow "v" constraint for long double math_opt_barrier and math_force_eval with GCC 11. | expand |
* Stefan Liebler via Libc-alpha: > Starting with GCC 11, long double values can also be processed in vector > registers if build with -march >= z14. Then GCC defines the > __LONG_DOUBLE_VX__ macro. > > FYI: GCC commit "IBM Z: Introduce __LONG_DOUBLE_VX__ macro" > https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=f47df2af313d2ce7f9149149010a142c2237beda > --- > sysdeps/s390/fpu/math-barriers.h | 21 +++++++++++++++++++-- > 1 file changed, 19 insertions(+), 2 deletions(-) > > diff --git a/sysdeps/s390/fpu/math-barriers.h b/sysdeps/s390/fpu/math-barriers.h > index 68a3e55098..13fd30017f 100644 > --- a/sysdeps/s390/fpu/math-barriers.h > +++ b/sysdeps/s390/fpu/math-barriers.h > @@ -21,13 +21,26 @@ > > #ifdef HAVE_S390_VX_GCC_SUPPORT > # define ASM_CONSTRAINT_VR "v" > +# ifdef __LONG_DOUBLE_VX__ > +/* Starting with gcc 11, long double values can also be processed in vector > + registers if build with -march >= z14. Then GCC defines the > + __LONG_DOUBLE_VX__ macro. */ > +# define ASM_LONG_DOUBLE_IN_VR 1 > +# else > +# define ASM_LONG_DOUBLE_IN_VR 0 > +# endif > #else > # define ASM_CONSTRAINT_VR > +# define ASM_LONG_DOUBLE_IN_VR 0 > #endif > > #define math_opt_barrier(x) \ > ({ __typeof (x) __x = (x); \ > - if (__builtin_types_compatible_p (__typeof (x), _Float128)) \ > + if (! ASM_LONG_DOUBLE_IN_VR \ > + && (__builtin_types_compatible_p (__typeof (x), _Float128) \ > + || __builtin_types_compatible_p (__typeof (x), long double) \ > + ) \ > + ) \ > __asm__ ("# math_opt_barrier_f128 %0" : "+fm" (__x)); \ > else \ > __asm__ ("# math_opt_barrier %0" \ > @@ -35,7 +48,11 @@ > __x; }) > #define math_force_eval(x) \ > ({ __typeof (x) __x = (x); \ > - if (__builtin_types_compatible_p (__typeof (x), _Float128)) \ > + if (! ASM_LONG_DOUBLE_IN_VR \ > + && (__builtin_types_compatible_p (__typeof (x), _Float128) \ > + || __builtin_types_compatible_p (__typeof (x), long double) \ > + ) \ > + ) \ > __asm__ __volatile__ ("# math_force_eval_f128 %0" \ > : : "fm" (__x)); \ > else \ This version looks good to me, thanks.
On 31/03/2021 16:23, Florian Weimer wrote: > * Stefan Liebler via Libc-alpha: > >> Starting with GCC 11, long double values can also be processed in vector >> registers if build with -march >= z14. Then GCC defines the >> __LONG_DOUBLE_VX__ macro. >> >> FYI: GCC commit "IBM Z: Introduce __LONG_DOUBLE_VX__ macro" >> https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=f47df2af313d2ce7f9149149010a142c2237beda >> --- >> sysdeps/s390/fpu/math-barriers.h | 21 +++++++++++++++++++-- >> 1 file changed, 19 insertions(+), 2 deletions(-) >> >> diff --git a/sysdeps/s390/fpu/math-barriers.h b/sysdeps/s390/fpu/math-barriers.h >> index 68a3e55098..13fd30017f 100644 >> --- a/sysdeps/s390/fpu/math-barriers.h >> +++ b/sysdeps/s390/fpu/math-barriers.h >> @@ -21,13 +21,26 @@ >> >> #ifdef HAVE_S390_VX_GCC_SUPPORT >> # define ASM_CONSTRAINT_VR "v" >> +# ifdef __LONG_DOUBLE_VX__ >> +/* Starting with gcc 11, long double values can also be processed in vector >> + registers if build with -march >= z14. Then GCC defines the >> + __LONG_DOUBLE_VX__ macro. */ >> +# define ASM_LONG_DOUBLE_IN_VR 1 >> +# else >> +# define ASM_LONG_DOUBLE_IN_VR 0 >> +# endif >> #else >> # define ASM_CONSTRAINT_VR >> +# define ASM_LONG_DOUBLE_IN_VR 0 >> #endif >> >> #define math_opt_barrier(x) \ >> ({ __typeof (x) __x = (x); \ >> - if (__builtin_types_compatible_p (__typeof (x), _Float128)) \ >> + if (! ASM_LONG_DOUBLE_IN_VR \ >> + && (__builtin_types_compatible_p (__typeof (x), _Float128) \ >> + || __builtin_types_compatible_p (__typeof (x), long double) \ >> + ) \ >> + ) \ >> __asm__ ("# math_opt_barrier_f128 %0" : "+fm" (__x)); \ >> else \ >> __asm__ ("# math_opt_barrier %0" \ >> @@ -35,7 +48,11 @@ >> __x; }) >> #define math_force_eval(x) \ >> ({ __typeof (x) __x = (x); \ >> - if (__builtin_types_compatible_p (__typeof (x), _Float128)) \ >> + if (! ASM_LONG_DOUBLE_IN_VR \ >> + && (__builtin_types_compatible_p (__typeof (x), _Float128) \ >> + || __builtin_types_compatible_p (__typeof (x), long double) \ >> + ) \ >> + ) \ >> __asm__ __volatile__ ("# math_force_eval_f128 %0" \ >> : : "fm" (__x)); \ >> else \ > > This version looks good to me, thanks. > Committed. Thanks.
diff --git a/sysdeps/s390/fpu/math-barriers.h b/sysdeps/s390/fpu/math-barriers.h index 68a3e55098..13fd30017f 100644 --- a/sysdeps/s390/fpu/math-barriers.h +++ b/sysdeps/s390/fpu/math-barriers.h @@ -21,13 +21,26 @@ #ifdef HAVE_S390_VX_GCC_SUPPORT # define ASM_CONSTRAINT_VR "v" +# ifdef __LONG_DOUBLE_VX__ +/* Starting with gcc 11, long double values can also be processed in vector + registers if build with -march >= z14. Then GCC defines the + __LONG_DOUBLE_VX__ macro. */ +# define ASM_LONG_DOUBLE_IN_VR 1 +# else +# define ASM_LONG_DOUBLE_IN_VR 0 +# endif #else # define ASM_CONSTRAINT_VR +# define ASM_LONG_DOUBLE_IN_VR 0 #endif #define math_opt_barrier(x) \ ({ __typeof (x) __x = (x); \ - if (__builtin_types_compatible_p (__typeof (x), _Float128)) \ + if (! ASM_LONG_DOUBLE_IN_VR \ + && (__builtin_types_compatible_p (__typeof (x), _Float128) \ + || __builtin_types_compatible_p (__typeof (x), long double) \ + ) \ + ) \ __asm__ ("# math_opt_barrier_f128 %0" : "+fm" (__x)); \ else \ __asm__ ("# math_opt_barrier %0" \ @@ -35,7 +48,11 @@ __x; }) #define math_force_eval(x) \ ({ __typeof (x) __x = (x); \ - if (__builtin_types_compatible_p (__typeof (x), _Float128)) \ + if (! ASM_LONG_DOUBLE_IN_VR \ + && (__builtin_types_compatible_p (__typeof (x), _Float128) \ + || __builtin_types_compatible_p (__typeof (x), long double) \ + ) \ + ) \ __asm__ __volatile__ ("# math_force_eval_f128 %0" \ : : "fm" (__x)); \ else \