about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-04-13 22:55:06 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-04-13 22:55:16 +0200
commit34f7571269581bd9393f30eeaab3f46d59cb30dd (patch)
tree6608fe956e85347269dc3f902994b16e73c5b4a1 /src
parentdc9144f8f4b15f74c987e0fb0970a501001a03d0 (diff)
downloadbox64-34f7571269581bd9393f30eeaab3f46d59cb30dd.tar.gz
box64-34f7571269581bd9393f30eeaab3f46d59cb30dd.zip
[DYNAREC] Added option to force x87 to use double (ported from box86)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_d9.c2
-rw-r--r--src/emu/x64runf20f.c10
-rwxr-xr-xsrc/include/debug.h1
-rwxr-xr-xsrc/main.c10
4 files changed, 22 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_d9.c b/src/dynarec/arm64/dynarec_arm64_d9.c
index 4a24504f..d236b2fd 100644
--- a/src/dynarec/arm64/dynarec_arm64_d9.c
+++ b/src/dynarec/arm64/dynarec_arm64_d9.c
@@ -314,7 +314,7 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             switch((nextop>>3)&7) {
                 case 0:
                     INST_NAME("FLD ST0, float[ED]");
-                    v1 = x87_do_push(dyn, ninst, x1, NEON_CACHE_ST_F);
+                    v1 = x87_do_push(dyn, ninst, x1, box64_dynarec_x87double?NEON_CACHE_ST_D:NEON_CACHE_ST_F);
                     if(ST_IS_F(0))
                         s0 = v1;
                     else
diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c
index c441ee27..3ecf43ef 100644
--- a/src/emu/x64runf20f.c
+++ b/src/emu/x64runf20f.c
@@ -32,6 +32,9 @@ int RunF20F(x64emu_t *emu, rex_t rex)
     reg64_t *oped, *opgd;

     sse_regs_t *opex, *opgx, eax1;

     mmx87_regs_t *opgm;

+    #ifndef NOALIGN

+    int is_nan;

+    #endif

 

     opcode = F8;

 

@@ -172,7 +175,14 @@ int RunF20F(x64emu_t *emu, rex_t rex)
         nextop = F8;

         GETEX(0);

         GETGX;

+        #ifndef NOALIGN

+        is_nan = isnan(GX->d[0]) || isnan(EX->d[0]);

+        #endif

         GX->d[0] /= EX->d[0];

+        #ifndef NOALIGN

+        if(!is_nan && isnan(GX->d[0]))

+            GX->d[0] = -NAN;

+        #endif

         break;

     case 0x5F:  /* MAXSD Gx, Ex */

         nextop = F8;

diff --git a/src/include/debug.h b/src/include/debug.h
index b8ce4995..87d03a2d 100755
--- a/src/include/debug.h
+++ b/src/include/debug.h
@@ -16,6 +16,7 @@ extern uintptr_t box64_nodynarec_start, box64_nodynarec_end;
 extern int box64_dynarec_bigblock;
 extern int box64_dynarec_strongmem;
 extern int box64_dynarec_fastnan;
+extern int box64_dynarec_x87double;
 #ifdef ARM64
 extern int arm64_asimd;
 extern int arm64_aes;
diff --git a/src/main.c b/src/main.c
index 777641ee..a58bb5b0 100755
--- a/src/main.c
+++ b/src/main.c
@@ -45,6 +45,7 @@ int box64_dynarec_dump = 0;
 int box64_dynarec_forced = 0;
 int box64_dynarec_bigblock = 1;
 int box64_dynarec_strongmem = 0;
+int box64_dynarec_x87double = 0;
 int box64_dynarec_fastnan = 0;
 uintptr_t box64_nodynarec_start = 0;
 uintptr_t box64_nodynarec_end = 0;
@@ -409,6 +410,15 @@ void LoadLogEnv()
         if(box64_dynarec_strongmem)
             printf_log(LOG_INFO, "Dynarec will try to emulate a strong memory model%s\n", (box64_dynarec_strongmem==1)?" with limited performance loss":"");
     }
+    p = getenv("BOX64_DYNAREC_X87DOUBLE");
+    if(p) {
+        if(strlen(p)==1) {
+            if(p[0]>='0' && p[0]<='1')
+                box64_dynarec_x87double = p[0]-'0';
+        }
+        if(box64_dynarec_x87double)
+            printf_log(LOG_INFO, "Dynarec will use only double for x87 emulation\n");
+    }
     p = getenv("BOX64_DYNAREC_FASTNAN");
     if(p) {
         if(strlen(p)==1) {