https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120304
Bug ID: 120304
Summary: SPARC lacks __float128 support
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: ro at gcc dot gnu.org
CC: ebotcazou at gcc dot gnu.org, jakub at gcc dot gnu.org,
jsm28 at gcc dot gnu.org, redi at gcc dot gnu.org
Target Milestone: ---
Target: sparc*-*-*
Created attachment 61439
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=61439&action=edit
Proposed patch
Initially, libgcobol needed __float128 support to build. Since SPARC lacks
that, but has 128-bit IEEE long double (at least according to the psABI), I
tought this might be easy to add, so I gave it a try.
The basics proved easy enough, and I'm attaching my current patch. However,
there are/were some issues that need investigation first:
* I initially tried aliasing __float128 to _Float128, but that broke the
libstdc++ build:
In file included from
/vol/gcc/src/git/gcc-iains/libstdc++-v3/include/precompiled/stdc++.h:57:
/var/gcc/cobol/11.4-gcc-64/sparcv9-sun-solaris2.11/libstdc++-v3/include/limits:2096:12:
error: redefinition of ‘struct std::numeric_limits<_Float128>’
2096 | struct numeric_limits<__float128>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
So I went for aliasing long double instead, just like HP-UX/ia64.
* While Solaris/SPARC follows the psABI and uses 128-bit long double,
Linux/sparc64 and NetBSD/sparc differ, requiring -mlong-double-128.
On Linux/sparc64 this doesn't work with -m32 either since the 32-bit libgcc
lacks e.g. __multc3, resulting in many link failures.
* With this patch, there are several remaining testsuite failures, both on
Solaris/sparc and Linux/sparc64:
+FAIL: gcc.dg/torture/float128-mul-underflow.c -O0 execution test
[...]
+FAIL: gcc.dg/torture/float128-truncdf-underflow.c -O0 execution test
[...]
+FAIL: gcc.dg/torture/float128-truncsf-underflow.c -O0 execution test
[...]
at all optimization levels. As it seems, they all abort for the same reason:
/vol/gcc/src/hg/master/local/gcc/testsuite/gcc.dg/torture/float128-mul-underflow.c
17 abort ();
i.e.
if (fetestexcept (FE_UNDERFLOW))
abort ();
I don't yet know what's going on here.