From ea4dd4047c8361e23faeea321dbcf6bc576469b8 Mon Sep 17 00:00:00 2001 From: SarahW Date: Fri, 24 Jan 2020 20:33:59 +0000 Subject: [PATCH] Added FENI/FDISI for 8087. --- src/x87_ops.h | 6 ++++-- src/x87_ops_misc.h | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/x87_ops.h b/src/x87_ops.h index 225d56c..361dcb7 100644 --- a/src/x87_ops.h +++ b/src/x87_ops.h @@ -10,6 +10,8 @@ static int rounding_modes[4] = {FE_TONEAREST, FE_DOWNWARD, FE_UPWARD, FE_TOWARDZ #define STATUS_ZERODIVIDE 4 +#define FPCW_DISI (1 << 7) + #define x87_div(dst, src1, src2) do \ { \ if (((double)src2) == 0.0) \ @@ -639,7 +641,7 @@ OpFn OP_TABLE(fpu_db_a16)[256] = ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, - ILLEGAL, opFNOP, opFCLEX, opFINIT, opFNOP, opFNOP, ILLEGAL, ILLEGAL, + opFENI, opFDISI, opFCLEX, opFINIT, opFNOP, opFNOP, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -679,7 +681,7 @@ OpFn OP_TABLE(fpu_db_a32)[256] = ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, - ILLEGAL, opFNOP, opFCLEX, opFINIT, opFNOP, opFNOP, ILLEGAL, ILLEGAL, + opFENI, opFDISI, opFCLEX, opFINIT, opFNOP, opFNOP, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, diff --git a/src/x87_ops_misc.h b/src/x87_ops_misc.h index a5fc002..3a572cc 100644 --- a/src/x87_ops_misc.h +++ b/src/x87_ops_misc.h @@ -1,3 +1,30 @@ +static int opFDISI(uint32_t fetchdat) +{ + FP_ENTER(); + cpu_state.pc++; + if (fpu_type == FPU_8087) + { + cpu_state.npxc |= FPCW_DISI; + CLOCK_CYCLES(x87_timings.fdisi_eni); + } + else + CLOCK_CYCLES(x87_timings.fnop); + return 0; +} +static int opFENI(uint32_t fetchdat) +{ + FP_ENTER(); + cpu_state.pc++; + if (fpu_type == FPU_8087) + { + cpu_state.npxc &= ~FPCW_DISI; + CLOCK_CYCLES(x87_timings.fdisi_eni); + } + else + CLOCK_CYCLES(x87_timings.fnop); + return 0; +} + static int opFSTSW_AX(uint32_t fetchdat) { FP_ENTER();