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  <ja...@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.

--- 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


        Jakub

Reply via email to