What is the portable 128-bit floating point type?

Dimitry Andric dim at FreeBSD.org
Sat May 25 21:31:02 UTC 2019


On 25 May 2019, at 23:03, Konstantin Belousov <kostikbel at gmail.com> wrote:
> 
> On Sat, May 25, 2019 at 01:50:24PM -0700, Yuri wrote:
>> On 2019-05-25 13:04, Konstantin Belousov wrote:
>>> Neither i386 nor amd64 have hardware-supported 128 bit floating point
>>> type. long double is defined by both i386 and amd64 Unix ABI as 80 bits
>>> (10 bytes) representation as defined by IEEEE FP standard and supported
>>> by x87 FPU (not-SSE). The difference in size is due to the different
>>> natural alignment between 32 and 64 bit ISA.
>> 
>> 
>> So it looks like there is no true quad-precision float available.
>> 
>> 
>> Based on this conversation https://github.com/bluescarni/mppp/issues/186
>> FreeBSD used to support __float128. Why was it removed?
> No idea, it seems to be clang-specific.  gcc 8.3 does accept the type.

Gcc appears to support __float128 since ~2007, roughly from gcc 4.3
onwards:

  https://gcc.gnu.org/onlinedocs/gcc-4.3.6/gcc/Floating-Types.html

There it says "__float128 is supported on x86_64 and ia64 targets", but
in the most recent version:

  https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html

it says "__float128 is available on i386, x86_64, IA-64, and hppa HP-UX,
as well as on PowerPC GNU/Linux targets that enable the vector scalar
(VSX) instruction set".

Of course it is also dependent on libgcc, if the hardware does not have
native support for this float width.

Clang modeled its support on gcc's example, and similarly the library
support is in compiler-rt, at least for x86_64 and some other
architectures.

But from clang's OSTargets.h file, it looks like 128 bit float support
is never set to enabled for FreeBSD.


> On the other hand, I have no idea if any support is required from
> libgcc (probably it is), and we almost certainly do not have it in
> the base library.

In libcompiler_rt, it's only enabled for aarch64 and riscv:

#
# 128-bit quad precision long double support,
# only used on some architectures.
#
.if ${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "riscv"
SRCF+=          addtf3
SRCF+=          comparetf2
SRCF+=          divtf3
SRCF+=          extenddftf2
SRCF+=          extendsftf2
SRCF+=          fixtfdi
SRCF+=          fixtfsi
SRCF+=          fixtfti
SRCF+=          fixunstfdi
SRCF+=          fixunstfsi
SRCF+=          fixunstfti
SRCF+=          floatunsitf
SRCF+=          multf3
SRCF+=          subtf3
SRCF+=          trunctfdf2
SRCF+=          trunctfsf2
.endif

-Dimitry

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 223 bytes
Desc: Message signed with OpenPGP
URL: <http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20190525/1c089a07/attachment.sig>


More information about the freebsd-hackers mailing list