PowerPC: Use __builtin_pack_ieee128 if long double is IEEE 128-bit.
will schmidt
will_schmidt@vnet.ibm.com
Tue Oct 27 14:30:03 GMT 2020
On Thu, 2020-10-22 at 18:10 -0400, Michael Meissner via Gcc-patches wrote:
> PowerPC: Use __builtin_pack_ieee128 if long double is IEEE 128-bit.
>
> I have split all of these patches into separate patches to hopefully get them
> into the tree.
>
> This patch changes the __ibm128 emulator to use __builtin_pack_ieee128
> instead of __builtin_pack_longdouble if long double is IEEE 128-bit, and
> we need to use the __ibm128 type. The code will run without this patch,
> but this patch slightly optimizes it better.
>
> 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.
good. :-) A quick search of gcc bugzilla shows there is an existing
PR 67531 that includes ieee rounding support for powerpc long double.
Does this (partially?) address that?
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67531
>
> 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.
>
> libgcc/
> 2020-10-22 Michael Meissner <meissner@linux.ibm.com>
>
> * config/rs6000/ibm-ldouble.c (pack_ldouble): Use
> __builtin_pack_ieee128 if long double is IEEE 128-bit.
> ---
> libgcc/config/rs6000/ibm-ldouble.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/libgcc/config/rs6000/ibm-ldouble.c b/libgcc/config/rs6000/ibm-ldouble.c
> index dd2a02373f2..767fdd72683 100644
> --- a/libgcc/config/rs6000/ibm-ldouble.c
> +++ b/libgcc/config/rs6000/ibm-ldouble.c
> @@ -102,9 +102,17 @@ __asm__ (".symver __gcc_qadd,_xlqadd@GCC_3.4\n\t"
> static inline IBM128_TYPE
> pack_ldouble (double dh, double dl)
> {
> + /* If we are building on a non-VSX system, the __ibm128 type is not defined.
> + This means we can't always use __builtin_pack_ibm128. Instead, we use
> + __builtin_pack_longdouble if long double uses the IBM extended double
> + 128-bit format, and use the explicit __builtin_pack_ibm128 if long double
> + is IEEE 128-bit. */
> #if defined (__LONG_DOUBLE_128__) && defined (__LONG_DOUBLE_IBM128__) \
> && !(defined (_SOFT_FLOAT) || defined (__NO_FPRS__))
> return __builtin_pack_longdouble (dh, dl);
> +#elif defined (__LONG_DOUBLE_128__) && defined (__LONG_DOUBLE_IEEE128__) \
> + && !(defined (_SOFT_FLOAT) || defined (__NO_FPRS__))
> + return __builtin_pack_ibm128 (dh, dl);
ok
lgtm,
thanks
-Will
> #else
> union
> {
> --
> 2.22.0
>
>
More information about the Gcc-patches
mailing list