diff options
Diffstat (limited to 'src/emu/x64runf30f.c')
| -rw-r--r-- | src/emu/x64runf30f.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c index d5b70b20..bd7c97e9 100644 --- a/src/emu/x64runf30f.c +++ b/src/emu/x64runf30f.c @@ -3,6 +3,7 @@ #include <stdio.h> #include <stdlib.h> #include <math.h> +#include <fenv.h> #include <string.h> #include <signal.h> #include <sys/types.h> @@ -119,9 +120,13 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr) GD->q[0] = 0x8000000000000000LL; else switch(emu->mxcsr.f.MXCSR_RC) { - case ROUND_Nearest: + case ROUND_Nearest: { + int round = fegetround(); + fesetround(FE_TONEAREST); GD->sq[0] = nearbyintf(EX->f[0]); + fesetround(round); break; + } case ROUND_Down: GD->sq[0] = floorf(EX->f[0]); break; @@ -137,9 +142,13 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr) tmp64s = INT32_MIN; else switch(emu->mxcsr.f.MXCSR_RC) { - case ROUND_Nearest: + case ROUND_Nearest: { + int round = fegetround(); + fesetround(FE_TONEAREST); tmp64s = nearbyintf(EX->f[0]); + fesetround(round); break; + } case ROUND_Down: tmp64s = floorf(EX->f[0]); break; |