PowerPC: Update IEEE 128-bit built-ins for long double is IEEE 128-bit.
will schmidt
will_schmidt@vnet.ibm.com
Tue Oct 27 14:38:20 GMT 2020
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 <meissner@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
>
>
More information about the Gcc-patches
mailing list