mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-24 23:28:41 +00:00
PowerPC varargs functions store live-in registers on the stack. Make sure we use
virtual registers for those stores since RegAllocFast requires that each live physreg only be used once. This fixes PR8357. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116222 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1715,24 +1715,14 @@ PPCTargetLowering::LowerFormalArguments_SVR4(
|
||||
FuncInfo->setVarArgsFrameIndex(MFI->CreateStackObject(Depth, 8, false));
|
||||
SDValue FIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
|
||||
|
||||
// The fixed integer arguments of a variadic function are
|
||||
// stored to the VarArgsFrameIndex on the stack.
|
||||
unsigned GPRIndex = 0;
|
||||
for (; GPRIndex != FuncInfo->getVarArgsNumGPR(); ++GPRIndex) {
|
||||
SDValue Val = DAG.getRegister(GPArgRegs[GPRIndex], PtrVT);
|
||||
SDValue Store = DAG.getStore(Chain, dl, Val, FIN, MachinePointerInfo(),
|
||||
false, false, 0);
|
||||
MemOps.push_back(Store);
|
||||
// Increment the address by four for the next argument to store
|
||||
SDValue PtrOff = DAG.getConstant(PtrVT.getSizeInBits()/8, PtrVT);
|
||||
FIN = DAG.getNode(ISD::ADD, dl, PtrOff.getValueType(), FIN, PtrOff);
|
||||
}
|
||||
|
||||
// If this function is vararg, store any remaining integer argument regs
|
||||
// to their spots on the stack so that they may be loaded by deferencing the
|
||||
// result of va_next.
|
||||
for (; GPRIndex != NumGPArgRegs; ++GPRIndex) {
|
||||
unsigned VReg = MF.addLiveIn(GPArgRegs[GPRIndex], &PPC::GPRCRegClass);
|
||||
// The fixed integer arguments of a variadic function are stored to the
|
||||
// VarArgsFrameIndex on the stack so that they may be loaded by deferencing
|
||||
// the result of va_next.
|
||||
for (unsigned GPRIndex = 0; GPRIndex != NumGPArgRegs; ++GPRIndex) {
|
||||
// Get an existing live-in vreg, or add a new one.
|
||||
unsigned VReg = MF.getRegInfo().getLiveInVirtReg(GPArgRegs[GPRIndex]);
|
||||
if (!VReg)
|
||||
VReg = MF.addLiveIn(GPArgRegs[GPRIndex], &PPC::GPRCRegClass);
|
||||
|
||||
SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT);
|
||||
SDValue Store = DAG.getStore(Val.getValue(1), dl, Val, FIN,
|
||||
@@ -1745,23 +1735,13 @@ PPCTargetLowering::LowerFormalArguments_SVR4(
|
||||
|
||||
// FIXME 32-bit SVR4: We only need to save FP argument registers if CR bit 6
|
||||
// is set.
|
||||
|
||||
// The double arguments are stored to the VarArgsFrameIndex
|
||||
// on the stack.
|
||||
unsigned FPRIndex = 0;
|
||||
for (FPRIndex = 0; FPRIndex != FuncInfo->getVarArgsNumFPR(); ++FPRIndex) {
|
||||
SDValue Val = DAG.getRegister(FPArgRegs[FPRIndex], MVT::f64);
|
||||
SDValue Store = DAG.getStore(Chain, dl, Val, FIN, MachinePointerInfo(),
|
||||
false, false, 0);
|
||||
MemOps.push_back(Store);
|
||||
// Increment the address by eight for the next argument to store
|
||||
SDValue PtrOff = DAG.getConstant(EVT(MVT::f64).getSizeInBits()/8,
|
||||
PtrVT);
|
||||
FIN = DAG.getNode(ISD::ADD, dl, PtrOff.getValueType(), FIN, PtrOff);
|
||||
}
|
||||
|
||||
for (; FPRIndex != NumFPArgRegs; ++FPRIndex) {
|
||||
unsigned VReg = MF.addLiveIn(FPArgRegs[FPRIndex], &PPC::F8RCRegClass);
|
||||
for (unsigned FPRIndex = 0; FPRIndex != NumFPArgRegs; ++FPRIndex) {
|
||||
// Get an existing live-in vreg, or add a new one.
|
||||
unsigned VReg = MF.getRegInfo().getLiveInVirtReg(FPArgRegs[FPRIndex]);
|
||||
if (!VReg)
|
||||
VReg = MF.addLiveIn(FPArgRegs[FPRIndex], &PPC::F8RCRegClass);
|
||||
|
||||
SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, MVT::f64);
|
||||
SDValue Store = DAG.getStore(Val.getValue(1), dl, Val, FIN,
|
||||
|
Reference in New Issue
Block a user