mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-29 09:09:52 -06:00
JitArm64: Stop using hand-encoded logical immediates
This commit is contained in:
@ -735,7 +735,10 @@ void JitArm64::DoJit(u32 em_address, JitBlock* b, u32 nextPC)
|
||||
TBZ(ARM64Reg::W30, 15, done_here); // MSR.EE
|
||||
MOVP2R(ARM64Reg::X30, &ProcessorInterface::m_InterruptCause);
|
||||
LDR(IndexType::Unsigned, ARM64Reg::W30, ARM64Reg::X30, 0);
|
||||
TST(ARM64Reg::W30, 23, 2);
|
||||
constexpr u32 cause_mask = ProcessorInterface::INT_CAUSE_CP |
|
||||
ProcessorInterface::INT_CAUSE_PE_TOKEN |
|
||||
ProcessorInterface::INT_CAUSE_PE_FINISH;
|
||||
TST(ARM64Reg::W30, LogicalImm(cause_mask, 32));
|
||||
B(CC_EQ, done_here);
|
||||
|
||||
gpr.Flush(FlushMode::MaintainState);
|
||||
@ -767,7 +770,10 @@ void JitArm64::DoJit(u32 em_address, JitBlock* b, u32 nextPC)
|
||||
TBZ(WA, 15, done_here); // MSR.EE
|
||||
MOVP2R(XA, &ProcessorInterface::m_InterruptCause);
|
||||
LDR(IndexType::Unsigned, WA, XA, 0);
|
||||
TST(WA, 23, 2);
|
||||
constexpr u32 cause_mask = ProcessorInterface::INT_CAUSE_CP |
|
||||
ProcessorInterface::INT_CAUSE_PE_TOKEN |
|
||||
ProcessorInterface::INT_CAUSE_PE_FINISH;
|
||||
TST(WA, LogicalImm(cause_mask, 32));
|
||||
B(CC_EQ, done_here);
|
||||
gpr.Unlock(WA);
|
||||
|
||||
|
@ -219,7 +219,7 @@ void JitArm64::bcctrx(UGeckoInstruction inst)
|
||||
ARM64Reg WA = gpr.GetReg();
|
||||
|
||||
LDR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF_SPR(SPR_CTR));
|
||||
AND(WA, WA, 30, 29); // Wipe the bottom 2 bits.
|
||||
AND(WA, WA, LogicalImm(~0x3, 32));
|
||||
|
||||
WriteExit(WA, inst.LK_3, js.compilerPC + 4);
|
||||
|
||||
@ -265,7 +265,7 @@ void JitArm64::bclrx(UGeckoInstruction inst)
|
||||
}
|
||||
|
||||
LDR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF_SPR(SPR_LR));
|
||||
AND(WA, WA, 30, 29); // Wipe the bottom 2 bits.
|
||||
AND(WA, WA, LogicalImm(~0x3, 32));
|
||||
|
||||
if (inst.LK)
|
||||
{
|
||||
|
@ -436,7 +436,7 @@ void JitArm64::FloatCompare(UGeckoInstruction inst, bool upper)
|
||||
|
||||
FixupBranch pNaN, pLesser, pGreater;
|
||||
FixupBranch continue1, continue2, continue3;
|
||||
ORR(XA, ARM64Reg::ZR, 32, 0, true);
|
||||
MOVI2R(XA, 1ULL << 32);
|
||||
|
||||
if (a != b)
|
||||
{
|
||||
@ -449,7 +449,7 @@ void JitArm64::FloatCompare(UGeckoInstruction inst, bool upper)
|
||||
pNaN = B(CC_VS);
|
||||
|
||||
// A == B
|
||||
ORR(XA, XA, 64 - 63, 0, true);
|
||||
ORR(XA, XA, LogicalImm(1ULL << 63, 64));
|
||||
if (fprf)
|
||||
ORR(fpscr_reg, fpscr_reg, LogicalImm(PowerPC::CR_EQ << FPRF_SHIFT, 32));
|
||||
|
||||
@ -466,15 +466,15 @@ void JitArm64::FloatCompare(UGeckoInstruction inst, bool upper)
|
||||
continue2 = B();
|
||||
|
||||
SetJumpTarget(pGreater);
|
||||
ORR(XA, XA, 0, 0, true);
|
||||
ORR(XA, XA, LogicalImm(1, 64));
|
||||
if (fprf)
|
||||
ORR(fpscr_reg, fpscr_reg, LogicalImm(PowerPC::CR_GT << FPRF_SHIFT, 32));
|
||||
|
||||
continue3 = B();
|
||||
|
||||
SetJumpTarget(pLesser);
|
||||
ORR(XA, XA, 64 - 62, 1, true);
|
||||
ORR(XA, XA, 0, 0, true);
|
||||
ORR(XA, XA, LogicalImm(0xC000'0000'0000'0000, 64));
|
||||
ORR(XA, XA, LogicalImm(1, 64));
|
||||
if (fprf)
|
||||
ORR(fpscr_reg, fpscr_reg, LogicalImm(PowerPC::CR_LT << FPRF_SHIFT, 32));
|
||||
|
||||
|
@ -200,7 +200,7 @@ void JitArm64::psq_st(UGeckoInstruction inst)
|
||||
|
||||
// Inline address check
|
||||
// FIXME: This doesn't correctly account for the BAT configuration.
|
||||
TST(addr_reg, 6, 1);
|
||||
TST(addr_reg, LogicalImm(0x0c000000, 32));
|
||||
FixupBranch pass = B(CC_EQ);
|
||||
FixupBranch fail = B();
|
||||
|
||||
|
@ -42,7 +42,7 @@ void JitArm64::FixGTBeforeSettingCRFieldBit(Arm64Gen::ARM64Reg reg)
|
||||
// intending to. This can break actual games, so fix it up.
|
||||
ARM64Reg WA = gpr.GetReg();
|
||||
ARM64Reg XA = EncodeRegTo64(WA);
|
||||
ORR(XA, reg, 64 - 63, 0, true); // XB | 1<<63
|
||||
ORR(XA, reg, LogicalImm(1ULL << 63, 64));
|
||||
CMP(reg, ARM64Reg::ZR);
|
||||
CSEL(reg, reg, XA, CC_NEQ);
|
||||
gpr.Unlock(WA);
|
||||
@ -405,7 +405,7 @@ void JitArm64::mtspr(UGeckoInstruction inst)
|
||||
{
|
||||
ARM64Reg RD = gpr.R(inst.RD);
|
||||
ARM64Reg WA = gpr.GetReg();
|
||||
AND(WA, RD, 24, 30);
|
||||
AND(WA, RD, LogicalImm(0xFFFFFF7F, 32));
|
||||
STRH(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(xer_stringctrl));
|
||||
UBFM(WA, RD, XER_CA_SHIFT, XER_CA_SHIFT + 1);
|
||||
STRB(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(xer_ca));
|
||||
@ -521,7 +521,7 @@ void JitArm64::crXXX(UGeckoInstruction inst)
|
||||
case PowerPC::CR_SO_BIT: // check bit 59 set
|
||||
UBFX(out, XC, PowerPC::CR_EMU_SO_BIT, 1);
|
||||
if (negate)
|
||||
EOR(out, out, 0, 0, true); // XC ^ 1
|
||||
EOR(out, out, LogicalImm(1, 64));
|
||||
break;
|
||||
|
||||
case PowerPC::CR_EQ_BIT: // check bits 31-0 == 0
|
||||
@ -537,7 +537,7 @@ void JitArm64::crXXX(UGeckoInstruction inst)
|
||||
case PowerPC::CR_LT_BIT: // check bit 62 set
|
||||
UBFX(out, XC, PowerPC::CR_EMU_LT_BIT, 1);
|
||||
if (negate)
|
||||
EOR(out, out, 0, 0, true); // XC ^ 1
|
||||
EOR(out, out, LogicalImm(1, 64));
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -584,14 +584,14 @@ void JitArm64::crXXX(UGeckoInstruction inst)
|
||||
BFI(XB, XA, PowerPC::CR_EMU_SO_BIT, 1);
|
||||
break;
|
||||
|
||||
case PowerPC::CR_EQ_BIT: // clear low 32 bits, set bit 0 to !input
|
||||
AND(XB, XB, 32, 31, true); // Clear lower 32bits
|
||||
EOR(XA, XA, 0, 0); // XA ^ 1<<0
|
||||
case PowerPC::CR_EQ_BIT: // clear low 32 bits, set bit 0 to !input
|
||||
AND(XB, XB, LogicalImm(0xFFFF'FFFF'0000'0000, 64));
|
||||
EOR(XA, XA, LogicalImm(1, 64));
|
||||
ORR(XB, XB, XA);
|
||||
break;
|
||||
|
||||
case PowerPC::CR_GT_BIT: // set bit 63 to !input
|
||||
EOR(XA, XA, 0, 0); // XA ^ 1<<0
|
||||
EOR(XA, XA, LogicalImm(1, 64));
|
||||
BFI(XB, XA, 63, 1);
|
||||
break;
|
||||
|
||||
@ -600,7 +600,7 @@ void JitArm64::crXXX(UGeckoInstruction inst)
|
||||
break;
|
||||
}
|
||||
|
||||
ORR(XB, XB, 32, 0, true); // XB | 1<<32
|
||||
ORR(XB, XB, LogicalImm(1ULL << 32, 64));
|
||||
|
||||
gpr.Unlock(WA);
|
||||
}
|
||||
@ -639,12 +639,12 @@ void JitArm64::mfcr(UGeckoInstruction inst)
|
||||
}
|
||||
|
||||
// EQ
|
||||
ORR(WC, WA, 32 - PowerPC::CR_EQ_BIT, 0);
|
||||
ORR(WC, WA, LogicalImm(1 << PowerPC::CR_EQ_BIT, 32));
|
||||
CMP(WCR, ARM64Reg::WZR);
|
||||
CSEL(WA, WC, WA, CC_EQ);
|
||||
|
||||
// GT
|
||||
ORR(WC, WA, 32 - PowerPC::CR_GT_BIT, 0);
|
||||
ORR(WC, WA, LogicalImm(1 << PowerPC::CR_GT_BIT, 32));
|
||||
CMP(CR, ARM64Reg::ZR);
|
||||
CSEL(WA, WC, WA, CC_GT);
|
||||
}
|
||||
@ -748,7 +748,7 @@ void JitArm64::mffsx(UGeckoInstruction inst)
|
||||
STR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(fpscr));
|
||||
|
||||
// Vd = FPSCR.Hex | 0xFFF8'0000'0000'0000;
|
||||
ORR(XA, XA, 13, 12, true);
|
||||
ORR(XA, XA, LogicalImm(0xFFF8'0000'0000'0000, 64));
|
||||
m_float_emit.FMOV(EncodeRegToDouble(VD), XA);
|
||||
|
||||
gpr.Unlock(WA);
|
||||
|
Reference in New Issue
Block a user