Merge pull request #4862 from lioncash/compile
CPU Backends: Make instruction table initialization private
This commit is contained in:
commit
6f272b3a4c
|
@ -463,13 +463,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" />
|
||||
|
|
|
@ -940,15 +940,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>
|
||||
|
@ -1261,9 +1255,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>
|
||||
|
|
|
@ -63,6 +63,7 @@ void Interpreter::RunTable63(UGeckoInstruction inst)
|
|||
|
||||
void Interpreter::Init()
|
||||
{
|
||||
InitializeInstructionTables();
|
||||
m_reserve = false;
|
||||
m_end_block = false;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -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;
|
||||
|
@ -874,7 +875,7 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer* code_buf, JitBloc
|
|||
fpr.BindToRegister(reg, true, false);
|
||||
}
|
||||
|
||||
Jit64Tables::CompileInstruction(*this, ops[i]);
|
||||
CompileInstruction(ops[i]);
|
||||
|
||||
if (jo.memcheck && (opinfo->flags & FL_LOADSTORE))
|
||||
{
|
||||
|
|
|
@ -31,37 +31,18 @@
|
|||
|
||||
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:
|
||||
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;
|
||||
|
@ -248,4 +229,23 @@ public:
|
|||
void dcbx(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;
|
||||
};
|
||||
|
|
|
@ -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];
|
||||
|
@ -358,26 +357,25 @@ static GekkoOPTemplate table63_2[] = {
|
|||
{31, &Jit64::fmaddXX}, // fnmaddx
|
||||
};
|
||||
|
||||
namespace Jit64Tables
|
||||
void Jit64::CompileInstruction(PPCAnalyst::CodeOp& op)
|
||||
{
|
||||
void CompileInstruction(Jit64& jit, PPCAnalyst::CodeOp& op)
|
||||
{
|
||||
(jit.*dynaOpTable[op.inst.OPCD])(op.inst);
|
||||
(this->*dynaOpTable[op.inst.OPCD])(op.inst);
|
||||
|
||||
GekkoOPInfo* info = op.opinfo;
|
||||
if (info)
|
||||
{
|
||||
#ifdef OPLOG
|
||||
if (!strcmp(info->opname, OP_TO_LOG)) // "mcrfs"
|
||||
{
|
||||
rsplocations.push_back(jit.js.compilerPC);
|
||||
rsplocations.push_back(js.compilerPC);
|
||||
}
|
||||
#endif
|
||||
info->compileCount++;
|
||||
info->lastUse = jit.js.compilerPC;
|
||||
info->lastUse = js.compilerPC;
|
||||
}
|
||||
}
|
||||
|
||||
void InitTables()
|
||||
void Jit64::InitializeInstructionTables()
|
||||
{
|
||||
// once initialized, tables are read-only
|
||||
static bool initialized = false;
|
||||
|
@ -470,5 +468,3 @@ void InitTables()
|
|||
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -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;
|
||||
|
@ -640,7 +641,7 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer* code_buf, JitBloc
|
|||
ibuild.EmitBreakPointCheck(ibuild.EmitIntConst(ops[i].address));
|
||||
}
|
||||
|
||||
JitILTables::CompileInstruction(*this, ops[i]);
|
||||
CompileInstruction(ops[i]);
|
||||
|
||||
if (jo.memcheck && (opinfo->flags & FL_LOADSTORE))
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
@ -77,4 +76,8 @@ public:
|
|||
void DynaRunTable31(UGeckoInstruction _inst) override;
|
||||
void DynaRunTable59(UGeckoInstruction _inst) override;
|
||||
void DynaRunTable63(UGeckoInstruction _inst) override;
|
||||
|
||||
private:
|
||||
static void InitializeInstructionTables();
|
||||
void CompileInstruction(PPCAnalyst::CodeOp& op);
|
||||
};
|
||||
|
|
|
@ -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];
|
||||
|
@ -376,31 +375,30 @@ static GekkoOPTemplate table63_2[] = {
|
|||
{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)
|
||||
{
|
||||
(jit.*dynaOpTable[op.inst.OPCD])(op.inst);
|
||||
(this->*dynaOpTable[op.inst.OPCD])(op.inst);
|
||||
|
||||
GekkoOPInfo* info = op.opinfo;
|
||||
if (info)
|
||||
{
|
||||
#ifdef OPLOG
|
||||
if (!strcmp(info->opname, OP_TO_LOG)) // "mcrfs"
|
||||
{
|
||||
rsplocations.push_back(jit.js.compilerPC);
|
||||
rsplocations.push_back(js.compilerPC);
|
||||
}
|
||||
#endif
|
||||
info->compileCount++;
|
||||
info->lastUse = jit.js.compilerPC;
|
||||
info->lastUse = js.compilerPC;
|
||||
}
|
||||
else
|
||||
{
|
||||
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
|
||||
static bool initialized = false;
|
||||
|
@ -493,4 +491,3 @@ void InitTables()
|
|||
|
||||
initialized = true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -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);
|
||||
|
@ -849,7 +851,7 @@ void JitArm64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer* code_buf, JitBlock*
|
|||
js.firstFPInstructionFound = true;
|
||||
}
|
||||
|
||||
JitArm64Tables::CompileInstruction(*this, ops[i]);
|
||||
CompileInstruction(ops[i]);
|
||||
if (!MergeAllowedNextInstructions(1) || js.op[1].opinfo->type != OPTYPE_INTEGER)
|
||||
FlushCarry();
|
||||
|
||||
|
|
|
@ -172,29 +172,8 @@ private:
|
|||
const u8* slowmem_code;
|
||||
};
|
||||
|
||||
// <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;
|
||||
static void InitializeInstructionTables();
|
||||
void CompileInstruction(PPCAnalyst::CodeOp& op);
|
||||
|
||||
void EmitResetCycleCounters();
|
||||
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 (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;
|
||||
};
|
||||
|
|
|
@ -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"
|
||||
|
@ -367,26 +366,25 @@ static GekkoOPTemplate table63_2[] = {
|
|||
{31, &JitArm64::fp_arith}, // fnmaddx
|
||||
};
|
||||
|
||||
namespace JitArm64Tables
|
||||
void JitArm64::CompileInstruction(PPCAnalyst::CodeOp& op)
|
||||
{
|
||||
void CompileInstruction(JitArm64& jit, PPCAnalyst::CodeOp& op)
|
||||
{
|
||||
(jit.*dynaOpTable[op.inst.OPCD])(op.inst);
|
||||
(this->*dynaOpTable[op.inst.OPCD])(op.inst);
|
||||
|
||||
GekkoOPInfo* info = op.opinfo;
|
||||
if (info)
|
||||
{
|
||||
#ifdef OPLOG
|
||||
if (!strcmp(info->opname, OP_TO_LOG))
|
||||
{ ///"mcrfs"
|
||||
rsplocations.push_back(jit.js.compilerPC);
|
||||
rsplocations.push_back(js.compilerPC);
|
||||
}
|
||||
#endif
|
||||
info->compileCount++;
|
||||
info->lastUse = jit.js.compilerPC;
|
||||
info->lastUse = js.compilerPC;
|
||||
}
|
||||
}
|
||||
|
||||
void InitTables()
|
||||
void JitArm64::InitializeInstructionTables()
|
||||
{
|
||||
// once initialized, tables are read-only
|
||||
static bool initialized = false;
|
||||
|
@ -479,5 +477,3 @@ void InitTables()
|
|||
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -22,7 +22,6 @@ enum class ExceptionType
|
|||
void DoState(PointerWrap& p);
|
||||
|
||||
CPUCoreBase* InitJitCore(int core);
|
||||
void InitTables(int core);
|
||||
CPUCoreBase* GetCore();
|
||||
|
||||
// Debugging
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue