diff --git a/src/x87_ops.h b/src/x87_ops.h index dce2d11..e17998f 100644 --- a/src/x87_ops.h +++ b/src/x87_ops.h @@ -362,7 +362,7 @@ OpFn OP_TABLE(fpu_d9_a16)[256] = opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, /*Invalid*/ opFCHS, opFABS, ILLEGAL, ILLEGAL, opFTST, opFXAM, ILLEGAL, ILLEGAL, opFLD1, opFLDL2T, opFLDL2E, opFLDPI, opFLDEG2, opFLDLN2, opFLDZ, ILLEGAL, - opF2XM1, opFYL2X, opFPTAN, opFPATAN, ILLEGAL, ILLEGAL, opFDECSTP, opFINCSTP, + opF2XM1, opFYL2X, opFPTAN, opFPATAN, ILLEGAL, opFPREM1, opFDECSTP, opFINCSTP, opFPREM, opFYL2XP1,opFSQRT, opFSINCOS, opFRNDINT, opFSCALE, opFSIN, opFCOS }; @@ -401,7 +401,7 @@ OpFn OP_TABLE(fpu_d9_a32)[256] = opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, /*Invalid*/ opFCHS, opFABS, ILLEGAL, ILLEGAL, opFTST, opFXAM, ILLEGAL, ILLEGAL, opFLD1, opFLDL2T, opFLDL2E, opFLDPI, opFLDEG2, opFLDLN2, opFLDZ, ILLEGAL, - opF2XM1, opFYL2X, opFPTAN, opFPATAN, ILLEGAL, ILLEGAL, opFDECSTP, opFINCSTP, + opF2XM1, opFYL2X, opFPTAN, opFPATAN, ILLEGAL, opFPREM1, opFDECSTP, opFINCSTP, opFPREM, opFYL2XP1,opFSQRT, opFSINCOS, opFRNDINT, opFSCALE, opFSIN, opFCOS }; diff --git a/src/x87_ops_misc.h b/src/x87_ops_misc.h index d86c7a8..59c8467 100644 --- a/src/x87_ops_misc.h +++ b/src/x87_ops_misc.h @@ -562,6 +562,23 @@ static int opFPREM(uint32_t fetchdat) CLOCK_CYCLES(100); return 0; } +static int opFPREM1(uint32_t fetchdat) +{ + int64_t temp64; + FP_ENTER(); + pc++; + if (fplog) pclog("FPREM1 %f %f ", ST(0), ST(1)); + temp64 = (int64_t)(ST(0) / ST(1)); + ST(0) = ST(0) - (ST(1) * (double)temp64); + tag[TOP] &= ~TAG_UINT64; + if (fplog) pclog("%f\n", ST(0)); + npxs &= ~(C0|C1|C2|C3); + if (temp64 & 4) npxs|=C0; + if (temp64 & 2) npxs|=C3; + if (temp64 & 1) npxs|=C1; + CLOCK_CYCLES(100); + return 0; +} static int opFSQRT(uint32_t fetchdat) {