libm: Set math_errhandling to match library and hardware [v2]

math_errhandling is specified to contain two bits of information:

 1. MATH_ERRNO     -- Set when the library sets errno
 2. MATH_ERREXCEPT -- Set when math operations report exceptions

MATH_ERRNO should match whether the original math code is compiled in
_IEEE_LIBM mode and the new math code has WANT_ERRNO == 1.

MATH_ERREXCEPT should match whether the underlying hardware has
exception support. This patch adds configurations of this value for
RISC-V, ARM, Aarch64, x86 and x86_64 when using HW float.

Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Keith Packard via Newlib 2020-08-04 08:04:39 -07:00 committed by Corinna Vinschen
parent bb166cfc3e
commit 45efe659b8
2 changed files with 22 additions and 1 deletions

View File

@ -87,6 +87,9 @@
# define __IEEE_BYTES_LITTLE_ENDIAN # define __IEEE_BYTES_LITTLE_ENDIAN
# endif # endif
#endif #endif
#ifndef __SOFTFP__
# define _SUPPORTS_ERREXCEPT
#endif
#endif #endif
#if defined (__aarch64__) #if defined (__aarch64__)
@ -96,6 +99,9 @@
#define __IEEE_BIG_ENDIAN #define __IEEE_BIG_ENDIAN
#endif #endif
#define __OBSOLETE_MATH_DEFAULT 0 #define __OBSOLETE_MATH_DEFAULT 0
#ifdef __ARM_FP
# define _SUPPORTS_ERREXCEPT
#endif
#endif #endif
#ifdef __epiphany__ #ifdef __epiphany__
@ -189,10 +195,14 @@
#ifdef __i386__ #ifdef __i386__
#define __IEEE_LITTLE_ENDIAN #define __IEEE_LITTLE_ENDIAN
# define _SUPPORTS_ERREXCEPT
#endif #endif
#ifdef __riscv #ifdef __riscv
#define __IEEE_LITTLE_ENDIAN #define __IEEE_LITTLE_ENDIAN
#ifdef __riscv_flen
# define _SUPPORTS_ERREXCEPT
#endif
#endif #endif
#ifdef __i960__ #ifdef __i960__
@ -386,6 +396,7 @@
#ifdef __x86_64__ #ifdef __x86_64__
#define __IEEE_LITTLE_ENDIAN #define __IEEE_LITTLE_ENDIAN
# define _SUPPORTS_ERREXCEPT
#endif #endif
#ifdef __mep__ #ifdef __mep__

View File

@ -188,7 +188,17 @@ extern int isnan (double);
# define MATH_ERREXCEPT 2 # define MATH_ERREXCEPT 2
#endif #endif
#ifndef math_errhandling #ifndef math_errhandling
# define math_errhandling MATH_ERRNO # ifdef _IEEE_LIBM
# define _MATH_ERRHANDLING_ERRNO 0
# else
# define _MATH_ERRHANDLING_ERRNO MATH_ERRNO
# endif
# ifdef _SUPPORTS_ERREXCEPT
# define _MATH_ERRHANDLING_ERREXCEPT MATH_ERREXCEPT
# else
# define _MATH_ERRHANDLING_ERREXCEPT 0
# endif
# define math_errhandling (_MATH_ERRHANDLING_ERRNO | _MATH_ERRHANDLING_ERREXCEPT)
#endif #endif
extern int __isinff (float x); extern int __isinff (float x);