diff options
| author | Eric Christopher <echristo@gmail.com> | 2014-07-03 00:10:24 +0000 | 
|---|---|---|
| committer | Eric Christopher <echristo@gmail.com> | 2014-07-03 00:10:24 +0000 | 
| commit | daa9dbbbd5dc7e7d7f108082f5dab148a05bada8 (patch) | |
| tree | b76ab40777614581bfbafa5ada8a0f57a9a612c6 /llvm/lib/Target/Mips | |
| parent | de0860aae4b2723f1a66005a07de2ea244faa082 (diff) | |
| download | bcm5719-llvm-daa9dbbbd5dc7e7d7f108082f5dab148a05bada8.tar.gz bcm5719-llvm-daa9dbbbd5dc7e7d7f108082f5dab148a05bada8.zip  | |
Move subtarget dependent features into the subtarget from the target
machine. Includes a fix for a subtarget initialization for
hard floating point on mips16.
llvm-svn: 212240
Diffstat (limited to 'llvm/lib/Target/Mips')
| -rw-r--r-- | llvm/lib/Target/Mips/MipsSubtarget.cpp | 76 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MipsSubtarget.h | 27 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MipsTargetMachine.cpp | 41 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MipsTargetMachine.h | 49 | 
4 files changed, 97 insertions, 96 deletions
diff --git a/llvm/lib/Target/Mips/MipsSubtarget.cpp b/llvm/lib/Target/Mips/MipsSubtarget.cpp index ac0ffc75dc2..bc185cd01cb 100644 --- a/llvm/lib/Target/Mips/MipsSubtarget.cpp +++ b/llvm/lib/Target/Mips/MipsSubtarget.cpp @@ -114,18 +114,10 @@ MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU,        InMicroMipsMode(false), HasDSP(false), HasDSPR2(false),        AllowMixed16_32(Mixed16_32 | Mips_Os16), Os16(Mips_Os16), HasMSA(false),        RM(_RM), OverrideMode(NoOverride), TM(_TM), TargetTriple(TT), -      DL(computeDataLayout(initializeSubtargetDependencies(CPU, FS))), -      TSInfo(DL), JITInfo() { - -  if (InMips16Mode && !TM->Options.UseSoftFloat) { -    // Hard float for mips16 means essentially to compile as soft float -    // but to use a runtime library for soft float that is written with -    // native mips32 floating point instructions (those runtime routines -    // run in mips32 hard float mode). -    TM->Options.UseSoftFloat = true; -    TM->Options.FloatABIType = FloatABI::Soft; -    InMips16HardFloat = true; -  } +      DL(computeDataLayout(initializeSubtargetDependencies(CPU, FS, TM))), +      TSInfo(DL), JITInfo(), InstrInfo(MipsInstrInfo::create(*TM)), +      FrameLowering(MipsFrameLowering::create(*TM, *this)), +      TLInfo(MipsTargetLowering::create(*TM)) {    PreviousInMips16Mode = InMips16Mode; @@ -189,14 +181,26 @@ MipsSubtarget::enablePostRAScheduler(CodeGenOpt::Level OptLevel,    return OptLevel >= CodeGenOpt::Aggressive;  } -MipsSubtarget &MipsSubtarget::initializeSubtargetDependencies(StringRef CPU, -                                                              StringRef FS) { +MipsSubtarget & +MipsSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS, +                                               const TargetMachine *TM) {    std::string CPUName = selectMipsCPU(TargetTriple, CPU);    // Parse features string.    ParseSubtargetFeatures(CPUName, FS);    // Initialize scheduling itinerary for the specified CPU.    InstrItins = getInstrItineraryForCPU(CPUName); + +  if (InMips16Mode && !TM->Options.UseSoftFloat) { +    // Hard float for mips16 means essentially to compile as soft float +    // but to use a runtime library for soft float that is written with +    // native mips32 floating point instructions (those runtime routines +    // run in mips32 hard float mode). +    TM->Options.UseSoftFloat = true; +    TM->Options.FloatABIType = FloatABI::Soft; +    InMips16HardFloat = true; +  } +    return *this;  } @@ -219,14 +223,14 @@ void MipsSubtarget::resetSubtarget(MachineFunction *MF) {        return;      OverrideMode = Mips16Override;      PreviousInMips16Mode = true; -    TM->setHelperClassesMips16(); +    setHelperClassesMips16();      return;    } else if (ChangeToNoMips16) {      if (!PreviousInMips16Mode)        return;      OverrideMode = NoMips16Override;      PreviousInMips16Mode = false; -    TM->setHelperClassesMipsSE(); +    setHelperClassesMipsSE();      return;    } else {      if (OverrideMode == NoOverride) @@ -234,16 +238,52 @@ void MipsSubtarget::resetSubtarget(MachineFunction *MF) {      OverrideMode = NoOverride;      DEBUG(dbgs() << "back to default" << "\n");      if (inMips16Mode() && !PreviousInMips16Mode) { -      TM->setHelperClassesMips16(); +      setHelperClassesMips16();        PreviousInMips16Mode = true;      } else if (!inMips16Mode() && PreviousInMips16Mode) { -      TM->setHelperClassesMipsSE(); +      setHelperClassesMipsSE();        PreviousInMips16Mode = false;      }      return;    }  } +void MipsSubtarget::setHelperClassesMips16() { +  InstrInfoSE.swap(InstrInfo); +  FrameLoweringSE.swap(FrameLowering); +  TLInfoSE.swap(TLInfo); +  if (!InstrInfo16) { +    InstrInfo.reset(MipsInstrInfo::create(*TM)); +    FrameLowering.reset(MipsFrameLowering::create(*TM, *this)); +    TLInfo.reset(MipsTargetLowering::create(*TM)); +  } else { +    InstrInfo16.swap(InstrInfo); +    FrameLowering16.swap(FrameLowering); +    TLInfo16.swap(TLInfo); +  } +  assert(TLInfo && "null target lowering 16"); +  assert(InstrInfo && "null instr info 16"); +  assert(FrameLowering && "null frame lowering 16"); +} + +void MipsSubtarget::setHelperClassesMipsSE() { +  InstrInfo16.swap(InstrInfo); +  FrameLowering16.swap(FrameLowering); +  TLInfo16.swap(TLInfo); +  if (!InstrInfoSE) { +    InstrInfo.reset(MipsInstrInfo::create(*TM)); +    FrameLowering.reset(MipsFrameLowering::create(*TM, *this)); +    TLInfo.reset(MipsTargetLowering::create(*TM)); +  } else { +    InstrInfoSE.swap(InstrInfo); +    FrameLoweringSE.swap(FrameLowering); +    TLInfoSE.swap(TLInfo); +  } +  assert(TLInfo && "null target lowering in SE"); +  assert(InstrInfo && "null instr info SE"); +  assert(FrameLowering && "null frame lowering SE"); +} +  bool MipsSubtarget::mipsSEUsesSoftFloat() const {    return TM->Options.UseSoftFloat && !InMips16HardFloat;  } diff --git a/llvm/lib/Target/Mips/MipsSubtarget.h b/llvm/lib/Target/Mips/MipsSubtarget.h index d02a3ed6a87..f8c4e3ba32f 100644 --- a/llvm/lib/Target/Mips/MipsSubtarget.h +++ b/llvm/lib/Target/Mips/MipsSubtarget.h @@ -14,6 +14,9 @@  #ifndef MIPSSUBTARGET_H  #define MIPSSUBTARGET_H +#include "MipsFrameLowering.h" +#include "MipsISelLowering.h" +#include "MipsInstrInfo.h"  #include "MipsJITInfo.h"  #include "MipsSelectionDAGInfo.h"  #include "llvm/IR/DataLayout.h" @@ -139,6 +142,15 @@ protected:    const DataLayout DL; // Calculates type size & alignment    const MipsSelectionDAGInfo TSInfo;    MipsJITInfo JITInfo; +  std::unique_ptr<const MipsInstrInfo> InstrInfo; +  std::unique_ptr<const MipsFrameLowering> FrameLowering; +  std::unique_ptr<const MipsTargetLowering> TLInfo; +  std::unique_ptr<const MipsInstrInfo> InstrInfo16; +  std::unique_ptr<const MipsFrameLowering> FrameLowering16; +  std::unique_ptr<const MipsTargetLowering> TLInfo16; +  std::unique_ptr<const MipsInstrInfo> InstrInfoSE; +  std::unique_ptr<const MipsFrameLowering> FrameLoweringSE; +  std::unique_ptr<const MipsTargetLowering> TLInfoSE;  public:    bool enablePostRAScheduler(CodeGenOpt::Level OptLevel, @@ -250,7 +262,8 @@ public:    /// \brief Reset the subtarget for the Mips target.    void resetSubtarget(MachineFunction *MF); -  MipsSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS); +  MipsSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS, +                                                 const TargetMachine *TM);    /// Does the system support unaligned memory access.    /// @@ -259,9 +272,21 @@ public:    /// hybrid implementations are all valid.    bool systemSupportsUnalignedAccess() const { return hasMips32r6(); } +  // Set helper classes +  void setHelperClassesMips16(); +  void setHelperClassesMipsSE(); +    MipsJITInfo *getJITInfo() { return &JITInfo; }    const MipsSelectionDAGInfo *getSelectionDAGInfo() const { return &TSInfo; }    const DataLayout *getDataLayout() const { return &DL; } +  const MipsInstrInfo *getInstrInfo() const { return InstrInfo.get(); } +  const TargetFrameLowering *getFrameLowering() const { +    return FrameLowering.get(); +  } +  const MipsRegisterInfo *getRegisterInfo() const { +    return &InstrInfo->getRegisterInfo(); +  } +  const MipsTargetLowering *getTargetLowering() const { return TLInfo.get(); }  };  } // End llvm namespace diff --git a/llvm/lib/Target/Mips/MipsTargetMachine.cpp b/llvm/lib/Target/Mips/MipsTargetMachine.cpp index c38639eadcb..425dbf1d89f 100644 --- a/llvm/lib/Target/Mips/MipsTargetMachine.cpp +++ b/llvm/lib/Target/Mips/MipsTargetMachine.cpp @@ -56,49 +56,10 @@ MipsTargetMachine::MipsTargetMachine(const Target &T, StringRef TT,                                       Reloc::Model RM, CodeModel::Model CM,                                       CodeGenOpt::Level OL, bool isLittle)      : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), -      Subtarget(TT, CPU, FS, isLittle, RM, this), -      InstrInfo(MipsInstrInfo::create(*this)), -      FrameLowering(MipsFrameLowering::create(*this, Subtarget)), -      TLInfo(MipsTargetLowering::create(*this)) { +      Subtarget(TT, CPU, FS, isLittle, RM, this) {    initAsmInfo();  } - -void MipsTargetMachine::setHelperClassesMips16() { -  InstrInfoSE.swap(InstrInfo); -  FrameLoweringSE.swap(FrameLowering); -  TLInfoSE.swap(TLInfo); -  if (!InstrInfo16) { -    InstrInfo.reset(MipsInstrInfo::create(*this)); -    FrameLowering.reset(MipsFrameLowering::create(*this, Subtarget)); -    TLInfo.reset(MipsTargetLowering::create(*this)); -  } else { -    InstrInfo16.swap(InstrInfo); -    FrameLowering16.swap(FrameLowering); -    TLInfo16.swap(TLInfo); -  } -  assert(TLInfo && "null target lowering 16"); -  assert(InstrInfo && "null instr info 16"); -  assert(FrameLowering && "null frame lowering 16"); -} - -void MipsTargetMachine::setHelperClassesMipsSE() { -  InstrInfo16.swap(InstrInfo); -  FrameLowering16.swap(FrameLowering); -  TLInfo16.swap(TLInfo); -  if (!InstrInfoSE) { -    InstrInfo.reset(MipsInstrInfo::create(*this)); -    FrameLowering.reset(MipsFrameLowering::create(*this, Subtarget)); -    TLInfo.reset(MipsTargetLowering::create(*this)); -  } else { -    InstrInfoSE.swap(InstrInfo); -    FrameLoweringSE.swap(FrameLowering); -    TLInfoSE.swap(TLInfo); -  } -  assert(TLInfo && "null target lowering in SE"); -  assert(InstrInfo && "null instr info SE"); -  assert(FrameLowering && "null frame lowering SE"); -}  void MipsebTargetMachine::anchor() { }  MipsebTargetMachine:: diff --git a/llvm/lib/Target/Mips/MipsTargetMachine.h b/llvm/lib/Target/Mips/MipsTargetMachine.h index 21950c71916..a0e7d435555 100644 --- a/llvm/lib/Target/Mips/MipsTargetMachine.h +++ b/llvm/lib/Target/Mips/MipsTargetMachine.h @@ -14,9 +14,6 @@  #ifndef MIPSTARGETMACHINE_H  #define MIPSTARGETMACHINE_H -#include "MipsFrameLowering.h" -#include "MipsISelLowering.h" -#include "MipsInstrInfo.h"  #include "MipsSubtarget.h"  #include "llvm/CodeGen/Passes.h"  #include "llvm/CodeGen/SelectionDAGISel.h" @@ -29,52 +26,37 @@ class MipsRegisterInfo;  class MipsTargetMachine : public LLVMTargetMachine {    MipsSubtarget       Subtarget; -  std::unique_ptr<const MipsInstrInfo> InstrInfo; -  std::unique_ptr<const MipsFrameLowering> FrameLowering; -  std::unique_ptr<const MipsTargetLowering> TLInfo; -  std::unique_ptr<const MipsInstrInfo> InstrInfo16; -  std::unique_ptr<const MipsFrameLowering> FrameLowering16; -  std::unique_ptr<const MipsTargetLowering> TLInfo16; -  std::unique_ptr<const MipsInstrInfo> InstrInfoSE; -  std::unique_ptr<const MipsFrameLowering> FrameLoweringSE; -  std::unique_ptr<const MipsTargetLowering> TLInfoSE;  public: -  MipsTargetMachine(const Target &T, StringRef TT, -                    StringRef CPU, StringRef FS, const TargetOptions &Options, -                    Reloc::Model RM, CodeModel::Model CM, -                    CodeGenOpt::Level OL, -                    bool isLittle); +  MipsTargetMachine(const Target &T, StringRef TT, StringRef CPU, StringRef FS, +                    const TargetOptions &Options, Reloc::Model RM, +                    CodeModel::Model CM, CodeGenOpt::Level OL, bool isLittle);    virtual ~MipsTargetMachine() {}    void addAnalysisPasses(PassManagerBase &PM) override; -  const MipsInstrInfo *getInstrInfo() const override -  { return InstrInfo.get(); } -  const TargetFrameLowering *getFrameLowering() const override -  { return FrameLowering.get(); } -  const MipsSubtarget *getSubtargetImpl() const override -  { return &Subtarget; } - +  const MipsInstrInfo *getInstrInfo() const override { +    return getSubtargetImpl()->getInstrInfo(); +  } +  const TargetFrameLowering *getFrameLowering() const override { +    return getSubtargetImpl()->getFrameLowering(); +  } +  const MipsSubtarget *getSubtargetImpl() const override { return &Subtarget; }    const InstrItineraryData *getInstrItineraryData() const override {      return Subtarget.inMips16Mode()                 ? nullptr                 : &getSubtargetImpl()->getInstrItineraryData();    } -    MipsJITInfo *getJITInfo() override {      return Subtarget.getJITInfo();    } -    const MipsRegisterInfo *getRegisterInfo()  const override { -    return &InstrInfo->getRegisterInfo(); +    return getSubtargetImpl()->getRegisterInfo();    } -    const MipsTargetLowering *getTargetLowering() const override { -    return TLInfo.get(); +    return getSubtargetImpl()->getTargetLowering();    } -    const DataLayout *getDataLayout() const override {      return getSubtargetImpl()->getDataLayout();    } @@ -85,13 +67,6 @@ public:    // Pass Pipeline Configuration    TargetPassConfig *createPassConfig(PassManagerBase &PM) override;    bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &JCE) override; - -  // Set helper classes -  void setHelperClassesMips16(); - -  void setHelperClassesMipsSE(); - -  };  /// MipsebTargetMachine - Mips32/64 big endian target machine.  | 

