Message ID | Y3TOsnjlLHvSarjl@tucnak |
---|---|
State | New |
Headers | show |
Series | libgcc, i386, optabs, v2: Add __float{, un}tibf to libgcc and expand BF -> integral through SF intermediate [PR107703] | expand |
Hi! On Wed, Nov 16, 2022 at 12:51:14PM +0100, Jakub Jelinek via Gcc-patches wrote: > On Wed, Nov 16, 2022 at 10:06:17AM +0100, Jakub Jelinek via Gcc-patches wrote: > > Thoughts on this? I guess my preference would be the BF -> SF -> TI > > path because we won't need to waste > > 32: 0000000000015e10 321 FUNC GLOBAL DEFAULT 13 __fixbfti@@GCC_13.0.0 > > 89: 0000000000015f60 299 FUNC GLOBAL DEFAULT 13 __fixunsbfti@@GCC_13.0.0 > > If so, I'd need to cut the fix parts of the patch below and > > do something in the middle-end. > > Here is adjusted patch that does that. > > 2022-11-16 Jakub Jelinek <jakub@redhat.com> > > PR target/107703 > * optabs.cc (expand_fix): For conversions from BFmode to integral, > use shifts to convert it to SFmode first and then convert SFmode > to integral. > > * soft-fp/floattibf.c: New file. > * soft-fp/floatuntibf.c: New file. > * config/i386/libgcc-glibc.ver: Export __float{,un}tibf @ GCC_13.0.0. > * config/i386/64/t-softfp (softfp_extras): Add floattibf and > floatuntibf. > (CFLAGS-floattibf.c, CFLAGS-floatunstibf.c): Add -msse2. I'd like to ping the libgcc non-i386 part of this patch, Uros said the i386 part is ok but that one depends on the generic libgcc changes. I'll ping the optabs.cc change separately. https://gcc.gnu.org/pipermail/gcc-patches/2022-November/606398.html with more info in https://gcc.gnu.org/pipermail/gcc-patches/2022-November/606382.html Thanks. Jakub
Hi! On Wed, Mar 01, 2023 at 01:32:43PM +0100, Jakub Jelinek via Gcc-patches wrote: > On Wed, Nov 16, 2022 at 12:51:14PM +0100, Jakub Jelinek via Gcc-patches wrote: > > On Wed, Nov 16, 2022 at 10:06:17AM +0100, Jakub Jelinek via Gcc-patches wrote: > > > Thoughts on this? I guess my preference would be the BF -> SF -> TI > > > path because we won't need to waste > > > 32: 0000000000015e10 321 FUNC GLOBAL DEFAULT 13 __fixbfti@@GCC_13.0.0 > > > 89: 0000000000015f60 299 FUNC GLOBAL DEFAULT 13 __fixunsbfti@@GCC_13.0.0 > > > If so, I'd need to cut the fix parts of the patch below and > > > do something in the middle-end. > > > > Here is adjusted patch that does that. > > > > 2022-11-16 Jakub Jelinek <jakub@redhat.com> > > > > PR target/107703 > > * optabs.cc (expand_fix): For conversions from BFmode to integral, > > use shifts to convert it to SFmode first and then convert SFmode > > to integral. > > > > * soft-fp/floattibf.c: New file. > > * soft-fp/floatuntibf.c: New file. > > * config/i386/libgcc-glibc.ver: Export __float{,un}tibf @ GCC_13.0.0. > > * config/i386/64/t-softfp (softfp_extras): Add floattibf and > > floatuntibf. > > (CFLAGS-floattibf.c, CFLAGS-floatunstibf.c): Add -msse2. > > I'd like to ping the libgcc non-i386 part of this patch, Uros said the i386 > part is ok but that one depends on the generic libgcc changes. > I'll ping the optabs.cc change separately. > > https://gcc.gnu.org/pipermail/gcc-patches/2022-November/606398.html > with more info in > https://gcc.gnu.org/pipermail/gcc-patches/2022-November/606382.html I'd like to ping this again. I've posted the previously added bfloat16 changes as well as the above 2 new files to libc-alpha as well https://sourceware.org/pipermail/libc-alpha/2023-March/146246.html if it makes the review easier. Thanks Jakub
Jakub Jelinek <jakub@redhat.com> writes: > On Wed, Mar 01, 2023 at 01:32:43PM +0100, Jakub Jelinek via Gcc-patches wrote: >> On Wed, Nov 16, 2022 at 12:51:14PM +0100, Jakub Jelinek via Gcc-patches wrote: >> > On Wed, Nov 16, 2022 at 10:06:17AM +0100, Jakub Jelinek via >> > Gcc-patches wrote: >> > > Thoughts on this? I guess my preference would be the BF -> SF -> TI >> > > path because we won't need to waste >> > > 32: 0000000000015e10 321 FUNC GLOBAL DEFAULT 13 >> > > __fixbfti@@GCC_13.0.0 >> > > 89: 0000000000015f60 299 FUNC GLOBAL DEFAULT 13 >> > > __fixunsbfti@@GCC_13.0.0 >> > > If so, I'd need to cut the fix parts of the patch below and >> > > do something in the middle-end. >> > >> > Here is adjusted patch that does that. >> > >> > 2022-11-16 Jakub Jelinek <jakub@redhat.com> >> > >> > PR target/107703 >> > * optabs.cc (expand_fix): For conversions from BFmode to integral, >> > use shifts to convert it to SFmode first and then convert SFmode >> > to integral. >> > >> > * soft-fp/floattibf.c: New file. >> > * soft-fp/floatuntibf.c: New file. >> > * config/i386/libgcc-glibc.ver: Export __float{,un}tibf @ GCC_13.0.0. >> > * config/i386/64/t-softfp (softfp_extras): Add floattibf and >> > floatuntibf. >> > (CFLAGS-floattibf.c, CFLAGS-floatunstibf.c): Add -msse2. >> >> I'd like to ping the libgcc non-i386 part of this patch, Uros said the i386 >> part is ok but that one depends on the generic libgcc changes. >> I'll ping the optabs.cc change separately. >> >> https://gcc.gnu.org/pipermail/gcc-patches/2022-November/606398.html >> with more info in >> https://gcc.gnu.org/pipermail/gcc-patches/2022-November/606382.html > > I'd like to ping this again. I've posted the previously added > bfloat16 changes as well as the above 2 new files to libc-alpha as well > https://sourceware.org/pipermail/libc-alpha/2023-March/146246.html > if it makes the review easier. The libgcc parts of this are fine. Thanks. Ian
On Fri, Mar 10, 2023 at 7:11 PM Ian Lance Taylor <ian@airs.com> wrote: > > Jakub Jelinek <jakub@redhat.com> writes: > > > On Wed, Mar 01, 2023 at 01:32:43PM +0100, Jakub Jelinek via Gcc-patches wrote: > >> On Wed, Nov 16, 2022 at 12:51:14PM +0100, Jakub Jelinek via Gcc-patches wrote: > >> > On Wed, Nov 16, 2022 at 10:06:17AM +0100, Jakub Jelinek via > >> > Gcc-patches wrote: > >> > > Thoughts on this? I guess my preference would be the BF -> SF -> TI > >> > > path because we won't need to waste > >> > > 32: 0000000000015e10 321 FUNC GLOBAL DEFAULT 13 > >> > > __fixbfti@@GCC_13.0.0 > >> > > 89: 0000000000015f60 299 FUNC GLOBAL DEFAULT 13 > >> > > __fixunsbfti@@GCC_13.0.0 > >> > > If so, I'd need to cut the fix parts of the patch below and > >> > > do something in the middle-end. > >> > > >> > Here is adjusted patch that does that. > >> > > >> > 2022-11-16 Jakub Jelinek <jakub@redhat.com> > >> > > >> > PR target/107703 > >> > * optabs.cc (expand_fix): For conversions from BFmode to integral, > >> > use shifts to convert it to SFmode first and then convert SFmode > >> > to integral. > >> > > >> > * soft-fp/floattibf.c: New file. > >> > * soft-fp/floatuntibf.c: New file. > >> > * config/i386/libgcc-glibc.ver: Export __float{,un}tibf @ GCC_13.0.0. > >> > * config/i386/64/t-softfp (softfp_extras): Add floattibf and > >> > floatuntibf. > >> > (CFLAGS-floattibf.c, CFLAGS-floatunstibf.c): Add -msse2. > >> > >> I'd like to ping the libgcc non-i386 part of this patch, Uros said the i386 > >> part is ok but that one depends on the generic libgcc changes. > >> I'll ping the optabs.cc change separately. > >> > >> https://gcc.gnu.org/pipermail/gcc-patches/2022-November/606398.html > >> with more info in > >> https://gcc.gnu.org/pipermail/gcc-patches/2022-November/606382.html > > > > I'd like to ping this again. I've posted the previously added > > bfloat16 changes as well as the above 2 new files to libc-alpha as well > > https://sourceware.org/pipermail/libc-alpha/2023-March/146246.html > > if it makes the review easier. > > > The libgcc parts of this are fine. Thanks. Also OK for the x86 part. Thanks, Uros.
On 3/1/23 05:32, Jakub Jelinek via Gcc-patches wrote: > Hi! > > On Wed, Nov 16, 2022 at 12:51:14PM +0100, Jakub Jelinek via Gcc-patches wrote: >> On Wed, Nov 16, 2022 at 10:06:17AM +0100, Jakub Jelinek via Gcc-patches wrote: >>> Thoughts on this? I guess my preference would be the BF -> SF -> TI >>> path because we won't need to waste >>> 32: 0000000000015e10 321 FUNC GLOBAL DEFAULT 13 __fixbfti@@GCC_13.0.0 >>> 89: 0000000000015f60 299 FUNC GLOBAL DEFAULT 13 __fixunsbfti@@GCC_13.0.0 >>> If so, I'd need to cut the fix parts of the patch below and >>> do something in the middle-end. >> >> Here is adjusted patch that does that. >> >> 2022-11-16 Jakub Jelinek <jakub@redhat.com> >> >> PR target/107703 >> * optabs.cc (expand_fix): For conversions from BFmode to integral, >> use shifts to convert it to SFmode first and then convert SFmode >> to integral. >> >> * soft-fp/floattibf.c: New file. >> * soft-fp/floatuntibf.c: New file. >> * config/i386/libgcc-glibc.ver: Export __float{,un}tibf @ GCC_13.0.0. >> * config/i386/64/t-softfp (softfp_extras): Add floattibf and >> floatuntibf. >> (CFLAGS-floattibf.c, CFLAGS-floatunstibf.c): Add -msse2. > > I'd like to ping the libgcc non-i386 part of this patch, Uros said the i386 > part is ok but that one depends on the generic libgcc changes. > I'll ping the optabs.cc change separately. > > https://gcc.gnu.org/pipermail/gcc-patches/2022-November/606398.html > with more info in > https://gcc.gnu.org/pipermail/gcc-patches/2022-November/606382.html The optab changes are OK too. jeff
--- gcc/optabs.cc.jj 2022-11-16 07:29:11.665715915 +0100 +++ gcc/optabs.cc 2022-11-16 12:46:25.523281210 +0100 @@ -5574,7 +5574,21 @@ expand_fix (rtx to, rtx from, int unsign rtx_insn *last = get_last_insn (); rtx from1 = from; if (fmode != GET_MODE (from)) - from1 = convert_to_mode (fmode, from, 0); + { + if (REAL_MODE_FORMAT (GET_MODE (from)) + == &arm_bfloat_half_format + && REAL_MODE_FORMAT (fmode) == &ieee_single_format) + /* The BF -> SF conversions can be just a shift, doesn't + need to handle sNANs. */ + { + int save_flag_finite_math_only = flag_finite_math_only; + flag_finite_math_only = true; + from1 = convert_to_mode (fmode, from, 0); + flag_finite_math_only = save_flag_finite_math_only; + } + else + from1 = convert_to_mode (fmode, from, 0); + } if (must_trunc) { @@ -5646,7 +5660,21 @@ expand_fix (rtx to, rtx from, int unsign lab2 = gen_label_rtx (); if (fmode != GET_MODE (from)) - from = convert_to_mode (fmode, from, 0); + { + if (REAL_MODE_FORMAT (GET_MODE (from)) + == &arm_bfloat_half_format + && REAL_MODE_FORMAT (fmode) == &ieee_single_format) + /* The BF -> SF conversions can be just a shift, doesn't + need to handle sNANs. */ + { + int save_flag_finite_math_only = flag_finite_math_only; + flag_finite_math_only = true; + from = convert_to_mode (fmode, from, 0); + flag_finite_math_only = save_flag_finite_math_only; + } + else + from = convert_to_mode (fmode, from, 0); + } /* See if we need to do the subtraction. */ do_pending_stack_adjust (); @@ -5690,6 +5718,22 @@ expand_fix (rtx to, rtx from, int unsign } } +#ifdef HAVE_SFmode + if (REAL_MODE_FORMAT (GET_MODE (from)) == &arm_bfloat_half_format + && REAL_MODE_FORMAT (SFmode) == &ieee_single_format) + /* We don't have BF -> TI library functions, use BF -> SF -> TI + instead but the BF -> SF conversion can be just a shift, doesn't + need to handle sNANs. */ + { + int save_flag_finite_math_only = flag_finite_math_only; + flag_finite_math_only = true; + from = convert_to_mode (SFmode, from, 0); + flag_finite_math_only = save_flag_finite_math_only; + expand_fix (to, from, unsignedp); + return; + } +#endif + /* We can't do it with an insn, so use a library call. But first ensure that the mode of TO is at least as wide as SImode, since those are the only library calls we know about. */ --- libgcc/soft-fp/floattibf.c.jj 2022-11-15 19:10:13.147834226 +0100 +++ libgcc/soft-fp/floattibf.c 2022-11-15 19:13:40.939996482 +0100 @@ -0,0 +1,45 @@ +/* Software floating-point emulation. + Convert a 128bit signed integer to bfloat16 + Copyright (C) 2007-2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file into + combinations with other programs, and to distribute those + combinations without any restriction coming from the use of this + file. (The Lesser General Public License restrictions do apply in + other respects; for example, they cover modification of the file, + and distribution when not linked into a combine executable.) + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include "soft-fp.h" +#include "brain.h" + +BFtype +__floattibf (TItype i) +{ + FP_DECL_EX; + FP_DECL_B (A); + BFtype a; + + FP_INIT_ROUNDMODE; + FP_FROM_INT_B (A, i, TI_BITS, UTItype); + FP_PACK_RAW_B (a, A); + FP_HANDLE_EXCEPTIONS; + + return a; +} --- libgcc/soft-fp/floatuntibf.c.jj 2022-11-15 19:10:53.363285018 +0100 +++ libgcc/soft-fp/floatuntibf.c 2022-11-15 19:13:31.399126765 +0100 @@ -0,0 +1,45 @@ +/* Software floating-point emulation. + Convert a 128bit unsigned integer to bfloat16 + Copyright (C) 2007-2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file into + combinations with other programs, and to distribute those + combinations without any restriction coming from the use of this + file. (The Lesser General Public License restrictions do apply in + other respects; for example, they cover modification of the file, + and distribution when not linked into a combine executable.) + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include "soft-fp.h" +#include "brain.h" + +BFtype +__floatuntibf (UTItype i) +{ + FP_DECL_EX; + FP_DECL_B (A); + BFtype a; + + FP_INIT_ROUNDMODE; + FP_FROM_INT_B (A, i, TI_BITS, UTItype); + FP_PACK_RAW_B (a, A); + FP_HANDLE_EXCEPTIONS; + + return a; +} --- libgcc/config/i386/libgcc-glibc.ver.jj 2022-10-14 09:35:56.269989297 +0200 +++ libgcc/config/i386/libgcc-glibc.ver 2022-11-15 19:26:37.125389987 +0100 @@ -218,6 +218,8 @@ GCC_12.0.0 { %inherit GCC_13.0.0 GCC_12.0.0 GCC_13.0.0 { __extendbfsf2 + __floattibf + __floatuntibf __truncdfbf2 __truncsfbf2 __trunctfbf2 --- libgcc/config/i386/64/t-softfp.jj 2021-12-30 15:12:44.111138056 +0100 +++ libgcc/config/i386/64/t-softfp 2022-11-15 19:26:07.184799287 +0100 @@ -1,6 +1,9 @@ -softfp_extras := fixhfti fixunshfti floattihf floatuntihf +softfp_extras := fixhfti fixunshfti floattihf floatuntihf \ + floattibf floatuntibf CFLAGS-fixhfti.c += -msse2 CFLAGS-fixunshfti.c += -msse2 CFLAGS-floattihf.c += -msse2 CFLAGS-floatunstihf.c += -msse2 +CFLAGS-floattibf.c += -msse2 +CFLAGS-floatunstibf.c += -msse2