libgcc, i386, optabs, v2: Add __float{, un}tibf to libgcc and expand BF -> integral through SF intermediate [PR107703]
Checks
Commit Message
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.
Jakub
Comments
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
@@ -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. */
@@ -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;
+}
@@ -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;
+}
@@ -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
@@ -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