JitArm64: Optimize addi2r & subi2r.
This commit is contained in:
parent
df250b84cc
commit
1df694626d
|
@ -4131,10 +4131,15 @@ void ARM64XEmitter::ADDI2R(ARM64Reg Rd, ARM64Reg Rn, u64 imm, ARM64Reg scratch)
|
||||||
{
|
{
|
||||||
u32 val;
|
u32 val;
|
||||||
bool shift;
|
bool shift;
|
||||||
|
u64 imm_neg = Is64Bit(Rd) ? -imm : -imm & 0xFFFFFFFFuLL;
|
||||||
if (IsImmArithmetic(imm, &val, &shift))
|
if (IsImmArithmetic(imm, &val, &shift))
|
||||||
{
|
{
|
||||||
ADD(Rd, Rn, val, shift);
|
ADD(Rd, Rn, val, shift);
|
||||||
}
|
}
|
||||||
|
else if (IsImmArithmetic(imm_neg, &val, &shift))
|
||||||
|
{
|
||||||
|
SUB(Rd, Rn, val, shift);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_assert_msg_(DYNA_REC, scratch != INVALID_REG,
|
_assert_msg_(DYNA_REC, scratch != INVALID_REG,
|
||||||
|
@ -4149,10 +4154,15 @@ void ARM64XEmitter::ADDSI2R(ARM64Reg Rd, ARM64Reg Rn, u64 imm, ARM64Reg scratch)
|
||||||
{
|
{
|
||||||
u32 val;
|
u32 val;
|
||||||
bool shift;
|
bool shift;
|
||||||
|
u64 imm_neg = Is64Bit(Rd) ? -imm : -imm & 0xFFFFFFFFuLL;
|
||||||
if (IsImmArithmetic(imm, &val, &shift))
|
if (IsImmArithmetic(imm, &val, &shift))
|
||||||
{
|
{
|
||||||
ADDS(Rd, Rn, val, shift);
|
ADDS(Rd, Rn, val, shift);
|
||||||
}
|
}
|
||||||
|
else if (IsImmArithmetic(imm_neg, &val, &shift))
|
||||||
|
{
|
||||||
|
SUBS(Rd, Rn, val, shift);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_assert_msg_(DYNA_REC, scratch != INVALID_REG,
|
_assert_msg_(DYNA_REC, scratch != INVALID_REG,
|
||||||
|
@ -4167,10 +4177,15 @@ void ARM64XEmitter::SUBI2R(ARM64Reg Rd, ARM64Reg Rn, u64 imm, ARM64Reg scratch)
|
||||||
{
|
{
|
||||||
u32 val;
|
u32 val;
|
||||||
bool shift;
|
bool shift;
|
||||||
|
u64 imm_neg = Is64Bit(Rd) ? -imm : -imm & 0xFFFFFFFFuLL;
|
||||||
if (IsImmArithmetic(imm, &val, &shift))
|
if (IsImmArithmetic(imm, &val, &shift))
|
||||||
{
|
{
|
||||||
SUB(Rd, Rn, val, shift);
|
SUB(Rd, Rn, val, shift);
|
||||||
}
|
}
|
||||||
|
else if (IsImmArithmetic(imm_neg, &val, &shift))
|
||||||
|
{
|
||||||
|
ADD(Rd, Rn, val, shift);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_assert_msg_(DYNA_REC, scratch != INVALID_REG,
|
_assert_msg_(DYNA_REC, scratch != INVALID_REG,
|
||||||
|
@ -4185,10 +4200,15 @@ void ARM64XEmitter::SUBSI2R(ARM64Reg Rd, ARM64Reg Rn, u64 imm, ARM64Reg scratch)
|
||||||
{
|
{
|
||||||
u32 val;
|
u32 val;
|
||||||
bool shift;
|
bool shift;
|
||||||
|
u64 imm_neg = Is64Bit(Rd) ? -imm : -imm & 0xFFFFFFFFuLL;
|
||||||
if (IsImmArithmetic(imm, &val, &shift))
|
if (IsImmArithmetic(imm, &val, &shift))
|
||||||
{
|
{
|
||||||
SUBS(Rd, Rn, val, shift);
|
SUBS(Rd, Rn, val, shift);
|
||||||
}
|
}
|
||||||
|
else if (IsImmArithmetic(imm_neg, &val, &shift))
|
||||||
|
{
|
||||||
|
ADDS(Rd, Rn, val, shift);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_assert_msg_(DYNA_REC, scratch != INVALID_REG,
|
_assert_msg_(DYNA_REC, scratch != INVALID_REG,
|
||||||
|
|
Loading…
Reference in New Issue