LLVM 23.0.0git
MCSubtargetInfo.cpp
Go to the documentation of this file.
1//===- MCSubtargetInfo.cpp - Subtarget Information ------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10#include "llvm/ADT/ArrayRef.h"
11#include "llvm/ADT/StringRef.h"
12#include "llvm/ADT/Twine.h"
14#include "llvm/MC/MCSchedule.h"
15#include "llvm/Support/Format.h"
18#include <algorithm>
19#include <cassert>
20#include <cstring>
21#include <optional>
22
23using namespace llvm;
24
25/// Find KV in array using binary search.
26template <typename T>
27static const T *Find(StringRef S, ArrayRef<T> A) {
28 // Binary search the array
29 auto F = llvm::lower_bound(A, S);
30 // If not found then return NULL
31 if (F == A.end() || StringRef(F->key()) != S)
32 return nullptr;
33 // Return the found array item
34 return F;
35}
36
37/// For each feature that is (transitively) implied by this feature, set it.
38static void SetImpliedBits(FeatureBitset &Bits, FeatureBitset Implies,
39 ArrayRef<SubtargetFeatureKV> FeatureTable) {
40 // Transitively set all features implied. We don't assume that the features in
41 // Bits have already had their implied features set.
42 FeatureBitset NewBits = Implies;
43 while (Implies.any()) {
44 FeatureBitset Implied;
45 for (const SubtargetFeatureKV &FE : FeatureTable) {
46 if (Implies.test(FE.Value))
47 Implied |= FE.Implies.getAsBitset();
48 }
49
50 // Only continue for bits that haven't been set yet.
51 Implies = Implied & ~NewBits;
52 NewBits |= Implies;
53 }
54 Bits |= NewBits;
55}
56
57/// For each feature that (transitively) implies this feature, clear it.
58static
60 ArrayRef<SubtargetFeatureKV> FeatureTable) {
61 for (const SubtargetFeatureKV &FE : FeatureTable) {
62 if (FE.Implies.getAsBitset().test(Value)) {
63 Bits.reset(FE.Value);
64 ClearImpliedBits(Bits, FE.Value, FeatureTable);
65 }
66 }
67}
68
69static void ApplyFeatureFlag(FeatureBitset &Bits, StringRef Feature,
70 ArrayRef<SubtargetFeatureKV> FeatureTable) {
72 "Feature flags should start with '+' or '-'");
73
74 // Find feature in table.
75 const SubtargetFeatureKV *FeatureEntry =
76 Find(SubtargetFeatures::StripFlag(Feature), FeatureTable);
77 // If there is a match
78 if (FeatureEntry) {
79 // Enable/disable feature in bits
80 if (SubtargetFeatures::isEnabled(Feature)) {
81 Bits.set(FeatureEntry->Value);
82
83 // For each feature that this implies, set it.
84 SetImpliedBits(Bits, FeatureEntry->Implies.getAsBitset(), FeatureTable);
85 } else {
86 Bits.reset(FeatureEntry->Value);
87
88 // For each feature that implies this, clear it.
89 ClearImpliedBits(Bits, FeatureEntry->Value, FeatureTable);
90 }
91 } else {
92 errs() << "'" << Feature << "' is not a recognized feature for this target"
93 << " (ignoring feature)\n";
94 }
95}
96
97/// Return the length of the longest entry in the table.
99 size_t MaxLen = 0;
100 for (auto &I : Table)
101 MaxLen = std::max(MaxLen, std::strlen(I.key()));
102 return MaxLen;
103}
104
105static size_t getLongestEntryLength(StringTable Table) {
106 size_t MaxLen = 0;
107 for (StringRef I : Table)
108 MaxLen = std::max(MaxLen, I.size());
109 return MaxLen;
110}
111
112/// Display help for feature and mcpu choices.
113static void Help(StringTable CPUNames, ArrayRef<SubtargetFeatureKV> FeatTable) {
114 // the static variable ensures that the help information only gets
115 // printed once even though a target machine creates multiple subtargets
116 static bool PrintOnce = false;
117 if (PrintOnce) {
118 return;
119 }
120
121 // Determine the length of the longest CPU and Feature entries.
122 unsigned MaxCPULen = getLongestEntryLength(CPUNames);
123 unsigned MaxFeatLen = getLongestEntryLength(FeatTable);
124
125 // Print the CPU table.
126 errs() << "Available CPUs for this target:\n\n";
127 for (auto &CPUName : drop_begin(CPUNames)) {
128 // Skip apple-latest, as that's only meant to be used in
129 // disassemblers/debuggers, and we don't want normal code to be built with
130 // it as an -mcpu=
131 if (CPUName == "apple-latest")
132 continue;
133 errs() << format(" %-*s - Select the %s processor.\n", MaxCPULen,
134 CPUName.str().c_str(), CPUName.str().c_str());
135 }
136 errs() << '\n';
137
138 // Print the Feature table.
139 errs() << "Available features for this target:\n\n";
140 for (auto &Feature : FeatTable)
141 errs() << format(" %-*s - %s.\n", MaxFeatLen, Feature.key(),
142 Feature.desc());
143 errs() << '\n';
144
145 errs() << "Use +feature to enable a feature, or -feature to disable it.\n"
146 "For example, llc -mcpu=mycpu -mattr=+feature1,-feature2\n";
147
148 PrintOnce = true;
149}
150
151/// Display help for mcpu choices only
152static void cpuHelp(StringTable CPUNames) {
153 // the static variable ensures that the help information only gets
154 // printed once even though a target machine creates multiple subtargets
155 static bool PrintOnce = false;
156 if (PrintOnce) {
157 return;
158 }
159
160 // Print the CPU table.
161 errs() << "Available CPUs for this target:\n\n";
162 for (auto &CPU : llvm::drop_begin(CPUNames)) {
163 // Skip apple-latest, as that's only meant to be used in
164 // disassemblers/debuggers, and we don't want normal code to be built with
165 // it as an -mcpu=
166 if (CPU == "apple-latest")
167 continue;
168 errs() << "\t" << CPU << "\n";
169 }
170 errs() << '\n';
171
172 errs() << "Use -mcpu or -mtune to specify the target's processor.\n"
173 "For example, clang --target=aarch64-unknown-linux-gnu "
174 "-mcpu=cortex-a35\n";
175
176 PrintOnce = true;
177}
178
180 StringRef TuneCPU, StringRef FS,
181 StringTable ProcNames,
183 ArrayRef<SubtargetFeatureKV> ProcFeatures) {
184 SubtargetFeatures Features(FS);
185
186 if (ProcDesc.empty() || ProcFeatures.empty())
187 return FeatureBitset();
188
189 assert(llvm::is_sorted(ProcDesc) && "CPU table is not sorted");
190 assert(llvm::is_sorted(ProcFeatures) && "CPU features table is not sorted");
191 // Resulting bits
192 FeatureBitset Bits;
193
194 // Check if help is needed
195 if (CPU == "help")
196 Help(ProcNames, ProcFeatures);
197
198 // Find CPU entry if CPU name is specified.
199 else if (!CPU.empty()) {
200 const SubtargetSubTypeKV *CPUEntry = Find(CPU, ProcDesc);
201
202 // If there is a match
203 if (CPUEntry) {
204 // Set the features implied by this CPU feature, if any.
205 SetImpliedBits(Bits, CPUEntry->Implies.getAsBitset(), ProcFeatures);
206 } else {
207 errs() << "'" << CPU << "' is not a recognized processor for this target"
208 << " (ignoring processor)\n";
209 }
210 }
211
212 if (!TuneCPU.empty()) {
213 const SubtargetSubTypeKV *CPUEntry = Find(TuneCPU, ProcDesc);
214
215 // If there is a match
216 if (CPUEntry) {
217 // Set the features implied by this CPU feature, if any.
218 SetImpliedBits(Bits, CPUEntry->TuneImplies.getAsBitset(), ProcFeatures);
219 } else if (TuneCPU != CPU) {
220 errs() << "'" << TuneCPU << "' is not a recognized processor for this "
221 << "target (ignoring processor)\n";
222 }
223 }
224
225 // Iterate through each feature
226 for (const std::string &Feature : Features.getFeatures()) {
227 // Check for help
228 if (Feature == "+help")
229 Help(ProcNames, ProcFeatures);
230 else if (Feature == "+cpuhelp")
231 cpuHelp(ProcNames);
232 else
233 ApplyFeatureFlag(Bits, Feature, ProcFeatures);
234 }
235
236 return Bits;
237}
238
240 StringRef FS) {
241 FeatureBits =
242 getFeatures(*this, CPU, TuneCPU, FS, ProcNames, ProcDesc, ProcFeatures);
243 FeatureString = std::string(FS);
244
245 if (!TuneCPU.empty())
246 CPUSchedModel = &getSchedModelForCPU(TuneCPU);
247 else
248 CPUSchedModel = &MCSchedModel::Default;
249}
250
252 StringRef FS) {
253 FeatureBits =
254 getFeatures(*this, CPU, TuneCPU, FS, ProcNames, ProcDesc, ProcFeatures);
255 FeatureString = std::string(FS);
256}
257
259 const Triple &TT, StringRef C, StringRef TC, StringRef FS, StringTable PN,
261 const MCSchedModel *PSM, const MCWriteProcResEntry *WPR,
262 const MCWriteLatencyEntry *WL, const MCReadAdvanceEntry *RA,
263 const InstrStage *IS, const unsigned *OC, const unsigned *FP)
264 : TargetTriple(TT), CPU(std::string(C)), TuneCPU(std::string(TC)),
265 ProcNames(PN), ProcFeatures(PF), ProcDesc(PD), ProcSchedModels(PSM),
266 WriteProcResTable(WPR), WriteLatencyTable(WL), ReadAdvanceTable(RA),
267 Stages(IS), OperandCycles(OC), ForwardingPaths(FP) {
268 InitMCProcessorInfo(CPU, TuneCPU, FS);
269}
270
272 FeatureBits.flip(FB);
273 return FeatureBits;
274}
275
277 FeatureBits ^= FB;
278 return FeatureBits;
279}
280
281const FeatureBitset &
283 SetImpliedBits(FeatureBits, FB, ProcFeatures);
284 return FeatureBits;
285}
286
287const FeatureBitset &
289 for (unsigned I = 0, E = FB.size(); I < E; I++) {
290 if (FB[I]) {
291 FeatureBits.reset(I);
292 ClearImpliedBits(FeatureBits, I, ProcFeatures);
293 }
294 }
295 return FeatureBits;
296}
297
299 // Find feature in table.
300 const SubtargetFeatureKV *FeatureEntry =
301 Find(SubtargetFeatures::StripFlag(Feature), ProcFeatures);
302 // If there is a match
303 if (FeatureEntry) {
304 if (FeatureBits.test(FeatureEntry->Value)) {
305 FeatureBits.reset(FeatureEntry->Value);
306 // For each feature that implies this, clear it.
307 ClearImpliedBits(FeatureBits, FeatureEntry->Value, ProcFeatures);
308 } else {
309 FeatureBits.set(FeatureEntry->Value);
310
311 // For each feature that this implies, set it.
312 SetImpliedBits(FeatureBits, FeatureEntry->Implies.getAsBitset(),
313 ProcFeatures);
314 }
315 } else {
316 errs() << "'" << Feature << "' is not a recognized feature for this target"
317 << " (ignoring feature)\n";
318 }
319
320 return FeatureBits;
321}
322
324 ::ApplyFeatureFlag(FeatureBits, FS, ProcFeatures);
325 return FeatureBits;
326}
327
330 return all_of(T.getFeatures(), [this](const std::string &F) {
331 assert(SubtargetFeatures::hasFlag(F) &&
332 "Feature flags should start with '+' or '-'");
333 const SubtargetFeatureKV *FeatureEntry =
334 Find(SubtargetFeatures::StripFlag(F), ProcFeatures);
335 if (!FeatureEntry) {
336 reportFatalInternalError(Twine("'") + F +
337 "' is not a recognized feature for this target");
338 }
339
340 return FeatureBits.test(FeatureEntry->Value) ==
342 });
343}
344
345static bool hasFeature(StringRef Feature, const FeatureBitset &FeatureBits,
346 ArrayRef<SubtargetFeatureKV> ProcFeatures) {
347 bool ShouldBeEnabled = true;
348 if (!Feature.consume_front("+") && Feature.consume_front("-"))
349 ShouldBeEnabled = false;
350
351 const SubtargetFeatureKV *FeatureEntry = Find(Feature, ProcFeatures);
352 if (!FeatureEntry) {
353 reportFatalInternalError(Twine("'") + Feature +
354 "' is not a recognized feature for this target");
355 }
356
357 return FeatureBits.test(FeatureEntry->Value) == ShouldBeEnabled;
358}
359
360namespace {
361class FeatureExpressionParser {
362 StringRef Expr;
363 const FeatureBitset &FeatureBits;
364 ArrayRef<SubtargetFeatureKV> ProcFeatures;
365 size_t Pos = 0;
366
367public:
368 FeatureExpressionParser(StringRef Expr, const FeatureBitset &FeatureBits,
369 ArrayRef<SubtargetFeatureKV> ProcFeatures)
370 : Expr(Expr), FeatureBits(FeatureBits), ProcFeatures(ProcFeatures) {}
371
372 bool parse() {
373 bool Result = parseOr();
374 if (Pos != Expr.size())
375 reportFatalInternalError("malformed target feature expression");
376 return Result;
377 }
378
379private:
380 bool consume(char C) {
381 if (Pos == Expr.size() || Expr[Pos] != C)
382 return false;
383 ++Pos;
384 return true;
385 }
386
387 bool parseOr() {
388 bool Result = parseAnd();
389 while (consume('|')) {
390 bool RHS = parseAnd();
391 Result |= RHS;
392 }
393 return Result;
394 }
395
396 bool parseAnd() {
397 bool Result = parsePrimary();
398 while (consume(',')) {
399 bool RHS = parsePrimary();
400 Result &= RHS;
401 }
402 return Result;
403 }
404
405 bool parsePrimary() {
406 if (consume('(')) {
407 bool Result = parseOr();
408 if (!consume(')'))
409 reportFatalInternalError("malformed target feature expression");
410 return Result;
411 }
412
413 size_t Start = Pos;
414 Pos = Expr.find_first_of(",|()", Pos);
415 if (Pos == StringRef::npos)
416 Pos = Expr.size();
417
418 if (Start == Pos)
419 reportFatalInternalError("malformed target feature expression");
420
421 return hasFeature(Expr.slice(Start, Pos), FeatureBits, ProcFeatures);
422 }
423};
424} // namespace
425
427 if (FeatureExpr.empty())
428 return true;
429 if (FeatureExpr.contains(' ')) {
431 "spaces are not allowed in target feature expressions");
432 }
433 FeatureExpressionParser Parser(FeatureExpr, FeatureBits, ProcFeatures);
434 return Parser.parse();
435}
436
438 assert(llvm::is_sorted(ProcDesc) &&
439 "Processor machine model table is not sorted");
440
441 // Find entry
442 const SubtargetSubTypeKV *CPUEntry = Find(CPU, ProcDesc);
443
444 if (!CPUEntry) {
445 if (CPU != "help") // Don't error if the user asked for help.
446 errs() << "'" << CPU
447 << "' is not a recognized processor for this target"
448 << " (ignoring processor)\n";
450 }
451 return ProcSchedModels[CPUEntry->SchedModelIdx];
452}
453
456 const MCSchedModel &SchedModel = getSchedModelForCPU(CPU);
457 return InstrItineraryData(SchedModel, Stages, OperandCycles, ForwardingPaths);
458}
459
461 InstrItins = InstrItineraryData(getSchedModel(), Stages, OperandCycles,
462 ForwardingPaths);
463}
464
465std::vector<const SubtargetFeatureKV *>
467 std::vector<const SubtargetFeatureKV *> EnabledFeatures;
468 for (const SubtargetFeatureKV &FeatureKV : ProcFeatures)
469 if (FeatureBits.test(FeatureKV.Value))
470 EnabledFeatures.push_back(&FeatureKV);
471 return EnabledFeatures;
472}
473
474std::optional<unsigned> MCSubtargetInfo::getCacheSize(unsigned Level) const {
475 return std::nullopt;
476}
477
478std::optional<unsigned>
480 return std::nullopt;
481}
482
483std::optional<unsigned>
485 return std::nullopt;
486}
487
489 return 0;
490}
491
493 return UINT_MAX;
494}
495
497 return false;
498}
499
500unsigned MCSubtargetInfo::getMinPrefetchStride(unsigned NumMemAccesses,
501 unsigned NumStridedMemAccesses,
502 unsigned NumPrefetches,
503 bool HasCall) const {
504 return 1;
505}
506
508 return !AS;
509}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static llvm::Error parse(GsymDataExtractor &Data, uint64_t BaseAddr, LineEntryCallback const &Callback)
Definition LineTable.cpp:54
static void ApplyFeatureFlag(FeatureBitset &Bits, StringRef Feature, ArrayRef< SubtargetFeatureKV > FeatureTable)
static const T * Find(StringRef S, ArrayRef< T > A)
Find KV in array using binary search.
static void cpuHelp(StringTable CPUNames)
Display help for mcpu choices only.
static FeatureBitset getFeatures(MCSubtargetInfo &STI, StringRef CPU, StringRef TuneCPU, StringRef FS, StringTable ProcNames, ArrayRef< SubtargetSubTypeKV > ProcDesc, ArrayRef< SubtargetFeatureKV > ProcFeatures)
static bool hasFeature(StringRef Feature, const FeatureBitset &FeatureBits, ArrayRef< SubtargetFeatureKV > ProcFeatures)
static void Help(StringTable CPUNames, ArrayRef< SubtargetFeatureKV > FeatTable)
Display help for feature and mcpu choices.
static size_t getLongestEntryLength(ArrayRef< SubtargetFeatureKV > Table)
Return the length of the longest entry in the table.
static void SetImpliedBits(FeatureBitset &Bits, FeatureBitset Implies, ArrayRef< SubtargetFeatureKV > FeatureTable)
For each feature that is (transitively) implied by this feature, set it.
static void ClearImpliedBits(FeatureBitset &Bits, unsigned Value, ArrayRef< SubtargetFeatureKV > FeatureTable)
For each feature that (transitively) implies this feature, clear it.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define T
SI optimize exec mask operations pre RA
Value * RHS
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
const FeatureBitset & getAsBitset() const
Container class for subtarget features.
constexpr bool test(unsigned I) const
constexpr FeatureBitset & flip(unsigned I)
constexpr size_t size() const
Itinerary data supplied by a subtarget to be used by a target.
Generic base class for all target subtargets.
virtual unsigned getCacheLineSize() const
Return the target cache line size in bytes.
bool checkFeatures(StringRef FS) const
Check whether the subtarget features are enabled/disabled as per the provided string,...
virtual std::optional< unsigned > getCacheSize(unsigned Level) const
Return the cache size in bytes for the given level of cache.
virtual bool shouldPrefetchAddressSpace(unsigned AS) const
const MCSchedModel & getSchedModelForCPU(StringRef CPU) const
Get the machine model of a CPU.
std::vector< const SubtargetFeatureKV * > getEnabledProcessorFeatures() const
Return the list of processor features currently enabled.
virtual unsigned getMinPrefetchStride(unsigned NumMemAccesses, unsigned NumStridedMemAccesses, unsigned NumPrefetches, bool HasCall) const
Return the minimum stride necessary to trigger software prefetching.
virtual bool enableWritePrefetching() const
virtual unsigned getMaxPrefetchIterationsAhead() const
Return the maximum prefetch distance in terms of loop iterations.
const FeatureBitset & ToggleFeature(uint64_t FB)
Toggle a feature and return the re-computed feature bits.
virtual unsigned getPrefetchDistance() const
Return the preferred prefetch distance in terms of instructions.
virtual std::optional< unsigned > getCacheAssociativity(unsigned Level) const
Return the cache associatvity for the given level of cache.
InstrItineraryData getInstrItineraryForCPU(StringRef CPU) const
Get scheduling itinerary of a CPU.
const FeatureBitset & ApplyFeatureFlag(StringRef FS)
Apply a feature flag and return the re-computed feature bits, including all feature bits implied by t...
void setDefaultFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS)
Set the features to the default for the given CPU and TuneCPU, with ano appended feature string.
void InitMCProcessorInfo(StringRef CPU, StringRef TuneCPU, StringRef FS)
Initialize the scheduling model and feature bits.
const FeatureBitset & ClearFeatureBitsTransitively(const FeatureBitset &FB)
bool checkFeatureExpression(StringRef FeatureExpr) const
Check whether the current subtarget satisfies a target feature expression.
void initInstrItins(InstrItineraryData &InstrItins) const
Initialize an InstrItineraryData instance.
const MCSchedModel & getSchedModel() const
Get the machine model for this subtarget's CPU.
const FeatureBitset & SetFeatureBitsTransitively(const FeatureBitset &FB)
Set/clear additional feature bits, including all other bits they imply.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
static constexpr size_t npos
Definition StringRef.h:58
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
StringRef slice(size_t Start, size_t End) const
Return a reference to the substring from [Start, End).
Definition StringRef.h:720
constexpr size_t size() const
Get the string size.
Definition StringRef.h:144
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
Definition StringRef.h:446
size_t find_first_of(char C, size_t From=0) const
Find the first character in the string that is C, or npos if not found.
Definition StringRef.h:396
bool consume_front(char Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
Definition StringRef.h:661
A table of densely packed, null-terminated strings indexed by offset.
Definition StringTable.h:34
Manages the enabling and disabling of subtarget specific features.
const std::vector< std::string > & getFeatures() const
Returns the vector of individual subtarget features.
static bool hasFlag(StringRef Feature)
Determine if a feature has a flag; '+' or '-'.
static StringRef StripFlag(StringRef Feature)
Return string stripped of flag.
static bool isEnabled(StringRef Feature)
Return true if enable flag; '+'.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
LLVM Value Representation.
Definition Value.h:75
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:315
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
LLVM_ABI void reportFatalInternalError(Error Err)
Report a fatal error that indicates a bug in LLVM.
Definition Error.cpp:173
bool is_sorted(R &&Range, Compare C)
Wrapper function around std::is_sorted to check if elements in a range R are sorted with respect to a...
Definition STLExtras.h:1970
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition Format.h:94
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
Definition STLExtras.h:2052
ArrayRef(const T &OneElt) -> ArrayRef< T >
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:860
These values represent a non-pipelined step in the execution of an instruction.
Specify the number of cycles allowed after instruction issue before a particular use operand reads it...
Definition MCSchedule.h:114
Machine model for scheduling, bundling, and heuristics.
Definition MCSchedule.h:264
static LLVM_ABI const MCSchedModel Default
Returns the default initialized model.
Definition MCSchedule.h:435
Specify the latency in cpu cycles for a particular scheduling class and def index.
Definition MCSchedule.h:97
Identify one of the processor resource kinds consumed by a particular scheduling class for the specif...
Definition MCSchedule.h:74
Used to provide key value pairs for feature and CPU bit flags.
unsigned Value
K-V integer value.
FeatureBitArray Implies
K-V bit mask.
Used to provide key value pairs for feature and CPU bit flags.
FeatureBitArray Implies
K-V bit mask.
FeatureBitArray TuneImplies
K-V bit mask.