Bill Seurer pointed out that building the BMI tests on a power8 but with gcc built --with-cpu=power6 fails with link errors. The intrinsics _pdep_u64/32 and _pext_u64/32 are guarded with #ifdef _ARCH_PWR7 as the implementation uses bpermd and popcntd instructions introduced with power7 (PowerISA-2.06).
But if the GCC is built --with-cpu=power6, the compiler is capable of supporting -mcpu=power7 but will not generate bpermd/popcntd by default. Then if some code them uses say _pext_u64 with -mcpu=power6 the intrinsic is not not supported (needs power7) and so is not defined. The { dg-require-effective-target powerpc_vsx_ok } is not sufficient for the { dg-do run } and need to be changed to vsx_hw. Also we need add -mcpu=power7 to dg-options to insure the compiler will generated the bpermd/popcntd instructions. This is sufficient for all the bmi/bmi2 tests to skip/pass for power6 and later. [gcc/testsuite] 2017-05-26 Steven Munroe <munro...@gcc.gnu.org> * gcc.target/powerpc/bmi2-pdep32-1.c []: Add -mcpu=power7 to dg-options. Change dg-require-effective-target powerpc_vsx_ok to vsx_hw. * 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/bmi2-pext64-1a.c: Add -mcpu=power7 to dg-options. Index: gcc/testsuite/gcc.target/powerpc/bmi2-pdep32-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi2-pdep32-1.c (revision 248468) +++ gcc/testsuite/gcc.target/powerpc/bmi2-pdep32-1.c (working copy) @@ -1,7 +1,7 @@ /* { dg-do run } */ -/* { dg-options "-O3" } */ +/* { dg-options "-O3 -mcpu=power7" } */ /* { dg-require-effective-target lp64 } */ -/* { dg-require-effective-target powerpc_vsx_ok } */ +/* { dg-require-effective-target vsx_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 (revision 248468) +++ gcc/testsuite/gcc.target/powerpc/bmi2-pdep64-1.c (working copy) @@ -1,7 +1,7 @@ /* { dg-do run } */ -/* { dg-options "-O3" } */ +/* { dg-options "-O3 -mcpu=power7" } */ /* { dg-require-effective-target lp64 } */ -/* { dg-require-effective-target powerpc_vsx_ok } */ +/* { dg-require-effective-target vsx_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 (revision 248468) +++ gcc/testsuite/gcc.target/powerpc/bmi2-pext32-1.c (working copy) @@ -1,7 +1,7 @@ /* { dg-do run } */ -/* { dg-options "-O3" } */ +/* { dg-options "-O3 -mcpu=power7" } */ /* { dg-require-effective-target lp64 } */ -/* { dg-require-effective-target powerpc_vsx_ok } */ +/* { dg-require-effective-target vsx_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 (revision 248468) +++ gcc/testsuite/gcc.target/powerpc/bmi2-pext64-1.c (working copy) @@ -1,7 +1,7 @@ /* { dg-do run } */ -/* { dg-options "-O3" } */ +/* { dg-options "-O3 -mcpu=power7" } */ /* { dg-require-effective-target lp64 } */ -/* { dg-require-effective-target powerpc_vsx_ok } */ +/* { dg-require-effective-target vsx_hw } */ #define NO_WARN_X86_INTRINSICS 1 #include <x86intrin.h> Index: gcc/testsuite/gcc.target/powerpc/bmi2-pext64-1a.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/bmi2-pext64-1a.c (revision 248468) +++ gcc/testsuite/gcc.target/powerpc/bmi2-pext64-1a.c (working copy) @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3" } */ +/* { dg-options "-O3 -mcpu=power7" } */ /* { dg-require-effective-target lp64 } */ /* { dg-require-effective-target powerpc_vsx_ok } */