aboutsummaryrefslogtreecommitdiff
path: root/libgcc/config
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2023-03-10 20:39:54 +0100
committerJakub Jelinek <jakub@redhat.com>2023-03-10 20:39:54 +0100
commit246127ab238bac6aa71a9b4ee1f6fabf776b5ccb (patch)
tree19f2dd70c6885c304c5a5e4f9f0dfe9c19597a3e /libgcc/config
parent60b6f5c0a334db3f8f6dffaf0b9aab42fd5c54a2 (diff)
downloadgcc-246127ab238bac6aa71a9b4ee1f6fabf776b5ccb.zip
gcc-246127ab238bac6aa71a9b4ee1f6fabf776b5ccb.tar.gz
gcc-246127ab238bac6aa71a9b4ee1f6fabf776b5ccb.tar.bz2
libgcc, i386: Add __fix{,uns}bfti and __float{,un}tibf [PR107703]
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, or they can be implemented (as done in this commit) 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. The BF -> SF -> TI path avoids wasting 32: 0000000000015e10 321 FUNC GLOBAL DEFAULT 13 __fixbfti@@GCC_13.0.0 89: 0000000000015f60 299 FUNC GLOBAL DEFAULT 13 __fixunsbfti@@GCC_13.0.0 2023-03-10 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.
Diffstat (limited to 'libgcc/config')
-rw-r--r--libgcc/config/i386/64/t-softfp5
-rw-r--r--libgcc/config/i386/libgcc-glibc.ver2
2 files changed, 6 insertions, 1 deletions
diff --git a/libgcc/config/i386/64/t-softfp b/libgcc/config/i386/64/t-softfp
index 3bec464..197fa11 100644
--- a/libgcc/config/i386/64/t-softfp
+++ b/libgcc/config/i386/64/t-softfp
@@ -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
diff --git a/libgcc/config/i386/libgcc-glibc.ver b/libgcc/config/i386/libgcc-glibc.ver
index fa8934b..d84d075 100644
--- a/libgcc/config/i386/libgcc-glibc.ver
+++ b/libgcc/config/i386/libgcc-glibc.ver
@@ -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