mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-12-16 04:09:39 +00:00
Jit: Move srawx to ConstantPropagation
This commit is contained in:
parent
c136fd9807
commit
bac911aac4
@ -2338,22 +2338,7 @@ void Jit64::srawx(UGeckoInstruction inst)
|
|||||||
int b = inst.RB;
|
int b = inst.RB;
|
||||||
int s = inst.RS;
|
int s = inst.RS;
|
||||||
|
|
||||||
if (gpr.IsImm(b, s))
|
if (gpr.IsImm(b))
|
||||||
{
|
|
||||||
s32 i = gpr.SImm32(s), amount = gpr.SImm32(b);
|
|
||||||
if (amount & 0x20)
|
|
||||||
{
|
|
||||||
gpr.SetImmediate32(a, i & 0x80000000 ? 0xFFFFFFFF : 0);
|
|
||||||
FinalizeCarry(i & 0x80000000 ? true : false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
amount &= 0x1F;
|
|
||||||
gpr.SetImmediate32(a, i >> amount);
|
|
||||||
FinalizeCarry(amount != 0 && i < 0 && (u32(i) << (32 - amount)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (gpr.IsImm(b))
|
|
||||||
{
|
{
|
||||||
u32 amount = gpr.Imm32(b);
|
u32 amount = gpr.Imm32(b);
|
||||||
RCX64Reg Ra = gpr.Bind(a, RCMode::Write);
|
RCX64Reg Ra = gpr.Bind(a, RCMode::Write);
|
||||||
@ -2389,11 +2374,6 @@ void Jit64::srawx(UGeckoInstruction inst)
|
|||||||
FinalizeCarry(CC_NZ);
|
FinalizeCarry(CC_NZ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (gpr.IsImm(s) && gpr.Imm32(s) == 0)
|
|
||||||
{
|
|
||||||
gpr.SetImmediate32(a, 0);
|
|
||||||
FinalizeCarry(false);
|
|
||||||
}
|
|
||||||
else if (cpu_info.bBMI2)
|
else if (cpu_info.bBMI2)
|
||||||
{
|
{
|
||||||
RCX64Reg Ra = gpr.Bind(a, RCMode::Write);
|
RCX64Reg Ra = gpr.Bind(a, RCMode::Write);
|
||||||
|
|||||||
@ -1871,34 +1871,7 @@ void JitArm64::srawx(UGeckoInstruction inst)
|
|||||||
|
|
||||||
int a = inst.RA, b = inst.RB, s = inst.RS;
|
int a = inst.RA, b = inst.RB, s = inst.RS;
|
||||||
|
|
||||||
if (gpr.IsImm(b) && gpr.IsImm(s))
|
if (gpr.IsImm(b))
|
||||||
{
|
|
||||||
s32 i = gpr.GetImm(s), amount = gpr.GetImm(b);
|
|
||||||
if (amount & 0x20)
|
|
||||||
{
|
|
||||||
gpr.SetImmediate(a, i & 0x80000000 ? 0xFFFFFFFF : 0);
|
|
||||||
ComputeCarry(i & 0x80000000 ? true : false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
amount &= 0x1F;
|
|
||||||
gpr.SetImmediate(a, i >> amount);
|
|
||||||
ComputeCarry(amount != 0 && i < 0 && (u32(i) << (32 - amount)));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inst.Rc)
|
|
||||||
ComputeRC0(gpr.GetImm(a));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (gpr.IsImm(s, 0))
|
|
||||||
{
|
|
||||||
gpr.SetImmediate(a, 0);
|
|
||||||
ComputeCarry(false);
|
|
||||||
if (inst.Rc)
|
|
||||||
ComputeRC0(0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (gpr.IsImm(b))
|
|
||||||
{
|
{
|
||||||
int amount = gpr.GetImm(b);
|
int amount = gpr.GetImm(b);
|
||||||
|
|
||||||
|
|||||||
@ -401,6 +401,15 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31SB(UGeckoInstructi
|
|||||||
case 536: // srwx
|
case 536: // srwx
|
||||||
a = u32(u64(s) >> (b & 0x3f));
|
a = u32(u64(s) >> (b & 0x3f));
|
||||||
break;
|
break;
|
||||||
|
case 792: // srawx
|
||||||
|
{
|
||||||
|
const u64 temp = (s64(s32(s)) << 32) >> (b & 0x3f);
|
||||||
|
a = u32(temp >> 32);
|
||||||
|
|
||||||
|
ConstantPropagationResult result(inst.RA, a, inst.Rc);
|
||||||
|
result.carry = (temp & a) != 0;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -457,6 +466,18 @@ ConstantPropagation::EvaluateTable31SBOneRegisterKnown(UGeckoInstruction inst, u
|
|||||||
else
|
else
|
||||||
return {};
|
return {};
|
||||||
break;
|
break;
|
||||||
|
case 792: // srawx
|
||||||
|
if (!known_reg_is_b && value == 0)
|
||||||
|
{
|
||||||
|
ConstantPropagationResult result(inst.RA, 0, inst.Rc);
|
||||||
|
result.carry = false;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user