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 | 6aaed72949be065f7e7084feb98b9cc0d3b7a38c (patch) | |
tree | 941c52e7f4d9ebcfa13cda65ba64b174ace57c03 /llvm/lib/Target/ARM | |
parent | be13194655cfc1aab977a17267f863a5945bfd4e (diff) | |
download | bcm5719-llvm-6aaed72949be065f7e7084feb98b9cc0d3b7a38c.tar.gz bcm5719-llvm-6aaed72949be065f7e7084feb98b9cc0d3b7a38c.zip |
Simple branch instruction support.
llvm-svn: 112923
Diffstat (limited to 'llvm/lib/Target/ARM')
-rw-r--r-- | llvm/lib/Target/ARM/ARMFastISel.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMFastISel.cpp b/llvm/lib/Target/ARM/ARMFastISel.cpp index 81a51407719..4892eae9583 100644 --- a/llvm/lib/Target/ARM/ARMFastISel.cpp +++ b/llvm/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; |