1894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===- MBlazeSubtarget.cpp - MBlaze Subtarget Information -------*- C++ -*-===//
2894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
3894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                     The LLVM Compiler Infrastructure
4894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
5894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This file is distributed under the University of Illinois Open Source
6894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// License. See LICENSE.TXT for details.
7894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
8894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===//
9894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file implements the MBlaze specific subclass of TargetSubtargetInfo.
11894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
12894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===//
13894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
14894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "MBlazeSubtarget.h"
15894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "MBlaze.h"
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "MBlazeRegisterInfo.h"
17894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Support/CommandLine.h"
1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/TargetRegistry.h"
1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define GET_SUBTARGETINFO_TARGET_DESC
2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define GET_SUBTARGETINFO_CTOR
2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "MBlazeGenSubtargetInfo.inc"
2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
24894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanusing namespace llvm;
25894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanMBlazeSubtarget::MBlazeSubtarget(const std::string &TT,
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                 const std::string &CPU,
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                 const std::string &FS):
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MBlazeGenSubtargetInfo(TT, CPU, FS),
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  HasBarrel(false), HasDiv(false), HasMul(false), HasPatCmp(false),
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  HasFPU(false), HasMul64(false), HasSqrt(false)
32894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{
33894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // Parse features string.
3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  std::string CPUName = CPU;
3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CPUName.empty())
3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CPUName = "mblaze";
3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ParseSubtargetFeatures(CPUName, FS);
3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Only use instruction scheduling if the selected CPU has an instruction
4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // itinerary (the default CPU is the only one that doesn't).
4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  HasItin = CPUName != "mblaze";
4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DEBUG(dbgs() << "CPU " << CPUName << "(" << HasItin << ")\n");
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Initialize scheduling itinerary for the specified CPU.
4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  InstrItins = getInstrItineraryForCPU(CPUName);
4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Compute the issue width of the MBlaze itineraries
4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  computeIssueWidth();
4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MBlazeSubtarget::computeIssueWidth() {
5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  InstrItins.IssueWidth = 1;
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool MBlazeSubtarget::
5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanenablePostRAScheduler(CodeGenOpt::Level OptLevel,
5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                      TargetSubtargetInfo::AntiDepBreakMode& Mode,
5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                      RegClassVector& CriticalPathRCs) const {
5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Mode = TargetSubtargetInfo::ANTIDEP_CRITICAL;
6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CriticalPathRCs.clear();
6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CriticalPathRCs.push_back(&MBlaze::GPRRegClass);
6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return HasItin && OptLevel >= CodeGenOpt::Default;
63894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
64