diff options
author | Owen Anderson <resistor@mac.com> | 2011-04-05 17:24:25 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2011-04-05 17:24:25 +0000 |
commit | 15b81b51d64b04c71aa75788fcc418f52ec8b181 (patch) | |
tree | 6fc556731c3175f087f1f22f7e3ff1c426058714 /lib/Target/ARM/ARMExpandPseudoInsts.cpp | |
parent | ac42a19217ad9129767d544edde06e843ae74cfd (diff) |
Convert ADCS and SBCS instructions into pseudos that are expanded to the ADC/ABC with the appropriate S-bit input value.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128892 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMExpandPseudoInsts.cpp')
-rw-r--r-- | lib/Target/ARM/ARMExpandPseudoInsts.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/Target/ARM/ARMExpandPseudoInsts.cpp b/lib/Target/ARM/ARMExpandPseudoInsts.cpp index a14c9526fc..547b27d486 100644 --- a/lib/Target/ARM/ARMExpandPseudoInsts.cpp +++ b/lib/Target/ARM/ARMExpandPseudoInsts.cpp @@ -55,6 +55,7 @@ namespace { void ExpandVLD(MachineBasicBlock::iterator &MBBI); void ExpandVST(MachineBasicBlock::iterator &MBBI); void ExpandLaneOp(MachineBasicBlock::iterator &MBBI); + void ExpandSBitOp(MachineBasicBlock::iterator &MBBI); void ExpandVTBL(MachineBasicBlock::iterator &MBBI, unsigned Opc, bool IsExt, unsigned NumRegs); void ExpandMOV32BitImm(MachineBasicBlock &MBB, @@ -629,6 +630,43 @@ void ARMExpandPseudo::ExpandVTBL(MachineBasicBlock::iterator &MBBI, MI.eraseFromParent(); } +void ARMExpandPseudo::ExpandSBitOp(MachineBasicBlock::iterator &MBBI) { + MachineInstr &MI = *MBBI; + MachineBasicBlock &MBB = *MI.getParent(); + unsigned OldOpc = MI.getOpcode(); + unsigned Opc = 0; + switch (OldOpc) { + case ARM::ADCSSrr: + Opc = ARM::ADCrr; + break; + case ARM::ADCSSri: + Opc = ARM::ADCri; + break; + case ARM::ADCSSrs: + Opc = ARM::ADCrs; + break; + case ARM::SBCSSrr: + Opc = ARM::SBCrr; + break; + case ARM::SBCSSri: + Opc = ARM::SBCri; + break; + case ARM::SBCSSrs: + Opc = ARM::SBCrs; + break; + default: + llvm_unreachable("Unknown opcode?"); + } + + MachineInstrBuilder MIB = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(Opc)); + MIB.addOperand(MachineOperand::CreateImm(0)); // Predicate + MIB.addOperand(MachineOperand::CreateImm(0)); // S bit + for (unsigned i = 0; i < MI.getNumOperands(); ++i) + MIB.addOperand(MI.getOperand(i)); + TransferImpOps(MI, MIB, MIB); + MI.eraseFromParent(); +} + void ARMExpandPseudo::ExpandMOV32BitImm(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI) { MachineInstr &MI = *MBBI; @@ -941,6 +979,15 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB, ExpandMOV32BitImm(MBB, MBBI); return true; + case ARM::ADCSSri: + case ARM::ADCSSrr: + case ARM::ADCSSrs: + case ARM::SBCSSri: + case ARM::SBCSSrr: + case ARM::SBCSSrs: + ExpandSBitOp(MBBI); + return true; + case ARM::VMOVQQ: { unsigned DstReg = MI.getOperand(0).getReg(); bool DstIsDead = MI.getOperand(0).isDead(); |