Merge pull request #4862 from lioncash/compile

CPU Backends: Make instruction table initialization private
This commit is contained in:
Mat M
2017-02-15 11:44:37 -05:00
committed by GitHub
23 changed files with 109 additions and 229 deletions

View File

@ -463,13 +463,10 @@
<ClInclude Include="PowerPC\CachedInterpreter\InterpreterBlockCache.h" /> <ClInclude Include="PowerPC\CachedInterpreter\InterpreterBlockCache.h" />
<ClInclude Include="PowerPC\Interpreter\Interpreter.h" /> <ClInclude Include="PowerPC\Interpreter\Interpreter.h" />
<ClInclude Include="PowerPC\Interpreter\Interpreter_FPUtils.h" /> <ClInclude Include="PowerPC\Interpreter\Interpreter_FPUtils.h" />
<ClInclude Include="PowerPC\Interpreter\Interpreter_Tables.h" />
<ClInclude Include="PowerPC\Jit64IL\JitIL.h" /> <ClInclude Include="PowerPC\Jit64IL\JitIL.h" />
<ClInclude Include="PowerPC\Jit64IL\JitIL_Tables.h" />
<ClInclude Include="PowerPC\Jit64\FPURegCache.h" /> <ClInclude Include="PowerPC\Jit64\FPURegCache.h" />
<ClInclude Include="PowerPC\Jit64\GPRRegCache.h" /> <ClInclude Include="PowerPC\Jit64\GPRRegCache.h" />
<ClInclude Include="PowerPC\Jit64\Jit.h" /> <ClInclude Include="PowerPC\Jit64\Jit.h" />
<ClInclude Include="PowerPC\Jit64\Jit64_Tables.h" />
<ClInclude Include="PowerPC\Jit64\JitAsm.h" /> <ClInclude Include="PowerPC\Jit64\JitAsm.h" />
<ClInclude Include="PowerPC\Jit64\JitRegCache.h" /> <ClInclude Include="PowerPC\Jit64\JitRegCache.h" />
<ClInclude Include="PowerPC\JitILCommon\IR.h" /> <ClInclude Include="PowerPC\JitILCommon\IR.h" />

View File

@ -940,15 +940,9 @@
<ClInclude Include="PowerPC\Interpreter\Interpreter_FPUtils.h"> <ClInclude Include="PowerPC\Interpreter\Interpreter_FPUtils.h">
<Filter>PowerPC\Interpreter</Filter> <Filter>PowerPC\Interpreter</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="PowerPC\Interpreter\Interpreter_Tables.h">
<Filter>PowerPC\Interpreter</Filter>
</ClInclude>
<ClInclude Include="PowerPC\Jit64\Jit.h"> <ClInclude Include="PowerPC\Jit64\Jit.h">
<Filter>PowerPC\Jit64</Filter> <Filter>PowerPC\Jit64</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="PowerPC\Jit64\Jit64_Tables.h">
<Filter>PowerPC\Jit64</Filter>
</ClInclude>
<ClInclude Include="HW\AudioInterface.h"> <ClInclude Include="HW\AudioInterface.h">
<Filter>HW %28Flipper/Hollywood%29\AI - Audio Interface</Filter> <Filter>HW %28Flipper/Hollywood%29\AI - Audio Interface</Filter>
</ClInclude> </ClInclude>
@ -1261,9 +1255,6 @@
<ClInclude Include="PowerPC\Jit64IL\JitIL.h"> <ClInclude Include="PowerPC\Jit64IL\JitIL.h">
<Filter>PowerPC\JitIL</Filter> <Filter>PowerPC\JitIL</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="PowerPC\Jit64IL\JitIL_Tables.h">
<Filter>PowerPC\JitIL</Filter>
</ClInclude>
<ClInclude Include="PowerPC\Jit64\FPURegCache.h"> <ClInclude Include="PowerPC\Jit64\FPURegCache.h">
<Filter>PowerPC\Jit64</Filter> <Filter>PowerPC\Jit64</Filter>
</ClInclude> </ClInclude>

View File

@ -63,6 +63,7 @@ void Interpreter::RunTable63(UGeckoInstruction inst)
void Interpreter::Init() void Interpreter::Init()
{ {
InitializeInstructionTables();
m_reserve = false; m_reserve = false;
m_end_block = false; m_end_block = false;
} }

View File

