From 70d1f5adfb7813217c52f6dd4e31e46d4d4b8f5d Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 30 Apr 2014 08:06:19 -0500 Subject: [PATCH] Let Jit64IL use the new PPCAnalyst class --- Source/Core/Core/PowerPC/Jit64IL/JitIL.cpp | 41 ++++++++-------------- 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/Source/Core/Core/PowerPC/Jit64IL/JitIL.cpp b/Source/Core/Core/PowerPC/Jit64IL/JitIL.cpp index b145162233..8c31397a10 100644 --- a/Source/Core/Core/PowerPC/Jit64IL/JitIL.cpp +++ b/Source/Core/Core/PowerPC/Jit64IL/JitIL.cpp @@ -268,6 +268,10 @@ void JitIL::Init() blocks.Init(); asm_routines.Init(); + code_block.m_stats = &js.st; + code_block.m_gpa = &js.gpa; + code_block.m_fpa = &js.fpa; + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) { JitILProfiler::Init(); } @@ -500,9 +504,6 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc // Memory exception on instruction fetch bool memory_exception = false; - // A broken block is a block that does not end in a branch - bool broken_block = false; - if (Core::g_CoreStartupParameter.bEnableDebugging) { // Comment out the following to disable breakpoints (speed-up) @@ -529,7 +530,6 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc } } - int size = 0; js.isLastInstruction = false; js.blockStart = em_address; js.fifoBytesThisBlock = 0; @@ -538,19 +538,12 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc jit->js.numLoadStoreInst = 0; jit->js.numFloatingPointInst = 0; + u32 nextPC = em_address; // Analyze the block, collect all instructions it is made of (including inlining, // if that is enabled), reorder instructions for optimal performance, and join joinable instructions. - u32 exitAddress = em_address; - - u32 merged_addresses[32]; - const int capacity_of_merged_addresses = sizeof(merged_addresses) / sizeof(merged_addresses[0]); - int size_of_merged_addresses = 0; if (!memory_exception) - { - // If there is a memory exception inside a block (broken_block==true), compile up to that instruction. - // TODO - exitAddress = PPCAnalyst::Flatten(em_address, &size, &js.st, &js.gpa, &js.fpa, broken_block, code_buf, blockSize, merged_addresses, capacity_of_merged_addresses, size_of_merged_addresses); - } + nextPC = analyser.Analyze(em_address, &code_block, code_buf, blockSize); + PPCAnalyst::CodeOp *ops = code_buf->codebuffer; const u8 *start = AlignCode4(); // TODO: Test if this or AlignCode16 make a difference from GetCodePtr @@ -586,7 +579,7 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILOutputIR) { // For profiling and IR Writer - for (int i = 0; i < (int)size; i++) + for (u32 i = 0; i < code_block.m_num_instructions; i++) { const u64 inst = ops[i].inst.hex; // Ported from boost::hash @@ -606,16 +599,10 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc js.downcountAmount = 0; if (!Core::g_CoreStartupParameter.bEnableDebugging) - { - for (int i = 0; i < size_of_merged_addresses; ++i) - { - const u32 address = merged_addresses[i]; - js.downcountAmount += PatchEngine::GetSpeedhackCycles(address); - } - } + js.downcountAmount += PatchEngine::GetSpeedhackCycles(code_block.m_address); // Translate instructions - for (int i = 0; i < (int)size; i++) + for (u32 i = 0; i < code_block.m_num_instructions; i++) { js.compilerPC = ops[i].address; js.op = &ops[i]; @@ -623,7 +610,7 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc const GekkoOPInfo *opinfo = GetOpInfo(ops[i].inst); js.downcountAmount += opinfo->numCycles; - if (i == (int)size - 1) + if (i == (code_block.m_num_instructions - 1)) { js.isLastInstruction = true; js.next_inst = 0; @@ -708,13 +695,13 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc } // Perform actual code generation - WriteCode(exitAddress); + WriteCode(nextPC); b->codeSize = (u32)(GetCodePtr() - normalEntry); - b->originalSize = size; + b->originalSize = code_block.m_num_instructions; #ifdef JIT_LOG_X86 - LogGeneratedX86(size, code_buf, normalEntry, b); + LogGeneratedX86(code_block.m_num_instructions, code_buf, normalEntry, b); #endif if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILOutputIR)