Hi, 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". Bootstrapped and regtested on powerpc64{,le}-linux-gnu (ibm128 long double default) and powerpc64le-linux-gnu (ieee128 long double default). I'm going to install this next week if no objections. BR, Kewen ----- 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. --- 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 4af1eeb3722..7e30ab5b207 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -11460,13 +11460,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"); @@ -15624,7 +15624,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; @@ -15686,7 +15686,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; -- 2.43.5