@ -282,6 +282,8 @@ public:
static u32 Helper_Carry(u32 value1, u32 value2); static u32 Helper_Carry(u32 value1, u32 value2);
private: private:
static void InitializeInstructionTables();
// flag helper // flag helper
static void Helper_UpdateCR0(u32 value); static void Helper_UpdateCR0(u32 value);
static void Helper_UpdateCR1(); static void Helper_UpdateCR1();

View File

@ -6,7 +6,6 @@
#include "Core/PowerPC/Gekko.h" #include "Core/PowerPC/Gekko.h"
#include "Core/PowerPC/Interpreter/Interpreter.h" #include "Core/PowerPC/Interpreter/Interpreter.h"
#include "Core/PowerPC/Interpreter/Interpreter_Tables.h"
#include "Core/PowerPC/PPCTables.h" #include "Core/PowerPC/PPCTables.h"
struct GekkoOPTemplate struct GekkoOPTemplate
@ -355,8 +354,6 @@ static std::array<GekkoOPTemplate, 10> table63_2 =
}}; }};
// clang-format on // clang-format on
namespace InterpreterTables
{
constexpr size_t TotalInstructionFunctionCount() constexpr size_t TotalInstructionFunctionCount()
{ {
return primarytable.size() + table4_2.size() + table4_3.size() + table4.size() + table31.size() + return primarytable.size() + table4_2.size() + table4_3.size() + table4.size() + table31.size() +
@ -366,7 +363,7 @@ constexpr size_t TotalInstructionFunctionCount()
static_assert(TotalInstructionFunctionCount() < m_allInstructions.size(), static_assert(TotalInstructionFunctionCount() < m_allInstructions.size(),
"m_allInstructions is too small"); "m_allInstructions is too small");
void InitTables() void Interpreter::InitializeInstructionTables()
{ {
// once initialized, tables are read-only // once initialized, tables are read-only
static bool initialized = false; static bool initialized = false;
@ -376,22 +373,22 @@ void InitTables()
// clear // clear
for (int i = 0; i < 64; i++) for (int i = 0; i < 64; i++)
{ {
Interpreter::m_op_table[i] = Interpreter::unknown_instruction; m_op_table[i] = Interpreter::unknown_instruction;
m_infoTable[i] = &unknownopinfo; m_infoTable[i] = &unknownopinfo;
} }
for (int i = 0; i < 32; i++) for (int i = 0; i < 32; i++)
{ {
Interpreter::m_op_table59[i] = Interpreter::unknown_instruction; m_op_table59[i] = Interpreter::unknown_instruction;
m_infoTable59[i] = &unknownopinfo; m_infoTable59[i] = &unknownopinfo;
} }
for (int i = 0; i < 1024; i++) for (int i = 0; i < 1024; i++)
{ {
Interpreter::m_op_table4[i] = Interpreter::unknown_instruction; m_op_table4[i] = Interpreter::unknown_instruction;
Interpreter::m_op_table19[i] = Interpreter::unknown_instruction; m_op_table19[i] = Interpreter::unknown_instruction;
Interpreter::m_op_table31[i] = Interpreter::unknown_instruction; m_op_table31[i] = Interpreter::unknown_instruction;
Interpreter::m_op_table63[i] = Interpreter::unknown_instruction; m_op_table63[i] = Interpreter::unknown_instruction;
m_infoTable4[i] = &unknownopinfo; m_infoTable4[i] = &unknownopinfo;
m_infoTable19[i] = &unknownopinfo; m_infoTable19[i] = &unknownopinfo;
m_infoTable31[i] = &unknownopinfo; m_infoTable31[i] = &unknownopinfo;
@ -400,7 +397,7 @@ void InitTables()
for (auto& tpl : primarytable) for (auto& tpl : primarytable)
{ {
Interpreter::m_op_table[tpl.opcode] = tpl.Inst; m_op_table[tpl.opcode] = tpl.Inst;
m_infoTable[tpl.opcode] = &tpl.opinfo; m_infoTable[tpl.opcode] = &tpl.opinfo;
} }
@ -410,7 +407,7 @@ void InitTables()
for (auto& tpl : table4_2) for (auto& tpl : table4_2)
{ {
int op = fill + tpl.opcode; int op = fill + tpl.opcode;
Interpreter::m_op_table4[op] = tpl.Inst; m_op_table4[op] = tpl.Inst;
m_infoTable4[op] = &tpl.opinfo; m_infoTable4[op] = &tpl.opinfo;
} }
} }
@ -421,7 +418,7 @@ void InitTables()
for (auto& tpl : table4_3) for (auto& tpl : table4_3)
{ {
int op = fill + tpl.opcode; int op = fill + tpl.opcode;
Interpreter::m_op_table4[op] = tpl.Inst; m_op_table4[op] = tpl.Inst;
m_infoTable4[op] = &tpl.opinfo; m_infoTable4[op] = &tpl.opinfo;
} }
} }
@ -429,35 +426,35 @@ void InitTables()
for (auto& tpl : table4) for (auto& tpl : table4)
{ {
int op = tpl.opcode; int op = tpl.opcode;
Interpreter::m_op_table4[op] = tpl.Inst; m_op_table4[op] = tpl.Inst;
m_infoTable4[op] = &tpl.opinfo; m_infoTable4[op] = &tpl.opinfo;
} }
for (auto& tpl : table31) for (auto& tpl : table31)
{ {
int op = tpl.opcode; int op = tpl.opcode;
Interpreter::m_op_table31[op] = tpl.Inst; m_op_table31[op] = tpl.Inst;
m_infoTable31[op] = &tpl.opinfo; m_infoTable31[op] = &tpl.opinfo;
} }
for (auto& tpl : table19) for (auto& tpl : table19)
{ {
int op = tpl.opcode; int op = tpl.opcode;
Interpreter::m_op_table19[op] = tpl.Inst; m_op_table19[op] = tpl.Inst;
m_infoTable19[op] = &tpl.opinfo; m_infoTable19[op] = &tpl.opinfo;
} }
for (auto& tpl : table59) for (auto& tpl : table59)
{ {
int op = tpl.opcode; int op = tpl.opcode;
Interpreter::m_op_table59[op] = tpl.Inst; m_op_table59[op] = tpl.Inst;
m_infoTable59[op] = &tpl.opinfo; m_infoTable59[op] = &tpl.opinfo;
} }
for (auto& tpl : table63) for (auto& tpl : table63)
{ {
int op = tpl.opcode; int op = tpl.opcode;
Interpreter::m_op_table63[op] = tpl.Inst; m_op_table63[op] = tpl.Inst;
m_infoTable63[op] = &tpl.opinfo; m_infoTable63[op] = &tpl.opinfo;
} }
@ -467,7 +464,7 @@ void InitTables()
for (auto& tpl : table63_2) for (auto& tpl : table63_2)
{ {
int op = fill + tpl.opcode; int op = fill + tpl.opcode;
Interpreter::m_op_table63[op] = tpl.Inst; m_op_table63[op] = tpl.Inst;
m_infoTable63[op] = &tpl.opinfo; m_infoTable63[op] = &tpl.opinfo;
} }
} }
@ -494,4 +491,3 @@ void InitTables()
initialized = true; initialized = true;
} }
} // namespace InterpreterTables

