Simplifies logic for printing target flags.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128741 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Akira Hatanaka
2011-04-01 21:41:06 +00:00
parent 6c1bead22b
commit e2e436a6bc
3 changed files with 29 additions and 34 deletions

View File

@@ -298,22 +298,9 @@ void MipsAsmPrinter::printOperand(const MachineInstr *MI, int opNum,
switch(MO.getTargetFlags()) { switch(MO.getTargetFlags()) {
case MipsII::MO_GPREL: O << "%gp_rel("; break; case MipsII::MO_GPREL: O << "%gp_rel("; break;
case MipsII::MO_GOT_CALL: O << "%call16("; break; case MipsII::MO_GOT_CALL: O << "%call16("; break;
case MipsII::MO_GOT: { case MipsII::MO_GOT: O << "%got("; break;
const MachineOperand &LastMO = MI->getOperand(opNum-1); case MipsII::MO_ABS_HI: O << "%hi("; break;
bool LastMOIsGP = LastMO.getType() == MachineOperand::MO_Register case MipsII::MO_ABS_LO: O << "%lo("; break;
&& LastMO.getReg() == Mips::GP;
if (MI->getOpcode() == Mips::LW || LastMOIsGP)
O << "%got(";
else
O << "%lo(";
break;
}
case MipsII::MO_ABS_HILO:
if (MI->getOpcode() == Mips::LUi)
O << "%hi(";
else
O << "%lo(";
break;
} }
switch (MO.getType()) { switch (MO.getType()) {

View File

@@ -769,12 +769,13 @@ SDValue MipsTargetLowering::LowerGlobalAddress(SDValue Op,
return DAG.getNode(ISD::ADD, dl, MVT::i32, GOT, GPRelNode); return DAG.getNode(ISD::ADD, dl, MVT::i32, GOT, GPRelNode);
} }
// %hi/%lo relocation // %hi/%lo relocation
SDValue GA = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0, SDValue GAHi = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,
MipsII::MO_ABS_HILO); MipsII::MO_ABS_HI);
SDValue HiPart = DAG.getNode(MipsISD::Hi, dl, VTs, &GA, 1); SDValue GALo = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,
SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, GA); MipsII::MO_ABS_LO);
SDValue HiPart = DAG.getNode(MipsISD::Hi, dl, VTs, &GAHi, 1);
SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, GALo);
return DAG.getNode(ISD::ADD, dl, MVT::i32, HiPart, Lo); return DAG.getNode(ISD::ADD, dl, MVT::i32, HiPart, Lo);
} else { } else {
SDValue GA = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0, SDValue GA = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,
MipsII::MO_GOT); MipsII::MO_GOT);
@@ -785,7 +786,9 @@ SDValue MipsTargetLowering::LowerGlobalAddress(SDValue Op,
// a load from got/GP is necessary for PIC to work. // a load from got/GP is necessary for PIC to work.
if (!GV->hasLocalLinkage() || isa<Function>(GV)) if (!GV->hasLocalLinkage() || isa<Function>(GV))
return ResNode; return ResNode;
SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, GA); SDValue GALo = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,
MipsII::MO_ABS_LO);
SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, GALo);
return DAG.getNode(ISD::ADD, dl, MVT::i32, ResNode, Lo); return DAG.getNode(ISD::ADD, dl, MVT::i32, ResNode, Lo);
} }
@@ -806,7 +809,7 @@ SDValue MipsTargetLowering::LowerBlockAddress(SDValue Op,
SDValue BAGOTOffset = DAG.getBlockAddress(BA, MVT::i32, true, SDValue BAGOTOffset = DAG.getBlockAddress(BA, MVT::i32, true,
MipsII::MO_GOT); MipsII::MO_GOT);
SDValue BALOOffset = DAG.getBlockAddress(BA, MVT::i32, true, SDValue BALOOffset = DAG.getBlockAddress(BA, MVT::i32, true,
MipsII::MO_ABS_HILO); MipsII::MO_ABS_LO);
SDValue Load = DAG.getLoad(MVT::i32, dl, SDValue Load = DAG.getLoad(MVT::i32, dl,
DAG.getEntryNode(), BAGOTOffset, DAG.getEntryNode(), BAGOTOffset,
MachinePointerInfo(), false, false, 0); MachinePointerInfo(), false, false, 0);
@@ -830,7 +833,7 @@ LowerJumpTable(SDValue Op, SelectionDAG &DAG) const
// FIXME there isn't actually debug info here // FIXME there isn't actually debug info here
DebugLoc dl = Op.getDebugLoc(); DebugLoc dl = Op.getDebugLoc();
bool IsPIC = getTargetMachine().getRelocationModel() == Reloc::PIC_; bool IsPIC = getTargetMachine().getRelocationModel() == Reloc::PIC_;
unsigned char OpFlag = IsPIC ? MipsII::MO_GOT : MipsII::MO_ABS_HILO; unsigned char OpFlag = IsPIC ? MipsII::MO_GOT : MipsII::MO_ABS_HI;
EVT PtrVT = Op.getValueType(); EVT PtrVT = Op.getValueType();
JumpTableSDNode *JT = cast<JumpTableSDNode>(Op); JumpTableSDNode *JT = cast<JumpTableSDNode>(Op);
@@ -845,7 +848,8 @@ LowerJumpTable(SDValue Op, SelectionDAG &DAG) const
MachinePointerInfo(), MachinePointerInfo(),
false, false, 0); false, false, 0);
SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, JTI); SDValue JTILo = DAG.getTargetJumpTable(JT->getIndex(), PtrVT, MipsII::MO_ABS_LO);
SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, JTILo);
ResNode = DAG.getNode(ISD::ADD, dl, MVT::i32, HiPart, Lo); ResNode = DAG.getNode(ISD::ADD, dl, MVT::i32, HiPart, Lo);
return ResNode; return ResNode;
@@ -871,18 +875,22 @@ LowerConstantPool(SDValue Op, SelectionDAG &DAG) const
// ResNode = DAG.getNode(ISD::ADD, MVT::i32, GOT, GPRelNode); // ResNode = DAG.getNode(ISD::ADD, MVT::i32, GOT, GPRelNode);
if (getTargetMachine().getRelocationModel() != Reloc::PIC_) { if (getTargetMachine().getRelocationModel() != Reloc::PIC_) {
SDValue CP = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(), SDValue CPHi = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(),
N->getOffset(), MipsII::MO_ABS_HILO); N->getOffset(), MipsII::MO_ABS_HI);
SDValue HiPart = DAG.getNode(MipsISD::Hi, dl, MVT::i32, CP); SDValue CPLo = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(),
SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, CP); N->getOffset(), MipsII::MO_ABS_LO);
SDValue HiPart = DAG.getNode(MipsISD::Hi, dl, MVT::i32, CPHi);
SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, CPLo);
ResNode = DAG.getNode(ISD::ADD, dl, MVT::i32, HiPart, Lo); ResNode = DAG.getNode(ISD::ADD, dl, MVT::i32, HiPart, Lo);
} else { } else {
SDValue CP = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(), SDValue CP = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(),
N->getOffset(), MipsII::MO_GOT); N->getOffset(), MipsII::MO_GOT);
SDValue Load = DAG.getLoad(MVT::i32, dl, DAG.getEntryNode(), SDValue Load = DAG.getLoad(MVT::i32, dl, DAG.getEntryNode(),
CP, MachinePointerInfo::getConstantPool(), CP, MachinePointerInfo::getConstantPool(),
false, false, 0); false, false, 0);
SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, CP); SDValue CPLo = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(),
N->getOffset(), MipsII::MO_ABS_LO);
SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, CPLo);
ResNode = DAG.getNode(ISD::ADD, dl, MVT::i32, Load, Lo); ResNode = DAG.getNode(ISD::ADD, dl, MVT::i32, Load, Lo);
} }

View File

@@ -143,10 +143,10 @@ namespace MipsII {
/// for the relocatable object file being produced. /// for the relocatable object file being produced.
MO_GPREL, MO_GPREL,
/// MO_ABS_HILO - Represents the hi or low part of an absolute symbol /// MO_ABS_HI/LO - Represents the hi or low part of an absolute symbol
/// address. /// address.
MO_ABS_HILO MO_ABS_HI,
MO_ABS_LO
}; };
} }