diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-04-22 19:31:04 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-22 13:31:04 +0200 |
| commit | ad494480ce5dfdb4c5c712802cdc3668916b2f2c (patch) | |
| tree | ab2f9886828dd428bbdf68290fd0d021a3b1430b /src | |
| parent | 854f6675db48245ebb520b6f6a2caefeefc05e1c (diff) | |
| download | box64-ad494480ce5dfdb4c5c712802cdc3668916b2f2c.tar.gz box64-ad494480ce5dfdb4c5c712802cdc3668916b2f2c.zip | |
[DYNAREC] Added a x87pc test and some cosmetic changes too (#2561)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_d8.c | 36 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_d9.c | 3 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_da.c | 6 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_dc.c | 24 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_de.c | 24 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.h | 14 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_pass0.h | 6 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_pass1.h | 12 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_d8.c | 36 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_d9.c | 3 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_da.c | 6 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_dc.c | 19 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_de.c | 18 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 13 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_pass0.h | 7 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_pass1.h | 14 |
16 files changed, 83 insertions, 158 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_d8.c b/src/dynarec/arm64/dynarec_arm64_d8.c index f7ccac5e..32b26566 100644 --- a/src/dynarec/arm64/dynarec_arm64_d8.c +++ b/src/dynarec/arm64/dynarec_arm64_d8.c @@ -56,9 +56,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FADDS(v1, v1, v2); } else { FADDD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -79,9 +78,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FMULS(v1, v1, v2); } else { FMULD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -139,9 +137,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FSUBS(v1, v1, v2); } else { FSUBD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -162,9 +159,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FSUBS(v1, v2, v1); } else { FSUBD(v1, v2, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -185,9 +181,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FDIVS(v1, v1, v2); } else { FDIVD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -208,9 +203,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FDIVS(v1, v2, v1); } else { FDIVD(v1, v2, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -232,9 +226,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { FCVT_D_S(s0, s0); FADDD(v1, v1, s0); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -251,9 +244,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { FCVT_D_S(s0, s0); FMULD(v1, v1, s0); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -299,9 +291,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { FCVT_D_S(s0, s0); FSUBD(v1, v1, s0); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -318,9 +309,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { FCVT_D_S(s0, s0); FSUBD(v1, s0, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -337,9 +327,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { FCVT_D_S(s0, s0); FDIVD(v1, v1, s0); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -356,9 +345,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { FCVT_D_S(s0, s0); FDIVD(v1, s0, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; diff --git a/src/dynarec/arm64/dynarec_arm64_d9.c b/src/dynarec/arm64/dynarec_arm64_d9.c index cd5a5b78..787b597f 100644 --- a/src/dynarec/arm64/dynarec_arm64_d9.c +++ b/src/dynarec/arm64/dynarec_arm64_d9.c @@ -430,9 +430,8 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FSQRTS(v1, v1); } else { FSQRTD(v1, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; diff --git a/src/dynarec/arm64/dynarec_arm64_da.c b/src/dynarec/arm64/dynarec_arm64_da.c index 40387735..8189f43f 100644 --- a/src/dynarec/arm64/dynarec_arm64_da.c +++ b/src/dynarec/arm64/dynarec_arm64_da.c @@ -151,7 +151,6 @@ uintptr_t dynarec64_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = x87_setround(dyn, ninst, x1, x5, x4); FADDD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -167,7 +166,6 @@ uintptr_t dynarec64_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = x87_setround(dyn, ninst, x1, x5, x4); FMULD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -206,7 +204,6 @@ uintptr_t dynarec64_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = x87_setround(dyn, ninst, x1, x5, x4); FSUBD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -222,7 +219,6 @@ uintptr_t dynarec64_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = x87_setround(dyn, ninst, x1, x5, x4); FSUBD(v1, v2, v1); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -238,7 +234,6 @@ uintptr_t dynarec64_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = x87_setround(dyn, ninst, x1, x5, x4); FDIVD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -254,7 +249,6 @@ uintptr_t dynarec64_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = x87_setround(dyn, ninst, x1, x5, x4); FDIVD(v1, v2, v1); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; diff --git a/src/dynarec/arm64/dynarec_arm64_dc.c b/src/dynarec/arm64/dynarec_arm64_dc.c index 3ff95fe6..ccdff070 100644 --- a/src/dynarec/arm64/dynarec_arm64_dc.c +++ b/src/dynarec/arm64/dynarec_arm64_dc.c @@ -54,9 +54,8 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FADDS(v1, v1, v2); } else { FADDD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -77,9 +76,8 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FMULS(v1, v1, v2); } else { FMULD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -137,9 +135,8 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FSUBS(v1, v2, v1); } else { FSUBD(v1, v2, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -160,9 +157,8 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FSUBS(v1, v1, v2); } else { FSUBD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -183,9 +179,8 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FDIVS(v1, v2, v1); } else { FDIVD(v1, v2, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -206,9 +201,8 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FDIVS(v1, v1, v2); } else { FDIVD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -227,7 +221,6 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = x87_setround(dyn, ninst, x1, x2, x4); FADDD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -241,7 +234,6 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = x87_setround(dyn, ninst, x1, x2, x4); FMULD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -274,7 +266,6 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = x87_setround(dyn, ninst, x1, x2, x4); FSUBD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -288,7 +279,6 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = x87_setround(dyn, ninst, x1, x2, x4); FSUBD(v1, v2, v1); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -302,7 +292,6 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = x87_setround(dyn, ninst, x1, x2, x4); FDIVD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; @@ -316,7 +305,6 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin u8 = x87_setround(dyn, ninst, x1, x2, x4); FDIVD(v1, v2, v1); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; diff --git a/src/dynarec/arm64/dynarec_arm64_de.c b/src/dynarec/arm64/dynarec_arm64_de.c index 2d861f2b..f1754ebb 100644 --- a/src/dynarec/arm64/dynarec_arm64_de.c +++ b/src/dynarec/arm64/dynarec_arm64_de.c @@ -54,9 +54,8 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FADDS(v1, v1, v2); } else { FADDD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); X87_POP_OR_FAIL(dyn, ninst, x3); @@ -78,9 +77,8 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FMULS(v1, v1, v2); } else { FMULD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); X87_POP_OR_FAIL(dyn, ninst, x3); @@ -134,9 +132,8 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FSUBS(v1, v2, v1); } else { FSUBD(v1, v2, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); X87_POP_OR_FAIL(dyn, ninst, x3); @@ -158,9 +155,8 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FSUBS(v1, v1, v2); } else { FSUBD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); X87_POP_OR_FAIL(dyn, ninst, x3); @@ -182,9 +178,8 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FDIVS(v1, v2, v1); } else { FDIVD(v1, v2, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); X87_POP_OR_FAIL(dyn, ninst, x3); @@ -206,9 +201,8 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin FDIVS(v1, v1, v2); } else { FDIVD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if(!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); X87_POP_OR_FAIL(dyn, ninst, x3); @@ -229,7 +223,6 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SCVTFDD(v2, v2); FADDD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); break; case 1: INST_NAME("FIMUL ST0, word[ED]"); @@ -242,7 +235,6 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SCVTFDD(v2, v2); FMULD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); break; case 2: INST_NAME("FICOM ST0, word[ED]"); @@ -280,7 +272,6 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SCVTFDD(v2, v2); FSUBD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); break; case 5: INST_NAME("FISUBR ST0, word[ED]"); @@ -293,7 +284,6 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SCVTFDD(v2, v2); FSUBD(v1, v2, v1); X87_CHECK_PRECISION(v1); - MARK_X87PC(); break; case 6: INST_NAME("FIDIV ST0, word[ED]"); @@ -306,7 +296,6 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SCVTFDD(v2, v2); FDIVD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); break; case 7: INST_NAME("FIDIVR ST0, word[ED]"); @@ -319,7 +308,6 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SCVTFDD(v2, v2); FDIVD(v1, v2, v1); X87_CHECK_PRECISION(v1); - MARK_X87PC(); break; } return addr; diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h index 7cbb8ff1..ded76a69 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.h +++ b/src/dynarec/arm64/dynarec_arm64_helper.h @@ -1006,16 +1006,14 @@ } #endif #ifndef X87_CHECK_PRECISION -#define X87_CHECK_PRECISION(A) \ - if(dyn->need_x87check) { \ - CBNZw(x87pc, 4+8); \ - FCVT_S_D(A, A); \ - FCVT_D_S(A, A); \ +#define X87_CHECK_PRECISION(A) \ + if (!ST_IS_F(0) && dyn->need_x87check) { \ + CBNZw(x87pc, 4 + 8); \ + FCVT_S_D(A, A); \ + FCVT_D_S(A, A); \ } #endif -#ifndef MARK_X87PC -#define MARK_X87PC() -#endif + #define STORE_REG(A) STRx_U12(x##A, xEmu, offsetof(x64emu_t, regs[_##A])) #define STP_REGS(A, B) STPx_S7_offset(x##A, x##B, xEmu, offsetof(x64emu_t, regs[_##A])) #define LDP_REGS(A, B) LDPx_S7_offset(x##A, x##B, xEmu, offsetof(x64emu_t, regs[_##A])) diff --git a/src/dynarec/arm64/dynarec_arm64_pass0.h b/src/dynarec/arm64/dynarec_arm64_pass0.h index 2bd18ac5..d1e6d7d8 100644 --- a/src/dynarec/arm64/dynarec_arm64_pass0.h +++ b/src/dynarec/arm64/dynarec_arm64_pass0.h @@ -74,5 +74,7 @@ #define IF_ALIGNED(A) if(!(dyn->insts[ninst].unaligned=is_addr_unaligned(A))) #define NATIVE_RESTORE_X87PC() -#define X87_CHECK_PRECISION(A) -#define MARK_X87PC() if(dyn->need_x87check) dyn->insts[ninst].x87precision = 1 \ No newline at end of file +#define X87_CHECK_PRECISION(A) \ + do { \ + if (dyn->need_x87check) dyn->insts[ninst].x87precision = 1; \ + } while (0) diff --git a/src/dynarec/arm64/dynarec_arm64_pass1.h b/src/dynarec/arm64/dynarec_arm64_pass1.h index 0f904c61..ba8b11a6 100644 --- a/src/dynarec/arm64/dynarec_arm64_pass1.h +++ b/src/dynarec/arm64/dynarec_arm64_pass1.h @@ -24,9 +24,11 @@ #define INST_NAME(name) #define NATIVE_RESTORE_X87PC() -#define X87_CHECK_PRECISION(A) \ - do { \ - if (dyn->need_x87check) \ - dyn->need_x87check = 2; \ +#define X87_CHECK_PRECISION(A) \ + do { \ + if (dyn->need_x87check) { \ + dyn->insts[ninst].x87precision = 1; \ + if (!ST_IS_F(0)) \ + dyn->need_x87check = 2; \ + } \ } while (0) -#define MARK_X87PC() if(dyn->need_x87check) dyn->insts[ninst].x87precision = 1 \ No newline at end of file diff --git a/src/dynarec/rv64/dynarec_rv64_d8.c b/src/dynarec/rv64/dynarec_rv64_d8.c index 83de0eec..25a8fed5 100644 --- a/src/dynarec/rv64/dynarec_rv64_d8.c +++ b/src/dynarec/rv64/dynarec_rv64_d8.c @@ -52,9 +52,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FADDS(v1, v1, v2); } else { FADDD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 0xC8 ... 0xCF: @@ -66,9 +65,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FMULS(v1, v1, v2); } else { FMULD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 0xD0 ... 0xD7: @@ -101,9 +99,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FSUBS(v1, v1, v2); } else { FSUBD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 0xE8 ... 0xEF: @@ -115,9 +112,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FSUBS(v1, v2, v1); } else { FSUBD(v1, v2, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 0xF0 ... 0xF7: @@ -129,9 +125,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FDIVS(v1, v1, v2); } else { FDIVD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 0xF8 ... 0xFF: @@ -143,9 +138,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FDIVS(v1, v2, v1); } else { FDIVD(v1, v2, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; default: @@ -166,9 +160,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } else { FCVTDS(s0, s0); FADDD(v1, v1, s0); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 1: @@ -183,9 +176,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } else { FCVTDS(s0, s0); FMULD(v1, v1, s0); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 2: @@ -227,9 +219,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } else { FCVTDS(s0, s0); FSUBD(v1, v1, s0); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 5: @@ -244,9 +235,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } else { FCVTDS(s0, s0); FSUBD(v1, s0, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 6: @@ -261,9 +251,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } else { FCVTDS(s0, s0); FDIVD(v1, v1, s0); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 7: @@ -278,9 +267,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } else { FCVTDS(s0, s0); FDIVD(v1, s0, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; } diff --git a/src/dynarec/rv64/dynarec_rv64_d9.c b/src/dynarec/rv64/dynarec_rv64_d9.c index 5e2e0e32..a5fb073f 100644 --- a/src/dynarec/rv64/dynarec_rv64_d9.c +++ b/src/dynarec/rv64/dynarec_rv64_d9.c @@ -349,9 +349,8 @@ uintptr_t dynarec64_D9(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FSQRTS(v1, v1); } else { FSQRTD(v1, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 0xFB: diff --git a/src/dynarec/rv64/dynarec_rv64_da.c b/src/dynarec/rv64/dynarec_rv64_da.c index 884edb88..72921282 100644 --- a/src/dynarec/rv64/dynarec_rv64_da.c +++ b/src/dynarec/rv64/dynarec_rv64_da.c @@ -119,7 +119,6 @@ uintptr_t dynarec64_DA(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x5); FADDD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 1: @@ -132,7 +131,6 @@ uintptr_t dynarec64_DA(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x5); FMULD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 2: @@ -164,7 +162,6 @@ uintptr_t dynarec64_DA(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x5); FSUBD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 5: @@ -177,7 +174,6 @@ uintptr_t dynarec64_DA(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x5); FSUBD(v1, v2, v1); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 6: @@ -190,7 +186,6 @@ uintptr_t dynarec64_DA(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x5); FDIVD(v1, v1, v2); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 7: @@ -203,7 +198,6 @@ uintptr_t dynarec64_DA(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x5); FDIVD(v1, v2, v1); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; } diff --git a/src/dynarec/rv64/dynarec_rv64_dc.c b/src/dynarec/rv64/dynarec_rv64_dc.c index 80a7f082..76d1cea7 100644 --- a/src/dynarec/rv64/dynarec_rv64_dc.c +++ b/src/dynarec/rv64/dynarec_rv64_dc.c @@ -48,9 +48,8 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FADDS(v1, v1, v2); } else { FADDD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 0xC8 ... 0xCF: @@ -62,9 +61,8 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FMULS(v1, v1, v2); } else { FMULD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 0xD0 ... 0xD7: @@ -97,9 +95,8 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FSUBS(v1, v2, v1); } else { FSUBD(v1, v2, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 0xE8 ... 0xEF: @@ -111,9 +108,8 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FSUBS(v1, v1, v2); } else { FSUBD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 0xF0 ... 0xF7: @@ -125,9 +121,8 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FDIVS(v1, v2, v1); } else { FDIVD(v1, v2, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; case 0xF8 ... 0xFF: @@ -139,9 +134,8 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FDIVS(v1, v1, v2); } else { FDIVD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; default: @@ -226,7 +220,6 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x5); FDIVD(v1, v2, v1); X87_CHECK_PRECISION(v1); - MARK_X87PC(); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); break; } diff --git a/src/dynarec/rv64/dynarec_rv64_de.c b/src/dynarec/rv64/dynarec_rv64_de.c index 50b29a5b..fbb98e0d 100644 --- a/src/dynarec/rv64/dynarec_rv64_de.c +++ b/src/dynarec/rv64/dynarec_rv64_de.c @@ -47,9 +47,8 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FADDS(v1, v1, v2); } else { FADDD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); X87_POP_OR_FAIL(dyn, ninst, x3); break; @@ -62,9 +61,8 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FMULS(v1, v1, v2); } else { FMULD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); X87_POP_OR_FAIL(dyn, ninst, x3); break; @@ -100,9 +98,8 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FSUBS(v1, v2, v1); } else { FSUBD(v1, v2, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); X87_POP_OR_FAIL(dyn, ninst, x3); break; @@ -115,9 +112,8 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FSUBS(v1, v1, v2); } else { FSUBD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); X87_POP_OR_FAIL(dyn, ninst, x3); break; @@ -130,9 +126,8 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FDIVS(v1, v2, v1); } else { FDIVD(v1, v2, v1); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); X87_POP_OR_FAIL(dyn, ninst, x3); break; @@ -145,9 +140,8 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FDIVS(v1, v1, v2); } else { FDIVD(v1, v1, v2); - X87_CHECK_PRECISION(v1); } - MARK_X87PC(); + X87_CHECK_PRECISION(v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); X87_POP_OR_FAIL(dyn, ninst, x3); break; diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index 9e9e9f42..68962786 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -849,16 +849,13 @@ } #endif #ifndef X87_CHECK_PRECISION -#define X87_CHECK_PRECISION(A) \ - if (dyn->need_x87check) { \ - BNEZ(x87pc, 4 + 8); \ - FCVTSD(A, A); \ - FCVTDS(A, A); \ +#define X87_CHECK_PRECISION(A) \ + if (!ST_IS_F(0) && dyn->need_x87check) { \ + BNEZ(x87pc, 4 + 8); \ + FCVTSD(A, A); \ + FCVTDS(A, A); \ } #endif -#ifndef MARK_X87PC -#define MARK_X87PC() -#endif #define STORE_REG(A) SD(x##A, xEmu, offsetof(x64emu_t, regs[_##A])) #define LOAD_REG(A) LD(x##A, xEmu, offsetof(x64emu_t, regs[_##A])) diff --git a/src/dynarec/rv64/dynarec_rv64_pass0.h b/src/dynarec/rv64/dynarec_rv64_pass0.h index b1f2302c..f2d38d90 100644 --- a/src/dynarec/rv64/dynarec_rv64_pass0.h +++ b/src/dynarec/rv64/dynarec_rv64_pass0.h @@ -102,6 +102,7 @@ #define IF_ALIGNED(A) if ((dyn->insts[ninst].unaligned = (is_addr_unaligned(A) ? 1 : 0))) #define NATIVE_RESTORE_X87PC() -#define X87_CHECK_PRECISION(A) -#define MARK_X87PC() \ - if (dyn->need_x87check) dyn->insts[ninst].x87precision = 1 +#define X87_CHECK_PRECISION(A) \ + do { \ + if (dyn->need_x87check) dyn->insts[ninst].x87precision = 1; \ + } while (0) diff --git a/src/dynarec/rv64/dynarec_rv64_pass1.h b/src/dynarec/rv64/dynarec_rv64_pass1.h index fd7d2433..1e1cbc94 100644 --- a/src/dynarec/rv64/dynarec_rv64_pass1.h +++ b/src/dynarec/rv64/dynarec_rv64_pass1.h @@ -27,11 +27,11 @@ #define NATIVE_RESTORE_X87PC() -#define X87_CHECK_PRECISION(A) \ - do { \ - if (dyn->need_x87check) \ - dyn->need_x87check = 2; \ +#define X87_CHECK_PRECISION(A) \ + do { \ + if (dyn->need_x87check) { \ + dyn->insts[ninst].x87precision = 1; \ + if (!ST_IS_F(0)) \ + dyn->need_x87check = 2; \ + } \ } while (0) - -#define MARK_X87PC() \ - if (dyn->need_x87check) dyn->insts[ninst].x87precision = 1 |