View File

@ -1,10 +0,0 @@
// Copyright 2008 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#pragma once
namespace InterpreterTables
{
void InitTables();
}

View File

@ -2,6 +2,8 @@
// Licensed under GPLv2+ // Licensed under GPLv2+
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include "Core/PowerPC/Jit64/Jit.h"
#include <map> #include <map>
#include <string> #include <string>
@ -22,8 +24,6 @@
#include "Core/HW/GPFifo.h" #include "Core/HW/GPFifo.h"
#include "Core/HW/ProcessorInterface.h" #include "Core/HW/ProcessorInterface.h"
#include "Core/PatchEngine.h" #include "Core/PatchEngine.h"
#include "Core/PowerPC/Jit64/Jit.h"
#include "Core/PowerPC/Jit64/Jit64_Tables.h"
#include "Core/PowerPC/Jit64/JitAsm.h" #include "Core/PowerPC/Jit64/JitAsm.h"
#include "Core/PowerPC/Jit64/JitRegCache.h" #include "Core/PowerPC/Jit64/JitRegCache.h"
#include "Core/PowerPC/Jit64Common/FarCodeCache.h" #include "Core/PowerPC/Jit64Common/FarCodeCache.h"
@ -216,6 +216,7 @@ bool Jit64::HandleFault(uintptr_t access_address, SContext* ctx)
void Jit64::Init() void Jit64::Init()
{ {
InitializeInstructionTables();
EnableBlockLink(); EnableBlockLink();
jo.optimizeGatherPipe = true; jo.optimizeGatherPipe = true;
@ -874,7 +875,7 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer* code_buf, JitBloc
fpr.BindToRegister(reg, true, false); fpr.BindToRegister(reg, true, false);
} }
Jit64Tables::CompileInstruction(*this, ops[i]); CompileInstruction(ops[i]);
if (jo.memcheck && (opinfo->flags & FL_LOADSTORE)) if (jo.memcheck && (opinfo->flags & FL_LOADSTORE))
{ {

View File

@ -31,37 +31,18 @@
class Jit64 : public Jitx86Base class Jit64 : public Jitx86Base
{ {
private:
void AllocStack();
void FreeStack();
GPRRegCache gpr{*this};
FPURegCache fpr{*this};
// The default code buffer. We keep it around to not have to alloc/dealloc a
// large chunk of memory for each recompiled block.
PPCAnalyst::CodeBuffer code_buffer;
Jit64AsmRoutineManager asm_routines;
bool m_enable_blr_optimization;
bool m_cleanup_after_stackfault;
u8* m_stack;
public: public:
Jit64() : code_buffer(32000) {} Jit64() : code_buffer(32000) {}
~Jit64() {} ~Jit64() {}
void Init() override; void Init() override;
void EnableOptimization();
void EnableBlockLink();
void Shutdown() override; void Shutdown() override;
bool HandleFault(uintptr_t access_address, SContext* ctx) override; bool HandleFault(uintptr_t access_address, SContext* ctx) override;
bool HandleStackFault() override; bool HandleStackFault() override;
void EnableOptimization();
void EnableBlockLink();
// Jit! // Jit!
void Jit(u32 em_address) override; void Jit(u32 em_address) override;
@ -248,4 +229,23 @@ public:
void dcbx(UGeckoInstruction inst); void dcbx(UGeckoInstruction inst);
void eieio(UGeckoInstruction inst); void eieio(UGeckoInstruction inst);
private:
static void InitializeInstructionTables();
void CompileInstruction(PPCAnalyst::CodeOp& op);
void AllocStack();
void FreeStack();
GPRRegCache gpr{*this};
FPURegCache fpr{*this};
// The default code buffer. We keep it around to not have to alloc/dealloc a
// large chunk of memory for each recompiled block.
PPCAnalyst::CodeBuffer code_buffer;
Jit64AsmRoutineManager asm_routines;
bool m_enable_blr_optimization;
bool m_cleanup_after_stackfault;
u8* m_stack;
}; };

View File

@ -4,7 +4,6 @@
#include "Core/PowerPC/Jit64/Jit.h" #include "Core/PowerPC/Jit64/Jit.h"
#include "Core/PowerPC/Gekko.h" #include "Core/PowerPC/Gekko.h"
#include "Core/PowerPC/Jit64/Jit64_Tables.h"
static Jit64::Instruction dynaOpTable[64]; static Jit64::Instruction dynaOpTable[64];
static Jit64::Instruction dynaOpTable4[1024]; static Jit64::Instruction dynaOpTable4[1024];
@ -358,26 +357,25 @@ static GekkoOPTemplate table63_2[] = {
{31, &Jit64::fmaddXX}, // fnmaddx {31, &Jit64::fmaddXX}, // fnmaddx
}; };
namespace Jit64Tables void Jit64::CompileInstruction(PPCAnalyst::CodeOp& op)
{ {
void CompileInstruction(Jit64& jit, PPCAnalyst::CodeOp& op) (this->*dynaOpTable[op.inst.OPCD])(op.inst);
{
(jit.*dynaOpTable[op.inst.OPCD])(op.inst);
GekkoOPInfo* info = op.opinfo; GekkoOPInfo* info = op.opinfo;
if (info) if (info)
{ {
#ifdef OPLOG #ifdef OPLOG
if (!strcmp(info->opname, OP_TO_LOG)) // "mcrfs" if (!strcmp(info->opname, OP_TO_LOG)) // "mcrfs"
{ {
rsplocations.push_back(jit.js.compilerPC); rsplocations.push_back(js.compilerPC);
} }
#endif #endif
info->compileCount++; info->compileCount++;
info->lastUse = jit.js.compilerPC; info->lastUse = js.compilerPC;
} }
} }
void InitTables() void Jit64::InitializeInstructionTables()
{ {
// once initialized, tables are read-only // once initialized, tables are read-only
static bool initialized = false; static bool initialized = false;
@ -470,5 +468,3 @@ void InitTables()
initialized = true; initialized = true;
} }
} // namespace

View File

@ -1,18 +0,0 @@
// Copyright 2008 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#pragma once
class Jit64;
namespace PPCAnalyst
{
struct CodeOp;
}
namespace Jit64Tables
{
void CompileInstruction(Jit64& jit, PPCAnalyst::CodeOp& op);
void InitTables();
}

View File

@ -2,6 +2,8 @@
// Licensed under GPLv2+ // Licensed under GPLv2+
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include "Core/PowerPC/Jit64IL/JitIL.h"
#include <cinttypes> #include <cinttypes>
#include <ctime> // For profiling #include <ctime> // For profiling
#include <map> #include <map>
@ -19,8 +21,6 @@
#include "Core/HW/CPU.h" #include "Core/HW/CPU.h"
#include "Core/PatchEngine.h" #include "Core/PatchEngine.h"
#include "Core/PowerPC/Jit64Common/Jit64PowerPCState.h" #include "Core/PowerPC/Jit64Common/Jit64PowerPCState.h"
#include "Core/PowerPC/Jit64IL/JitIL.h"
#include "Core/PowerPC/Jit64IL/JitIL_Tables.h"
#include "Core/PowerPC/PowerPC.h" #include "Core/PowerPC/PowerPC.h"
#include "Core/PowerPC/Profiler.h" #include "Core/PowerPC/Profiler.h"
@ -255,6 +255,7 @@ static void Shutdown()
void JitIL::Init() void JitIL::Init()
{ {
InitializeInstructionTables();
EnableBlockLink(); EnableBlockLink();
jo.optimizeGatherPipe = true; jo.optimizeGatherPipe = true;
@ -640,7 +641,7 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer* code_buf, JitBloc
ibuild.EmitBreakPointCheck(ibuild.EmitIntConst(ops[i].address)); ibuild.EmitBreakPointCheck(ibuild.EmitIntConst(ops[i].address));
} }
JitILTables::CompileInstruction(*this, ops[i]); CompileInstruction(ops[i]);
if (jo.memcheck && (opinfo->flags & FL_LOADSTORE)) if (jo.memcheck && (opinfo->flags & FL_LOADSTORE))
{ {

View File

@ -35,11 +35,10 @@ public:
// Initialization, etc // Initialization, etc
void Init() override; void Init() override;
void Shutdown() override;
void EnableBlockLink(); void EnableBlockLink();
void Shutdown() override;
// Jit! // Jit!
void Jit(u32 em_address) override; void Jit(u32 em_address) override;
@ -77,4 +76,8 @@ public:
void DynaRunTable31(UGeckoInstruction _inst) override; void DynaRunTable31(UGeckoInstruction _inst) override;
void DynaRunTable59(UGeckoInstruction _inst) override; void DynaRunTable59(UGeckoInstruction _inst) override;
void DynaRunTable63(UGeckoInstruction _inst) override; void DynaRunTable63(UGeckoInstruction _inst) override;
private:
static void InitializeInstructionTables();
void CompileInstruction(PPCAnalyst::CodeOp& op);
}; };

View File

@ -4,7 +4,6 @@
#include "Core/PowerPC/Jit64IL/JitIL.h" #include "Core/PowerPC/Jit64IL/JitIL.h"
#include "Core/PowerPC/Gekko.h" #include "Core/PowerPC/Gekko.h"
#include "Core/PowerPC/Jit64IL/JitIL_Tables.h"
#include "Core/PowerPC/PPCTables.h" #include "Core/PowerPC/PPCTables.h"
static JitIL::Instruction dynaOpTable[64]; static JitIL::Instruction dynaOpTable[64];
@ -376,31 +375,30 @@ static GekkoOPTemplate table63_2[] = {
{31, &JitIL::fmaddXX}, //"fnmaddx", OPTYPE_FPU, FL_RC_BIT_F}}, {31, &JitIL::fmaddXX}, //"fnmaddx", OPTYPE_FPU, FL_RC_BIT_F}},
}; };
namespace JitILTables void JitIL::CompileInstruction(PPCAnalyst::CodeOp& op)
{ {
void CompileInstruction(JitIL& jit, PPCAnalyst::CodeOp& op) (this->*dynaOpTable[op.inst.OPCD])(op.inst);
{
(jit.*dynaOpTable[op.inst.OPCD])(op.inst);
GekkoOPInfo* info = op.opinfo; GekkoOPInfo* info = op.opinfo;
if (info) if (info)
{ {
#ifdef OPLOG #ifdef OPLOG
if (!strcmp(info->opname, OP_TO_LOG)) // "mcrfs" if (!strcmp(info->opname, OP_TO_LOG)) // "mcrfs"
{ {
rsplocations.push_back(jit.js.compilerPC); rsplocations.push_back(js.compilerPC);
} }
#endif #endif
info->compileCount++; info->compileCount++;
info->lastUse = jit.js.compilerPC; info->lastUse = js.compilerPC;
} }
else else
{ {
PanicAlert("Tried to compile illegal (or unknown) instruction %08x, at %08x", op.inst.hex, PanicAlert("Tried to compile illegal (or unknown) instruction %08x, at %08x", op.inst.hex,
jit.js.compilerPC); js.compilerPC);
} }
} }
void InitTables() void JitIL::InitializeInstructionTables()
{ {
// once initialized, tables are read-only // once initialized, tables are read-only
static bool initialized = false; static bool initialized = false;
@ -493,4 +491,3 @@ void InitTables()
initialized = true; initialized = true;
} }
}

