diff options
Diffstat (limited to 'contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp')
| -rw-r--r-- | contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp | 90 | 
1 files changed, 27 insertions, 63 deletions
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp b/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp index d6767d51f2cc..9563b9045c39 100644 --- a/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp +++ b/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp @@ -26,6 +26,10 @@ static cl::  opt<bool> DisableCTRLoops("disable-ppc-ctrloops", cl::Hidden,                          cl::desc("Disable CTR loops for PPC")); +static cl::opt<bool> +VSXFMAMutateEarly("schedule-ppc-vsx-fma-mutation-early", +  cl::Hidden, cl::desc("Schedule VSX FMA instruction mutation early")); +  extern "C" void LLVMInitializePowerPCTarget() {    // Register the targets    RegisterTargetMachine<PPC32TargetMachine> A(ThePPC32Target); @@ -33,59 +37,12 @@ extern "C" void LLVMInitializePowerPCTarget() {    RegisterTargetMachine<PPC64TargetMachine> C(ThePPC64LETarget);  } -/// Return the datalayout string of a subtarget. -static std::string getDataLayoutString(const PPCSubtarget &ST) { -  const Triple &T = ST.getTargetTriple(); - -  // PPC is big endian -  std::string Ret = "E"; - -  // PPC64 has 64 bit pointers, PPC32 has 32 bit pointers. -  if (ST.isPPC64()) -    Ret += "-p:64:64"; -  else -    Ret += "-p:32:32"; - -  // Note, the alignment values for f64 and i64 on ppc64 in Darwin -  // documentation are wrong; these are correct (i.e. "what gcc does"). -  if (ST.isPPC64() || ST.isSVR4ABI()) -    Ret += "-f64:64:64-i64:64:64"; -  else -    Ret += "-f64:32:64"; - -  // Set support for 128 floats depending on the ABI. -  if (!ST.isPPC64() && ST.isSVR4ABI()) -    Ret += "-f128:64:128"; - -  // Some ABIs support 128 bit vectors. -  if (ST.isPPC64() && ST.isSVR4ABI()) -    Ret += "-v128:128:128"; - -  // PPC64 has 32 and 64 bit register, PPC32 has only 32 bit ones. -  if (ST.isPPC64()) -    Ret += "-n32:64"; -  else -    Ret += "-n32"; - -  return Ret; -} - -PPCTargetMachine::PPCTargetMachine(const Target &T, StringRef TT, -                                   StringRef CPU, StringRef FS, -                                   const TargetOptions &Options, +PPCTargetMachine::PPCTargetMachine(const Target &T, StringRef TT, StringRef CPU, +                                   StringRef FS, const TargetOptions &Options,                                     Reloc::Model RM, CodeModel::Model CM, -                                   CodeGenOpt::Level OL, -                                   bool is64Bit) -  : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), -    Subtarget(TT, CPU, FS, is64Bit), -    DL(getDataLayoutString(Subtarget)), InstrInfo(*this), -    FrameLowering(Subtarget), JITInfo(*this, is64Bit), -    TLInfo(*this), TSInfo(*this), -    InstrItins(Subtarget.getInstrItineraryData()) { - -  // The binutils for the BG/P are too old for CFI. -  if (Subtarget.isBGP()) -    setMCUseCFI(false); +                                   CodeGenOpt::Level OL, bool is64Bit) +    : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), +      Subtarget(TT, CPU, FS, *this, is64Bit, OL) {    initAsmInfo();  } @@ -129,11 +86,12 @@ public:      return *getPPCTargetMachine().getSubtargetImpl();    } -  virtual bool addPreISel(); -  virtual bool addILPOpts(); -  virtual bool addInstSelector(); -  virtual bool addPreSched2(); -  virtual bool addPreEmitPass(); +  bool addPreISel() override; +  bool addILPOpts() override; +  bool addInstSelector() override; +  bool addPreRegAlloc() override; +  bool addPreSched2() override; +  bool addPreEmitPass() override;  };  } // namespace @@ -149,12 +107,8 @@ bool PPCPassConfig::addPreISel() {  }  bool PPCPassConfig::addILPOpts() { -  if (getPPCSubtarget().hasISEL()) { -    addPass(&EarlyIfConverterID); -    return true; -  } - -  return false; +  addPass(&EarlyIfConverterID); +  return true;  }  bool PPCPassConfig::addInstSelector() { @@ -166,10 +120,20 @@ bool PPCPassConfig::addInstSelector() {      addPass(createPPCCTRLoopsVerify());  #endif +  addPass(createPPCVSXCopyPass()); +  return false; +} + +bool PPCPassConfig::addPreRegAlloc() { +  initializePPCVSXFMAMutatePass(*PassRegistry::getPassRegistry()); +  insertPass(VSXFMAMutateEarly ? &RegisterCoalescerID : &MachineSchedulerID, +             &PPCVSXFMAMutateID);    return false;  }  bool PPCPassConfig::addPreSched2() { +  addPass(createPPCVSXCopyCleanupPass()); +    if (getOptLevel() != CodeGenOpt::None)      addPass(&IfConverterID);  | 
