mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-02 22:23:10 +00:00
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:
@@ -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()) {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user