summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@apple.com>2012-05-23 18:38:57 +0000
committerChad Rosier <mcrosier@apple.com>2012-05-23 18:38:57 +0000
commit223faf719cacbab1497c0d02b13a523f80f85779 (patch)
tree31cfcdc524265e9c5d32efa6592ab57d31e2f5e3 /llvm/lib/Target
parent3f00134c0560ff32ea6f17f51a514a22ba720b78 (diff)
downloadbcm5719-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.cpp24
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))
OpenPOWER on IntegriCloud