diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-04-13 22:55:06 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-04-13 22:55:16 +0200 |
| commit | 34f7571269581bd9393f30eeaab3f46d59cb30dd (patch) | |
| tree | 6608fe956e85347269dc3f902994b16e73c5b4a1 /src | |
| parent | dc9144f8f4b15f74c987e0fb0970a501001a03d0 (diff) | |
| download | box64-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.c | 2 | ||||
| -rw-r--r-- | src/emu/x64runf20f.c | 10 | ||||
| -rwxr-xr-x | src/include/debug.h | 1 | ||||
| -rwxr-xr-x | src/main.c | 10 |
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) { |