mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-04-25 03:02:38 +00:00
Merge pull request #12672 from JosJuice/jit64-extract-with-byte-offset
Jit64: Clean up ExtractWithByteOffset
This commit is contained in:
commit
017f72f43e
@ -2065,6 +2065,28 @@ void Jit64::rlwinmx(UGeckoInstruction inst)
|
|||||||
bool needs_sext = true;
|
bool needs_sext = true;
|
||||||
int mask_size = inst.ME - inst.MB + 1;
|
int mask_size = inst.ME - inst.MB + 1;
|
||||||
|
|
||||||
|
if (simple_mask && !(inst.SH & (mask_size - 1)) && !gpr.IsBound(s))
|
||||||
|
{
|
||||||
|
// optimized case: byte/word extract from m_ppc_state
|
||||||
|
|
||||||
|
// Note: If a == s, calling Realize(Ra) will allocate a host register for Rs,
|
||||||
|
// so we have to get mem_source from Rs before calling Realize(Ra)
|
||||||
|
|
||||||
|
RCOpArg Rs = gpr.Use(s, RCMode::Read);
|
||||||
|
RegCache::Realize(Rs);
|
||||||
|
OpArg mem_source = Rs.Location();
|
||||||
|
if (inst.SH)
|
||||||
|
mem_source.AddMemOffset((32 - inst.SH) >> 3);
|
||||||
|
Rs.Unlock();
|
||||||
|
|
||||||
|
RCX64Reg Ra = gpr.Bind(a, RCMode::Write);
|
||||||
|
RegCache::Realize(Ra);
|
||||||
|
MOVZX(32, mask_size, Ra, mem_source);
|
||||||
|
|
||||||
|
needs_sext = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
RCOpArg Rs = gpr.Use(s, RCMode::Read);
|
RCOpArg Rs = gpr.Use(s, RCMode::Read);
|
||||||
RCX64Reg Ra = gpr.Bind(a, RCMode::Write);
|
RCX64Reg Ra = gpr.Bind(a, RCMode::Write);
|
||||||
RegCache::Realize(Rs, Ra);
|
RegCache::Realize(Rs, Ra);
|
||||||
@ -2073,13 +2095,7 @@ void Jit64::rlwinmx(UGeckoInstruction inst)
|
|||||||
{
|
{
|
||||||
LEA(32, Ra, MScaled(Rs.GetSimpleReg(), SCALE_1 << inst.SH, 0));
|
LEA(32, Ra, MScaled(Rs.GetSimpleReg(), SCALE_1 << inst.SH, 0));
|
||||||
}
|
}
|
||||||
// common optimized case: byte/word extract
|
// optimized case: byte/word extract plus rotate
|
||||||
else if (simple_mask && !(inst.SH & (mask_size - 1)))
|
|
||||||
{
|
|
||||||
MOVZX(32, mask_size, Ra, Rs.ExtractWithByteOffset(inst.SH ? (32 - inst.SH) >> 3 : 0));
|
|
||||||
needs_sext = false;
|
|
||||||
}
|
|
||||||
// another optimized special case: byte/word extract plus rotate
|
|
||||||
else if (simple_prerotate_mask && !left_shift)
|
else if (simple_prerotate_mask && !left_shift)
|
||||||
{
|
{
|
||||||
MOVZX(32, prerotate_mask == 0xff ? 8 : 16, Ra, Rs);
|
MOVZX(32, prerotate_mask == 0xff ? 8 : 16, Ra, Rs);
|
||||||
@ -2124,9 +2140,7 @@ void Jit64::rlwinmx(UGeckoInstruction inst)
|
|||||||
needs_test = false;
|
needs_test = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Rs.Unlock();
|
|
||||||
Ra.Unlock();
|
|
||||||
|
|
||||||
if (inst.Rc)
|
if (inst.Rc)
|
||||||
ComputeRC(a, needs_test, needs_sext);
|
ComputeRC(a, needs_test, needs_sext);
|
||||||
|
@ -109,19 +109,6 @@ OpArg RCOpArg::Location() const
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
OpArg RCOpArg::ExtractWithByteOffset(int offset)
|
|
||||||
{
|
|
||||||
if (offset == 0)
|
|
||||||
return Location();
|
|
||||||
|
|
||||||
ASSERT(rc);
|
|
||||||
const preg_t preg = std::get<preg_t>(contents);
|
|
||||||
rc->StoreFromRegister(preg, RegCache::FlushMode::MaintainState);
|
|
||||||
OpArg result = rc->GetDefaultLocation(preg);
|
|
||||||
result.AddMemOffset(offset);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RCOpArg::Unlock()
|
void RCOpArg::Unlock()
|
||||||
{
|
{
|
||||||
if (const preg_t* preg = std::get_if<preg_t>(&contents))
|
if (const preg_t* preg = std::get_if<preg_t>(&contents))
|
||||||
|
@ -47,9 +47,6 @@ public:
|
|||||||
bool IsSimpleReg(Gen::X64Reg reg) const { return Location().IsSimpleReg(reg); }
|
bool IsSimpleReg(Gen::X64Reg reg) const { return Location().IsSimpleReg(reg); }
|
||||||
Gen::X64Reg GetSimpleReg() const { return Location().GetSimpleReg(); }
|
Gen::X64Reg GetSimpleReg() const { return Location().GetSimpleReg(); }
|
||||||
|
|
||||||
// Use to extract bytes from a register using the regcache. offset is in bytes.
|
|
||||||
Gen::OpArg ExtractWithByteOffset(int offset);
|
|
||||||
|
|
||||||
void Unlock();
|
void Unlock();
|
||||||
|
|
||||||
bool IsImm() const;
|
bool IsImm() const;
|
||||||
@ -159,6 +156,8 @@ public:
|
|||||||
u32 Imm32(preg_t preg) const { return R(preg).Imm32(); }
|
u32 Imm32(preg_t preg) const { return R(preg).Imm32(); }
|
||||||
s32 SImm32(preg_t preg) const { return R(preg).SImm32(); }
|
s32 SImm32(preg_t preg) const { return R(preg).SImm32(); }
|
||||||
|
|
||||||
|
bool IsBound(preg_t preg) const { return m_regs[preg].IsBound(); }
|
||||||
|
|
||||||
RCOpArg Use(preg_t preg, RCMode mode);
|
RCOpArg Use(preg_t preg, RCMode mode);
|
||||||
RCOpArg UseNoImm(preg_t preg, RCMode mode);
|
RCOpArg UseNoImm(preg_t preg, RCMode mode);
|
||||||
RCOpArg BindOrImm(preg_t preg, RCMode mode);
|
RCOpArg BindOrImm(preg_t preg, RCMode mode);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user