View File

@ -1,18 +0,0 @@
// Copyright 2008 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#pragma once
class JitIL;
namespace PPCAnalyst
{
struct CodeOp;
}
namespace JitILTables
{
void CompileInstruction(JitIL& jit, PPCAnalyst::CodeOp& op);
void InitTables();
}

View File

@ -2,6 +2,8 @@
// Licensed under GPLv2+ // Licensed under GPLv2+
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include "Core/PowerPC/JitArm64/Jit.h"
#include <cstdio> #include <cstdio>
#include "Common/Arm64Emitter.h" #include "Common/Arm64Emitter.h"
@ -19,9 +21,7 @@
#include "Core/HW/Memmap.h" #include "Core/HW/Memmap.h"
#include "Core/HW/ProcessorInterface.h" #include "Core/HW/ProcessorInterface.h"
#include "Core/PatchEngine.h" #include "Core/PatchEngine.h"
#include "Core/PowerPC/JitArm64/Jit.h"
#include "Core/PowerPC/JitArm64/JitArm64_RegCache.h" #include "Core/PowerPC/JitArm64/JitArm64_RegCache.h"
#include "Core/PowerPC/JitArm64/JitArm64_Tables.h"
#include "Core/PowerPC/JitInterface.h" #include "Core/PowerPC/JitInterface.h"
#include "Core/PowerPC/Profiler.h" #include "Core/PowerPC/Profiler.h"
@ -47,6 +47,8 @@ static bool HasCycleCounters()
void JitArm64::Init() void JitArm64::Init()
{ {
InitializeInstructionTables();
size_t child_code_size = SConfig::GetInstance().bMMU ? FARCODE_SIZE_MMU : FARCODE_SIZE; size_t child_code_size = SConfig::GetInstance().bMMU ? FARCODE_SIZE_MMU : FARCODE_SIZE;
AllocCodeSpace(CODE_SIZE + child_code_size); AllocCodeSpace(CODE_SIZE + child_code_size);
AddChildCodeSpace(&farcode, child_code_size); AddChildCodeSpace(&farcode, child_code_size);
@ -849,7 +851,7 @@ void JitArm64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer* code_buf, JitBlock*
js.firstFPInstructionFound = true; js.firstFPInstructionFound = true;
} }
JitArm64Tables::CompileInstruction(*this, ops[i]); CompileInstruction(ops[i]);
if (!MergeAllowedNextInstructions(1) || js.op[1].opinfo->type != OPTYPE_INTEGER) if (!MergeAllowedNextInstructions(1) || js.op[1].opinfo->type != OPTYPE_INTEGER)
FlushCarry(); FlushCarry();

