Home | History | Annotate | Download | only in MBlaze
      1 //===- MBlazeSubtarget.cpp - MBlaze Subtarget Information -------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file implements the MBlaze specific subclass of TargetSubtargetInfo.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "MBlazeSubtarget.h"
     15 #include "MBlaze.h"
     16 #include "MBlazeRegisterInfo.h"
     17 #include "llvm/Support/CommandLine.h"
     18 #include "llvm/Support/TargetRegistry.h"
     19 
     20 #define GET_SUBTARGETINFO_TARGET_DESC
     21 #define GET_SUBTARGETINFO_CTOR
     22 #include "MBlazeGenSubtargetInfo.inc"
     23 
     24 using namespace llvm;
     25 
     26 MBlazeSubtarget::MBlazeSubtarget(const std::string &TT,
     27                                  const std::string &CPU,
     28                                  const std::string &FS):
     29   MBlazeGenSubtargetInfo(TT, CPU, FS),
     30   HasBarrel(false), HasDiv(false), HasMul(false), HasPatCmp(false),
     31   HasFPU(false), HasMul64(false), HasSqrt(false)
     32 {
     33   // Parse features string.
     34   std::string CPUName = CPU;
     35   if (CPUName.empty())
     36     CPUName = "mblaze";
     37   ParseSubtargetFeatures(CPUName, FS);
     38 
     39   // Only use instruction scheduling if the selected CPU has an instruction
     40   // itinerary (the default CPU is the only one that doesn't).
     41   HasItin = CPUName != "mblaze";
     42   DEBUG(dbgs() << "CPU " << CPUName << "(" << HasItin << ")\n");
     43 
     44   // Initialize scheduling itinerary for the specified CPU.
     45   InstrItins = getInstrItineraryForCPU(CPUName);
     46 
     47   // Compute the issue width of the MBlaze itineraries
     48   computeIssueWidth();
     49 }
     50 
     51 void MBlazeSubtarget::computeIssueWidth() {
     52   InstrItins.IssueWidth = 1;
     53 }
     54 
     55 bool MBlazeSubtarget::
     56 enablePostRAScheduler(CodeGenOpt::Level OptLevel,
     57                       TargetSubtargetInfo::AntiDepBreakMode& Mode,
     58                       RegClassVector& CriticalPathRCs) const {
     59   Mode = TargetSubtargetInfo::ANTIDEP_CRITICAL;
     60   CriticalPathRCs.clear();
     61   CriticalPathRCs.push_back(&MBlaze::GPRRegClass);
     62   return HasItin && OptLevel >= CodeGenOpt::Default;
     63 }
     64