figure out this mov addressing thing fast please

This commit is contained in:
irisz64
2025-12-22 18:00:43 +01:00
parent b6426f2c8a
commit 817616ca88
3 changed files with 53 additions and 51 deletions

View File

@@ -72,38 +72,40 @@ std::optional<u32> JIT::FetchInstruction(s64 vaddr) {
}
void JIT::SetPC32(const s32 val) {
code.mov(code.SCR1, REG(qword, pc));
code.mov(REG(qword, oldPC), code.SCR1);
code.mov(code.SCR1, val);
code.mov(REG(qword, pc), code.SCR1);
code.mov(code.SCR1, val + 4);
code.mov(REG(qword, nextPC), code.SCR1);
code.mov(code.SCR1, code.ptr[PC_OFFSET()]);
code.mov(code.ptr[OLD_PC_OFFSET()], code.SCR1);
code.mov(code.SCR1.cvt32(), val);
code.movsxd(code.SCR1.cvt64(), code.SCR1.cvt32());
code.mov(code.ptr[PC_OFFSET()], code.SCR1);
code.mov(code.SCR1.cvt32(), val + 4);
code.movsxd(code.SCR1.cvt64(), code.SCR1.cvt32());
code.mov(code.ptr[NEXT_PC_OFFSET()], code.SCR1);
}
void JIT::SetPC64(const s64 val) {
code.mov(code.SCR1, REG(qword, pc));
code.mov(REG(qword, oldPC), code.SCR1);
code.mov(code.SCR1, code.ptr[PC_OFFSET()]);
code.mov(code.ptr[OLD_PC_OFFSET()], code.SCR1);
code.mov(code.SCR1, val);
code.mov(REG(qword, pc), code.SCR1);
code.mov(code.ptr[PC_OFFSET()], code.SCR1);
code.mov(code.SCR1, val + 4);
code.mov(REG(qword, nextPC), code.SCR1);
code.mov(code.ptr[NEXT_PC_OFFSET()], code.SCR1);
}
void JIT::SetPC32(const Xbyak::Reg32& val) {
code.mov(code.SCR1, REG(qword, pc));
code.mov(REG(qword, oldPC), code.SCR1);
code.mov(code.SCR1, code.ptr[PC_OFFSET()]);
code.mov(code.ptr[OLD_PC_OFFSET()], code.SCR1);
code.movsxd(val.cvt64(), val);
code.mov(REG(qword, pc), val);
code.mov(code.ptr[PC_OFFSET()], val);
code.add(val, 4);
code.mov(REG(qword, nextPC), val);
code.mov(code.ptr[NEXT_PC_OFFSET()], val);
}
void JIT::SetPC64(const Xbyak::Reg64& val) {
code.mov(code.SCR1, REG(qword, pc));
code.mov(REG(qword, oldPC), code.SCR1);
code.mov(REG(qword, pc), val);
code.mov(code.SCR1, code.ptr[PC_OFFSET()]);
code.mov(code.ptr[OLD_PC_OFFSET()], code.SCR1);
code.mov(code.ptr[PC_OFFSET()], val);
code.add(val, 4);
code.mov(REG(qword, nextPC), val);
code.mov(code.ptr[NEXT_PC_OFFSET()], val);
}
u32 JIT::Step() {
@@ -192,15 +194,15 @@ u32 JIT::Step() {
if(!branch_taken) {
Xbyak::Label runtime_branch_taken;
code.mov(code.SCR1, JIT_VAR(byte, branch_taken));
code.mov(code.SCR1, code.byte[code.rbp + BRANCH_TAKEN_OFFSET()]);
code.cmp(code.SCR1, 0);
code.jne(runtime_branch_taken);
code.mov(code.SCR1, blockOldPC);
code.mov(REG(qword, oldPC), code.SCR1);
code.mov(code.ptr[OLD_PC_OFFSET()], code.SCR1);
code.mov(code.SCR1, blockPC);
code.mov(REG(qword, pc), code.SCR1);
code.mov(code.ptr[PC_OFFSET()], code.SCR1);
code.mov(code.SCR1, blockNextPC);
code.mov(REG(qword, nextPC), code.SCR1);
code.mov(code.ptr[NEXT_PC_OFFSET()], code.SCR1);
code.L(runtime_branch_taken);
}