This patch simplifies logic for printing target flags.<br><br>Index: lib/Target/Mips/MipsAsmPrinter.cpp<br>===================================================================<br>--- lib/Target/Mips/MipsAsmPrinter.cpp (revision 128724)<br>
+++ lib/Target/Mips/MipsAsmPrinter.cpp (working copy)<br>@@ -298,23 +298,10 @@<br> switch(MO.getTargetFlags()) {<br> case MipsII::MO_GPREL: O << "%gp_rel("; break;<br> case MipsII::MO_GOT_CALL: O << "%call16("; break;<br>
- case MipsII::MO_GOT: {<br>- const MachineOperand &LastMO = MI->getOperand(opNum-1);<br>- bool LastMOIsGP = LastMO.getType() == MachineOperand::MO_Register<br>- && LastMO.getReg() == Mips::GP;<br>
- if (MI->getOpcode() == Mips::LW || LastMOIsGP)<br>- O << "%got(";<br>- else<br>- O << "%lo(";<br>- break;<br>+ case MipsII::MO_GOT: O << "%got("; break;<br>
+ case MipsII::MO_ABS_HI: O << "%hi("; break;<br>+ case MipsII::MO_ABS_LO: O << "%lo("; break;<br> }<br>- case MipsII::MO_ABS_HILO:<br>- if (MI->getOpcode() == Mips::LUi)<br>
- O << "%hi(";<br>- else<br>- O << "%lo(";<br>- break;<br>- }<br><br> switch (MO.getType()) {<br> case MachineOperand::MO_Register:<br>Index: lib/Target/Mips/MipsInstrInfo.h<br>
===================================================================<br>--- lib/Target/Mips/MipsInstrInfo.h (revision 128724)<br>+++ lib/Target/Mips/MipsInstrInfo.h (working copy)<br>@@ -143,10 +143,10 @@<br> /// for the relocatable object file being produced.<br>
MO_GPREL,<br><br>- /// MO_ABS_HILO - Represents the hi or low part of an absolute symbol<br>+ /// MO_ABS_HI/LO - Represents the hi or low part of an absolute symbol<br> /// address.<br>- MO_ABS_HILO<br>-<br>
+ MO_ABS_HI,<br>+ MO_ABS_LO<br> };<br> }<br><br>Index: lib/Target/Mips/MipsISelLowering.cpp<br>===================================================================<br>--- lib/Target/Mips/MipsISelLowering.cpp (revision 128724)<br>
+++ lib/Target/Mips/MipsISelLowering.cpp (working copy)<br>@@ -769,12 +769,13 @@<br> return DAG.getNode(ISD::ADD, dl, MVT::i32, GOT, GPRelNode);<br> }<br> // %hi/%lo relocation<br>- SDValue GA = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,<br>
- MipsII::MO_ABS_HILO);<br>- SDValue HiPart = DAG.getNode(MipsISD::Hi, dl, VTs, &GA, 1);<br>- SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, GA);<br>+ SDValue GAHi = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,<br>
+ MipsII::MO_ABS_HI);<br>+ SDValue GALo = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,<br>+ MipsII::MO_ABS_LO);<br>+ SDValue HiPart = DAG.getNode(MipsISD::Hi, dl, VTs, &GAHi, 1);<br>
+ SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, GALo);<br> return DAG.getNode(ISD::ADD, dl, MVT::i32, HiPart, Lo);<br>-<br> } else {<br> SDValue GA = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,<br> MipsII::MO_GOT);<br>
@@ -785,7 +786,9 @@<br> // a load from got/GP is necessary for PIC to work.<br> if (!GV->hasLocalLinkage() || isa<Function>(GV))<br> return ResNode;<br>- SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, GA);<br>
+ SDValue GALo = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,<br>+ MipsII::MO_ABS_LO);<br>+ SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, GALo);<br> return DAG.getNode(ISD::ADD, dl, MVT::i32, ResNode, Lo);<br>
}<br><br>@@ -806,7 +809,7 @@<br> SDValue BAGOTOffset = DAG.getBlockAddress(BA, MVT::i32, true,<br> MipsII::MO_GOT);<br> SDValue BALOOffset = DAG.getBlockAddress(BA, MVT::i32, true,<br>
- MipsII::MO_ABS_HILO);<br>+ MipsII::MO_ABS_LO);<br> SDValue Load = DAG.getLoad(MVT::i32, dl,<br> DAG.getEntryNode(), BAGOTOffset,<br>
MachinePointerInfo(), false, false, 0);<br>@@ -830,7 +833,7 @@<br> // FIXME there isn't actually debug info here<br> DebugLoc dl = Op.getDebugLoc();<br> bool IsPIC = getTargetMachine().getRelocationModel() == Reloc::PIC_;<br>
- unsigned char OpFlag = IsPIC ? MipsII::MO_GOT : MipsII::MO_ABS_HILO;<br>+ unsigned char OpFlag = IsPIC ? MipsII::MO_GOT : MipsII::MO_ABS_HI;<br><br> EVT PtrVT = Op.getValueType();<br> JumpTableSDNode *JT = cast<JumpTableSDNode>(Op);<br>
@@ -845,7 +848,8 @@<br> MachinePointerInfo(),<br> false, false, 0);<br><br>- SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, JTI);<br>+ SDValue JTILo = DAG.getTargetJumpTable(JT->getIndex(), PtrVT, MipsII::MO_ABS_LO);<br>
+ SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, JTILo);<br> ResNode = DAG.getNode(ISD::ADD, dl, MVT::i32, HiPart, Lo);<br><br> return ResNode;<br>@@ -871,18 +875,22 @@<br> // ResNode = DAG.getNode(ISD::ADD, MVT::i32, GOT, GPRelNode);<br>
<br> if (getTargetMachine().getRelocationModel() != Reloc::PIC_) {<br>- SDValue CP = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(),<br>- N->getOffset(), MipsII::MO_ABS_HILO);<br>
- SDValue HiPart = DAG.getNode(MipsISD::Hi, dl, MVT::i32, CP);<br>- SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, CP);<br>+ SDValue CPHi = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(),<br>+ N->getOffset(), MipsII::MO_ABS_HI);<br>
+ SDValue CPLo = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(),<br>+ N->getOffset(), MipsII::MO_ABS_LO);<br>+ SDValue HiPart = DAG.getNode(MipsISD::Hi, dl, MVT::i32, CPHi);<br>
+ SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, CPLo);<br> ResNode = DAG.getNode(ISD::ADD, dl, MVT::i32, HiPart, Lo);<br> } else {<br> SDValue CP = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(),<br>
- N->getOffset(), MipsII::MO_GOT);<br>+ N->getOffset(), MipsII::MO_GOT);<br> SDValue Load = DAG.getLoad(MVT::i32, dl, DAG.getEntryNode(),<br>
CP, MachinePointerInfo::getConstantPool(),<br> false, false, 0);<br>- SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, CP);<br>+ SDValue CPLo = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(),<br>
+ N->getOffset(), MipsII::MO_ABS_LO);<br>+ SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, CPLo);<br> ResNode = DAG.getNode(ISD::ADD, dl, MVT::i32, Load, Lo);<br> }<br>
<br><br>