| //===- SPUSubtarget.cpp - STI Cell SPU Subtarget Information --------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file implements the CellSPU-specific subclass of TargetSubtargetInfo. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "SPUSubtarget.h" |
| #include "SPU.h" |
| #include "SPURegisterInfo.h" |
| #include "llvm/Support/TargetRegistry.h" |
| #include "llvm/ADT/SmallVector.h" |
| |
| #define GET_SUBTARGETINFO_TARGET_DESC |
| #define GET_SUBTARGETINFO_CTOR |
| #include "SPUGenSubtargetInfo.inc" |
| |
| using namespace llvm; |
| |
| SPUSubtarget::SPUSubtarget(const std::string &TT, const std::string &CPU, |
| const std::string &FS) : |
| SPUGenSubtargetInfo(TT, CPU, FS), |
| StackAlignment(16), |
| ProcDirective(SPU::DEFAULT_PROC), |
| UseLargeMem(false) |
| { |
| // Should be the target SPU processor type. For now, since there's only |
| // one, simply default to the current "v0" default: |
| std::string default_cpu("v0"); |
| |
| // Parse features string. |
| ParseSubtargetFeatures(default_cpu, FS); |
| |
| // Initialize scheduling itinerary for the specified CPU. |
| InstrItins = getInstrItineraryForCPU(default_cpu); |
| } |
| |
| /// SetJITMode - This is called to inform the subtarget info that we are |
| /// producing code for the JIT. |
| void SPUSubtarget::SetJITMode() { |
| } |
| |
| /// Enable PostRA scheduling for optimization levels -O2 and -O3. |
| bool SPUSubtarget::enablePostRAScheduler( |
| CodeGenOpt::Level OptLevel, |
| TargetSubtargetInfo::AntiDepBreakMode& Mode, |
| RegClassVector& CriticalPathRCs) const { |
| Mode = TargetSubtargetInfo::ANTIDEP_CRITICAL; |
| // CriticalPathsRCs seems to be the set of |
| // RegisterClasses that antidep breakings are performed for. |
| // Do it for all register classes |
| CriticalPathRCs.clear(); |
| CriticalPathRCs.push_back(&SPU::R8CRegClass); |
| CriticalPathRCs.push_back(&SPU::R16CRegClass); |
| CriticalPathRCs.push_back(&SPU::R32CRegClass); |
| CriticalPathRCs.push_back(&SPU::R32FPRegClass); |
| CriticalPathRCs.push_back(&SPU::R64CRegClass); |
| CriticalPathRCs.push_back(&SPU::VECREGRegClass); |
| return OptLevel >= CodeGenOpt::Default; |
| } |