CPU Backends: Make each CPU backend responsible for initializing its own

instruction tables

Previously, all of the internals that handled how the instruction tables
are initialized were exposed externally. However, this can all be made
private to each CPU backend.

If each backend has an Init() function, then this is where the instruction
tables should be initialized, it shouldn't be the responsibility of
external code to ensure internal validity.

This allows for getting rid of all the table initialization shenanigans
within JitInterface and PPCTables.
This commit is contained in:
Lioncash 2017-02-08 04:27:04 -05:00
parent 5da7d700ca
commit 1ce1304d0f
23 changed files with 44 additions and 171 deletions

View File

@ -459,13 +459,10 @@
<ClInclude Include="PowerPC\CachedInterpreter\InterpreterBlockCache.h" />
<ClInclude Include="PowerPC\Interpreter\Interpreter.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_Tables.h" />
<ClInclude Include="PowerPC\Jit64\FPURegCache.h" />
<ClInclude Include="PowerPC\Jit64\GPRRegCache.h" />
<ClInclude Include="PowerPC\Jit64\Jit.h" />
<ClInclude Include="PowerPC\Jit64\Jit64_Tables.h" />
<ClInclude Include="PowerPC\Jit64\JitAsm.h" />
<ClInclude Include="PowerPC\Jit64\JitRegCache.h" />
<ClInclude Include="PowerPC\JitILCommon\IR.h" />

View File

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

View File

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

View File

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

View File