View File

@ -172,29 +172,8 @@ private:
const u8* slowmem_code; const u8* slowmem_code;
}; };
// <Fastmem fault location, slowmem handler location> static void InitializeInstructionTables();
std::map<const u8*, FastmemArea> m_fault_to_handler; void CompileInstruction(PPCAnalyst::CodeOp& op);
std::map<SlowmemHandler, const u8*> m_handler_to_loc;
Arm64GPRCache gpr;
Arm64FPRCache fpr;
JitArm64BlockCache blocks{*this};
PPCAnalyst::CodeBuffer code_buffer;
ARM64FloatEmitter m_float_emit;
Arm64Gen::ARM64CodeBlock farcode;
u8* nearcode; // Backed up when we switch to far code.
// Do we support cycle counter profiling?
bool m_supports_cycle_counter;
bool m_enable_blr_optimization;
bool m_cleanup_after_stackfault = false;
u8* m_stack_base = nullptr;
u8* m_stack_pointer = nullptr;
u8* m_saved_stack_pointer = nullptr;
void EmitResetCycleCounters(); void EmitResetCycleCounters();
void EmitGetCycles(Arm64Gen::ARM64Reg reg); void EmitGetCycles(Arm64Gen::ARM64Reg reg);
@ -260,4 +239,28 @@ private:
void reg_imm(u32 d, u32 a, u32 value, u32 (*do_op)(u32, u32), void reg_imm(u32 d, u32 a, u32 value, u32 (*do_op)(u32, u32),
void (ARM64XEmitter::*op)(ARM64Reg, ARM64Reg, u64, ARM64Reg), bool Rc = false); void (ARM64XEmitter::*op)(ARM64Reg, ARM64Reg, u64, ARM64Reg), bool Rc = false);
// <Fastmem fault location, slowmem handler location>
std::map<const u8*, FastmemArea> m_fault_to_handler;
std::map<SlowmemHandler, const u8*> m_handler_to_loc;
Arm64GPRCache gpr;
Arm64FPRCache fpr;
JitArm64BlockCache blocks{*this};
PPCAnalyst::CodeBuffer code_buffer;
ARM64FloatEmitter m_float_emit;
Arm64Gen::ARM64CodeBlock farcode;
u8* nearcode; // Backed up when we switch to far code.
// Do we support cycle counter profiling?
bool m_supports_cycle_counter;
bool m_enable_blr_optimization;
bool m_cleanup_after_stackfault = false;
u8* m_stack_base = nullptr;
u8* m_stack_pointer = nullptr;
u8* m_saved_stack_pointer = nullptr;
}; };

