summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp')
-rw-r--r--llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp23
1 files changed, 14 insertions, 9 deletions
diff --git a/llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp b/llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp
index 5fadc81ce84..e51db4127de 100644
--- a/llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp
+++ b/llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp
@@ -194,9 +194,6 @@ SDOperand AlphaDAGToDAGISel::Select(SDOperand Op) {
CurDAG->getBasicBlock(Dest), Chain);
}
- case ISD::BR:
- return CurDAG->SelectNodeTo(N, Alpha::BR_DAG, MVT::Other, N->getOperand(1),
- Select(N->getOperand(0)));
case ISD::FrameIndex: {
int FI = cast<FrameIndexSDNode>(N)->getIndex();
return CurDAG->SelectNodeTo(N, Alpha::LDA, MVT::i64,
@@ -214,7 +211,7 @@ SDOperand AlphaDAGToDAGISel::Select(SDOperand Op) {
Chain.getValue(1));
Chain = CurDAG->getCopyToReg(Chain, Alpha::R27, Select(Op.getOperand(0)),
Chain.getValue(1));
- Chain = CurDAG->getTargetNode(Alpha::JSRsDAG, MVT::Other, MVT::Flag,
+ Chain = CurDAG->getTargetNode(Alpha::JSRs, MVT::Other, MVT::Flag,
Chain, Chain.getValue(1));
Chain = CurDAG->getCopyFromReg(Chain, Alpha::R27, MVT::i64,
Chain.getValue(1));
@@ -359,7 +356,7 @@ SDOperand AlphaDAGToDAGISel::SelectCALL(SDOperand Op) {
SDNode *N = Op.Val;
SDOperand Chain = Select(N->getOperand(0));
- SDOperand Addr = Select(N->getOperand(1));
+ SDOperand Addr = N->getOperand(1);
SDOperand InFlag; // Null incoming flag value.
std::vector<SDOperand> CallOperands;
@@ -404,12 +401,20 @@ SDOperand AlphaDAGToDAGISel::SelectCALL(SDOperand Op) {
}
- Chain = CurDAG->getCopyToReg(Chain, Alpha::R27, Addr, InFlag);
- InFlag = Chain.getValue(1);
// Finally, once everything is in registers to pass to the call, emit the
// call itself.
- Chain = CurDAG->getTargetNode(Alpha::JSRDAG, MVT::Other, MVT::Flag,
- Chain, InFlag );
+ if (Addr.getOpcode() == AlphaISD::GPRelLo) {
+ SDOperand GOT = getGlobalBaseReg();
+ Chain = CurDAG->getCopyToReg(Chain, Alpha::R29, GOT, InFlag);
+ InFlag = Chain.getValue(1);
+ Chain = CurDAG->getTargetNode(Alpha::BSR, MVT::Other, MVT::Flag,
+ Addr.getOperand(0), Chain, InFlag);
+ } else {
+ Chain = CurDAG->getCopyToReg(Chain, Alpha::R27, Select(Addr), InFlag);
+ InFlag = Chain.getValue(1);
+ Chain = CurDAG->getTargetNode(Alpha::JSR, MVT::Other, MVT::Flag,
+ Chain, InFlag );
+ }
InFlag = Chain.getValue(1);
std::vector<SDOperand> CallResults;
OpenPOWER on IntegriCloud