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