mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[ARM] Mark VMOVDRR with the RegSequence property and implement the related
target hook. This patch teaches the compiler that: dX = VMOVDRR rY, rZ is the same as: dX = REG_SEQUENCE rY, ssub_0, rZ, ssub_1 <rdar://problem/12702965> llvm-svn: 215404
This commit is contained in:
parent
ed31df5992
commit
eb7a255ad0
@ -98,6 +98,31 @@ void ARMInstrInfo::expandLoadStackGuard(MachineBasicBlock::iterator MI,
|
||||
expandLoadStackGuardBase(MI, ARM::LDRLIT_ga_abs, ARM::LDRi12, RM);
|
||||
}
|
||||
|
||||
bool ARMInstrInfo::getRegSequenceLikeInputs(
|
||||
const MachineInstr &MI, unsigned DefIdx,
|
||||
SmallVectorImpl<RegSubRegPairAndIdx> &InputRegs) const {
|
||||
assert(DefIdx < MI.getDesc().getNumDefs() && "Invalid definition index");
|
||||
assert(MI.isRegSequenceLike() && "Invalid kind of instruction");
|
||||
|
||||
switch (MI.getOpcode()) {
|
||||
case ARM::VMOVDRR:
|
||||
// dX = VMOVDRR rY, rZ
|
||||
// is the same as:
|
||||
// dX = REG_SEQUENCE rY, ssub_0, rZ, ssub_1
|
||||
// Populate the InputRegs accordingly.
|
||||
// rY
|
||||
const MachineOperand *MOReg = &MI.getOperand(1);
|
||||
InputRegs.push_back(
|
||||
RegSubRegPairAndIdx(MOReg->getReg(), MOReg->getSubReg(), ARM::ssub_0));
|
||||
// rZ
|
||||
MOReg = &MI.getOperand(2);
|
||||
InputRegs.push_back(
|
||||
RegSubRegPairAndIdx(MOReg->getReg(), MOReg->getSubReg(), ARM::ssub_1));
|
||||
return true;
|
||||
}
|
||||
llvm_unreachable("Target dependent opcode missing");
|
||||
}
|
||||
|
||||
namespace {
|
||||
/// ARMCGBR - Create Global Base Reg pass. This initializes the PIC
|
||||
/// global base register for ARM ELF.
|
||||
|
@ -38,6 +38,23 @@ public:
|
||||
///
|
||||
const ARMRegisterInfo &getRegisterInfo() const override { return RI; }
|
||||
|
||||
/// Build the equivalent inputs of a REG_SEQUENCE for the given \p MI
|
||||
/// and \p DefIdx.
|
||||
/// \p [out] InputRegs of the equivalent REG_SEQUENCE. Each element of
|
||||
/// the list is modeled as <Reg:SubReg, SubIdx>.
|
||||
/// E.g., REG_SEQUENCE vreg1:sub1, sub0, vreg2, sub1 would produce
|
||||
/// two elements:
|
||||
/// - vreg1:sub1, sub0
|
||||
/// - vreg2<:0>, sub1
|
||||
///
|
||||
/// \returns true if it is possible to build such an input sequence
|
||||
/// with the pair \p MI, \p DefIdx. False otherwise.
|
||||
///
|
||||
/// \pre MI.isRegSequenceLike().
|
||||
bool getRegSequenceLikeInputs(
|
||||
const MachineInstr &MI, unsigned DefIdx,
|
||||
SmallVectorImpl<RegSubRegPairAndIdx> &InputRegs) const override;
|
||||
|
||||
private:
|
||||
void expandLoadStackGuard(MachineBasicBlock::iterator MI,
|
||||
Reloc::Model RM) const override;
|
||||
|
@ -885,6 +885,10 @@ def VMOVDRR : AVConv5I<0b11000100, 0b1011,
|
||||
// Some single precision VFP instructions may be executed on both NEON and VFP
|
||||
// pipelines.
|
||||
let D = VFPNeonDomain;
|
||||
|
||||
// This instruction is equivalent to
|
||||
// $Dm = REG_SEQUENCE $Rt, ssub_0, $Rt2, ssub_1
|
||||
let isRegSequence = 1;
|
||||
}
|
||||
|
||||
let neverHasSideEffects = 1 in
|
||||
|
Loading…
Reference in New Issue
Block a user