[llvm-commits] MIPS patch

Bruno Cardoso Lopes bruno.cardoso at gmail.com
Fri Apr 1 14:30:08 PDT 2011


Nice! Please commit!

On Fri, Apr 1, 2011 at 4:44 PM, Akira Hatanaka <ahatanak at gmail.com> wrote:
> This patch simplifies logic for printing target flags.
>
> Index: lib/Target/Mips/MipsAsmPrinter.cpp
> ===================================================================
> --- lib/Target/Mips/MipsAsmPrinter.cpp  (revision 128724)
> +++ lib/Target/Mips/MipsAsmPrinter.cpp  (working copy)
> @@ -298,23 +298,10 @@
>    switch(MO.getTargetFlags()) {
>    case MipsII::MO_GPREL:    O << "%gp_rel("; break;
>    case MipsII::MO_GOT_CALL: O << "%call16("; break;
> -  case MipsII::MO_GOT: {
> -    const MachineOperand &LastMO = MI->getOperand(opNum-1);
> -    bool LastMOIsGP = LastMO.getType() == MachineOperand::MO_Register
> -                      && LastMO.getReg() == Mips::GP;
> -    if (MI->getOpcode() == Mips::LW || LastMOIsGP)
> -      O << "%got(";
> -    else
> -      O << "%lo(";
> -    break;
> +  case MipsII::MO_GOT:      O << "%got(";    break;
> +  case MipsII::MO_ABS_HI:   O << "%hi(";     break;
> +  case MipsII::MO_ABS_LO:   O << "%lo(";     break;
>    }
> -  case MipsII::MO_ABS_HILO:
> -    if (MI->getOpcode() == Mips::LUi)
> -      O << "%hi(";
> -    else
> -      O << "%lo(";
> -    break;
> -  }
>
>    switch (MO.getType()) {
>      case MachineOperand::MO_Register:
> Index: lib/Target/Mips/MipsInstrInfo.h
> ===================================================================
> --- lib/Target/Mips/MipsInstrInfo.h (revision 128724)
> +++ lib/Target/Mips/MipsInstrInfo.h (working copy)
> @@ -143,10 +143,10 @@
>      /// for the relocatable object file being produced.
>      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.
> -    MO_ABS_HILO
> -
> +    MO_ABS_HI,
> +    MO_ABS_LO
>    };
>  }
>
> Index: lib/Target/Mips/MipsISelLowering.cpp
> ===================================================================
> --- lib/Target/Mips/MipsISelLowering.cpp  (revision 128724)
> +++ lib/Target/Mips/MipsISelLowering.cpp  (working copy)
> @@ -769,12 +769,13 @@
>        return DAG.getNode(ISD::ADD, dl, MVT::i32, GOT, GPRelNode);
>      }
>      // %hi/%lo relocation
> -    SDValue GA = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,
> -                                            MipsII::MO_ABS_HILO);
> -    SDValue HiPart = DAG.getNode(MipsISD::Hi, dl, VTs, &GA, 1);
> -    SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, GA);
> +    SDValue GAHi = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,
> +                                              MipsII::MO_ABS_HI);
> +    SDValue GALo = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,
> +                                              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);
> -
>    } else {
>      SDValue GA = DAG.getTargetGlobalAddress(GV, dl, MVT::i32, 0,
>                                              MipsII::MO_GOT);
> @@ -785,7 +786,9 @@
>      // a load from got/GP is necessary for PIC to work.
>      if (!GV->hasLocalLinkage() || isa<Function>(GV))
>        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);
>    }
>
> @@ -806,7 +809,7 @@
>      SDValue BAGOTOffset = DAG.getBlockAddress(BA, MVT::i32, true,
>                                                MipsII::MO_GOT);
>      SDValue BALOOffset = DAG.getBlockAddress(BA, MVT::i32, true,
> -                                             MipsII::MO_ABS_HILO);
> +                                             MipsII::MO_ABS_LO);
>      SDValue Load = DAG.getLoad(MVT::i32, dl,
>                                 DAG.getEntryNode(), BAGOTOffset,
>                                 MachinePointerInfo(), false, false, 0);
> @@ -830,7 +833,7 @@
>    // FIXME there isn't actually debug info here
>    DebugLoc dl = Op.getDebugLoc();
>    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();
>    JumpTableSDNode *JT  = cast<JumpTableSDNode>(Op);
> @@ -845,7 +848,8 @@
>                           MachinePointerInfo(),
>                           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);
>
>    return ResNode;
> @@ -871,18 +875,22 @@
>    //  ResNode = DAG.getNode(ISD::ADD, MVT::i32, GOT, GPRelNode);
>
>    if (getTargetMachine().getRelocationModel() != Reloc::PIC_) {
> -    SDValue CP = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(),
> -                                      N->getOffset(), MipsII::MO_ABS_HILO);
> -    SDValue HiPart = DAG.getNode(MipsISD::Hi, dl, MVT::i32, CP);
> -    SDValue Lo = DAG.getNode(MipsISD::Lo, dl, MVT::i32, CP);
> +    SDValue CPHi = DAG.getTargetConstantPool(C, MVT::i32,
> N->getAlignment(),
> +                                             N->getOffset(),
> MipsII::MO_ABS_HI);
> +    SDValue CPLo = DAG.getTargetConstantPool(C, MVT::i32,
> N->getAlignment(),
> +                                             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);
>    } else {
>      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(),
>                                 CP, MachinePointerInfo::getConstantPool(),
>                                 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);
>    }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>



-- 
Bruno Cardoso Lopes
http://www.brunocardoso.cc




More information about the llvm-commits mailing list