diff --git a/pcsx2/x86/iFPU.cpp b/pcsx2/x86/iFPU.cpp index 3513df4c3a..a8da089665 100644 --- a/pcsx2/x86/iFPU.cpp +++ b/pcsx2/x86/iFPU.cpp @@ -115,6 +115,7 @@ static const __aligned16 u32 s_pos[4] = { 0x7fffffff, 0xffffffff, 0xffffffff, 0x void recCFC1(void) { if ( !_Rt_ || ( (_Fs_ != 0) && (_Fs_ != 31) ) ) return; + EE::Profiler.EmitOp(eeOpcode::CFC1); _eeOnWriteReg(_Rt_, 1); @@ -135,6 +136,7 @@ void recCFC1(void) void recCTC1() { if ( _Fs_ != 31 ) return; + EE::Profiler.EmitOp(eeOpcode::CTC1); if ( GPR_IS_CONST1(_Rt_) ) { @@ -180,6 +182,7 @@ void recMFC1() { int regt, regs; if ( ! _Rt_ ) return; + EE::Profiler.EmitOp(eeOpcode::MFC1); _eeOnWriteReg(_Rt_, 1); @@ -242,6 +245,7 @@ void recMFC1() //------------------------------------------------------------------ void recMTC1() { + EE::Profiler.EmitOp(eeOpcode::MTC1); if( GPR_IS_CONST1(_Rt_) ) { _deleteFPtoXMMreg(_Fs_, 0); @@ -407,6 +411,7 @@ void ClampValues(int regd) { //------------------------------------------------------------------ void recABS_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::ABS_F); if( info & PROCESS_EE_S ) xMOVSS(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); else xMOVSSZX(xRegisterSSE(EEREC_D), ptr[&fpuRegs.fpr[_Fs_]]); @@ -639,6 +644,7 @@ int recCommutativeOp(int info, int regd, int op) //------------------------------------------------------------------ void recADD_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::ADD_F); //xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagO|FPUflagU)); // Clear O and U flags ClampValues(recCommutativeOp(info, EEREC_D, 0)); //REC_FPUOP(ADD_S); @@ -648,6 +654,7 @@ FPURECOMPILE_CONSTCODE(ADD_S, XMMINFO_WRITED|XMMINFO_READS|XMMINFO_READT); void recADDA_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::ADDA_F); //xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagO|FPUflagU)); // Clear O and U flags ClampValues(recCommutativeOp(info, EEREC_ACC, 0)); } @@ -673,24 +680,28 @@ static void _setupBranchTest() void recBC1F() { + EE::Profiler.EmitOp(eeOpcode::BC1F); _setupBranchTest(); recDoBranchImm(JNZ32(0)); } void recBC1T() { + EE::Profiler.EmitOp(eeOpcode::BC1T); _setupBranchTest(); recDoBranchImm(JZ32(0)); } void recBC1FL() { + EE::Profiler.EmitOp(eeOpcode::BC1FL); _setupBranchTest(); recDoBranchImm_Likely(JNZ32(0)); } void recBC1TL() { + EE::Profiler.EmitOp(eeOpcode::BC1TL); _setupBranchTest(); recDoBranchImm_Likely(JZ32(0)); } @@ -702,6 +713,7 @@ void recBC1TL() //------------------------------------------------------------------ void recC_EQ_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::CEQ_F); int tempReg; int t0reg; @@ -765,12 +777,14 @@ FPURECOMPILE_CONSTCODE(C_EQ, XMMINFO_READS|XMMINFO_READT); void recC_F() { + EE::Profiler.EmitOp(eeOpcode::CF_F); xAND(ptr32[&fpuRegs.fprc[31]], ~FPUflagC ); } //REC_FPUFUNC(C_F); void recC_LE_xmm(int info ) { + EE::Profiler.EmitOp(eeOpcode::CLE_F); int tempReg; //tempX86reg int t0reg; //tempXMMreg @@ -844,6 +858,7 @@ FPURECOMPILE_CONSTCODE(C_LE, XMMINFO_READS|XMMINFO_READT); void recC_LT_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::CLT_F); int tempReg; int t0reg; @@ -924,6 +939,7 @@ FPURECOMPILE_CONSTCODE(C_LT, XMMINFO_READS|XMMINFO_READT); //------------------------------------------------------------------ void recCVT_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::CVTS_F); if( !(info&PROCESS_EE_S) || (EEREC_D != EEREC_S && !(info&PROCESS_EE_MODEWRITES)) ) { xCVTSI2SS(xRegisterSSE(EEREC_D), ptr32[&fpuRegs.fpr[_Fs_]]); } @@ -941,6 +957,9 @@ void recCVT_W() DOUBLE::recCVT_W(); return; } + // If we have the following EmitOP() on the top then it'll get calculated twice when CHECK_FPU_FULL is true + // as we also have an EmitOP() at recCVT_W() on iFPUd.cpp. hence we have it below the possible return. + EE::Profiler.EmitOp(eeOpcode::CVTW); int regs = _checkXMMreg(XMMTYPE_FPREG, _Fs_, MODE_READ); @@ -949,7 +968,7 @@ void recCVT_W() if (CHECK_FPU_EXTRA_OVERFLOW) fpuFloat2(regs); xCVTTSS2SI(eax, xRegisterSSE(regs)); xMOVMSKPS(edx, xRegisterSSE(regs)); //extract the signs - xAND(edx, 1); //keep only LSB + xAND(edx, 1); //keep only LSB } else { @@ -1034,6 +1053,7 @@ static __aligned16 SSE_MXCSR roundmode_nearest, roundmode_neg; void recDIV_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::DIV_F); bool roundmodeFlag = false; int t0reg = _allocTempXMMreg(XMMT_FPS, -1); //Console.WriteLn("DIV"); @@ -1286,6 +1306,7 @@ void recMADDtemp(int info, int regd) void recMADD_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MADD_F); //xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagO|FPUflagU)); // Clear O and U flags recMADDtemp(info, EEREC_D); } @@ -1294,6 +1315,7 @@ FPURECOMPILE_CONSTCODE(MADD_S, XMMINFO_WRITED|XMMINFO_READACC|XMMINFO_READS|XMMI void recMADDA_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MADDA_F); //xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagO|FPUflagU)); // Clear O and U flags recMADDtemp(info, EEREC_ACC); } @@ -1307,6 +1329,7 @@ FPURECOMPILE_CONSTCODE(MADDA_S, XMMINFO_WRITEACC|XMMINFO_READACC|XMMINFO_READS|X //------------------------------------------------------------------ void recMAX_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MAX_F); //xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagO|FPUflagU)); // Clear O and U flags recCommutativeOp(info, EEREC_D, 2); } @@ -1315,6 +1338,7 @@ FPURECOMPILE_CONSTCODE(MAX_S, XMMINFO_WRITED|XMMINFO_READS|XMMINFO_READT); void recMIN_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MIN_F); //xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagO|FPUflagU)); // Clear O and U flags recCommutativeOp(info, EEREC_D, 3); } @@ -1328,6 +1352,7 @@ FPURECOMPILE_CONSTCODE(MIN_S, XMMINFO_WRITED|XMMINFO_READS|XMMINFO_READT); //------------------------------------------------------------------ void recMOV_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MOV_F); if( info & PROCESS_EE_S ) xMOVSS(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); else xMOVSSZX(xRegisterSSE(EEREC_D), ptr[&fpuRegs.fpr[_Fs_]]); } @@ -1473,6 +1498,7 @@ int t1reg; void recMSUB_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MSUB_F); //xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagO|FPUflagU)); // Clear O and U flags recMSUBtemp(info, EEREC_D); } @@ -1481,6 +1507,7 @@ FPURECOMPILE_CONSTCODE(MSUB_S, XMMINFO_WRITED|XMMINFO_READACC|XMMINFO_READS|XMMI void recMSUBA_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MSUBA_F); //xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagO|FPUflagU)); // Clear O and U flags recMSUBtemp(info, EEREC_ACC); } @@ -1494,6 +1521,7 @@ FPURECOMPILE_CONSTCODE(MSUBA_S, XMMINFO_WRITEACC|XMMINFO_READACC|XMMINFO_READS|X //------------------------------------------------------------------ void recMUL_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MUL_F); //xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagO|FPUflagU)); // Clear O and U flags ClampValues(recCommutativeOp(info, EEREC_D, 1)); } @@ -1502,6 +1530,7 @@ FPURECOMPILE_CONSTCODE(MUL_S, XMMINFO_WRITED|XMMINFO_READS|XMMINFO_READT); void recMULA_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MULA_F); //xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagO|FPUflagU)); // Clear O and U flags ClampValues(recCommutativeOp(info, EEREC_ACC, 1)); } @@ -1514,6 +1543,7 @@ FPURECOMPILE_CONSTCODE(MULA_S, XMMINFO_WRITEACC|XMMINFO_READS|XMMINFO_READT); // NEG XMM //------------------------------------------------------------------ void recNEG_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::NEG_F); if( info & PROCESS_EE_S ) xMOVSS(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); else xMOVSSZX(xRegisterSSE(EEREC_D), ptr[&fpuRegs.fpr[_Fs_]]); @@ -1586,6 +1616,7 @@ void recSUBop(int info, int regd) void recSUB_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::SUB_F); recSUBop(info, EEREC_D); } @@ -1594,6 +1625,7 @@ FPURECOMPILE_CONSTCODE(SUB_S, XMMINFO_WRITED|XMMINFO_READS|XMMINFO_READT); void recSUBA_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::SUBA_F); recSUBop(info, EEREC_ACC); } @@ -1606,6 +1638,7 @@ FPURECOMPILE_CONSTCODE(SUBA_S, XMMINFO_WRITEACC|XMMINFO_READS|XMMINFO_READT); //------------------------------------------------------------------ void recSQRT_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::SQRT_F); u8* pjmp; bool roundmodeFlag = false; //Console.WriteLn("FPU: SQRT"); @@ -1725,6 +1758,7 @@ void recRSQRThelper2(int regd, int t0reg) // Preforms the RSQRT function when re void recRSQRT_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::RSQRT_F); // iFPUd (Full mode) sets roundmode to nearest for rSQRT. // Should this do the same, or should Full mode leave roundmode alone? --air diff --git a/pcsx2/x86/iFPUd.cpp b/pcsx2/x86/iFPUd.cpp index ee397d9054..f4944afda4 100644 --- a/pcsx2/x86/iFPUd.cpp +++ b/pcsx2/x86/iFPUd.cpp @@ -307,6 +307,7 @@ void SetMaxValue(int regd) //------------------------------------------------------------------ void recABS_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::ABS_F); GET_S(EEREC_D); CLEAR_OU_FLAGS; @@ -450,6 +451,7 @@ void recFPUOp(int info, int regd, int op, bool acc) //------------------------------------------------------------------ void recADD_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::ADD_F); recFPUOp(info, EEREC_D, 0, false); } @@ -457,6 +459,7 @@ FPURECOMPILE_CONSTCODE(ADD_S, XMMINFO_WRITED|XMMINFO_READS|XMMINFO_READT); void recADDA_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::ADDA_F); recFPUOp(info, EEREC_ACC, 0, true); } @@ -479,6 +482,7 @@ void recCMP(int info) //------------------------------------------------------------------ void recC_EQ_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::CEQ_F); recCMP(info); j8Ptr[0] = JZ8(0); @@ -493,6 +497,7 @@ FPURECOMPILE_CONSTCODE(C_EQ, XMMINFO_READS|XMMINFO_READT); void recC_LE_xmm(int info ) { + EE::Profiler.EmitOp(eeOpcode::CLE_F); recCMP(info); j8Ptr[0] = JBE8(0); @@ -507,6 +512,7 @@ FPURECOMPILE_CONSTCODE(C_LE, XMMINFO_READS|XMMINFO_READT); void recC_LT_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::CLT_F); recCMP(info); j8Ptr[0] = JB8(0); @@ -526,6 +532,7 @@ FPURECOMPILE_CONSTCODE(C_LT, XMMINFO_READS|XMMINFO_READT); //------------------------------------------------------------------ void recCVT_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::CVTS_F); if( !(info&PROCESS_EE_S) || (EEREC_D != EEREC_S && !(info&PROCESS_EE_MODEWRITES)) ) { xCVTSI2SS(xRegisterSSE(EEREC_D), ptr32[&fpuRegs.fpr[_Fs_]]); } @@ -538,6 +545,7 @@ FPURECOMPILE_CONSTCODE(CVT_S, XMMINFO_WRITED|XMMINFO_READS); void recCVT_W() //called from iFPU.cpp's recCVT_W { + EE::Profiler.EmitOp(eeOpcode::CVTW); int regs = _checkXMMreg(XMMTYPE_FPREG, _Fs_, MODE_READ); if( regs >= 0 ) @@ -631,6 +639,7 @@ static __aligned16 SSE_MXCSR roundmode_nearest, roundmode_neg; void recDIV_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::DIV_F); bool roundmodeFlag = false; //Console.WriteLn("DIV"); @@ -745,6 +754,7 @@ void recMaddsub(int info, int regd, int op, bool acc) void recMADD_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MADD_F); recMaddsub(info, EEREC_D, 0, false); } @@ -752,6 +762,7 @@ FPURECOMPILE_CONSTCODE(MADD_S, XMMINFO_WRITED|XMMINFO_READACC|XMMINFO_READS|XMMI void recMADDA_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MADDA_F); recMaddsub(info, EEREC_ACC, 0, true); } @@ -794,6 +805,7 @@ void recMINMAX(int info, bool ismin) void recMAX_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MAX_F); recMINMAX(info, false); } @@ -801,6 +813,7 @@ FPURECOMPILE_CONSTCODE(MAX_S, XMMINFO_WRITED|XMMINFO_READS|XMMINFO_READT); void recMIN_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MIN_F); recMINMAX(info, true); } @@ -813,6 +826,7 @@ FPURECOMPILE_CONSTCODE(MIN_S, XMMINFO_WRITED|XMMINFO_READS|XMMINFO_READT); //------------------------------------------------------------------ void recMOV_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MOV_F); GET_S(EEREC_D); } @@ -826,6 +840,7 @@ FPURECOMPILE_CONSTCODE(MOV_S, XMMINFO_WRITED|XMMINFO_READS); void recMSUB_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MSUB_F); recMaddsub(info, EEREC_D, 1, false); } @@ -833,6 +848,7 @@ FPURECOMPILE_CONSTCODE(MSUB_S, XMMINFO_WRITED|XMMINFO_READACC|XMMINFO_READS|XMMI void recMSUBA_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MSUBA_F); recMaddsub(info, EEREC_ACC, 1, true); } @@ -844,6 +860,7 @@ FPURECOMPILE_CONSTCODE(MSUBA_S, XMMINFO_WRITEACC|XMMINFO_READACC|XMMINFO_READS|X //------------------------------------------------------------------ void recMUL_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MUL_F); int sreg, treg; ALLOC_S(sreg); ALLOC_T(treg); @@ -855,6 +872,7 @@ FPURECOMPILE_CONSTCODE(MUL_S, XMMINFO_WRITED|XMMINFO_READS|XMMINFO_READT); void recMULA_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::MULA_F); int sreg, treg; ALLOC_S(sreg); ALLOC_T(treg); @@ -869,8 +887,9 @@ FPURECOMPILE_CONSTCODE(MULA_S, XMMINFO_WRITEACC|XMMINFO_READS|XMMINFO_READT); //------------------------------------------------------------------ // NEG XMM //------------------------------------------------------------------ -void recNEG_S_xmm(int info) { - +void recNEG_S_xmm(int info) +{ + EE::Profiler.EmitOp(eeOpcode::NEG_F); GET_S(EEREC_D); CLEAR_OU_FLAGS; @@ -888,6 +907,7 @@ FPURECOMPILE_CONSTCODE(NEG_S, XMMINFO_WRITED|XMMINFO_READS); void recSUB_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::SUB_F); recFPUOp(info, EEREC_D, 1, false); } @@ -896,6 +916,7 @@ FPURECOMPILE_CONSTCODE(SUB_S, XMMINFO_WRITED|XMMINFO_READS|XMMINFO_READT); void recSUBA_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::SUBA_F); recFPUOp(info, EEREC_ACC, 1, true); } @@ -908,6 +929,7 @@ FPURECOMPILE_CONSTCODE(SUBA_S, XMMINFO_WRITEACC|XMMINFO_READS|XMMINFO_READT); //------------------------------------------------------------------ void recSQRT_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::SQRT_F); u8 *pjmp; int roundmodeFlag = 0; int tempReg = _allocX86reg(xEmptyReg, X86TYPE_TEMP, 0, 0); @@ -1031,6 +1053,7 @@ void recRSQRThelper2(int regd, int regt) // Preforms the RSQRT function when reg void recRSQRT_S_xmm(int info) { + EE::Profiler.EmitOp(eeOpcode::RSQRT_F); int sreg, treg; // iFPU (regular FPU) doesn't touch roundmode for rSQRT.