View File

@ -2,10 +2,9 @@
// Licensed under GPLv2+ // Licensed under GPLv2+
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include "Core/PowerPC/JitArm64/JitArm64_Tables.h" #include "Core/PowerPC/JitArm64/Jit.h"
#include "Core/PowerPC/Gekko.h" #include "Core/PowerPC/Gekko.h"
#include "Core/PowerPC/JitArm64/Jit.h"
#include "Core/PowerPC/JitInterface.h" #include "Core/PowerPC/JitInterface.h"
#include "Core/PowerPC/PPCAnalyst.h" #include "Core/PowerPC/PPCAnalyst.h"
#include "Core/PowerPC/PPCTables.h" #include "Core/PowerPC/PPCTables.h"
@ -367,26 +366,25 @@ static GekkoOPTemplate table63_2[] = {
{31, &JitArm64::fp_arith}, // fnmaddx {31, &JitArm64::fp_arith}, // fnmaddx
}; };
namespace JitArm64Tables void JitArm64::CompileInstruction(PPCAnalyst::CodeOp& op)
{ {
void CompileInstruction(JitArm64& jit, PPCAnalyst::CodeOp& op) (this->*dynaOpTable[op.inst.OPCD])(op.inst);
{
(jit.*dynaOpTable[op.inst.OPCD])(op.inst);
GekkoOPInfo* info = op.opinfo; GekkoOPInfo* info = op.opinfo;
if (info) if (info)
{ {
#ifdef OPLOG #ifdef OPLOG
if (!strcmp(info->opname, OP_TO_LOG)) if (!strcmp(info->opname, OP_TO_LOG))
{ ///"mcrfs" { ///"mcrfs"
rsplocations.push_back(jit.js.compilerPC); rsplocations.push_back(js.compilerPC);
} }
#endif #endif
info->compileCount++; info->compileCount++;
info->lastUse = jit.js.compilerPC; info->lastUse = js.compilerPC;
} }
} }
void InitTables() void JitArm64::InitializeInstructionTables()
{ {
// once initialized, tables are read-only // once initialized, tables are read-only
static bool initialized = false; static bool initialized = false;
@ -479,5 +477,3 @@ void InitTables()
initialized = true; initialized = true;
} }
} // namespace

