Skip to content

Commit

Permalink
Merge pull request #9837 from unknownbrackets/jit-rip
Browse files Browse the repository at this point in the history
x64: Avoid clobbering jr dest in cases
  • Loading branch information
hrydgard committed Jul 9, 2017
2 parents a9f70d1 + 3dacd32 commit fbe06c5
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 6 deletions.
9 changes: 5 additions & 4 deletions Core/MIPS/x86/Jit.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@ const u8 *Jit::DoJit(u32 em_address, JitBlock *b) {
// If we're rewinding, CORE_NEXTFRAME should not cause a rewind. // If we're rewinding, CORE_NEXTFRAME should not cause a rewind.
// It doesn't really matter either way if we're not rewinding. // It doesn't really matter either way if we're not rewinding.
// CORE_RUNNING is <= CORE_NEXTFRAME. // CORE_RUNNING is <= CORE_NEXTFRAME.
if (RipAccessible((const void *)coreState)) { if (RipAccessible((const void *)&coreState)) {
CMP(32, M(&coreState), Imm32(CORE_NEXTFRAME)); // rip accessible CMP(32, M(&coreState), Imm32(CORE_NEXTFRAME)); // rip accessible
} else { } else {
MOV(PTRBITS, R(RAX), ImmPtr((const void *)&coreState)); MOV(PTRBITS, R(RAX), ImmPtr((const void *)&coreState));
Expand Down Expand Up @@ -667,7 +667,7 @@ void Jit::WriteExit(u32 destination, int exit_num) {
// If we need to verify coreState and rewind, we may not jump yet. // If we need to verify coreState and rewind, we may not jump yet.
if (js.afterOp & (JitState::AFTER_CORE_STATE | JitState::AFTER_REWIND_PC_BAD_STATE)) { if (js.afterOp & (JitState::AFTER_CORE_STATE | JitState::AFTER_REWIND_PC_BAD_STATE)) {
// CORE_RUNNING is <= CORE_NEXTFRAME. // CORE_RUNNING is <= CORE_NEXTFRAME.
if (RipAccessible((const void *)coreState)) { if (RipAccessible((const void *)&coreState)) {
CMP(32, M(&coreState), Imm32(CORE_NEXTFRAME)); // rip accessible CMP(32, M(&coreState), Imm32(CORE_NEXTFRAME)); // rip accessible
} else { } else {
MOV(PTRBITS, R(RAX), ImmPtr((const void *)&coreState)); MOV(PTRBITS, R(RAX), ImmPtr((const void *)&coreState));
Expand Down Expand Up @@ -714,8 +714,9 @@ void Jit::WriteExitDestInReg(X64Reg reg) {
if (RipAccessible((const void *)coreState)) { if (RipAccessible((const void *)coreState)) {
CMP(32, M(&coreState), Imm32(CORE_NEXTFRAME)); // rip accessible CMP(32, M(&coreState), Imm32(CORE_NEXTFRAME)); // rip accessible
} else { } else {
MOV(PTRBITS, R(RAX), ImmPtr((const void *)&coreState)); X64Reg temp = reg == RAX ? RDX : RAX;
CMP(32, MatR(RAX), Imm32(CORE_NEXTFRAME)); MOV(PTRBITS, R(temp), ImmPtr((const void *)&coreState));
CMP(32, MatR(temp), Imm32(CORE_NEXTFRAME));
} }
FixupBranch skipCheck = J_CC(CC_LE); FixupBranch skipCheck = J_CC(CC_LE);
MOV(32, MIPSSTATE_VAR(pc), Imm32(GetCompilerPC())); MOV(32, MIPSSTATE_VAR(pc), Imm32(GetCompilerPC()));
Expand Down
10 changes: 8 additions & 2 deletions Core/MIPS/x86/JitSafeMem.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -368,11 +368,14 @@ void JitSafeMem::MemCheckImm(MemoryOpType type)
jit_->CallProtectedFunction(&JitMemCheck, iaddr_, size_, type == MEM_WRITE ? 1 : 0); jit_->CallProtectedFunction(&JitMemCheck, iaddr_, size_, type == MEM_WRITE ? 1 : 0);


// CORE_RUNNING is <= CORE_NEXTFRAME. // CORE_RUNNING is <= CORE_NEXTFRAME.
if (jit_->RipAccessible((const void *)coreState)) { if (jit_->RipAccessible((const void *)&coreState)) {
jit_->CMP(32, M(&coreState), Imm32(CORE_NEXTFRAME)); // rip accessible jit_->CMP(32, M(&coreState), Imm32(CORE_NEXTFRAME)); // rip accessible
} else { } else {
// We can't safely overwrite any register, so push. This is only while debugging.
jit_->PUSH(RAX);
jit_->MOV(PTRBITS, R(RAX), ImmPtr((const void *)&coreState)); jit_->MOV(PTRBITS, R(RAX), ImmPtr((const void *)&coreState));
jit_->CMP(32, MatR(RAX), Imm32(CORE_NEXTFRAME)); jit_->CMP(32, MatR(RAX), Imm32(CORE_NEXTFRAME));
jit_->POP(RAX);
} }
skipChecks_.push_back(jit_->J_CC(CC_G, true)); skipChecks_.push_back(jit_->J_CC(CC_G, true));
jit_->js.afterOp |= JitState::AFTER_CORE_STATE | JitState::AFTER_REWIND_PC_BAD_STATE | JitState::AFTER_MEMCHECK_CLEANUP; jit_->js.afterOp |= JitState::AFTER_CORE_STATE | JitState::AFTER_REWIND_PC_BAD_STATE | JitState::AFTER_MEMCHECK_CLEANUP;
Expand Down Expand Up @@ -423,11 +426,14 @@ void JitSafeMem::MemCheckAsm(MemoryOpType type)
if (possible) if (possible)
{ {
// CORE_RUNNING is <= CORE_NEXTFRAME. // CORE_RUNNING is <= CORE_NEXTFRAME.
if (jit_->RipAccessible((const void *)coreState)) { if (jit_->RipAccessible((const void *)&coreState)) {
jit_->CMP(32, M(&coreState), Imm32(CORE_NEXTFRAME)); // rip accessible jit_->CMP(32, M(&coreState), Imm32(CORE_NEXTFRAME)); // rip accessible
} else { } else {
// We can't safely overwrite any register, so push. This is only while debugging.
jit_->PUSH(RAX);
jit_->MOV(PTRBITS, R(RAX), ImmPtr((const void *)&coreState)); jit_->MOV(PTRBITS, R(RAX), ImmPtr((const void *)&coreState));
jit_->CMP(32, MatR(RAX), Imm32(CORE_NEXTFRAME)); jit_->CMP(32, MatR(RAX), Imm32(CORE_NEXTFRAME));
jit_->POP(RAX);
} }
skipChecks_.push_back(jit_->J_CC(CC_G, true)); skipChecks_.push_back(jit_->J_CC(CC_G, true));
jit_->js.afterOp |= JitState::AFTER_CORE_STATE | JitState::AFTER_REWIND_PC_BAD_STATE | JitState::AFTER_MEMCHECK_CLEANUP; jit_->js.afterOp |= JitState::AFTER_CORE_STATE | JitState::AFTER_REWIND_PC_BAD_STATE | JitState::AFTER_MEMCHECK_CLEANUP;
Expand Down

0 comments on commit fbe06c5

Please sign in to comment.