This patch adds a warning to the built-in function handling if the user used the __builtin_cpu_supports and __builtin_cpu_is were used when the compiler was configured to use an old GLIBC that does not provice the hardware capability bits. Previously, the compiler would silently change the built-in function to return 0.
I also changed the current warning in target_clones handling to be an error instead of a warning, since it really makes no sense to use target_clones if we can't generate a resolver function. To allow people to figure out whether the built-in functions __builtin_cpu_is and __builtin_cpu_supports are supported, I added the following defines if you are using a new glibc: __BUILTIN_CPU_IS__ __BUILTIN_CPU_SUPPORTS__ I added documentation to state the requirement for using a new GLIBC. I went through the testsuite and added the appropriate target requires for the tests that require __builtin_cpu_supports (cpu support test and the bmi* tests). I changed the libgcc build so that the IEEE float128 ifunc support function (float128-ifunc.c) is only built if GCC is configured to use a new GLIBC. I verified that if you build with a compiler configured to use an old GCC that it does not generate the ifunc handlers, and it always uses floating point emulation. If you configure GCC to use a new GLIBC, it will generate the ifunc handler. I did verify that on a power8 system, it will call the software emulation, and on a power9 system, it will use the hardware IEEE float128 instructions. I built boostrap compilers with/without the patches on a little endian power8 system and there were no regressions. On the little endian power8 system, I did one run using the host Ubuntu libraries, which are based on GLIBC 2.19. There were no regressions between a compiler without the patches and with the patches. I verified that all of the tests that use __builtin_cpu_supports are now UNSUPPORTED. On the same little endian power8 system, I did a second set of runs using the Advance Toolchain AT-10.4 libraries, which are based on GLIBC 2.24. There were no regressions between a compiler without the patches and with the patches. I verified that all of the tests that use __builtin_cpu_supports were run and were successful. I also did a test with bootstrap on a big endian power7 system with both 32-bit and 64-bit libraries, there were no regressions. For this set of runs, I used the older host libraries, which do not export the hardware capability bits. I could not test using the Advance Toolchain on that system, since that particular system is too old to install the newer Advance Toolchain libraries that provide the hardware capability bits. Can I install these patches on the trunk? After a burn-in period, can I install equivalent patches to GCC 7 (which added the __builtin_cpu* built-in functions)? [gcc] 2017-07-12 Michael Meissner <meiss...@linux.vnet.ibm.com> PR target/81193 * config/rs6000/rs6000-c.c (rs6000_cpu_cpp_builtins): If GLIBC provides the hardware capability bits, define __BUILTIN_CPU_IS__ and __BUILTIN_CPU_SUPPORTS__. * config/rs6000/rs6000.c (cpu_expand_builtin): Generate a warning if GLIBC does not provide the hardware capability bits. Add a gcc_unreachable call if the built-in cpu function is neither __builtin_cpu_is nor __builtin_cpu_supports. (rs6000_get_function_versions_dispatcher): Change the warnging that an old GLIBC is used which does not export the capability bits to be an error. * doc/extend.texi (target_clones attribute): Document the restriction that GLIBC 2.23 or newer is needed on the PowerPC. (PowerPC built-in functions): Document that GLIBC 2.23 or newer is needed by __builtin_cpu_is and __builtin_cpu_supports. Document the macros defined by GCC if the newer GLIBC is available. [gcc/testsuite] 2017-07-12 Michael Meissner <meiss...@linux.vnet.ibm.com> PR target/81193 * gcc.target/powerpc/bmi-andn-1.c: Add guard against using __builtin_cpu_supports with old GLIBC's. * gcc.target/powerpc/bmi-andn-2.c: Likewise. * gcc.target/powerpc/bmi-bextr-1.c: Likewise. * gcc.target/powerpc/bmi-bextr-2.c: Likewise. * gcc.target/powerpc/bmi-bextr-4.c: Likewise. * gcc.target/powerpc/bmi-bextr-5.c: Likewise. * gcc.target/powerpc/bmi-blsi-1.c: Likewise. * gcc.target/powerpc/bmi-blsi-2.c: Likewise. * gcc.target/powerpc/bmi-blsmsk-1.c: Likewise. * gcc.target/powerpc/bmi-blsmsk-2.c: Likewise. * gcc.target/powerpc/bmi-blsr-1.c: Likewise. * gcc.target/powerpc/bmi-blsr-2.c: Likewise. * gcc.target/powerpc/bmi-tzcnt-1.c: Likewise. * gcc.target/powerpc/bmi-tzcnt-2.c: Likewise. * gcc.target/powerpc/bmi2-bzhi32-1.c: Likewise. * gcc.target/powerpc/bmi2-bzhi64-1.c: Likewise. * gcc.target/powerpc/bmi2-mulx32-1.c: Likewise. * gcc.target/powerpc/bmi2-mulx32-2.c: Likewise. * gcc.target/powerpc/bmi2-mulx64-1.c: Likewise. * gcc.target/powerpc/bmi2-mulx64-2.c: Likewise. * gcc.target/powerpc/bmi2-pdep32-1.c: Likewise. * gcc.target/powerpc/bmi2-pdep64-1.c: Likewise. * gcc.target/powerpc/bmi2-pext32-1.c: Likewise. * gcc.target/powerpc/bmi2-pext64-1.c: Likewise. * gcc.target/powerpc/cpu-builtin-1.c: Likewise. [libgcc] 2017-07-12 Michael Meissner <meiss...@linux.vnet.ibm.com> PR target/81193 * configure.ac (PowerPC float128 hardware support): Test whether we can use __builtin_cpu_supports before enabling the ifunc handler. * configure: Regenerate. -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meiss...@linux.vnet.ibm.com, phone: +1 (978) 899-4797
Index: gcc/config/rs6000/rs6000-c.c =================================================================== --- gcc/config/rs6000/rs6000-c.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/config/rs6000) (revision 250063) +++ gcc/config/rs6000/rs6000-c.c (.../gcc/config/rs6000) (working copy) @@ -644,6 +644,10 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfi builtin_define ("__FLOAT128_HARDWARE__"); if (TARGET_LONG_DOUBLE_128 && FLOAT128_IBM_P (TFmode)) builtin_define ("__ibm128=long double"); +#ifdef TARGET_LIBC_PROVIDES_HWCAP_IN_TCB + builtin_define ("__BUILTIN_CPU_SUPPORTS__"); + builtin_define ("__BUILTIN_CPU_IS__"); +#endif /* We needed to create a keyword if -mfloat128-type was used but not -mfloat, so we used __ieee128. If -mfloat128 was used, create a #define back to Index: gcc/config/rs6000/rs6000.c =================================================================== --- gcc/config/rs6000/rs6000.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/config/rs6000) (revision 250063) +++ gcc/config/rs6000/rs6000.c (.../gcc/config/rs6000) (working copy) @@ -15176,6 +15176,8 @@ cpu_expand_builtin (enum rs6000_builtins emit_insn (gen_eqsi3 (scratch2, scratch1, const0_rtx)); emit_insn (gen_rtx_SET (target, gen_rtx_XOR (SImode, scratch2, const1_rtx))); } + else + gcc_unreachable (); /* Record that we have expanded a CPU builtin, so that we can later emit a reference to the special symbol exported by LIBC to ensure we @@ -15183,6 +15185,9 @@ cpu_expand_builtin (enum rs6000_builtins cpu_builtin_p = true; #else + warning (0, "%s needs GLIBC (2.23 and newer) that exports hardware " + "capability bits", rs6000_builtin_info[(size_t) fcode].name); + /* For old LIBCs, always return FALSE. */ emit_move_insn (target, GEN_INT (0)); #endif /* TARGET_LIBC_PROVIDES_HWCAP_IN_TCB */ @@ -37284,10 +37289,10 @@ rs6000_get_function_versions_dispatcher default_node = default_version_info->this_node; #ifndef TARGET_LIBC_PROVIDES_HWCAP_IN_TCB - warning_at (DECL_SOURCE_LOCATION (default_node->decl), 0, - "target_clone needs GLIBC (2.23 and newer) to export hardware " - "capability bits"); -#endif + error_at (DECL_SOURCE_LOCATION (default_node->decl), + "target_clones attribute needs GLIBC (2.23 and newer) that " + "exports hardware capability bits"); +#else if (targetm.has_ifunc_p ()) { @@ -37320,6 +37325,7 @@ rs6000_get_function_versions_dispatcher "multiversioning needs ifunc which is not supported " "on this target"); } +#endif return dispatch_decl; } Index: gcc/doc/extend.texi =================================================================== --- gcc/doc/extend.texi (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/doc) (revision 250063) +++ gcc/doc/extend.texi (.../gcc/doc) (working copy) @@ -3282,7 +3282,9 @@ one compiled with @option{-msse4.1} and On a PowerPC, you can compile a function with @code{target_clones("cpu=power9,default")}. GCC will create two function clones, one compiled with @option{-mcpu=power9} and another -with the default options. +with the default options. On the PowerPC, the compiler must be +configured to use GLIBC 2.23 or newer in order to use the +@code{target_clones} attribute. It also creates a resolver function (see the @code{ifunc} attribute above) that dynamically selects a clone @@ -14918,8 +14920,16 @@ to maintain API compatibility with the x @deftypefn {Built-in Function} int __builtin_cpu_is (const char *@var{cpuname}) This function returns a value of @code{1} if the run-time CPU is of type -@var{cpuname} and returns @code{0} otherwise. The following CPU names can be -detected: +@var{cpuname} and returns @code{0} otherwise + +The @code{__builtin_cpu_is} function requires GLIBC 2.23 or newer in +order to export the hardware capability bits. The +@code{__builtin_cpu_is} function will return 0 if the compiler was +configured for an earlier GCC. GCC defines the macro +@code{__BUILTIN_CPU_IS__} if you can use the @code{__builtin_cpu_is} +built-in function. + +The following CPU names can be detected: @table @samp @item power9 @@ -14969,7 +14979,16 @@ else @deftypefn {Built-in Function} int __builtin_cpu_supports (const char *@var{feature}) This function returns a value of @code{1} if the run-time CPU supports the HWCAP -feature @var{feature} and returns @code{0} otherwise. The following features can be +feature @var{feature} and returns @code{0} otherwise. + +The @code{__builtin_cpu_supports} function requires GLIBC 2.23 or newer in +order to export the hardware capability bits. The +@code{__builtin_cpu_supports} function will return 0 if the compiler was +configured for an earlier GCC. GCC defines the macro +@code{__BUILTIN_CPU_SUPPORTS__} if you can use the @code{__builtin_cpu_supports} +built-in function. + +The following features can be detected: @table @samp Index: gcc/testsuite/gcc.target/powerpc/bmi-blsi-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi-blsi-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi-blsi-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3 -fno-inline" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi-bextr-2.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi-bextr-2.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi-bextr-2.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3 -fno-inline" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi2-bzhi64-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi2-bzhi64-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi2-bzhi64-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi-blsi-2.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi-blsi-2.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi-blsi-2.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3 -fno-inline" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi-blsr-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi-blsr-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi-blsr-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3 -fno-inline" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi2-pdep64-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi2-pdep64-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi2-pdep64-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -3,6 +3,7 @@ /* { dg-require-effective-target lp64 } */ /* { dg-require-effective-target vsx_hw } */ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power7" } } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi-bextr-4.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi-bextr-4.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi-bextr-4.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3 -fno-inline" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi-blsr-2.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi-blsr-2.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi-blsr-2.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3 -fno-inline" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi-bextr-5.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi-bextr-5.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi-bextr-5.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3 -fno-inline" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi-blsmsk-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi-blsmsk-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi-blsmsk-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3 -fno-inline" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi-blsmsk-2.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi-blsmsk-2.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi-blsmsk-2.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3 -fno-inline" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi2-pext64-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi2-pext64-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi2-pext64-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -3,6 +3,7 @@ /* { dg-require-effective-target lp64 } */ /* { dg-require-effective-target vsx_hw } */ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power7" } } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi2-bzhi32-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi2-bzhi32-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi2-bzhi32-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi2-pdep32-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi2-pdep32-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi2-pdep32-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -3,6 +3,7 @@ /* { dg-require-effective-target lp64 } */ /* { dg-require-effective-target vsx_hw } */ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power7" } } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi-andn-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi-andn-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi-andn-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi-tzcnt-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi-tzcnt-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi-tzcnt-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3 -fno-inline" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi-andn-2.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi-andn-2.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi-andn-2.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/cpu-builtin-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/cpu-builtin-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/cpu-builtin-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,5 +1,6 @@ /* { dg-do compile { target { powerpc*-*-* } } } */ /* { dg-skip-if "" { powerpc*-*-darwin* } } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ void use_cpu_is_builtins (unsigned int *p) Index: gcc/testsuite/gcc.target/powerpc/bmi-tzcnt-2.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi-tzcnt-2.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi-tzcnt-2.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3 -fno-inline" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi2-pext32-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi2-pext32-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi2-pext32-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -3,6 +3,7 @@ /* { dg-require-effective-target lp64 } */ /* { dg-require-effective-target vsx_hw } */ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power7" } } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi2-mulx64-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi2-mulx64-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi2-mulx64-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include "bmi2-check.h" Index: gcc/testsuite/gcc.target/powerpc/bmi2-mulx64-2.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi2-mulx64-2.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi2-mulx64-2.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi2-mulx32-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi2-mulx32-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi2-mulx32-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include "bmi2-check.h" Index: gcc/testsuite/gcc.target/powerpc/bmi2-mulx32-2.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi2-mulx32-2.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi2-mulx32-2.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O3" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi-bextr-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi-bextr-1.c (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/gcc/testsuite/gcc.target/powerpc) (revision 250063) +++ gcc/testsuite/gcc.target/powerpc/bmi-bextr-1.c (.../gcc/testsuite/gcc.target/powerpc) (working copy) @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O2 -fno-inline" } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target ppc_cpu_supports_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: libgcc/configure.ac =================================================================== --- libgcc/configure.ac (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/libgcc) (revision 250063) +++ libgcc/configure.ac (.../libgcc) (working copy) @@ -376,10 +376,10 @@ esac esac case ${host} in -# At present, we cannot turn -mfloat128 on via #pragma GCC target, -# so just check if we have VSX (ISA 2.06) support to build the -# software libraries, and whether the assembler can handle xsaddqp -# for hardware support. +# At present, we cannot turn -mfloat128 on via #pragma GCC target, so just +# check if we have VSX (ISA 2.06) support to build the software libraries, and +# whether the assembler can handle xsaddqp for hardware support. Also check if +# a new glibc is being used so that __builtin_cpu_supports can be used. powerpc*-*-linux*) saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -mabi=altivec -mvsx -mfloat128" @@ -398,6 +398,9 @@ powerpc*-*-linux*) #ifndef AT_PLATFORM #error "AT_PLATFORM is not defined" #endif + #ifndef __BUILTIN_CPU_SUPPORTS__ + #error "__builtin_cpu_supports is not available" + #endif vector unsigned char add (vector unsigned char a, vector unsigned char b) { vector unsigned char ret; Index: libgcc/ChangeLog.meissner =================================================================== --- libgcc/ChangeLog.meissner (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/libgcc) (revision 0) +++ libgcc/ChangeLog.meissner (.../libgcc) (revision 250138) @@ -0,0 +1,12 @@ +2017-07-11 Michael Meissner <meiss...@linux.vnet.ibm.com> + + PR target/81193 + * configure.ac (PowerPC float128 hardware support): Test whether + we can use __builtin_cpu_supports before enabling the ifunc + handler. + * configure: Regenerate. + +2017-07-07 Michael Meissner <meiss...@linux.vnet.ibm.com> + + Clone branch subversion id 250063 + Index: libgcc/configure =================================================================== --- libgcc/configure (.../svn+ssh://meiss...@gcc.gnu.org/svn/gcc/trunk/libgcc) (revision 250063) +++ libgcc/configure (.../libgcc) (working copy) @@ -4975,10 +4975,10 @@ esac esac case ${host} in -# At present, we cannot turn -mfloat128 on via #pragma GCC target, -# so just check if we have VSX (ISA 2.06) support to build the -# software libraries, and whether the assembler can handle xsaddqp -# for hardware support. +# At present, we cannot turn -mfloat128 on via #pragma GCC target, so just +# check if we have VSX (ISA 2.06) support to build the software libraries, and +# whether the assembler can handle xsaddqp for hardware support. Also check if +# a new glibc is being used so that __builtin_cpu_supports can be used. powerpc*-*-linux*) saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -mabi=altivec -mvsx -mfloat128" @@ -5013,6 +5013,9 @@ else #ifndef AT_PLATFORM #error "AT_PLATFORM is not defined" #endif + #ifndef __BUILTIN_CPU_SUPPORTS__ + #error "__builtin_cpu_supports is not available" + #endif vector unsigned char add (vector unsigned char a, vector unsigned char b) { vector unsigned char ret;