[PATCH] Remove matherr, and SVID and X/Open math library configurations

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[PATCH] Remove matherr, and SVID and X/Open math library configurations

Jozef Lawrynowicz
The attached patch removes support for the "matherr" error handling function
from the floating-point arithmetic routines in libm.

matherr is a relic of SVID and has been obsolete in glibc for a while (at least
a few years as far as I can tell), and was removed completely earlier this
year.

With the removal of matherr, "struct exception" (defined in
libc/include/math.h) can also be removed, along with the enums for exception
types (DOMAIN, SING, OVERFLOW etc.). Furthermore, the SVID and X/Open math
library configurations are now redundant, so these have also been removed.
IEEE and POSIX are now the two choices for the math library configuration, with
IEEE being the default.
I've updated the documentation in libm.texinfo and math.tex accordingly.

In addition to simplified wrapper functions for floating-point arithmetic in
libm, the changes also significantly reduce code size for the single-precision
float versions of the arithmetic functions. Members of "struct exception" were
defined as doubles, so casting from the float values in the artihmetic
function to the double values in "struct exception" required double conversion
routines to be linked in.

For example, in a simple C program calling
  powf (float_var, 2.42f)
the following size reductions were observed:

msp430-elf text size
before: 11448
after: 9256

arm cortex-m4 text size
before: 13188
after: 11348

(flags used were -Os -Wl,-gc-sections)

A further trivial change I made in some of the math functions was to replace
instances of floating-point constants being cast to float, with the float
version of the constant e.g.
-       if (float_var <= (float)0.0)
+       if (float_var <= 0.0f)
Also fixed double divides in float arithmetic functions e.g.
-       return 0.0/0.0;
+       return 0.0f/0.0f;

There are further cases of double constants being used in float functions (e.g.
HUGE_VAL instead of HUGE_VALF) which I'll try and fix soon.

Successfully regtested the GCC, G++, libstdc++-v3 and Newlib testsuites for
arm-unknown-eabi and msp430-elf.
Successfully regtested the Newlib testsuite for Cygwin also.

If this patch is acceptable I would appreciate if someone would apply it for
me, as I do not have write access. I guess the body of this email would suffice
for the commit message, but let me know if a more concise one is required.

Thanks,
Jozef

0001-Newlib-Remove-matherr-and-SVID-and-X-Open-math-libra.patch (139K) Download Attachment