diff options
author | Peter Bergner <bergner@linux.ibm.com> | 2022-03-04 09:03:44 -0600 |
---|---|---|
committer | Peter Bergner <bergner@linux.ibm.com> | 2022-03-04 09:04:21 -0600 |
commit | cb16bc3b5f34733ef9bbf8d2e3acacdecb099a62 (patch) | |
tree | b1614c76bd39cb049682a22f202139ad285e0f6a | |
parent | e28eb86c18ed765dceb3c56471a848e9f0e120ff (diff) | |
download | gcc-cb16bc3b5f34733ef9bbf8d2e3acacdecb099a62.zip gcc-cb16bc3b5f34733ef9bbf8d2e3acacdecb099a62.tar.gz gcc-cb16bc3b5f34733ef9bbf8d2e3acacdecb099a62.tar.bz2 |
rs6000: Allow -mlong-double-64 after -mabi={ibm,ieee}longdouble [PR104208, PR87496]
The glibc build is showing a build error due to extra "error" checking from my
PR87496 fix. That checking was overeager, disallowing setting the long double
size to 64-bits if the 128-bit long double ABI had already been specified.
Now we only emit an error if we specify a 128-bit long double ABI if our
long double size is not 128 bits. This also fixes an erroneous error when
-mabi=ieeelongdouble is used and ISA 2.06 is not enabled, but the long double
size has been changed to 64 bits.
2022-03-04 Peter Bergner <bergner@linux.ibm.com>
gcc/
PR target/87496
PR target/104208
* config/rs6000/rs6000.cc (rs6000_option_override_internal): Make the
ISA 2.06 requirement for -mabi=ieeelongdouble conditional on
-mlong-double-128.
Move the -mabi=ieeelongdouble and -mabi=ibmlongdouble error checking
from here...
* common/config/rs6000/rs6000-common.cc (rs6000_handle_option):
... to here.
gcc/testsuite/
PR target/87496
PR target/104208
* gcc.target/powerpc/pr104208-1.c: New test.
* gcc.target/powerpc/pr104208-2.c: Likewise.
* gcc.target/powerpc/pr87496-2.c: Swap long double options to trigger
the expected error.
* gcc.target/powerpc/pr87496-3.c: Likewise.
-rw-r--r-- | gcc/common/config/rs6000/rs6000-common.cc | 10 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.cc | 11 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr104208-1.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr104208-2.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr87496-2.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr87496-3.c | 2 |
6 files changed, 33 insertions, 11 deletions
diff --git a/gcc/common/config/rs6000/rs6000-common.cc b/gcc/common/config/rs6000/rs6000-common.cc index 97dff3a..8e393d0 100644 --- a/gcc/common/config/rs6000/rs6000-common.cc +++ b/gcc/common/config/rs6000/rs6000-common.cc @@ -227,6 +227,16 @@ rs6000_handle_option (struct gcc_options *opts, struct gcc_options *opts_set, } break; + case OPT_mabi_ibmlongdouble: + case OPT_mabi_ieeelongdouble: + if (opts->x_rs6000_long_double_type_size == 64) + { + error_at (loc, "option %<%s%> requires %<-mlong-double-128%>", + decoded->orig_option_with_args_text); + return true; + } + break; + case OPT_mrecip: opts->x_rs6000_recip_name = (value) ? "default" : "none"; break; diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index a855e8c..5b100a8 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -4178,13 +4178,6 @@ rs6000_option_override_internal (bool global_init_p) ; /* The option value can be seen when cl_target_option_restore is called. */ else if (rs6000_long_double_type_size == 128) rs6000_long_double_type_size = FLOAT_PRECISION_TFmode; - else if (OPTION_SET_P (rs6000_ieeequad)) - { - if (global_options.x_rs6000_ieeequad) - error ("%qs requires %qs", "-mabi=ieeelongdouble", "-mlong-double-128"); - else - error ("%qs requires %qs", "-mabi=ibmlongdouble", "-mlong-double-128"); - } /* Set -mabi=ieeelongdouble on some old targets. In the future, power server systems will also set long double to be IEEE 128-bit. AIX and Darwin @@ -4194,13 +4187,13 @@ rs6000_option_override_internal (bool global_init_p) if (!OPTION_SET_P (rs6000_ieeequad)) rs6000_ieeequad = TARGET_IEEEQUAD_DEFAULT; - else + else if (TARGET_LONG_DOUBLE_128) { if (global_options.x_rs6000_ieeequad && (!TARGET_POPCNTD || !TARGET_VSX)) error ("%qs requires full ISA 2.06 support", "-mabi=ieeelongdouble"); - if (rs6000_ieeequad != TARGET_IEEEQUAD_DEFAULT && TARGET_LONG_DOUBLE_128) + if (rs6000_ieeequad != TARGET_IEEEQUAD_DEFAULT) { /* Determine if the user can change the default long double type at compilation time. You need GLIBC 2.32 or newer to be able to diff --git a/gcc/testsuite/gcc.target/powerpc/pr104208-1.c b/gcc/testsuite/gcc.target/powerpc/pr104208-1.c new file mode 100644 index 0000000..39d4602 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr104208-1.c @@ -0,0 +1,9 @@ +/* PR target/104208 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mlong-double-128 -mabi=ibmlongdouble -mlong-double-64 -Wno-psabi" } */ + +/* Verify we do not emit an error with the options above. It is allowed + to reset the long double size to 64-bits after a 128-bit long double + ABI has been selected. */ + +int i; diff --git a/gcc/testsuite/gcc.target/powerpc/pr104208-2.c b/gcc/testsuite/gcc.target/powerpc/pr104208-2.c new file mode 100644 index 0000000..4e8ab5b --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr104208-2.c @@ -0,0 +1,10 @@ +/* PR target/104208 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mlong-double-128 -mabi=ieeelongdouble -mlong-double-64 -mno-vsx -Wno-psabi" } */ + +/* Verify we do not emit an error with the options above. IEEE 128-bit + long double requires VSX, so using -mno-vsx would normally generate + an error. However, if we have changed to a 64-bit long double, then + we should allow it. */ + +int i; diff --git a/gcc/testsuite/gcc.target/powerpc/pr87496-2.c b/gcc/testsuite/gcc.target/powerpc/pr87496-2.c index 26c07eb..f9dc642 100644 --- a/gcc/testsuite/gcc.target/powerpc/pr87496-2.c +++ b/gcc/testsuite/gcc.target/powerpc/pr87496-2.c @@ -1,7 +1,7 @@ /* PR target/87496 */ /* { dg-do compile { target { powerpc*-*-* } } } */ /* { dg-skip-if "" { powerpc*-*-darwin* } } */ -/* { dg-options "-O2 -mdejagnu-cpu=power7 -mabi=ieeelongdouble -mlong-double-64 -Wno-psabi" } */ +/* { dg-options "-O2 -mdejagnu-cpu=power7 -mlong-double-64 -mabi=ieeelongdouble -Wno-psabi" } */ int i; diff --git a/gcc/testsuite/gcc.target/powerpc/pr87496-3.c b/gcc/testsuite/gcc.target/powerpc/pr87496-3.c index 1be3997..39fb73c 100644 --- a/gcc/testsuite/gcc.target/powerpc/pr87496-3.c +++ b/gcc/testsuite/gcc.target/powerpc/pr87496-3.c @@ -1,7 +1,7 @@ /* PR target/87496 */ /* { dg-do compile { target { powerpc*-*-* } } } */ /* { dg-skip-if "" { powerpc*-*-darwin* } } */ -/* { dg-options "-O2 -mabi=ibmlongdouble -mlong-double-64 -Wno-psabi" } */ +/* { dg-options "-O2 -mlong-double-64 -mabi=ibmlongdouble -Wno-psabi" } */ int i; |