mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-12-16 04:09:39 +00:00
Jit: Move extsXx to ConstantPropagation
This commit is contained in:
parent
f04417eb5a
commit
b506cb2ad8
@ -1026,13 +1026,8 @@ void Jit64::extsXx(UGeckoInstruction inst)
|
|||||||
int a = inst.RA, s = inst.RS;
|
int a = inst.RA, s = inst.RS;
|
||||||
int size = inst.SUBOP10 == 922 ? 16 : 8;
|
int size = inst.SUBOP10 == 922 ? 16 : 8;
|
||||||
|
|
||||||
if (gpr.IsImm(s))
|
|
||||||
{
|
{
|
||||||
gpr.SetImmediate32(a, (u32)(s32)(size == 16 ? (s16)gpr.Imm32(s) : (s8)gpr.Imm32(s)));
|
RCOpArg Rs = gpr.UseNoImm(s, RCMode::Read);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
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);
|
||||||
MOVSX(32, size, Ra, Rs);
|
MOVSX(32, size, Ra, Rs);
|
||||||
|
|||||||
@ -506,19 +506,10 @@ void JitArm64::extsXx(UGeckoInstruction inst)
|
|||||||
int a = inst.RA, s = inst.RS;
|
int a = inst.RA, s = inst.RS;
|
||||||
int size = inst.SUBOP10 == 922 ? 16 : 8;
|
int size = inst.SUBOP10 == 922 ? 16 : 8;
|
||||||
|
|
||||||
if (gpr.IsImm(s))
|
gpr.BindToRegister(a, a == s);
|
||||||
{
|
SBFM(gpr.R(a), gpr.R(s), 0, size - 1);
|
||||||
gpr.SetImmediate(a, (u32)(s32)(size == 16 ? (s16)gpr.GetImm(s) : (s8)gpr.GetImm(s)));
|
if (inst.Rc)
|
||||||
if (inst.Rc)
|
ComputeRC0(gpr.R(a));
|
||||||
ComputeRC0(gpr.GetImm(a));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gpr.BindToRegister(a, a == s);
|
|
||||||
SBFM(gpr.R(a), gpr.R(s), 0, size - 1);
|
|
||||||
if (inst.Rc)
|
|
||||||
ComputeRC0(gpr.R(a));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JitArm64::cntlzwx(UGeckoInstruction inst)
|
void JitArm64::cntlzwx(UGeckoInstruction inst)
|
||||||
|
|||||||
@ -77,18 +77,49 @@ ConstantPropagationResult ConstantPropagation::EvaluateBitwiseImm(UGeckoInstruct
|
|||||||
ConstantPropagationResult ConstantPropagation::EvaluateTable31(UGeckoInstruction inst,
|
ConstantPropagationResult ConstantPropagation::EvaluateTable31(UGeckoInstruction inst,
|
||||||
u64 flags) const
|
u64 flags) const
|
||||||
{
|
{
|
||||||
if (flags & FL_OUT_D)
|
if (flags & FL_IN_B)
|
||||||
{
|
{
|
||||||
// input a, b -> output d
|
if (flags & FL_OUT_D)
|
||||||
return EvaluateTable31AB(inst, flags);
|
{
|
||||||
|
// input a, b -> output d
|
||||||
|
return EvaluateTable31AB(inst, flags);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// input s, b -> output a
|
||||||
|
return EvaluateTable31SB(inst);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// input s, b -> output a
|
// input s -> output a
|
||||||
return EvaluateTable31SB(inst);
|
return EvaluateTable31S(inst);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ConstantPropagationResult ConstantPropagation::EvaluateTable31S(UGeckoInstruction inst) const
|
||||||
|
{
|
||||||
|
if (!HasGPR(inst.RS))
|
||||||
|
return {};
|
||||||
|
|
||||||
|
u32 a;
|
||||||
|
const u32 s = GetGPR(inst.RS);
|
||||||
|
|
||||||
|
switch (inst.SUBOP10)
|
||||||
|
{
|
||||||
|
case 922: // extshx
|
||||||
|
a = s32(s16(s));
|
||||||
|
break;
|
||||||
|
case 954: // extsbx
|
||||||
|
a = s32(s8(s));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return ConstantPropagationResult(inst.RA, a, inst.Rc);
|
||||||
|
}
|
||||||
|
|
||||||
ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstruction inst,
|
ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstruction inst,
|
||||||
u64 flags) const
|
u64 flags) const
|
||||||
{
|
{
|
||||||
|
|||||||
@ -81,6 +81,7 @@ private:
|
|||||||
ConstantPropagationResult EvaluateBitwiseImm(UGeckoInstruction inst,
|
ConstantPropagationResult EvaluateBitwiseImm(UGeckoInstruction inst,
|
||||||
u32 (*do_op)(u32, u32)) const;
|
u32 (*do_op)(u32, u32)) const;
|
||||||
ConstantPropagationResult EvaluateTable31(UGeckoInstruction inst, u64 flags) const;
|
ConstantPropagationResult EvaluateTable31(UGeckoInstruction inst, u64 flags) const;
|
||||||
|
ConstantPropagationResult EvaluateTable31S(UGeckoInstruction inst) const;
|
||||||
ConstantPropagationResult EvaluateTable31AB(UGeckoInstruction inst, u64 flags) const;
|
ConstantPropagationResult EvaluateTable31AB(UGeckoInstruction inst, u64 flags) const;
|
||||||
ConstantPropagationResult EvaluateTable31SB(UGeckoInstruction inst) const;
|
ConstantPropagationResult EvaluateTable31SB(UGeckoInstruction inst) const;
|
||||||
ConstantPropagationResult EvaluateTable31SBOneRegisterKnown(UGeckoInstruction inst, u32 value,
|
ConstantPropagationResult EvaluateTable31SBOneRegisterKnown(UGeckoInstruction inst, u32 value,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user