summaryrefslogtreecommitdiff
path: root/tests/misc.c
diff options
context:
space:
mode:
authorKevin Ryde <user42@zip.com.au>2003-06-28 01:25:45 +0200
committerKevin Ryde <user42@zip.com.au>2003-06-28 01:25:45 +0200
commit70bb3e6e5a826f92706a8fd13843a95656d6f0e5 (patch)
treea92a23238e96bbcc044c8cf6ee9571e41af19402 /tests/misc.c
parente493b0f958b6942bb0d002b0ba9efe7142c57305 (diff)
downloadgmp-70bb3e6e5a826f92706a8fd13843a95656d6f0e5.tar.gz
* tests/misc.c, tests/tests.h (tests_hardware_getround,
tests_hardware_setround): New functions.
Diffstat (limited to 'tests/misc.c')
-rw-r--r--tests/misc.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/tests/misc.c b/tests/misc.c
index 5a5a46f34..55d8153e3 100644
--- a/tests/misc.c
+++ b/tests/misc.c
@@ -428,3 +428,43 @@ tests_infinity_d (void)
return 0;
#endif
}
+
+
+/* Set the hardware floating point rounding mode. Same mode values as mpfr,
+ namely 0=nearest, 1=tozero, 2=up, 3=down. Return 1 if successful, 0 if
+ not. */
+int
+tests_hardware_setround (int mode)
+{
+#if HAVE_HOST_CPU_FAMILY_x86
+ int rc;
+ switch (mode) {
+ case 0: rc = 0; break; /* nearest */
+ case 1: rc = 3; break; /* tozero */
+ case 2: rc = 2; break; /* up */
+ case 3: rc = 1; break; /* down */
+ default:
+ return 0;
+ }
+ x86_fldcw ((x86_fstcw () & ~0xC00) | (rc << 10));
+ return 1;
+#endif
+
+ return 0;
+}
+
+/* Return the hardware floating point rounding mode, or -1 if unknown. */
+int
+tests_hardware_getround (void)
+{
+#if HAVE_HOST_CPU_FAMILY_x86
+ switch ((x86_fstcw () & ~0xC00) >> 10) {
+ case 0: return 0; break; /* nearest */
+ case 1: return 3; break; /* down */
+ case 2: return 2; break; /* up */
+ case 3: return 1; break; /* tozero */
+ }
+#endif
+
+ return -1;
+}