diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-02-04 10:32:42 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-02-04 10:32:42 +0100 |
| commit | 81386b7a5600e864427df86ec59a762da23efd12 (patch) | |
| tree | 38c0520175d8af486e31840738331b07fd8def17 | |
| parent | 5bf2a7d51b6080f33892fd9769574ba53cae6842 (diff) | |
| download | box64-81386b7a5600e864427df86ec59a762da23efd12.tar.gz box64-81386b7a5600e864427df86ec59a762da23efd12.zip | |
[INTERPRETER] Small D8..DF opcodes refactor
| -rw-r--r-- | src/emu/x64rund8.c | 4 | ||||
| -rw-r--r-- | src/emu/x64rund9.c | 15 | ||||
| -rw-r--r-- | src/emu/x64runda.c | 15 | ||||
| -rw-r--r-- | src/emu/x64rundb.c | 11 | ||||
| -rw-r--r-- | src/emu/x64rundc.c | 3 | ||||
| -rw-r--r-- | src/emu/x64rundd.c | 136 | ||||
| -rw-r--r-- | src/emu/x64runde.c | 185 | ||||
| -rw-r--r-- | src/emu/x64rundf.c | 121 |
8 files changed, 202 insertions, 288 deletions
diff --git a/src/emu/x64rund8.c b/src/emu/x64rund8.c index c44ca5be..fcd0b0ee 100644 --- a/src/emu/x64rund8.c +++ b/src/emu/x64rund8.c @@ -36,6 +36,7 @@ uintptr_t RunD8(x64emu_t *emu, rex_t rex, uintptr_t addr) #endif nextop = F8; + if(MODREG) switch (nextop) { case 0xC0: @@ -120,6 +121,8 @@ uintptr_t RunD8(x64emu_t *emu, rex_t rex, uintptr_t addr) ST0.d = ST(nextop&7).d / ST0.d; break; default: + return 0; + } else switch((nextop>>3)&7) { case 0: /* FADD ST0, float */ GETE4(0); @@ -157,6 +160,5 @@ uintptr_t RunD8(x64emu_t *emu, rex_t rex, uintptr_t addr) default: return 0; } - } return addr; } \ No newline at end of file diff --git a/src/emu/x64rund9.c b/src/emu/x64rund9.c index 1b097f9a..2cc8cdce 100644 --- a/src/emu/x64rund9.c +++ b/src/emu/x64rund9.c @@ -38,6 +38,7 @@ uintptr_t RunD9(x64emu_t *emu, rex_t rex, uintptr_t addr) #endif nextop = F8; + if(MODREG) switch (nextop) { case 0xC0: case 0xC1: @@ -223,18 +224,9 @@ uintptr_t RunD9(x64emu_t *emu, rex_t rex, uintptr_t addr) break; - case 0xD1: - case 0xD4: - case 0xD5: - case 0xD6: - case 0xD7: - case 0xE2: - case 0xE3: - case 0xE6: - case 0xE7: - case 0xEF: - return 0; default: + return 0; + } else switch((nextop>>3)&7) { case 0: /* FLD ST0, Ed float */ GETE4(0); @@ -277,6 +269,5 @@ uintptr_t RunD9(x64emu_t *emu, rex_t rex, uintptr_t addr) default: return 0; } - } return addr; } \ No newline at end of file diff --git a/src/emu/x64runda.c b/src/emu/x64runda.c index bb678a8c..aed775f9 100644 --- a/src/emu/x64runda.c +++ b/src/emu/x64runda.c @@ -35,6 +35,7 @@ uintptr_t RunDA(x64emu_t *emu, rex_t rex, uintptr_t addr) #endif nextop = F8; + if(MODREG) switch (nextop) { case 0xC0: /* FCMOVB ST(0), ST(i) */ case 0xC1: @@ -91,18 +92,9 @@ uintptr_t RunDA(x64emu_t *emu, rex_t rex, uintptr_t addr) fpu_do_pop(emu); break; - case 0xE4: - case 0xF0: - case 0xF1: - case 0xF4: - case 0xF5: - case 0xF6: - case 0xF7: - case 0xF8: - case 0xF9: - case 0xFD: - return 0; default: + return 0; + } else switch((nextop>>3)&7) { case 0: /* FIADD ST0, Ed int */ GETE4(0); @@ -138,6 +130,5 @@ uintptr_t RunDA(x64emu_t *emu, rex_t rex, uintptr_t addr) ST0.d = (double)ED->sdword[0] / ST0.d; break; } - } return addr; } \ No newline at end of file diff --git a/src/emu/x64rundb.c b/src/emu/x64rundb.c index ad5952bb..9fdae847 100644 --- a/src/emu/x64rundb.c +++ b/src/emu/x64rundb.c @@ -36,6 +36,7 @@ uintptr_t RunDB(x64emu_t *emu, rex_t rex, uintptr_t addr) #endif nextop = F8; + if(MODREG) switch(nextop) { case 0xC0: /* FCMOVNB ST(0), ST(i) */ case 0xC1: @@ -125,13 +126,10 @@ uintptr_t RunDB(x64emu_t *emu, rex_t rex, uintptr_t addr) case 0xF7: fpu_fcomi(emu, ST(nextop&7).d); break; - case 0xE0: - case 0xE4: - case 0xE5: - case 0xE6: - case 0xE7: - return 0; + default: + return 0; + } else switch((nextop>>3)&7) { case 0: /* FILD ST0, Ed */ GETE4(0); @@ -183,6 +181,5 @@ uintptr_t RunDB(x64emu_t *emu, rex_t rex, uintptr_t addr) default: return 0; } - } return addr; } diff --git a/src/emu/x64rundc.c b/src/emu/x64rundc.c index 08931135..6d9ff07b 100644 --- a/src/emu/x64rundc.c +++ b/src/emu/x64rundc.c @@ -35,6 +35,7 @@ uintptr_t RunDC(x64emu_t *emu, rex_t rex, uintptr_t addr) #endif nextop = F8; + if(MODREG) switch(nextop) { case 0xC0: case 0xC1: @@ -118,6 +119,8 @@ uintptr_t RunDC(x64emu_t *emu, rex_t rex, uintptr_t addr) ST(nextop&7).d /= ST0.d; break; default: + return 0; + } else { GETE8(0); switch((nextop>>3)&7) { case 0: /* FADD ST0, double */ diff --git a/src/emu/x64rundd.c b/src/emu/x64rundd.c index fc65f01d..35b439fe 100644 --- a/src/emu/x64rundd.c +++ b/src/emu/x64rundd.c @@ -35,88 +35,65 @@ uintptr_t RunDD(x64emu_t *emu, rex_t rex, uintptr_t addr) #endif nextop = F8; + if(MODREG) switch (nextop) { - case 0xC0: /* FFREE STx */ - case 0xC1: - case 0xC2: - case 0xC3: - case 0xC4: - case 0xC5: - case 0xC6: - case 0xC7: - fpu_do_free(emu, nextop-0xC0); - break; + case 0xC0: /* FFREE STx */ + case 0xC1: + case 0xC2: + case 0xC3: + case 0xC4: + case 0xC5: + case 0xC6: + case 0xC7: + fpu_do_free(emu, nextop-0xC0); + break; - case 0xD0: /* FST ST0, STx */ - case 0xD1: - case 0xD2: - case 0xD3: - case 0xD4: - case 0xD5: - case 0xD6: - case 0xD7: - ST(nextop&7).q = ST0.q; - break; - case 0xD8: /* FSTP ST0, STx */ - case 0xD9: - case 0xDA: - case 0xDB: - case 0xDC: - case 0xDD: - case 0xDE: - case 0xDF: - ST(nextop&7).q = ST0.q; - fpu_do_pop(emu); - break; - case 0xE0: /* FUCOM ST0, STx */ - case 0xE1: - case 0xE2: - case 0xE3: - case 0xE4: - case 0xE5: - case 0xE6: - case 0xE7: - fpu_fcom(emu, ST(nextop&7).d); // bad, should handle QNaN and IA interrupt - break; - case 0xE8: /* FUCOMP ST0, STx */ - case 0xE9: - case 0xEA: - case 0xEB: - case 0xEC: - case 0xED: - case 0xEE: - case 0xEF: - fpu_fcom(emu, ST(nextop&7).d); // bad, should handle QNaN and IA interrupt - fpu_do_pop(emu); - break; + case 0xD0: /* FST ST0, STx */ + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD5: + case 0xD6: + case 0xD7: + ST(nextop&7).q = ST0.q; + break; + case 0xD8: /* FSTP ST0, STx */ + case 0xD9: + case 0xDA: + case 0xDB: + case 0xDC: + case 0xDD: + case 0xDE: + case 0xDF: + ST(nextop&7).q = ST0.q; + fpu_do_pop(emu); + break; + case 0xE0: /* FUCOM ST0, STx */ + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + fpu_fcom(emu, ST(nextop&7).d); // bad, should handle QNaN and IA interrupt + break; + case 0xE8: /* FUCOMP ST0, STx */ + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xED: + case 0xEE: + case 0xEF: + fpu_fcom(emu, ST(nextop&7).d); // bad, should handle QNaN and IA interrupt + fpu_do_pop(emu); + break; - case 0xC8: - case 0xC9: - case 0xCA: - case 0xCB: - case 0xCC: - case 0xCD: - case 0xCE: - case 0xCF: - case 0xF0: - case 0xF1: - case 0xF2: - case 0xF3: - case 0xF4: - case 0xF5: - case 0xF6: - case 0xF7: - case 0xF8: - case 0xF9: - case 0xFA: - case 0xFB: - case 0xFC: - case 0xFD: - case 0xFE: - case 0xFF: - return 0; - - default: + default: + return 0; + } else switch((nextop>>3)&7) { case 0: /* FLD double */ GETE8(0); @@ -183,6 +160,5 @@ uintptr_t RunDD(x64emu_t *emu, rex_t rex, uintptr_t addr) default: return 0; } - } return addr; } \ No newline at end of file diff --git a/src/emu/x64runde.c b/src/emu/x64runde.c index 4ec5828a..4cb5e4a2 100644 --- a/src/emu/x64runde.c +++ b/src/emu/x64runde.c @@ -35,105 +35,99 @@ uintptr_t RunDE(x64emu_t *emu, rex_t rex, uintptr_t addr) #endif nextop = F8; + if(MODREG) switch(nextop) { - case 0xC0: /* FADDP STx, ST0 */ - case 0xC1: /* FADDP ST1, ST0 */ - case 0xC2: - case 0xC3: - case 0xC4: - case 0xC5: - case 0xC6: - case 0xC7: - ST(nextop&7).d += ST0.d; - fpu_do_pop(emu); - break; - case 0xC8: /* FMULP STx, ST0 */ - case 0xC9: /* FMULP ST1, ST0 */ - case 0xCA: - case 0xCB: - case 0xCC: - case 0xCD: - case 0xCE: - case 0xCF: - ST(nextop&7).d *= ST0.d; - fpu_do_pop(emu); - break; - case 0xD0: - case 0xD1: - case 0xD2: - case 0xD3: - case 0xD4: - case 0xD5: - case 0xD6: - case 0xD7: /* FCOMP */ - fpu_fcom(emu, ST(nextop&7).d); - fpu_do_pop(emu); - break; + case 0xC0: /* FADDP STx, ST0 */ + case 0xC1: /* FADDP ST1, ST0 */ + case 0xC2: + case 0xC3: + case 0xC4: + case 0xC5: + case 0xC6: + case 0xC7: + ST(nextop&7).d += ST0.d; + fpu_do_pop(emu); + break; + case 0xC8: /* FMULP STx, ST0 */ + case 0xC9: /* FMULP ST1, ST0 */ + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + ST(nextop&7).d *= ST0.d; + fpu_do_pop(emu); + break; + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD5: + case 0xD6: + case 0xD7: /* FCOMP */ + fpu_fcom(emu, ST(nextop&7).d); + fpu_do_pop(emu); + break; - case 0xD9: /* FCOMPP */ - fpu_fcom(emu, ST1.d); - fpu_do_pop(emu); - fpu_do_pop(emu); - break; + case 0xD9: /* FCOMPP */ + fpu_fcom(emu, ST1.d); + fpu_do_pop(emu); + fpu_do_pop(emu); + break; - /*ST(1).d = ST0.d - ST(1).d; - fpu_do_pop(emu); - break;*/ - case 0xE0: /* FSUBRP STx, ST0 */ - case 0xE1: /* FSUBRP ST1, ST0 */ - case 0xE2: - case 0xE3: - case 0xE4: - case 0xE5: - case 0xE6: - case 0xE7: - ST(nextop&7).d = ST0.d - ST(nextop&7).d; - fpu_do_pop(emu); - break; - case 0xE8: /* FSUBP STx, ST0 */ - case 0xE9: /* FSUBP ST1, ST0 */ - case 0xEA: - case 0xEB: - case 0xEC: - case 0xED: - case 0xEE: - case 0xEF: - ST(nextop&7).d -= ST0.d; - fpu_do_pop(emu); - break; - case 0xF0: /* FDIVRP STx, ST0 */ - case 0xF1: /* FDIVRP ST1, ST0 */ - case 0xF2: - case 0xF3: - case 0xF4: - case 0xF5: - case 0xF6: - case 0xF7: - ST(nextop&7).d = ST0.d / ST(nextop&7).d; - fpu_do_pop(emu); - break; - case 0xF8: /* FDIVP STx, ST0 */ - case 0xF9: /* FDIVP ST1, ST0 */ - case 0xFA: - case 0xFB: - case 0xFC: - case 0xFD: - case 0xFE: - case 0xFF: - ST(nextop&7).d /= ST0.d; - fpu_do_pop(emu); - break; + /*ST(1).d = ST0.d - ST(1).d; + fpu_do_pop(emu); + break;*/ + case 0xE0: /* FSUBRP STx, ST0 */ + case 0xE1: /* FSUBRP ST1, ST0 */ + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + ST(nextop&7).d = ST0.d - ST(nextop&7).d; + fpu_do_pop(emu); + break; + case 0xE8: /* FSUBP STx, ST0 */ + case 0xE9: /* FSUBP ST1, ST0 */ + case 0xEA: + case 0xEB: + case 0xEC: + case 0xED: + case 0xEE: + case 0xEF: + ST(nextop&7).d -= ST0.d; + fpu_do_pop(emu); + break; + case 0xF0: /* FDIVRP STx, ST0 */ + case 0xF1: /* FDIVRP ST1, ST0 */ + case 0xF2: + case 0xF3: + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: + ST(nextop&7).d = ST0.d / ST(nextop&7).d; + fpu_do_pop(emu); + break; + case 0xF8: /* FDIVP STx, ST0 */ + case 0xF9: /* FDIVP ST1, ST0 */ + case 0xFA: + case 0xFB: + case 0xFC: + case 0xFD: + case 0xFE: + case 0xFF: + ST(nextop&7).d /= ST0.d; + fpu_do_pop(emu); + break; - case 0xD8: - case 0xDA: - case 0xDB: - case 0xDC: - case 0xDD: - case 0xDE: - case 0xDF: - return 0; - - default: + default: + return 0; + } else switch((nextop>>3)&7) { case 0: /* FIADD ST0, Ew int */ GETEW(0); @@ -162,6 +156,5 @@ uintptr_t RunDE(x64emu_t *emu, rex_t rex, uintptr_t addr) default: return 0; } - } return addr; } \ No newline at end of file diff --git a/src/emu/x64rundf.c b/src/emu/x64rundf.c index d707863c..755c5865 100644 --- a/src/emu/x64rundf.c +++ b/src/emu/x64rundf.c @@ -37,90 +37,52 @@ uintptr_t RunDF(x64emu_t *emu, rex_t rex, uintptr_t addr) #endif nextop = F8; + if(MODREG) switch(nextop) { - case 0xC0: /* FFREEP STx */ - case 0xC1: - case 0xC2: - case 0xC3: - case 0xC4: - case 0xC5: - case 0xC6: - case 0xC7: - fpu_do_free(emu, nextop-0xC0); - fpu_do_pop(emu); - break; - - case 0xE0: /* FNSTSW AX */ - emu->sw.f.F87_TOP = emu->top&7; - R_AX = emu->sw.x16; - break; + case 0xC0: /* FFREEP STx */ + case 0xC1: + case 0xC2: + case 0xC3: + case 0xC4: + case 0xC5: + case 0xC6: + case 0xC7: + fpu_do_free(emu, nextop-0xC0); + fpu_do_pop(emu); + break; - case 0xE8: /* FUCOMIP ST0, STx */ - case 0xE9: - case 0xEA: - case 0xEB: - case 0xEC: - case 0xED: - case 0xEE: - case 0xEF: - fpu_fcomi(emu, ST(nextop&7).d); // bad, should handle QNaN and IA interrupt - fpu_do_pop(emu); - break; + case 0xE0: /* FNSTSW AX */ + emu->sw.f.F87_TOP = emu->top&7; + R_AX = emu->sw.x16; + break; - case 0xF0: /* FCOMIP ST0, STx */ - case 0xF1: - case 0xF2: - case 0xF3: - case 0xF4: - case 0xF5: - case 0xF6: - case 0xF7: - fpu_fcomi(emu, ST(nextop&7).d); - fpu_do_pop(emu); - break; + case 0xE8: /* FUCOMIP ST0, STx */ + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xED: + case 0xEE: + case 0xEF: + fpu_fcomi(emu, ST(nextop&7).d); // bad, should handle QNaN and IA interrupt + fpu_do_pop(emu); + break; - case 0xC8: - case 0xC9: - case 0xCA: - case 0xCB: - case 0xCC: - case 0xCD: - case 0xCE: - case 0xCF: - case 0xD0: - case 0xD1: - case 0xD2: - case 0xD3: - case 0xD4: - case 0xD5: - case 0xD6: - case 0xD7: - case 0xD8: - case 0xD9: - case 0xDA: - case 0xDB: - case 0xDC: - case 0xDD: - case 0xDE: - case 0xDF: - case 0xE1: - case 0xE2: - case 0xE3: - case 0xE4: - case 0xE5: - case 0xE6: - case 0xE7: - case 0xF8: - case 0xF9: - case 0xFA: - case 0xFB: - case 0xFC: - case 0xFD: - case 0xFE: - case 0xFF: - return 0; + case 0xF0: /* FCOMIP ST0, STx */ + case 0xF1: + case 0xF2: + case 0xF3: + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: + fpu_fcomi(emu, ST(nextop&7).d); + fpu_do_pop(emu); + break; - default: + default: + return 0; + } else switch((nextop>>3)&7) { case 0: /* FILD ST0, Gw */ GETEW(0); @@ -185,6 +147,5 @@ uintptr_t RunDF(x64emu_t *emu, rex_t rex, uintptr_t addr) default: return 0; } - } return addr; } |