1 //===- InstrInfoEmitter.cpp - Generate a Instruction Set Desc. --*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This tablegen backend is responsible for emitting a description of the target
10 // instruction set for the code generator.
12 //===----------------------------------------------------------------------===//
14 #include "CodeGenDAGPatterns.h"
15 #include "CodeGenInstruction.h"
16 #include "CodeGenSchedule.h"
17 #include "CodeGenTarget.h"
18 #include "PredicateExpander.h"
19 #include "SequenceToOffsetTable.h"
20 #include "SubtargetFeatureInfo.h"
21 #include "TableGenBackends.h"
23 #include "llvm/ADT/ArrayRef.h"
24 #include "llvm/ADT/STLExtras.h"
25 #include "llvm/ADT/SmallVector.h"
26 #include "llvm/ADT/StringExtras.h"
27 #include "llvm/Support/Casting.h"
28 #include "llvm/Support/raw_ostream.h"
29 #include "llvm/TableGen/Error.h"
30 #include "llvm/TableGen/Record.h"
31 #include "llvm/TableGen/TableGenBackend.h"
42 cl::OptionCategory
InstrInfoEmitterCat("Options for -gen-instr-info");
43 static cl::opt
<bool> ExpandMIOperandInfo(
44 "instr-info-expand-mi-operand-info",
45 cl::desc("Expand operand's MIOperandInfo DAG into suboperands"),
46 cl::cat(InstrInfoEmitterCat
), cl::init(true));
50 class InstrInfoEmitter
{
51 RecordKeeper
&Records
;
52 CodeGenDAGPatterns CDP
;
53 const CodeGenSchedModels
&SchedModels
;
56 InstrInfoEmitter(RecordKeeper
&R
):
57 Records(R
), CDP(R
), SchedModels(CDP
.getTargetInfo().getSchedModels()) {}
59 // run - Output the instruction set description.
60 void run(raw_ostream
&OS
);
63 void emitEnums(raw_ostream
&OS
);
65 typedef std::vector
<std::string
> OperandInfoTy
;
66 typedef std::vector
<OperandInfoTy
> OperandInfoListTy
;
67 typedef std::map
<OperandInfoTy
, unsigned> OperandInfoMapTy
;
69 /// The keys of this map are maps which have OpName enum values as their keys
70 /// and instruction operand indices as their values. The values of this map
71 /// are lists of instruction names.
72 typedef std::map
<std::map
<unsigned, unsigned>,
73 std::vector
<std::string
>> OpNameMapTy
;
74 typedef std::map
<std::string
, unsigned>::iterator StrUintMapIter
;
76 /// Generate member functions in the target-specific GenInstrInfo class.
78 /// This method is used to custom expand TIIPredicate definitions.
79 /// See file llvm/Target/TargetInstPredicates.td for a description of what is
80 /// a TIIPredicate and how to use it.
81 void emitTIIHelperMethods(raw_ostream
&OS
, StringRef TargetName
,
82 bool ExpandDefinition
= true);
84 /// Expand TIIPredicate definitions to functions that accept a const MCInst
86 void emitMCIIHelperMethods(raw_ostream
&OS
, StringRef TargetName
);
88 /// Write verifyInstructionPredicates methods.
89 void emitFeatureVerifier(raw_ostream
&OS
, const CodeGenTarget
&Target
);
90 void emitRecord(const CodeGenInstruction
&Inst
, unsigned Num
,
92 std::map
<std::vector
<Record
*>, unsigned> &EL
,
93 const OperandInfoMapTy
&OperandInfo
, raw_ostream
&OS
);
94 void emitOperandTypeMappings(
95 raw_ostream
&OS
, const CodeGenTarget
&Target
,
96 ArrayRef
<const CodeGenInstruction
*> NumberedInstructions
);
97 void initOperandMapData(
98 ArrayRef
<const CodeGenInstruction
*> NumberedInstructions
,
100 std::map
<std::string
, unsigned> &Operands
,
101 OpNameMapTy
&OperandMap
);
102 void emitOperandNameMappings(raw_ostream
&OS
, const CodeGenTarget
&Target
,
103 ArrayRef
<const CodeGenInstruction
*> NumberedInstructions
);
105 void emitLogicalOperandSizeMappings(
106 raw_ostream
&OS
, StringRef Namespace
,
107 ArrayRef
<const CodeGenInstruction
*> NumberedInstructions
);
108 void emitLogicalOperandTypeMappings(
109 raw_ostream
&OS
, StringRef Namespace
,
110 ArrayRef
<const CodeGenInstruction
*> NumberedInstructions
);
112 // Operand information.
113 unsigned CollectOperandInfo(OperandInfoListTy
&OperandInfoList
,
114 OperandInfoMapTy
&OperandInfoMap
);
115 void EmitOperandInfo(raw_ostream
&OS
, OperandInfoListTy
&OperandInfoList
);
116 OperandInfoTy
GetOperandInfo(const CodeGenInstruction
&Inst
);
119 } // end anonymous namespace
121 //===----------------------------------------------------------------------===//
122 // Operand Info Emission.
123 //===----------------------------------------------------------------------===//
125 InstrInfoEmitter::OperandInfoTy
126 InstrInfoEmitter::GetOperandInfo(const CodeGenInstruction
&Inst
) {
127 OperandInfoTy Result
;
129 for (auto &Op
: Inst
.Operands
) {
130 // Handle aggregate operands and normal operands the same way by expanding
131 // either case into a list of operands for this op.
132 std::vector
<CGIOperandList::OperandInfo
> OperandList
;
134 // This might be a multiple operand thing. Targets like X86 have
135 // registers in their multi-operand operands. It may also be an anonymous
136 // operand, which has a single operand, but no declared class for the
138 DagInit
*MIOI
= Op
.MIOperandInfo
;
140 if (!MIOI
|| MIOI
->getNumArgs() == 0) {
141 // Single, anonymous, operand.
142 OperandList
.push_back(Op
);
144 for (unsigned j
= 0, e
= Op
.MINumOperands
; j
!= e
; ++j
) {
145 OperandList
.push_back(Op
);
147 auto *OpR
= cast
<DefInit
>(MIOI
->getArg(j
))->getDef();
148 OperandList
.back().Rec
= OpR
;
152 for (unsigned j
= 0, e
= OperandList
.size(); j
!= e
; ++j
) {
153 Record
*OpR
= OperandList
[j
].Rec
;
156 if (OpR
->isSubClassOf("RegisterOperand"))
157 OpR
= OpR
->getValueAsDef("RegClass");
158 if (OpR
->isSubClassOf("RegisterClass"))
159 Res
+= getQualifiedName(OpR
) + "RegClassID, ";
160 else if (OpR
->isSubClassOf("PointerLikeRegClass"))
161 Res
+= utostr(OpR
->getValueAsInt("RegClassKind")) + ", ";
163 // -1 means the operand does not have a fixed register class.
166 // Fill in applicable flags.
169 // Ptr value whose register class is resolved via callback.
170 if (OpR
->isSubClassOf("PointerLikeRegClass"))
171 Res
+= "|(1<<MCOI::LookupPtrRegClass)";
173 // Predicate operands. Check to see if the original unexpanded operand
174 // was of type PredicateOp.
175 if (Op
.Rec
->isSubClassOf("PredicateOp"))
176 Res
+= "|(1<<MCOI::Predicate)";
178 // Optional def operands. Check to see if the original unexpanded operand
179 // was of type OptionalDefOperand.
180 if (Op
.Rec
->isSubClassOf("OptionalDefOperand"))
181 Res
+= "|(1<<MCOI::OptionalDef)";
183 // Branch target operands. Check to see if the original unexpanded
184 // operand was of type BranchTargetOperand.
185 if (Op
.Rec
->isSubClassOf("BranchTargetOperand"))
186 Res
+= "|(1<<MCOI::BranchTarget)";
188 // Fill in operand type.
190 assert(!Op
.OperandType
.empty() && "Invalid operand type.");
191 Res
+= Op
.OperandType
;
193 // Fill in constraint info.
196 const CGIOperandList::ConstraintInfo
&Constraint
=
198 if (Constraint
.isNone())
200 else if (Constraint
.isEarlyClobber())
201 Res
+= "MCOI_EARLY_CLOBBER";
203 assert(Constraint
.isTied());
204 Res
+= "MCOI_TIED_TO(" + utostr(Constraint
.getTiedOperand()) + ")";
207 Result
.push_back(Res
);
215 InstrInfoEmitter::CollectOperandInfo(OperandInfoListTy
&OperandInfoList
,
216 OperandInfoMapTy
&OperandInfoMap
) {
217 const CodeGenTarget
&Target
= CDP
.getTargetInfo();
219 for (const CodeGenInstruction
*Inst
: Target
.getInstructionsByEnumValue()) {
220 OperandInfoTy OperandInfo
= GetOperandInfo(*Inst
);
221 if (OperandInfoMap
.insert({OperandInfo
, Offset
}).second
) {
222 OperandInfoList
.push_back(OperandInfo
);
223 Offset
+= OperandInfo
.size();
229 void InstrInfoEmitter::EmitOperandInfo(raw_ostream
&OS
,
230 OperandInfoListTy
&OperandInfoList
) {
232 for (auto &OperandInfo
: OperandInfoList
) {
233 OS
<< " /* " << Offset
<< " */";
234 for (auto &Info
: OperandInfo
)
235 OS
<< " { " << Info
<< " },";
237 Offset
+= OperandInfo
.size();
241 /// Initialize data structures for generating operand name mappings.
243 /// \param Operands [out] A map used to generate the OpName enum with operand
244 /// names as its keys and operand enum values as its values.
245 /// \param OperandMap [out] A map for representing the operand name mappings for
246 /// each instructions. This is used to generate the OperandMap table as
247 /// well as the getNamedOperandIdx() function.
248 void InstrInfoEmitter::initOperandMapData(
249 ArrayRef
<const CodeGenInstruction
*> NumberedInstructions
,
251 std::map
<std::string
, unsigned> &Operands
,
252 OpNameMapTy
&OperandMap
) {
253 unsigned NumOperands
= 0;
254 for (const CodeGenInstruction
*Inst
: NumberedInstructions
) {
255 if (!Inst
->TheDef
->getValueAsBit("UseNamedOperandTable"))
257 std::map
<unsigned, unsigned> OpList
;
258 for (const auto &Info
: Inst
->Operands
) {
259 StrUintMapIter I
= Operands
.find(Info
.Name
);
261 if (I
== Operands
.end()) {
262 I
= Operands
.insert(Operands
.begin(),
263 std::pair
<std::string
, unsigned>(Info
.Name
, NumOperands
++));
265 OpList
[I
->second
] = Info
.MIOperandNo
;
267 OperandMap
[OpList
].push_back(Namespace
.str() + "::" +
268 Inst
->TheDef
->getName().str());
272 /// Generate a table and function for looking up the indices of operands by
275 /// This code generates:
276 /// - An enum in the llvm::TargetNamespace::OpName namespace, with one entry
277 /// for each operand name.
278 /// - A 2-dimensional table called OperandMap for mapping OpName enum values to
280 /// - A function called getNamedOperandIdx(uint16_t Opcode, uint16_t NamedIdx)
281 /// for looking up the operand index for an instruction, given a value from
283 void InstrInfoEmitter::emitOperandNameMappings(raw_ostream
&OS
,
284 const CodeGenTarget
&Target
,
285 ArrayRef
<const CodeGenInstruction
*> NumberedInstructions
) {
286 StringRef Namespace
= Target
.getInstNamespace();
287 std::string OpNameNS
= "OpName";
288 // Map of operand names to their enumeration value. This will be used to
289 // generate the OpName enum.
290 std::map
<std::string
, unsigned> Operands
;
291 OpNameMapTy OperandMap
;
293 initOperandMapData(NumberedInstructions
, Namespace
, Operands
, OperandMap
);
295 OS
<< "#ifdef GET_INSTRINFO_OPERAND_ENUM\n";
296 OS
<< "#undef GET_INSTRINFO_OPERAND_ENUM\n";
297 OS
<< "namespace llvm {\n";
298 OS
<< "namespace " << Namespace
<< " {\n";
299 OS
<< "namespace " << OpNameNS
<< " {\n";
301 for (const auto &Op
: Operands
)
302 OS
<< " " << Op
.first
<< " = " << Op
.second
<< ",\n";
304 OS
<< " OPERAND_LAST";
306 OS
<< "} // end namespace OpName\n";
307 OS
<< "} // end namespace " << Namespace
<< "\n";
308 OS
<< "} // end namespace llvm\n";
309 OS
<< "#endif //GET_INSTRINFO_OPERAND_ENUM\n\n";
311 OS
<< "#ifdef GET_INSTRINFO_NAMED_OPS\n";
312 OS
<< "#undef GET_INSTRINFO_NAMED_OPS\n";
313 OS
<< "namespace llvm {\n";
314 OS
<< "namespace " << Namespace
<< " {\n";
315 OS
<< "LLVM_READONLY\n";
316 OS
<< "int16_t getNamedOperandIdx(uint16_t Opcode, uint16_t NamedIdx) {\n";
317 if (!Operands
.empty()) {
318 OS
<< " static const int16_t OperandMap [][" << Operands
.size()
320 for (const auto &Entry
: OperandMap
) {
321 const std::map
<unsigned, unsigned> &OpList
= Entry
.first
;
324 // Emit a row of the OperandMap table
325 for (unsigned i
= 0, e
= Operands
.size(); i
!= e
; ++i
)
326 OS
<< (OpList
.count(i
) == 0 ? -1 : (int)OpList
.find(i
)->second
) << ", ";
332 OS
<< " switch(Opcode) {\n";
333 unsigned TableIndex
= 0;
334 for (const auto &Entry
: OperandMap
) {
335 for (const std::string
&Name
: Entry
.second
)
336 OS
<< " case " << Name
<< ":\n";
338 OS
<< " return OperandMap[" << TableIndex
++ << "][NamedIdx];\n";
340 OS
<< " default: return -1;\n";
343 // There are no operands, so no need to emit anything
344 OS
<< " return -1;\n";
347 OS
<< "} // end namespace " << Namespace
<< "\n";
348 OS
<< "} // end namespace llvm\n";
349 OS
<< "#endif //GET_INSTRINFO_NAMED_OPS\n\n";
352 /// Generate an enum for all the operand types for this target, under the
353 /// llvm::TargetNamespace::OpTypes namespace.
354 /// Operand types are all definitions derived of the Operand Target.td class.
355 void InstrInfoEmitter::emitOperandTypeMappings(
356 raw_ostream
&OS
, const CodeGenTarget
&Target
,
357 ArrayRef
<const CodeGenInstruction
*> NumberedInstructions
) {
359 StringRef Namespace
= Target
.getInstNamespace();
360 std::vector
<Record
*> Operands
= Records
.getAllDerivedDefinitions("Operand");
361 std::vector
<Record
*> RegisterOperands
=
362 Records
.getAllDerivedDefinitions("RegisterOperand");
363 std::vector
<Record
*> RegisterClasses
=
364 Records
.getAllDerivedDefinitions("RegisterClass");
366 OS
<< "#ifdef GET_INSTRINFO_OPERAND_TYPES_ENUM\n";
367 OS
<< "#undef GET_INSTRINFO_OPERAND_TYPES_ENUM\n";
368 OS
<< "namespace llvm {\n";
369 OS
<< "namespace " << Namespace
<< " {\n";
370 OS
<< "namespace OpTypes {\n";
371 OS
<< "enum OperandType {\n";
373 unsigned EnumVal
= 0;
374 for (const std::vector
<Record
*> *RecordsToAdd
:
375 {&Operands
, &RegisterOperands
, &RegisterClasses
}) {
376 for (const Record
*Op
: *RecordsToAdd
) {
377 if (!Op
->isAnonymous())
378 OS
<< " " << Op
->getName() << " = " << EnumVal
<< ",\n";
383 OS
<< " OPERAND_TYPE_LIST_END" << "\n};\n";
384 OS
<< "} // end namespace OpTypes\n";
385 OS
<< "} // end namespace " << Namespace
<< "\n";
386 OS
<< "} // end namespace llvm\n";
387 OS
<< "#endif // GET_INSTRINFO_OPERAND_TYPES_ENUM\n\n";
389 OS
<< "#ifdef GET_INSTRINFO_OPERAND_TYPE\n";
390 OS
<< "#undef GET_INSTRINFO_OPERAND_TYPE\n";
391 OS
<< "namespace llvm {\n";
392 OS
<< "namespace " << Namespace
<< " {\n";
393 OS
<< "LLVM_READONLY\n";
394 OS
<< "static int getOperandType(uint16_t Opcode, uint16_t OpIdx) {\n";
395 auto getInstrName
= [&](int I
) -> StringRef
{
396 return NumberedInstructions
[I
]->TheDef
->getName();
398 // TODO: Factor out duplicate operand lists to compress the tables.
399 if (!NumberedInstructions
.empty()) {
400 std::vector
<int> OperandOffsets
;
401 std::vector
<Record
*> OperandRecords
;
402 int CurrentOffset
= 0;
403 for (const CodeGenInstruction
*Inst
: NumberedInstructions
) {
404 OperandOffsets
.push_back(CurrentOffset
);
405 for (const auto &Op
: Inst
->Operands
) {
406 const DagInit
*MIOI
= Op
.MIOperandInfo
;
407 if (!ExpandMIOperandInfo
|| !MIOI
|| MIOI
->getNumArgs() == 0) {
408 // Single, anonymous, operand.
409 OperandRecords
.push_back(Op
.Rec
);
412 for (Init
*Arg
: MIOI
->getArgs()) {
413 OperandRecords
.push_back(cast
<DefInit
>(Arg
)->getDef());
420 // Emit the table of offsets (indexes) into the operand type table.
421 // Size the unsigned integer offset to save space.
422 assert(OperandRecords
.size() <= UINT32_MAX
&&
423 "Too many operands for offset table");
424 OS
<< " static const " << getMinimalTypeForRange(OperandRecords
.size());
425 OS
<< " Offsets[] = {\n";
426 for (int I
= 0, E
= OperandOffsets
.size(); I
!= E
; ++I
) {
427 OS
<< " /* " << getInstrName(I
) << " */\n";
428 OS
<< " " << OperandOffsets
[I
] << ",\n";
432 // Add an entry for the end so that we don't need to special case it below.
433 OperandOffsets
.push_back(OperandRecords
.size());
435 // Emit the actual operand types in a flat table.
436 // Size the signed integer operand type to save space.
437 assert(EnumVal
<= INT16_MAX
&&
438 "Too many operand types for operand types table");
439 OS
<< "\n using namespace OpTypes;\n";
441 OS
<< ((EnumVal
<= INT8_MAX
) ? " const int8_t" : " const int16_t");
442 OS
<< " OpcodeOperandTypes[] = {\n ";
443 for (int I
= 0, E
= OperandRecords
.size(), CurOffset
= 0; I
!= E
; ++I
) {
444 // We print each Opcode's operands in its own row.
445 if (I
== OperandOffsets
[CurOffset
]) {
446 OS
<< "\n /* " << getInstrName(CurOffset
) << " */\n ";
447 while (OperandOffsets
[++CurOffset
] == I
)
448 OS
<< "/* " << getInstrName(CurOffset
) << " */\n ";
450 Record
*OpR
= OperandRecords
[I
];
451 if ((OpR
->isSubClassOf("Operand") ||
452 OpR
->isSubClassOf("RegisterOperand") ||
453 OpR
->isSubClassOf("RegisterClass")) &&
455 OS
<< OpR
->getName();
462 OS
<< " return OpcodeOperandTypes[Offsets[Opcode] + OpIdx];\n";
464 OS
<< " llvm_unreachable(\"No instructions defined\");\n";
467 OS
<< "} // end namespace " << Namespace
<< "\n";
468 OS
<< "} // end namespace llvm\n";
469 OS
<< "#endif // GET_INSTRINFO_OPERAND_TYPE\n\n";
471 OS
<< "#ifdef GET_INSTRINFO_MEM_OPERAND_SIZE\n";
472 OS
<< "#undef GET_INSTRINFO_MEM_OPERAND_SIZE\n";
473 OS
<< "namespace llvm {\n";
474 OS
<< "namespace " << Namespace
<< " {\n";
475 OS
<< "LLVM_READONLY\n";
476 OS
<< "static int getMemOperandSize(int OpType) {\n";
477 OS
<< " switch (OpType) {\n";
478 std::map
<int, SmallVector
<StringRef
, 0>> SizeToOperandName
;
479 for (const Record
*Op
: Operands
) {
480 if (!Op
->isSubClassOf("X86MemOperand"))
482 if (int Size
= Op
->getValueAsInt("Size"))
483 SizeToOperandName
[Size
].push_back(Op
->getName());
485 OS
<< " default: return 0;\n";
486 for (const auto &KV
: SizeToOperandName
) {
487 for (const StringRef
&OperandName
: KV
.second
)
488 OS
<< " case OpTypes::" << OperandName
<< ":\n";
489 OS
<< " return " << KV
.first
<< ";\n\n";
492 OS
<< "} // end namespace " << Namespace
<< "\n";
493 OS
<< "} // end namespace llvm\n";
494 OS
<< "#endif // GET_INSTRINFO_MEM_OPERAND_SIZE\n\n";
497 void InstrInfoEmitter::emitLogicalOperandSizeMappings(
498 raw_ostream
&OS
, StringRef Namespace
,
499 ArrayRef
<const CodeGenInstruction
*> NumberedInstructions
) {
500 std::map
<std::vector
<unsigned>, unsigned> LogicalOpSizeMap
;
502 std::map
<unsigned, std::vector
<std::string
>> InstMap
;
504 size_t LogicalOpListSize
= 0U;
505 std::vector
<unsigned> LogicalOpList
;
506 for (const auto *Inst
: NumberedInstructions
) {
507 if (!Inst
->TheDef
->getValueAsBit("UseLogicalOperandMappings"))
510 LogicalOpList
.clear();
511 llvm::transform(Inst
->Operands
, std::back_inserter(LogicalOpList
),
512 [](const CGIOperandList::OperandInfo
&Op
) -> unsigned {
513 auto *MIOI
= Op
.MIOperandInfo
;
514 if (!MIOI
|| MIOI
->getNumArgs() == 0)
516 return MIOI
->getNumArgs();
518 LogicalOpListSize
= std::max(LogicalOpList
.size(), LogicalOpListSize
);
521 LogicalOpSizeMap
.insert({LogicalOpList
, LogicalOpSizeMap
.size()}).first
;
522 InstMap
[I
->second
].push_back(
523 (Namespace
+ "::" + Inst
->TheDef
->getName()).str());
526 OS
<< "#ifdef GET_INSTRINFO_LOGICAL_OPERAND_SIZE_MAP\n";
527 OS
<< "#undef GET_INSTRINFO_LOGICAL_OPERAND_SIZE_MAP\n";
528 OS
<< "namespace llvm {\n";
529 OS
<< "namespace " << Namespace
<< " {\n";
530 OS
<< "LLVM_READONLY static unsigned\n";
531 OS
<< "getLogicalOperandSize(uint16_t Opcode, uint16_t LogicalOpIdx) {\n";
532 if (!InstMap
.empty()) {
533 std::vector
<const std::vector
<unsigned> *> LogicalOpSizeList(
534 LogicalOpSizeMap
.size());
535 for (auto &P
: LogicalOpSizeMap
) {
536 LogicalOpSizeList
[P
.second
] = &P
.first
;
538 OS
<< " static const unsigned SizeMap[][" << LogicalOpListSize
540 for (auto &R
: LogicalOpSizeList
) {
541 const auto &Row
= *R
;
544 for (i
= 0; i
< static_cast<int>(Row
.size()); ++i
) {
545 OS
<< Row
[i
] << ", ";
547 for (; i
< static_cast<int>(LogicalOpListSize
); ++i
) {
555 OS
<< " switch (Opcode) {\n";
556 OS
<< " default: return LogicalOpIdx;\n";
557 for (auto &P
: InstMap
) {
558 auto OpMapIdx
= P
.first
;
559 const auto &Insts
= P
.second
;
560 for (const auto &Inst
: Insts
) {
561 OS
<< " case " << Inst
<< ":\n";
563 OS
<< " return SizeMap[" << OpMapIdx
<< "][LogicalOpIdx];\n";
567 OS
<< " return LogicalOpIdx;\n";
571 OS
<< "LLVM_READONLY static inline unsigned\n";
572 OS
<< "getLogicalOperandIdx(uint16_t Opcode, uint16_t LogicalOpIdx) {\n";
573 OS
<< " auto S = 0U;\n";
574 OS
<< " for (auto i = 0U; i < LogicalOpIdx; ++i)\n";
575 OS
<< " S += getLogicalOperandSize(Opcode, i);\n";
576 OS
<< " return S;\n";
579 OS
<< "} // end namespace " << Namespace
<< "\n";
580 OS
<< "} // end namespace llvm\n";
581 OS
<< "#endif // GET_INSTRINFO_LOGICAL_OPERAND_SIZE_MAP\n\n";
584 void InstrInfoEmitter::emitLogicalOperandTypeMappings(
585 raw_ostream
&OS
, StringRef Namespace
,
586 ArrayRef
<const CodeGenInstruction
*> NumberedInstructions
) {
587 std::map
<std::vector
<std::string
>, unsigned> LogicalOpTypeMap
;
589 std::map
<unsigned, std::vector
<std::string
>> InstMap
;
591 size_t OpTypeListSize
= 0U;
592 std::vector
<std::string
> LogicalOpTypeList
;
593 for (const auto *Inst
: NumberedInstructions
) {
594 if (!Inst
->TheDef
->getValueAsBit("UseLogicalOperandMappings"))
597 LogicalOpTypeList
.clear();
598 for (const auto &Op
: Inst
->Operands
) {
600 if ((OpR
->isSubClassOf("Operand") ||
601 OpR
->isSubClassOf("RegisterOperand") ||
602 OpR
->isSubClassOf("RegisterClass")) &&
603 !OpR
->isAnonymous()) {
604 LogicalOpTypeList
.push_back(
605 (Namespace
+ "::OpTypes::" + Op
.Rec
->getName()).str());
607 LogicalOpTypeList
.push_back("-1");
610 OpTypeListSize
= std::max(LogicalOpTypeList
.size(), OpTypeListSize
);
613 LogicalOpTypeMap
.insert({LogicalOpTypeList
, LogicalOpTypeMap
.size()})
615 InstMap
[I
->second
].push_back(
616 (Namespace
+ "::" + Inst
->TheDef
->getName()).str());
619 OS
<< "#ifdef GET_INSTRINFO_LOGICAL_OPERAND_TYPE_MAP\n";
620 OS
<< "#undef GET_INSTRINFO_LOGICAL_OPERAND_TYPE_MAP\n";
621 OS
<< "namespace llvm {\n";
622 OS
<< "namespace " << Namespace
<< " {\n";
623 OS
<< "LLVM_READONLY static int\n";
624 OS
<< "getLogicalOperandType(uint16_t Opcode, uint16_t LogicalOpIdx) {\n";
625 if (!InstMap
.empty()) {
626 std::vector
<const std::vector
<std::string
> *> LogicalOpTypeList(
627 LogicalOpTypeMap
.size());
628 for (auto &P
: LogicalOpTypeMap
) {
629 LogicalOpTypeList
[P
.second
] = &P
.first
;
631 OS
<< " static const int TypeMap[][" << OpTypeListSize
<< "] = {\n";
632 for (int r
= 0, rs
= LogicalOpTypeList
.size(); r
< rs
; ++r
) {
633 const auto &Row
= *LogicalOpTypeList
[r
];
635 int i
, s
= Row
.size();
636 for (i
= 0; i
< s
; ++i
) {
641 for (; i
< static_cast<int>(OpTypeListSize
); ++i
) {
653 OS
<< " switch (Opcode) {\n";
654 OS
<< " default: return -1;\n";
655 for (auto &P
: InstMap
) {
656 auto OpMapIdx
= P
.first
;
657 const auto &Insts
= P
.second
;
658 for (const auto &Inst
: Insts
) {
659 OS
<< " case " << Inst
<< ":\n";
661 OS
<< " return TypeMap[" << OpMapIdx
<< "][LogicalOpIdx];\n";
665 OS
<< " return -1;\n";
668 OS
<< "} // end namespace " << Namespace
<< "\n";
669 OS
<< "} // end namespace llvm\n";
670 OS
<< "#endif // GET_INSTRINFO_LOGICAL_OPERAND_TYPE_MAP\n\n";
673 void InstrInfoEmitter::emitMCIIHelperMethods(raw_ostream
&OS
,
674 StringRef TargetName
) {
675 RecVec TIIPredicates
= Records
.getAllDerivedDefinitions("TIIPredicate");
677 OS
<< "#ifdef GET_INSTRINFO_MC_HELPER_DECLS\n";
678 OS
<< "#undef GET_INSTRINFO_MC_HELPER_DECLS\n\n";
680 OS
<< "namespace llvm {\n";
681 OS
<< "class MCInst;\n";
682 OS
<< "class FeatureBitset;\n\n";
684 OS
<< "namespace " << TargetName
<< "_MC {\n\n";
686 for (const Record
*Rec
: TIIPredicates
) {
687 OS
<< "bool " << Rec
->getValueAsString("FunctionName")
688 << "(const MCInst &MI);\n";
691 OS
<< "void verifyInstructionPredicates(unsigned Opcode, const FeatureBitset "
694 OS
<< "\n} // end namespace " << TargetName
<< "_MC\n";
695 OS
<< "} // end namespace llvm\n\n";
697 OS
<< "#endif // GET_INSTRINFO_MC_HELPER_DECLS\n\n";
699 OS
<< "#ifdef GET_INSTRINFO_MC_HELPERS\n";
700 OS
<< "#undef GET_INSTRINFO_MC_HELPERS\n\n";
702 OS
<< "namespace llvm {\n";
703 OS
<< "namespace " << TargetName
<< "_MC {\n\n";
705 PredicateExpander
PE(TargetName
);
706 PE
.setExpandForMC(true);
708 for (const Record
*Rec
: TIIPredicates
) {
709 OS
<< "bool " << Rec
->getValueAsString("FunctionName");
710 OS
<< "(const MCInst &MI) {\n";
712 OS
.indent(PE
.getIndentLevel() * 2);
713 PE
.expandStatement(OS
, Rec
->getValueAsDef("Body"));
717 OS
<< "} // end namespace " << TargetName
<< "_MC\n";
718 OS
<< "} // end namespace llvm\n\n";
720 OS
<< "#endif // GET_GENISTRINFO_MC_HELPERS\n\n";
724 getNameForFeatureBitset(const std::vector
<Record
*> &FeatureBitset
) {
725 std::string Name
= "CEFBS";
726 for (const auto &Feature
: FeatureBitset
)
727 Name
+= ("_" + Feature
->getName()).str();
731 void InstrInfoEmitter::emitFeatureVerifier(raw_ostream
&OS
,
732 const CodeGenTarget
&Target
) {
733 const auto &All
= SubtargetFeatureInfo::getAll(Records
);
734 std::map
<Record
*, SubtargetFeatureInfo
, LessRecordByID
> SubtargetFeatures
;
735 SubtargetFeatures
.insert(All
.begin(), All
.end());
737 OS
<< "#if (defined(ENABLE_INSTR_PREDICATE_VERIFIER) && !defined(NDEBUG)) "
739 << " defined(GET_AVAILABLE_OPCODE_CHECKER)\n"
740 << "#define GET_COMPUTE_FEATURES\n"
742 OS
<< "#ifdef GET_COMPUTE_FEATURES\n"
743 << "#undef GET_COMPUTE_FEATURES\n"
744 << "namespace llvm {\n"
745 << "namespace " << Target
.getName() << "_MC {\n\n";
747 // Emit the subtarget feature enumeration.
748 SubtargetFeatureInfo::emitSubtargetFeatureBitEnumeration(SubtargetFeatures
,
750 // Emit the available features compute function.
752 SubtargetFeatureInfo::emitComputeAssemblerAvailableFeatures(
753 Target
.getName(), "", "computeAvailableFeatures", SubtargetFeatures
, OS
);
755 std::vector
<std::vector
<Record
*>> FeatureBitsets
;
756 for (const CodeGenInstruction
*Inst
: Target
.getInstructionsByEnumValue()) {
757 FeatureBitsets
.emplace_back();
758 for (Record
*Predicate
: Inst
->TheDef
->getValueAsListOfDefs("Predicates")) {
759 const auto &I
= SubtargetFeatures
.find(Predicate
);
760 if (I
!= SubtargetFeatures
.end())
761 FeatureBitsets
.back().push_back(I
->second
.TheDef
);
765 llvm::sort(FeatureBitsets
, [&](const std::vector
<Record
*> &A
,
766 const std::vector
<Record
*> &B
) {
767 if (A
.size() < B
.size())
769 if (A
.size() > B
.size())
771 for (auto Pair
: zip(A
, B
)) {
772 if (std::get
<0>(Pair
)->getName() < std::get
<1>(Pair
)->getName())
774 if (std::get
<0>(Pair
)->getName() > std::get
<1>(Pair
)->getName())
779 FeatureBitsets
.erase(
780 std::unique(FeatureBitsets
.begin(), FeatureBitsets
.end()),
781 FeatureBitsets
.end());
782 OS
<< "inline FeatureBitset computeRequiredFeatures(unsigned Opcode) {\n"
783 << " enum : " << getMinimalTypeForRange(FeatureBitsets
.size()) << " {\n"
785 for (const auto &FeatureBitset
: FeatureBitsets
) {
786 if (FeatureBitset
.empty())
788 OS
<< " " << getNameForFeatureBitset(FeatureBitset
) << ",\n";
791 << " static constexpr FeatureBitset FeatureBitsets[] = {\n"
792 << " {}, // CEFBS_None\n";
793 for (const auto &FeatureBitset
: FeatureBitsets
) {
794 if (FeatureBitset
.empty())
797 for (const auto &Feature
: FeatureBitset
) {
798 const auto &I
= SubtargetFeatures
.find(Feature
);
799 assert(I
!= SubtargetFeatures
.end() && "Didn't import predicate?");
800 OS
<< I
->second
.getEnumBitName() << ", ";
805 << " static constexpr " << getMinimalTypeForRange(FeatureBitsets
.size())
806 << " RequiredFeaturesRefs[] = {\n";
807 unsigned InstIdx
= 0;
808 for (const CodeGenInstruction
*Inst
: Target
.getInstructionsByEnumValue()) {
810 unsigned NumPredicates
= 0;
811 for (Record
*Predicate
: Inst
->TheDef
->getValueAsListOfDefs("Predicates")) {
812 const auto &I
= SubtargetFeatures
.find(Predicate
);
813 if (I
!= SubtargetFeatures
.end()) {
814 OS
<< '_' << I
->second
.TheDef
->getName();
820 OS
<< ", // " << Inst
->TheDef
->getName() << " = " << InstIdx
<< "\n";
824 << " assert(Opcode < " << InstIdx
<< ");\n"
825 << " return FeatureBitsets[RequiredFeaturesRefs[Opcode]];\n"
828 OS
<< "} // end namespace " << Target
.getName() << "_MC\n"
829 << "} // end namespace llvm\n"
830 << "#endif // GET_COMPUTE_FEATURES\n\n";
832 OS
<< "#ifdef GET_AVAILABLE_OPCODE_CHECKER\n"
833 << "#undef GET_AVAILABLE_OPCODE_CHECKER\n"
834 << "namespace llvm {\n"
835 << "namespace " << Target
.getName() << "_MC {\n";
836 OS
<< "bool isOpcodeAvailable("
837 << "unsigned Opcode, const FeatureBitset &Features) {\n"
838 << " FeatureBitset AvailableFeatures = "
839 << "computeAvailableFeatures(Features);\n"
840 << " FeatureBitset RequiredFeatures = "
841 << "computeRequiredFeatures(Opcode);\n"
842 << " FeatureBitset MissingFeatures =\n"
843 << " (AvailableFeatures & RequiredFeatures) ^\n"
844 << " RequiredFeatures;\n"
845 << " return !MissingFeatures.any();\n"
847 OS
<< "} // end namespace " << Target
.getName() << "_MC\n"
848 << "} // end namespace llvm\n"
849 << "#endif // GET_AVAILABLE_OPCODE_CHECKER\n\n";
851 OS
<< "#ifdef ENABLE_INSTR_PREDICATE_VERIFIER\n"
852 << "#undef ENABLE_INSTR_PREDICATE_VERIFIER\n"
853 << "#include <sstream>\n\n";
855 OS
<< "namespace llvm {\n";
856 OS
<< "namespace " << Target
.getName() << "_MC {\n\n";
858 // Emit the name table for error messages.
859 OS
<< "#ifndef NDEBUG\n";
860 SubtargetFeatureInfo::emitNameTable(SubtargetFeatures
, OS
);
861 OS
<< "#endif // NDEBUG\n\n";
863 // Emit the predicate verifier.
864 OS
<< "void verifyInstructionPredicates(\n"
865 << " unsigned Opcode, const FeatureBitset &Features) {\n"
866 << "#ifndef NDEBUG\n";
867 OS
<< " FeatureBitset AvailableFeatures = "
868 "computeAvailableFeatures(Features);\n";
869 OS
<< " FeatureBitset RequiredFeatures = "
870 << "computeRequiredFeatures(Opcode);\n";
871 OS
<< " FeatureBitset MissingFeatures =\n"
872 << " (AvailableFeatures & RequiredFeatures) ^\n"
873 << " RequiredFeatures;\n"
874 << " if (MissingFeatures.any()) {\n"
875 << " std::ostringstream Msg;\n"
876 << " Msg << \"Attempting to emit \" << &" << Target
.getName()
877 << "InstrNameData[" << Target
.getName() << "InstrNameIndices[Opcode]]\n"
878 << " << \" instruction but the \";\n"
879 << " for (unsigned i = 0, e = MissingFeatures.size(); i != e; ++i)\n"
880 << " if (MissingFeatures.test(i))\n"
881 << " Msg << SubtargetFeatureNames[i] << \" \";\n"
882 << " Msg << \"predicate(s) are not met\";\n"
883 << " report_fatal_error(Msg.str().c_str());\n"
885 << "#endif // NDEBUG\n";
887 OS
<< "} // end namespace " << Target
.getName() << "_MC\n";
888 OS
<< "} // end namespace llvm\n";
889 OS
<< "#endif // ENABLE_INSTR_PREDICATE_VERIFIER\n\n";
892 void InstrInfoEmitter::emitTIIHelperMethods(raw_ostream
&OS
,
893 StringRef TargetName
,
894 bool ExpandDefinition
) {
895 RecVec TIIPredicates
= Records
.getAllDerivedDefinitions("TIIPredicate");
896 if (TIIPredicates
.empty())
899 PredicateExpander
PE(TargetName
);
900 PE
.setExpandForMC(false);
902 for (const Record
*Rec
: TIIPredicates
) {
903 OS
<< (ExpandDefinition
? "" : "static ") << "bool ";
904 if (ExpandDefinition
)
905 OS
<< TargetName
<< "InstrInfo::";
906 OS
<< Rec
->getValueAsString("FunctionName");
907 OS
<< "(const MachineInstr &MI)";
908 if (!ExpandDefinition
) {
914 OS
.indent(PE
.getIndentLevel() * 2);
915 PE
.expandStatement(OS
, Rec
->getValueAsDef("Body"));
920 //===----------------------------------------------------------------------===//
922 //===----------------------------------------------------------------------===//
924 // run - Emit the main instruction description records for the target...
925 void InstrInfoEmitter::run(raw_ostream
&OS
) {
926 emitSourceFileHeader("Target Instruction Enum Values and Descriptors", OS
);
929 CodeGenTarget
&Target
= CDP
.getTargetInfo();
930 const std::string
&TargetName
= std::string(Target
.getName());
931 Record
*InstrInfo
= Target
.getInstructionSet();
933 // Collect all of the operand info records.
934 Records
.startTimer("Collect operand info");
935 OperandInfoListTy OperandInfoList
;
936 OperandInfoMapTy OperandInfoMap
;
937 unsigned OperandInfoSize
=
938 CollectOperandInfo(OperandInfoList
, OperandInfoMap
);
940 // Collect all of the instruction's implicit uses and defs.
941 Records
.startTimer("Collect uses/defs");
942 std::map
<std::vector
<Record
*>, unsigned> EmittedLists
;
943 std::vector
<std::vector
<Record
*>> ImplicitLists
;
944 unsigned ImplicitListSize
= 0;
945 for (const CodeGenInstruction
*II
: Target
.getInstructionsByEnumValue()) {
946 std::vector
<Record
*> ImplicitOps
= II
->ImplicitUses
;
947 llvm::append_range(ImplicitOps
, II
->ImplicitDefs
);
948 if (EmittedLists
.insert({ImplicitOps
, ImplicitListSize
}).second
) {
949 ImplicitLists
.push_back(ImplicitOps
);
950 ImplicitListSize
+= ImplicitOps
.size();
954 ArrayRef
<const CodeGenInstruction
*> NumberedInstructions
=
955 Target
.getInstructionsByEnumValue();
956 OS
<< "#if defined(GET_INSTRINFO_MC_DESC) || "
957 "defined(GET_INSTRINFO_CTOR_DTOR)\n";
958 OS
<< "namespace llvm {\n\n";
960 OS
<< "struct " << TargetName
<< "InstrTable {\n";
961 OS
<< " MCInstrDesc Insts[" << NumberedInstructions
.size() << "];\n";
962 OS
<< " static_assert(alignof(MCInstrDesc) >= alignof(MCOperandInfo), "
963 "\"Unwanted padding between Insts and OperandInfo\");\n";
964 OS
<< " MCOperandInfo OperandInfo[" << OperandInfoSize
<< "];\n";
965 OS
<< " static_assert(alignof(MCOperandInfo) >= alignof(MCPhysReg), "
966 "\"Unwanted padding between OperandInfo and ImplicitOps\");\n";
967 OS
<< " MCPhysReg ImplicitOps[" << std::max(ImplicitListSize
, 1U) << "];\n";
970 OS
<< "} // end namespace llvm\n";
971 OS
<< "#endif // defined(GET_INSTRINFO_MC_DESC) || "
972 "defined(GET_INSTRINFO_CTOR_DTOR)\n\n";
974 OS
<< "#ifdef GET_INSTRINFO_MC_DESC\n";
975 OS
<< "#undef GET_INSTRINFO_MC_DESC\n";
976 OS
<< "namespace llvm {\n\n";
978 // Emit all of the MCInstrDesc records in reverse ENUM ordering.
979 Records
.startTimer("Emit InstrDesc records");
980 OS
<< "static_assert(sizeof(MCOperandInfo) % sizeof(MCPhysReg) == 0);\n";
981 OS
<< "static constexpr unsigned " << TargetName
<< "ImpOpBase = sizeof "
982 << TargetName
<< "InstrTable::OperandInfo / (sizeof(MCPhysReg));\n\n";
984 OS
<< "extern const " << TargetName
<< "InstrTable " << TargetName
985 << "Descs = {\n {\n";
986 SequenceToOffsetTable
<std::string
> InstrNames
;
987 unsigned Num
= NumberedInstructions
.size();
988 for (const CodeGenInstruction
*Inst
: reverse(NumberedInstructions
)) {
989 // Keep a list of the instruction names.
990 InstrNames
.add(std::string(Inst
->TheDef
->getName()));
991 // Emit the record into the table.
992 emitRecord(*Inst
, --Num
, InstrInfo
, EmittedLists
, OperandInfoMap
, OS
);
997 // Emit all of the operand info records.
998 Records
.startTimer("Emit operand info");
999 EmitOperandInfo(OS
, OperandInfoList
);
1003 // Emit all of the instruction's implicit uses and defs.
1004 Records
.startTimer("Emit uses/defs");
1005 for (auto &List
: ImplicitLists
) {
1006 OS
<< " /* " << EmittedLists
[List
] << " */";
1007 for (auto &Reg
: List
)
1008 OS
<< ' ' << getQualifiedName(Reg
) << ',';
1014 // Emit the array of instruction names.
1015 Records
.startTimer("Emit instruction names");
1016 InstrNames
.layout();
1017 InstrNames
.emitStringLiteralDef(OS
, Twine("extern const char ") + TargetName
+
1020 OS
<< "extern const unsigned " << TargetName
<<"InstrNameIndices[] = {";
1022 for (const CodeGenInstruction
*Inst
: NumberedInstructions
) {
1023 // Newline every eight entries.
1026 OS
<< InstrNames
.get(std::string(Inst
->TheDef
->getName())) << "U, ";
1031 bool HasDeprecationFeatures
=
1032 llvm::any_of(NumberedInstructions
, [](const CodeGenInstruction
*Inst
) {
1033 return !Inst
->HasComplexDeprecationPredicate
&&
1034 !Inst
->DeprecatedReason
.empty();
1036 if (HasDeprecationFeatures
) {
1037 OS
<< "extern const uint8_t " << TargetName
1038 << "InstrDeprecationFeatures[] = {";
1040 for (const CodeGenInstruction
*Inst
: NumberedInstructions
) {
1043 if (!Inst
->HasComplexDeprecationPredicate
&&
1044 !Inst
->DeprecatedReason
.empty())
1045 OS
<< Target
.getInstNamespace() << "::" << Inst
->DeprecatedReason
1048 OS
<< "uint8_t(-1), ";
1054 bool HasComplexDeprecationInfos
=
1055 llvm::any_of(NumberedInstructions
, [](const CodeGenInstruction
*Inst
) {
1056 return Inst
->HasComplexDeprecationPredicate
;
1058 if (HasComplexDeprecationInfos
) {
1059 OS
<< "extern const MCInstrInfo::ComplexDeprecationPredicate " << TargetName
1060 << "InstrComplexDeprecationInfos[] = {";
1062 for (const CodeGenInstruction
*Inst
: NumberedInstructions
) {
1065 if (Inst
->HasComplexDeprecationPredicate
)
1066 // Emit a function pointer to the complex predicate method.
1067 OS
<< "&get" << Inst
->DeprecatedReason
<< "DeprecationInfo, ";
1075 // MCInstrInfo initialization routine.
1076 Records
.startTimer("Emit initialization routine");
1077 OS
<< "static inline void Init" << TargetName
1078 << "MCInstrInfo(MCInstrInfo *II) {\n";
1079 OS
<< " II->InitMCInstrInfo(" << TargetName
<< "Descs.Insts, " << TargetName
1080 << "InstrNameIndices, " << TargetName
<< "InstrNameData, ";
1081 if (HasDeprecationFeatures
)
1082 OS
<< TargetName
<< "InstrDeprecationFeatures, ";
1085 if (HasComplexDeprecationInfos
)
1086 OS
<< TargetName
<< "InstrComplexDeprecationInfos, ";
1089 OS
<< NumberedInstructions
.size() << ");\n}\n\n";
1091 OS
<< "} // end namespace llvm\n";
1093 OS
<< "#endif // GET_INSTRINFO_MC_DESC\n\n";
1095 // Create a TargetInstrInfo subclass to hide the MC layer initialization.
1096 OS
<< "#ifdef GET_INSTRINFO_HEADER\n";
1097 OS
<< "#undef GET_INSTRINFO_HEADER\n";
1099 std::string ClassName
= TargetName
+ "GenInstrInfo";
1100 OS
<< "namespace llvm {\n";
1101 OS
<< "struct " << ClassName
<< " : public TargetInstrInfo {\n"
1102 << " explicit " << ClassName
1103 << "(unsigned CFSetupOpcode = ~0u, unsigned CFDestroyOpcode = ~0u, "
1104 "unsigned CatchRetOpcode = ~0u, unsigned ReturnOpcode = ~0u);\n"
1105 << " ~" << ClassName
<< "() override = default;\n";
1108 OS
<< "\n};\n} // end namespace llvm\n";
1110 OS
<< "#endif // GET_INSTRINFO_HEADER\n\n";
1112 OS
<< "#ifdef GET_INSTRINFO_HELPER_DECLS\n";
1113 OS
<< "#undef GET_INSTRINFO_HELPER_DECLS\n\n";
1114 emitTIIHelperMethods(OS
, TargetName
, /* ExpandDefinition = */ false);
1116 OS
<< "#endif // GET_INSTRINFO_HELPER_DECLS\n\n";
1118 OS
<< "#ifdef GET_INSTRINFO_HELPERS\n";
1119 OS
<< "#undef GET_INSTRINFO_HELPERS\n\n";
1120 emitTIIHelperMethods(OS
, TargetName
, /* ExpandDefinition = */ true);
1121 OS
<< "#endif // GET_INSTRINFO_HELPERS\n\n";
1123 OS
<< "#ifdef GET_INSTRINFO_CTOR_DTOR\n";
1124 OS
<< "#undef GET_INSTRINFO_CTOR_DTOR\n";
1126 OS
<< "namespace llvm {\n";
1127 OS
<< "extern const " << TargetName
<< "InstrTable " << TargetName
1129 OS
<< "extern const unsigned " << TargetName
<< "InstrNameIndices[];\n";
1130 OS
<< "extern const char " << TargetName
<< "InstrNameData[];\n";
1131 if (HasDeprecationFeatures
)
1132 OS
<< "extern const uint8_t " << TargetName
1133 << "InstrDeprecationFeatures[];\n";
1134 if (HasComplexDeprecationInfos
)
1135 OS
<< "extern const MCInstrInfo::ComplexDeprecationPredicate " << TargetName
1136 << "InstrComplexDeprecationInfos[];\n";
1137 OS
<< ClassName
<< "::" << ClassName
1138 << "(unsigned CFSetupOpcode, unsigned CFDestroyOpcode, unsigned "
1139 "CatchRetOpcode, unsigned ReturnOpcode)\n"
1140 << " : TargetInstrInfo(CFSetupOpcode, CFDestroyOpcode, CatchRetOpcode, "
1142 << " InitMCInstrInfo(" << TargetName
<< "Descs.Insts, " << TargetName
1143 << "InstrNameIndices, " << TargetName
<< "InstrNameData, ";
1144 if (HasDeprecationFeatures
)
1145 OS
<< TargetName
<< "InstrDeprecationFeatures, ";
1148 if (HasComplexDeprecationInfos
)
1149 OS
<< TargetName
<< "InstrComplexDeprecationInfos, ";
1152 OS
<< NumberedInstructions
.size() << ");\n}\n";
1153 OS
<< "} // end namespace llvm\n";
1155 OS
<< "#endif // GET_INSTRINFO_CTOR_DTOR\n\n";
1157 Records
.startTimer("Emit operand name mappings");
1158 emitOperandNameMappings(OS
, Target
, NumberedInstructions
);
1160 Records
.startTimer("Emit operand type mappings");
1161 emitOperandTypeMappings(OS
, Target
, NumberedInstructions
);
1163 Records
.startTimer("Emit logical operand size mappings");
1164 emitLogicalOperandSizeMappings(OS
, TargetName
, NumberedInstructions
);
1166 Records
.startTimer("Emit logical operand type mappings");
1167 emitLogicalOperandTypeMappings(OS
, TargetName
, NumberedInstructions
);
1169 Records
.startTimer("Emit helper methods");
1170 emitMCIIHelperMethods(OS
, TargetName
);
1172 Records
.startTimer("Emit verifier methods");
1173 emitFeatureVerifier(OS
, Target
);
1176 void InstrInfoEmitter::emitRecord(
1177 const CodeGenInstruction
&Inst
, unsigned Num
, Record
*InstrInfo
,
1178 std::map
<std::vector
<Record
*>, unsigned> &EmittedLists
,
1179 const OperandInfoMapTy
&OperandInfoMap
, raw_ostream
&OS
) {
1180 int MinOperands
= 0;
1181 if (!Inst
.Operands
.empty())
1182 // Each logical operand can be multiple MI operands.
1183 MinOperands
= Inst
.Operands
.back().MIOperandNo
+
1184 Inst
.Operands
.back().MINumOperands
;
1187 OS
<< Num
<< ",\t" << MinOperands
<< ",\t" << Inst
.Operands
.NumDefs
<< ",\t"
1188 << Inst
.TheDef
->getValueAsInt("Size") << ",\t"
1189 << SchedModels
.getSchedClassIdx(Inst
) << ",\t";
1191 CodeGenTarget
&Target
= CDP
.getTargetInfo();
1193 // Emit the implicit use/def list...
1194 OS
<< Inst
.ImplicitUses
.size() << ",\t" << Inst
.ImplicitDefs
.size() << ",\t";
1195 std::vector
<Record
*> ImplicitOps
= Inst
.ImplicitUses
;
1196 llvm::append_range(ImplicitOps
, Inst
.ImplicitDefs
);
1197 OS
<< Target
.getName() << "ImpOpBase + " << EmittedLists
[ImplicitOps
]
1200 // Emit the operand info offset.
1201 OperandInfoTy OperandInfo
= GetOperandInfo(Inst
);
1202 OS
<< OperandInfoMap
.find(OperandInfo
)->second
<< ",\t0";
1204 // Emit all of the target independent flags...
1205 if (Inst
.isPreISelOpcode
) OS
<< "|(1ULL<<MCID::PreISelOpcode)";
1206 if (Inst
.isPseudo
) OS
<< "|(1ULL<<MCID::Pseudo)";
1207 if (Inst
.isMeta
) OS
<< "|(1ULL<<MCID::Meta)";
1208 if (Inst
.isReturn
) OS
<< "|(1ULL<<MCID::Return)";
1209 if (Inst
.isEHScopeReturn
) OS
<< "|(1ULL<<MCID::EHScopeReturn)";
1210 if (Inst
.isBranch
) OS
<< "|(1ULL<<MCID::Branch)";
1211 if (Inst
.isIndirectBranch
) OS
<< "|(1ULL<<MCID::IndirectBranch)";
1212 if (Inst
.isCompare
) OS
<< "|(1ULL<<MCID::Compare)";
1213 if (Inst
.isMoveImm
) OS
<< "|(1ULL<<MCID::MoveImm)";
1214 if (Inst
.isMoveReg
) OS
<< "|(1ULL<<MCID::MoveReg)";
1215 if (Inst
.isBitcast
) OS
<< "|(1ULL<<MCID::Bitcast)";
1216 if (Inst
.isAdd
) OS
<< "|(1ULL<<MCID::Add)";
1217 if (Inst
.isTrap
) OS
<< "|(1ULL<<MCID::Trap)";
1218 if (Inst
.isSelect
) OS
<< "|(1ULL<<MCID::Select)";
1219 if (Inst
.isBarrier
) OS
<< "|(1ULL<<MCID::Barrier)";
1220 if (Inst
.hasDelaySlot
) OS
<< "|(1ULL<<MCID::DelaySlot)";
1221 if (Inst
.isCall
) OS
<< "|(1ULL<<MCID::Call)";
1222 if (Inst
.canFoldAsLoad
) OS
<< "|(1ULL<<MCID::FoldableAsLoad)";
1223 if (Inst
.mayLoad
) OS
<< "|(1ULL<<MCID::MayLoad)";
1224 if (Inst
.mayStore
) OS
<< "|(1ULL<<MCID::MayStore)";
1225 if (Inst
.mayRaiseFPException
) OS
<< "|(1ULL<<MCID::MayRaiseFPException)";
1226 if (Inst
.isPredicable
) OS
<< "|(1ULL<<MCID::Predicable)";
1227 if (Inst
.isConvertibleToThreeAddress
) OS
<< "|(1ULL<<MCID::ConvertibleTo3Addr)";
1228 if (Inst
.isCommutable
) OS
<< "|(1ULL<<MCID::Commutable)";
1229 if (Inst
.isTerminator
) OS
<< "|(1ULL<<MCID::Terminator)";
1230 if (Inst
.isReMaterializable
) OS
<< "|(1ULL<<MCID::Rematerializable)";
1231 if (Inst
.isNotDuplicable
) OS
<< "|(1ULL<<MCID::NotDuplicable)";
1232 if (Inst
.Operands
.hasOptionalDef
) OS
<< "|(1ULL<<MCID::HasOptionalDef)";
1233 if (Inst
.usesCustomInserter
) OS
<< "|(1ULL<<MCID::UsesCustomInserter)";
1234 if (Inst
.hasPostISelHook
) OS
<< "|(1ULL<<MCID::HasPostISelHook)";
1235 if (Inst
.Operands
.isVariadic
)OS
<< "|(1ULL<<MCID::Variadic)";
1236 if (Inst
.hasSideEffects
) OS
<< "|(1ULL<<MCID::UnmodeledSideEffects)";
1237 if (Inst
.isAsCheapAsAMove
) OS
<< "|(1ULL<<MCID::CheapAsAMove)";
1238 if (!Target
.getAllowRegisterRenaming() || Inst
.hasExtraSrcRegAllocReq
)
1239 OS
<< "|(1ULL<<MCID::ExtraSrcRegAllocReq)";
1240 if (!Target
.getAllowRegisterRenaming() || Inst
.hasExtraDefRegAllocReq
)
1241 OS
<< "|(1ULL<<MCID::ExtraDefRegAllocReq)";
1242 if (Inst
.isRegSequence
) OS
<< "|(1ULL<<MCID::RegSequence)";
1243 if (Inst
.isExtractSubreg
) OS
<< "|(1ULL<<MCID::ExtractSubreg)";
1244 if (Inst
.isInsertSubreg
) OS
<< "|(1ULL<<MCID::InsertSubreg)";
1245 if (Inst
.isConvergent
) OS
<< "|(1ULL<<MCID::Convergent)";
1246 if (Inst
.variadicOpsAreDefs
) OS
<< "|(1ULL<<MCID::VariadicOpsAreDefs)";
1247 if (Inst
.isAuthenticated
) OS
<< "|(1ULL<<MCID::Authenticated)";
1249 // Emit all of the target-specific flags...
1250 BitsInit
*TSF
= Inst
.TheDef
->getValueAsBitsInit("TSFlags");
1252 PrintFatalError(Inst
.TheDef
->getLoc(), "no TSFlags?");
1254 for (unsigned i
= 0, e
= TSF
->getNumBits(); i
!= e
; ++i
) {
1255 if (const auto *Bit
= dyn_cast
<BitInit
>(TSF
->getBit(i
)))
1256 Value
|= uint64_t(Bit
->getValue()) << i
;
1258 PrintFatalError(Inst
.TheDef
->getLoc(),
1259 "Invalid TSFlags bit in " + Inst
.TheDef
->getName());
1262 OS
.write_hex(Value
);
1265 OS
<< " }, // Inst #" << Num
<< " = " << Inst
.TheDef
->getName() << "\n";
1268 // emitEnums - Print out enum values for all of the instructions.
1269 void InstrInfoEmitter::emitEnums(raw_ostream
&OS
) {
1270 OS
<< "#ifdef GET_INSTRINFO_ENUM\n";
1271 OS
<< "#undef GET_INSTRINFO_ENUM\n";
1273 OS
<< "namespace llvm {\n\n";
1275 const CodeGenTarget
&Target
= CDP
.getTargetInfo();
1277 // We must emit the PHI opcode first...
1278 StringRef Namespace
= Target
.getInstNamespace();
1280 if (Namespace
.empty())
1281 PrintFatalError("No instructions defined!");
1283 OS
<< "namespace " << Namespace
<< " {\n";
1286 for (const CodeGenInstruction
*Inst
: Target
.getInstructionsByEnumValue())
1287 OS
<< " " << Inst
->TheDef
->getName() << "\t= " << Num
++ << ",\n";
1288 OS
<< " INSTRUCTION_LIST_END = " << Num
<< "\n";
1290 OS
<< "} // end namespace " << Namespace
<< "\n";
1291 OS
<< "} // end namespace llvm\n";
1292 OS
<< "#endif // GET_INSTRINFO_ENUM\n\n";
1294 OS
<< "#ifdef GET_INSTRINFO_SCHED_ENUM\n";
1295 OS
<< "#undef GET_INSTRINFO_SCHED_ENUM\n";
1296 OS
<< "namespace llvm {\n\n";
1297 OS
<< "namespace " << Namespace
<< " {\n";
1298 OS
<< "namespace Sched {\n";
1301 for (const auto &Class
: SchedModels
.explicit_classes())
1302 OS
<< " " << Class
.Name
<< "\t= " << Num
++ << ",\n";
1303 OS
<< " SCHED_LIST_END = " << Num
<< "\n";
1305 OS
<< "} // end namespace Sched\n";
1306 OS
<< "} // end namespace " << Namespace
<< "\n";
1307 OS
<< "} // end namespace llvm\n";
1309 OS
<< "#endif // GET_INSTRINFO_SCHED_ENUM\n\n";
1312 static void EmitInstrInfo(RecordKeeper
&RK
, raw_ostream
&OS
) {
1313 RK
.startTimer("Analyze DAG patterns");
1314 InstrInfoEmitter(RK
).run(OS
);
1315 RK
.startTimer("Emit map table");
1316 EmitMapTable(RK
, OS
);
1319 static TableGen::Emitter::Opt
X("gen-instr-info", EmitInstrInfo
,
1320 "Generate instruction descriptions");