[dynarmic] unconditional branches always take
Signed-off-by: lizzie <lizzie@eden-emu.dev>
This commit is contained in:
parent
e71e913432
commit
83606e83c9
3 changed files with 11 additions and 9 deletions
|
@ -364,8 +364,7 @@ void BlockOfCode::GenRunCode(std::function<void(BlockOfCode&)> rcp) {
|
||||||
|
|
||||||
cmp(dword[ABI_JIT_PTR + jsi.offsetof_halt_reason], 0);
|
cmp(dword[ABI_JIT_PTR + jsi.offsetof_halt_reason], 0);
|
||||||
jne(return_to_caller_mxcsr_already_exited, T_NEAR);
|
jne(return_to_caller_mxcsr_already_exited, T_NEAR);
|
||||||
lock();
|
lock(); or_(dword[ABI_JIT_PTR + jsi.offsetof_halt_reason], static_cast<u32>(HaltReason::Step));
|
||||||
or_(dword[ABI_JIT_PTR + jsi.offsetof_halt_reason], static_cast<u32>(HaltReason::Step));
|
|
||||||
|
|
||||||
SwitchMxcsrOnEntry();
|
SwitchMxcsrOnEntry();
|
||||||
jmp(ABI_PARAM2);
|
jmp(ABI_PARAM2);
|
||||||
|
@ -415,7 +414,6 @@ void BlockOfCode::GenRunCode(std::function<void(BlockOfCode&)> rcp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
xor_(eax, eax);
|
xor_(eax, eax);
|
||||||
lock();
|
|
||||||
xchg(dword[ABI_JIT_PTR + jsi.offsetof_halt_reason], eax);
|
xchg(dword[ABI_JIT_PTR + jsi.offsetof_halt_reason], eax);
|
||||||
|
|
||||||
ABI_PopCalleeSaveRegistersAndAdjustStack(*this, sizeof(StackLayout));
|
ABI_PopCalleeSaveRegistersAndAdjustStack(*this, sizeof(StackLayout));
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "dynarmic/backend/x64/reg_alloc.h"
|
#include "dynarmic/backend/x64/reg_alloc.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <limits>
|
||||||
#include <numeric>
|
#include <numeric>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
@ -152,19 +153,19 @@ bool Argument::GetImmediateU1() const noexcept {
|
||||||
|
|
||||||
u8 Argument::GetImmediateU8() const noexcept {
|
u8 Argument::GetImmediateU8() const noexcept {
|
||||||
const u64 imm = value.GetImmediateAsU64();
|
const u64 imm = value.GetImmediateAsU64();
|
||||||
ASSERT(imm < 0x100);
|
ASSERT(imm <= u64(std::numeric_limits<u8>::max()));
|
||||||
return u8(imm);
|
return u8(imm);
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 Argument::GetImmediateU16() const noexcept {
|
u16 Argument::GetImmediateU16() const noexcept {
|
||||||
const u64 imm = value.GetImmediateAsU64();
|
const u64 imm = value.GetImmediateAsU64();
|
||||||
ASSERT(imm < 0x10000);
|
ASSERT(imm <= u64(std::numeric_limits<u16>::max()));
|
||||||
return u16(imm);
|
return u16(imm);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 Argument::GetImmediateU32() const noexcept {
|
u32 Argument::GetImmediateU32() const noexcept {
|
||||||
const u64 imm = value.GetImmediateAsU64();
|
const u64 imm = value.GetImmediateAsU64();
|
||||||
ASSERT(imm < 0x100000000);
|
ASSERT(imm <= u64(std::numeric_limits<u32>::max()));
|
||||||
return u32(imm);
|
return u32(imm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,9 +20,12 @@ bool TranslatorVisitor::B_cond(Imm<19> imm19, Cond cond) {
|
||||||
bool TranslatorVisitor::B_uncond(Imm<26> imm26) {
|
bool TranslatorVisitor::B_uncond(Imm<26> imm26) {
|
||||||
const s64 offset = concatenate(imm26, Imm<2>{0}).SignExtend<s64>();
|
const s64 offset = concatenate(imm26, Imm<2>{0}).SignExtend<s64>();
|
||||||
const u64 target = ir.PC() + offset;
|
const u64 target = ir.PC() + offset;
|
||||||
|
// Pattern to halt execution (B .)
|
||||||
//ir.SetTerm(IR::Term::LinkBlockFast{ir.current_location->SetPC(target)});
|
if (target == ir.PC()) {
|
||||||
ir.SetTerm(IR::Term::LinkBlock{ir.current_location->SetPC(target)});
|
ir.SetTerm(IR::Term::LinkBlock{ir.current_location->SetPC(target)});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ir.SetTerm(IR::Term::LinkBlockFast{ir.current_location->SetPC(target)});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue