forked from OSchip/llvm-project
Added Mips support for DYNAMIC_STACKALLOC
Fixed bug in adjustMipsStackFrame, which was breaking while trying to access a dead stack object index. Also added one more alignment before fixing the callee saved registers stack offset adjustment. llvm-svn: 54485
This commit is contained in:
parent
de5161fdf2
commit
02ff450f13
|
|
@ -92,16 +92,17 @@ MipsTargetLowering(MipsTargetMachine &TM): TargetLowering(TM)
|
||||||
AddPromotedToType(ISD::SETCC, MVT::i1, MVT::i32);
|
AddPromotedToType(ISD::SETCC, MVT::i1, MVT::i32);
|
||||||
|
|
||||||
// Mips Custom Operations
|
// Mips Custom Operations
|
||||||
setOperationAction(ISD::GlobalAddress, MVT::i32, Custom);
|
setOperationAction(ISD::GlobalAddress, MVT::i32, Custom);
|
||||||
setOperationAction(ISD::GlobalTLSAddress, MVT::i32, Custom);
|
setOperationAction(ISD::GlobalTLSAddress, MVT::i32, Custom);
|
||||||
setOperationAction(ISD::RET, MVT::Other, Custom);
|
setOperationAction(ISD::RET, MVT::Other, Custom);
|
||||||
setOperationAction(ISD::JumpTable, MVT::i32, Custom);
|
setOperationAction(ISD::JumpTable, MVT::i32, Custom);
|
||||||
setOperationAction(ISD::ConstantPool, MVT::i32, Custom);
|
setOperationAction(ISD::ConstantPool, MVT::i32, Custom);
|
||||||
setOperationAction(ISD::SELECT, MVT::f32, Custom);
|
setOperationAction(ISD::SELECT, MVT::f32, Custom);
|
||||||
setOperationAction(ISD::SELECT, MVT::i32, Custom);
|
setOperationAction(ISD::SELECT, MVT::i32, Custom);
|
||||||
setOperationAction(ISD::SELECT_CC, MVT::i32, Custom);
|
setOperationAction(ISD::SELECT_CC, MVT::i32, Custom);
|
||||||
setOperationAction(ISD::SETCC, MVT::f32, Custom);
|
setOperationAction(ISD::SETCC, MVT::f32, Custom);
|
||||||
setOperationAction(ISD::BRCOND, MVT::Other, Custom);
|
setOperationAction(ISD::BRCOND, MVT::Other, Custom);
|
||||||
|
setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32, Custom);
|
||||||
|
|
||||||
// We custom lower AND/OR to handle the case where the DAG contain 'ands/ors'
|
// We custom lower AND/OR to handle the case where the DAG contain 'ands/ors'
|
||||||
// with operands comming from setcc fp comparions. This is necessary since
|
// with operands comming from setcc fp comparions. This is necessary since
|
||||||
|
|
@ -161,19 +162,20 @@ LowerOperation(SDValue Op, SelectionDAG &DAG)
|
||||||
{
|
{
|
||||||
switch (Op.getOpcode())
|
switch (Op.getOpcode())
|
||||||
{
|
{
|
||||||
case ISD::AND: return LowerANDOR(Op, DAG);
|
case ISD::AND: return LowerANDOR(Op, DAG);
|
||||||
case ISD::BRCOND: return LowerBRCOND(Op, DAG);
|
case ISD::BRCOND: return LowerBRCOND(Op, DAG);
|
||||||
case ISD::CALL: return LowerCALL(Op, DAG);
|
case ISD::CALL: return LowerCALL(Op, DAG);
|
||||||
case ISD::ConstantPool: return LowerConstantPool(Op, DAG);
|
case ISD::ConstantPool: return LowerConstantPool(Op, DAG);
|
||||||
case ISD::FORMAL_ARGUMENTS: return LowerFORMAL_ARGUMENTS(Op, DAG);
|
case ISD::DYNAMIC_STACKALLOC: return LowerDYNAMIC_STACKALLOC(Op, DAG);
|
||||||
case ISD::GlobalAddress: return LowerGlobalAddress(Op, DAG);
|
case ISD::FORMAL_ARGUMENTS: return LowerFORMAL_ARGUMENTS(Op, DAG);
|
||||||
case ISD::GlobalTLSAddress: return LowerGlobalTLSAddress(Op, DAG);
|
case ISD::GlobalAddress: return LowerGlobalAddress(Op, DAG);
|
||||||
case ISD::JumpTable: return LowerJumpTable(Op, DAG);
|
case ISD::GlobalTLSAddress: return LowerGlobalTLSAddress(Op, DAG);
|
||||||
case ISD::OR: return LowerANDOR(Op, DAG);
|
case ISD::JumpTable: return LowerJumpTable(Op, DAG);
|
||||||
case ISD::RET: return LowerRET(Op, DAG);
|
case ISD::OR: return LowerANDOR(Op, DAG);
|
||||||
case ISD::SELECT: return LowerSELECT(Op, DAG);
|
case ISD::RET: return LowerRET(Op, DAG);
|
||||||
case ISD::SELECT_CC: return LowerSELECT_CC(Op, DAG);
|
case ISD::SELECT: return LowerSELECT(Op, DAG);
|
||||||
case ISD::SETCC: return LowerSETCC(Op, DAG);
|
case ISD::SELECT_CC: return LowerSELECT_CC(Op, DAG);
|
||||||
|
case ISD::SETCC: return LowerSETCC(Op, DAG);
|
||||||
}
|
}
|
||||||
return SDValue();
|
return SDValue();
|
||||||
}
|
}
|
||||||
|
|
@ -361,6 +363,29 @@ MipsTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||||
// Misc Lower Operation implementation
|
// Misc Lower Operation implementation
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
SDValue MipsTargetLowering::
|
||||||
|
LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG)
|
||||||
|
{
|
||||||
|
SDValue Chain = Op.getOperand(0);
|
||||||
|
SDValue Size = Op.getOperand(1);
|
||||||
|
|
||||||
|
// Get a reference from Mips stack pointer
|
||||||
|
SDValue StackPointer = DAG.getCopyFromReg(Chain, Mips::SP, MVT::i32);
|
||||||
|
|
||||||
|
// Subtract the dynamic size from the actual stack size to
|
||||||
|
// obtain the new stack size.
|
||||||
|
SDValue Sub = DAG.getNode(ISD::SUB, MVT::i32, StackPointer, Size);
|
||||||
|
|
||||||
|
// The Sub result contains the new stack start address, so it
|
||||||
|
// must be placed in the stack pointer register.
|
||||||
|
Chain = DAG.getCopyToReg(StackPointer.getValue(1), Mips::SP, Sub);
|
||||||
|
|
||||||
|
// This node always has two return values: a new stack pointer
|
||||||
|
// value and a chain
|
||||||
|
SDValue Ops[2] = { Sub, Chain };
|
||||||
|
return DAG.getMergeValues(Ops, 2);
|
||||||
|
}
|
||||||
|
|
||||||
SDValue MipsTargetLowering::
|
SDValue MipsTargetLowering::
|
||||||
LowerANDOR(SDValue Op, SelectionDAG &DAG)
|
LowerANDOR(SDValue Op, SelectionDAG &DAG)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,7 @@ namespace llvm {
|
||||||
SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG);
|
SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG);
|
||||||
SDValue LowerCALL(SDValue Op, SelectionDAG &DAG);
|
SDValue LowerCALL(SDValue Op, SelectionDAG &DAG);
|
||||||
SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG);
|
SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG);
|
||||||
|
SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG);
|
||||||
SDValue LowerFORMAL_ARGUMENTS(SDValue Op, SelectionDAG &DAG);
|
SDValue LowerFORMAL_ARGUMENTS(SDValue Op, SelectionDAG &DAG);
|
||||||
SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG);
|
SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG);
|
||||||
SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG);
|
SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG);
|
||||||
|
|
|
||||||
|
|
@ -249,6 +249,8 @@ void MipsRegisterInfo::adjustMipsStackFrame(MachineFunction &MF) const
|
||||||
for (int i = 0, e = MFI->getObjectIndexEnd(); i != e; ++i) {
|
for (int i = 0, e = MFI->getObjectIndexEnd(); i != e; ++i) {
|
||||||
if (i >= MinCSFI && i <= MaxCSFI)
|
if (i >= MinCSFI && i <= MaxCSFI)
|
||||||
continue;
|
continue;
|
||||||
|
if (MFI->isDeadObjectIndex(i))
|
||||||
|
continue;
|
||||||
unsigned Offset = MFI->getObjectOffset(i) - CalleeSavedAreaSize;
|
unsigned Offset = MFI->getObjectOffset(i) - CalleeSavedAreaSize;
|
||||||
if (LastOffsetFI == -1)
|
if (LastOffsetFI == -1)
|
||||||
LastOffsetFI = i;
|
LastOffsetFI = i;
|
||||||
|
|
@ -266,6 +268,7 @@ void MipsRegisterInfo::adjustMipsStackFrame(MachineFunction &MF) const
|
||||||
if (LastOffsetFI >= 0)
|
if (LastOffsetFI >= 0)
|
||||||
StackOffset = MFI->getObjectOffset(LastOffsetFI)+
|
StackOffset = MFI->getObjectOffset(LastOffsetFI)+
|
||||||
MFI->getObjectAlignment(LastOffsetFI);
|
MFI->getObjectAlignment(LastOffsetFI);
|
||||||
|
StackOffset = ((StackOffset+StackAlign-1)/StackAlign*StackAlign);
|
||||||
|
|
||||||
for (unsigned i = 0, e = CSI.size(); i != e ; ++i) {
|
for (unsigned i = 0, e = CSI.size(); i != e ; ++i) {
|
||||||
if (CSI[i].getRegClass() != Mips::CPURegsRegisterClass)
|
if (CSI[i].getRegClass() != Mips::CPURegsRegisterClass)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue