Volunteering/Consulting for libm Development in glibc

Joseph Myers josmyers@redhat.com
Mon Feb 17 21:23:15 GMT 2025


On Mon, 17 Feb 2025, Ayan Shafqat wrote:

> All:
> 
> Thank you very much for the reply.
> 
> On Mon, Feb 17, 2025 at 06:06:30PM +0000, Joseph Myers wrote:
> > On Mon, 17 Feb 2025, Adhemerval Zanella Netto wrote:
> ...
> > Note that most of those are among the more complicated functions to 
> > implement because of the integer arguments (though I think they can all 
> > still be implemented in a type-generic way, so avoiding the need for five 
> > separate implementations for five separate formats including ldbl-128ibm, 
> > but such a type-generic implementation may not be very efficient).  Also I 
> > think Paul's testing of error bounds doesn't cover functions with integer 
> > arguments.
> 
> I am biased towards using different implementation for different
> bit-types. Yes, it can be cumbersome. But, it offers greater
> flexibility. For example, sinf() will require less terms of Taylor
> series than sin(), and sinl() will require more terms than sin(). There
> are more examples like this where it makes sense to have a dedicate
> area for implementing over different bit types.

The basic principle is that we support a function at the same time across 
all architectures, ABIs and floating-point formats.  To get this done in a 
reasonable time (and noting that there are no glibc configurations that 
support all the floating-point formats - no configuration supports both 
the x86/m68k binary64-extended format (ldbl-96), and ldbl-128ibm), it's 
generally convenient to add a function in a patch that contains all the 
boilerplate changes (ABI test baselines, test inputs, etc.) but only one 
implementation - with better implementations for particular formats then 
able to be added later incrementally.  (But given limited interest in 
ldbl-128ibm nowadays, it's quite likely no-one is going to add a better 
implementation for that format, for example, in which case it will remain 
using the type-generic implementation.)  The type-generic implementation 
typically builds on top of other functions that already exist (some of 
which may have format-specific implementations).

> > Adding support for _Float16, which I haven't started on yet, would also be 
> > a rather complicated change to ensure the support is completed everywhere 
> > in glibc (although there most functions, apart from a few such as fmaf16 
> > with double-rounding issues, can initially be implemented as wrappers for 
> > float functions then be changed incrementally to more efficient 
> > implementations).
> 
> I do have access to ARM (Aarch64) CPUs that are capable of processing
> _Float16. I should be able to help there. On the x86_64 side, the only
> machine that has *some* _Float16 support would be an Alderlake CPU,
> which can only convert _float16 to _Float32 in hardware, and do the

I believe the first conversion support (F16C) was added in Ivy Bridge.

> internal calculation in _Float32. What is the goal for supporting
> _Float16 for machines without FP16 hardware? If the goal is to emulate,
> then yes, I can see how it may get very complicated.

This has little to do with hardware support, since the underlying 
arithmetic is the compiler's problem.  What it does require is finding all 
the tests (especially for string conversions etc.) that cover existing 
formats and adding corresponding inputs also for the binary16 format, for 
example - in libm, that includes going through auto-libm-test-in and 
trying to add corresponding binary16 inputs where the tests try to cover 
special cases for other formats (and also where applicable for manually 
written tests in libm-test-*.inc).

(There are also other test considerations such as arranging for tests of 
_Float16 on 32-bit x86 to run only when SSE is available, since the ABI 
for _Float16 there requires SSE.)

The C standard expects that where _Float16 is supported in the compiler 
(whether in hardware or not), it's also supported in the library.  glibc 
has a particular set of functions supported for each ABI, so if we add 
_Float16 functions to the glibc ABI for x86_64, that means they are 
provided by glibc on x86_64 regardless of hardware support (and that GCC 
12 or later is then needed to build glibc for x86_64).

If we add _Float16 support at different times (different glibc versions) 
on different architectures, and new libm functions are added between those 
times, there is the additional complication of needing to add a MAX 
operator for use in Versions files to determine the symbol version that 
such _Float16 functions get on a given architecture.  (This is an argument 
for completing all the other C23 libm functions - including the 
string-to-encoding, string-from-encoding and encoding conversion 
functions, and the fromfp type changes - before adding _Float16 support, 
although that probably wouldn't avoid MAX support indefinitely given C2Y 
could well add more libm functions.)

-- 
Joseph S. Myers
josmyers@redhat.com



More information about the Libc-alpha mailing list