diff options
author | Eric Christopher <echristo@apple.com> | 2010-09-03 00:35:47 +0000 |
---|---|---|
committer | Eric Christopher <echristo@apple.com> | 2010-09-03 00:35:47 +0000 |
commit | e5734105daf799dea671666059f7ecab6abb389f (patch) | |
tree | 045a11b5a653ff9841f9d1bf05a6c63eae2e1dc1 | |
parent | 3061c4442ec9d15d0e38d1cf2841e8a21938cf5e (diff) |
Simple branch instruction support.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112923 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/ARM/ARMFastISel.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/Target/ARM/ARMFastISel.cpp b/lib/Target/ARM/ARMFastISel.cpp index 81a5140771..4892eae958 100644 --- a/lib/Target/ARM/ARMFastISel.cpp +++ b/lib/Target/ARM/ARMFastISel.cpp @@ -112,6 +112,7 @@ class ARMFastISel : public FastISel { // Instruction selection routines. virtual bool ARMSelectLoad(const Instruction *I); virtual bool ARMSelectStore(const Instruction *I); + virtual bool ARMSelectBranch(const Instruction *I); // Utility routines. private: @@ -619,6 +620,26 @@ bool ARMFastISel::ARMSelectLoad(const Instruction *I) { return true; } +bool ARMFastISel::ARMSelectBranch(const Instruction *I) { + const BranchInst *BI = cast<BranchInst>(I); + MachineBasicBlock *TBB = FuncInfo.MBBMap[BI->getSuccessor(0)]; + MachineBasicBlock *FBB = FuncInfo.MBBMap[BI->getSuccessor(1)]; + + // Simple branch support. + unsigned CondReg = getRegForValue(BI->getCondition()); + if (CondReg == 0) return false; + + unsigned CmpOpc = isThumb ? ARM::t2CMPrr : ARM::CMPrr; + unsigned BrOpc = isThumb ? ARM::t2Bcc : ARM::Bcc; + AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(CmpOpc)) + .addReg(CondReg).addReg(CondReg)); + BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(BrOpc)) + .addMBB(TBB).addImm(ARMCC::NE).addReg(ARM::CPSR); + FastEmitBranch(FBB, DL); + FuncInfo.MBB->addSuccessor(TBB); + return true; +} + // TODO: SoftFP support. bool ARMFastISel::TargetSelectInstruction(const Instruction *I) { // No Thumb-1 for now. @@ -629,6 +650,8 @@ bool ARMFastISel::TargetSelectInstruction(const Instruction *I) { return ARMSelectLoad(I); case Instruction::Store: return ARMSelectStore(I); + case Instruction::Br: + return ARMSelectBranch(I); default: break; } return false; |