about summary refs log tree commit diff stats
path: root/src/emu/x64runf30f.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/x64runf30f.c')
-rw-r--r--src/emu/x64runf30f.c13
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;