View File

@ -1,18 +0,0 @@
// Copyright 2008 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#pragma once
class JitArm64;
namespace PPCAnalyst
{
struct CodeOp;
}
namespace JitArm64Tables
{
void CompileInstruction(JitArm64& jit, PPCAnalyst::CodeOp& op);
void InitTables();
}

View File

@ -22,14 +22,11 @@
#if _M_X86 #if _M_X86
#include "Core/PowerPC/Jit64/Jit.h" #include "Core/PowerPC/Jit64/Jit.h"
#include "Core/PowerPC/Jit64/Jit64_Tables.h"
#include "Core/PowerPC/Jit64IL/JitIL.h" #include "Core/PowerPC/Jit64IL/JitIL.h"
#include "Core/PowerPC/Jit64IL/JitIL_Tables.h"
#endif #endif
#if _M_ARM_64 #if _M_ARM_64
#include "Core/PowerPC/JitArm64/Jit.h" #include "Core/PowerPC/JitArm64/Jit.h"
#include "Core/PowerPC/JitArm64/JitArm64_Tables.h"
#endif #endif
namespace JitInterface namespace JitInterface
@ -70,31 +67,7 @@ CPUCoreBase* InitJitCore(int core)
g_jit->Init(); g_jit->Init();
return ptr; return ptr;
} }
void InitTables(int core)
{
switch (core)
{
#if _M_X86
case PowerPC::CORE_JIT64:
Jit64Tables::InitTables();
break;
case PowerPC::CORE_JITIL64:
JitILTables::InitTables();
break;
#endif
#if _M_ARM_64
case PowerPC::CORE_JITARM64:
JitArm64Tables::InitTables();
break;
#endif
case PowerPC::CORE_CACHEDINTERPRETER:
// has no tables
break;
default:
PanicAlert("Unrecognizable cpu_core: %d", core);
break;
}
}
CPUCoreBase* GetCore() CPUCoreBase* GetCore()
{ {
return g_jit; return g_jit;

View File

@ -22,7 +22,6 @@ enum class ExceptionType
void DoState(PointerWrap& p); void DoState(PointerWrap& p);
CPUCoreBase* InitJitCore(int core); CPUCoreBase* InitJitCore(int core);
void InitTables(int core);
CPUCoreBase* GetCore(); CPUCoreBase* GetCore();
// Debugging // Debugging

View File

@ -15,7 +15,6 @@
#include "Common/StringUtil.h" #include "Common/StringUtil.h"
#include "Core/PowerPC/Interpreter/Interpreter.h" #include "Core/PowerPC/Interpreter/Interpreter.h"
#include "Core/PowerPC/Interpreter/Interpreter_Tables.h"
#include "Core/PowerPC/JitInterface.h" #include "Core/PowerPC/JitInterface.h"
#include "Core/PowerPC/PowerPC.h" #include "Core/PowerPC/PowerPC.h"
@ -110,15 +109,6 @@ bool UsesFPU(UGeckoInstruction inst)
return (info->flags & FL_USE_FPU) != 0; return (info->flags & FL_USE_FPU) != 0;
} }
void InitTables(int cpu_core)
{
// Interpreter ALWAYS needs to be initialized
InterpreterTables::InitTables();
if (cpu_core != PowerPC::CORE_INTERPRETER)
JitInterface::InitTables(cpu_core);
}
#define OPLOG #define OPLOG
#define OP_TO_LOG "mtfsb0x" #define OP_TO_LOG "mtfsb0x"

