Continuing the preparation for additional _FloatN / _FloatNx function
aliases, this patch makes sparc libm function implementations use
libm_alias_double to define function aliases (with consequent
simplification where compat symbol handling is now done by those
macros rather than locally in architecture-specific code).
Tested with build-many-glibcs.py for all its sparc configurations that
installed stripped shared libraries are unchanged by the patch.
* sysdeps/sparc/sparc32/fpu/s_copysign.S: Include
<libm-alias-double.h>.
(copysign): Define using libm_alias_double.
* sysdeps/sparc/sparc32/fpu/s_fabs.S: Include
<libm-alias-double.h>.
(fabs): Define using libm_alias_double.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.S:
Include <libm-alias-double.h>.
(copysign): Define using libm_alias_double.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.S: Include
<libm-alias-double.h>.
(fabs): Define using libm_alias_double.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.c: Include
<libm-alias-double.h>.
(fdim): Define using libm_alias_double.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c: Include
<libm-alias-double.h>.
(fma): Define using libm_alias_double.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.S: Include
<libm-alias-double.h>.
(llrint): Define using libm_alias_double.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.S:
Include <libm-alias-double.h>.
(nearbyint): Define using libm_alias_double.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.S: Include
<libm-alias-double.h>.
(rint): Define using libm_alias_double.
* sysdeps/sparc/sparc32/sparcv9/fpu/s_fabs.S: Include
<libm-alias-double.h>.
(fabs): Define using libm_alias_double.
* sysdeps/sparc/sparc32/sparcv9/fpu/s_llrint.S: Include
<libm-alias-double.h>.
(llrint): Define using libm_alias_double.
* sysdeps/sparc/sparc32/sparcv9/fpu/s_nearbyint.S: Include
<libm-alias-double.h>.
(nearbyint): Define using libm_alias_double.
* sysdeps/sparc/sparc32/sparcv9/fpu/s_rint.S: Include
<libm-alias-double.h>.
(rint): Define using libm_alias_double.
* sysdeps/sparc/sparc64/fpu/multiarch/s_ceil.c: Include
<libm-alias-double.h>.
(ceil): Define using libm_alias_double.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c: Include
<libm-alias-double.h>.
(floor): Define using libm_alias_double.
* sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c: Include
<libm-alias-double.h>.
(fma): Define using libm_alias_double.
* sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c: Include
<libm-alias-double.h>.
(lrint): Define using libm_alias_double.
(llrint): Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c: Include
<libm-alias-double.h>.
(nearbyint): Define using libm_alias_double.
* sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c: Include
<libm-alias-double.h>.
(rint): Define using libm_alias_double.
* sysdeps/sparc/sparc64/fpu/multiarch/s_trunc.c: Include
<libm-alias-double.h>.
(trunc): Define using libm_alias_double.
* sysdeps/sparc/sparc64/fpu/s_copysign.S: Include
<libm-alias-double.h>.
(copysign): Define using libm_alias_double.
* sysdeps/sparc/sparc64/fpu/s_fabs.c: Include
<libm-alias-double.h>.
(fabs): Define using libm_alias_double.
* sysdeps/sparc/sparc64/fpu/s_lrint.S: Include
<libm-alias-double.h>.
(lrint): Define using libm_alias_double.
(llrint): Likewise.
* sysdeps/sparc/sparc64/fpu/s_nearbyint.S: Include
<libm-alias-double.h>.
(nearbyint): Define using libm_alias_double.
* sysdeps/sparc/sparc64/fpu/s_rint.S: Include
<libm-alias-double.h>.
(rint): Define using libm_alias_double.
nearbyint and nearbyintf should not trigger inexact exceptions, but
should still trigger an invalid exception for a sNaN input.
The SPARC specific implementations of these functions save the FSR at
the beginning of the function and restore it at the end to not trigger
an inexact exception. This however doesn't work for an sNaN input which
need to trigger an invalid exception. Fix that by adding a fcmp
instruction using the input value before saving FSR, so that an invalid
exception is triggered for a sNaN input.
This fixes the math/test-nearbyint-except test on SPARC.
Changelog:
* sparc/sparc32/sparcv9/fpu/s_nearbyint.S (__nearbyint): Trigger an
invalid exception for a sNaN input.
* sparc/sparc32/sparcv9/fpu/s_nearbyintf.S (__nearbyintf): Likewise.
* sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint-vis3.S
(__nearbyint_vis3): Likewise
* sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf-vis3.S
(__nearbyintf_vis3): Likewise
* sparc/sparc64/fpu/s_nearbyint.S (__nearbyint): Likewise.
* sparc/sparc64/fpu/s_nearbyintf.S (__nearbyintf): Likewise.
* sparc/sparc64/fpu/multiarch/s_nearbyint-vis3.S (__nearbyint_vis3):
Likewise.
* sparc/sparc64/fpu/multiarch/s_nearbyintf-vis3.S (__nearbyintf_vis3):
Likewise.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile: Add vis3
nearbyint{,f} to libm-sysdep_routes.
* sysdeps/sparc/sparc64/fpu/multiarch/Makefile: Likewise.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint-vis3.S:
New file.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.S: New
file.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf-vis3.S:
New file.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S: New
file.
* sysdeps/sparc/sparc32/sparcv9/fpu/s_nearbyint.S: New file.
* sysdeps/sparc/sparc32/sparcv9/fpu/s_nearbyintf.S: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint-vis3.S: New
file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf-vis3.S: New
file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S: New file.
* sysdeps/sparc/sparc64/fpu/s_nearbyint.S: New file.
* sysdeps/sparc/sparc64/fpu/s_nearbyintf.S: New file.