117 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===- TargetSubtargetInfo.cpp - General Target Information ----------------==//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| /// \file This file describes the general parts of a Subtarget.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "llvm/CodeGen/TargetSubtargetInfo.h"
 | |
| #include "llvm/ADT/Optional.h"
 | |
| #include "llvm/CodeGen/MachineInstr.h"
 | |
| #include "llvm/CodeGen/TargetInstrInfo.h"
 | |
| #include "llvm/CodeGen/TargetSchedule.h"
 | |
| #include "llvm/MC/MCInst.h"
 | |
| #include "llvm/Support/Format.h"
 | |
| #include "llvm/Support/raw_ostream.h"
 | |
| #include <string>
 | |
| 
 | |
| using namespace llvm;
 | |
| 
 | |
| TargetSubtargetInfo::TargetSubtargetInfo(
 | |
|     const Triple &TT, StringRef CPU, StringRef FS,
 | |
|     ArrayRef<SubtargetFeatureKV> PF, ArrayRef<SubtargetFeatureKV> PD,
 | |
|     const SubtargetInfoKV *ProcSched, const MCWriteProcResEntry *WPR,
 | |
|     const MCWriteLatencyEntry *WL, const MCReadAdvanceEntry *RA,
 | |
|     const InstrStage *IS, const unsigned *OC, const unsigned *FP)
 | |
|     : MCSubtargetInfo(TT, CPU, FS, PF, PD, ProcSched, WPR, WL, RA, IS, OC, FP) {
 | |
| }
 | |
| 
 | |
| TargetSubtargetInfo::~TargetSubtargetInfo() = default;
 | |
| 
 | |
| bool TargetSubtargetInfo::enableAtomicExpand() const {
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool TargetSubtargetInfo::enableIndirectBrExpand() const {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool TargetSubtargetInfo::enableMachineScheduler() const {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool TargetSubtargetInfo::enableJoinGlobalCopies() const {
 | |
|   return enableMachineScheduler();
 | |
| }
 | |
| 
 | |
| bool TargetSubtargetInfo::enableRALocalReassignment(
 | |
|     CodeGenOpt::Level OptLevel) const {
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool TargetSubtargetInfo::enableAdvancedRASplitCost() const {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool TargetSubtargetInfo::enablePostRAScheduler() const {
 | |
|   return getSchedModel().PostRAScheduler;
 | |
| }
 | |
| 
 | |
| bool TargetSubtargetInfo::useAA() const {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| static std::string createSchedInfoStr(unsigned Latency, double RThroughput) {
 | |
|   static const char *SchedPrefix = " sched: [";
 | |
|   std::string Comment;
 | |
|   raw_string_ostream CS(Comment);
 | |
|   if (RThroughput != 0.0)
 | |
|     CS << SchedPrefix << Latency << format(":%2.2f", RThroughput)
 | |
|        << "]";
 | |
|   else
 | |
|     CS << SchedPrefix << Latency << ":?]";
 | |
|   CS.flush();
 | |
|   return Comment;
 | |
| }
 | |
| 
 | |
| /// Returns string representation of scheduler comment
 | |
| std::string TargetSubtargetInfo::getSchedInfoStr(const MachineInstr &MI) const {
 | |
|   if (MI.isPseudo() || MI.isTerminator())
 | |
|     return std::string();
 | |
|   // We don't cache TSchedModel because it depends on TargetInstrInfo
 | |
|   // that could be changed during the compilation
 | |
|   TargetSchedModel TSchedModel;
 | |
|   TSchedModel.init(this);
 | |
|   unsigned Latency = TSchedModel.computeInstrLatency(&MI);
 | |
|   double RThroughput = TSchedModel.computeReciprocalThroughput(&MI);
 | |
|   return createSchedInfoStr(Latency, RThroughput);
 | |
| }
 | |
| 
 | |
| /// Returns string representation of scheduler comment
 | |
| std::string TargetSubtargetInfo::getSchedInfoStr(MCInst const &MCI) const {
 | |
|   // We don't cache TSchedModel because it depends on TargetInstrInfo
 | |
|   // that could be changed during the compilation
 | |
|   TargetSchedModel TSchedModel;
 | |
|   TSchedModel.init(this);
 | |
|   unsigned Latency;
 | |
|   if (TSchedModel.hasInstrSchedModel())
 | |
|     Latency = TSchedModel.computeInstrLatency(MCI);
 | |
|   else if (TSchedModel.hasInstrItineraries()) {
 | |
|     auto *ItinData = TSchedModel.getInstrItineraries();
 | |
|     Latency = ItinData->getStageLatency(
 | |
|         getInstrInfo()->get(MCI.getOpcode()).getSchedClass());
 | |
|   } else
 | |
|     return std::string();
 | |
|   double RThroughput = TSchedModel.computeReciprocalThroughput(MCI);
 | |
|   return createSchedInfoStr(Latency, RThroughput);
 | |
| }
 | |
| 
 | |
| void TargetSubtargetInfo::mirFileLoaded(MachineFunction &MF) const {
 | |
| }
 |