JitArm64: Refactor EmitBackpatchRoutine parameters, part 1
This commit is contained in:
parent
0c6b6b74bf
commit
27ed2a99a0
|
@ -215,10 +215,28 @@ protected:
|
||||||
// Dump a memory range of code
|
// Dump a memory range of code
|
||||||
void DumpCode(const u8* start, const u8* end);
|
void DumpCode(const u8* start, const u8* end);
|
||||||
|
|
||||||
|
// This enum is used for selecting an implementation of EmitBackpatchRoutine.
|
||||||
|
//
|
||||||
|
// The below descriptions of each enum entry apply when jo.fastmem_arena is true.
|
||||||
|
// If jo.fastmem_arena is false, the slow C++ code is always called instead.
|
||||||
|
enum class MemAccessMode
|
||||||
|
{
|
||||||
|
// Always calls the slow C++ code. For performance reasons, should generally only be used if
|
||||||
|
// the guest address is known in advance and IsOptimizableRAMAddress returns false for it.
|
||||||
|
AlwaysSafe,
|
||||||
|
// Only emits fast access code. Must only be used if the guest address is known in advance
|
||||||
|
// and IsOptimizableRAMAddress returns true for it, otherwise Dolphin will likely crash!
|
||||||
|
AlwaysUnsafe,
|
||||||
|
// Best in most cases. Tries to run fast access code, and if that fails, uses backpatching to
|
||||||
|
// replace the code with a call to the slow C++ code.
|
||||||
|
Auto,
|
||||||
|
};
|
||||||
|
|
||||||
// This is the core routine for accessing emulated memory, with support for
|
// This is the core routine for accessing emulated memory, with support for
|
||||||
// many different kinds of loads and stores as well as fastmem backpatching.
|
// many different kinds of loads and stores as well as fastmem/backpatching.
|
||||||
//
|
//
|
||||||
// Registers used:
|
// Registers used:
|
||||||
|
//
|
||||||
// addr scratch
|
// addr scratch
|
||||||
// Store: X1 X0
|
// Store: X1 X0
|
||||||
// Load: X0
|
// Load: X0
|
||||||
|
@ -226,15 +244,18 @@ protected:
|
||||||
// Store float: X1 Q0
|
// Store float: X1 Q0
|
||||||
// Load float: X0
|
// Load float: X0
|
||||||
//
|
//
|
||||||
// If fastmem && !do_farcode, the addr argument can be any register.
|
// If using MemAccessMode::AlwaysUnsafe, the addr argument can be any register.
|
||||||
// Otherwise it must be the register listed in the table above.
|
// Otherwise it must be the register listed in the table above.
|
||||||
//
|
//
|
||||||
// Additional scratch registers are used in the following situations:
|
// Additional scratch registers are used in the following situations:
|
||||||
// fastmem && do_farcode && emitting_routine: X2
|
//
|
||||||
// fastmem && do_farcode && emitting_routine && (flags & BackPatchInfo::FLAG_STORE): X0
|
// mode == Auto && emitting_routine: X2
|
||||||
// fastmem && do_farcode && emitting_routine && !(flags & BackPatchInfo::FLAG_STORE): X3
|
// mode == Auto && emitting_routine && (flags & BackPatchInfo::FLAG_STORE): X0
|
||||||
// !fastmem || do_farcode: X30 (plus lots more unless you set gprs_to_push and fprs_to_push)
|
// mode == Auto && emitting_routine && !(flags & BackPatchInfo::FLAG_STORE): X3
|
||||||
void EmitBackpatchRoutine(u32 flags, bool fastmem, bool do_farcode, Arm64Gen::ARM64Reg RS,
|
//
|
||||||
|
// mode != AlwaysUnsafe || !jo.fastmem_arena:
|
||||||
|
// X30 (plus most other registers, unless marked in gprs_to_push and fprs_to_push)
|
||||||
|
void EmitBackpatchRoutine(u32 flags, MemAccessMode mode, Arm64Gen::ARM64Reg RS,
|
||||||
Arm64Gen::ARM64Reg addr, BitSet32 gprs_to_push = BitSet32(0),
|
Arm64Gen::ARM64Reg addr, BitSet32 gprs_to_push = BitSet32(0),
|
||||||
BitSet32 fprs_to_push = BitSet32(0), bool emitting_routine = false);
|
BitSet32 fprs_to_push = BitSet32(0), bool emitting_routine = false);
|
||||||
|
|
||||||
|
|
|
@ -54,12 +54,16 @@ void JitArm64::DoBacktrace(uintptr_t access_address, SContext* ctx)
|
||||||
ERROR_LOG_FMT(DYNA_REC, "Full block: {}", pc_memory);
|
ERROR_LOG_FMT(DYNA_REC, "Full block: {}", pc_memory);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JitArm64::EmitBackpatchRoutine(u32 flags, bool fastmem, bool do_farcode, ARM64Reg RS,
|
void JitArm64::EmitBackpatchRoutine(u32 flags, MemAccessMode mode, ARM64Reg RS, ARM64Reg addr,
|
||||||
ARM64Reg addr, BitSet32 gprs_to_push, BitSet32 fprs_to_push,
|
BitSet32 gprs_to_push, BitSet32 fprs_to_push,
|
||||||
bool emitting_routine)
|
bool emitting_routine)
|
||||||
{
|
{
|
||||||
const u32 access_size = BackPatchInfo::GetFlagSize(flags);
|
const u32 access_size = BackPatchInfo::GetFlagSize(flags);
|
||||||
|
|
||||||
|
const bool fastmem = jo.fastmem_arena && mode != MemAccessMode::AlwaysSafe;
|
||||||
|
const bool do_farcode = jo.fastmem_arena && (mode == MemAccessMode::Auto ||
|
||||||
|
mode == MemAccessMode::AutoWithoutBackpatch);
|
||||||
|
|
||||||
bool in_far_code = false;
|
bool in_far_code = false;
|
||||||
const u8* fastmem_start = GetCodePtr();
|
const u8* fastmem_start = GetCodePtr();
|
||||||
std::optional<FixupBranch> slowmem_fixup;
|
std::optional<FixupBranch> slowmem_fixup;
|
||||||
|
|
|
@ -129,10 +129,11 @@ void JitArm64::SafeLoadToReg(u32 dest, s32 addr, s32 offsetReg, u32 flags, s32 o
|
||||||
if (is_immediate)
|
if (is_immediate)
|
||||||
mmio_address = PowerPC::IsOptimizableMMIOAccess(imm_addr, access_size);
|
mmio_address = PowerPC::IsOptimizableMMIOAccess(imm_addr, access_size);
|
||||||
|
|
||||||
if (jo.fastmem_arena && is_immediate && PowerPC::IsOptimizableRAMAddress(imm_addr))
|
if (is_immediate && PowerPC::IsOptimizableRAMAddress(imm_addr))
|
||||||
{
|
{
|
||||||
set_addr_reg_if_needed();
|
set_addr_reg_if_needed();
|
||||||
EmitBackpatchRoutine(flags, true, false, dest_reg, XA, BitSet32(0), BitSet32(0));
|
EmitBackpatchRoutine(flags, MemAccessMode::AlwaysUnsafe, dest_reg, XA, regs_in_use,
|
||||||
|
fprs_in_use);
|
||||||
}
|
}
|
||||||
else if (mmio_address)
|
else if (mmio_address)
|
||||||
{
|
{
|
||||||
|
@ -142,7 +143,7 @@ void JitArm64::SafeLoadToReg(u32 dest, s32 addr, s32 offsetReg, u32 flags, s32 o
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
set_addr_reg_if_needed();
|
set_addr_reg_if_needed();
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem, jo.fastmem, dest_reg, XA, regs_in_use, fprs_in_use);
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, dest_reg, XA, regs_in_use, fprs_in_use);
|
||||||
}
|
}
|
||||||
|
|
||||||
gpr.BindToRegister(dest, false, true);
|
gpr.BindToRegister(dest, false, true);
|
||||||
|
@ -290,10 +291,10 @@ void JitArm64::SafeStoreFromReg(s32 dest, u32 value, s32 regOffset, u32 flags, s
|
||||||
|
|
||||||
js.fifoBytesSinceCheck += accessSize >> 3;
|
js.fifoBytesSinceCheck += accessSize >> 3;
|
||||||
}
|
}
|
||||||
else if (jo.fastmem_arena && is_immediate && PowerPC::IsOptimizableRAMAddress(imm_addr))
|
else if (is_immediate && PowerPC::IsOptimizableRAMAddress(imm_addr))
|
||||||
{
|
{
|
||||||
set_addr_reg_if_needed();
|
set_addr_reg_if_needed();
|
||||||
EmitBackpatchRoutine(flags, true, false, RS, XA, BitSet32(0), BitSet32(0));
|
EmitBackpatchRoutine(flags, MemAccessMode::AlwaysUnsafe, RS, XA, regs_in_use, fprs_in_use);
|
||||||
}
|
}
|
||||||
else if (mmio_address)
|
else if (mmio_address)
|
||||||
{
|
{
|
||||||
|
@ -303,7 +304,7 @@ void JitArm64::SafeStoreFromReg(s32 dest, u32 value, s32 regOffset, u32 flags, s
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
set_addr_reg_if_needed();
|
set_addr_reg_if_needed();
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem, jo.fastmem, RS, XA, regs_in_use, fprs_in_use);
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, RS, XA, regs_in_use, fprs_in_use);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update && !early_update)
|
if (update && !early_update)
|
||||||
|
@ -526,8 +527,8 @@ void JitArm64::lmw(UGeckoInstruction inst)
|
||||||
if (!jo.memcheck)
|
if (!jo.memcheck)
|
||||||
regs_in_use[DecodeReg(dest_reg)] = 0;
|
regs_in_use[DecodeReg(dest_reg)] = 0;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem, jo.fastmem, dest_reg, EncodeRegTo64(addr_reg),
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, dest_reg, EncodeRegTo64(addr_reg), regs_in_use,
|
||||||
regs_in_use, fprs_in_use);
|
fprs_in_use);
|
||||||
|
|
||||||
gpr.BindToRegister(i, false, true);
|
gpr.BindToRegister(i, false, true);
|
||||||
ASSERT(dest_reg == gpr.R(i));
|
ASSERT(dest_reg == gpr.R(i));
|
||||||
|
@ -574,8 +575,8 @@ void JitArm64::stmw(UGeckoInstruction inst)
|
||||||
if (i == 31)
|
if (i == 31)
|
||||||
regs_in_use[DecodeReg(addr_reg)] = 0;
|
regs_in_use[DecodeReg(addr_reg)] = 0;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem, jo.fastmem, src_reg, EncodeRegTo64(addr_reg),
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, src_reg, EncodeRegTo64(addr_reg), regs_in_use,
|
||||||
regs_in_use, fprs_in_use);
|
fprs_in_use);
|
||||||
|
|
||||||
if (i != 31)
|
if (i != 31)
|
||||||
ADD(addr_reg, addr_reg, 4);
|
ADD(addr_reg, addr_reg, 4);
|
||||||
|
@ -839,7 +840,7 @@ void JitArm64::dcbz(UGeckoInstruction inst)
|
||||||
BitSet32 fprs_to_push = fpr.GetCallerSavedUsed();
|
BitSet32 fprs_to_push = fpr.GetCallerSavedUsed();
|
||||||
gprs_to_push[DecodeReg(ARM64Reg::W0)] = 0;
|
gprs_to_push[DecodeReg(ARM64Reg::W0)] = 0;
|
||||||
|
|
||||||
EmitBackpatchRoutine(BackPatchInfo::FLAG_ZERO_256, jo.fastmem, jo.fastmem, ARM64Reg::W0,
|
EmitBackpatchRoutine(BackPatchInfo::FLAG_ZERO_256, MemAccessMode::Auto, ARM64Reg::W0,
|
||||||
EncodeRegTo64(addr_reg), gprs_to_push, fprs_to_push);
|
EncodeRegTo64(addr_reg), gprs_to_push, fprs_to_push);
|
||||||
|
|
||||||
if (using_dcbz_hack)
|
if (using_dcbz_hack)
|
||||||
|
|
|
@ -170,13 +170,13 @@ void JitArm64::lfXX(UGeckoInstruction inst)
|
||||||
if (!jo.memcheck)
|
if (!jo.memcheck)
|
||||||
fprs_in_use[DecodeReg(VD)] = 0;
|
fprs_in_use[DecodeReg(VD)] = 0;
|
||||||
|
|
||||||
if (jo.fastmem_arena && is_immediate && PowerPC::IsOptimizableRAMAddress(imm_addr))
|
if (is_immediate && PowerPC::IsOptimizableRAMAddress(imm_addr))
|
||||||
{
|
{
|
||||||
EmitBackpatchRoutine(flags, true, false, VD, XA, BitSet32(0), BitSet32(0));
|
EmitBackpatchRoutine(flags, MemAccessMode::AlwaysUnsafe, VD, XA, regs_in_use, fprs_in_use);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem, jo.fastmem, VD, XA, regs_in_use, fprs_in_use);
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, VD, XA, regs_in_use, fprs_in_use);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ARM64Reg VD_again = fpr.RW(inst.FD, type, true);
|
const ARM64Reg VD_again = fpr.RW(inst.FD, type, true);
|
||||||
|
@ -389,21 +389,21 @@ void JitArm64::stfXX(UGeckoInstruction inst)
|
||||||
STR(IndexType::Unsigned, ARM64Reg::X0, PPC_REG, PPCSTATE_OFF(gather_pipe_ptr));
|
STR(IndexType::Unsigned, ARM64Reg::X0, PPC_REG, PPCSTATE_OFF(gather_pipe_ptr));
|
||||||
js.fifoBytesSinceCheck += accessSize >> 3;
|
js.fifoBytesSinceCheck += accessSize >> 3;
|
||||||
}
|
}
|
||||||
else if (jo.fastmem_arena && PowerPC::IsOptimizableRAMAddress(imm_addr))
|
else if (PowerPC::IsOptimizableRAMAddress(imm_addr))
|
||||||
{
|
{
|
||||||
set_addr_reg_if_needed();
|
set_addr_reg_if_needed();
|
||||||
EmitBackpatchRoutine(flags, true, false, V0, XA, BitSet32(0), BitSet32(0));
|
EmitBackpatchRoutine(flags, MemAccessMode::AlwaysUnsafe, V0, XA, regs_in_use, fprs_in_use);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
set_addr_reg_if_needed();
|
set_addr_reg_if_needed();
|
||||||
EmitBackpatchRoutine(flags, false, false, V0, XA, regs_in_use, fprs_in_use);
|
EmitBackpatchRoutine(flags, MemAccessMode::AlwaysSafe, V0, XA, regs_in_use, fprs_in_use);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
set_addr_reg_if_needed();
|
set_addr_reg_if_needed();
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem, jo.fastmem, V0, XA, regs_in_use, fprs_in_use);
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, V0, XA, regs_in_use, fprs_in_use);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update && !early_update)
|
if (update && !early_update)
|
||||||
|
|
|
@ -90,7 +90,7 @@ void JitArm64::psq_lXX(UGeckoInstruction inst)
|
||||||
if (!w)
|
if (!w)
|
||||||
flags |= BackPatchInfo::FLAG_PAIR;
|
flags |= BackPatchInfo::FLAG_PAIR;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem, jo.fastmem, VS, EncodeRegTo64(addr_reg), gprs_in_use,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, VS, EncodeRegTo64(addr_reg), gprs_in_use,
|
||||||
fprs_in_use);
|
fprs_in_use);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -234,7 +234,7 @@ void JitArm64::psq_stXX(UGeckoInstruction inst)
|
||||||
if (!w)
|
if (!w)
|
||||||
flags |= BackPatchInfo::FLAG_PAIR;
|
flags |= BackPatchInfo::FLAG_PAIR;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem, jo.fastmem, VS, EncodeRegTo64(addr_reg), gprs_in_use,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, VS, EncodeRegTo64(addr_reg), gprs_in_use,
|
||||||
fprs_in_use);
|
fprs_in_use);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -510,7 +510,7 @@ void JitArm64::GenerateQuantizedLoads()
|
||||||
constexpr u32 flags = BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT |
|
constexpr u32 flags = BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT |
|
||||||
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_32;
|
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_32;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg,
|
||||||
gprs_to_push & ~BitSet32{1}, fprs_to_push, true);
|
gprs_to_push & ~BitSet32{1}, fprs_to_push, true);
|
||||||
|
|
||||||
RET(ARM64Reg::X30);
|
RET(ARM64Reg::X30);
|
||||||
|
@ -520,8 +520,8 @@ void JitArm64::GenerateQuantizedLoads()
|
||||||
constexpr u32 flags = BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT |
|
constexpr u32 flags = BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT |
|
||||||
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_8;
|
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_8;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
float_emit.UXTL(8, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.UXTL(8, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
float_emit.UXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.UXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
|
@ -538,8 +538,8 @@ void JitArm64::GenerateQuantizedLoads()
|
||||||
constexpr u32 flags = BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT |
|
constexpr u32 flags = BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT |
|
||||||
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_8;
|
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_8;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
float_emit.SXTL(8, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.SXTL(8, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
float_emit.SXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.SXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
|
@ -556,8 +556,8 @@ void JitArm64::GenerateQuantizedLoads()
|
||||||
constexpr u32 flags = BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT |
|
constexpr u32 flags = BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT |
|
||||||
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_16;
|
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_16;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
float_emit.UXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.UXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
float_emit.UCVTF(32, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.UCVTF(32, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
|
@ -573,8 +573,8 @@ void JitArm64::GenerateQuantizedLoads()
|
||||||
constexpr u32 flags = BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT |
|
constexpr u32 flags = BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT |
|
||||||
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_16;
|
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_16;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
float_emit.SXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.SXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
float_emit.SCVTF(32, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.SCVTF(32, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
|
@ -591,7 +591,7 @@ void JitArm64::GenerateQuantizedLoads()
|
||||||
constexpr u32 flags =
|
constexpr u32 flags =
|
||||||
BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_32;
|
BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_32;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg,
|
||||||
gprs_to_push & ~BitSet32{1}, fprs_to_push, true);
|
gprs_to_push & ~BitSet32{1}, fprs_to_push, true);
|
||||||
|
|
||||||
RET(ARM64Reg::X30);
|
RET(ARM64Reg::X30);
|
||||||
|
@ -601,8 +601,8 @@ void JitArm64::GenerateQuantizedLoads()
|
||||||
constexpr u32 flags =
|
constexpr u32 flags =
|
||||||
BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_8;
|
BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_8;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
float_emit.UXTL(8, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.UXTL(8, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
float_emit.UXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.UXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
|
@ -619,8 +619,8 @@ void JitArm64::GenerateQuantizedLoads()
|
||||||
constexpr u32 flags =
|
constexpr u32 flags =
|
||||||
BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_8;
|
BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_8;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
float_emit.SXTL(8, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.SXTL(8, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
float_emit.SXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.SXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
|
@ -637,8 +637,8 @@ void JitArm64::GenerateQuantizedLoads()
|
||||||
constexpr u32 flags =
|
constexpr u32 flags =
|
||||||
BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_16;
|
BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_16;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
float_emit.UXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.UXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
float_emit.UCVTF(32, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.UCVTF(32, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
|
@ -654,8 +654,8 @@ void JitArm64::GenerateQuantizedLoads()
|
||||||
constexpr u32 flags =
|
constexpr u32 flags =
|
||||||
BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_16;
|
BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_16;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
float_emit.SXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.SXTL(16, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
float_emit.SCVTF(32, ARM64Reg::D0, ARM64Reg::D0);
|
float_emit.SCVTF(32, ARM64Reg::D0, ARM64Reg::D0);
|
||||||
|
@ -718,8 +718,8 @@ void JitArm64::GenerateQuantizedStores()
|
||||||
constexpr u32 flags = BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT |
|
constexpr u32 flags = BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT |
|
||||||
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_32;
|
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_32;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
RET(ARM64Reg::X30);
|
RET(ARM64Reg::X30);
|
||||||
}
|
}
|
||||||
|
@ -737,8 +737,8 @@ void JitArm64::GenerateQuantizedStores()
|
||||||
constexpr u32 flags = BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT |
|
constexpr u32 flags = BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT |
|
||||||
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_8;
|
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_8;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
RET(ARM64Reg::X30);
|
RET(ARM64Reg::X30);
|
||||||
}
|
}
|
||||||
|
@ -756,8 +756,8 @@ void JitArm64::GenerateQuantizedStores()
|
||||||
constexpr u32 flags = BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT |
|
constexpr u32 flags = BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT |
|
||||||
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_8;
|
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_8;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
RET(ARM64Reg::X30);
|
RET(ARM64Reg::X30);
|
||||||
}
|
}
|
||||||
|
@ -774,8 +774,8 @@ void JitArm64::GenerateQuantizedStores()
|
||||||
constexpr u32 flags = BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT |
|
constexpr u32 flags = BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT |
|
||||||
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_16;
|
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_16;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
RET(ARM64Reg::X30);
|
RET(ARM64Reg::X30);
|
||||||
}
|
}
|
||||||
|
@ -792,8 +792,8 @@ void JitArm64::GenerateQuantizedStores()
|
||||||
constexpr u32 flags = BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT |
|
constexpr u32 flags = BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT |
|
||||||
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_16;
|
BackPatchInfo::FLAG_PAIR | BackPatchInfo::FLAG_SIZE_16;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
RET(ARM64Reg::X30);
|
RET(ARM64Reg::X30);
|
||||||
}
|
}
|
||||||
|
@ -803,8 +803,8 @@ void JitArm64::GenerateQuantizedStores()
|
||||||
constexpr u32 flags =
|
constexpr u32 flags =
|
||||||
BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_32;
|
BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_32;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
RET(ARM64Reg::X30);
|
RET(ARM64Reg::X30);
|
||||||
}
|
}
|
||||||
|
@ -822,8 +822,8 @@ void JitArm64::GenerateQuantizedStores()
|
||||||
constexpr u32 flags =
|
constexpr u32 flags =
|
||||||
BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_8;
|
BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_8;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
RET(ARM64Reg::X30);
|
RET(ARM64Reg::X30);
|
||||||
}
|
}
|
||||||
|
@ -841,8 +841,8 @@ void JitArm64::GenerateQuantizedStores()
|
||||||
constexpr u32 flags =
|
constexpr u32 flags =
|
||||||
BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_8;
|
BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_8;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
RET(ARM64Reg::X30);
|
RET(ARM64Reg::X30);
|
||||||
}
|
}
|
||||||
|
@ -859,8 +859,8 @@ void JitArm64::GenerateQuantizedStores()
|
||||||
constexpr u32 flags =
|
constexpr u32 flags =
|
||||||
BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_16;
|
BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_16;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
RET(ARM64Reg::X30);
|
RET(ARM64Reg::X30);
|
||||||
}
|
}
|
||||||
|
@ -877,8 +877,8 @@ void JitArm64::GenerateQuantizedStores()
|
||||||
constexpr u32 flags =
|
constexpr u32 flags =
|
||||||
BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_16;
|
BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_16;
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, jo.fastmem_arena, jo.fastmem_arena, ARM64Reg::D0, addr_reg,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, ARM64Reg::D0, addr_reg, gprs_to_push,
|
||||||
gprs_to_push, fprs_to_push, true);
|
fprs_to_push, true);
|
||||||
|
|
||||||
RET(ARM64Reg::X30);
|
RET(ARM64Reg::X30);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue