diff options
author | Jim Grosbach <grosbach@apple.com> | 2010-10-06 21:16:16 +0000 |
---|---|---|
committer | Jim Grosbach <grosbach@apple.com> | 2010-10-06 21:16:16 +0000 |
commit | 2e3e2a006b8dcb3dedbe145da745fca3046f4548 (patch) | |
tree | 5a02ab43d1de4a05a4384943e59b214046501377 /llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp | |
parent | a3d3ba1cac8f00dcbccf67349ad3c66a23ef1a15 (diff) | |
download | bcm5719-llvm-2e3e2a006b8dcb3dedbe145da745fca3046f4548.tar.gz bcm5719-llvm-2e3e2a006b8dcb3dedbe145da745fca3046f4548.zip |
Change the NEON VDUPfdf and VDUPfqf pseudo-instructions to actually be
pseudo instructions.
llvm-svn: 115840
Diffstat (limited to 'llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp b/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp index ecf4aee3df1..6755487b441 100644 --- a/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp +++ b/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp @@ -17,6 +17,7 @@ #define DEBUG_TYPE "arm-pseudo" #include "ARM.h" #include "ARMBaseInstrInfo.h" +#include "ARMRegisterInfo.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/Target/TargetRegisterInfo.h" @@ -710,6 +711,31 @@ bool ARMExpandPseudo::ExpandMBB(MachineBasicBlock &MBB) { MI.eraseFromParent(); break; } + case ARM::VDUPfqf: + case ARM::VDUPfdf:{ + unsigned NewOpc = Opcode == ARM::VDUPfqf ? ARM::VDUPLNfq : ARM::VDUPLNfd; + MachineInstrBuilder MIB = + BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(NewOpc)); + unsigned OpIdx = 0; + unsigned SrcReg = MI.getOperand(1).getReg(); + unsigned Lane = getARMRegisterNumbering(SrcReg) & 1; + unsigned DReg = TRI->getMatchingSuperReg(SrcReg, + Lane & 1 ? ARM::ssub_1 : ARM::ssub_0, &ARM::DPR_VFP2RegClass); + // The lane is [0,1] for the containing DReg superregister. + // Copy the dst/src register operands. + MIB.addOperand(MI.getOperand(OpIdx++)); + MIB.addReg(DReg); + ++OpIdx; + // Add the lane select operand. + MIB.addImm(Lane); + // Add the predicate operands. + MIB.addOperand(MI.getOperand(OpIdx++)); + MIB.addOperand(MI.getOperand(OpIdx++)); + + TransferImpOps(MI, MIB, MIB); + MI.eraseFromParent(); + break; + } case ARM::VLD1q8Pseudo: case ARM::VLD1q16Pseudo: |