libgcc, i386: Add __fix{,uns}bfti and __float{,un}tibf [PR107703]

Message ID Y3SoCZfrEbw3KN3t@tucnak
State New
Headers
Series libgcc, i386: Add __fix{,uns}bfti and __float{,un}tibf [PR107703] |

Commit Message

Jakub Jelinek Nov. 16, 2022, 9:06 a.m. UTC
  Hi!

While DI <-> BF conversions can be handled (and are) through
DI <-> XF <-> BF and for narrower integral modes even sometimes
through DF or SF, because XFmode has 64-bit mantissa and so all
the DImode values are exactly representable in XFmode.
That is not the case for TImode, and while e.g. the HF -> TI
conversions are IMHO useless in libgcc, because HFmode has
-65504.0f16, 65504.0f16 range, all the integers will be already
representable in SImode (or even HImode for unsigned) and so
I think HF -> DI -> TI conversions are faster and valid,
BFmode has roughly the same range as SFmode and so we absolutely need
the TI -> BF conversions to avoid double rounding.

As for BF -> TI conversions, they can be either also implemented
in libgcc (as done in the patch), or they could be implemented
as BF -> SF -> TI conversions with the same code generation used
elsewhere, just doing the 16-bit left shift of the bits - I think
we don't need to handle sNaNs during the BF -> SF part because
SF -> TI (which is already a libcall too) will handle that too.

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.

2022-11-16  Jakub Jelinek  <jakub@redhat.com>

	PR target/107703
	* soft-fp/fixbfti.c: New file.
	* soft-fp/fixunsbfti.c: New file.
	* soft-fp/floattibf.c: New file.
	* soft-fp/floatuntibf.c: New file.
	* config/i386/libgcc-glibc.ver: Export __fix{,uns}bfti
	and __float{,un}tibf @ GCC_13.0.0.
	* config/i386/64/t-softfp (softfp_extras): Add
	fixbfti, fixunsbfti, floattibf and floatuntibf.
	(CFLAGS-fixbfti.c, CFLAGS-fixunsbfti.c, CFLAGS-floattibf.c,
	CFLAGS-floatunstibf.c): Add -msse2.


	Jakub
  

Patch

--- libgcc/soft-fp/fixbfti.c.jj	2022-11-15 19:07:41.747901840 +0100
+++ libgcc/soft-fp/fixbfti.c	2022-11-15 19:13:45.990927498 +0100
@@ -0,0 +1,45 @@ 
+/* Software floating-point emulation.
+   Convert bfloat16 to 128bit signed integer
+   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"
+
+TItype
+__fixbfti (BFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_B (A);
+  UTItype r;
+
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_B (A, a);
+  FP_TO_INT_B (r, A, TI_BITS, 1);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
--- libgcc/soft-fp/fixunsbfti.c.jj	2022-11-15 19:08:24.400319352 +0100
+++ libgcc/soft-fp/fixunsbfti.c	2022-11-15 19:13:50.200870008 +0100
@@ -0,0 +1,45 @@ 
+/* Software floating-point emulation.
+   Convert bfloat16 to 128bit unsigned integer
+   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"
+
+UTItype
+__fixunsbfti (BFtype a)
+{
+  FP_DECL_EX;
+  FP_DECL_B (A);
+  UTItype r;
+
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_B (A, a);
+  FP_TO_INT_B (r, A, TI_BITS, 0);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
--- 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,10 @@  GCC_12.0.0 {
 %inherit GCC_13.0.0 GCC_12.0.0
 GCC_13.0.0 {
   __extendbfsf2
+  __fixbfti
+  __fixunsbfti
+  __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,11 @@ 
-softfp_extras := fixhfti fixunshfti floattihf floatuntihf
+softfp_extras := fixhfti fixunshfti floattihf floatuntihf \
+		 fixbfti fixunsbfti floattibf floatuntibf
 
 CFLAGS-fixhfti.c += -msse2
 CFLAGS-fixunshfti.c += -msse2
 CFLAGS-floattihf.c += -msse2
 CFLAGS-floatunstihf.c += -msse2
+CFLAGS-fixbfti.c += -msse2
+CFLAGS-fixunsbfti.c += -msse2
+CFLAGS-floattibf.c += -msse2
+CFLAGS-floatunstibf.c += -msse2