On Thu, 2020-10-22 at 18:09 -0400, Michael Meissner via Gcc-patches wrote:
> PowerPC: Update IEEE 128-bit built-ins for long double is IEEE 128-bit.

"for when .."

> 
> I have split all of these patches into separate patches to hopefully get them
> into the tree.
> 
> This patch adds long double variants of the power10 __float128 built-in
> functions.  This is needed when long double uses IEEE 128-bit because
> __float128 uses TFmode in this case instead of KFmode.  If this patch is not
> applied, these built-in functions can't be used when long double is IEEE
> 128-bit.
> 
> I have tested this patch with bootstrap builds on a little endian power9 
> system
> running Linux.  With the other patches, I have built two full bootstrap builds
> using this patch and the patches after this patch.  One build used the current
> default for long double (IBM extended double) and the other build switched the
> default to IEEE 128-bit.  I used the Advance Toolchain AT 14.0 compiler as the
> library used by this compiler.  There are no regressions between the tests.
> There are 3 fortran benchmarks (ieee/large_2.f90, default_format_2.f90, and
> default_format_denormal_2.f90) that now pass.
> 
> Can I install this into the trunk?
> 
> We have gotten some requests to back port these changes to GCC 10.x.  At the
> moment, I am not planning to do the back port, but I may need to in the 
> future.
> 



> gcc/
> 2020-10-22  Michael Meissner  <meiss...@linux.ibm.com>
> 
>       * config/rs6000/rs6000-call.c (altivec_overloaded_builtins): Add
>       built-in functions for long double built-ins that use IEEE
>       128-bit.
>       (rs6000_expand_builtin): Change the KF IEEE 128-bit comparison
>       insns to TF if long double is IEEE 128-bit.
>       * config/rs6000/rs6000-builtin.def (scalar_extract_exptf): Add
>       support for long double being IEEE 128-bit built-in functions.
>       (scalar_extract_sigtf): Likewise.
>       (scalar_test_neg_tf): Likewise.
>       (scalar_insert_exp_tf): Likewise.
>       (scalar_insert_exp_tfp): Likewise.
>       (scalar_cmp_exp_tf_gt): Likewise.
>       (scalar_cmp_exp_tf_lt): Likewise.
>       (scalar_cmp_exp_tf_eq): Likewise.
>       (scalar_cmp_exp_tf_unordered): Likewise.
>       (scalar_test_data_class_tf): Likewise.
> ---
>  gcc/config/rs6000/rs6000-builtin.def | 11 ++++++++
>  gcc/config/rs6000/rs6000-call.c      | 40 ++++++++++++++++++++++++++++
>  2 files changed, 51 insertions(+)
> 
> diff --git a/gcc/config/rs6000/rs6000-builtin.def 
> b/gcc/config/rs6000/rs6000-builtin.def
> index 3eb55f0ae43..6f5685bf697 100644
> --- a/gcc/config/rs6000/rs6000-builtin.def
> +++ b/gcc/config/rs6000/rs6000-builtin.def
> @@ -2401,8 +2401,11 @@ BU_P9V_64BIT_VSX_1 (VSESDP,    "scalar_extract_sig",   
> CONST,  xsxsigdp)
> 
>  BU_FLOAT128_HW_VSX_1 (VSEEQP,        "scalar_extract_expq",  CONST,  
> xsxexpqp_kf)
>  BU_FLOAT128_HW_VSX_1 (VSESQP,        "scalar_extract_sigq",  CONST,  
> xsxsigqp_kf)
> +BU_FLOAT128_HW_VSX_1 (VSEETF,        "scalar_extract_exptf", CONST,  
> xsxexpqp_tf)
> +BU_FLOAT128_HW_VSX_1 (VSESTF,        "scalar_extract_sigtf", CONST,  
> xsxsigqp_tf)
> 
>  BU_FLOAT128_HW_VSX_1 (VSTDCNQP, "scalar_test_neg_qp",        CONST,  
> xststdcnegqp_kf)
> +BU_FLOAT128_HW_VSX_1 (VSTDCNTF, "scalar_test_neg_tf",        CONST,  
> xststdcnegqp_tf)
>  BU_P9V_VSX_1 (VSTDCNDP,      "scalar_test_neg_dp",   CONST,  xststdcnegdp)
>  BU_P9V_VSX_1 (VSTDCNSP,      "scalar_test_neg_sp",   CONST,  xststdcnegsp)
> 
> @@ -2420,6 +2423,8 @@ BU_P9V_64BIT_VSX_2 (VSIEDPF,    "scalar_insert_exp_dp", 
> CONST,  xsiexpdpf)
> 
>  BU_FLOAT128_HW_VSX_2 (VSIEQP,        "scalar_insert_exp_q",  CONST,  
> xsiexpqp_kf)
>  BU_FLOAT128_HW_VSX_2 (VSIEQPF,       "scalar_insert_exp_qp", CONST,  
> xsiexpqpf_kf)
> +BU_FLOAT128_HW_VSX_2 (VSIETF,        "scalar_insert_exp_tf", CONST,  
> xsiexpqp_tf)
> +BU_FLOAT128_HW_VSX_2 (VSIETFF,       "scalar_insert_exp_tfp", CONST, 
> xsiexpqpf_tf)

