figure out this mov addressing thing fast please
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user