@ -6,7 +6,6 @@
#include "Core/PowerPC/Gekko.h"
#include "Core/PowerPC/Interpreter/Interpreter.h"
#include "Core/PowerPC/Interpreter/Interpreter_Tables.h"
#include "Core/PowerPC/PPCTables.h"
struct GekkoOPTemplate
@ -355,8 +354,6 @@ static std::array<GekkoOPTemplate, 10> table63_2 =
}};
// clang-format on
namespace InterpreterTables
{
constexpr size_t TotalInstructionFunctionCount()
{
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(),
"m_allInstructions is too small");
void InitTables()
void Interpreter::InitializeInstructionTables()
{
// once initialized, tables are read-only
static bool initialized = false;
@ -376,22 +373,22 @@ void InitTables()
// clear
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;
}
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;
}
for (int i = 0; i < 1024; i++)
{
Interpreter::m_op_table4[i] = Interpreter::unknown_instruction;
Interpreter::m_op_table19[i] = Interpreter::unknown_instruction;
Interpreter::m_op_table31[i] = Interpreter::unknown_instruction;
Interpreter::m_op_table63[i] = Interpreter::unknown_instruction;
m_op_table4[i] = Interpreter::unknown_instruction;
m_op_table19[i] = Interpreter::unknown_instruction;
m_op_table31[i] = Interpreter::unknown_instruction;
m_op_table63[i] = Interpreter::unknown_instruction;
m_infoTable4[i] = &unknownopinfo;
m_infoTable19[i] = &unknownopinfo;
m_infoTable31[i] = &unknownopinfo;
@ -400,7 +397,7 @@ void InitTables()
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;
}
@ -410,7 +407,7 @@ void InitTables()
for (auto& tpl : table4_2)
{
int op = fill + tpl.opcode;
Interpreter::m_op_table4[op] = tpl.Inst;
m_op_table4[op] = tpl.Inst;
m_infoTable4[op] = &tpl.opinfo;
}
}
@ -421,7 +418,7 @@ void InitTables()
for (auto& tpl : table4_3)
{
int op = fill + tpl.opcode;
Interpreter::m_op_table4[op] = tpl.Inst;
m_op_table4[op] = tpl.Inst;
m_infoTable4[op] = &tpl.opinfo;
}
}
@ -429,35 +426,35 @@ void InitTables()
for (auto& tpl : table4)
{
int op = tpl.opcode;
Interpreter::m_op_table4[op] = tpl.Inst;
m_op_table4[op] = tpl.Inst;
m_infoTable4[op] = &tpl.opinfo;
}
for (auto& tpl : table31)
{
int op = tpl.opcode;
Interpreter::m_op_table31[op] = tpl.Inst;
m_op_table31[op] = tpl.Inst;
m_infoTable31[op] = &tpl.opinfo;
}
for (auto& tpl : table19)
{
int op = tpl.opcode;
Interpreter::m_op_table19[op] = tpl.Inst;
m_op_table19[op] = tpl.Inst;
m_infoTable19[op] = &tpl.opinfo;
}
for (auto& tpl : table59)
{
int op = tpl.opcode;
Interpreter::m_op_table59[op] = tpl.Inst;
m_op_table59[op] = tpl.Inst;
m_infoTable59[op] = &tpl.opinfo;
}
for (auto& tpl : table63)
{
int op = tpl.opcode;
Interpreter::m_op_table63[op] = tpl.Inst;
m_op_table63[op] = tpl.Inst;
m_infoTable63[op] = &tpl.opinfo;
}
@ -467,7 +464,7 @@ void InitTables()
for (auto& tpl : table63_2)
{
int op = fill + tpl.opcode;
Interpreter::m_op_table63[op] = tpl.Inst;
m_op_table63[op] = tpl.Inst;
m_infoTable63[op] = &tpl.opinfo;
}
}
@ -494,4 +491,3 @@ void InitTables()
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+
// Refer to the license.txt file included.
#include "Core/PowerPC/Jit64/Jit.h"
#include <map>
#include <string>
@ -22,8 +24,6 @@
#include "Core/HW/GPFifo.h"
#include "Core/HW/ProcessorInterface.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/JitRegCache.h"
#include "Core/PowerPC/Jit64Common/FarCodeCache.h"
@ -216,6 +216,7 @@ bool Jit64::HandleFault(uintptr_t access_address, SContext* ctx)
void Jit64::Init()
{
InitializeInstructionTables();
EnableBlockLink();
jo.optimizeGatherPipe = true;

View File

@ -35,17 +35,14 @@ public:
Jit64() : code_buffer(32000) {}
~Jit64() {}
void Init() override;
void EnableOptimization();
void EnableBlockLink();
void Shutdown() override;
bool HandleFault(uintptr_t access_address, SContext* ctx) override;
bool HandleStackFault() override;
void EnableOptimization();
void EnableBlockLink();
// Jit!
void Jit(u32 em_address) override;
@ -234,6 +231,7 @@ public:
void eieio(UGeckoInstruction inst);
private:
static void InitializeInstructionTables();
void CompileInstruction(PPCAnalyst::CodeOp& op);
void AllocStack();

View File

@ -4,7 +4,6 @@
#include "Core/PowerPC/Jit64/Jit.h"
#include "Core/PowerPC/Gekko.h"
#include "Core/PowerPC/Jit64/Jit64_Tables.h"
static Jit64::Instruction dynaOpTable[64];
static Jit64::Instruction dynaOpTable4[1024];
@ -376,9 +375,7 @@ void Jit64::CompileInstruction(PPCAnalyst::CodeOp& op)
}
}
namespace Jit64Tables
{
void InitTables()
void Jit64::InitializeInstructionTables()
{
// once initialized, tables are read-only
static bool initialized = false;
@ -471,5 +468,3 @@ void InitTables()
initialized = true;
}
} // namespace

View File

@ -1,17 +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 InitTables();
}

View File

@ -2,6 +2,8 @@
// Licensed under GPLv2+
// Refer to the license.txt file included.
#include "Core/PowerPC/Jit64IL/JitIL.h"
#include <cinttypes>
#include <ctime> // For profiling
#include <map>
@ -19,8 +21,6 @@
#include "Core/HW/CPU.h"
#include "Core/PatchEngine.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/Profiler.h"
@ -255,6 +255,7 @@ static void Shutdown()
void JitIL::Init()
{
InitializeInstructionTables();
EnableBlockLink();
jo.optimizeGatherPipe = true;

View File

@ -35,11 +35,10 @@ public:
// Initialization, etc
void Init() override;
void Shutdown() override;
void EnableBlockLink();
void Shutdown() override;
// Jit!
void Jit(u32 em_address) override;
@ -79,5 +78,6 @@ public:
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/Gekko.h"
#include "Core/PowerPC/Jit64IL/JitIL_Tables.h"
#include "Core/PowerPC/PPCTables.h"
static JitIL::Instruction dynaOpTable[64];
@ -399,9 +398,7 @@ void JitIL::CompileInstruction(PPCAnalyst::CodeOp& op)
}
}
namespace JitILTables
{
void InitTables()
void JitIL::InitializeInstructionTables()
{
// once initialized, tables are read-only
static bool initialized = false;
@ -494,4 +491,3 @@ void InitTables()
initialized = true;
}
}