Ok if its ok, but the pattern catches my eye.  Should that be VSIETFP ?
(or named "scalar_insert_exp_tff")?


> 
>  BU_P9V_VSX_2 (VSCEDPGT,      "scalar_cmp_exp_dp_gt", CONST,  xscmpexpdp_gt)
>  BU_P9V_VSX_2 (VSCEDPLT,      "scalar_cmp_exp_dp_lt", CONST,  xscmpexpdp_lt)
> @@ -2431,7 +2436,13 @@ BU_P9V_VSX_2 (VSCEQPLT,        "scalar_cmp_exp_qp_lt", 
> CONST,  xscmpexpqp_lt_kf)
>  BU_P9V_VSX_2 (VSCEQPEQ,      "scalar_cmp_exp_qp_eq", CONST,  
> xscmpexpqp_eq_kf)
>  BU_P9V_VSX_2 (VSCEQPUO,      "scalar_cmp_exp_qp_unordered",  CONST,  
> xscmpexpqp_unordered_kf)
> 
> +BU_P9V_VSX_2 (VSCETFGT,      "scalar_cmp_exp_tf_gt", CONST,  
> xscmpexpqp_gt_tf)
> +BU_P9V_VSX_2 (VSCETFLT,      "scalar_cmp_exp_tf_lt", CONST,  
> xscmpexpqp_lt_tf)
> +BU_P9V_VSX_2 (VSCETFEQ,      "scalar_cmp_exp_tf_eq", CONST,  
> xscmpexpqp_eq_tf)
> +BU_P9V_VSX_2 (VSCETFUO,      "scalar_cmp_exp_tf_unordered", CONST, 
> xscmpexpqp_unordered_tf)
> +
>  BU_FLOAT128_HW_VSX_2 (VSTDCQP, "scalar_test_data_class_qp",  CONST,  
> xststdcqp_kf)
> +BU_FLOAT128_HW_VSX_2 (VSTDCTF, "scalar_test_data_class_tf",  CONST,  
> xststdcqp_tf)
>  BU_P9V_VSX_2 (VSTDCDP,       "scalar_test_data_class_dp",    CONST,  
> xststdcdp)
>  BU_P9V_VSX_2 (VSTDCSP,       "scalar_test_data_class_sp",    CONST,  
> xststdcsp)
> 
> diff --git a/gcc/config/rs6000/rs6000-call.c b/gcc/config/rs6000/rs6000-call.c
> index 9fdf97bc803..15dd99ac68d 100644
> --- a/gcc/config/rs6000/rs6000-call.c
> +++ b/gcc/config/rs6000/rs6000-call.c
> @@ -4585,6 +4585,8 @@ const struct altivec_builtin_types 
> altivec_overloaded_builtins[] = {
>      RS6000_BTI_bool_int, RS6000_BTI_double, RS6000_BTI_INTSI, 0 },
>    { P9V_BUILTIN_VEC_VSTDC, P9V_BUILTIN_VSTDCQP,
>      RS6000_BTI_bool_int, RS6000_BTI_ieee128_float, RS6000_BTI_INTSI, 0 },
> +  { P9V_BUILTIN_VEC_VSTDC, P9V_BUILTIN_VSTDCTF,
> +    RS6000_BTI_bool_int, RS6000_BTI_long_double, RS6000_BTI_INTSI, 0 },
> 
>    { P9V_BUILTIN_VEC_VSTDCSP, P9V_BUILTIN_VSTDCSP,
>      RS6000_BTI_bool_int, RS6000_BTI_float, RS6000_BTI_INTSI, 0 },
> @@ -4592,6 +4594,8 @@ const struct altivec_builtin_types 
> altivec_overloaded_builtins[] = {
>      RS6000_BTI_bool_int, RS6000_BTI_double, RS6000_BTI_INTSI, 0 },
>    { P9V_BUILTIN_VEC_VSTDCQP, P9V_BUILTIN_VSTDCQP,
>      RS6000_BTI_bool_int, RS6000_BTI_ieee128_float, RS6000_BTI_INTSI, 0 },
> +  { P9V_BUILTIN_VEC_VSTDCQP, P9V_BUILTIN_VSTDCTF,
> +    RS6000_BTI_bool_int, RS6000_BTI_long_double, RS6000_BTI_INTSI, 0 },
> 
>    { P9V_BUILTIN_VEC_VSTDCN, P9V_BUILTIN_VSTDCNSP,
>      RS6000_BTI_bool_int, RS6000_BTI_float, 0, 0 },
> @@ -4599,6 +4603,8 @@ const struct altivec_builtin_types 
> altivec_overloaded_builtins[] = {
>      RS6000_BTI_bool_int, RS6000_BTI_double, 0, 0 },
>    { P9V_BUILTIN_VEC_VSTDCN, P9V_BUILTIN_VSTDCNQP,
>      RS6000_BTI_bool_int, RS6000_BTI_ieee128_float, 0, 0 },
> +  { P9V_BUILTIN_VEC_VSTDCN, P9V_BUILTIN_VSTDCNTF,
> +    RS6000_BTI_bool_int, RS6000_BTI_long_double, 0, 0 },
> 
>    { P9V_BUILTIN_VEC_VSTDCNSP, P9V_BUILTIN_VSTDCNSP,
>      RS6000_BTI_bool_int, RS6000_BTI_float, 0, 0 },
> @@ -4606,16 +4612,22 @@ const struct altivec_builtin_types 
> altivec_overloaded_builtins[] = {
>      RS6000_BTI_bool_int, RS6000_BTI_double, 0, 0 },
>    { P9V_BUILTIN_VEC_VSTDCNQP, P9V_BUILTIN_VSTDCNQP,
>      RS6000_BTI_bool_int, RS6000_BTI_ieee128_float, 0, 0 },
> +  { P9V_BUILTIN_VEC_VSTDCNQP, P9V_BUILTIN_VSTDCNTF,
> +    RS6000_BTI_bool_int, RS6000_BTI_long_double, 0, 0 },
> 
>    { P9V_BUILTIN_VEC_VSEEDP, P9V_BUILTIN_VSEEDP,
>      RS6000_BTI_UINTSI, RS6000_BTI_double, 0, 0 },
>    { P9V_BUILTIN_VEC_VSEEDP, P9V_BUILTIN_VSEEQP,
>      RS6000_BTI_UINTDI, RS6000_BTI_ieee128_float, 0, 0 },
> +  { P9V_BUILTIN_VEC_VSEEDP, P9V_BUILTIN_VSEETF,
> +    RS6000_BTI_UINTDI, RS6000_BTI_long_double, 0, 0 },
> 
>    { P9V_BUILTIN_VEC_VSESDP, P9V_BUILTIN_VSESDP,
>      RS6000_BTI_UINTDI, RS6000_BTI_double, 0, 0 },
>    { P9V_BUILTIN_VEC_VSESDP, P9V_BUILTIN_VSESQP,
>      RS6000_BTI_UINTTI, RS6000_BTI_ieee128_float, 0, 0 },
> +  { P9V_BUILTIN_VEC_VSESDP, P9V_BUILTIN_VSESTF,
> +    RS6000_BTI_UINTTI, RS6000_BTI_long_double, 0, 0 },
> 
>    { P9V_BUILTIN_VEC_VSIEDP, P9V_BUILTIN_VSIEDP,
>      RS6000_BTI_double, RS6000_BTI_UINTDI, RS6000_BTI_UINTDI, 0 },
> @@ -4624,25 +4636,37 @@ const struct altivec_builtin_types 
> altivec_overloaded_builtins[] = {
> 
>    { P9V_BUILTIN_VEC_VSIEDP, P9V_BUILTIN_VSIEQP,
>      RS6000_BTI_ieee128_float, RS6000_BTI_UINTTI, RS6000_BTI_UINTDI, 0 },
> +  { P9V_BUILTIN_VEC_VSIEDP, P9V_BUILTIN_VSIETF,
> +    RS6000_BTI_long_double, RS6000_BTI_UINTTI, RS6000_BTI_UINTDI, 0 },
>    { P9V_BUILTIN_VEC_VSIEDP, P9V_BUILTIN_VSIEQPF,
>      RS6000_BTI_ieee128_float, RS6000_BTI_ieee128_float, RS6000_BTI_UINTDI, 0 
> },
> +  { P9V_BUILTIN_VEC_VSIEDP, P9V_BUILTIN_VSIETFF,
> +    RS6000_BTI_long_double, RS6000_BTI_long_double, RS6000_BTI_UINTDI, 0 },
> 
>    { P9V_BUILTIN_VEC_VSCEGT, P9V_BUILTIN_VSCEDPGT,
>      RS6000_BTI_INTSI, RS6000_BTI_double, RS6000_BTI_double, 0 },
>    { P9V_BUILTIN_VEC_VSCEGT, P9V_BUILTIN_VSCEQPGT,
>      RS6000_BTI_INTSI, RS6000_BTI_ieee128_float, RS6000_BTI_ieee128_float, 0 
> },
> +  { P9V_BUILTIN_VEC_VSCEGT, P9V_BUILTIN_VSCETFGT,
> +    RS6000_BTI_INTSI, RS6000_BTI_long_double, RS6000_BTI_long_double, 0 },
>    { P9V_BUILTIN_VEC_VSCELT, P9V_BUILTIN_VSCEDPLT,
>      RS6000_BTI_INTSI, RS6000_BTI_double, RS6000_BTI_double, 0 },
>    { P9V_BUILTIN_VEC_VSCELT, P9V_BUILTIN_VSCEQPLT,
>      RS6000_BTI_INTSI, RS6000_BTI_ieee128_float, RS6000_BTI_ieee128_float, 0 
> },
> +  { P9V_BUILTIN_VEC_VSCELT, P9V_BUILTIN_VSCETFLT,
> +    RS6000_BTI_INTSI, RS6000_BTI_long_double, RS6000_BTI_long_double, 0 },
>    { P9V_BUILTIN_VEC_VSCEEQ, P9V_BUILTIN_VSCEDPEQ,
>      RS6000_BTI_INTSI, RS6000_BTI_double, RS6000_BTI_double, 0 },
>    { P9V_BUILTIN_VEC_VSCEEQ, P9V_BUILTIN_VSCEQPEQ,
>      RS6000_BTI_INTSI, RS6000_BTI_ieee128_float, RS6000_BTI_ieee128_float, 0 
> },
> +  { P9V_BUILTIN_VEC_VSCEEQ, P9V_BUILTIN_VSCETFEQ,
> +    RS6000_BTI_INTSI, RS6000_BTI_long_double, RS6000_BTI_long_double, 0 },
>    { P9V_BUILTIN_VEC_VSCEUO, P9V_BUILTIN_VSCEDPUO,
>      RS6000_BTI_INTSI, RS6000_BTI_double, RS6000_BTI_double, 0 },
>    { P9V_BUILTIN_VEC_VSCEUO, P9V_BUILTIN_VSCEQPUO,
>      RS6000_BTI_INTSI, RS6000_BTI_ieee128_float, RS6000_BTI_ieee128_float, 0 
> },
> +  { P9V_BUILTIN_VEC_VSCEUO, P9V_BUILTIN_VSCETFUO,
> +    RS6000_BTI_INTSI, RS6000_BTI_long_double, RS6000_BTI_long_double, 0 },
> 
>    { P9V_BUILTIN_VEC_XL_LEN_R, P9V_BUILTIN_XL_LEN_R,
>      RS6000_BTI_unsigned_V16QI, ~RS6000_BTI_UINTQI,
> @@ -12532,6 +12556,22 @@ rs6000_expand_builtin (tree exp, rtx target, rtx 
> subtarget ATTRIBUTE_UNUSED,
>        case CODE_FOR_xsiexpqp_kf:     icode = CODE_FOR_xsiexpqp_tf;   break;
>        case CODE_FOR_xsiexpqpf_kf:    icode = CODE_FOR_xsiexpqpf_tf;  break;
>        case CODE_FOR_xststdcqp_kf:    icode = CODE_FOR_xststdcqp_tf;  break;
> +
> +      case CODE_FOR_xscmpexpqp_eq_kf:
> +     icode = CODE_FOR_xscmpexpqp_eq_tf;
> +     break;
> +
> +      case CODE_FOR_xscmpexpqp_lt_kf:
> +     icode = CODE_FOR_xscmpexpqp_lt_tf;
> +     break;
> +
> +      case CODE_FOR_xscmpexpqp_gt_kf:
> +     icode = CODE_FOR_xscmpexpqp_gt_tf;
> +     break;
> +
> +      case CODE_FOR_xscmpexpqp_unordered_kf:
> +     icode = CODE_FOR_xscmpexpqp_unordered_tf;
> +     break;
>        }

ok

lgtm, thanks
-Will


> 
>    if (TARGET_DEBUG_BUILTIN)
> -- 
> 2.22.0
> 
> 

Reply via email to