https://gcc.gnu.org/g:dd4d71ca4d8d4252eb33a3202380524e6d43ba05

commit r15-2088-gdd4d71ca4d8d4252eb33a3202380524e6d43ba05
Author: Kewen Lin <li...@linux.ibm.com>
Date:   Wed Jul 17 00:19:30 2024 -0500

    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.

Diff:
---
 gcc/config/rs6000/rs6000.cc | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 905e6cb6a942..2c0a7fc8cefa 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;

Reply via email to