[gcc(refs/users/meissner/heads/work098)] Revert patch.
Michael Meissner
meissner@gcc.gnu.org
Sat Aug 20 22:21:46 GMT 2022
https://gcc.gnu.org/g:cef601a3a7dea2889593522d9f0fcbcd00a785b8
commit cef601a3a7dea2889593522d9f0fcbcd00a785b8
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Sat Aug 20 18:20:56 2022 -0400
Revert patch.
2022-08-20 Michael Meissner <meissner@linux.ibm.com>
gcc/
Revert patch.
* config/rs6000/rs6000-builtin.cc (rs6000_init_builtins): Always use the
_Float128 type for __float128.
(rs6000_expand_builtin): If the predicate failed because the modes were
different, use convert_move to load up the value instead of
copy_to_mode_reg.
* ChangeLog.meissner: Update.
gcc/testsuite/
Revert patch.
* gcc.target/powerpc/float128-hw12.c: New test.
* gcc.target/powerpc/float128-hw13.c: Likewise.
Diff:
---
gcc/ChangeLog.meissner | 35 ------
gcc/config/rs6000/rs6000-builtin.cc | 32 +-----
gcc/testsuite/gcc.target/powerpc/float128-hw12.c | 137 -----------------------
gcc/testsuite/gcc.target/powerpc/float128-hw13.c | 137 -----------------------
4 files changed, 5 insertions(+), 336 deletions(-)
diff --git a/gcc/ChangeLog.meissner b/gcc/ChangeLog.meissner
index fb172190f81..2a32a0ef837 100644
--- a/gcc/ChangeLog.meissner
+++ b/gcc/ChangeLog.meissner
@@ -1,38 +1,3 @@
-==================== work098, patch #21
-
-Make __float128 use the _Float128 type.
-
-Currently GCC uses the long double type node for __float128 if long double is
-IEEE 128-bit. It did not use the node for _Float128.
-
-Problems showed up if you call the nansq function to make a signaling NaN (nansq
-is mapped to nansf128). Because the type node for _Float128 is different from
-__float128, the machine independent code converts signaling NaNs to quiet NaNs
-if the types are not compatible. The following tests used to fail when run on
-a system where long double is IEEE 128-bit:
-
- gcc.dg/torture/float128-nan.c
- gcc.target/powerpc/nan128-1.c
-
-This patch makes both __float128 and _Float128 use the same type node. Both of
-these types will continue to use the TFmode when long double is IEEE 128-bit,
-and KFmode otherwise.
-
-2022-08-20 Michael Meissner <meissner@linux.ibm.com>
-
-gcc/
-
- * config/rs6000/rs6000-builtin.cc (rs6000_init_builtins): Always use the
- _Float128 type for __float128.
- (rs6000_expand_builtin): If the predicate failed because the modes were
- different, use convert_move to load up the value instead of
- copy_to_mode_reg.
-
-gcc/testsuite/
-
- * gcc.target/powerpc/float128-hw12.c: New test.
- * gcc.target/powerpc/float128-hw13.c: Likewise.
-
==================== work098, patch #20 was reverted.
==================== work098, patch #19 was reverted.
diff --git a/gcc/config/rs6000/rs6000-builtin.cc b/gcc/config/rs6000/rs6000-builtin.cc
index 4e160f3f478..70680890415 100644
--- a/gcc/config/rs6000/rs6000-builtin.cc
+++ b/gcc/config/rs6000/rs6000-builtin.cc
@@ -733,15 +733,10 @@ rs6000_init_builtins (void)
if (TARGET_FLOAT128_TYPE)
{
- /* In the past we used long_double_type_node when long double was IEEE
- 128-bit. However, this means that the _Float128 type
- (i.e. float128_type_node) is a different type from __float128
- (i.e. ieee128_float_type_nonde). This leads to some corner cases,
- such as processing signaling NaNs with the nansf128 built-in function
- (which returns a _Float128 value) and assign it to a long double or
- __float128 value. The two explicit IEEE 128-bit types should always
- use the same internal type. */
- ieee128_float_type_node = float128_type_node;
+ if (TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128)
+ ieee128_float_type_node = long_double_type_node;
+ else
+ ieee128_float_type_node = float128_type_node;
t = build_qualified_type (ieee128_float_type_node, TYPE_QUAL_CONST);
lang_hooks.types.register_builtin_type (ieee128_float_type_node,
"__ieee128");
@@ -3622,24 +3617,7 @@ rs6000_expand_builtin (tree exp, rtx target, rtx /* subtarget */,
for (int i = 0; i < nargs; i++)
if (!insn_data[icode].operand[i+k].predicate (op[i], mode[i+k]))
- {
- /* If the predicate failed because the modes are different, do a
- convert instead of copy_to_mode_reg, since copy_to_mode_reg will
- abort in this case. The modes might be different if we have two
- different 128-bit floating point modes (i.e. KFmode and TFmode if
- long double is IEEE 128-bit and IFmode and TFmode if long double is
- IBM 128-bit). */
- machine_mode mode_insn = mode[i+k];
- machine_mode mode_op = GET_MODE (op[i]);
- if (mode_insn != mode_op && mode_op != VOIDmode)
- {
- rtx tmp = gen_reg_rtx (mode_insn);
- convert_move (tmp, op[i], 0);
- op[i] = tmp;
- }
- else
- op[i] = copy_to_mode_reg (mode_insn, op[i]);
- }
+ op[i] = copy_to_mode_reg (mode[i+k], op[i]);
rtx pat;
diff --git a/gcc/testsuite/gcc.target/powerpc/float128-hw12.c b/gcc/testsuite/gcc.target/powerpc/float128-hw12.c
deleted file mode 100644
index d08b4cbc883..00000000000
--- a/gcc/testsuite/gcc.target/powerpc/float128-hw12.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/* { dg-do compile { target lp64 } } */
-/* { dg-require-effective-target powerpc_p9vector_ok } */
-/* { dg-require-effective-target float128 } */
-/* { dg-options "-mpower9-vector -O2 -mabi=ieeelongdouble -Wno-psabi" } */
-
-/* Insure that the ISA 3.0 IEEE 128-bit floating point built-in functions work
- with _Float128. This is the same as float128-hw4.c, except the type
- _Float128 is used, and the IEEE 128-bit long double ABI is used. */
-
-#ifndef TYPE
-#define TYPE _Float128
-#endif
-
-unsigned int
-get_double_exponent (double a)
-{
- return __builtin_vec_scalar_extract_exp (a);
-}
-
-unsigned int
-get_float128_exponent (TYPE a)
-{
- return __builtin_vec_scalar_extract_exp (a);
-}
-
-unsigned long
-get_double_mantissa (double a)
-{
- return __builtin_vec_scalar_extract_sig (a);
-}
-
-__uint128_t
-get_float128_mantissa (TYPE a)
-{
- return __builtin_vec_scalar_extract_sig (a);
-}
-
-double
-set_double_exponent_ulong (unsigned long a, unsigned long e)
-{
- return __builtin_vec_scalar_insert_exp (a, e);
-}
-
-TYPE
-set_float128_exponent_uint128 (__uint128_t a, unsigned long e)
-{
- return __builtin_vec_scalar_insert_exp (a, e);
-}
-
-double
-set_double_exponent_double (double a, unsigned long e)
-{
- return __builtin_vec_scalar_insert_exp (a, e);
-}
-
-TYPE
-set_float128_exponent_float128 (TYPE a, __uint128_t e)
-{
- return __builtin_vec_scalar_insert_exp (a, e);
-}
-
-TYPE
-sqrt_odd (TYPE a)
-{
- return __builtin_sqrtf128_round_to_odd (a);
-}
-
-double
-trunc_odd (TYPE a)
-{
- return __builtin_truncf128_round_to_odd (a);
-}
-
-TYPE
-add_odd (TYPE a, TYPE b)
-{
- return __builtin_addf128_round_to_odd (a, b);
-}
-
-TYPE
-sub_odd (TYPE a, TYPE b)
-{
- return __builtin_subf128_round_to_odd (a, b);
-}
-
-TYPE
-mul_odd (TYPE a, TYPE b)
-{
- return __builtin_mulf128_round_to_odd (a, b);
-}
-
-TYPE
-div_odd (TYPE a, TYPE b)
-{
- return __builtin_divf128_round_to_odd (a, b);
-}
-
-TYPE
-fma_odd (TYPE a, TYPE b, TYPE c)
-{
- return __builtin_fmaf128_round_to_odd (a, b, c);
-}
-
-TYPE
-fms_odd (TYPE a, TYPE b, TYPE c)
-{
- return __builtin_fmaf128_round_to_odd (a, b, -c);
-}
-
-TYPE
-nfma_odd (TYPE a, TYPE b, TYPE c)
-{
- return -__builtin_fmaf128_round_to_odd (a, b, c);
-}
-
-TYPE
-nfms_odd (TYPE a, TYPE b, TYPE c)
-{
- return -__builtin_fmaf128_round_to_odd (a, b, -c);
-}
-
-/* { dg-final { scan-assembler {\mxsiexpdp\M} } } */
-/* { dg-final { scan-assembler {\mxsiexpqp\M} } } */
-/* { dg-final { scan-assembler {\mxsxexpdp\M} } } */
-/* { dg-final { scan-assembler {\mxsxexpqp\M} } } */
-/* { dg-final { scan-assembler {\mxsxsigdp\M} } } */
-/* { dg-final { scan-assembler {\mxsxsigqp\M} } } */
-/* { dg-final { scan-assembler {\mxsaddqpo\M} } } */
-/* { dg-final { scan-assembler {\mxsdivqpo\M} } } */
-/* { dg-final { scan-assembler {\mxsmaddqpo\M} } } */
-/* { dg-final { scan-assembler {\mxsmsubqpo\M} } } */
-/* { dg-final { scan-assembler {\mxsmulqpo\M} } } */
-/* { dg-final { scan-assembler {\mxsnmaddqpo\M} } } */
-/* { dg-final { scan-assembler {\mxsnmsubqpo\M} } } */
-/* { dg-final { scan-assembler {\mxssqrtqpo\M} } } */
-/* { dg-final { scan-assembler {\mxssubqpo\M} } } */
-/* { dg-final { scan-assembler-not {\mbl\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/float128-hw13.c b/gcc/testsuite/gcc.target/powerpc/float128-hw13.c
deleted file mode 100644
index 51a3cd4802b..00000000000
--- a/gcc/testsuite/gcc.target/powerpc/float128-hw13.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/* { dg-do compile { target lp64 } } */
-/* { dg-require-effective-target powerpc_p9vector_ok } */
-/* { dg-require-effective-target float128 } */
-/* { dg-options "-mpower9-vector -O2 -mabi=ibmlongdouble -Wno-psabi" } */
-
-/* Insure that the ISA 3.0 IEEE 128-bit floating point built-in functions work
- with __float128. This is the same as float128-hw4.c, except the type
- __float128 is used, and the IBM 128-bit long double ABI is used. */
-
-#ifndef TYPE
-#define TYPE __float128
-#endif
-
-unsigned int
-get_double_exponent (double a)
-{
- return __builtin_vec_scalar_extract_exp (a);
-}
-
-unsigned int
-get_float128_exponent (TYPE a)
-{
- return __builtin_vec_scalar_extract_exp (a);
-}
-
-unsigned long
-get_double_mantissa (double a)
-{
- return __builtin_vec_scalar_extract_sig (a);
-}
-
-__uint128_t
-get_float128_mantissa (TYPE a)
-{
- return __builtin_vec_scalar_extract_sig (a);
-}
-
-double
-set_double_exponent_ulong (unsigned long a, unsigned long e)
-{
- return __builtin_vec_scalar_insert_exp (a, e);
-}
-
-TYPE
-set_float128_exponent_uint128 (__uint128_t a, unsigned long e)
-{
- return __builtin_vec_scalar_insert_exp (a, e);
-}
-
-double
-set_double_exponent_double (double a, unsigned long e)
-{
- return __builtin_vec_scalar_insert_exp (a, e);
-}
-
-TYPE
-set_float128_exponent_float128 (TYPE a, __uint128_t e)
-{
- return __builtin_vec_scalar_insert_exp (a, e);
-}
-
-TYPE
-sqrt_odd (TYPE a)
-{
- return __builtin_sqrtf128_round_to_odd (a);
-}
-
-double
-trunc_odd (TYPE a)
-{
- return __builtin_truncf128_round_to_odd (a);
-}
-
-TYPE
-add_odd (TYPE a, TYPE b)
-{
- return __builtin_addf128_round_to_odd (a, b);
-}
-
-TYPE
-sub_odd (TYPE a, TYPE b)
-{
- return __builtin_subf128_round_to_odd (a, b);
-}
-
-TYPE
-mul_odd (TYPE a, TYPE b)
-{
- return __builtin_mulf128_round_to_odd (a, b);
-}
-
-TYPE
-div_odd (TYPE a, TYPE b)
-{
- return __builtin_divf128_round_to_odd (a, b);
-}
-
-TYPE
-fma_odd (TYPE a, TYPE b, TYPE c)
-{
- return __builtin_fmaf128_round_to_odd (a, b, c);
-}
-
-TYPE
-fms_odd (TYPE a, TYPE b, TYPE c)
-{
- return __builtin_fmaf128_round_to_odd (a, b, -c);
-}
-
-TYPE
-nfma_odd (TYPE a, TYPE b, TYPE c)
-{
- return -__builtin_fmaf128_round_to_odd (a, b, c);
-}
-
-TYPE
-nfms_odd (TYPE a, TYPE b, TYPE c)
-{
- return -__builtin_fmaf128_round_to_odd (a, b, -c);
-}
-
-/* { dg-final { scan-assembler {\mxsiexpdp\M} } } */
-/* { dg-final { scan-assembler {\mxsiexpqp\M} } } */
-/* { dg-final { scan-assembler {\mxsxexpdp\M} } } */
-/* { dg-final { scan-assembler {\mxsxexpqp\M} } } */
-/* { dg-final { scan-assembler {\mxsxsigdp\M} } } */
-/* { dg-final { scan-assembler {\mxsxsigqp\M} } } */
-/* { dg-final { scan-assembler {\mxsaddqpo\M} } } */
-/* { dg-final { scan-assembler {\mxsdivqpo\M} } } */
-/* { dg-final { scan-assembler {\mxsmaddqpo\M} } } */
-/* { dg-final { scan-assembler {\mxsmsubqpo\M} } } */
-/* { dg-final { scan-assembler {\mxsmulqpo\M} } } */
-/* { dg-final { scan-assembler {\mxsnmaddqpo\M} } } */
-/* { dg-final { scan-assembler {\mxsnmsubqpo\M} } } */
-/* { dg-final { scan-assembler {\mxssqrtqpo\M} } } */
-/* { dg-final { scan-assembler {\mxssubqpo\M} } } */
-/* { dg-final { scan-assembler-not {\mbl\M} } } */
More information about the Gcc-cvs
mailing list