diff options
author | Szabolcs Nagy <nsz@port70.net> | 2015-03-07 11:00:37 +0100 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2015-03-07 12:05:28 -0500 |
commit | 559de8f5f06da9022cbba70e22e14a710eb74513 (patch) | |
tree | f8980299d0f0a77f4a613c2fc58ada81b789aa66 | |
parent | bd67959f3ad5049c35af0a0e2f8f1a1e60577a49 (diff) | |
download | musl-559de8f5f06da9022cbba70e22e14a710eb74513.tar.gz musl-559de8f5f06da9022cbba70e22e14a710eb74513.tar.xz musl-559de8f5f06da9022cbba70e22e14a710eb74513.zip |
fix FLT_ROUNDS to reflect the current rounding mode
Implemented as a wrapper around fegetround introducing a new function to the ABI: __flt_rounds. (fegetround cannot be used directly from float.h)
-rw-r--r-- | arch/arm/bits/float.h | 1 | ||||
-rw-r--r-- | arch/i386/bits/float.h | 1 | ||||
-rw-r--r-- | arch/microblaze/bits/float.h | 1 | ||||
-rw-r--r-- | arch/mips/bits/float.h | 1 | ||||
-rw-r--r-- | arch/or1k/bits/float.h | 1 | ||||
-rw-r--r-- | arch/powerpc/bits/float.h | 1 | ||||
-rw-r--r-- | arch/sh/bits/float.h | 1 | ||||
-rw-r--r-- | arch/x32/bits/float.h | 1 | ||||
-rw-r--r-- | arch/x86_64/bits/float.h | 1 | ||||
-rw-r--r-- | include/float.h | 3 | ||||
-rw-r--r-- | src/fenv/__flt_rounds.c | 19 |
11 files changed, 22 insertions, 9 deletions
diff --git a/arch/arm/bits/float.h b/arch/arm/bits/float.h index ec46b94b..c4a655e7 100644 --- a/arch/arm/bits/float.h +++ b/arch/arm/bits/float.h @@ -1,4 +1,3 @@ -#define FLT_ROUNDS 1 #define FLT_EVAL_METHOD 0 #define LDBL_TRUE_MIN 4.94065645841246544177e-324L diff --git a/arch/i386/bits/float.h b/arch/i386/bits/float.h index c356cba9..dd6e4029 100644 --- a/arch/i386/bits/float.h +++ b/arch/i386/bits/float.h @@ -1,4 +1,3 @@ -#define FLT_ROUNDS 1 #ifdef __FLT_EVAL_METHOD__ #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ #else diff --git a/arch/microblaze/bits/float.h b/arch/microblaze/bits/float.h index ec46b94b..c4a655e7 100644 --- a/arch/microblaze/bits/float.h +++ b/arch/microblaze/bits/float.h @@ -1,4 +1,3 @@ -#define FLT_ROUNDS 1 #define FLT_EVAL_METHOD 0 #define LDBL_TRUE_MIN 4.94065645841246544177e-324L diff --git a/arch/mips/bits/float.h b/arch/mips/bits/float.h index ec46b94b..c4a655e7 100644 --- a/arch/mips/bits/float.h +++ b/arch/mips/bits/float.h @@ -1,4 +1,3 @@ -#define FLT_ROUNDS 1 #define FLT_EVAL_METHOD 0 #define LDBL_TRUE_MIN 4.94065645841246544177e-324L diff --git a/arch/or1k/bits/float.h b/arch/or1k/bits/float.h index ec46b94b..c4a655e7 100644 --- a/arch/or1k/bits/float.h +++ b/arch/or1k/bits/float.h @@ -1,4 +1,3 @@ -#define FLT_ROUNDS 1 #define FLT_EVAL_METHOD 0 #define LDBL_TRUE_MIN 4.94065645841246544177e-324L diff --git a/arch/powerpc/bits/float.h b/arch/powerpc/bits/float.h index ec46b94b..c4a655e7 100644 --- a/arch/powerpc/bits/float.h +++ b/arch/powerpc/bits/float.h @@ -1,4 +1,3 @@ -#define FLT_ROUNDS 1 #define FLT_EVAL_METHOD 0 #define LDBL_TRUE_MIN 4.94065645841246544177e-324L diff --git a/arch/sh/bits/float.h b/arch/sh/bits/float.h index ec46b94b..c4a655e7 100644 --- a/arch/sh/bits/float.h +++ b/arch/sh/bits/float.h @@ -1,4 +1,3 @@ -#define FLT_ROUNDS 1 #define FLT_EVAL_METHOD 0 #define LDBL_TRUE_MIN 4.94065645841246544177e-324L diff --git a/arch/x32/bits/float.h b/arch/x32/bits/float.h index 9ea29914..4d8e7864 100644 --- a/arch/x32/bits/float.h +++ b/arch/x32/bits/float.h @@ -1,4 +1,3 @@ -#define FLT_ROUNDS 1 #ifdef __FLT_EVAL_METHOD__ #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ #else diff --git a/arch/x86_64/bits/float.h b/arch/x86_64/bits/float.h index 9ea29914..4d8e7864 100644 --- a/arch/x86_64/bits/float.h +++ b/arch/x86_64/bits/float.h @@ -1,4 +1,3 @@ -#define FLT_ROUNDS 1 #ifdef __FLT_EVAL_METHOD__ #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ #else diff --git a/include/float.h b/include/float.h index 161e167c..c6429d33 100644 --- a/include/float.h +++ b/include/float.h @@ -1,6 +1,9 @@ #ifndef _FLOAT_H #define _FLOAT_H +int __flt_rounds(void); +#define FLT_ROUNDS (__flt_rounds()) + #define FLT_RADIX 2 #define FLT_TRUE_MIN 1.40129846432481707092e-45F diff --git a/src/fenv/__flt_rounds.c b/src/fenv/__flt_rounds.c new file mode 100644 index 00000000..ec0b3689 --- /dev/null +++ b/src/fenv/__flt_rounds.c @@ -0,0 +1,19 @@ +#include <float.h> +#include <fenv.h> + +int __flt_rounds() +{ + switch (fegetround()) { +#ifdef FE_TOWARDZERO + case FE_TOWARDZERO: return 0; +#endif + case FE_TONEAREST: return 1; +#ifdef FE_UPWARD + case FE_UPWARD: return 2; +#endif +#ifdef FE_DOWNWARD + case FE_DOWNWARD: return 3; +#endif + } + return -1; +} |