diff options
| author | Chad Rosier <mcrosier@apple.com> | 2012-05-23 18:38:57 +0000 |
|---|---|---|
| committer | Chad Rosier <mcrosier@apple.com> | 2012-05-23 18:38:57 +0000 |
| commit | 223faf719cacbab1497c0d02b13a523f80f85779 (patch) | |
| tree | 31cfcdc524265e9c5d32efa6592ab57d31e2f5e3 /llvm/lib/Target | |
| parent | 3f00134c0560ff32ea6f17f51a514a22ba720b78 (diff) | |
| download | bcm5719-llvm-223faf719cacbab1497c0d02b13a523f80f85779.tar.gz bcm5719-llvm-223faf719cacbab1497c0d02b13a523f80f85779.zip | |
[arm-fast-isel] Add support for non-global callee.
Patch by Jush Lu <jush.msn@gmail.com>.
llvm-svn: 157336
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMFastISel.cpp | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/llvm/lib/Target/ARM/ARMFastISel.cpp b/llvm/lib/Target/ARM/ARMFastISel.cpp index 97131cd6987..c13f283a847 100644 --- a/llvm/lib/Target/ARM/ARMFastISel.cpp +++ b/llvm/lib/Target/ARM/ARMFastISel.cpp @@ -2216,11 +2216,6 @@ bool ARMFastISel::SelectCall(const Instruction *I, // Can't handle inline asm. if (isa<InlineAsm>(Callee)) return false; - // Only handle global variable Callees. - const GlobalValue *GV = dyn_cast<GlobalValue>(Callee); - if (!GV) - return false; - // Check the calling convention. ImmutableCallSite CS(CI); CallingConv::ID CC = CS.getCallingConv(); @@ -2313,18 +2308,33 @@ bool ARMFastISel::SelectCall(const Instruction *I, // Issue the call. MachineInstrBuilder MIB; + const GlobalValue *GV = dyn_cast<GlobalValue>(Callee); unsigned CallOpc = ARMSelectCallOp(GV); + unsigned CalleeReg = 0; + + if (!GV){ + CallOpc = isThumb2 ? ARM::tBLXr : ARM::BLX; + CalleeReg = getRegForValue(Callee); + if (CalleeReg == 0) return false; + } + // Explicitly adding the predicate here. if(isThumb2) { // Explicitly adding the predicate here. MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(CallOpc))); - if (!IntrMemName) + if (!GV) + MIB.addReg(CalleeReg); + else if (!IntrMemName) MIB.addGlobalAddress(GV, 0, 0); else MIB.addExternalSymbol(IntrMemName, 0); } else { - if (!IntrMemName) + if (!GV) + MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, + TII.get(CallOpc)) + .addReg(CalleeReg)); + else if (!IntrMemName) // Explicitly adding the predicate here. MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(CallOpc)) |

