aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/X86/X86ISelLowering.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/X86/X86ISelLowering.cpp')
-rw-r--r--lib/Target/X86/X86ISelLowering.cpp42
1 files changed, 24 insertions, 18 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 22a7b8d022..c2bb675235 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -1695,20 +1695,21 @@ X86TargetLowering::LowerReturn(SDValue Chain,
"SRetReturnReg should have been set in LowerFormalArguments().");
SDValue Val = DAG.getCopyFromReg(Chain, dl, Reg, getPointerTy());
- // @LOCALMOD-START
+ unsigned RetValReg = Subtarget->isTarget64BitILP32() ? X86::EAX : X86::RAX;
+ // @LOCALMOD-BEGIN
if (Subtarget->isTargetNaCl()) {
// NaCl 64 uses 32-bit pointers, so there might be some zero-ext needed.
SDValue Zext = DAG.getZExtOrTrunc(Val, dl, MVT::i64);
Chain = DAG.getCopyToReg(Chain, dl, X86::RAX, Zext, Flag);
} else {
- Chain = DAG.getCopyToReg(Chain, dl, X86::RAX, Val, Flag);
+ Chain = DAG.getCopyToReg(Chain, dl, RetValReg, Val, Flag);
}
// @LOCALMOD-END
Flag = Chain.getValue(1);
- // RAX now acts like a return value.
- MRI.addLiveOut(X86::RAX);
+ // RAX/EAX now acts like a return value.
+ RetOps.push_back(DAG.getRegister(RetValReg, MVT::i64));
}
RetOps[0] = Chain; // Update chain.
@@ -2068,9 +2069,8 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
unsigned Reg = FuncInfo->getSRetReturnReg();
if (!Reg) {
- // @LOCALMOD
- Reg = MF.getRegInfo().createVirtualRegister(
- getRegClassFor(getPointerTy()));
+ MVT PtrTy = getPointerTy();
+ Reg = MF.getRegInfo().createVirtualRegister(getRegClassFor(PtrTy));
FuncInfo->setSRetReturnReg(Reg);
}
SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), dl, Reg, InVals[0]);
@@ -2684,8 +2684,7 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
// This isn't right, although it's probably harmless on x86; liveouts
// should be computed from returns not tail calls. Consider a void
// function making a tail call to a function returning int.
- return DAG.getNode(X86ISD::TC_RETURN, dl,
- NodeTys, &Ops[0], Ops.size());
+ return DAG.getNode(X86ISD::TC_RETURN, dl, NodeTys, &Ops[0], Ops.size());
}
Chain = DAG.getNode(X86ISD::CALL, dl, NodeTys, &Ops[0], Ops.size());
@@ -7634,8 +7633,8 @@ X86TargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
static SDValue
GetTLSADDR(SelectionDAG &DAG, SDValue Chain, GlobalAddressSDNode *GA,
SDValue *InFlag, const EVT PtrVT, unsigned ReturnReg,
- unsigned char OperandFlags,
- unsigned Opcode = X86ISD::TLSADDR) { // @LOCALMOD
+ unsigned char OperandFlags, bool LocalDynamic = false,
+ unsigned Opcode = ISD::DELETED_NODE) { // @LOCALMOD
MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
DebugLoc dl = GA->getDebugLoc();
@@ -7644,15 +7643,22 @@ GetTLSADDR(SelectionDAG &DAG, SDValue Chain, GlobalAddressSDNode *GA,
GA->getOffset(),
OperandFlags);
- X86ISD::NodeType CallType = LocalDynamic ? X86ISD::TLSBASEADDR
- : X86ISD::TLSADDR;
+ // @LOCALMOD - changed type for casting
+ unsigned CallType = LocalDynamic ? X86ISD::TLSBASEADDR
+ : X86ISD::TLSADDR;
+
+ // @LOCALMOD-START
+ // If Opcode was explicitly overridden, use it as the call type.
+ if (Opcode != ISD::DELETED_NODE)
+ CallType = Opcode;
+ // @LOCALMOD-END
if (InFlag) {
SDValue Ops[] = { Chain, TGA, *InFlag };
- Chain = DAG.getNode(Opcode, dl, NodeTys, Ops, 3); // @LOCALMOD
+ Chain = DAG.getNode(CallType, dl, NodeTys, Ops, 3);
} else {
SDValue Ops[] = { Chain, TGA };
- Chain = DAG.getNode(Opcode, dl, NodeTys, Ops, 2); // @LOCALMOD
+ Chain = DAG.getNode(CallType, dl, NodeTys, Ops, 2);
}
// TLSADDR will be codegen'ed as call. Inform MFI that function has calls.
@@ -7704,7 +7710,7 @@ LowerToTLSExecCall(GlobalAddressSDNode *GA, SelectionDAG &DAG,
return GetTLSADDR(DAG, DAG.getEntryNode(), GA, NULL, PtrVT,
X86::EAX, // PtrVT is 32-bit.
- TargetFlag, Opcode);
+ TargetFlag, false, Opcode);
}
// @LOCALMOD-START
@@ -7726,7 +7732,7 @@ LowerToTLSNaCl64(GlobalAddressSDNode *GA, SelectionDAG &DAG,
return GetTLSADDR(DAG, DAG.getEntryNode(), GA, NULL, PtrVT,
X86::EAX, // PtrVT is 32-bit.
- TargetFlag, Opcode);
+ TargetFlag, false, Opcode);
}
// @LOCALMOD-END
@@ -7851,7 +7857,7 @@ X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
case TLSModel::InitialExec:
case TLSModel::LocalExec:
// @LOCALMOD-START
- if (llvm::TLSUseCall) {
+ if (llvm::TLSUseCall && Subtarget->isTargetNaCl()) {
return LowerToTLSExecCall(GA, DAG, getPointerTy(), model,
Subtarget->is64Bit());
} else {