fix FLT_ROUNDS to reflect the current rounding mode
authorSzabolcs Nagy <nsz@port70.net>
Sat, 7 Mar 2015 10:00:37 +0000 (11:00 +0100)
committerRich Felker <dalias@aerifal.cx>
Sat, 7 Mar 2015 17:05:28 +0000 (12:05 -0500)
Implemented as a wrapper around fegetround introducing a new function
to the ABI: __flt_rounds. (fegetround cannot be used directly from float.h)

arch/arm/bits/float.h
arch/i386/bits/float.h
arch/microblaze/bits/float.h
arch/mips/bits/float.h
arch/or1k/bits/float.h
arch/powerpc/bits/float.h
arch/sh/bits/float.h
arch/x32/bits/float.h
arch/x86_64/bits/float.h
include/float.h
src/fenv/__flt_rounds.c [new file with mode: 0644]

index ec46b94bad63262fb3e246a5d567a3ac92c34009..c4a655e7b58c131274d2d558d3a85b167e14fa04 100644 (file)
@@ -1,4 +1,3 @@
-#define FLT_ROUNDS 1
 #define FLT_EVAL_METHOD 0
 
 #define LDBL_TRUE_MIN 4.94065645841246544177e-324L
index c356cba9217f5b4080a671d592fd07049fe3a4ce..dd6e40298f0a93b4a26a2a4827766e5517a53e58 100644 (file)
@@ -1,4 +1,3 @@
-#define FLT_ROUNDS 1
 #ifdef __FLT_EVAL_METHOD__
 #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
 #else
index ec46b94bad63262fb3e246a5d567a3ac92c34009..c4a655e7b58c131274d2d558d3a85b167e14fa04 100644 (file)
@@ -1,4 +1,3 @@
-#define FLT_ROUNDS 1
 #define FLT_EVAL_METHOD 0
 
 #define LDBL_TRUE_MIN 4.94065645841246544177e-324L
index ec46b94bad63262fb3e246a5d567a3ac92c34009..c4a655e7b58c131274d2d558d3a85b167e14fa04 100644 (file)
@@ -1,4 +1,3 @@
-#define FLT_ROUNDS 1
 #define FLT_EVAL_METHOD 0
 
 #define LDBL_TRUE_MIN 4.94065645841246544177e-324L
index ec46b94bad63262fb3e246a5d567a3ac92c34009..c4a655e7b58c131274d2d558d3a85b167e14fa04 100644 (file)
@@ -1,4 +1,3 @@
-#define FLT_ROUNDS 1
 #define FLT_EVAL_METHOD 0
 
 #define LDBL_TRUE_MIN 4.94065645841246544177e-324L
index ec46b94bad63262fb3e246a5d567a3ac92c34009..c4a655e7b58c131274d2d558d3a85b167e14fa04 100644 (file)
@@ -1,4 +1,3 @@
-#define FLT_ROUNDS 1
 #define FLT_EVAL_METHOD 0
 
 #define LDBL_TRUE_MIN 4.94065645841246544177e-324L
index ec46b94bad63262fb3e246a5d567a3ac92c34009..c4a655e7b58c131274d2d558d3a85b167e14fa04 100644 (file)
@@ -1,4 +1,3 @@
-#define FLT_ROUNDS 1
 #define FLT_EVAL_METHOD 0
 
 #define LDBL_TRUE_MIN 4.94065645841246544177e-324L
index 9ea29914a2a7776dbeaf4c56d768fe3199191750..4d8e78641bddafbb8376e016170485b5a9fc4a32 100644 (file)
@@ -1,4 +1,3 @@
-#define FLT_ROUNDS 1
 #ifdef __FLT_EVAL_METHOD__
 #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
 #else
index 9ea29914a2a7776dbeaf4c56d768fe3199191750..4d8e78641bddafbb8376e016170485b5a9fc4a32 100644 (file)
@@ -1,4 +1,3 @@
-#define FLT_ROUNDS 1
 #ifdef __FLT_EVAL_METHOD__
 #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
 #else
index 161e167c0e1f1221505842f5dc78daa79acbe243..c6429d33c805364191f8ce5530c2eb7cd8c5992c 100644 (file)
@@ -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 (file)
index 0000000..ec0b368
--- /dev/null
@@ -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;
+}