/home/runner/work/DirectXShaderCompiler/DirectXShaderCompiler/include/llvm/MC/MCSubtargetInfo.h
Line | Count | Source (jump to first uncovered line) |
1 | | //==-- llvm/MC/MCSubtargetInfo.h - 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 describes the subtarget options of a Target machine. |
11 | | // |
12 | | //===----------------------------------------------------------------------===// |
13 | | |
14 | | #ifndef LLVM_MC_MCSUBTARGETINFO_H |
15 | | #define LLVM_MC_MCSUBTARGETINFO_H |
16 | | |
17 | | #include "llvm/MC/MCInstrItineraries.h" |
18 | | #include "llvm/MC/SubtargetFeature.h" |
19 | | #include <string> |
20 | | |
21 | | namespace llvm { |
22 | | |
23 | | class StringRef; |
24 | | // // |
25 | | /////////////////////////////////////////////////////////////////////////////// |
26 | | /// |
27 | | /// MCSubtargetInfo - Generic base class for all target subtargets. |
28 | | /// |
29 | | class MCSubtargetInfo { |
30 | | Triple TargetTriple; // Target triple |
31 | | std::string CPU; // CPU being targeted. |
32 | | ArrayRef<SubtargetFeatureKV> ProcFeatures; // Processor feature list |
33 | | ArrayRef<SubtargetFeatureKV> ProcDesc; // Processor descriptions |
34 | | |
35 | | // Scheduler machine model |
36 | | const SubtargetInfoKV *ProcSchedModels; |
37 | | const MCWriteProcResEntry *WriteProcResTable; |
38 | | const MCWriteLatencyEntry *WriteLatencyTable; |
39 | | const MCReadAdvanceEntry *ReadAdvanceTable; |
40 | | const MCSchedModel *CPUSchedModel; |
41 | | |
42 | | const InstrStage *Stages; // Instruction itinerary stages |
43 | | const unsigned *OperandCycles; // Itinerary operand cycles |
44 | | const unsigned *ForwardingPaths; // Forwarding paths |
45 | | FeatureBitset FeatureBits; // Feature bits for current CPU + FS |
46 | | |
47 | | MCSubtargetInfo() = delete; |
48 | | MCSubtargetInfo &operator=(MCSubtargetInfo &&) = delete; |
49 | | MCSubtargetInfo &operator=(const MCSubtargetInfo &) = delete; |
50 | | |
51 | | public: |
52 | | MCSubtargetInfo(const MCSubtargetInfo &) = default; |
53 | | MCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS, |
54 | | ArrayRef<SubtargetFeatureKV> PF, |
55 | | ArrayRef<SubtargetFeatureKV> PD, |
56 | | const SubtargetInfoKV *ProcSched, |
57 | | const MCWriteProcResEntry *WPR, const MCWriteLatencyEntry *WL, |
58 | | const MCReadAdvanceEntry *RA, const InstrStage *IS, |
59 | | const unsigned *OC, const unsigned *FP); |
60 | | |
61 | | /// getTargetTriple - Return the target triple string. |
62 | 0 | const Triple &getTargetTriple() const { return TargetTriple; } |
63 | | |
64 | | /// getCPU - Return the CPU string. |
65 | 0 | StringRef getCPU() const { |
66 | 0 | return CPU; |
67 | 0 | } |
68 | | |
69 | | /// getFeatureBits - Return the feature bits. |
70 | | /// |
71 | 0 | const FeatureBitset& getFeatureBits() const { |
72 | 0 | return FeatureBits; |
73 | 0 | } |
74 | | |
75 | | /// setFeatureBits - Set the feature bits. |
76 | | /// |
77 | 0 | void setFeatureBits(const FeatureBitset &FeatureBits_) { |
78 | 0 | FeatureBits = FeatureBits_; |
79 | 0 | } |
80 | | |
81 | | protected: |
82 | | /// Initialize the scheduling model and feature bits. |
83 | | /// |
84 | | /// FIXME: Find a way to stick this in the constructor, since it should only |
85 | | /// be called during initialization. |
86 | | void InitMCProcessorInfo(StringRef CPU, StringRef FS); |
87 | | |
88 | | public: |
89 | | /// Set the features to the default for the given CPU. |
90 | | void setDefaultFeatures(StringRef CPU); |
91 | | |
92 | | /// ToggleFeature - Toggle a feature and returns the re-computed feature |
93 | | /// bits. This version does not change the implied bits. |
94 | | FeatureBitset ToggleFeature(uint64_t FB); |
95 | | |
96 | | /// ToggleFeature - Toggle a feature and returns the re-computed feature |
97 | | /// bits. This version does not change the implied bits. |
98 | | FeatureBitset ToggleFeature(const FeatureBitset& FB); |
99 | | |
100 | | /// ToggleFeature - Toggle a set of features and returns the re-computed |
101 | | /// feature bits. This version will also change all implied bits. |
102 | | FeatureBitset ToggleFeature(StringRef FS); |
103 | | |
104 | | /// Apply a feature flag and return the re-computed feature bits, including |
105 | | /// all feature bits implied by the flag. |
106 | | FeatureBitset ApplyFeatureFlag(StringRef FS); |
107 | | |
108 | | /// getSchedModelForCPU - Get the machine model of a CPU. |
109 | | /// |
110 | | const MCSchedModel &getSchedModelForCPU(StringRef CPU) const; |
111 | | |
112 | | /// Get the machine model for this subtarget's CPU. |
113 | 0 | const MCSchedModel &getSchedModel() const { return *CPUSchedModel; } |
114 | | |
115 | | /// Return an iterator at the first process resource consumed by the given |
116 | | /// scheduling class. |
117 | | const MCWriteProcResEntry *getWriteProcResBegin( |
118 | 0 | const MCSchedClassDesc *SC) const { |
119 | 0 | return &WriteProcResTable[SC->WriteProcResIdx]; |
120 | 0 | } |
121 | | const MCWriteProcResEntry *getWriteProcResEnd( |
122 | 0 | const MCSchedClassDesc *SC) const { |
123 | 0 | return getWriteProcResBegin(SC) + SC->NumWriteProcResEntries; |
124 | 0 | } |
125 | | |
126 | | const MCWriteLatencyEntry *getWriteLatencyEntry(const MCSchedClassDesc *SC, |
127 | 0 | unsigned DefIdx) const { |
128 | 0 | assert(DefIdx < SC->NumWriteLatencyEntries && |
129 | 0 | "MachineModel does not specify a WriteResource for DefIdx"); |
130 | 0 |
|
131 | 0 | return &WriteLatencyTable[SC->WriteLatencyIdx + DefIdx]; |
132 | 0 | } |
133 | | |
134 | | int getReadAdvanceCycles(const MCSchedClassDesc *SC, unsigned UseIdx, |
135 | 0 | unsigned WriteResID) const { |
136 | 0 | // TODO: The number of read advance entries in a class can be significant |
137 | 0 | // (~50). Consider compressing the WriteID into a dense ID of those that are |
138 | 0 | // used by ReadAdvance and representing them as a bitset. |
139 | 0 | for (const MCReadAdvanceEntry *I = &ReadAdvanceTable[SC->ReadAdvanceIdx], |
140 | 0 | *E = I + SC->NumReadAdvanceEntries; I != E; ++I) { |
141 | 0 | if (I->UseIdx < UseIdx) |
142 | 0 | continue; |
143 | 0 | if (I->UseIdx > UseIdx) |
144 | 0 | break; |
145 | 0 | // Find the first WriteResIdx match, which has the highest cycle count. |
146 | 0 | if (!I->WriteResourceID || I->WriteResourceID == WriteResID) { |
147 | 0 | return I->Cycles; |
148 | 0 | } |
149 | 0 | } |
150 | 0 | return 0; |
151 | 0 | } |
152 | | |
153 | | /// getInstrItineraryForCPU - Get scheduling itinerary of a CPU. |
154 | | /// |
155 | | InstrItineraryData getInstrItineraryForCPU(StringRef CPU) const; |
156 | | |
157 | | /// Initialize an InstrItineraryData instance. |
158 | | void initInstrItins(InstrItineraryData &InstrItins) const; |
159 | | |
160 | | /// Check whether the CPU string is valid. |
161 | 0 | bool isCPUStringValid(StringRef CPU) const { |
162 | 0 | auto Found = std::find_if(ProcDesc.begin(), ProcDesc.end(), |
163 | 0 | [=](const SubtargetFeatureKV &KV) { |
164 | 0 | return CPU == KV.Key; |
165 | 0 | }); |
166 | 0 | return Found != ProcDesc.end(); |
167 | 0 | } |
168 | | }; |
169 | | |
170 | | } // End llvm namespace |
171 | | |
172 | | #endif |