mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
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
2284374fcc
commit
2eb245ee91
@ -92,16 +92,17 @@ MipsTargetLowering(MipsTargetMachine &TM): TargetLowering(TM)
|
||||
AddPromotedToType(ISD::SETCC, MVT::i1, MVT::i32);
|
||||
|
||||
// Mips Custom Operations
|
||||
setOperationAction(ISD::GlobalAddress, MVT::i32, Custom);
|
||||
setOperationAction(ISD::GlobalTLSAddress, MVT::i32, Custom);
|
||||
setOperationAction(ISD::RET, MVT::Other, Custom);
|
||||
setOperationAction(ISD::JumpTable, MVT::i32, Custom);
|
||||
setOperationAction(ISD::ConstantPool, MVT::i32, Custom);
|
||||
setOperationAction(ISD::SELECT, MVT::f32, Custom);
|
||||
setOperationAction(ISD::SELECT, MVT::i32, Custom);
|
||||
setOperationAction(ISD::SELECT_CC, MVT::i32, Custom);
|
||||
setOperationAction(ISD::SETCC, MVT::f32, Custom);
|
||||
setOperationAction(ISD::BRCOND, MVT::Other, Custom);
|
||||
setOperationAction(ISD::GlobalAddress, MVT::i32, Custom);
|
||||
setOperationAction(ISD::GlobalTLSAddress, MVT::i32, Custom);
|
||||
setOperationAction(ISD::RET, MVT::Other, Custom);
|
||||
setOperationAction(ISD::JumpTable, MVT::i32, Custom);
|
||||
setOperationAction(ISD::ConstantPool, MVT::i32, Custom);
|
||||
setOperationAction(ISD::SELECT, MVT::f32, Custom);
|
||||
setOperationAction(ISD::SELECT, MVT::i32, Custom);
|
||||
setOperationAction(ISD::SELECT_CC, MVT::i32, Custom);
|
||||
setOperationAction(ISD::SETCC, MVT::f32, 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'
|
||||
// with operands comming from setcc fp comparions. This is necessary since
|
||||
@ -161,19 +162,20 @@ LowerOperation(SDValue Op, SelectionDAG &DAG)
|
||||
{
|
||||
switch (Op.getOpcode())
|
||||
{
|
||||
case ISD::AND: return LowerANDOR(Op, DAG);
|
||||
case ISD::BRCOND: return LowerBRCOND(Op, DAG);
|
||||
case ISD::CALL: return LowerCALL(Op, DAG);
|
||||
case ISD::ConstantPool: return LowerConstantPool(Op, DAG);
|
||||
case ISD::FORMAL_ARGUMENTS: return LowerFORMAL_ARGUMENTS(Op, DAG);
|
||||
case ISD::GlobalAddress: return LowerGlobalAddress(Op, DAG);
|
||||
case ISD::GlobalTLSAddress: return LowerGlobalTLSAddress(Op, DAG);
|
||||
case ISD::JumpTable: return LowerJumpTable(Op, DAG);
|
||||
case ISD::OR: return LowerANDOR(Op, DAG);
|
||||
case ISD::RET: return LowerRET(Op, DAG);
|
||||
case ISD::SELECT: return LowerSELECT(Op, DAG);
|
||||
case ISD::SELECT_CC: return LowerSELECT_CC(Op, DAG);
|
||||
case ISD::SETCC: return LowerSETCC(Op, DAG);
|
||||
case ISD::AND: return LowerANDOR(Op, DAG);
|
||||
case ISD::BRCOND: return LowerBRCOND(Op, DAG);
|
||||
case ISD::CALL: return LowerCALL(Op, DAG);
|
||||
case ISD::ConstantPool: return LowerConstantPool(Op, DAG);
|
||||
case ISD::DYNAMIC_STACKALLOC: return LowerDYNAMIC_STACKALLOC(Op, DAG);
|
||||
case ISD::FORMAL_ARGUMENTS: return LowerFORMAL_ARGUMENTS(Op, DAG);
|
||||
case ISD::GlobalAddress: return LowerGlobalAddress(Op, DAG);
|
||||
case ISD::GlobalTLSAddress: return LowerGlobalTLSAddress(Op, DAG);
|
||||
case ISD::JumpTable: return LowerJumpTable(Op, DAG);
|
||||
case ISD::OR: return LowerANDOR(Op, DAG);
|
||||
case ISD::RET: return LowerRET(Op, DAG);
|
||||
case ISD::SELECT: return LowerSELECT(Op, DAG);
|
||||
case ISD::SELECT_CC: return LowerSELECT_CC(Op, DAG);
|
||||
case ISD::SETCC: return LowerSETCC(Op, DAG);
|
||||
}
|
||||
return SDValue();
|
||||
}
|
||||
@ -361,6 +363,29 @@ MipsTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
// 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::
|
||||
LowerANDOR(SDValue Op, SelectionDAG &DAG)
|
||||
{
|
||||
|
@ -93,6 +93,7 @@ namespace llvm {
|
||||
SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG);
|
||||
SDValue LowerCALL(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 LowerGlobalAddress(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) {
|
||||
if (i >= MinCSFI && i <= MaxCSFI)
|
||||
continue;
|
||||
if (MFI->isDeadObjectIndex(i))
|
||||
continue;
|
||||
unsigned Offset = MFI->getObjectOffset(i) - CalleeSavedAreaSize;
|
||||
if (LastOffsetFI == -1)
|
||||
LastOffsetFI = i;
|
||||
@ -266,6 +268,7 @@ void MipsRegisterInfo::adjustMipsStackFrame(MachineFunction &MF) const
|
||||
if (LastOffsetFI >= 0)
|
||||
StackOffset = MFI->getObjectOffset(LastOffsetFI)+
|
||||
MFI->getObjectAlignment(LastOffsetFI);
|
||||
StackOffset = ((StackOffset+StackAlign-1)/StackAlign*StackAlign);
|
||||
|
||||
for (unsigned i = 0, e = CSI.size(); i != e ; ++i) {
|
||||
if (CSI[i].getRegClass() != Mips::CPURegsRegisterClass)
|
||||
|
Loading…
Reference in New Issue
Block a user