From 96cdb1ad07e8503d4e0a7f9f217f95e7ef1028c6 Mon Sep 17 00:00:00 2001 From: nodchip Date: Fri, 19 Nov 2010 07:48:48 +0000 Subject: [PATCH] JitIL: Removed ENABLE_JITIL_PROFILING macro and added an entry in setting file. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6443 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Core/Src/ConfigManager.cpp | 1 + Source/Core/Core/Src/CoreParameter.cpp | 1 + Source/Core/Core/Src/CoreParameter.h | 1 + .../Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp | 77 ++++++++++++------- 4 files changed, 53 insertions(+), 27 deletions(-) diff --git a/Source/Core/Core/Src/ConfigManager.cpp b/Source/Core/Core/Src/ConfigManager.cpp index e99619b277..3b8f5d2643 100644 --- a/Source/Core/Core/Src/ConfigManager.cpp +++ b/Source/Core/Core/Src/ConfigManager.cpp @@ -282,6 +282,7 @@ void SConfig::LoadSettings() ini.Get("Core", "SlotB", (int*)&m_EXIDevice[1], EXIDEVICE_MEMORYCARD_B); ini.Get("Core", "SerialPort1", (int*)&m_EXIDevice[2], EXIDEVICE_NONE); ini.Get("Core", "ProfiledReJIT",&m_LocalCoreStartupParameter.bJITProfiledReJIT, false); + ini.Get("Core", "TimeProfiling",&m_LocalCoreStartupParameter.bJITILTimeProfiling, false); char sidevicenum[16]; for (int i = 0; i < 4; ++i) { diff --git a/Source/Core/Core/Src/CoreParameter.cpp b/Source/Core/Core/Src/CoreParameter.cpp index d91f8a5c47..6a043a9e3f 100644 --- a/Source/Core/Core/Src/CoreParameter.cpp +++ b/Source/Core/Core/Src/CoreParameter.cpp @@ -40,6 +40,7 @@ SCoreStartupParameter::SCoreStartupParameter() bJITFloatingPointOff(false), bJITIntegerOff(false), bJITPairedOff(false), bJITSystemRegistersOff(false), bJITBranchOff(false), bJITProfiledReJIT(false), + bJITILTimeProfiling(false), bEnableFPRF(false), bCPUThread(true), bDSPThread(false), bSkipIdle(true), bNTSC(false), bNTSCJ(false), diff --git a/Source/Core/Core/Src/CoreParameter.h b/Source/Core/Core/Src/CoreParameter.h index e3da057bb4..4630c63f7a 100644 --- a/Source/Core/Core/Src/CoreParameter.h +++ b/Source/Core/Core/Src/CoreParameter.h @@ -62,6 +62,7 @@ struct SCoreStartupParameter bool bJITSystemRegistersOff; bool bJITBranchOff; bool bJITProfiledReJIT; + bool bJITILTimeProfiling; bool bEnableFPRF; diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp index 4fe77ad62a..58ba792477 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp @@ -25,6 +25,7 @@ #include "../../Core.h" #include "../../PatchEngine.h" #include "../../CoreTiming.h" +#include "../../ConfigManager.h" #include "../PowerPC.h" #include "../Profiler.h" #include "../PPCTables.h" @@ -152,8 +153,7 @@ ps_adds1 */ -//#define ENABLE_JITIL_PROFILING -#ifdef ENABLE_JITIL_PROFILING +#ifdef _WIN32 // For profiling // FIXME: This is currently for windows only. #include @@ -170,13 +170,13 @@ namespace JitILProfiler { static std::tr1::unordered_map profiledData; // These functions need to be static function // because they are called with ABI_CallFunction(). - static void begin(u32 higher, u32 lower) { + static void Begin(u32 higher, u32 lower) { hash = (((u64)higher) << 32) | lower; LARGE_INTEGER largeInteger; QueryPerformanceCounter(&largeInteger); beginTime = largeInteger.QuadPart; } - static void end() { + static void End() { LARGE_INTEGER largeInteger; QueryPerformanceCounter(&largeInteger); const u64 endTime = largeInteger.QuadPart; @@ -202,7 +202,22 @@ namespace JitILProfiler { fclose(file); file = NULL; } - } finalizer; // Is this a bad manner? + }; + std::auto_ptr finalizer; + static void Init() { + finalizer = std::auto_ptr(new JitILProfilerFinalizer); + } + static void Shutdown() { + finalizer.reset(); + } +}; +#else +namespace JitILProfiler { + // FIXME: Dummy functions for linux. Please implement them. + static void Begin(u32 higher, u32 lower) { } + static void End() { } + static void Init() { } + static void Shutdown() { } }; #endif @@ -248,6 +263,10 @@ void JitIL::Init() blocks.Init(); asm_routines.Init(); + + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) { + JitILProfiler::Init(); + } } void JitIL::ClearCache() @@ -259,6 +278,10 @@ void JitIL::ClearCache() void JitIL::Shutdown() { + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) { + JitILProfiler::Shutdown(); + } + FreeCodeSpace(); blocks.Shutdown(); @@ -346,9 +369,9 @@ void JitIL::Cleanup() void JitIL::WriteExit(u32 destination, int exit_num) { Cleanup(); -#ifdef ENABLE_JITIL_PROFILING - ABI_CallFunction(JitILProfiler::end); -#endif + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) { + ABI_CallFunction(JitILProfiler::End); + } SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); //If nobody has taken care of this yet (this can be removed when all branches are done) @@ -375,9 +398,9 @@ void JitIL::WriteExitDestInOpArg(const Gen::OpArg& arg) { MOV(32, M(&PC), arg); Cleanup(); -#ifdef ENABLE_JITIL_PROFILING - ABI_CallFunction(JitILProfiler::end); -#endif + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) { + ABI_CallFunction(JitILProfiler::End); + } SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); JMP(asm_routines.dispatcher, true); } @@ -386,9 +409,9 @@ void JitIL::WriteRfiExitDestInOpArg(const Gen::OpArg& arg) { MOV(32, M(&PC), arg); Cleanup(); -#ifdef ENABLE_JITIL_PROFILING - ABI_CallFunction(JitILProfiler::end); -#endif + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) { + ABI_CallFunction(JitILProfiler::End); + } SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); JMP(asm_routines.testExceptions, true); } @@ -396,9 +419,9 @@ void JitIL::WriteRfiExitDestInOpArg(const Gen::OpArg& arg) void JitIL::WriteExceptionExit() { Cleanup(); -#ifdef ENABLE_JITIL_PROFILING - ABI_CallFunction(JitILProfiler::end); -#endif + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) { + ABI_CallFunction(JitILProfiler::End); + } SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); JMP(asm_routines.testExceptions, true); } @@ -533,17 +556,17 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc js.rewriteStart = (u8*)GetCodePtr(); -#ifdef ENABLE_JITIL_PROFILING - // For profiling - u64 codeHash = -1; - for (int i = 0; i < (int)size; i++) - { - const u64 inst = ops[i].inst.hex; - // Ported from boost::hash - codeHash ^= inst + (codeHash << 6) + (codeHash >> 2); + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) { + // For profiling + u64 codeHash = -1; + for (int i = 0; i < (int)size; i++) + { + const u64 inst = ops[i].inst.hex; + // Ported from boost::hash + codeHash ^= inst + (codeHash << 6) + (codeHash >> 2); + } + ABI_CallFunctionCC(JitILProfiler::Begin, (u32)(codeHash >> 32), (u32)codeHash); } - ABI_CallFunctionCC(JitILProfiler::begin, (u32)(codeHash >> 32), (u32)codeHash); -#endif // Start up IR builder (structure that collects the // instruction processed by the JIT routines)