revamp ada.numerics.aux
authorAlexandre Oliva <oliva@adacore.com>
Sun, 18 Oct 2020 20:19:53 +0000 (17:19 -0300)
committerAlexandre Oliva <oliva@gnu.org>
Sun, 18 Oct 2020 20:19:53 +0000 (17:19 -0300)
commit1e70b1a358b6ce3b894f284d88fbb90518d45cc0
treec944e5cf3eb433dcea8fbc2ad4a850c7d38846cc
parent476036b35c5e9203735b19b9967ff0e9932c8c31
revamp ada.numerics.aux

Instead of mapping elementary functions for all types to a single
type, use the intrinsics available for the various base types.

A new Ada.Numerics.Aux_Generic_Float is introduced to explicitly
dispatch, based on the 'Digits attribute of the base type, to the
various newly-added Aux_Short_Float, Aux_Float, Aux_Long_Float, or
Aux_Long_Long_Float.

The Aux_Short_Float unit is implemented in terms of the Aux_Float one,
and the others rely on the elementary functions from the C Math
library for float, double and long double types, respectively.

An Aux_Linker_Options is added, and units that import intrinsics from
libm/libc depend on it to provide the "-lm" linker option if needed.
The option is provided by default, but there is an alternate version
that doesn't, that is used for vxworks targets.

The Aux variant that used to open-code Sin and Cos for the ancient
ppc-darwin, because of insufficient precision in libc, is dropped,
along with the alternate dummy body for Aux.  Both are presumed no
longer needed.

The original Ada.Numerics.Aux is retained, for backward compatibility,
as a wrapper for a newly-added Aux_Compat, that renames
Aux_Long_Float, except on x86, in which an alternate version renames
Aux_Long_Long_Float.

Generic_Elementary_Functions and Generic_Complex_Types are adjusted to
use Aux_Generic_Float, avoiding the type conversions and inefficiencies of
computing results in higher precision than requested.

Generic_Complex_Elementary_Functions is adjusted to enable an
additional instance of the sincos optimization, even without -gnatn.

for  gcc/ada/ChangeLog

* Makefile.rtl (GNATRTL_NONTASKING_OBJS): Compile Ada.Numerics
child units Aux_Generic_Float, Aux_Long_Long_Float, Aux_Long_Float,
Aux_Float, Aux_Short_Float, Aux_Compat, and Aux_Linker_Options.
(X86_TARGET_PAIRS): Drop dummy body for Aux.  Use x86 version
of Aux_Compat.
(X86_64_TARGET_PAIRS): Likewise.
(LIBGNAT_TARGET_PAIRS): On VxWorks, select the nolibm
variants.  Drop the darwin version of Aux.  Drop the redundant
libc-x86 numaux variants on x86* kfreebsd variants.
* libgnat/a-nagefl.ads: New Aux_Generic_Float.
* libgnat/a-naliop.ads: New Aux_Linker_Options.
* libgnat/a-naliop__nolibm.ads: New.
* libgnat/a-nallfl.ads: New Aux_Long_Long_Float.
* libgnat/a-nalofl.ads: New Aux_Long_Float.
* libgnat/a-nuaufl.ads: New Aux_Float.
* libgnat/a-nashfl.ads: New Aux_Short_Float.
* libgnat/a-ngcefu.adb (Exp): Factor out the Im (X) passed to
Sin and Cos in the Complex variant too.
* libgnat/a-ngcoty.adb: Switch to Aux_Generic_Float.  Drop
redundant conversions.
* libgnat/a-ngelfu.adb: Likewise.
* libgnat/a-nuauco.ads: New Aux_Compat.
* libgnat/a-nuauco__x86.ads: New.
* libgnat/a-numaux.ads: Replace with Compat wrapper.
* libgnat/a-numaux__darwin.adb: Remove.
* libgnat/a-numaux__darwin.ads: Remove.
* libgnat/a-numaux__dummy.adb: Remove.
* libgnat/a-numaux__libc-x86.ads: Remove.
* libgnat/a-numaux__vxworks.ads: Remove.
19 files changed:
gcc/ada/Makefile.rtl
gcc/ada/libgnat/a-nagefl.ads [new file with mode: 0644]
gcc/ada/libgnat/a-naliop.ads [new file with mode: 0644]
gcc/ada/libgnat/a-naliop__nolibm.ads [new file with mode: 0644]
gcc/ada/libgnat/a-nallfl.ads [new file with mode: 0644]
gcc/ada/libgnat/a-nalofl.ads [new file with mode: 0644]
gcc/ada/libgnat/a-nashfl.ads [new file with mode: 0644]
gcc/ada/libgnat/a-ngcefu.adb
gcc/ada/libgnat/a-ngcoty.adb
gcc/ada/libgnat/a-ngelfu.adb
gcc/ada/libgnat/a-nuauco.ads [new file with mode: 0644]
gcc/ada/libgnat/a-nuauco__x86.ads [new file with mode: 0644]
gcc/ada/libgnat/a-nuaufl.ads [new file with mode: 0644]
gcc/ada/libgnat/a-numaux.ads
gcc/ada/libgnat/a-numaux__darwin.adb [deleted file]
gcc/ada/libgnat/a-numaux__darwin.ads [deleted file]
gcc/ada/libgnat/a-numaux__dummy.adb [deleted file]
gcc/ada/libgnat/a-numaux__libc-x86.ads [deleted file]
gcc/ada/libgnat/a-numaux__vxworks.ads [deleted file]