PowerPC: Update __float128 and __ibm128 error messages. This patch attempts to make the error messages for intermixing IEEE 128-bit floating point with IBM 128-bit extended double types to be clearer if the long double type uses the IEEE 128-bit format.
gcc/ 2020-09-23 Michael Meissner <meiss...@linux.ibm.com> * config/rs6000/rs6000.c (rs6000_invalid_binary_op): Update error messages about mixing IBM long double and IEEE 128-bit. gcc/testsuite/ 2020-09-23 Michael Meissner <meiss...@linux.ibm.com> * gcc.target/powerpc/bfp/scalar-extract-exp-4.c: Update failure messages. * gcc.target/powerpc/bfp/scalar-extract-sig-4.c: Update failure messages. * gcc.target/powerpc/bfp/scalar-test-data-class-11.c: Update failure messages. * gcc.target/powerpc/bfp/scalar-test-neg-5.c: Update failure messages. * gcc.target/powerpc/float128-mix-2.c: New test. * gcc.target/powerpc/float128-mix-3.c: New test. * gcc.target/powerpc/float128-mix.c: Update failure messages. --- gcc/config/rs6000/rs6000.c | 20 ++++--------------- .../powerpc/bfp/scalar-extract-exp-4.c | 4 +--- .../powerpc/bfp/scalar-extract-sig-4.c | 2 +- .../powerpc/bfp/scalar-test-data-class-11.c | 2 +- .../powerpc/bfp/scalar-test-neg-5.c | 2 +- .../gcc.target/powerpc/float128-mix-2.c | 17 ++++++++++++++++ .../gcc.target/powerpc/float128-mix-3.c | 17 ++++++++++++++++ .../gcc.target/powerpc/float128-mix.c | 19 ++++++++++-------- 8 files changed, 53 insertions(+), 30 deletions(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/float128-mix-2.c create mode 100644 gcc/testsuite/gcc.target/powerpc/float128-mix-3.c diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 0ff0f31d552..97f535f0018 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -14352,22 +14352,10 @@ rs6000_invalid_binary_op (int op ATTRIBUTE_UNUSED, if (!TARGET_FLOAT128_CVT) { - if ((mode1 == KFmode && mode2 == IFmode) - || (mode1 == IFmode && mode2 == KFmode)) - return N_("__float128 and __ibm128 cannot be used in the same " - "expression"); - - if (TARGET_IEEEQUAD - && ((mode1 == IFmode && mode2 == TFmode) - || (mode1 == TFmode && mode2 == IFmode))) - return N_("__ibm128 and long double cannot be used in the same " - "expression"); - - if (!TARGET_IEEEQUAD - && ((mode1 == KFmode && mode2 == TFmode) - || (mode1 == TFmode && mode2 == KFmode))) - return N_("__float128 and long double cannot be used in the same " - "expression"); + if ((FLOAT128_IEEE_P (mode1) && FLOAT128_IBM_P (mode2)) + || (FLOAT128_IBM_P (mode1) && FLOAT128_IEEE_P (mode2))) + return N_("Invalid mixing of IEEE 128-bit and IBM 128-bit floating " + "point types"); } return NULL; diff --git a/gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-exp-4.c b/gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-exp-4.c index 850ff620490..2065a287bb3 100644 --- a/gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-exp-4.c +++ b/gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-exp-4.c @@ -11,7 +11,5 @@ get_exponent (__ieee128 *p) { __ieee128 source = *p; - return __builtin_vec_scalar_extract_exp (source); /* { dg-error "'__builtin_vsx_scalar_extract_expq' requires" } */ + return __builtin_vec_scalar_extract_exp (source); /* { dg-error "'__builtin_vsx_scalar_extract_exp.*' requires" } */ } - - diff --git a/gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-sig-4.c b/gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-sig-4.c index 32a53c6fffd..37bc8332961 100644 --- a/gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-sig-4.c +++ b/gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-sig-4.c @@ -11,5 +11,5 @@ get_significand (__ieee128 *p) { __ieee128 source = *p; - return __builtin_vec_scalar_extract_sig (source); /* { dg-error "'__builtin_vsx_scalar_extract_sigq' requires" } */ + return __builtin_vec_scalar_extract_sig (source); /* { dg-error "'__builtin_vsx_scalar_extract_sig.*' requires" } */ } diff --git a/gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-data-class-11.c b/gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-data-class-11.c index 7c6fca2b729..ec3118792c4 100644 --- a/gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-data-class-11.c +++ b/gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-data-class-11.c @@ -10,5 +10,5 @@ test_data_class (__ieee128 *p) { __ieee128 source = *p; - return __builtin_vec_scalar_test_data_class (source, 3); /* { dg-error "'__builtin_vsx_scalar_test_data_class_qp' requires" } */ + return __builtin_vec_scalar_test_data_class (source, 3); /* { dg-error "'__builtin_vsx_scalar_test_data_class_.*' requires" } */ } diff --git a/gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-neg-5.c b/gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-neg-5.c index bab86040a7b..eb9cacf8c50 100644 --- a/gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-neg-5.c +++ b/gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-neg-5.c @@ -10,5 +10,5 @@ test_neg (__ieee128 *p) { __ieee128 source = *p; - return __builtin_vec_scalar_test_neg_qp (source); /* { dg-error "'__builtin_vsx_scalar_test_neg_qp' requires" } */ + return __builtin_vec_scalar_test_neg_qp (source); /* { dg-error "'__builtin_vsx_scalar_test_neg_.*' requires" } */ } diff --git a/gcc/testsuite/gcc.target/powerpc/float128-mix-2.c b/gcc/testsuite/gcc.target/powerpc/float128-mix-2.c new file mode 100644 index 00000000000..b88102118a9 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/float128-mix-2.c @@ -0,0 +1,17 @@ +/* { dg-do compile { target { powerpc*-*-linux* } } } */ +/* { dg-require-effective-target ppc_float128_sw } */ +/* { dg-options "-O2 -mvsx -Wno-psabi -mabi=ieeelongdouble -mlong-double-128" } */ + +/* Test to make sure that __float128 and long double do not generate errors if + long double uses the IEEE 128-bit format. */ +__float128 +add (__float128 a, long double b) +{ + return a+b; +} + +long double +sub (long double a, __float128 b) +{ + return a-b; +} diff --git a/gcc/testsuite/gcc.target/powerpc/float128-mix-3.c b/gcc/testsuite/gcc.target/powerpc/float128-mix-3.c new file mode 100644 index 00000000000..13fbe7fd08a --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/float128-mix-3.c @@ -0,0 +1,17 @@ +/* { dg-do compile { target { powerpc*-*-linux* } } } */ +/* { dg-require-effective-target ppc_float128_sw } */ +/* { dg-options "-O2 -mvsx" } */ + +/* Test to make sure that __float128 and __ibm128 cannot be combined + together. */ +__float128 +add (__float128 a, __ibm128 b) +{ + return a+b; /* { dg-error "IEEE 128-bit and IBM 128-bit floating point" } */ +} + +__ibm128 +sub (__ibm128 a, __float128 b) +{ + return a-b; /* { dg-error "IEEE 128-bit and IBM 128-bit floating point" } */ +} diff --git a/gcc/testsuite/gcc.target/powerpc/float128-mix.c b/gcc/testsuite/gcc.target/powerpc/float128-mix.c index 71f840c9490..eb8e6ac27bc 100644 --- a/gcc/testsuite/gcc.target/powerpc/float128-mix.c +++ b/gcc/testsuite/gcc.target/powerpc/float128-mix.c @@ -1,15 +1,18 @@ /* { dg-do compile { target { powerpc*-*-linux* } } } */ -/* { dg-require-effective-target powerpc_vsx_ok } */ -/* { dg-options "-O2 -mvsx" } */ +/* { dg-require-effective-target ppc_float128_sw } */ +/* { dg-options "-O2 -mvsx -Wno-psabi -mabi=ibmlongdouble -mlong-double-128" } */ - -/* Test to make sure that __float128 and long double cannot be combined together. */ -__float128 add (__float128 a, long double b) +/* Test to make sure that __float128 and long double cannot be combined + together, when long double uses the IBM extended double format, and + __float128 uses the IEEE 128-bit format. */ +__float128 +add (__float128 a, long double b) { - return a+b; /* { dg-error "__float128 and long double cannot be used in the same expression" } */ + return a+b; /* { dg-error "IEEE 128-bit and IBM 128-bit floating point" } */ } -__ibm128 sub (long double a, __float128 b) +long double +sub (long double a, __float128 b) { - return a-b; /* { dg-error "__float128 and long double cannot be used in the same expression" } */ + return a-b; /* { dg-error "IEEE 128-bit and IBM 128-bit floating point" } */ } -- 2.22.0 -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meiss...@linux.ibm.com, phone: +1 (978) 899-4797