View File

@ -110,7 +110,6 @@ Interpreter::Instruction GetInterpreterOp(UGeckoInstruction _inst);
namespace PPCTables namespace PPCTables
{ {
void InitTables(int cpu_core);
bool IsValidInstruction(UGeckoInstruction _instCode); bool IsValidInstruction(UGeckoInstruction _instCode);
bool UsesFPU(UGeckoInstruction _inst); bool UsesFPU(UGeckoInstruction _inst);
@ -118,5 +117,4 @@ void CountInstruction(UGeckoInstruction _inst);
void PrintInstructionRunCounts(); void PrintInstructionRunCounts();
void LogCompiledInstructions(); void LogCompiledInstructions();
const char* GetInstructionName(UGeckoInstruction _inst); const char* GetInstructionName(UGeckoInstruction _inst);
} // namespace PPCTables
} // namespace

View File

@ -2,6 +2,8 @@
// Licensed under GPLv2+ // Licensed under GPLv2+
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include "Core/PowerPC/PowerPC.h"
#include "Common/Assert.h" #include "Common/Assert.h"
#include "Common/ChunkFile.h" #include "Common/ChunkFile.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
@ -18,8 +20,6 @@
#include "Core/PowerPC/CPUCoreBase.h" #include "Core/PowerPC/CPUCoreBase.h"
#include "Core/PowerPC/Interpreter/Interpreter.h" #include "Core/PowerPC/Interpreter/Interpreter.h"
#include "Core/PowerPC/JitInterface.h" #include "Core/PowerPC/JitInterface.h"
#include "Core/PowerPC/PPCTables.h"
#include "Core/PowerPC/PowerPC.h"
namespace PowerPC namespace PowerPC
{ {
@ -148,8 +148,6 @@ static void ResetRegisters()
static void InitializeCPUCore(int cpu_core) static void InitializeCPUCore(int cpu_core)
{ {
PPCTables::InitTables(cpu_core);
// We initialize the interpreter because // We initialize the interpreter because
// it is used on boot and code window independently. // it is used on boot and code window independently.
s_interpreter->Init(); s_interpreter->Init();