View File

@ -1,17 +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 InitTables();
}

View File

@ -2,6 +2,8 @@
// Licensed under GPLv2+
// Refer to the license.txt file included.
#include "Core/PowerPC/JitArm64/Jit.h"
#include <cstdio>
#include "Common/Arm64Emitter.h"
@ -19,9 +21,7 @@
#include "Core/HW/Memmap.h"
#include "Core/HW/ProcessorInterface.h"
#include "Core/PatchEngine.h"
#include "Core/PowerPC/JitArm64/Jit.h"
#include "Core/PowerPC/JitArm64/JitArm64_RegCache.h"
#include "Core/PowerPC/JitArm64/JitArm64_Tables.h"
#include "Core/PowerPC/JitInterface.h"
#include "Core/PowerPC/Profiler.h"
@ -47,6 +47,8 @@ static bool HasCycleCounters()
void JitArm64::Init()
{
InitializeInstructionTables();
size_t child_code_size = SConfig::GetInstance().bMMU ? FARCODE_SIZE_MMU : FARCODE_SIZE;
AllocCodeSpace(CODE_SIZE + child_code_size);
AddChildCodeSpace(&farcode, child_code_size);

View File

@ -172,6 +172,7 @@ private:
const u8* slowmem_code;
};
static void InitializeInstructionTables();
void CompileInstruction(PPCAnalyst::CodeOp& op);
void EmitResetCycleCounters();

View File

@ -2,10 +2,9 @@
// Licensed under GPLv2+
// 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/JitArm64/Jit.h"
#include "Core/PowerPC/JitInterface.h"
#include "Core/PowerPC/PPCAnalyst.h"
#include "Core/PowerPC/PPCTables.h"
@ -385,9 +384,7 @@ void JitArm64::CompileInstruction(PPCAnalyst::CodeOp& op)
}
}
namespace JitArm64Tables
{
void InitTables()
void JitArm64::InitializeInstructionTables()
{
// once initialized, tables are read-only
static bool initialized = false;
@ -480,5 +477,3 @@ void InitTables()
initialized = true;
}
} // namespace

View File

@ -1,17 +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 InitTables();
}

View File

@ -22,14 +22,11 @@
#if _M_X86
#include "Core/PowerPC/Jit64/Jit.h"
#include "Core/PowerPC/Jit64/Jit64_Tables.h"
#include "Core/PowerPC/Jit64IL/JitIL.h"
#include "Core/PowerPC/Jit64IL/JitIL_Tables.h"
#endif
#if _M_ARM_64
#include "Core/PowerPC/JitArm64/Jit.h"
#include "Core/PowerPC/JitArm64/JitArm64_Tables.h"
#endif
namespace JitInterface
@ -70,31 +67,7 @@ CPUCoreBase* InitJitCore(int core)
g_jit->Init();
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()
{
return g_jit;

View File

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

View File

@ -15,7 +15,6 @@
#include "Common/StringUtil.h"
#include "Core/PowerPC/Interpreter/Interpreter.h"
#include "Core/PowerPC/Interpreter/Interpreter_Tables.h"
#include "Core/PowerPC/JitInterface.h"
#include "Core/PowerPC/PowerPC.h"
@ -110,15 +109,6 @@ bool UsesFPU(UGeckoInstruction inst)
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 OP_TO_LOG "mtfsb0x"

View File

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

View File

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