diff options
author | Kevin Ryde <user42@zip.com.au> | 2003-06-28 01:25:45 +0200 |
---|---|---|
committer | Kevin Ryde <user42@zip.com.au> | 2003-06-28 01:25:45 +0200 |
commit | 70bb3e6e5a826f92706a8fd13843a95656d6f0e5 (patch) | |
tree | a92a23238e96bbcc044c8cf6ee9571e41af19402 /tests/misc.c | |
parent | e493b0f958b6942bb0d002b0ba9efe7142c57305 (diff) | |
download | gmp-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.c | 40 |
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; +} |