From ab8b004b7125389786e2b69fa40fb6f429c312b2 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 17 Apr 2023 18:47:33 +0930 Subject: [PATCH] Core: Add a setting for fpu reg caching --- Lang/English.pj.Lang | 3 ++- Source/Android/Bridge/jniBridgeSettings.cpp | 1 + Source/Project64-core/Multilanguage.h | 1 + .../Project64-core/Multilanguage/Language.cpp | 1 + .../N64System/Interpreter/InterpreterOps.cpp | 4 ++-- .../Recompiler/x86/x86RecompilerOps.cpp | 6 ++++-- Source/Project64-core/Settings.cpp | 2 ++ Source/Project64-core/Settings/GameSettings.cpp | 2 ++ Source/Project64-core/Settings/GameSettings.h | 5 +++++ Source/Project64-core/Settings/SettingsID.h | 2 ++ .../Settings/SettingsPage-Game-Recompiler.cpp | 2 ++ Source/Project64/UserInterface/UIResources.rc | 17 +++++++++-------- Source/Project64/UserInterface/resource.h | 1 + 13 files changed, 34 insertions(+), 13 deletions(-) diff --git a/Lang/English.pj.Lang b/Lang/English.pj.Lang index 882b09fb7..bdd78ac59 100644 --- a/Lang/English.pj.Lang +++ b/Lang/English.pj.Lang @@ -293,7 +293,8 @@ #5441# "Turbo" #5442# "Slow" #5443# "Memory size (Known):" -#5443# "Memory size (Unknown):" +#5444# "Memory size (Unknown):" +#5445# "FPU register caching:" // Core styles #540# "Interpreter" diff --git a/Source/Android/Bridge/jniBridgeSettings.cpp b/Source/Android/Bridge/jniBridgeSettings.cpp index ef63bacfb..c94603806 100644 --- a/Source/Android/Bridge/jniBridgeSettings.cpp +++ b/Source/Android/Bridge/jniBridgeSettings.cpp @@ -158,6 +158,7 @@ CJniBridegSettings::CJniBridegSettings() ADD_SETTING(Game_FastSP); ADD_SETTING(Game_FuncLookupMode); ADD_SETTING(Game_RegCache); + ADD_SETTING(Game_FPURegCache); ADD_SETTING(Game_BlockLinking); ADD_SETTING(Game_ScreenHertz); ADD_SETTING(Game_RspAudioSignal); diff --git a/Source/Project64-core/Multilanguage.h b/Source/Project64-core/Multilanguage.h index 1b5c7f3ce..94652808a 100644 --- a/Source/Project64-core/Multilanguage.h +++ b/Source/Project64-core/Multilanguage.h @@ -330,6 +330,7 @@ enum LanguageStringID ROM_DISK_SEEK_TIMING_SLOW = 5442, ROM_MEM_SIZE_KNOWN = 5443, ROM_MEM_SIZE_UNKNOWN = 5444, + ROM_FPU_REG_CACHE = 5445, // Core styles CORE_INTERPTER = 540, diff --git a/Source/Project64-core/Multilanguage/Language.cpp b/Source/Project64-core/Multilanguage/Language.cpp index a4fbc6496..660564a78 100644 --- a/Source/Project64-core/Multilanguage/Language.cpp +++ b/Source/Project64-core/Multilanguage/Language.cpp @@ -278,6 +278,7 @@ void CLanguage::LoadDefaultStrings(void) DEF_STR(ROM_DISK_SEEK_TIMING_SLOW, "Slow"); DEF_STR(ROM_MEM_SIZE_KNOWN, "Memory size (Known):"); DEF_STR(ROM_MEM_SIZE_UNKNOWN, "Memory size (Unknown):"); + DEF_STR(ROM_FPU_REG_CACHE, "FPU register caching"); // Core styles DEF_STR(CORE_INTERPTER, "Interpreter"); diff --git a/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp b/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp index 69b7327cd..b14b5c79a 100644 --- a/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp +++ b/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp @@ -2414,7 +2414,7 @@ void R4300iOp::COP1_S_CMP() QuietNan = true; } else if ((*(uint32_t *)_FPR_S[m_Opcode.ft] >= 0x7FC00000 && *(uint32_t *)_FPR_S[m_Opcode.ft] <= 0x7FFFFFFF) || - (*(uint32_t *)_FPR_S[m_Opcode.ft] >= 0xFFC00000 && *(uint32_t *)_FPR_S[m_Opcode.ft] <= 0xFFFFFFFF)) + (*(uint32_t *)_FPR_S[m_Opcode.ft] >= 0xFFC00000 && *(uint32_t *)_FPR_S[m_Opcode.ft] <= 0xFFFFFFFF)) { QuietNan = true; } @@ -2861,7 +2861,7 @@ void R4300iOp::COP1_D_CMP() QuietNan = true; } else if ((*(uint64_t *)_FPR_D[m_Opcode.ft] >= 0x7FF8000000000000 && *(uint64_t *)_FPR_D[m_Opcode.ft] <= 0x7FFFFFFFFFFFFFFF) || - (*(uint64_t *)_FPR_D[m_Opcode.ft] >= 0xFFF8000000000000 && *(uint64_t *)_FPR_D[m_Opcode.ft] <= 0xFFFFFFFFFFFFFFFF)) + (*(uint64_t *)_FPR_D[m_Opcode.ft] >= 0xFFF8000000000000 && *(uint64_t *)_FPR_D[m_Opcode.ft] <= 0xFFFFFFFFFFFFFFFF)) { QuietNan = true; } diff --git a/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp b/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp index 72c7be138..12ce04adf 100644 --- a/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp +++ b/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp @@ -327,8 +327,10 @@ void CX86RecompilerOps::PostCompileOpcode(void) { m_RegWorkingSet.WriteBackRegisters(); } - m_RegWorkingSet.UnMap_AllFPRs(); - + if (!g_System->bFPURegCaching()) + { + m_RegWorkingSet.UnMap_AllFPRs(); + } /*if (m_CompilePC >= 0x800933B4 && m_CompilePC <= 0x80093414 && (m_PipelineStage == PIPELINE_STAGE_NORMAL || m_PipelineStage == PIPELINE_STAGE_DO_DELAY_SLOT)) { m_Assembler.MoveConstToVariable(&g_Reg->m_PROGRAM_COUNTER, "PROGRAM_COUNTER", m_CompilePC + 4); diff --git a/Source/Project64-core/Settings.cpp b/Source/Project64-core/Settings.cpp index f870e366f..1ef761669 100644 --- a/Source/Project64-core/Settings.cpp +++ b/Source/Project64-core/Settings.cpp @@ -162,6 +162,7 @@ void CSettings::AddHowToHandleSetting(const char * BaseDirectory) AddHandler(Rdb_ScreenHertz, new CSettingTypeRomDatabase("ScreenHertz", (uint32_t)0)); AddHandler(Rdb_FuncLookupMode, new CSettingTypeRomDatabase("FuncFind", (uint32_t)FuncFind_PhysicalLookup)); AddHandler(Rdb_RegCache, new CSettingTypeRDB("Reg Cache", true)); + AddHandler(Rdb_FpuRegCache, new CSettingTypeRDB("FPU Reg Cache", false)); #ifdef ANDROID AddHandler(Rdb_BlockLinking, new CSettingTypeRDBOnOff("Linking", false)); #else @@ -221,6 +222,7 @@ void CSettings::AddHowToHandleSetting(const char * BaseDirectory) AddHandler(Game_ScreenHertz, new CSettingTypeGame("ScreenHertz", Rdb_ScreenHertz)); AddHandler(Game_FuncLookupMode, new CSettingTypeGame("FuncFind", Rdb_FuncLookupMode)); AddHandler(Game_RegCache, new CSettingTypeGame("Reg Cache", Rdb_RegCache)); + AddHandler(Game_FPURegCache, new CSettingTypeGame("FPU Reg Cache", Rdb_FpuRegCache)); AddHandler(Game_BlockLinking, new CSettingTypeGame("Linking", Rdb_BlockLinking)); AddHandler(Game_SMM_StoreInstruc, new CSettingTypeGame("SMM-StoreInst", Rdb_SMM_StoreInstruc)); AddHandler(Game_SMM_Cache, new CSettingTypeGame("SMM-Cache", Rdb_SMM_Cache)); diff --git a/Source/Project64-core/Settings/GameSettings.cpp b/Source/Project64-core/Settings/GameSettings.cpp index ce9678a3d..89edc1738 100644 --- a/Source/Project64-core/Settings/GameSettings.cpp +++ b/Source/Project64-core/Settings/GameSettings.cpp @@ -24,6 +24,7 @@ bool CGameSettings::m_bFastSP = true; bool CGameSettings::m_b32Bit = true; bool CGameSettings::m_RspAudioSignal; bool CGameSettings::m_RegCaching; +bool CGameSettings::m_FPURegCaching; bool CGameSettings::m_bLinkBlocks; uint32_t CGameSettings::m_LookUpMode; //FUNC_LOOKUP_METHOD SYSTEM_TYPE CGameSettings::m_SystemType = SYSTEM_NTSC; @@ -82,6 +83,7 @@ void CGameSettings::RefreshGameSettings() #endif m_RspAudioSignal = g_Settings->LoadBool(Game_RspAudioSignal); m_RegCaching = g_Settings->LoadBool(Game_RegCache); + m_FPURegCaching = g_Settings->LoadBool(Game_FPURegCache); m_bLinkBlocks = g_Settings->LoadBool(Game_BlockLinking); m_LookUpMode = g_Settings->LoadDword(Game_FuncLookupMode); m_SystemType = (SYSTEM_TYPE)g_Settings->LoadDword(Game_SystemType); diff --git a/Source/Project64-core/Settings/GameSettings.h b/Source/Project64-core/Settings/GameSettings.h index cec07910d..d886c7771 100644 --- a/Source/Project64-core/Settings/GameSettings.h +++ b/Source/Project64-core/Settings/GameSettings.h @@ -15,6 +15,10 @@ public: { return m_UseHleGfx; } + inline static bool bFPURegCaching(void) + { + return m_FPURegCaching; + } inline static bool bRegCaching(void) { return m_RegCaching; @@ -140,6 +144,7 @@ private: // Settings that can be changed on the fly static bool m_UseHleGfx; static bool m_RegCaching; + static bool m_FPURegCaching; static bool m_bLinkBlocks; static uint32_t m_LookUpMode; //FUNC_LOOKUP_METHOD static uint32_t m_CountPerOp; diff --git a/Source/Project64-core/Settings/SettingsID.h b/Source/Project64-core/Settings/SettingsID.h index cee4c49bc..421a195cf 100644 --- a/Source/Project64-core/Settings/SettingsID.h +++ b/Source/Project64-core/Settings/SettingsID.h @@ -97,6 +97,7 @@ enum SettingID Rdb_ScreenHertz, Rdb_FuncLookupMode, Rdb_RegCache, + Rdb_FpuRegCache, Rdb_BlockLinking, Rdb_SMM_StoreInstruc, Rdb_SMM_Cache, @@ -152,6 +153,7 @@ enum SettingID Game_FastSP, Game_FuncLookupMode, Game_RegCache, + Game_FPURegCache, Game_BlockLinking, Game_ScreenHertz, Game_RspAudioSignal, diff --git a/Source/Project64/UserInterface/Settings/SettingsPage-Game-Recompiler.cpp b/Source/Project64/UserInterface/Settings/SettingsPage-Game-Recompiler.cpp index f36d2d6f7..76c5aac19 100644 --- a/Source/Project64/UserInterface/Settings/SettingsPage-Game-Recompiler.cpp +++ b/Source/Project64/UserInterface/Settings/SettingsPage-Game-Recompiler.cpp @@ -15,6 +15,7 @@ CGameRecompilePage::CGameRecompilePage(HWND hParent, const RECT & rcDispay) SetDlgItemText(IDC_FUNCFIND_TEXT, wGS(ROM_FUNC_FIND).c_str()); SetDlgItemText(IDC_ROM_REGCACHE, wGS(ROM_REG_CACHE).c_str()); + SetDlgItemText(IDC_ROM_FPUREGCACHE, wGS(ROM_FPU_REG_CACHE).c_str()); SetDlgItemText(IDC_BLOCK_LINKING, wGS(ADVANCE_ABL).c_str()); SetDlgItemText(IDC_ROM_FASTSP, wGS(ROM_FAST_SP).c_str()); SetDlgItemText(IDC_ROM_32BIT, wGS(ROM_32BIT).c_str()); @@ -29,6 +30,7 @@ CGameRecompilePage::CGameRecompilePage(HWND hParent, const RECT & rcDispay) m_SelfModGroup.Attach(GetDlgItem(IDC_SMM_FRAME)); AddModCheckBox(GetDlgItem(IDC_ROM_REGCACHE), Game_RegCache); + AddModCheckBox(GetDlgItem(IDC_ROM_FPUREGCACHE), Game_RegCache); AddModCheckBox(GetDlgItem(IDC_BLOCK_LINKING), Game_BlockLinking); AddModCheckBox(GetDlgItem(IDC_SMM_CACHE), Game_SMM_Cache); AddModCheckBox(GetDlgItem(IDC_SMM_DMA), Game_SMM_PIDMA); diff --git a/Source/Project64/UserInterface/UIResources.rc b/Source/Project64/UserInterface/UIResources.rc index 455f0e435..718b2a822 100644 --- a/Source/Project64/UserInterface/UIResources.rc +++ b/Source/Project64/UserInterface/UIResources.rc @@ -567,15 +567,16 @@ BEGIN CONTROL "",IDC_STATIC,"Static",SS_BLACKFRAME | SS_SUNKEN,6,42,208,1 CONTROL "Register caching",IDC_ROM_REGCACHE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,49,95,10 CONTROL "Advanced Block Linking",IDC_BLOCK_LINKING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,113,49,95,10 - CONTROL "Fast SP",IDC_ROM_FASTSP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,62,91,10 + CONTROL "Fast SP",IDC_ROM_FASTSP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,75,91,10 CONTROL "32 Bit Engine",IDC_ROM_32BIT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,113,62,95,10 - GROUPBOX "Self Mod Methods",IDC_SMM_FRAME,4,79,208,54 - CONTROL "Cache",IDC_SMM_CACHE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,91,89,10 - CONTROL "Store Instruction",IDC_SMM_STORE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,116,91,89,10 - CONTROL "PI DMA",IDC_SMM_DMA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,103,89,10 - CONTROL "TLB Unmapping",IDC_SMM_TLB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,116,103,89,10 - CONTROL "Start Changed",IDC_SMM_VALIDATE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,115,89,10 - CONTROL "Protect Memory",IDC_SMM_PROTECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,116,115,89,10 + GROUPBOX "Self Mod Methods",IDC_SMM_FRAME,4,87,208,54 + CONTROL "Cache",IDC_SMM_CACHE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,99,89,10 + CONTROL "Store Instruction",IDC_SMM_STORE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,116,99,89,10 + CONTROL "PI DMA",IDC_SMM_DMA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,111,89,10 + CONTROL "TLB Unmapping",IDC_SMM_TLB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,116,111,89,10 + CONTROL "Start Changed",IDC_SMM_VALIDATE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,123,89,10 + CONTROL "Protect Memory",IDC_SMM_PROTECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,116,123,89,10 + CONTROL "FPU Register caching",IDC_ROM_FPUREGCACHE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,62,95,10 END IDD_Settings_GamePlugin DIALOGEX 0, 0, 231, 206 diff --git a/Source/Project64/UserInterface/resource.h b/Source/Project64/UserInterface/resource.h index 913e1740c..c668de9ef 100644 --- a/Source/Project64/UserInterface/resource.h +++ b/Source/Project64/UserInterface/resource.h @@ -252,6 +252,7 @@ #define IDC_CONT_NAME 1100 #define IDC_COUNTPERBYTE 1100 #define ID_SUPPORT_PJ64 1100 +#define IDC_ROM_FPUREGCACHE 1100 #define IDC_DIR_FRAME1 1101 #define IDC_ROM_FASTSP 1101 #define IDC_INFO 1101