aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKewen Lin <linkw@linux.ibm.com>2024-07-17 00:19:30 -0500
committerKewen Lin <linkw@gcc.gnu.org>2024-07-17 00:19:30 -0500
commitdd4d71ca4d8d4252eb33a3202380524e6d43ba05 (patch)
tree627f96e8b5a6fe1f15c5656e4ec1b87aa80a626c /gcc
parentb5c813ed6035cf6ef831927e66e184a5847afbe6 (diff)
downloadgcc-dd4d71ca4d8d4252eb33a3202380524e6d43ba05.zip
gcc-dd4d71ca4d8d4252eb33a3202380524e6d43ba05.tar.gz
gcc-dd4d71ca4d8d4252eb33a3202380524e6d43ba05.tar.bz2
rs6000: Change optab for ibm128 and ieee128 conversion
Currently for 128 bit floating-point ibm128 and ieee128 formats conversion, the corresponding libcalls are: ibm128 -> ieee128 "__trunctfkf2" ieee128 -> ibm128 "__extendkftf2" , and generic code handling (like convert_mode_scalar) also adopts sext_optab for ieee128 -> ibm128 while trunc_optab for ibm128 -> ieee128. But in rs6000 port as function rs6000_expand_float128_convert and init_float128_ieee show, we adopt sext_optab for ibm128 -> ieee128 with "__trunctfkf2" while trunc_optab for ieee128 -> ibm128 with "__extendkftf2". To make them consistent and avoid some surprises, this patch is to adjust rs6000 internal handlings by adopting trunc_optab for ibm128 -> ieee128 with "__trunctfkf2" while sext_optab for ieee128 -> ibm128 with "__extendkftf2". gcc/ChangeLog: * config/rs6000/rs6000.cc (init_float128_ieee): Use trunc_optab rather than sext_optab for converting FLOAT128_IBM_P mode to FLOAT128_IEEE_P mode, and use sext_optab rather than trunc_optab for converting FLOAT128_IEEE_P mode to FLOAT128_IBM_P mode. (rs6000_expand_float128_convert): Likewise.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/rs6000/rs6000.cc12
1 files changed, 6 insertions, 6 deletions
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 905e6cb6..2c0a7fc 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -11476,13 +11476,13 @@ init_float128_ieee (machine_mode mode)
set_conv_libfunc (trunc_optab, SFmode, mode, "__trunckfsf2");
set_conv_libfunc (trunc_optab, DFmode, mode, "__trunckfdf2");
- set_conv_libfunc (sext_optab, mode, IFmode, "__trunctfkf2");
+ set_conv_libfunc (trunc_optab, mode, IFmode, "__trunctfkf2");
if (mode != TFmode && FLOAT128_IBM_P (TFmode))
- set_conv_libfunc (sext_optab, mode, TFmode, "__trunctfkf2");
+ set_conv_libfunc (trunc_optab, mode, TFmode, "__trunctfkf2");
- set_conv_libfunc (trunc_optab, IFmode, mode, "__extendkftf2");
+ set_conv_libfunc (sext_optab, IFmode, mode, "__extendkftf2");
if (mode != TFmode && FLOAT128_IBM_P (TFmode))
- set_conv_libfunc (trunc_optab, TFmode, mode, "__extendkftf2");
+ set_conv_libfunc (sext_optab, TFmode, mode, "__extendkftf2");
set_conv_libfunc (sext_optab, mode, SDmode, "__dpd_extendsdkf");
set_conv_libfunc (sext_optab, mode, DDmode, "__dpd_extendddkf");
@@ -15640,7 +15640,7 @@ rs6000_expand_float128_convert (rtx dest, rtx src, bool unsigned_p)
case E_IFmode:
case E_TFmode:
if (FLOAT128_IBM_P (src_mode))
- cvt = sext_optab;
+ cvt = trunc_optab;
else
do_move = true;
break;
@@ -15702,7 +15702,7 @@ rs6000_expand_float128_convert (rtx dest, rtx src, bool unsigned_p)
case E_IFmode:
case E_TFmode:
if (FLOAT128_IBM_P (dest_mode))
- cvt = trunc_optab;
+ cvt = sext_optab;
else
do_move = true;
break;