Make changes necessary in LowerFormalArguments to support Mips64.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@143218 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Akira Hatanaka
2011-10-28 19:55:48 +00:00
parent e42f33bd15
commit feaa4c316f

View File

@@ -2266,6 +2266,7 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
CCValAssign &VA = ArgLocs[i]; CCValAssign &VA = ArgLocs[i];
EVT ValVT = VA.getValVT();
// Arguments stored on registers // Arguments stored on registers
if (VA.isRegLoc()) { if (VA.isRegLoc()) {
@@ -2300,23 +2301,22 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
Opcode = ISD::AssertZext; Opcode = ISD::AssertZext;
if (Opcode) if (Opcode)
ArgValue = DAG.getNode(Opcode, dl, RegVT, ArgValue, ArgValue = DAG.getNode(Opcode, dl, RegVT, ArgValue,
DAG.getValueType(VA.getValVT())); DAG.getValueType(ValVT));
ArgValue = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), ArgValue); ArgValue = DAG.getNode(ISD::TRUNCATE, dl, ValVT, ArgValue);
} }
// Handle O32 ABI cases: i32->f32 and (i32,i32)->f64 // Handle floating point arguments passed in integer registers.
if (IsO32) { if ((RegVT == MVT::i32 && ValVT == MVT::f32) ||
if (RegVT == MVT::i32 && VA.getValVT() == MVT::f32) (RegVT == MVT::i64 && ValVT == MVT::f64))
ArgValue = DAG.getNode(ISD::BITCAST, dl, MVT::f32, ArgValue); ArgValue = DAG.getNode(ISD::BITCAST, dl, ValVT, ArgValue);
if (RegVT == MVT::i32 && VA.getValVT() == MVT::f64) { else if (IsO32 && RegVT == MVT::i32 && ValVT == MVT::f64) {
unsigned Reg2 = AddLiveIn(DAG.getMachineFunction(), unsigned Reg2 = AddLiveIn(DAG.getMachineFunction(),
getNextIntArgReg(ArgReg), RC); getNextIntArgReg(ArgReg), RC);
SDValue ArgValue2 = DAG.getCopyFromReg(Chain, dl, Reg2, RegVT); SDValue ArgValue2 = DAG.getCopyFromReg(Chain, dl, Reg2, RegVT);
if (!Subtarget->isLittle()) if (!Subtarget->isLittle())
std::swap(ArgValue, ArgValue2); std::swap(ArgValue, ArgValue2);
ArgValue = DAG.getNode(MipsISD::BuildPairF64, dl, MVT::f64, ArgValue = DAG.getNode(MipsISD::BuildPairF64, dl, MVT::f64,
ArgValue, ArgValue2); ArgValue, ArgValue2);
}
} }
InVals.push_back(ArgValue); InVals.push_back(ArgValue);
@@ -2343,12 +2343,12 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
} }
// The stack pointer offset is relative to the caller stack frame. // The stack pointer offset is relative to the caller stack frame.
LastFI = MFI->CreateFixedObject(VA.getValVT().getSizeInBits()/8, LastFI = MFI->CreateFixedObject(ValVT.getSizeInBits()/8,
VA.getLocMemOffset(), true); VA.getLocMemOffset(), true);
// Create load nodes to retrieve arguments from the stack // Create load nodes to retrieve arguments from the stack
SDValue FIN = DAG.getFrameIndex(LastFI, getPointerTy()); SDValue FIN = DAG.getFrameIndex(LastFI, getPointerTy());
InVals.push_back(DAG.getLoad(VA.getValVT(), dl, Chain, FIN, InVals.push_back(DAG.getLoad(ValVT, dl, Chain, FIN,
MachinePointerInfo::getFixedStack(LastFI), MachinePointerInfo::getFixedStack(LastFI),
false, false, 0)); false, false, 0));
} }