mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
Core: Clean up brace/body placements for JitIL
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -174,8 +174,12 @@ namespace JitILProfiler
|
||||
u64 codeHash;
|
||||
u64 totalElapsed;
|
||||
u64 numberOfCalls;
|
||||
Block() : index(0), codeHash(0), totalElapsed(0), numberOfCalls(0) { }
|
||||
|
||||
Block() : index(0), codeHash(0), totalElapsed(0), numberOfCalls(0)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
static std::vector<Block> blocks;
|
||||
static u32 blockIndex;
|
||||
static u64 beginTime;
|
||||
@@ -188,6 +192,7 @@ namespace JitILProfiler
|
||||
block.codeHash = codeHash;
|
||||
return block;
|
||||
}
|
||||
|
||||
// These functions need to be static because they are called with
|
||||
// ABI_CallFunction().
|
||||
static void Begin(u32 index)
|
||||
@@ -195,6 +200,7 @@ namespace JitILProfiler
|
||||
blockIndex = index;
|
||||
beginTime = __rdtsc();
|
||||
}
|
||||
|
||||
static void End()
|
||||
{
|
||||
const u64 endTime = __rdtsc();
|
||||
@@ -203,6 +209,7 @@ namespace JitILProfiler
|
||||
block.totalElapsed += duration;
|
||||
++block.numberOfCalls;
|
||||
}
|
||||
|
||||
struct JitILProfilerFinalizer
|
||||
{
|
||||
virtual ~JitILProfilerFinalizer()
|
||||
@@ -221,11 +228,13 @@ namespace JitILProfiler
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
static std::unique_ptr<JitILProfilerFinalizer> finalizer;
|
||||
static void Init()
|
||||
{
|
||||
finalizer = std::make_unique<JitILProfilerFinalizer>();
|
||||
}
|
||||
|
||||
static void Shutdown()
|
||||
{
|
||||
finalizer.reset();
|
||||
@@ -246,10 +255,14 @@ void JitIL::Init()
|
||||
else
|
||||
{
|
||||
if (!Core::g_CoreStartupParameter.bJITBlockLinking)
|
||||
{
|
||||
jo.enableBlocklink = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Speed boost, but not 100% safe
|
||||
jo.enableBlocklink = !Core::g_CoreStartupParameter.bMMU;
|
||||
}
|
||||
}
|
||||
|
||||
jo.fpAccurateFcmp = false;
|
||||
@@ -268,7 +281,8 @@ void JitIL::Init()
|
||||
code_block.m_gpa = &js.gpa;
|
||||
code_block.m_fpa = &js.fpa;
|
||||
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) {
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling)
|
||||
{
|
||||
JitILProfiler::Init();
|
||||
}
|
||||
}
|
||||
@@ -282,7 +296,8 @@ void JitIL::ClearCache()
|
||||
|
||||
void JitIL::Shutdown()
|
||||
{
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) {
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling)
|
||||
{
|
||||
JitILProfiler::Shutdown();
|
||||
}
|
||||
|
||||
@@ -352,11 +367,14 @@ static void ImHere()
|
||||
PowerPC::ppcState.gpr[5], PowerPC::ppcState.gpr[6]);
|
||||
f.Flush();
|
||||
}
|
||||
if (been_here.find(PC) != been_here.end()) {
|
||||
|
||||
if (been_here.find(PC) != been_here.end())
|
||||
{
|
||||
been_here.find(PC)->second++;
|
||||
if ((been_here.find(PC)->second) & 1023)
|
||||
return;
|
||||
}
|
||||
|
||||
DEBUG_LOG(DYNA_REC, "I'm here - PC = %08x , LR = %08x", PC, LR);
|
||||
been_here[PC] = 1;
|
||||
}
|
||||
@@ -376,7 +394,8 @@ void JitIL::Cleanup()
|
||||
void JitIL::WriteExit(u32 destination)
|
||||
{
|
||||
Cleanup();
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) {
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling)
|
||||
{
|
||||
ABI_CallFunction((void *)JitILProfiler::End);
|
||||
}
|
||||
SUB(32, M(&PowerPC::ppcState.downcount), Imm32(js.downcountAmount));
|
||||
@@ -408,7 +427,8 @@ void JitIL::WriteExitDestInOpArg(const Gen::OpArg& arg)
|
||||
{
|
||||
MOV(32, M(&PC), arg);
|
||||
Cleanup();
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) {
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling)
|
||||
{
|
||||
ABI_CallFunction((void *)JitILProfiler::End);
|
||||
}
|
||||
SUB(32, M(&PowerPC::ppcState.downcount), Imm32(js.downcountAmount));
|
||||
@@ -420,7 +440,8 @@ void JitIL::WriteRfiExitDestInOpArg(const Gen::OpArg& arg)
|
||||
MOV(32, M(&PC), arg);
|
||||
MOV(32, M(&NPC), arg);
|
||||
Cleanup();
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) {
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling)
|
||||
{
|
||||
ABI_CallFunction((void *)JitILProfiler::End);
|
||||
}
|
||||
ABI_CallFunction(reinterpret_cast<void *>(&PowerPC::CheckExceptions));
|
||||
@@ -431,7 +452,8 @@ void JitIL::WriteRfiExitDestInOpArg(const Gen::OpArg& arg)
|
||||
void JitIL::WriteExceptionExit()
|
||||
{
|
||||
Cleanup();
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) {
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling)
|
||||
{
|
||||
ABI_CallFunction((void *)JitILProfiler::End);
|
||||
}
|
||||
MOV(32, R(EAX), M(&PC));
|
||||
@@ -554,7 +576,7 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
|
||||
|
||||
u64 codeHash = -1;
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling ||
|
||||
SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILOutputIR)
|
||||
SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILOutputIR)
|
||||
{
|
||||
// For profiling and IR Writer
|
||||
for (u32 i = 0; i < code_block.m_num_instructions; i++)
|
||||
@@ -577,7 +599,7 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
|
||||
|
||||
js.downcountAmount = 0;
|
||||
if (!Core::g_CoreStartupParameter.bEnableDebugging)
|
||||
js.downcountAmount += PatchEngine::GetSpeedhackCycles(code_block.m_address);
|
||||
js.downcountAmount += PatchEngine::GetSpeedhackCycles(code_block.m_address);
|
||||
|
||||
// Translate instructions
|
||||
for (u32 i = 0; i < code_block.m_num_instructions; i++)
|
||||
|
||||
@@ -67,19 +67,22 @@ public:
|
||||
bool IsInCodeSpace(u8 *ptr) override { return IsInSpace(ptr); }
|
||||
|
||||
void ClearCache() override;
|
||||
const u8 *GetDispatcher() {
|
||||
const u8 *GetDispatcher()
|
||||
{
|
||||
return asm_routines.dispatcher; // asm_routines.dispatcher
|
||||
}
|
||||
const CommonAsmRoutines *GetAsmRoutines() override {
|
||||
|
||||
const CommonAsmRoutines *GetAsmRoutines() override
|
||||
{
|
||||
return &asm_routines;
|
||||
}
|
||||
|
||||
const char *GetName() override {
|
||||
const char *GetName() override
|
||||
{
|
||||
return "JIT64IL";
|
||||
}
|
||||
|
||||
// Run!
|
||||
|
||||
void Run() override;
|
||||
void SingleStep() override;
|
||||
|
||||
|
||||
@@ -376,15 +376,19 @@ void CompileInstruction(PPCAnalyst::CodeOp & op)
|
||||
JitIL *jitil = (JitIL *)jit;
|
||||
(jitil->*dynaOpTable[op.inst.OPCD])(op.inst);
|
||||
GekkoOPInfo *info = op.opinfo;
|
||||
if (info) {
|
||||
if (info)
|
||||
{
|
||||
#ifdef OPLOG
|
||||
if (!strcmp(info->opname, OP_TO_LOG)){ ///"mcrfs"
|
||||
if (!strcmp(info->opname, OP_TO_LOG)) // "mcrfs"
|
||||
{
|
||||
rsplocations.push_back(jit.js.compilerPC);
|
||||
}
|
||||
#endif
|
||||
info->compileCount++;
|
||||
info->lastUse = jit->js.compilerPC;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
PanicAlert("Tried to compile illegal (or unknown) instruction %08x, at %08x", op.inst.hex, jit->js.compilerPC);
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -43,7 +43,8 @@ void JitILBase::bx(UGeckoInstruction inst)
|
||||
// If this is not the last instruction of a block,
|
||||
// we will skip the rest process.
|
||||
// Because PPCAnalyst::Flatten() merged the blocks.
|
||||
if (!js.isLastInstruction) {
|
||||
if (!js.isLastInstruction)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -53,7 +54,8 @@ void JitILBase::bx(UGeckoInstruction inst)
|
||||
else
|
||||
destination = js.compilerPC + SignExt26(inst.LI << 2);
|
||||
|
||||
if (destination == js.compilerPC) {
|
||||
if (destination == js.compilerPC)
|
||||
{
|
||||
ibuild.EmitShortIdleLoop(ibuild.EmitIntConst(js.compilerPC));
|
||||
return;
|
||||
}
|
||||
@@ -85,36 +87,40 @@ static IREmitter::InstLoc EmitCRTest(IREmitter::IRBuilder& ibuild, UGeckoInstruc
|
||||
return CRTest;
|
||||
}
|
||||
|
||||
static IREmitter::InstLoc TestBranch(IREmitter::IRBuilder& ibuild, UGeckoInstruction inst) {
|
||||
static IREmitter::InstLoc TestBranch(IREmitter::IRBuilder& ibuild, UGeckoInstruction inst)
|
||||
{
|
||||
IREmitter::InstLoc CRTest = nullptr, CTRTest = nullptr;
|
||||
if ((inst.BO & 16) == 0) // Test a CR bit
|
||||
{
|
||||
CRTest = EmitCRTest(ibuild, inst);
|
||||
}
|
||||
|
||||
if ((inst.BO & 4) == 0) {
|
||||
if ((inst.BO & 4) == 0)
|
||||
{
|
||||
IREmitter::InstLoc c = ibuild.EmitLoadCTR();
|
||||
c = ibuild.EmitSub(c, ibuild.EmitIntConst(1));
|
||||
ibuild.EmitStoreCTR(c);
|
||||
if (inst.BO & 2) {
|
||||
CTRTest = ibuild.EmitICmpEq(c,
|
||||
ibuild.EmitIntConst(0));
|
||||
} else {
|
||||
|
||||
if (inst.BO & 2)
|
||||
CTRTest = ibuild.EmitICmpEq(c, ibuild.EmitIntConst(0));
|
||||
else
|
||||
CTRTest = c;
|
||||
}
|
||||
}
|
||||
|
||||
IREmitter::InstLoc Test = CRTest;
|
||||
if (CTRTest) {
|
||||
if (CTRTest)
|
||||
{
|
||||
if (Test)
|
||||
Test = ibuild.EmitAnd(Test, CTRTest);
|
||||
else
|
||||
Test = CTRTest;
|
||||
}
|
||||
|
||||
if (!Test) {
|
||||
if (!Test)
|
||||
{
|
||||
Test = ibuild.EmitIntConst(1);
|
||||
}
|
||||
|
||||
return Test;
|
||||
}
|
||||
|
||||
@@ -122,8 +128,7 @@ void JitILBase::bcx(UGeckoInstruction inst)
|
||||
{
|
||||
NORMALBRANCH_START
|
||||
if (inst.LK)
|
||||
ibuild.EmitStoreLink(
|
||||
ibuild.EmitIntConst(js.compilerPC + 4));
|
||||
ibuild.EmitStoreLink(ibuild.EmitIntConst(js.compilerPC + 4));
|
||||
|
||||
IREmitter::InstLoc Test = TestBranch(ibuild, inst);
|
||||
|
||||
@@ -134,11 +139,11 @@ void JitILBase::bcx(UGeckoInstruction inst)
|
||||
destination = js.compilerPC + SignExt16(inst.BD << 2);
|
||||
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bSkipIdle &&
|
||||
inst.hex == 0x4182fff8 &&
|
||||
(Memory::ReadUnchecked_U32(js.compilerPC - 8) & 0xFFFF0000) == 0x800D0000 &&
|
||||
(Memory::ReadUnchecked_U32(js.compilerPC - 4) == 0x28000000 ||
|
||||
(SConfig::GetInstance().m_LocalCoreStartupParameter.bWii && Memory::ReadUnchecked_U32(js.compilerPC - 4) == 0x2C000000))
|
||||
)
|
||||
inst.hex == 0x4182fff8 &&
|
||||
(Memory::ReadUnchecked_U32(js.compilerPC - 8) & 0xFFFF0000) == 0x800D0000 &&
|
||||
(Memory::ReadUnchecked_U32(js.compilerPC - 4) == 0x28000000 ||
|
||||
(SConfig::GetInstance().m_LocalCoreStartupParameter.bWii && Memory::ReadUnchecked_U32(js.compilerPC - 4) == 0x2C000000))
|
||||
)
|
||||
{
|
||||
ibuild.EmitIdleBranch(Test, ibuild.EmitIntConst(destination));
|
||||
}
|
||||
@@ -152,11 +157,13 @@ void JitILBase::bcx(UGeckoInstruction inst)
|
||||
void JitILBase::bcctrx(UGeckoInstruction inst)
|
||||
{
|
||||
NORMALBRANCH_START
|
||||
if ((inst.BO & 4) == 0) {
|
||||
if ((inst.BO & 4) == 0)
|
||||
{
|
||||
IREmitter::InstLoc c = ibuild.EmitLoadCTR();
|
||||
c = ibuild.EmitSub(c, ibuild.EmitIntConst(1));
|
||||
ibuild.EmitStoreCTR(c);
|
||||
}
|
||||
|
||||
IREmitter::InstLoc test;
|
||||
if ((inst.BO & 16) == 0) // Test a CR bit
|
||||
{
|
||||
@@ -181,16 +188,19 @@ void JitILBase::bclrx(UGeckoInstruction inst)
|
||||
NORMALBRANCH_START
|
||||
|
||||
if (!js.isLastInstruction &&
|
||||
(inst.BO & (1 << 4)) && (inst.BO & (1 << 2))) {
|
||||
(inst.BO & (1 << 4)) && (inst.BO & (1 << 2)))
|
||||
{
|
||||
if (inst.LK)
|
||||
ibuild.EmitStoreLink(ibuild.EmitIntConst(js.compilerPC + 4));
|
||||
return;
|
||||
}
|
||||
|
||||
if (inst.hex == 0x4e800020) {
|
||||
if (inst.hex == 0x4e800020)
|
||||
{
|
||||
ibuild.EmitBranchUncond(ibuild.EmitLoadLink());
|
||||
return;
|
||||
}
|
||||
|
||||
IREmitter::InstLoc test = TestBranch(ibuild, inst);
|
||||
test = ibuild.EmitICmpEq(test, ibuild.EmitIntConst(0));
|
||||
ibuild.EmitBranchCond(test, ibuild.EmitIntConst(js.compilerPC + 4));
|
||||
|
||||
@@ -30,10 +30,13 @@ void JitILBase::fp_arith_s(UGeckoInstruction inst)
|
||||
_assert_msg_(DYNA_REC, 0, "fp_arith_s WTF!!!");
|
||||
}
|
||||
|
||||
if (inst.OPCD == 59) {
|
||||
if (inst.OPCD == 59)
|
||||
{
|
||||
val = ibuild.EmitDoubleToSingle(val);
|
||||
val = ibuild.EmitDupSingleToMReg(val);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
val = ibuild.EmitInsertDoubleInMReg(val, ibuild.EmitLoadFReg(inst.FD));
|
||||
}
|
||||
ibuild.EmitStoreFReg(val, inst.FD);
|
||||
@@ -50,18 +53,25 @@ void JitILBase::fmaddXX(UGeckoInstruction inst)
|
||||
|
||||
IREmitter::InstLoc val = ibuild.EmitLoadFReg(inst.FA);
|
||||
val = ibuild.EmitFDMul(val, ibuild.EmitLoadFReg(inst.FC));
|
||||
|
||||
if (inst.SUBOP5 & 1)
|
||||
val = ibuild.EmitFDAdd(val, ibuild.EmitLoadFReg(inst.FB));
|
||||
else
|
||||
val = ibuild.EmitFDSub(val, ibuild.EmitLoadFReg(inst.FB));
|
||||
|
||||
if (inst.SUBOP5 & 2)
|
||||
val = ibuild.EmitFDNeg(val);
|
||||
if (inst.OPCD == 59) {
|
||||
|
||||
if (inst.OPCD == 59)
|
||||
{
|
||||
val = ibuild.EmitDoubleToSingle(val);
|
||||
val = ibuild.EmitDupSingleToMReg(val);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
val = ibuild.EmitInsertDoubleInMReg(val, ibuild.EmitLoadFReg(inst.FD));
|
||||
}
|
||||
|
||||
ibuild.EmitStoreFReg(val, inst.FD);
|
||||
}
|
||||
|
||||
@@ -97,7 +107,8 @@ void JitILBase::fsign(UGeckoInstruction inst)
|
||||
FALLBACK_IF(true);
|
||||
|
||||
// TODO
|
||||
switch (inst.SUBOP10) {
|
||||
switch (inst.SUBOP10)
|
||||
{
|
||||
case 40: // fnegx
|
||||
break;
|
||||
case 264: // fabsx
|
||||
|
||||
@@ -198,7 +198,7 @@ void JitILBase::subfic(UGeckoInstruction inst)
|
||||
JITDISABLE(bJITIntegerOff);
|
||||
IREmitter::InstLoc nota, lhs, val, test;
|
||||
nota = ibuild.EmitXor(ibuild.EmitLoadGReg(inst.RA),
|
||||
ibuild.EmitIntConst(-1));
|
||||
ibuild.EmitIntConst(-1));
|
||||
|
||||
if (inst.SIMM_16 == -1)
|
||||
{
|
||||
@@ -220,7 +220,10 @@ void JitILBase::subfcx(UGeckoInstruction inst)
|
||||
{
|
||||
INSTRUCTION_START
|
||||
JITDISABLE(bJITIntegerOff);
|
||||
if (inst.OE) PanicAlert("OE: subfcx");
|
||||
|
||||
if (inst.OE)
|
||||
PanicAlert("OE: subfcx");
|
||||
|
||||
IREmitter::InstLoc val, test, lhs, rhs;
|
||||
lhs = ibuild.EmitLoadGReg(inst.RB);
|
||||
rhs = ibuild.EmitLoadGReg(inst.RA);
|
||||
@@ -229,6 +232,7 @@ void JitILBase::subfcx(UGeckoInstruction inst)
|
||||
test = ibuild.EmitICmpEq(rhs, ibuild.EmitIntConst(0));
|
||||
test = ibuild.EmitOr(test, ibuild.EmitICmpUgt(lhs, val));
|
||||
ibuild.EmitStoreCarry(test);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, val);
|
||||
}
|
||||
@@ -237,7 +241,10 @@ void JitILBase::subfex(UGeckoInstruction inst)
|
||||
{
|
||||
INSTRUCTION_START
|
||||
JITDISABLE(bJITIntegerOff);
|
||||
if (inst.OE) PanicAlert("OE: subfex");
|
||||
|
||||
if (inst.OE)
|
||||
PanicAlert("OE: subfex");
|
||||
|
||||
IREmitter::InstLoc val, test, lhs, rhs, carry;
|
||||
rhs = ibuild.EmitLoadGReg(inst.RA);
|
||||
carry = ibuild.EmitLoadCarry();
|
||||
@@ -250,6 +257,7 @@ void JitILBase::subfex(UGeckoInstruction inst)
|
||||
ibuild.EmitStoreGReg(val, inst.RD);
|
||||
test = ibuild.EmitOr(test, ibuild.EmitICmpUgt(lhs, val));
|
||||
ibuild.EmitStoreCarry(test);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, val);
|
||||
}
|
||||
@@ -258,10 +266,14 @@ void JitILBase::subfx(UGeckoInstruction inst)
|
||||
{
|
||||
INSTRUCTION_START
|
||||
JITDISABLE(bJITIntegerOff);
|
||||
if (inst.OE) PanicAlert("OE: subfx");
|
||||
|
||||
if (inst.OE)
|
||||
PanicAlert("OE: subfx");
|
||||
|
||||
IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RB);
|
||||
val = ibuild.EmitSub(val, ibuild.EmitLoadGReg(inst.RA));
|
||||
ibuild.EmitStoreGReg(val, inst.RD);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, val);
|
||||
}
|
||||
@@ -282,6 +294,7 @@ void JitILBase::mullwx(UGeckoInstruction inst)
|
||||
IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RB);
|
||||
val = ibuild.EmitMul(ibuild.EmitLoadGReg(inst.RA), val);
|
||||
ibuild.EmitStoreGReg(val, inst.RD);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, val);
|
||||
}
|
||||
@@ -295,6 +308,7 @@ void JitILBase::mulhwux(UGeckoInstruction inst)
|
||||
IREmitter::InstLoc b = ibuild.EmitLoadGReg(inst.RB);
|
||||
IREmitter::InstLoc d = ibuild.EmitMulHighUnsigned(a, b);
|
||||
ibuild.EmitStoreGReg(d, inst.RD);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, d);
|
||||
}
|
||||
@@ -326,7 +340,9 @@ void JitILBase::divwux(UGeckoInstruction inst)
|
||||
MOV(32, gpr.R(d), R(EAX));
|
||||
gpr.UnlockAll();
|
||||
gpr.UnlockAllX();
|
||||
if (inst.Rc) {
|
||||
|
||||
if (inst.Rc)
|
||||
{
|
||||
CALL((u8*)asm_routines.computeRc);
|
||||
}
|
||||
#endif
|
||||
@@ -339,6 +355,7 @@ void JitILBase::addx(UGeckoInstruction inst)
|
||||
IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RB);
|
||||
val = ibuild.EmitAdd(ibuild.EmitLoadGReg(inst.RA), val);
|
||||
ibuild.EmitStoreGReg(val, inst.RD);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, val);
|
||||
}
|
||||
@@ -347,12 +364,12 @@ void JitILBase::addzex(UGeckoInstruction inst)
|
||||
{
|
||||
INSTRUCTION_START
|
||||
JITDISABLE(bJITIntegerOff);
|
||||
IREmitter::InstLoc lhs = ibuild.EmitLoadGReg(inst.RA),
|
||||
val, newcarry;
|
||||
IREmitter::InstLoc lhs = ibuild.EmitLoadGReg(inst.RA), val, newcarry;
|
||||
val = ibuild.EmitAdd(lhs, ibuild.EmitLoadCarry());
|
||||
ibuild.EmitStoreGReg(val, inst.RD);
|
||||
newcarry = ibuild.EmitICmpUlt(val, lhs);
|
||||
ibuild.EmitStoreCarry(newcarry);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, val);
|
||||
}
|
||||
@@ -375,7 +392,9 @@ void JitILBase::addex(UGeckoInstruction inst)
|
||||
ibuild.EmitStoreGReg(abc, inst.RD);
|
||||
ibuild.EmitStoreCarry(new_carry);
|
||||
|
||||
if (inst.OE) PanicAlert("OE: addex");
|
||||
if (inst.OE)
|
||||
PanicAlert("OE: addex");
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, abc);
|
||||
}
|
||||
@@ -389,6 +408,7 @@ void JitILBase::rlwinmx(UGeckoInstruction inst)
|
||||
val = ibuild.EmitRol(val, ibuild.EmitIntConst(inst.SH));
|
||||
val = ibuild.EmitAnd(val, ibuild.EmitIntConst(mask));
|
||||
ibuild.EmitStoreGReg(val, inst.RA);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, val);
|
||||
}
|
||||
@@ -406,6 +426,7 @@ void JitILBase::rlwimix(UGeckoInstruction inst)
|
||||
ival = ibuild.EmitAnd(ival, ibuild.EmitIntConst(~mask));
|
||||
val = ibuild.EmitOr(ival, val);
|
||||
ibuild.EmitStoreGReg(val, inst.RA);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, val);
|
||||
}
|
||||
@@ -419,6 +440,7 @@ void JitILBase::rlwnmx(UGeckoInstruction inst)
|
||||
val = ibuild.EmitRol(val, ibuild.EmitLoadGReg(inst.RB));
|
||||
val = ibuild.EmitAnd(val, ibuild.EmitIntConst(mask));
|
||||
ibuild.EmitStoreGReg(val, inst.RA);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, val);
|
||||
}
|
||||
@@ -430,6 +452,7 @@ void JitILBase::negx(UGeckoInstruction inst)
|
||||
IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RA);
|
||||
val = ibuild.EmitSub(ibuild.EmitIntConst(0), val);
|
||||
ibuild.EmitStoreGReg(val, inst.RD);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, val);
|
||||
}
|
||||
@@ -438,9 +461,11 @@ void JitILBase::srwx(UGeckoInstruction inst)
|
||||
{
|
||||
INSTRUCTION_START
|
||||
JITDISABLE(bJITIntegerOff);
|
||||
IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS),
|
||||
samt = ibuild.EmitLoadGReg(inst.RB),
|
||||
corr;
|
||||
|
||||
IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS);
|
||||
IREmitter::InstLoc samt = ibuild.EmitLoadGReg(inst.RB);
|
||||
IREmitter::InstLoc corr;
|
||||
|
||||
// FIXME: We can do better with a cmov
|
||||
// FIXME: We can do better on 64-bit
|
||||
val = ibuild.EmitShrl(val, samt);
|
||||
@@ -449,6 +474,7 @@ void JitILBase::srwx(UGeckoInstruction inst)
|
||||
corr = ibuild.EmitXor(corr, ibuild.EmitIntConst(-1));
|
||||
val = ibuild.EmitAnd(corr, val);
|
||||
ibuild.EmitStoreGReg(val, inst.RA);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, val);
|
||||
}
|
||||
@@ -457,9 +483,11 @@ void JitILBase::slwx(UGeckoInstruction inst)
|
||||
{
|
||||
INSTRUCTION_START
|
||||
JITDISABLE(bJITIntegerOff);
|
||||
IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS),
|
||||
samt = ibuild.EmitLoadGReg(inst.RB),
|
||||
corr;
|
||||
|
||||
IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS);
|
||||
IREmitter::InstLoc samt = ibuild.EmitLoadGReg(inst.RB);
|
||||
IREmitter::InstLoc corr;
|
||||
|
||||
// FIXME: We can do better with a cmov
|
||||
// FIXME: We can do better on 64-bit
|
||||
val = ibuild.EmitShl(val, samt);
|
||||
@@ -468,6 +496,7 @@ void JitILBase::slwx(UGeckoInstruction inst)
|
||||
corr = ibuild.EmitXor(corr, ibuild.EmitIntConst(-1));
|
||||
val = ibuild.EmitAnd(corr, val);
|
||||
ibuild.EmitStoreGReg(val, inst.RA);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, val);
|
||||
}
|
||||
@@ -524,6 +553,7 @@ void JitILBase::cntlzwx(UGeckoInstruction inst)
|
||||
IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS);
|
||||
val = ibuild.EmitCntlzw(val);
|
||||
ibuild.EmitStoreGReg(val, inst.RA);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(ibuild, val);
|
||||
}
|
||||
|
||||
@@ -35,11 +35,21 @@ void JitILBase::lXz(UGeckoInstruction inst)
|
||||
IREmitter::InstLoc val;
|
||||
switch (inst.OPCD & ~0x1)
|
||||
{
|
||||
case 32: val = ibuild.EmitLoad32(addr); break; //lwz
|
||||
case 40: val = ibuild.EmitLoad16(addr); break; //lhz
|
||||
case 34: val = ibuild.EmitLoad8(addr); break; //lbz
|
||||
default: PanicAlert("lXz: invalid access size"); val = nullptr; break;
|
||||
case 32: // lwz
|
||||
val = ibuild.EmitLoad32(addr);
|
||||
break;
|
||||
case 40: // lhz
|
||||
val = ibuild.EmitLoad16(addr);
|
||||
break;
|
||||
case 34: // lbz
|
||||
val = ibuild.EmitLoad8(addr);
|
||||
break;
|
||||
default:
|
||||
PanicAlert("lXz: invalid access size");
|
||||
val = nullptr;
|
||||
break;
|
||||
}
|
||||
|
||||
ibuild.EmitStoreGReg(val, inst.RD);
|
||||
}
|
||||
|
||||
@@ -87,10 +97,17 @@ void JitILBase::lXzx(UGeckoInstruction inst)
|
||||
IREmitter::InstLoc val;
|
||||
switch (inst.SUBOP10 & ~32)
|
||||
{
|
||||
default: PanicAlert("lXzx: invalid access size");
|
||||
case 23: val = ibuild.EmitLoad32(addr); break; //lwzx
|
||||
case 279: val = ibuild.EmitLoad16(addr); break; //lhzx
|
||||
case 87: val = ibuild.EmitLoad8(addr); break; //lbzx
|
||||
default:
|
||||
PanicAlert("lXzx: invalid access size");
|
||||
case 23: // lwzx
|
||||
val = ibuild.EmitLoad32(addr);
|
||||
break;
|
||||
case 279: // lhzx
|
||||
val = ibuild.EmitLoad16(addr);
|
||||
break;
|
||||
case 87: // lbzx
|
||||
val = ibuild.EmitLoad8(addr);
|
||||
break;
|
||||
}
|
||||
ibuild.EmitStoreGReg(val, inst.RD);
|
||||
}
|
||||
@@ -115,7 +132,10 @@ void JitILBase::dcbz(UGeckoInstruction inst)
|
||||
// TODO!
|
||||
#if 0
|
||||
if (Core::g_CoreStartupParameter.bJITOff || Core::g_CoreStartupParameter.bJITLoadStoreOff)
|
||||
{Default(inst); return;} // turn off from debugger
|
||||
{
|
||||
Default(inst);
|
||||
return;
|
||||
}
|
||||
INSTRUCTION_START;
|
||||
MOV(32, R(EAX), gpr.R(inst.RB));
|
||||
if (inst.RA)
|
||||
@@ -149,10 +169,18 @@ void JitILBase::stX(UGeckoInstruction inst)
|
||||
|
||||
switch (inst.OPCD & ~1)
|
||||
{
|
||||
case 36: ibuild.EmitStore32(value, addr); break; //stw
|
||||
case 44: ibuild.EmitStore16(value, addr); break; //sth
|
||||
case 38: ibuild.EmitStore8(value, addr); break; //stb
|
||||
default: _assert_msg_(DYNA_REC, 0, "AWETKLJASDLKF"); return;
|
||||
case 36: // stw
|
||||
ibuild.EmitStore32(value, addr);
|
||||
break;
|
||||
case 44: // sth
|
||||
ibuild.EmitStore16(value, addr);
|
||||
break;
|
||||
case 38: // stb
|
||||
ibuild.EmitStore8(value, addr);
|
||||
break;
|
||||
default:
|
||||
_assert_msg_(DYNA_REC, 0, "AWETKLJASDLKF");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,10 +200,18 @@ void JitILBase::stXx(UGeckoInstruction inst)
|
||||
|
||||
switch (inst.SUBOP10 & ~32)
|
||||
{
|
||||
case 151: ibuild.EmitStore32(value, addr); break; //stw
|
||||
case 407: ibuild.EmitStore16(value, addr); break; //sth
|
||||
case 215: ibuild.EmitStore8(value, addr); break; //stb
|
||||
default: _assert_msg_(DYNA_REC, 0, "AWETKLJASDLKF"); return;
|
||||
case 151: // stw
|
||||
ibuild.EmitStore32(value, addr);
|
||||
break;
|
||||
case 407: // sth
|
||||
ibuild.EmitStore16(value, addr);
|
||||
break;
|
||||
case 215: // stb
|
||||
ibuild.EmitStore8(value, addr);
|
||||
break;
|
||||
default:
|
||||
_assert_msg_(DYNA_REC, 0, "AWETKLJASDLKF");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -129,7 +129,8 @@ void JitILBase::ps_maddXX(UGeckoInstruction inst)
|
||||
|
||||
switch (inst.SUBOP5)
|
||||
{
|
||||
case 14: {//madds0
|
||||
case 14: // madds0
|
||||
{
|
||||
op2 = ibuild.EmitCompactMRegToPacked(ibuild.EmitLoadFReg(inst.FC));
|
||||
op2 = ibuild.EmitFPDup0(op2);
|
||||
val = ibuild.EmitFPMul(val, op2);
|
||||
@@ -137,7 +138,8 @@ void JitILBase::ps_maddXX(UGeckoInstruction inst)
|
||||
val = ibuild.EmitFPAdd(val, op3);
|
||||
break;
|
||||
}
|
||||
case 15: {//madds1
|
||||
case 15: // madds1
|
||||
{
|
||||
op2 = ibuild.EmitCompactMRegToPacked(ibuild.EmitLoadFReg(inst.FC));
|
||||
op2 = ibuild.EmitFPDup1(op2);
|
||||
val = ibuild.EmitFPMul(val, op2);
|
||||
@@ -145,21 +147,24 @@ void JitILBase::ps_maddXX(UGeckoInstruction inst)
|
||||
val = ibuild.EmitFPAdd(val, op3);
|
||||
break;
|
||||
}
|
||||
case 28: {//msub
|
||||
case 28: // msub
|
||||
{
|
||||
op2 = ibuild.EmitCompactMRegToPacked(ibuild.EmitLoadFReg(inst.FC));
|
||||
val = ibuild.EmitFPMul(val, op2);
|
||||
op3 = ibuild.EmitCompactMRegToPacked(ibuild.EmitLoadFReg(inst.FB));
|
||||
val = ibuild.EmitFPSub(val, op3);
|
||||
break;
|
||||
}
|
||||
case 29: {//madd
|
||||
case 29: // madd
|
||||
{
|
||||
op2 = ibuild.EmitCompactMRegToPacked(ibuild.EmitLoadFReg(inst.FC));
|
||||
val = ibuild.EmitFPMul(val, op2);
|
||||
op3 = ibuild.EmitCompactMRegToPacked(ibuild.EmitLoadFReg(inst.FB));
|
||||
val = ibuild.EmitFPAdd(val, op3);
|
||||
break;
|
||||
}
|
||||
case 30: {//nmsub
|
||||
case 30: // nmsub
|
||||
{
|
||||
op2 = ibuild.EmitCompactMRegToPacked(ibuild.EmitLoadFReg(inst.FC));
|
||||
val = ibuild.EmitFPMul(val, op2);
|
||||
op3 = ibuild.EmitCompactMRegToPacked(ibuild.EmitLoadFReg(inst.FB));
|
||||
@@ -167,7 +172,8 @@ void JitILBase::ps_maddXX(UGeckoInstruction inst)
|
||||
val = ibuild.EmitFPNeg(val);
|
||||
break;
|
||||
}
|
||||
case 31: {//nmadd
|
||||
case 31: // nmadd
|
||||
{
|
||||
op2 = ibuild.EmitCompactMRegToPacked(ibuild.EmitLoadFReg(inst.FC));
|
||||
val = ibuild.EmitFPMul(val, op2);
|
||||
op3 = ibuild.EmitCompactMRegToPacked(ibuild.EmitLoadFReg(inst.FB));
|
||||
|
||||
@@ -170,42 +170,35 @@ void JitILBase::crXX(UGeckoInstruction inst)
|
||||
|
||||
// Compute combined bit
|
||||
const unsigned subop = inst.SUBOP10;
|
||||
switch (subop) {
|
||||
case 257:
|
||||
// crand
|
||||
switch (subop)
|
||||
{
|
||||
case 257: // crand
|
||||
eax = ibuild.EmitAnd(eax, ecx);
|
||||
break;
|
||||
case 129:
|
||||
// crandc
|
||||
case 129: // crandc
|
||||
ecx = ibuild.EmitNot(ecx);
|
||||
eax = ibuild.EmitAnd(eax, ecx);
|
||||
break;
|
||||
case 289:
|
||||
// creqv
|
||||
case 289: // creqv
|
||||
eax = ibuild.EmitXor(eax, ecx);
|
||||
eax = ibuild.EmitNot(eax);
|
||||
break;
|
||||
case 225:
|
||||
// crnand
|
||||
case 225: // crnand
|
||||
eax = ibuild.EmitAnd(eax, ecx);
|
||||
eax = ibuild.EmitNot(eax);
|
||||
break;
|
||||
case 33:
|
||||
// crnor
|
||||
case 33: // crnor
|
||||
eax = ibuild.EmitOr(eax, ecx);
|
||||
eax = ibuild.EmitNot(eax);
|
||||
break;
|
||||
case 449:
|
||||
// cror
|
||||
case 449: // cror
|
||||
eax = ibuild.EmitOr(eax, ecx);
|
||||
break;
|
||||
case 417:
|
||||
// crorc
|
||||
case 417: // crorc
|
||||
ecx = ibuild.EmitNot(ecx);
|
||||
eax = ibuild.EmitOr(eax, ecx);
|
||||
break;
|
||||
case 193:
|
||||
// crxor
|
||||
case 193: // crxor
|
||||
eax = ibuild.EmitXor(eax, ecx);
|
||||
break;
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user