A "#define HAVE_AS_POWER9" or "#undef HAVE_AS_POWER9" preprocessor directive is emitted into the $GCC_BUILD/gcc/auto-host.h file at configuration time, depending on whether the available assembler supports the Power9 instruction set. This patch arranges to disable Power9-specific compiler features if HAVE_AS_POWER9 is not defined.
The patch includes code to modify the behavior of the compiler along with directives to adjust the treatment of certain dejagnu tests. Disable the Power9-specific tests on aix because of known incompatibilities. This patch has bootstrapped and regression tested on powerpc64le-unknown-linux-gnu with both a configuration that has a Power9 assembler and one that does not have a Power9 assembler. In both cases, there were no regressions. Is this ok for the trunk? Is this patch ok for gcc-6 after a few days of burn-in on the trunk? Thanks. gcc/ChangeLog: 2016-06-20 Kelvin Nilsen <kel...@gcc.gnu.org> * config/rs6000/rs6000.h: Add conditional preprocessing directives to disable Power9-specific compiler features if HAVE_AS_POWER9 is not defined. gcc/testsuite/ChangeLog: 2016-06-20 Kelvin Nilsen <kel...@gcc.gnu.org> * gcc.target/powerpc/darn-0.c: Add dejagnu directives to disable test if effective-target is not powerpc_p9vector_ok, or if a -mcpu override other than -mcpu=power9 command-line option is specified, or if the target operating system is aix. * gcc.target/powerpc/darn-1.c: Likewise. * gcc.target/powerpc/darn-2.c: Likewise. * gcc.target/powerpc/vslv-0.c: Add dejagnu directives to disable test if effective-target is not powerpc_p9vector_ok or if the target operating system is not defined. * gcc.target/powerpc/vslv-1.c: Likewise. * gcc.target/powerpc/vsrv-0.c: Likewise. * gcc.target/powerpc/vsrv-1.c: Likewise. Index: gcc/config/rs6000/rs6000.h =================================================================== --- gcc/config/rs6000/rs6000.h (revision 237530) +++ gcc/config/rs6000/rs6000.h (working copy) @@ -302,6 +302,26 @@ extern const char *host_detect_local_cpu (int argc #define TARGET_P8_VECTOR 0 #endif +/* Define the ISA 3.0 flags as 0 if the target assembler does not support + Power9 instructions. Allow -mpower9-fusion, since it does not add new + instructions. Allow -misel, since it predates ISA 3.0 and does + not require any Power9 features. */ + +#ifndef HAVE_AS_POWER9 +#undef TARGET_FLOAT128_HW +#undef TARGET_MODULO +#undef TARGET_P9_VECTOR +#undef TARGET_P9_MINMAX +#undef TARGET_P9_DFORM_SCALAR +#undef TARGET_P9_DFORM_VECTOR +#define TARGET_FLOAT128_HW 0 +#define TARGET_MODULO 0 +#define TARGET_P9_VECTOR 0 +#define TARGET_P9_MINMAX 0 +#define TARGET_P9_DFORM_SCALAR 0 +#define TARGET_P9_DFORM_VECTOR 0 +#endif + /* Define TARGET_LWSYNC_INSTRUCTION if the assembler knows about lwsync. If not, generate the lwsync code as an integer constant. */ #ifdef HAVE_AS_LWSYNC Index: gcc/testsuite/gcc.target/powerpc/darn-0.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/darn-0.c (revision 237530) +++ gcc/testsuite/gcc.target/powerpc/darn-0.c (working copy) @@ -1,4 +1,7 @@ /* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */ +/* { dg-require-effective-target powerpc_p9vector_ok } */ +/* { dg-skip-if "" { powerpc*-*-aix* } } */ /* { dg-options "-mcpu=power9" } */ /* This test should succeed on both 32- and 64-bit configurations. */ Index: gcc/testsuite/gcc.target/powerpc/darn-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/darn-1.c (revision 237530) +++ gcc/testsuite/gcc.target/powerpc/darn-1.c (working copy) @@ -1,6 +1,9 @@ /* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */ +/* { dg-require-effective-target powerpc_p9vector_ok } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-skip-if "" { powerpc*-*-aix* } } */ /* { dg-options "-mcpu=power9" } */ -/* { dg-require-effective-target lp64 } */ #include <altivec.h> Index: gcc/testsuite/gcc.target/powerpc/darn-2.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/darn-2.c (revision 237530) +++ gcc/testsuite/gcc.target/powerpc/darn-2.c (working copy) @@ -1,6 +1,9 @@ /* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */ +/* { dg-require-effective-target powerpc_p9vector_ok } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-skip-if "" { powerpc*-*-aix* } } */ /* { dg-options "-mcpu=power9" } */ -/* { dg-require-effective-target lp64 } */ #include <altivec.h> Index: gcc/testsuite/gcc.target/powerpc/vslv-0.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/vslv-0.c (revision 237530) +++ gcc/testsuite/gcc.target/powerpc/vslv-0.c (working copy) @@ -1,5 +1,7 @@ /* { dg-do compile { target { powerpc*-*-* } } } */ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */ +/* { dg-require-effective-target powerpc_p9vector_ok } */ +/* { dg-skip-if "" { powerpc*-*-aix* } } */ /* { dg-options "-mcpu=power9" } */ #include <altivec.h> Index: gcc/testsuite/gcc.target/powerpc/vslv-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/vslv-1.c (revision 237530) +++ gcc/testsuite/gcc.target/powerpc/vslv-1.c (working copy) @@ -1,5 +1,7 @@ /* { dg-do compile { target { powerpc*-*-* } } } */ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */ +/* { dg-require-effective-target powerpc_p9vector_ok } */ +/* { dg-skip-if "" { powerpc*-*-aix* } } */ /* { dg-options "-mcpu=power9" } */ #include <altivec.h> Index: gcc/testsuite/gcc.target/powerpc/vsrv-0.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/vsrv-0.c (revision 237530) +++ gcc/testsuite/gcc.target/powerpc/vsrv-0.c (working copy) @@ -1,5 +1,7 @@ /* { dg-do compile { target { powerpc*-*-* } } } */ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */ +/* { dg-require-effective-target powerpc_p9vector_ok } */ +/* { dg-skip-if "" { powerpc*-*-aix* } } */ /* { dg-options "-mcpu=power9" } */ #include <altivec.h> Index: gcc/testsuite/gcc.target/powerpc/vsrv-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/vsrv-1.c (revision 237530) +++ gcc/testsuite/gcc.target/powerpc/vsrv-1.c (working copy) @@ -1,5 +1,7 @@ /* { dg-do compile { target { powerpc*-*-* } } } */ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */ +/* { dg-require-effective-target powerpc_p9vector_ok } */ +/* { dg-skip-if "" { powerpc*-*-aix* } } */ /* { dg-options "-mcpu=power9" } */ #include <altivec.h>