1 //===- AsmMatcherEmitter.cpp - Generate an assembly matcher ---------------===//
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 emits a target specifier matcher for converting parsed
10 // assembly operands in the MCInst structures. It also emits a matcher for
11 // custom operand parsing.
13 // Converting assembly operands into MCInst structures
14 // ---------------------------------------------------
16 // The input to the target specific matcher is a list of literal tokens and
17 // operands. The target specific parser should generally eliminate any syntax
18 // which is not relevant for matching; for example, comma tokens should have
19 // already been consumed and eliminated by the parser. Most instructions will
20 // end up with a single literal token (the instruction name) and some number of
23 // Some example inputs, for X86:
24 // 'addl' (immediate ...) (register ...)
25 // 'add' (immediate ...) (memory ...)
28 // The assembly matcher is responsible for converting this input into a precise
29 // machine instruction (i.e., an instruction with a well defined encoding). This
30 // mapping has several properties which complicate matching:
32 // - It may be ambiguous; many architectures can legally encode particular
33 // variants of an instruction in different ways (for example, using a smaller
34 // encoding for small immediates). Such ambiguities should never be
35 // arbitrarily resolved by the assembler, the assembler is always responsible
36 // for choosing the "best" available instruction.
38 // - It may depend on the subtarget or the assembler context. Instructions
39 // which are invalid for the current mode, but otherwise unambiguous (e.g.,
40 // an SSE instruction in a file being assembled for i486) should be accepted
41 // and rejected by the assembler front end. However, if the proper encoding
42 // for an instruction is dependent on the assembler context then the matcher
43 // is responsible for selecting the correct machine instruction for the
46 // The core matching algorithm attempts to exploit the regularity in most
47 // instruction sets to quickly determine the set of possibly matching
48 // instructions, and the simplify the generated code. Additionally, this helps
49 // to ensure that the ambiguities are intentionally resolved by the user.
51 // The matching is divided into two distinct phases:
53 // 1. Classification: Each operand is mapped to the unique set which (a)
54 // contains it, and (b) is the largest such subset for which a single
55 // instruction could match all members.
57 // For register classes, we can generate these subgroups automatically. For
58 // arbitrary operands, we expect the user to define the classes and their
59 // relations to one another (for example, 8-bit signed immediates as a
60 // subset of 32-bit immediates).
62 // By partitioning the operands in this way, we guarantee that for any
63 // tuple of classes, any single instruction must match either all or none
64 // of the sets of operands which could classify to that tuple.
66 // In addition, the subset relation amongst classes induces a partial order
67 // on such tuples, which we use to resolve ambiguities.
69 // 2. The input can now be treated as a tuple of classes (static tokens are
70 // simple singleton sets). Each such tuple should generally map to a single
71 // instruction (we currently ignore cases where this isn't true, whee!!!),
72 // which we can emit a simple matcher for.
74 // Custom Operand Parsing
75 // ----------------------
77 // Some targets need a custom way to parse operands, some specific instructions
78 // can contain arguments that can represent processor flags and other kinds of
79 // identifiers that need to be mapped to specific values in the final encoded
80 // instructions. The target specific custom operand parsing works in the
83 // 1. A operand match table is built, each entry contains a mnemonic, an
84 // operand class, a mask for all operand positions for that same
85 // class/mnemonic and target features to be checked while trying to match.
87 // 2. The operand matcher will try every possible entry with the same
88 // mnemonic and will check if the target feature for this mnemonic also
89 // matches. After that, if the operand to be matched has its index
90 // present in the mask, a successful match occurs. Otherwise, fallback
91 // to the regular operand parsing.
93 // 3. For a match success, each operand class that has a 'ParserMethod'
94 // becomes part of a switch from where the custom method is called.
96 //===----------------------------------------------------------------------===//
98 #include "CodeGenTarget.h"
99 #include "SubtargetFeatureInfo.h"
101 #include "llvm/ADT/CachedHashString.h"
102 #include "llvm/ADT/PointerUnion.h"
103 #include "llvm/ADT/STLExtras.h"
104 #include "llvm/ADT/SmallPtrSet.h"
105 #include "llvm/ADT/SmallVector.h"
106 #include "llvm/ADT/StringExtras.h"
107 #include "llvm/Config/llvm-config.h"
108 #include "llvm/Support/CommandLine.h"
109 #include "llvm/Support/Debug.h"
110 #include "llvm/Support/ErrorHandling.h"
111 #include "llvm/TableGen/Error.h"
112 #include "llvm/TableGen/Record.h"
113 #include "llvm/TableGen/StringMatcher.h"
114 #include "llvm/TableGen/StringToOffsetTable.h"
115 #include "llvm/TableGen/TableGenBackend.h"
118 #include <forward_list>
122 using namespace llvm
;
124 #define DEBUG_TYPE "asm-matcher-emitter"
126 cl::OptionCategory
AsmMatcherEmitterCat("Options for -gen-asm-matcher");
128 static cl::opt
<std::string
>
129 MatchPrefix("match-prefix", cl::init(""),
130 cl::desc("Only match instructions with the given prefix"),
131 cl::cat(AsmMatcherEmitterCat
));
134 class AsmMatcherInfo
;
136 // Register sets are used as keys in some second-order sets TableGen creates
137 // when generating its data structures. This means that the order of two
138 // RegisterSets can be seen in the outputted AsmMatcher tables occasionally, and
139 // can even affect compiler output (at least seen in diagnostics produced when
140 // all matches fail). So we use a type that sorts them consistently.
141 typedef std::set
<Record
*, LessRecordByID
> RegisterSet
;
143 class AsmMatcherEmitter
{
144 RecordKeeper
&Records
;
146 AsmMatcherEmitter(RecordKeeper
&R
) : Records(R
) {}
148 void run(raw_ostream
&o
);
151 /// ClassInfo - Helper class for storing the information about a particular
152 /// class of operands which can be matched.
155 /// Invalid kind, for use as a sentinel value.
158 /// The class for a particular token.
161 /// The (first) register class, subsequent register classes are
162 /// RegisterClass0+1, and so on.
165 /// The (first) user defined class, subsequent user defined classes are
166 /// UserClass0+1, and so on.
170 /// Kind - The class kind, which is either a predefined kind, or (UserClass0 +
171 /// N) for the Nth user defined class.
174 /// SuperClasses - The super classes of this class. Note that for simplicities
175 /// sake user operands only record their immediate super class, while register
176 /// operands include all superclasses.
177 std::vector
<ClassInfo
*> SuperClasses
;
179 /// Name - The full class name, suitable for use in an enum.
182 /// ClassName - The unadorned generic name for this class (e.g., Token).
183 std::string ClassName
;
185 /// ValueName - The name of the value this class represents; for a token this
186 /// is the literal token string, for an operand it is the TableGen class (or
187 /// empty if this is a derived class).
188 std::string ValueName
;
190 /// PredicateMethod - The name of the operand method to test whether the
191 /// operand matches this class; this is not valid for Token or register kinds.
192 std::string PredicateMethod
;
194 /// RenderMethod - The name of the operand method to add this operand to an
195 /// MCInst; this is not valid for Token or register kinds.
196 std::string RenderMethod
;
198 /// ParserMethod - The name of the operand method to do a target specific
199 /// parsing on the operand.
200 std::string ParserMethod
;
202 /// For register classes: the records for all the registers in this class.
203 RegisterSet Registers
;
205 /// For custom match classes: the diagnostic kind for when the predicate fails.
206 std::string DiagnosticType
;
208 /// For custom match classes: the diagnostic string for when the predicate fails.
209 std::string DiagnosticString
;
211 /// Is this operand optional and not always required.
214 /// DefaultMethod - The name of the method that returns the default operand
215 /// for optional operand
216 std::string DefaultMethod
;
219 /// isRegisterClass() - Check if this is a register class.
220 bool isRegisterClass() const {
221 return Kind
>= RegisterClass0
&& Kind
< UserClass0
;
224 /// isUserClass() - Check if this is a user defined class.
225 bool isUserClass() const {
226 return Kind
>= UserClass0
;
229 /// isRelatedTo - Check whether this class is "related" to \p RHS. Classes
230 /// are related if they are in the same class hierarchy.
231 bool isRelatedTo(const ClassInfo
&RHS
) const {
232 // Tokens are only related to tokens.
233 if (Kind
== Token
|| RHS
.Kind
== Token
)
234 return Kind
== Token
&& RHS
.Kind
== Token
;
236 // Registers classes are only related to registers classes, and only if
237 // their intersection is non-empty.
238 if (isRegisterClass() || RHS
.isRegisterClass()) {
239 if (!isRegisterClass() || !RHS
.isRegisterClass())
243 std::insert_iterator
<RegisterSet
> II(Tmp
, Tmp
.begin());
244 std::set_intersection(Registers
.begin(), Registers
.end(),
245 RHS
.Registers
.begin(), RHS
.Registers
.end(),
246 II
, LessRecordByID());
251 // Otherwise we have two users operands; they are related if they are in the
252 // same class hierarchy.
254 // FIXME: This is an oversimplification, they should only be related if they
255 // intersect, however we don't have that information.
256 assert(isUserClass() && RHS
.isUserClass() && "Unexpected class!");
257 const ClassInfo
*Root
= this;
258 while (!Root
->SuperClasses
.empty())
259 Root
= Root
->SuperClasses
.front();
261 const ClassInfo
*RHSRoot
= &RHS
;
262 while (!RHSRoot
->SuperClasses
.empty())
263 RHSRoot
= RHSRoot
->SuperClasses
.front();
265 return Root
== RHSRoot
;
268 /// isSubsetOf - Test whether this class is a subset of \p RHS.
269 bool isSubsetOf(const ClassInfo
&RHS
) const {
270 // This is a subset of RHS if it is the same class...
274 // ... or if any of its super classes are a subset of RHS.
275 SmallVector
<const ClassInfo
*, 16> Worklist(SuperClasses
.begin(),
277 SmallPtrSet
<const ClassInfo
*, 16> Visited
;
278 while (!Worklist
.empty()) {
279 auto *CI
= Worklist
.pop_back_val();
282 for (auto *Super
: CI
->SuperClasses
)
283 if (Visited
.insert(Super
).second
)
284 Worklist
.push_back(Super
);
290 int getTreeDepth() const {
292 const ClassInfo
*Root
= this;
293 while (!Root
->SuperClasses
.empty()) {
295 Root
= Root
->SuperClasses
.front();
300 const ClassInfo
*findRoot() const {
301 const ClassInfo
*Root
= this;
302 while (!Root
->SuperClasses
.empty())
303 Root
= Root
->SuperClasses
.front();
307 /// Compare two classes. This does not produce a total ordering, but does
308 /// guarantee that subclasses are sorted before their parents, and that the
309 /// ordering is transitive.
310 bool operator<(const ClassInfo
&RHS
) const {
314 // First, enforce the ordering between the three different types of class.
315 // Tokens sort before registers, which sort before user classes.
317 if (RHS
.Kind
!= Token
)
319 assert(RHS
.Kind
== Token
);
320 } else if (isRegisterClass()) {
321 if (RHS
.Kind
== Token
)
323 else if (RHS
.isUserClass())
325 assert(RHS
.isRegisterClass());
326 } else if (isUserClass()) {
327 if (!RHS
.isUserClass())
329 assert(RHS
.isUserClass());
331 llvm_unreachable("Unknown ClassInfoKind");
334 if (Kind
== Token
|| isUserClass()) {
335 // Related tokens and user classes get sorted by depth in the inheritence
336 // tree (so that subclasses are before their parents).
337 if (isRelatedTo(RHS
)) {
338 if (getTreeDepth() > RHS
.getTreeDepth())
340 if (getTreeDepth() < RHS
.getTreeDepth())
343 // Unrelated tokens and user classes are ordered by the name of their
344 // root nodes, so that there is a consistent ordering between
345 // unconnected trees.
346 return findRoot()->ValueName
< RHS
.findRoot()->ValueName
;
348 } else if (isRegisterClass()) {
349 // For register sets, sort by number of registers. This guarantees that
350 // a set will always sort before all of it's strict supersets.
351 if (Registers
.size() != RHS
.Registers
.size())
352 return Registers
.size() < RHS
.Registers
.size();
354 llvm_unreachable("Unknown ClassInfoKind");
357 // FIXME: We should be able to just return false here, as we only need a
358 // partial order (we use stable sorts, so this is deterministic) and the
359 // name of a class shouldn't be significant. However, some of the backends
360 // accidentally rely on this behaviour, so it will have to stay like this
361 // until they are fixed.
362 return ValueName
< RHS
.ValueName
;
366 class AsmVariantInfo
{
368 StringRef RegisterPrefix
;
369 StringRef TokenizingCharacters
;
370 StringRef SeparatorCharacters
;
371 StringRef BreakCharacters
;
376 /// MatchableInfo - Helper class for storing the necessary information for an
377 /// instruction or alias which is capable of being matched.
378 struct MatchableInfo
{
380 /// Token - This is the token that the operand came from.
383 /// The unique class instance this operand should match.
386 /// The operand name this is, if anything.
389 /// The operand name this is, before renaming for tied operands.
390 StringRef OrigSrcOpName
;
392 /// The suboperand index within SrcOpName, or -1 for the entire operand.
395 /// Whether the token is "isolated", i.e., it is preceded and followed
397 bool IsIsolatedToken
;
399 /// Register record if this token is singleton register.
400 Record
*SingletonReg
;
402 explicit AsmOperand(bool IsIsolatedToken
, StringRef T
)
403 : Token(T
), Class(nullptr), SubOpIdx(-1),
404 IsIsolatedToken(IsIsolatedToken
), SingletonReg(nullptr) {}
407 /// ResOperand - This represents a single operand in the result instruction
408 /// generated by the match. In cases (like addressing modes) where a single
409 /// assembler operand expands to multiple MCOperands, this represents the
410 /// single assembler operand, not the MCOperand.
413 /// RenderAsmOperand - This represents an operand result that is
414 /// generated by calling the render method on the assembly operand. The
415 /// corresponding AsmOperand is specified by AsmOperandNum.
418 /// TiedOperand - This represents a result operand that is a duplicate of
419 /// a previous result operand.
422 /// ImmOperand - This represents an immediate value that is dumped into
426 /// RegOperand - This represents a fixed register that is dumped in.
430 /// Tuple containing the index of the (earlier) result operand that should
431 /// be copied from, as well as the indices of the corresponding (parsed)
432 /// operands in the asm string.
433 struct TiedOperandsTuple
{
435 unsigned SrcOpnd1Idx
;
436 unsigned SrcOpnd2Idx
;
440 /// This is the operand # in the AsmOperands list that this should be
442 unsigned AsmOperandNum
;
444 /// Description of tied operands.
445 TiedOperandsTuple TiedOperands
;
447 /// ImmVal - This is the immediate value added to the instruction.
450 /// Register - This is the register record.
454 /// MINumOperands - The number of MCInst operands populated by this
456 unsigned MINumOperands
;
458 static ResOperand
getRenderedOp(unsigned AsmOpNum
, unsigned NumOperands
) {
460 X
.Kind
= RenderAsmOperand
;
461 X
.AsmOperandNum
= AsmOpNum
;
462 X
.MINumOperands
= NumOperands
;
466 static ResOperand
getTiedOp(unsigned TiedOperandNum
, unsigned SrcOperand1
,
467 unsigned SrcOperand2
) {
469 X
.Kind
= TiedOperand
;
470 X
.TiedOperands
= { TiedOperandNum
, SrcOperand1
, SrcOperand2
};
475 static ResOperand
getImmOp(int64_t Val
) {
483 static ResOperand
getRegOp(Record
*Reg
) {
492 /// AsmVariantID - Target's assembly syntax variant no.
495 /// AsmString - The assembly string for this instruction (with variants
496 /// removed), e.g. "movsx $src, $dst".
497 std::string AsmString
;
499 /// TheDef - This is the definition of the instruction or InstAlias that this
500 /// matchable came from.
501 Record
*const TheDef
;
503 /// DefRec - This is the definition that it came from.
504 PointerUnion
<const CodeGenInstruction
*, const CodeGenInstAlias
*> DefRec
;
506 const CodeGenInstruction
*getResultInst() const {
507 if (DefRec
.is
<const CodeGenInstruction
*>())
508 return DefRec
.get
<const CodeGenInstruction
*>();
509 return DefRec
.get
<const CodeGenInstAlias
*>()->ResultInst
;
512 /// ResOperands - This is the operand list that should be built for the result
514 SmallVector
<ResOperand
, 8> ResOperands
;
516 /// Mnemonic - This is the first token of the matched instruction, its
520 /// AsmOperands - The textual operands that this instruction matches,
521 /// annotated with a class and where in the OperandList they were defined.
522 /// This directly corresponds to the tokenized AsmString after the mnemonic is
524 SmallVector
<AsmOperand
, 8> AsmOperands
;
526 /// Predicates - The required subtarget features to match this instruction.
527 SmallVector
<const SubtargetFeatureInfo
*, 4> RequiredFeatures
;
529 /// ConversionFnKind - The enum value which is passed to the generated
530 /// convertToMCInst to convert parsed operands into an MCInst for this
532 std::string ConversionFnKind
;
534 /// If this instruction is deprecated in some form.
537 /// If this is an alias, this is use to determine whether or not to using
538 /// the conversion function defined by the instruction's AsmMatchConverter
539 /// or to use the function generated by the alias.
540 bool UseInstAsmMatchConverter
;
542 MatchableInfo(const CodeGenInstruction
&CGI
)
543 : AsmVariantID(0), AsmString(CGI
.AsmString
), TheDef(CGI
.TheDef
), DefRec(&CGI
),
544 UseInstAsmMatchConverter(true) {
547 MatchableInfo(std::unique_ptr
<const CodeGenInstAlias
> Alias
)
548 : AsmVariantID(0), AsmString(Alias
->AsmString
), TheDef(Alias
->TheDef
),
549 DefRec(Alias
.release()),
550 UseInstAsmMatchConverter(
551 TheDef
->getValueAsBit("UseInstAsmMatchConverter")) {
554 // Could remove this and the dtor if PointerUnion supported unique_ptr
555 // elements with a dynamic failure/assertion (like the one below) in the case
556 // where it was copied while being in an owning state.
557 MatchableInfo(const MatchableInfo
&RHS
)
558 : AsmVariantID(RHS
.AsmVariantID
), AsmString(RHS
.AsmString
),
559 TheDef(RHS
.TheDef
), DefRec(RHS
.DefRec
), ResOperands(RHS
.ResOperands
),
560 Mnemonic(RHS
.Mnemonic
), AsmOperands(RHS
.AsmOperands
),
561 RequiredFeatures(RHS
.RequiredFeatures
),
562 ConversionFnKind(RHS
.ConversionFnKind
),
563 HasDeprecation(RHS
.HasDeprecation
),
564 UseInstAsmMatchConverter(RHS
.UseInstAsmMatchConverter
) {
565 assert(!DefRec
.is
<const CodeGenInstAlias
*>());
569 delete DefRec
.dyn_cast
<const CodeGenInstAlias
*>();
572 // Two-operand aliases clone from the main matchable, but mark the second
573 // operand as a tied operand of the first for purposes of the assembler.
574 void formTwoOperandAlias(StringRef Constraint
);
576 void initialize(const AsmMatcherInfo
&Info
,
577 SmallPtrSetImpl
<Record
*> &SingletonRegisters
,
578 AsmVariantInfo
const &Variant
,
579 bool HasMnemonicFirst
);
581 /// validate - Return true if this matchable is a valid thing to match against
582 /// and perform a bunch of validity checking.
583 bool validate(StringRef CommentDelimiter
, bool IsAlias
) const;
585 /// findAsmOperand - Find the AsmOperand with the specified name and
586 /// suboperand index.
587 int findAsmOperand(StringRef N
, int SubOpIdx
) const {
588 auto I
= find_if(AsmOperands
, [&](const AsmOperand
&Op
) {
589 return Op
.SrcOpName
== N
&& Op
.SubOpIdx
== SubOpIdx
;
591 return (I
!= AsmOperands
.end()) ? I
- AsmOperands
.begin() : -1;
594 /// findAsmOperandNamed - Find the first AsmOperand with the specified name.
595 /// This does not check the suboperand index.
596 int findAsmOperandNamed(StringRef N
, int LastIdx
= -1) const {
597 auto I
= std::find_if(AsmOperands
.begin() + LastIdx
+ 1, AsmOperands
.end(),
598 [&](const AsmOperand
&Op
) { return Op
.SrcOpName
== N
; });
599 return (I
!= AsmOperands
.end()) ? I
- AsmOperands
.begin() : -1;
602 int findAsmOperandOriginallyNamed(StringRef N
) const {
605 [&](const AsmOperand
&Op
) { return Op
.OrigSrcOpName
== N
; });
606 return (I
!= AsmOperands
.end()) ? I
- AsmOperands
.begin() : -1;
609 void buildInstructionResultOperands();
610 void buildAliasResultOperands(bool AliasConstraintsAreChecked
);
612 /// operator< - Compare two matchables.
613 bool operator<(const MatchableInfo
&RHS
) const {
614 // The primary comparator is the instruction mnemonic.
615 if (int Cmp
= Mnemonic
.compare_insensitive(RHS
.Mnemonic
))
618 if (AsmOperands
.size() != RHS
.AsmOperands
.size())
619 return AsmOperands
.size() < RHS
.AsmOperands
.size();
621 // Compare lexicographically by operand. The matcher validates that other
622 // orderings wouldn't be ambiguous using \see couldMatchAmbiguouslyWith().
623 for (unsigned i
= 0, e
= AsmOperands
.size(); i
!= e
; ++i
) {
624 if (*AsmOperands
[i
].Class
< *RHS
.AsmOperands
[i
].Class
)
626 if (*RHS
.AsmOperands
[i
].Class
< *AsmOperands
[i
].Class
)
630 // Give matches that require more features higher precedence. This is useful
631 // because we cannot define AssemblerPredicates with the negation of
632 // processor features. For example, ARM v6 "nop" may be either a HINT or
633 // MOV. With v6, we want to match HINT. The assembler has no way to
634 // predicate MOV under "NoV6", but HINT will always match first because it
635 // requires V6 while MOV does not.
636 if (RequiredFeatures
.size() != RHS
.RequiredFeatures
.size())
637 return RequiredFeatures
.size() > RHS
.RequiredFeatures
.size();
642 /// couldMatchAmbiguouslyWith - Check whether this matchable could
643 /// ambiguously match the same set of operands as \p RHS (without being a
644 /// strictly superior match).
645 bool couldMatchAmbiguouslyWith(const MatchableInfo
&RHS
) const {
646 // The primary comparator is the instruction mnemonic.
647 if (Mnemonic
!= RHS
.Mnemonic
)
650 // Different variants can't conflict.
651 if (AsmVariantID
!= RHS
.AsmVariantID
)
654 // The number of operands is unambiguous.
655 if (AsmOperands
.size() != RHS
.AsmOperands
.size())
658 // Otherwise, make sure the ordering of the two instructions is unambiguous
659 // by checking that either (a) a token or operand kind discriminates them,
660 // or (b) the ordering among equivalent kinds is consistent.
662 // Tokens and operand kinds are unambiguous (assuming a correct target
664 for (unsigned i
= 0, e
= AsmOperands
.size(); i
!= e
; ++i
)
665 if (AsmOperands
[i
].Class
->Kind
!= RHS
.AsmOperands
[i
].Class
->Kind
||
666 AsmOperands
[i
].Class
->Kind
== ClassInfo::Token
)
667 if (*AsmOperands
[i
].Class
< *RHS
.AsmOperands
[i
].Class
||
668 *RHS
.AsmOperands
[i
].Class
< *AsmOperands
[i
].Class
)
671 // Otherwise, this operand could commute if all operands are equivalent, or
672 // there is a pair of operands that compare less than and a pair that
673 // compare greater than.
674 bool HasLT
= false, HasGT
= false;
675 for (unsigned i
= 0, e
= AsmOperands
.size(); i
!= e
; ++i
) {
676 if (*AsmOperands
[i
].Class
< *RHS
.AsmOperands
[i
].Class
)
678 if (*RHS
.AsmOperands
[i
].Class
< *AsmOperands
[i
].Class
)
682 return HasLT
== HasGT
;
688 void tokenizeAsmString(AsmMatcherInfo
const &Info
,
689 AsmVariantInfo
const &Variant
);
690 void addAsmOperand(StringRef Token
, bool IsIsolatedToken
= false);
693 struct OperandMatchEntry
{
694 unsigned OperandMask
;
695 const MatchableInfo
* MI
;
698 static OperandMatchEntry
create(const MatchableInfo
*mi
, ClassInfo
*ci
,
701 X
.OperandMask
= opMask
;
708 class AsmMatcherInfo
{
711 RecordKeeper
&Records
;
713 /// The tablegen AsmParser record.
716 /// Target - The target information.
717 CodeGenTarget
&Target
;
719 /// The classes which are needed for matching.
720 std::forward_list
<ClassInfo
> Classes
;
722 /// The information on the matchables to match.
723 std::vector
<std::unique_ptr
<MatchableInfo
>> Matchables
;
725 /// Info for custom matching operands by user defined methods.
726 std::vector
<OperandMatchEntry
> OperandMatchInfo
;
728 /// Map of Register records to their class information.
729 typedef std::map
<Record
*, ClassInfo
*, LessRecordByID
> RegisterClassesTy
;
730 RegisterClassesTy RegisterClasses
;
732 /// Map of Predicate records to their subtarget information.
733 std::map
<Record
*, SubtargetFeatureInfo
, LessRecordByID
> SubtargetFeatures
;
735 /// Map of AsmOperandClass records to their class information.
736 std::map
<Record
*, ClassInfo
*> AsmOperandClasses
;
738 /// Map of RegisterClass records to their class information.
739 std::map
<Record
*, ClassInfo
*> RegisterClassClasses
;
742 /// Map of token to class information which has already been constructed.
743 std::map
<std::string
, ClassInfo
*> TokenClasses
;
746 /// getTokenClass - Lookup or create the class for the given token.
747 ClassInfo
*getTokenClass(StringRef Token
);
749 /// getOperandClass - Lookup or create the class for the given operand.
750 ClassInfo
*getOperandClass(const CGIOperandList::OperandInfo
&OI
,
752 ClassInfo
*getOperandClass(Record
*Rec
, int SubOpIdx
);
754 /// buildRegisterClasses - Build the ClassInfo* instances for register
756 void buildRegisterClasses(SmallPtrSetImpl
<Record
*> &SingletonRegisters
);
758 /// buildOperandClasses - Build the ClassInfo* instances for user defined
760 void buildOperandClasses();
762 void buildInstructionOperandReference(MatchableInfo
*II
, StringRef OpName
,
764 void buildAliasOperandReference(MatchableInfo
*II
, StringRef OpName
,
765 MatchableInfo::AsmOperand
&Op
);
768 AsmMatcherInfo(Record
*AsmParser
,
769 CodeGenTarget
&Target
,
770 RecordKeeper
&Records
);
772 /// Construct the various tables used during matching.
775 /// buildOperandMatchInfo - Build the necessary information to handle user
776 /// defined operand parsing methods.
777 void buildOperandMatchInfo();
779 /// getSubtargetFeature - Lookup or create the subtarget feature info for the
781 const SubtargetFeatureInfo
*getSubtargetFeature(Record
*Def
) const {
782 assert(Def
->isSubClassOf("Predicate") && "Invalid predicate type!");
783 const auto &I
= SubtargetFeatures
.find(Def
);
784 return I
== SubtargetFeatures
.end() ? nullptr : &I
->second
;
787 RecordKeeper
&getRecords() const {
791 bool hasOptionalOperands() const {
792 return any_of(Classes
,
793 [](const ClassInfo
&Class
) { return Class
.IsOptional
; });
797 } // end anonymous namespace
799 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
800 LLVM_DUMP_METHOD
void MatchableInfo::dump() const {
801 errs() << TheDef
->getName() << " -- " << "flattened:\"" << AsmString
<<"\"\n";
803 errs() << " variant: " << AsmVariantID
<< "\n";
805 for (unsigned i
= 0, e
= AsmOperands
.size(); i
!= e
; ++i
) {
806 const AsmOperand
&Op
= AsmOperands
[i
];
807 errs() << " op[" << i
<< "] = " << Op
.Class
->ClassName
<< " - ";
808 errs() << '\"' << Op
.Token
<< "\"\n";
813 static std::pair
<StringRef
, StringRef
>
814 parseTwoOperandConstraint(StringRef S
, ArrayRef
<SMLoc
> Loc
) {
815 // Split via the '='.
816 std::pair
<StringRef
, StringRef
> Ops
= S
.split('=');
817 if (Ops
.second
== "")
818 PrintFatalError(Loc
, "missing '=' in two-operand alias constraint");
819 // Trim whitespace and the leading '$' on the operand names.
820 size_t start
= Ops
.first
.find_first_of('$');
821 if (start
== std::string::npos
)
822 PrintFatalError(Loc
, "expected '$' prefix on asm operand name");
823 Ops
.first
= Ops
.first
.slice(start
+ 1, std::string::npos
);
824 size_t end
= Ops
.first
.find_last_of(" \t");
825 Ops
.first
= Ops
.first
.slice(0, end
);
826 // Now the second operand.
827 start
= Ops
.second
.find_first_of('$');
828 if (start
== std::string::npos
)
829 PrintFatalError(Loc
, "expected '$' prefix on asm operand name");
830 Ops
.second
= Ops
.second
.slice(start
+ 1, std::string::npos
);
831 end
= Ops
.second
.find_last_of(" \t");
832 Ops
.first
= Ops
.first
.slice(0, end
);
836 void MatchableInfo::formTwoOperandAlias(StringRef Constraint
) {
837 // Figure out which operands are aliased and mark them as tied.
838 std::pair
<StringRef
, StringRef
> Ops
=
839 parseTwoOperandConstraint(Constraint
, TheDef
->getLoc());
841 // Find the AsmOperands that refer to the operands we're aliasing.
842 int SrcAsmOperand
= findAsmOperandNamed(Ops
.first
);
843 int DstAsmOperand
= findAsmOperandNamed(Ops
.second
);
844 if (SrcAsmOperand
== -1)
845 PrintFatalError(TheDef
->getLoc(),
846 "unknown source two-operand alias operand '" + Ops
.first
+
848 if (DstAsmOperand
== -1)
849 PrintFatalError(TheDef
->getLoc(),
850 "unknown destination two-operand alias operand '" +
853 // Find the ResOperand that refers to the operand we're aliasing away
854 // and update it to refer to the combined operand instead.
855 for (ResOperand
&Op
: ResOperands
) {
856 if (Op
.Kind
== ResOperand::RenderAsmOperand
&&
857 Op
.AsmOperandNum
== (unsigned)SrcAsmOperand
) {
858 Op
.AsmOperandNum
= DstAsmOperand
;
862 // Remove the AsmOperand for the alias operand.
863 AsmOperands
.erase(AsmOperands
.begin() + SrcAsmOperand
);
864 // Adjust the ResOperand references to any AsmOperands that followed
865 // the one we just deleted.
866 for (ResOperand
&Op
: ResOperands
) {
869 // Nothing to do for operands that don't reference AsmOperands.
871 case ResOperand::RenderAsmOperand
:
872 if (Op
.AsmOperandNum
> (unsigned)SrcAsmOperand
)
879 /// extractSingletonRegisterForAsmOperand - Extract singleton register,
880 /// if present, from specified token.
882 extractSingletonRegisterForAsmOperand(MatchableInfo::AsmOperand
&Op
,
883 const AsmMatcherInfo
&Info
,
884 StringRef RegisterPrefix
) {
885 StringRef Tok
= Op
.Token
;
887 // If this token is not an isolated token, i.e., it isn't separated from
888 // other tokens (e.g. with whitespace), don't interpret it as a register name.
889 if (!Op
.IsIsolatedToken
)
892 if (RegisterPrefix
.empty()) {
893 std::string LoweredTok
= Tok
.lower();
894 if (const CodeGenRegister
*Reg
= Info
.Target
.getRegisterByName(LoweredTok
))
895 Op
.SingletonReg
= Reg
->TheDef
;
899 if (!Tok
.startswith(RegisterPrefix
))
902 StringRef RegName
= Tok
.substr(RegisterPrefix
.size());
903 if (const CodeGenRegister
*Reg
= Info
.Target
.getRegisterByName(RegName
))
904 Op
.SingletonReg
= Reg
->TheDef
;
906 // If there is no register prefix (i.e. "%" in "%eax"), then this may
907 // be some random non-register token, just ignore it.
910 void MatchableInfo::initialize(const AsmMatcherInfo
&Info
,
911 SmallPtrSetImpl
<Record
*> &SingletonRegisters
,
912 AsmVariantInfo
const &Variant
,
913 bool HasMnemonicFirst
) {
914 AsmVariantID
= Variant
.AsmVariantNo
;
916 CodeGenInstruction::FlattenAsmStringVariants(AsmString
,
917 Variant
.AsmVariantNo
);
919 tokenizeAsmString(Info
, Variant
);
921 // The first token of the instruction is the mnemonic, which must be a
922 // simple string, not a $foo variable or a singleton register.
923 if (AsmOperands
.empty())
924 PrintFatalError(TheDef
->getLoc(),
925 "Instruction '" + TheDef
->getName() + "' has no tokens");
927 assert(!AsmOperands
[0].Token
.empty());
928 if (HasMnemonicFirst
) {
929 Mnemonic
= AsmOperands
[0].Token
;
930 if (Mnemonic
[0] == '$')
931 PrintFatalError(TheDef
->getLoc(),
932 "Invalid instruction mnemonic '" + Mnemonic
+ "'!");
934 // Remove the first operand, it is tracked in the mnemonic field.
935 AsmOperands
.erase(AsmOperands
.begin());
936 } else if (AsmOperands
[0].Token
[0] != '$')
937 Mnemonic
= AsmOperands
[0].Token
;
939 // Compute the require features.
940 for (Record
*Predicate
: TheDef
->getValueAsListOfDefs("Predicates"))
941 if (const SubtargetFeatureInfo
*Feature
=
942 Info
.getSubtargetFeature(Predicate
))
943 RequiredFeatures
.push_back(Feature
);
945 // Collect singleton registers, if used.
946 for (MatchableInfo::AsmOperand
&Op
: AsmOperands
) {
947 extractSingletonRegisterForAsmOperand(Op
, Info
, Variant
.RegisterPrefix
);
948 if (Record
*Reg
= Op
.SingletonReg
)
949 SingletonRegisters
.insert(Reg
);
952 const RecordVal
*DepMask
= TheDef
->getValue("DeprecatedFeatureMask");
954 DepMask
= TheDef
->getValue("ComplexDeprecationPredicate");
957 DepMask
? !DepMask
->getValue()->getAsUnquotedString().empty() : false;
960 /// Append an AsmOperand for the given substring of AsmString.
961 void MatchableInfo::addAsmOperand(StringRef Token
, bool IsIsolatedToken
) {
962 AsmOperands
.push_back(AsmOperand(IsIsolatedToken
, Token
));
965 /// tokenizeAsmString - Tokenize a simplified assembly string.
966 void MatchableInfo::tokenizeAsmString(const AsmMatcherInfo
&Info
,
967 AsmVariantInfo
const &Variant
) {
968 StringRef String
= AsmString
;
971 bool IsIsolatedToken
= true;
972 for (size_t i
= 0, e
= String
.size(); i
!= e
; ++i
) {
973 char Char
= String
[i
];
974 if (Variant
.BreakCharacters
.find(Char
) != std::string::npos
) {
976 addAsmOperand(String
.slice(Prev
, i
), false);
978 IsIsolatedToken
= false;
983 if (Variant
.TokenizingCharacters
.find(Char
) != std::string::npos
) {
985 addAsmOperand(String
.slice(Prev
, i
), IsIsolatedToken
);
987 IsIsolatedToken
= false;
989 addAsmOperand(String
.slice(i
, i
+ 1), IsIsolatedToken
);
991 IsIsolatedToken
= true;
994 if (Variant
.SeparatorCharacters
.find(Char
) != std::string::npos
) {
996 addAsmOperand(String
.slice(Prev
, i
), IsIsolatedToken
);
1000 IsIsolatedToken
= true;
1007 addAsmOperand(String
.slice(Prev
, i
), false);
1009 IsIsolatedToken
= false;
1012 assert(i
!= String
.size() && "Invalid quoted character");
1013 addAsmOperand(String
.slice(i
, i
+ 1), IsIsolatedToken
);
1015 IsIsolatedToken
= false;
1020 addAsmOperand(String
.slice(Prev
, i
), IsIsolatedToken
);
1022 IsIsolatedToken
= false;
1025 // If this isn't "${", start new identifier looking like "$xxx"
1026 if (i
+ 1 == String
.size() || String
[i
+ 1] != '{') {
1031 size_t EndPos
= String
.find('}', i
);
1032 assert(EndPos
!= StringRef::npos
&&
1033 "Missing brace in operand reference!");
1034 addAsmOperand(String
.slice(i
, EndPos
+1), IsIsolatedToken
);
1037 IsIsolatedToken
= false;
1046 if (InTok
&& Prev
!= String
.size())
1047 addAsmOperand(String
.substr(Prev
), IsIsolatedToken
);
1050 bool MatchableInfo::validate(StringRef CommentDelimiter
, bool IsAlias
) const {
1051 // Reject matchables with no .s string.
1052 if (AsmString
.empty())
1053 PrintFatalError(TheDef
->getLoc(), "instruction with empty asm string");
1055 // Reject any matchables with a newline in them, they should be marked
1056 // isCodeGenOnly if they are pseudo instructions.
1057 if (AsmString
.find('\n') != std::string::npos
)
1058 PrintFatalError(TheDef
->getLoc(),
1059 "multiline instruction is not valid for the asmparser, "
1060 "mark it isCodeGenOnly");
1062 // Remove comments from the asm string. We know that the asmstring only
1064 if (!CommentDelimiter
.empty() &&
1065 StringRef(AsmString
).find(CommentDelimiter
) != StringRef::npos
)
1066 PrintFatalError(TheDef
->getLoc(),
1067 "asmstring for instruction has comment character in it, "
1068 "mark it isCodeGenOnly");
1070 // Reject matchables with operand modifiers, these aren't something we can
1071 // handle, the target should be refactored to use operands instead of
1074 // Also, check for instructions which reference the operand multiple times,
1075 // if they don't define a custom AsmMatcher: this implies a constraint that
1076 // the built-in matching code would not honor.
1077 std::set
<std::string
> OperandNames
;
1078 for (const AsmOperand
&Op
: AsmOperands
) {
1079 StringRef Tok
= Op
.Token
;
1080 if (Tok
[0] == '$' && Tok
.find(':') != StringRef::npos
)
1081 PrintFatalError(TheDef
->getLoc(),
1082 "matchable with operand modifier '" + Tok
+
1083 "' not supported by asm matcher. Mark isCodeGenOnly!");
1084 // Verify that any operand is only mentioned once.
1085 // We reject aliases and ignore instructions for now.
1086 if (!IsAlias
&& TheDef
->getValueAsString("AsmMatchConverter").empty() &&
1087 Tok
[0] == '$' && !OperandNames
.insert(std::string(Tok
)).second
) {
1089 errs() << "warning: '" << TheDef
->getName() << "': "
1090 << "ignoring instruction with tied operand '"
1100 static std::string
getEnumNameForToken(StringRef Str
) {
1103 for (char C
: Str
) {
1105 case '*': Res
+= "_STAR_"; break;
1106 case '%': Res
+= "_PCT_"; break;
1107 case ':': Res
+= "_COLON_"; break;
1108 case '!': Res
+= "_EXCLAIM_"; break;
1109 case '.': Res
+= "_DOT_"; break;
1110 case '<': Res
+= "_LT_"; break;
1111 case '>': Res
+= "_GT_"; break;
1112 case '-': Res
+= "_MINUS_"; break;
1113 case '#': Res
+= "_HASH_"; break;
1118 Res
+= "_" + utostr((unsigned)C
) + "_";
1125 ClassInfo
*AsmMatcherInfo::getTokenClass(StringRef Token
) {
1126 ClassInfo
*&Entry
= TokenClasses
[std::string(Token
)];
1129 Classes
.emplace_front();
1130 Entry
= &Classes
.front();
1131 Entry
->Kind
= ClassInfo::Token
;
1132 Entry
->ClassName
= "Token";
1133 Entry
->Name
= "MCK_" + getEnumNameForToken(Token
);
1134 Entry
->ValueName
= std::string(Token
);
1135 Entry
->PredicateMethod
= "<invalid>";
1136 Entry
->RenderMethod
= "<invalid>";
1137 Entry
->ParserMethod
= "";
1138 Entry
->DiagnosticType
= "";
1139 Entry
->IsOptional
= false;
1140 Entry
->DefaultMethod
= "<invalid>";
1147 AsmMatcherInfo::getOperandClass(const CGIOperandList::OperandInfo
&OI
,
1149 Record
*Rec
= OI
.Rec
;
1151 Rec
= cast
<DefInit
>(OI
.MIOperandInfo
->getArg(SubOpIdx
))->getDef();
1152 return getOperandClass(Rec
, SubOpIdx
);
1156 AsmMatcherInfo::getOperandClass(Record
*Rec
, int SubOpIdx
) {
1157 if (Rec
->isSubClassOf("RegisterOperand")) {
1158 // RegisterOperand may have an associated ParserMatchClass. If it does,
1159 // use it, else just fall back to the underlying register class.
1160 const RecordVal
*R
= Rec
->getValue("ParserMatchClass");
1161 if (!R
|| !R
->getValue())
1162 PrintFatalError(Rec
->getLoc(),
1163 "Record `" + Rec
->getName() +
1164 "' does not have a ParserMatchClass!\n");
1166 if (DefInit
*DI
= dyn_cast
<DefInit
>(R
->getValue())) {
1167 Record
*MatchClass
= DI
->getDef();
1168 if (ClassInfo
*CI
= AsmOperandClasses
[MatchClass
])
1172 // No custom match class. Just use the register class.
1173 Record
*ClassRec
= Rec
->getValueAsDef("RegClass");
1175 PrintFatalError(Rec
->getLoc(), "RegisterOperand `" + Rec
->getName() +
1176 "' has no associated register class!\n");
1177 if (ClassInfo
*CI
= RegisterClassClasses
[ClassRec
])
1179 PrintFatalError(Rec
->getLoc(), "register class has no class info!");
1182 if (Rec
->isSubClassOf("RegisterClass")) {
1183 if (ClassInfo
*CI
= RegisterClassClasses
[Rec
])
1185 PrintFatalError(Rec
->getLoc(), "register class has no class info!");
1188 if (!Rec
->isSubClassOf("Operand"))
1189 PrintFatalError(Rec
->getLoc(), "Operand `" + Rec
->getName() +
1190 "' does not derive from class Operand!\n");
1191 Record
*MatchClass
= Rec
->getValueAsDef("ParserMatchClass");
1192 if (ClassInfo
*CI
= AsmOperandClasses
[MatchClass
])
1195 PrintFatalError(Rec
->getLoc(), "operand has no match class!");
1198 struct LessRegisterSet
{
1199 bool operator() (const RegisterSet
&LHS
, const RegisterSet
& RHS
) const {
1200 // std::set<T> defines its own compariso "operator<", but it
1201 // performs a lexicographical comparison by T's innate comparison
1202 // for some reason. We don't want non-deterministic pointer
1203 // comparisons so use this instead.
1204 return std::lexicographical_compare(LHS
.begin(), LHS
.end(),
1205 RHS
.begin(), RHS
.end(),
1210 void AsmMatcherInfo::
1211 buildRegisterClasses(SmallPtrSetImpl
<Record
*> &SingletonRegisters
) {
1212 const auto &Registers
= Target
.getRegBank().getRegisters();
1213 auto &RegClassList
= Target
.getRegBank().getRegClasses();
1215 typedef std::set
<RegisterSet
, LessRegisterSet
> RegisterSetSet
;
1217 // The register sets used for matching.
1218 RegisterSetSet RegisterSets
;
1220 // Gather the defined sets.
1221 for (const CodeGenRegisterClass
&RC
: RegClassList
)
1222 RegisterSets
.insert(
1223 RegisterSet(RC
.getOrder().begin(), RC
.getOrder().end()));
1225 // Add any required singleton sets.
1226 for (Record
*Rec
: SingletonRegisters
) {
1227 RegisterSets
.insert(RegisterSet(&Rec
, &Rec
+ 1));
1230 // Introduce derived sets where necessary (when a register does not determine
1231 // a unique register set class), and build the mapping of registers to the set
1232 // they should classify to.
1233 std::map
<Record
*, RegisterSet
> RegisterMap
;
1234 for (const CodeGenRegister
&CGR
: Registers
) {
1235 // Compute the intersection of all sets containing this register.
1236 RegisterSet ContainingSet
;
1238 for (const RegisterSet
&RS
: RegisterSets
) {
1239 if (!RS
.count(CGR
.TheDef
))
1242 if (ContainingSet
.empty()) {
1248 std::swap(Tmp
, ContainingSet
);
1249 std::insert_iterator
<RegisterSet
> II(ContainingSet
,
1250 ContainingSet
.begin());
1251 std::set_intersection(Tmp
.begin(), Tmp
.end(), RS
.begin(), RS
.end(), II
,
1255 if (!ContainingSet
.empty()) {
1256 RegisterSets
.insert(ContainingSet
);
1257 RegisterMap
.insert(std::make_pair(CGR
.TheDef
, ContainingSet
));
1261 // Construct the register classes.
1262 std::map
<RegisterSet
, ClassInfo
*, LessRegisterSet
> RegisterSetClasses
;
1264 for (const RegisterSet
&RS
: RegisterSets
) {
1265 Classes
.emplace_front();
1266 ClassInfo
*CI
= &Classes
.front();
1267 CI
->Kind
= ClassInfo::RegisterClass0
+ Index
;
1268 CI
->ClassName
= "Reg" + utostr(Index
);
1269 CI
->Name
= "MCK_Reg" + utostr(Index
);
1271 CI
->PredicateMethod
= ""; // unused
1272 CI
->RenderMethod
= "addRegOperands";
1274 // FIXME: diagnostic type.
1275 CI
->DiagnosticType
= "";
1276 CI
->IsOptional
= false;
1277 CI
->DefaultMethod
= ""; // unused
1278 RegisterSetClasses
.insert(std::make_pair(RS
, CI
));
1282 // Find the superclasses; we could compute only the subgroup lattice edges,
1283 // but there isn't really a point.
1284 for (const RegisterSet
&RS
: RegisterSets
) {
1285 ClassInfo
*CI
= RegisterSetClasses
[RS
];
1286 for (const RegisterSet
&RS2
: RegisterSets
)
1288 std::includes(RS2
.begin(), RS2
.end(), RS
.begin(), RS
.end(),
1290 CI
->SuperClasses
.push_back(RegisterSetClasses
[RS2
]);
1293 // Name the register classes which correspond to a user defined RegisterClass.
1294 for (const CodeGenRegisterClass
&RC
: RegClassList
) {
1295 // Def will be NULL for non-user defined register classes.
1296 Record
*Def
= RC
.getDef();
1299 ClassInfo
*CI
= RegisterSetClasses
[RegisterSet(RC
.getOrder().begin(),
1300 RC
.getOrder().end())];
1301 if (CI
->ValueName
.empty()) {
1302 CI
->ClassName
= RC
.getName();
1303 CI
->Name
= "MCK_" + RC
.getName();
1304 CI
->ValueName
= RC
.getName();
1306 CI
->ValueName
= CI
->ValueName
+ "," + RC
.getName();
1308 Init
*DiagnosticType
= Def
->getValueInit("DiagnosticType");
1309 if (StringInit
*SI
= dyn_cast
<StringInit
>(DiagnosticType
))
1310 CI
->DiagnosticType
= std::string(SI
->getValue());
1312 Init
*DiagnosticString
= Def
->getValueInit("DiagnosticString");
1313 if (StringInit
*SI
= dyn_cast
<StringInit
>(DiagnosticString
))
1314 CI
->DiagnosticString
= std::string(SI
->getValue());
1316 // If we have a diagnostic string but the diagnostic type is not specified
1317 // explicitly, create an anonymous diagnostic type.
1318 if (!CI
->DiagnosticString
.empty() && CI
->DiagnosticType
.empty())
1319 CI
->DiagnosticType
= RC
.getName();
1321 RegisterClassClasses
.insert(std::make_pair(Def
, CI
));
1324 // Populate the map for individual registers.
1325 for (auto &It
: RegisterMap
)
1326 RegisterClasses
[It
.first
] = RegisterSetClasses
[It
.second
];
1328 // Name the register classes which correspond to singleton registers.
1329 for (Record
*Rec
: SingletonRegisters
) {
1330 ClassInfo
*CI
= RegisterClasses
[Rec
];
1331 assert(CI
&& "Missing singleton register class info!");
1333 if (CI
->ValueName
.empty()) {
1334 CI
->ClassName
= std::string(Rec
->getName());
1335 CI
->Name
= "MCK_" + Rec
->getName().str();
1336 CI
->ValueName
= std::string(Rec
->getName());
1338 CI
->ValueName
= CI
->ValueName
+ "," + Rec
->getName().str();
1342 void AsmMatcherInfo::buildOperandClasses() {
1343 std::vector
<Record
*> AsmOperands
=
1344 Records
.getAllDerivedDefinitions("AsmOperandClass");
1346 // Pre-populate AsmOperandClasses map.
1347 for (Record
*Rec
: AsmOperands
) {
1348 Classes
.emplace_front();
1349 AsmOperandClasses
[Rec
] = &Classes
.front();
1353 for (Record
*Rec
: AsmOperands
) {
1354 ClassInfo
*CI
= AsmOperandClasses
[Rec
];
1355 CI
->Kind
= ClassInfo::UserClass0
+ Index
;
1357 ListInit
*Supers
= Rec
->getValueAsListInit("SuperClasses");
1358 for (Init
*I
: Supers
->getValues()) {
1359 DefInit
*DI
= dyn_cast
<DefInit
>(I
);
1361 PrintError(Rec
->getLoc(), "Invalid super class reference!");
1365 ClassInfo
*SC
= AsmOperandClasses
[DI
->getDef()];
1367 PrintError(Rec
->getLoc(), "Invalid super class reference!");
1369 CI
->SuperClasses
.push_back(SC
);
1371 CI
->ClassName
= std::string(Rec
->getValueAsString("Name"));
1372 CI
->Name
= "MCK_" + CI
->ClassName
;
1373 CI
->ValueName
= std::string(Rec
->getName());
1375 // Get or construct the predicate method name.
1376 Init
*PMName
= Rec
->getValueInit("PredicateMethod");
1377 if (StringInit
*SI
= dyn_cast
<StringInit
>(PMName
)) {
1378 CI
->PredicateMethod
= std::string(SI
->getValue());
1380 assert(isa
<UnsetInit
>(PMName
) && "Unexpected PredicateMethod field!");
1381 CI
->PredicateMethod
= "is" + CI
->ClassName
;
1384 // Get or construct the render method name.
1385 Init
*RMName
= Rec
->getValueInit("RenderMethod");
1386 if (StringInit
*SI
= dyn_cast
<StringInit
>(RMName
)) {
1387 CI
->RenderMethod
= std::string(SI
->getValue());
1389 assert(isa
<UnsetInit
>(RMName
) && "Unexpected RenderMethod field!");
1390 CI
->RenderMethod
= "add" + CI
->ClassName
+ "Operands";
1393 // Get the parse method name or leave it as empty.
1394 Init
*PRMName
= Rec
->getValueInit("ParserMethod");
1395 if (StringInit
*SI
= dyn_cast
<StringInit
>(PRMName
))
1396 CI
->ParserMethod
= std::string(SI
->getValue());
1398 // Get the diagnostic type and string or leave them as empty.
1399 Init
*DiagnosticType
= Rec
->getValueInit("DiagnosticType");
1400 if (StringInit
*SI
= dyn_cast
<StringInit
>(DiagnosticType
))
1401 CI
->DiagnosticType
= std::string(SI
->getValue());
1402 Init
*DiagnosticString
= Rec
->getValueInit("DiagnosticString");
1403 if (StringInit
*SI
= dyn_cast
<StringInit
>(DiagnosticString
))
1404 CI
->DiagnosticString
= std::string(SI
->getValue());
1405 // If we have a DiagnosticString, we need a DiagnosticType for use within
1407 if (!CI
->DiagnosticString
.empty() && CI
->DiagnosticType
.empty())
1408 CI
->DiagnosticType
= CI
->ClassName
;
1410 Init
*IsOptional
= Rec
->getValueInit("IsOptional");
1411 if (BitInit
*BI
= dyn_cast
<BitInit
>(IsOptional
))
1412 CI
->IsOptional
= BI
->getValue();
1414 // Get or construct the default method name.
1415 Init
*DMName
= Rec
->getValueInit("DefaultMethod");
1416 if (StringInit
*SI
= dyn_cast
<StringInit
>(DMName
)) {
1417 CI
->DefaultMethod
= std::string(SI
->getValue());
1419 assert(isa
<UnsetInit
>(DMName
) && "Unexpected DefaultMethod field!");
1420 CI
->DefaultMethod
= "default" + CI
->ClassName
+ "Operands";
1427 AsmMatcherInfo::AsmMatcherInfo(Record
*asmParser
,
1428 CodeGenTarget
&target
,
1429 RecordKeeper
&records
)
1430 : Records(records
), AsmParser(asmParser
), Target(target
) {
1433 /// buildOperandMatchInfo - Build the necessary information to handle user
1434 /// defined operand parsing methods.
1435 void AsmMatcherInfo::buildOperandMatchInfo() {
1437 /// Map containing a mask with all operands indices that can be found for
1438 /// that class inside a instruction.
1439 typedef std::map
<ClassInfo
*, unsigned, deref
<std::less
<>>> OpClassMaskTy
;
1440 OpClassMaskTy OpClassMask
;
1442 for (const auto &MI
: Matchables
) {
1443 OpClassMask
.clear();
1445 // Keep track of all operands of this instructions which belong to the
1447 for (unsigned i
= 0, e
= MI
->AsmOperands
.size(); i
!= e
; ++i
) {
1448 const MatchableInfo::AsmOperand
&Op
= MI
->AsmOperands
[i
];
1449 if (Op
.Class
->ParserMethod
.empty())
1451 unsigned &OperandMask
= OpClassMask
[Op
.Class
];
1452 OperandMask
|= (1 << i
);
1455 // Generate operand match info for each mnemonic/operand class pair.
1456 for (const auto &OCM
: OpClassMask
) {
1457 unsigned OpMask
= OCM
.second
;
1458 ClassInfo
*CI
= OCM
.first
;
1459 OperandMatchInfo
.push_back(OperandMatchEntry::create(MI
.get(), CI
,
1465 void AsmMatcherInfo::buildInfo() {
1466 // Build information about all of the AssemblerPredicates.
1467 const std::vector
<std::pair
<Record
*, SubtargetFeatureInfo
>>
1468 &SubtargetFeaturePairs
= SubtargetFeatureInfo::getAll(Records
);
1469 SubtargetFeatures
.insert(SubtargetFeaturePairs
.begin(),
1470 SubtargetFeaturePairs
.end());
1472 for (const auto &Pair
: SubtargetFeatures
)
1473 LLVM_DEBUG(Pair
.second
.dump());
1476 bool HasMnemonicFirst
= AsmParser
->getValueAsBit("HasMnemonicFirst");
1477 bool ReportMultipleNearMisses
=
1478 AsmParser
->getValueAsBit("ReportMultipleNearMisses");
1480 // Parse the instructions; we need to do this first so that we can gather the
1481 // singleton register classes.
1482 SmallPtrSet
<Record
*, 16> SingletonRegisters
;
1483 unsigned VariantCount
= Target
.getAsmParserVariantCount();
1484 for (unsigned VC
= 0; VC
!= VariantCount
; ++VC
) {
1485 Record
*AsmVariant
= Target
.getAsmParserVariant(VC
);
1486 StringRef CommentDelimiter
=
1487 AsmVariant
->getValueAsString("CommentDelimiter");
1488 AsmVariantInfo Variant
;
1489 Variant
.RegisterPrefix
= AsmVariant
->getValueAsString("RegisterPrefix");
1490 Variant
.TokenizingCharacters
=
1491 AsmVariant
->getValueAsString("TokenizingCharacters");
1492 Variant
.SeparatorCharacters
=
1493 AsmVariant
->getValueAsString("SeparatorCharacters");
1494 Variant
.BreakCharacters
=
1495 AsmVariant
->getValueAsString("BreakCharacters");
1496 Variant
.Name
= AsmVariant
->getValueAsString("Name");
1497 Variant
.AsmVariantNo
= AsmVariant
->getValueAsInt("Variant");
1499 for (const CodeGenInstruction
*CGI
: Target
.getInstructionsByEnumValue()) {
1501 // If the tblgen -match-prefix option is specified (for tblgen hackers),
1502 // filter the set of instructions we consider.
1503 if (!StringRef(CGI
->TheDef
->getName()).startswith(MatchPrefix
))
1506 // Ignore "codegen only" instructions.
1507 if (CGI
->TheDef
->getValueAsBit("isCodeGenOnly"))
1510 // Ignore instructions for different instructions
1511 StringRef V
= CGI
->TheDef
->getValueAsString("AsmVariantName");
1512 if (!V
.empty() && V
!= Variant
.Name
)
1515 auto II
= std::make_unique
<MatchableInfo
>(*CGI
);
1517 II
->initialize(*this, SingletonRegisters
, Variant
, HasMnemonicFirst
);
1519 // Ignore instructions which shouldn't be matched and diagnose invalid
1520 // instruction definitions with an error.
1521 if (!II
->validate(CommentDelimiter
, false))
1524 Matchables
.push_back(std::move(II
));
1527 // Parse all of the InstAlias definitions and stick them in the list of
1529 std::vector
<Record
*> AllInstAliases
=
1530 Records
.getAllDerivedDefinitions("InstAlias");
1531 for (Record
*InstAlias
: AllInstAliases
) {
1532 auto Alias
= std::make_unique
<CodeGenInstAlias
>(InstAlias
, Target
);
1534 // If the tblgen -match-prefix option is specified (for tblgen hackers),
1535 // filter the set of instruction aliases we consider, based on the target
1537 if (!StringRef(Alias
->ResultInst
->TheDef
->getName())
1538 .startswith( MatchPrefix
))
1541 StringRef V
= Alias
->TheDef
->getValueAsString("AsmVariantName");
1542 if (!V
.empty() && V
!= Variant
.Name
)
1545 auto II
= std::make_unique
<MatchableInfo
>(std::move(Alias
));
1547 II
->initialize(*this, SingletonRegisters
, Variant
, HasMnemonicFirst
);
1549 // Validate the alias definitions.
1550 II
->validate(CommentDelimiter
, true);
1552 Matchables
.push_back(std::move(II
));
1556 // Build info for the register classes.
1557 buildRegisterClasses(SingletonRegisters
);
1559 // Build info for the user defined assembly operand classes.
1560 buildOperandClasses();
1562 // Build the information about matchables, now that we have fully formed
1564 std::vector
<std::unique_ptr
<MatchableInfo
>> NewMatchables
;
1565 for (auto &II
: Matchables
) {
1566 // Parse the tokens after the mnemonic.
1567 // Note: buildInstructionOperandReference may insert new AsmOperands, so
1568 // don't precompute the loop bound.
1569 for (unsigned i
= 0; i
!= II
->AsmOperands
.size(); ++i
) {
1570 MatchableInfo::AsmOperand
&Op
= II
->AsmOperands
[i
];
1571 StringRef Token
= Op
.Token
;
1573 // Check for singleton registers.
1574 if (Record
*RegRecord
= Op
.SingletonReg
) {
1575 Op
.Class
= RegisterClasses
[RegRecord
];
1576 assert(Op
.Class
&& Op
.Class
->Registers
.size() == 1 &&
1577 "Unexpected class for singleton register");
1581 // Check for simple tokens.
1582 if (Token
[0] != '$') {
1583 Op
.Class
= getTokenClass(Token
);
1587 if (Token
.size() > 1 && isdigit(Token
[1])) {
1588 Op
.Class
= getTokenClass(Token
);
1592 // Otherwise this is an operand reference.
1593 StringRef OperandName
;
1594 if (Token
[1] == '{')
1595 OperandName
= Token
.substr(2, Token
.size() - 3);
1597 OperandName
= Token
.substr(1);
1599 if (II
->DefRec
.is
<const CodeGenInstruction
*>())
1600 buildInstructionOperandReference(II
.get(), OperandName
, i
);
1602 buildAliasOperandReference(II
.get(), OperandName
, Op
);
1605 if (II
->DefRec
.is
<const CodeGenInstruction
*>()) {
1606 II
->buildInstructionResultOperands();
1607 // If the instruction has a two-operand alias, build up the
1608 // matchable here. We'll add them in bulk at the end to avoid
1609 // confusing this loop.
1610 StringRef Constraint
=
1611 II
->TheDef
->getValueAsString("TwoOperandAliasConstraint");
1612 if (Constraint
!= "") {
1613 // Start by making a copy of the original matchable.
1614 auto AliasII
= std::make_unique
<MatchableInfo
>(*II
);
1616 // Adjust it to be a two-operand alias.
1617 AliasII
->formTwoOperandAlias(Constraint
);
1619 // Add the alias to the matchables list.
1620 NewMatchables
.push_back(std::move(AliasII
));
1623 // FIXME: The tied operands checking is not yet integrated with the
1624 // framework for reporting multiple near misses. To prevent invalid
1625 // formats from being matched with an alias if a tied-operands check
1626 // would otherwise have disallowed it, we just disallow such constructs
1627 // in TableGen completely.
1628 II
->buildAliasResultOperands(!ReportMultipleNearMisses
);
1630 if (!NewMatchables
.empty())
1631 Matchables
.insert(Matchables
.end(),
1632 std::make_move_iterator(NewMatchables
.begin()),
1633 std::make_move_iterator(NewMatchables
.end()));
1635 // Process token alias definitions and set up the associated superclass
1637 std::vector
<Record
*> AllTokenAliases
=
1638 Records
.getAllDerivedDefinitions("TokenAlias");
1639 for (Record
*Rec
: AllTokenAliases
) {
1640 ClassInfo
*FromClass
= getTokenClass(Rec
->getValueAsString("FromToken"));
1641 ClassInfo
*ToClass
= getTokenClass(Rec
->getValueAsString("ToToken"));
1642 if (FromClass
== ToClass
)
1643 PrintFatalError(Rec
->getLoc(),
1644 "error: Destination value identical to source value.");
1645 FromClass
->SuperClasses
.push_back(ToClass
);
1648 // Reorder classes so that classes precede super classes.
1651 #ifdef EXPENSIVE_CHECKS
1652 // Verify that the table is sorted and operator < works transitively.
1653 for (auto I
= Classes
.begin(), E
= Classes
.end(); I
!= E
; ++I
) {
1654 for (auto J
= I
; J
!= E
; ++J
) {
1656 assert(I
== J
|| !J
->isSubsetOf(*I
));
1662 /// buildInstructionOperandReference - The specified operand is a reference to a
1663 /// named operand such as $src. Resolve the Class and OperandInfo pointers.
1664 void AsmMatcherInfo::
1665 buildInstructionOperandReference(MatchableInfo
*II
,
1666 StringRef OperandName
,
1667 unsigned AsmOpIdx
) {
1668 const CodeGenInstruction
&CGI
= *II
->DefRec
.get
<const CodeGenInstruction
*>();
1669 const CGIOperandList
&Operands
= CGI
.Operands
;
1670 MatchableInfo::AsmOperand
*Op
= &II
->AsmOperands
[AsmOpIdx
];
1672 // Map this token to an operand.
1674 if (!Operands
.hasOperandNamed(OperandName
, Idx
))
1675 PrintFatalError(II
->TheDef
->getLoc(),
1676 "error: unable to find operand: '" + OperandName
+ "'");
1678 // If the instruction operand has multiple suboperands, but the parser
1679 // match class for the asm operand is still the default "ImmAsmOperand",
1680 // then handle each suboperand separately.
1681 if (Op
->SubOpIdx
== -1 && Operands
[Idx
].MINumOperands
> 1) {
1682 Record
*Rec
= Operands
[Idx
].Rec
;
1683 assert(Rec
->isSubClassOf("Operand") && "Unexpected operand!");
1684 Record
*MatchClass
= Rec
->getValueAsDef("ParserMatchClass");
1685 if (MatchClass
&& MatchClass
->getValueAsString("Name") == "Imm") {
1686 // Insert remaining suboperands after AsmOpIdx in II->AsmOperands.
1687 StringRef Token
= Op
->Token
; // save this in case Op gets moved
1688 for (unsigned SI
= 1, SE
= Operands
[Idx
].MINumOperands
; SI
!= SE
; ++SI
) {
1689 MatchableInfo::AsmOperand
NewAsmOp(/*IsIsolatedToken=*/true, Token
);
1690 NewAsmOp
.SubOpIdx
= SI
;
1691 II
->AsmOperands
.insert(II
->AsmOperands
.begin()+AsmOpIdx
+SI
, NewAsmOp
);
1693 // Replace Op with first suboperand.
1694 Op
= &II
->AsmOperands
[AsmOpIdx
]; // update the pointer in case it moved
1699 // Set up the operand class.
1700 Op
->Class
= getOperandClass(Operands
[Idx
], Op
->SubOpIdx
);
1701 Op
->OrigSrcOpName
= OperandName
;
1703 // If the named operand is tied, canonicalize it to the untied operand.
1704 // For example, something like:
1705 // (outs GPR:$dst), (ins GPR:$src)
1706 // with an asmstring of
1708 // we want to canonicalize to:
1710 // so that we know how to provide the $dst operand when filling in the result.
1712 if (Operands
[Idx
].MINumOperands
== 1)
1713 OITied
= Operands
[Idx
].getTiedRegister();
1715 // The tied operand index is an MIOperand index, find the operand that
1717 std::pair
<unsigned, unsigned> Idx
= Operands
.getSubOperandNumber(OITied
);
1718 OperandName
= Operands
[Idx
.first
].Name
;
1719 Op
->SubOpIdx
= Idx
.second
;
1722 Op
->SrcOpName
= OperandName
;
1725 /// buildAliasOperandReference - When parsing an operand reference out of the
1726 /// matching string (e.g. "movsx $src, $dst"), determine what the class of the
1727 /// operand reference is by looking it up in the result pattern definition.
1728 void AsmMatcherInfo::buildAliasOperandReference(MatchableInfo
*II
,
1729 StringRef OperandName
,
1730 MatchableInfo::AsmOperand
&Op
) {
1731 const CodeGenInstAlias
&CGA
= *II
->DefRec
.get
<const CodeGenInstAlias
*>();
1733 // Set up the operand class.
1734 for (unsigned i
= 0, e
= CGA
.ResultOperands
.size(); i
!= e
; ++i
)
1735 if (CGA
.ResultOperands
[i
].isRecord() &&
1736 CGA
.ResultOperands
[i
].getName() == OperandName
) {
1737 // It's safe to go with the first one we find, because CodeGenInstAlias
1738 // validates that all operands with the same name have the same record.
1739 Op
.SubOpIdx
= CGA
.ResultInstOperandIndex
[i
].second
;
1740 // Use the match class from the Alias definition, not the
1741 // destination instruction, as we may have an immediate that's
1742 // being munged by the match class.
1743 Op
.Class
= getOperandClass(CGA
.ResultOperands
[i
].getRecord(),
1745 Op
.SrcOpName
= OperandName
;
1746 Op
.OrigSrcOpName
= OperandName
;
1750 PrintFatalError(II
->TheDef
->getLoc(),
1751 "error: unable to find operand: '" + OperandName
+ "'");
1754 void MatchableInfo::buildInstructionResultOperands() {
1755 const CodeGenInstruction
*ResultInst
= getResultInst();
1757 // Loop over all operands of the result instruction, determining how to
1759 for (const CGIOperandList::OperandInfo
&OpInfo
: ResultInst
->Operands
) {
1760 // If this is a tied operand, just copy from the previously handled operand.
1762 if (OpInfo
.MINumOperands
== 1)
1763 TiedOp
= OpInfo
.getTiedRegister();
1765 int TiedSrcOperand
= findAsmOperandOriginallyNamed(OpInfo
.Name
);
1766 if (TiedSrcOperand
!= -1 &&
1767 ResOperands
[TiedOp
].Kind
== ResOperand::RenderAsmOperand
)
1768 ResOperands
.push_back(ResOperand::getTiedOp(
1769 TiedOp
, ResOperands
[TiedOp
].AsmOperandNum
, TiedSrcOperand
));
1771 ResOperands
.push_back(ResOperand::getTiedOp(TiedOp
, 0, 0));
1775 int SrcOperand
= findAsmOperandNamed(OpInfo
.Name
);
1776 if (OpInfo
.Name
.empty() || SrcOperand
== -1) {
1777 // This may happen for operands that are tied to a suboperand of a
1778 // complex operand. Simply use a dummy value here; nobody should
1779 // use this operand slot.
1780 // FIXME: The long term goal is for the MCOperand list to not contain
1781 // tied operands at all.
1782 ResOperands
.push_back(ResOperand::getImmOp(0));
1786 // Check if the one AsmOperand populates the entire operand.
1787 unsigned NumOperands
= OpInfo
.MINumOperands
;
1788 if (AsmOperands
[SrcOperand
].SubOpIdx
== -1) {
1789 ResOperands
.push_back(ResOperand::getRenderedOp(SrcOperand
, NumOperands
));
1793 // Add a separate ResOperand for each suboperand.
1794 for (unsigned AI
= 0; AI
< NumOperands
; ++AI
) {
1795 assert(AsmOperands
[SrcOperand
+AI
].SubOpIdx
== (int)AI
&&
1796 AsmOperands
[SrcOperand
+AI
].SrcOpName
== OpInfo
.Name
&&
1797 "unexpected AsmOperands for suboperands");
1798 ResOperands
.push_back(ResOperand::getRenderedOp(SrcOperand
+ AI
, 1));
1803 void MatchableInfo::buildAliasResultOperands(bool AliasConstraintsAreChecked
) {
1804 const CodeGenInstAlias
&CGA
= *DefRec
.get
<const CodeGenInstAlias
*>();
1805 const CodeGenInstruction
*ResultInst
= getResultInst();
1807 // Map of: $reg -> #lastref
1808 // where $reg is the name of the operand in the asm string
1809 // where #lastref is the last processed index where $reg was referenced in
1811 SmallDenseMap
<StringRef
, int> OperandRefs
;
1813 // Loop over all operands of the result instruction, determining how to
1815 unsigned AliasOpNo
= 0;
1816 unsigned LastOpNo
= CGA
.ResultInstOperandIndex
.size();
1817 for (unsigned i
= 0, e
= ResultInst
->Operands
.size(); i
!= e
; ++i
) {
1818 const CGIOperandList::OperandInfo
*OpInfo
= &ResultInst
->Operands
[i
];
1820 // If this is a tied operand, just copy from the previously handled operand.
1822 if (OpInfo
->MINumOperands
== 1)
1823 TiedOp
= OpInfo
->getTiedRegister();
1825 unsigned SrcOp1
= 0;
1826 unsigned SrcOp2
= 0;
1828 // If an operand has been specified twice in the asm string,
1829 // add the two source operand's indices to the TiedOp so that
1830 // at runtime the 'tied' constraint is checked.
1831 if (ResOperands
[TiedOp
].Kind
== ResOperand::RenderAsmOperand
) {
1832 SrcOp1
= ResOperands
[TiedOp
].AsmOperandNum
;
1834 // Find the next operand (similarly named operand) in the string.
1835 StringRef Name
= AsmOperands
[SrcOp1
].SrcOpName
;
1836 auto Insert
= OperandRefs
.try_emplace(Name
, SrcOp1
);
1837 SrcOp2
= findAsmOperandNamed(Name
, Insert
.first
->second
);
1839 // Not updating the record in OperandRefs will cause TableGen
1840 // to fail with an error at the end of this function.
1841 if (AliasConstraintsAreChecked
)
1842 Insert
.first
->second
= SrcOp2
;
1844 // In case it only has one reference in the asm string,
1845 // it doesn't need to be checked for tied constraints.
1846 SrcOp2
= (SrcOp2
== (unsigned)-1) ? SrcOp1
: SrcOp2
;
1849 // If the alias operand is of a different operand class, we only want
1850 // to benefit from the tied-operands check and just match the operand
1851 // as a normal, but not copy the original (TiedOp) to the result
1852 // instruction. We do this by passing -1 as the tied operand to copy.
1853 if (ResultInst
->Operands
[i
].Rec
->getName() !=
1854 ResultInst
->Operands
[TiedOp
].Rec
->getName()) {
1855 SrcOp1
= ResOperands
[TiedOp
].AsmOperandNum
;
1856 int SubIdx
= CGA
.ResultInstOperandIndex
[AliasOpNo
].second
;
1857 StringRef Name
= CGA
.ResultOperands
[AliasOpNo
].getName();
1858 SrcOp2
= findAsmOperand(Name
, SubIdx
);
1859 ResOperands
.push_back(
1860 ResOperand::getTiedOp((unsigned)-1, SrcOp1
, SrcOp2
));
1862 ResOperands
.push_back(ResOperand::getTiedOp(TiedOp
, SrcOp1
, SrcOp2
));
1867 // Handle all the suboperands for this operand.
1868 const std::string
&OpName
= OpInfo
->Name
;
1869 for ( ; AliasOpNo
< LastOpNo
&&
1870 CGA
.ResultInstOperandIndex
[AliasOpNo
].first
== i
; ++AliasOpNo
) {
1871 int SubIdx
= CGA
.ResultInstOperandIndex
[AliasOpNo
].second
;
1873 // Find out what operand from the asmparser that this MCInst operand
1875 switch (CGA
.ResultOperands
[AliasOpNo
].Kind
) {
1876 case CodeGenInstAlias::ResultOperand::K_Record
: {
1877 StringRef Name
= CGA
.ResultOperands
[AliasOpNo
].getName();
1878 int SrcOperand
= findAsmOperand(Name
, SubIdx
);
1879 if (SrcOperand
== -1)
1880 PrintFatalError(TheDef
->getLoc(), "Instruction '" +
1881 TheDef
->getName() + "' has operand '" + OpName
+
1882 "' that doesn't appear in asm string!");
1884 // Add it to the operand references. If it is added a second time, the
1885 // record won't be updated and it will fail later on.
1886 OperandRefs
.try_emplace(Name
, SrcOperand
);
1888 unsigned NumOperands
= (SubIdx
== -1 ? OpInfo
->MINumOperands
: 1);
1889 ResOperands
.push_back(ResOperand::getRenderedOp(SrcOperand
,
1893 case CodeGenInstAlias::ResultOperand::K_Imm
: {
1894 int64_t ImmVal
= CGA
.ResultOperands
[AliasOpNo
].getImm();
1895 ResOperands
.push_back(ResOperand::getImmOp(ImmVal
));
1898 case CodeGenInstAlias::ResultOperand::K_Reg
: {
1899 Record
*Reg
= CGA
.ResultOperands
[AliasOpNo
].getRegister();
1900 ResOperands
.push_back(ResOperand::getRegOp(Reg
));
1907 // Check that operands are not repeated more times than is supported.
1908 for (auto &T
: OperandRefs
) {
1909 if (T
.second
!= -1 && findAsmOperandNamed(T
.first
, T
.second
) != -1)
1910 PrintFatalError(TheDef
->getLoc(),
1911 "Operand '" + T
.first
+ "' can never be matched");
1916 getConverterOperandID(const std::string
&Name
,
1917 SmallSetVector
<CachedHashString
, 16> &Table
,
1919 IsNew
= Table
.insert(CachedHashString(Name
));
1921 unsigned ID
= IsNew
? Table
.size() - 1 : find(Table
, Name
) - Table
.begin();
1923 assert(ID
< Table
.size());
1929 emitConvertFuncs(CodeGenTarget
&Target
, StringRef ClassName
,
1930 std::vector
<std::unique_ptr
<MatchableInfo
>> &Infos
,
1931 bool HasMnemonicFirst
, bool HasOptionalOperands
,
1933 SmallSetVector
<CachedHashString
, 16> OperandConversionKinds
;
1934 SmallSetVector
<CachedHashString
, 16> InstructionConversionKinds
;
1935 std::vector
<std::vector
<uint8_t> > ConversionTable
;
1936 size_t MaxRowLength
= 2; // minimum is custom converter plus terminator.
1938 // TargetOperandClass - This is the target's operand class, like X86Operand.
1939 std::string TargetOperandClass
= Target
.getName().str() + "Operand";
1941 // Write the convert function to a separate stream, so we can drop it after
1942 // the enum. We'll build up the conversion handlers for the individual
1943 // operand types opportunistically as we encounter them.
1944 std::string ConvertFnBody
;
1945 raw_string_ostream
CvtOS(ConvertFnBody
);
1946 // Start the unified conversion function.
1947 if (HasOptionalOperands
) {
1948 CvtOS
<< "void " << Target
.getName() << ClassName
<< "::\n"
1949 << "convertToMCInst(unsigned Kind, MCInst &Inst, "
1950 << "unsigned Opcode,\n"
1951 << " const OperandVector &Operands,\n"
1952 << " const SmallBitVector &OptionalOperandsMask) {\n";
1954 CvtOS
<< "void " << Target
.getName() << ClassName
<< "::\n"
1955 << "convertToMCInst(unsigned Kind, MCInst &Inst, "
1956 << "unsigned Opcode,\n"
1957 << " const OperandVector &Operands) {\n";
1959 CvtOS
<< " assert(Kind < CVT_NUM_SIGNATURES && \"Invalid signature!\");\n";
1960 CvtOS
<< " const uint8_t *Converter = ConversionTable[Kind];\n";
1961 if (HasOptionalOperands
) {
1962 size_t MaxNumOperands
= 0;
1963 for (const auto &MI
: Infos
) {
1964 MaxNumOperands
= std::max(MaxNumOperands
, MI
->AsmOperands
.size());
1966 CvtOS
<< " unsigned DefaultsOffset[" << (MaxNumOperands
+ 1)
1968 CvtOS
<< " assert(OptionalOperandsMask.size() == " << (MaxNumOperands
)
1970 CvtOS
<< " for (unsigned i = 0, NumDefaults = 0; i < " << (MaxNumOperands
)
1972 CvtOS
<< " DefaultsOffset[i + 1] = NumDefaults;\n";
1973 CvtOS
<< " NumDefaults += (OptionalOperandsMask[i] ? 1 : 0);\n";
1976 CvtOS
<< " unsigned OpIdx;\n";
1977 CvtOS
<< " Inst.setOpcode(Opcode);\n";
1978 CvtOS
<< " for (const uint8_t *p = Converter; *p; p += 2) {\n";
1979 if (HasOptionalOperands
) {
1980 CvtOS
<< " OpIdx = *(p + 1) - DefaultsOffset[*(p + 1)];\n";
1982 CvtOS
<< " OpIdx = *(p + 1);\n";
1984 CvtOS
<< " switch (*p) {\n";
1985 CvtOS
<< " default: llvm_unreachable(\"invalid conversion entry!\");\n";
1986 CvtOS
<< " case CVT_Reg:\n";
1987 CvtOS
<< " static_cast<" << TargetOperandClass
1988 << " &>(*Operands[OpIdx]).addRegOperands(Inst, 1);\n";
1989 CvtOS
<< " break;\n";
1990 CvtOS
<< " case CVT_Tied: {\n";
1991 CvtOS
<< " assert(OpIdx < (size_t)(std::end(TiedAsmOperandTable) -\n";
1992 CvtOS
<< " std::begin(TiedAsmOperandTable)) &&\n";
1993 CvtOS
<< " \"Tied operand not found\");\n";
1994 CvtOS
<< " unsigned TiedResOpnd = TiedAsmOperandTable[OpIdx][0];\n";
1995 CvtOS
<< " if (TiedResOpnd != (uint8_t)-1)\n";
1996 CvtOS
<< " Inst.addOperand(Inst.getOperand(TiedResOpnd));\n";
1997 CvtOS
<< " break;\n";
2000 std::string OperandFnBody
;
2001 raw_string_ostream
OpOS(OperandFnBody
);
2002 // Start the operand number lookup function.
2003 OpOS
<< "void " << Target
.getName() << ClassName
<< "::\n"
2004 << "convertToMapAndConstraints(unsigned Kind,\n";
2006 OpOS
<< "const OperandVector &Operands) {\n"
2007 << " assert(Kind < CVT_NUM_SIGNATURES && \"Invalid signature!\");\n"
2008 << " unsigned NumMCOperands = 0;\n"
2009 << " const uint8_t *Converter = ConversionTable[Kind];\n"
2010 << " for (const uint8_t *p = Converter; *p; p += 2) {\n"
2011 << " switch (*p) {\n"
2012 << " default: llvm_unreachable(\"invalid conversion entry!\");\n"
2013 << " case CVT_Reg:\n"
2014 << " Operands[*(p + 1)]->setMCOperandNum(NumMCOperands);\n"
2015 << " Operands[*(p + 1)]->setConstraint(\"r\");\n"
2016 << " ++NumMCOperands;\n"
2018 << " case CVT_Tied:\n"
2019 << " ++NumMCOperands;\n"
2022 // Pre-populate the operand conversion kinds with the standard always
2023 // available entries.
2024 OperandConversionKinds
.insert(CachedHashString("CVT_Done"));
2025 OperandConversionKinds
.insert(CachedHashString("CVT_Reg"));
2026 OperandConversionKinds
.insert(CachedHashString("CVT_Tied"));
2027 enum { CVT_Done
, CVT_Reg
, CVT_Tied
};
2029 // Map of e.g. <0, 2, 3> -> "Tie_0_2_3" enum label.
2030 std::map
<std::tuple
<uint8_t, uint8_t, uint8_t>, std::string
>
2031 TiedOperandsEnumMap
;
2033 for (auto &II
: Infos
) {
2034 // Check if we have a custom match function.
2035 StringRef AsmMatchConverter
=
2036 II
->getResultInst()->TheDef
->getValueAsString("AsmMatchConverter");
2037 if (!AsmMatchConverter
.empty() && II
->UseInstAsmMatchConverter
) {
2038 std::string Signature
= ("ConvertCustom_" + AsmMatchConverter
).str();
2039 II
->ConversionFnKind
= Signature
;
2041 // Check if we have already generated this signature.
2042 if (!InstructionConversionKinds
.insert(CachedHashString(Signature
)))
2045 // Remember this converter for the kind enum.
2046 unsigned KindID
= OperandConversionKinds
.size();
2047 OperandConversionKinds
.insert(
2048 CachedHashString("CVT_" + getEnumNameForToken(AsmMatchConverter
)));
2050 // Add the converter row for this instruction.
2051 ConversionTable
.emplace_back();
2052 ConversionTable
.back().push_back(KindID
);
2053 ConversionTable
.back().push_back(CVT_Done
);
2055 // Add the handler to the conversion driver function.
2056 CvtOS
<< " case CVT_"
2057 << getEnumNameForToken(AsmMatchConverter
) << ":\n"
2058 << " " << AsmMatchConverter
<< "(Inst, Operands);\n"
2061 // FIXME: Handle the operand number lookup for custom match functions.
2065 // Build the conversion function signature.
2066 std::string Signature
= "Convert";
2068 std::vector
<uint8_t> ConversionRow
;
2070 // Compute the convert enum and the case body.
2071 MaxRowLength
= std::max(MaxRowLength
, II
->ResOperands
.size()*2 + 1 );
2073 for (unsigned i
= 0, e
= II
->ResOperands
.size(); i
!= e
; ++i
) {
2074 const MatchableInfo::ResOperand
&OpInfo
= II
->ResOperands
[i
];
2076 // Generate code to populate each result operand.
2077 switch (OpInfo
.Kind
) {
2078 case MatchableInfo::ResOperand::RenderAsmOperand
: {
2079 // This comes from something we parsed.
2080 const MatchableInfo::AsmOperand
&Op
=
2081 II
->AsmOperands
[OpInfo
.AsmOperandNum
];
2083 // Registers are always converted the same, don't duplicate the
2084 // conversion function based on them.
2087 Class
= Op
.Class
->isRegisterClass() ? "Reg" : Op
.Class
->ClassName
;
2089 Signature
+= utostr(OpInfo
.MINumOperands
);
2090 Signature
+= "_" + itostr(OpInfo
.AsmOperandNum
);
2092 // Add the conversion kind, if necessary, and get the associated ID
2093 // the index of its entry in the vector).
2094 std::string Name
= "CVT_" + (Op
.Class
->isRegisterClass() ? "Reg" :
2095 Op
.Class
->RenderMethod
);
2096 if (Op
.Class
->IsOptional
) {
2097 // For optional operands we must also care about DefaultMethod
2098 assert(HasOptionalOperands
);
2099 Name
+= "_" + Op
.Class
->DefaultMethod
;
2101 Name
= getEnumNameForToken(Name
);
2103 bool IsNewConverter
= false;
2104 unsigned ID
= getConverterOperandID(Name
, OperandConversionKinds
,
2107 // Add the operand entry to the instruction kind conversion row.
2108 ConversionRow
.push_back(ID
);
2109 ConversionRow
.push_back(OpInfo
.AsmOperandNum
+ HasMnemonicFirst
);
2111 if (!IsNewConverter
)
2114 // This is a new operand kind. Add a handler for it to the
2115 // converter driver.
2116 CvtOS
<< " case " << Name
<< ":\n";
2117 if (Op
.Class
->IsOptional
) {
2118 // If optional operand is not present in actual instruction then we
2119 // should call its DefaultMethod before RenderMethod
2120 assert(HasOptionalOperands
);
2121 CvtOS
<< " if (OptionalOperandsMask[*(p + 1) - 1]) {\n"
2122 << " " << Op
.Class
->DefaultMethod
<< "()"
2123 << "->" << Op
.Class
->RenderMethod
<< "(Inst, "
2124 << OpInfo
.MINumOperands
<< ");\n"
2126 << " static_cast<" << TargetOperandClass
2127 << " &>(*Operands[OpIdx])." << Op
.Class
->RenderMethod
2128 << "(Inst, " << OpInfo
.MINumOperands
<< ");\n"
2131 CvtOS
<< " static_cast<" << TargetOperandClass
2132 << " &>(*Operands[OpIdx])." << Op
.Class
->RenderMethod
2133 << "(Inst, " << OpInfo
.MINumOperands
<< ");\n";
2135 CvtOS
<< " break;\n";
2137 // Add a handler for the operand number lookup.
2138 OpOS
<< " case " << Name
<< ":\n"
2139 << " Operands[*(p + 1)]->setMCOperandNum(NumMCOperands);\n";
2141 if (Op
.Class
->isRegisterClass())
2142 OpOS
<< " Operands[*(p + 1)]->setConstraint(\"r\");\n";
2144 OpOS
<< " Operands[*(p + 1)]->setConstraint(\"m\");\n";
2145 OpOS
<< " NumMCOperands += " << OpInfo
.MINumOperands
<< ";\n"
2149 case MatchableInfo::ResOperand::TiedOperand
: {
2150 // If this operand is tied to a previous one, just copy the MCInst
2151 // operand from the earlier one.We can only tie single MCOperand values.
2152 assert(OpInfo
.MINumOperands
== 1 && "Not a singular MCOperand");
2153 uint8_t TiedOp
= OpInfo
.TiedOperands
.ResOpnd
;
2155 OpInfo
.TiedOperands
.SrcOpnd1Idx
+ HasMnemonicFirst
;
2157 OpInfo
.TiedOperands
.SrcOpnd2Idx
+ HasMnemonicFirst
;
2158 assert((i
> TiedOp
|| TiedOp
== (uint8_t)-1) &&
2159 "Tied operand precedes its target!");
2160 auto TiedTupleName
= std::string("Tie") + utostr(TiedOp
) + '_' +
2161 utostr(SrcOp1
) + '_' + utostr(SrcOp2
);
2162 Signature
+= "__" + TiedTupleName
;
2163 ConversionRow
.push_back(CVT_Tied
);
2164 ConversionRow
.push_back(TiedOp
);
2165 ConversionRow
.push_back(SrcOp1
);
2166 ConversionRow
.push_back(SrcOp2
);
2168 // Also create an 'enum' for this combination of tied operands.
2169 auto Key
= std::make_tuple(TiedOp
, SrcOp1
, SrcOp2
);
2170 TiedOperandsEnumMap
.emplace(Key
, TiedTupleName
);
2173 case MatchableInfo::ResOperand::ImmOperand
: {
2174 int64_t Val
= OpInfo
.ImmVal
;
2175 std::string Ty
= "imm_" + itostr(Val
);
2176 Ty
= getEnumNameForToken(Ty
);
2177 Signature
+= "__" + Ty
;
2179 std::string Name
= "CVT_" + Ty
;
2180 bool IsNewConverter
= false;
2181 unsigned ID
= getConverterOperandID(Name
, OperandConversionKinds
,
2183 // Add the operand entry to the instruction kind conversion row.
2184 ConversionRow
.push_back(ID
);
2185 ConversionRow
.push_back(0);
2187 if (!IsNewConverter
)
2190 CvtOS
<< " case " << Name
<< ":\n"
2191 << " Inst.addOperand(MCOperand::createImm(" << Val
<< "));\n"
2194 OpOS
<< " case " << Name
<< ":\n"
2195 << " Operands[*(p + 1)]->setMCOperandNum(NumMCOperands);\n"
2196 << " Operands[*(p + 1)]->setConstraint(\"\");\n"
2197 << " ++NumMCOperands;\n"
2201 case MatchableInfo::ResOperand::RegOperand
: {
2202 std::string Reg
, Name
;
2203 if (!OpInfo
.Register
) {
2207 Reg
= getQualifiedName(OpInfo
.Register
);
2208 Name
= "reg" + OpInfo
.Register
->getName().str();
2210 Signature
+= "__" + Name
;
2211 Name
= "CVT_" + Name
;
2212 bool IsNewConverter
= false;
2213 unsigned ID
= getConverterOperandID(Name
, OperandConversionKinds
,
2215 // Add the operand entry to the instruction kind conversion row.
2216 ConversionRow
.push_back(ID
);
2217 ConversionRow
.push_back(0);
2219 if (!IsNewConverter
)
2221 CvtOS
<< " case " << Name
<< ":\n"
2222 << " Inst.addOperand(MCOperand::createReg(" << Reg
<< "));\n"
2225 OpOS
<< " case " << Name
<< ":\n"
2226 << " Operands[*(p + 1)]->setMCOperandNum(NumMCOperands);\n"
2227 << " Operands[*(p + 1)]->setConstraint(\"m\");\n"
2228 << " ++NumMCOperands;\n"
2234 // If there were no operands, add to the signature to that effect
2235 if (Signature
== "Convert")
2236 Signature
+= "_NoOperands";
2238 II
->ConversionFnKind
= Signature
;
2240 // Save the signature. If we already have it, don't add a new row
2242 if (!InstructionConversionKinds
.insert(CachedHashString(Signature
)))
2245 // Add the row to the table.
2246 ConversionTable
.push_back(std::move(ConversionRow
));
2249 // Finish up the converter driver function.
2250 CvtOS
<< " }\n }\n}\n\n";
2252 // Finish up the operand number lookup function.
2253 OpOS
<< " }\n }\n}\n\n";
2255 // Output a static table for tied operands.
2256 if (TiedOperandsEnumMap
.size()) {
2257 // The number of tied operand combinations will be small in practice,
2258 // but just add the assert to be sure.
2259 assert(TiedOperandsEnumMap
.size() <= 254 &&
2260 "Too many tied-operand combinations to reference with "
2261 "an 8bit offset from the conversion table, where index "
2262 "'255' is reserved as operand not to be copied.");
2265 for (auto &KV
: TiedOperandsEnumMap
) {
2266 OS
<< " " << KV
.second
<< ",\n";
2270 OS
<< "static const uint8_t TiedAsmOperandTable[][3] = {\n";
2271 for (auto &KV
: TiedOperandsEnumMap
) {
2272 OS
<< " /* " << KV
.second
<< " */ { "
2273 << utostr(std::get
<0>(KV
.first
)) << ", "
2274 << utostr(std::get
<1>(KV
.first
)) << ", "
2275 << utostr(std::get
<2>(KV
.first
)) << " },\n";
2279 OS
<< "static const uint8_t TiedAsmOperandTable[][3] = "
2280 "{ /* empty */ {0, 0, 0} };\n\n";
2282 OS
<< "namespace {\n";
2284 // Output the operand conversion kind enum.
2285 OS
<< "enum OperatorConversionKind {\n";
2286 for (const auto &Converter
: OperandConversionKinds
)
2287 OS
<< " " << Converter
<< ",\n";
2288 OS
<< " CVT_NUM_CONVERTERS\n";
2291 // Output the instruction conversion kind enum.
2292 OS
<< "enum InstructionConversionKind {\n";
2293 for (const auto &Signature
: InstructionConversionKinds
)
2294 OS
<< " " << Signature
<< ",\n";
2295 OS
<< " CVT_NUM_SIGNATURES\n";
2298 OS
<< "} // end anonymous namespace\n\n";
2300 // Output the conversion table.
2301 OS
<< "static const uint8_t ConversionTable[CVT_NUM_SIGNATURES]["
2302 << MaxRowLength
<< "] = {\n";
2304 for (unsigned Row
= 0, ERow
= ConversionTable
.size(); Row
!= ERow
; ++Row
) {
2305 assert(ConversionTable
[Row
].size() % 2 == 0 && "bad conversion row!");
2306 OS
<< " // " << InstructionConversionKinds
[Row
] << "\n";
2308 for (unsigned i
= 0, e
= ConversionTable
[Row
].size(); i
!= e
; i
+= 2) {
2309 OS
<< OperandConversionKinds
[ConversionTable
[Row
][i
]] << ", ";
2310 if (OperandConversionKinds
[ConversionTable
[Row
][i
]] !=
2311 CachedHashString("CVT_Tied")) {
2312 OS
<< (unsigned)(ConversionTable
[Row
][i
+ 1]) << ", ";
2316 // For a tied operand, emit a reference to the TiedAsmOperandTable
2317 // that contains the operand to copy, and the parsed operands to
2318 // check for their tied constraints.
2319 auto Key
= std::make_tuple((uint8_t)ConversionTable
[Row
][i
+ 1],
2320 (uint8_t)ConversionTable
[Row
][i
+ 2],
2321 (uint8_t)ConversionTable
[Row
][i
+ 3]);
2322 auto TiedOpndEnum
= TiedOperandsEnumMap
.find(Key
);
2323 assert(TiedOpndEnum
!= TiedOperandsEnumMap
.end() &&
2324 "No record for tied operand pair");
2325 OS
<< TiedOpndEnum
->second
<< ", ";
2328 OS
<< "CVT_Done },\n";
2333 // Spit out the conversion driver function.
2336 // Spit out the operand number lookup function.
2339 return ConversionTable
.size();
2342 /// emitMatchClassEnumeration - Emit the enumeration for match class kinds.
2343 static void emitMatchClassEnumeration(CodeGenTarget
&Target
,
2344 std::forward_list
<ClassInfo
> &Infos
,
2346 OS
<< "namespace {\n\n";
2348 OS
<< "/// MatchClassKind - The kinds of classes which participate in\n"
2349 << "/// instruction matching.\n";
2350 OS
<< "enum MatchClassKind {\n";
2351 OS
<< " InvalidMatchClass = 0,\n";
2352 OS
<< " OptionalMatchClass = 1,\n";
2353 ClassInfo::ClassInfoKind LastKind
= ClassInfo::Token
;
2354 StringRef LastName
= "OptionalMatchClass";
2355 for (const auto &CI
: Infos
) {
2356 if (LastKind
== ClassInfo::Token
&& CI
.Kind
!= ClassInfo::Token
) {
2357 OS
<< " MCK_LAST_TOKEN = " << LastName
<< ",\n";
2358 } else if (LastKind
< ClassInfo::UserClass0
&&
2359 CI
.Kind
>= ClassInfo::UserClass0
) {
2360 OS
<< " MCK_LAST_REGISTER = " << LastName
<< ",\n";
2362 LastKind
= (ClassInfo::ClassInfoKind
)CI
.Kind
;
2365 OS
<< " " << CI
.Name
<< ", // ";
2366 if (CI
.Kind
== ClassInfo::Token
) {
2367 OS
<< "'" << CI
.ValueName
<< "'\n";
2368 } else if (CI
.isRegisterClass()) {
2369 if (!CI
.ValueName
.empty())
2370 OS
<< "register class '" << CI
.ValueName
<< "'\n";
2372 OS
<< "derived register class\n";
2374 OS
<< "user defined class '" << CI
.ValueName
<< "'\n";
2377 OS
<< " NumMatchClassKinds\n";
2380 OS
<< "} // end anonymous namespace\n\n";
2383 /// emitMatchClassDiagStrings - Emit a function to get the diagnostic text to be
2384 /// used when an assembly operand does not match the expected operand class.
2385 static void emitOperandMatchErrorDiagStrings(AsmMatcherInfo
&Info
, raw_ostream
&OS
) {
2386 // If the target does not use DiagnosticString for any operands, don't emit
2387 // an unused function.
2388 if (llvm::all_of(Info
.Classes
, [](const ClassInfo
&CI
) {
2389 return CI
.DiagnosticString
.empty();
2393 OS
<< "static const char *getMatchKindDiag(" << Info
.Target
.getName()
2394 << "AsmParser::" << Info
.Target
.getName()
2395 << "MatchResultTy MatchResult) {\n";
2396 OS
<< " switch (MatchResult) {\n";
2398 for (const auto &CI
: Info
.Classes
) {
2399 if (!CI
.DiagnosticString
.empty()) {
2400 assert(!CI
.DiagnosticType
.empty() &&
2401 "DiagnosticString set without DiagnosticType");
2402 OS
<< " case " << Info
.Target
.getName()
2403 << "AsmParser::Match_" << CI
.DiagnosticType
<< ":\n";
2404 OS
<< " return \"" << CI
.DiagnosticString
<< "\";\n";
2408 OS
<< " default:\n";
2409 OS
<< " return nullptr;\n";
2415 static void emitRegisterMatchErrorFunc(AsmMatcherInfo
&Info
, raw_ostream
&OS
) {
2416 OS
<< "static unsigned getDiagKindFromRegisterClass(MatchClassKind "
2417 "RegisterClass) {\n";
2418 if (none_of(Info
.Classes
, [](const ClassInfo
&CI
) {
2419 return CI
.isRegisterClass() && !CI
.DiagnosticType
.empty();
2421 OS
<< " return MCTargetAsmParser::Match_InvalidOperand;\n";
2423 OS
<< " switch (RegisterClass) {\n";
2424 for (const auto &CI
: Info
.Classes
) {
2425 if (CI
.isRegisterClass() && !CI
.DiagnosticType
.empty()) {
2426 OS
<< " case " << CI
.Name
<< ":\n";
2427 OS
<< " return " << Info
.Target
.getName() << "AsmParser::Match_"
2428 << CI
.DiagnosticType
<< ";\n";
2432 OS
<< " default:\n";
2433 OS
<< " return MCTargetAsmParser::Match_InvalidOperand;\n";
2440 /// emitValidateOperandClass - Emit the function to validate an operand class.
2441 static void emitValidateOperandClass(AsmMatcherInfo
&Info
,
2443 OS
<< "static unsigned validateOperandClass(MCParsedAsmOperand &GOp, "
2444 << "MatchClassKind Kind) {\n";
2445 OS
<< " " << Info
.Target
.getName() << "Operand &Operand = ("
2446 << Info
.Target
.getName() << "Operand &)GOp;\n";
2448 // The InvalidMatchClass is not to match any operand.
2449 OS
<< " if (Kind == InvalidMatchClass)\n";
2450 OS
<< " return MCTargetAsmParser::Match_InvalidOperand;\n\n";
2452 // Check for Token operands first.
2453 // FIXME: Use a more specific diagnostic type.
2454 OS
<< " if (Operand.isToken() && Kind <= MCK_LAST_TOKEN)\n";
2455 OS
<< " return isSubclass(matchTokenString(Operand.getToken()), Kind) ?\n"
2456 << " MCTargetAsmParser::Match_Success :\n"
2457 << " MCTargetAsmParser::Match_InvalidOperand;\n\n";
2459 // Check the user classes. We don't care what order since we're only
2460 // actually matching against one of them.
2461 OS
<< " switch (Kind) {\n"
2462 " default: break;\n";
2463 for (const auto &CI
: Info
.Classes
) {
2464 if (!CI
.isUserClass())
2467 OS
<< " // '" << CI
.ClassName
<< "' class\n";
2468 OS
<< " case " << CI
.Name
<< ": {\n";
2469 OS
<< " DiagnosticPredicate DP(Operand." << CI
.PredicateMethod
2471 OS
<< " if (DP.isMatch())\n";
2472 OS
<< " return MCTargetAsmParser::Match_Success;\n";
2473 if (!CI
.DiagnosticType
.empty()) {
2474 OS
<< " if (DP.isNearMatch())\n";
2475 OS
<< " return " << Info
.Target
.getName() << "AsmParser::Match_"
2476 << CI
.DiagnosticType
<< ";\n";
2483 OS
<< " } // end switch (Kind)\n\n";
2485 // Check for register operands, including sub-classes.
2486 OS
<< " if (Operand.isReg()) {\n";
2487 OS
<< " MatchClassKind OpKind;\n";
2488 OS
<< " switch (Operand.getReg()) {\n";
2489 OS
<< " default: OpKind = InvalidMatchClass; break;\n";
2490 for (const auto &RC
: Info
.RegisterClasses
)
2491 OS
<< " case " << RC
.first
->getValueAsString("Namespace") << "::"
2492 << RC
.first
->getName() << ": OpKind = " << RC
.second
->Name
2495 OS
<< " return isSubclass(OpKind, Kind) ? "
2496 << "(unsigned)MCTargetAsmParser::Match_Success :\n "
2497 << " getDiagKindFromRegisterClass(Kind);\n }\n\n";
2499 // Expected operand is a register, but actual is not.
2500 OS
<< " if (Kind > MCK_LAST_TOKEN && Kind <= MCK_LAST_REGISTER)\n";
2501 OS
<< " return getDiagKindFromRegisterClass(Kind);\n\n";
2503 // Generic fallthrough match failure case for operands that don't have
2504 // specialized diagnostic types.
2505 OS
<< " return MCTargetAsmParser::Match_InvalidOperand;\n";
2509 /// emitIsSubclass - Emit the subclass predicate function.
2510 static void emitIsSubclass(CodeGenTarget
&Target
,
2511 std::forward_list
<ClassInfo
> &Infos
,
2513 OS
<< "/// isSubclass - Compute whether \\p A is a subclass of \\p B.\n";
2514 OS
<< "static bool isSubclass(MatchClassKind A, MatchClassKind B) {\n";
2515 OS
<< " if (A == B)\n";
2516 OS
<< " return true;\n\n";
2518 bool EmittedSwitch
= false;
2519 for (const auto &A
: Infos
) {
2520 std::vector
<StringRef
> SuperClasses
;
2522 SuperClasses
.push_back("OptionalMatchClass");
2523 for (const auto &B
: Infos
) {
2524 if (&A
!= &B
&& A
.isSubsetOf(B
))
2525 SuperClasses
.push_back(B
.Name
);
2528 if (SuperClasses
.empty())
2531 // If this is the first SuperClass, emit the switch header.
2532 if (!EmittedSwitch
) {
2533 OS
<< " switch (A) {\n";
2534 OS
<< " default:\n";
2535 OS
<< " return false;\n";
2536 EmittedSwitch
= true;
2539 OS
<< "\n case " << A
.Name
<< ":\n";
2541 if (SuperClasses
.size() == 1) {
2542 OS
<< " return B == " << SuperClasses
.back() << ";\n";
2546 if (!SuperClasses
.empty()) {
2547 OS
<< " switch (B) {\n";
2548 OS
<< " default: return false;\n";
2549 for (StringRef SC
: SuperClasses
)
2550 OS
<< " case " << SC
<< ": return true;\n";
2553 // No case statement to emit
2554 OS
<< " return false;\n";
2558 // If there were case statements emitted into the string stream write the
2563 OS
<< " return false;\n";
2568 /// emitMatchTokenString - Emit the function to match a token string to the
2569 /// appropriate match class value.
2570 static void emitMatchTokenString(CodeGenTarget
&Target
,
2571 std::forward_list
<ClassInfo
> &Infos
,
2573 // Construct the match list.
2574 std::vector
<StringMatcher::StringPair
> Matches
;
2575 for (const auto &CI
: Infos
) {
2576 if (CI
.Kind
== ClassInfo::Token
)
2577 Matches
.emplace_back(CI
.ValueName
, "return " + CI
.Name
+ ";");
2580 OS
<< "static MatchClassKind matchTokenString(StringRef Name) {\n";
2582 StringMatcher("Name", Matches
, OS
).Emit();
2584 OS
<< " return InvalidMatchClass;\n";
2588 /// emitMatchRegisterName - Emit the function to match a string to the target
2589 /// specific register enum.
2590 static void emitMatchRegisterName(CodeGenTarget
&Target
, Record
*AsmParser
,
2592 // Construct the match list.
2593 std::vector
<StringMatcher::StringPair
> Matches
;
2594 const auto &Regs
= Target
.getRegBank().getRegisters();
2595 for (const CodeGenRegister
&Reg
: Regs
) {
2596 if (Reg
.TheDef
->getValueAsString("AsmName").empty())
2599 Matches
.emplace_back(std::string(Reg
.TheDef
->getValueAsString("AsmName")),
2600 "return " + utostr(Reg
.EnumValue
) + ";");
2603 OS
<< "static unsigned MatchRegisterName(StringRef Name) {\n";
2605 bool IgnoreDuplicates
=
2606 AsmParser
->getValueAsBit("AllowDuplicateRegisterNames");
2607 StringMatcher("Name", Matches
, OS
).Emit(0, IgnoreDuplicates
);
2609 OS
<< " return 0;\n";
2613 /// Emit the function to match a string to the target
2614 /// specific register enum.
2615 static void emitMatchRegisterAltName(CodeGenTarget
&Target
, Record
*AsmParser
,
2617 // Construct the match list.
2618 std::vector
<StringMatcher::StringPair
> Matches
;
2619 const auto &Regs
= Target
.getRegBank().getRegisters();
2620 for (const CodeGenRegister
&Reg
: Regs
) {
2622 auto AltNames
= Reg
.TheDef
->getValueAsListOfStrings("AltNames");
2624 for (auto AltName
: AltNames
) {
2625 AltName
= StringRef(AltName
).trim();
2627 // don't handle empty alternative names
2628 if (AltName
.empty())
2631 Matches
.emplace_back(std::string(AltName
),
2632 "return " + utostr(Reg
.EnumValue
) + ";");
2636 OS
<< "static unsigned MatchRegisterAltName(StringRef Name) {\n";
2638 bool IgnoreDuplicates
=
2639 AsmParser
->getValueAsBit("AllowDuplicateRegisterNames");
2640 StringMatcher("Name", Matches
, OS
).Emit(0, IgnoreDuplicates
);
2642 OS
<< " return 0;\n";
2646 /// emitOperandDiagnosticTypes - Emit the operand matching diagnostic types.
2647 static void emitOperandDiagnosticTypes(AsmMatcherInfo
&Info
, raw_ostream
&OS
) {
2648 // Get the set of diagnostic types from all of the operand classes.
2649 std::set
<StringRef
> Types
;
2650 for (const auto &OpClassEntry
: Info
.AsmOperandClasses
) {
2651 if (!OpClassEntry
.second
->DiagnosticType
.empty())
2652 Types
.insert(OpClassEntry
.second
->DiagnosticType
);
2654 for (const auto &OpClassEntry
: Info
.RegisterClassClasses
) {
2655 if (!OpClassEntry
.second
->DiagnosticType
.empty())
2656 Types
.insert(OpClassEntry
.second
->DiagnosticType
);
2659 if (Types
.empty()) return;
2661 // Now emit the enum entries.
2662 for (StringRef Type
: Types
)
2663 OS
<< " Match_" << Type
<< ",\n";
2664 OS
<< " END_OPERAND_DIAGNOSTIC_TYPES\n";
2667 /// emitGetSubtargetFeatureName - Emit the helper function to get the
2668 /// user-level name for a subtarget feature.
2669 static void emitGetSubtargetFeatureName(AsmMatcherInfo
&Info
, raw_ostream
&OS
) {
2670 OS
<< "// User-level names for subtarget features that participate in\n"
2671 << "// instruction matching.\n"
2672 << "static const char *getSubtargetFeatureName(uint64_t Val) {\n";
2673 if (!Info
.SubtargetFeatures
.empty()) {
2674 OS
<< " switch(Val) {\n";
2675 for (const auto &SF
: Info
.SubtargetFeatures
) {
2676 const SubtargetFeatureInfo
&SFI
= SF
.second
;
2677 // FIXME: Totally just a placeholder name to get the algorithm working.
2678 OS
<< " case " << SFI
.getEnumBitName() << ": return \""
2679 << SFI
.TheDef
->getValueAsString("PredicateName") << "\";\n";
2681 OS
<< " default: return \"(unknown)\";\n";
2684 // Nothing to emit, so skip the switch
2685 OS
<< " return \"(unknown)\";\n";
2690 static std::string
GetAliasRequiredFeatures(Record
*R
,
2691 const AsmMatcherInfo
&Info
) {
2692 std::vector
<Record
*> ReqFeatures
= R
->getValueAsListOfDefs("Predicates");
2695 if (ReqFeatures
.empty())
2698 for (unsigned i
= 0, e
= ReqFeatures
.size(); i
!= e
; ++i
) {
2699 const SubtargetFeatureInfo
*F
= Info
.getSubtargetFeature(ReqFeatures
[i
]);
2702 PrintFatalError(R
->getLoc(), "Predicate '" + ReqFeatures
[i
]->getName() +
2703 "' is not marked as an AssemblerPredicate!");
2708 Result
+= "Features.test(" + F
->getEnumBitName() + ')';
2714 static void emitMnemonicAliasVariant(raw_ostream
&OS
,const AsmMatcherInfo
&Info
,
2715 std::vector
<Record
*> &Aliases
,
2716 unsigned Indent
= 0,
2717 StringRef AsmParserVariantName
= StringRef()){
2718 // Keep track of all the aliases from a mnemonic. Use an std::map so that the
2719 // iteration order of the map is stable.
2720 std::map
<std::string
, std::vector
<Record
*> > AliasesFromMnemonic
;
2722 for (Record
*R
: Aliases
) {
2723 // FIXME: Allow AssemblerVariantName to be a comma separated list.
2724 StringRef AsmVariantName
= R
->getValueAsString("AsmVariantName");
2725 if (AsmVariantName
!= AsmParserVariantName
)
2727 AliasesFromMnemonic
[R
->getValueAsString("FromMnemonic").lower()]
2730 if (AliasesFromMnemonic
.empty())
2733 // Process each alias a "from" mnemonic at a time, building the code executed
2734 // by the string remapper.
2735 std::vector
<StringMatcher::StringPair
> Cases
;
2736 for (const auto &AliasEntry
: AliasesFromMnemonic
) {
2737 const std::vector
<Record
*> &ToVec
= AliasEntry
.second
;
2739 // Loop through each alias and emit code that handles each case. If there
2740 // are two instructions without predicates, emit an error. If there is one,
2742 std::string MatchCode
;
2743 int AliasWithNoPredicate
= -1;
2745 for (unsigned i
= 0, e
= ToVec
.size(); i
!= e
; ++i
) {
2746 Record
*R
= ToVec
[i
];
2747 std::string FeatureMask
= GetAliasRequiredFeatures(R
, Info
);
2749 // If this unconditionally matches, remember it for later and diagnose
2751 if (FeatureMask
.empty()) {
2752 if (AliasWithNoPredicate
!= -1 &&
2753 R
->getValueAsString("ToMnemonic") !=
2754 ToVec
[AliasWithNoPredicate
]->getValueAsString("ToMnemonic")) {
2755 // We can't have two different aliases from the same mnemonic with no
2758 ToVec
[AliasWithNoPredicate
]->getLoc(),
2759 "two different MnemonicAliases with the same 'from' mnemonic!");
2760 PrintFatalError(R
->getLoc(), "this is the other MnemonicAlias.");
2763 AliasWithNoPredicate
= i
;
2766 if (R
->getValueAsString("ToMnemonic") == AliasEntry
.first
)
2767 PrintFatalError(R
->getLoc(), "MnemonicAlias to the same string");
2769 if (!MatchCode
.empty())
2770 MatchCode
+= "else ";
2771 MatchCode
+= "if (" + FeatureMask
+ ")\n";
2772 MatchCode
+= " Mnemonic = \"";
2773 MatchCode
+= R
->getValueAsString("ToMnemonic").lower();
2774 MatchCode
+= "\";\n";
2777 if (AliasWithNoPredicate
!= -1) {
2778 Record
*R
= ToVec
[AliasWithNoPredicate
];
2779 if (!MatchCode
.empty())
2780 MatchCode
+= "else\n ";
2781 MatchCode
+= "Mnemonic = \"";
2782 MatchCode
+= R
->getValueAsString("ToMnemonic").lower();
2783 MatchCode
+= "\";\n";
2786 MatchCode
+= "return;";
2788 Cases
.push_back(std::make_pair(AliasEntry
.first
, MatchCode
));
2790 StringMatcher("Mnemonic", Cases
, OS
).Emit(Indent
);
2793 /// emitMnemonicAliases - If the target has any MnemonicAlias<> definitions,
2794 /// emit a function for them and return true, otherwise return false.
2795 static bool emitMnemonicAliases(raw_ostream
&OS
, const AsmMatcherInfo
&Info
,
2796 CodeGenTarget
&Target
) {
2797 // Ignore aliases when match-prefix is set.
2798 if (!MatchPrefix
.empty())
2801 std::vector
<Record
*> Aliases
=
2802 Info
.getRecords().getAllDerivedDefinitions("MnemonicAlias");
2803 if (Aliases
.empty()) return false;
2805 OS
<< "static void applyMnemonicAliases(StringRef &Mnemonic, "
2806 "const FeatureBitset &Features, unsigned VariantID) {\n";
2807 OS
<< " switch (VariantID) {\n";
2808 unsigned VariantCount
= Target
.getAsmParserVariantCount();
2809 for (unsigned VC
= 0; VC
!= VariantCount
; ++VC
) {
2810 Record
*AsmVariant
= Target
.getAsmParserVariant(VC
);
2811 int AsmParserVariantNo
= AsmVariant
->getValueAsInt("Variant");
2812 StringRef AsmParserVariantName
= AsmVariant
->getValueAsString("Name");
2813 OS
<< " case " << AsmParserVariantNo
<< ":\n";
2814 emitMnemonicAliasVariant(OS
, Info
, Aliases
, /*Indent=*/2,
2815 AsmParserVariantName
);
2820 // Emit aliases that apply to all variants.
2821 emitMnemonicAliasVariant(OS
, Info
, Aliases
);
2828 static void emitCustomOperandParsing(raw_ostream
&OS
, CodeGenTarget
&Target
,
2829 const AsmMatcherInfo
&Info
, StringRef ClassName
,
2830 StringToOffsetTable
&StringTable
,
2831 unsigned MaxMnemonicIndex
,
2832 unsigned MaxFeaturesIndex
,
2833 bool HasMnemonicFirst
) {
2834 unsigned MaxMask
= 0;
2835 for (const OperandMatchEntry
&OMI
: Info
.OperandMatchInfo
) {
2836 MaxMask
|= OMI
.OperandMask
;
2839 // Emit the static custom operand parsing table;
2840 OS
<< "namespace {\n";
2841 OS
<< " struct OperandMatchEntry {\n";
2842 OS
<< " " << getMinimalTypeForRange(MaxMnemonicIndex
)
2844 OS
<< " " << getMinimalTypeForRange(MaxMask
)
2845 << " OperandMask;\n";
2846 OS
<< " " << getMinimalTypeForRange(std::distance(
2847 Info
.Classes
.begin(), Info
.Classes
.end())) << " Class;\n";
2848 OS
<< " " << getMinimalTypeForRange(MaxFeaturesIndex
)
2849 << " RequiredFeaturesIdx;\n\n";
2850 OS
<< " StringRef getMnemonic() const {\n";
2851 OS
<< " return StringRef(MnemonicTable + Mnemonic + 1,\n";
2852 OS
<< " MnemonicTable[Mnemonic]);\n";
2856 OS
<< " // Predicate for searching for an opcode.\n";
2857 OS
<< " struct LessOpcodeOperand {\n";
2858 OS
<< " bool operator()(const OperandMatchEntry &LHS, StringRef RHS) {\n";
2859 OS
<< " return LHS.getMnemonic() < RHS;\n";
2861 OS
<< " bool operator()(StringRef LHS, const OperandMatchEntry &RHS) {\n";
2862 OS
<< " return LHS < RHS.getMnemonic();\n";
2864 OS
<< " bool operator()(const OperandMatchEntry &LHS,";
2865 OS
<< " const OperandMatchEntry &RHS) {\n";
2866 OS
<< " return LHS.getMnemonic() < RHS.getMnemonic();\n";
2870 OS
<< "} // end anonymous namespace\n\n";
2872 OS
<< "static const OperandMatchEntry OperandMatchTable["
2873 << Info
.OperandMatchInfo
.size() << "] = {\n";
2875 OS
<< " /* Operand List Mnemonic, Mask, Operand Class, Features */\n";
2876 for (const OperandMatchEntry
&OMI
: Info
.OperandMatchInfo
) {
2877 const MatchableInfo
&II
= *OMI
.MI
;
2881 // Store a pascal-style length byte in the mnemonic.
2882 std::string LenMnemonic
= char(II
.Mnemonic
.size()) + II
.Mnemonic
.lower();
2883 OS
<< StringTable
.GetOrAddStringOffset(LenMnemonic
, false)
2884 << " /* " << II
.Mnemonic
<< " */, ";
2886 OS
<< OMI
.OperandMask
;
2889 for (int i
= 0, e
= 31; i
!=e
; ++i
)
2890 if (OMI
.OperandMask
& (1 << i
))
2896 // Write the required features mask.
2898 if (II
.RequiredFeatures
.empty())
2901 for (unsigned i
= 0, e
= II
.RequiredFeatures
.size(); i
!= e
; ++i
)
2902 OS
<< '_' << II
.RequiredFeatures
[i
]->TheDef
->getName();
2908 // Emit the operand class switch to call the correct custom parser for
2909 // the found operand class.
2910 OS
<< "OperandMatchResultTy " << Target
.getName() << ClassName
<< "::\n"
2911 << "tryCustomParseOperand(OperandVector"
2912 << " &Operands,\n unsigned MCK) {\n\n"
2913 << " switch(MCK) {\n";
2915 for (const auto &CI
: Info
.Classes
) {
2916 if (CI
.ParserMethod
.empty())
2918 OS
<< " case " << CI
.Name
<< ":\n"
2919 << " return " << CI
.ParserMethod
<< "(Operands);\n";
2922 OS
<< " default:\n";
2923 OS
<< " return MatchOperand_NoMatch;\n";
2925 OS
<< " return MatchOperand_NoMatch;\n";
2928 // Emit the static custom operand parser. This code is very similar with
2929 // the other matcher. Also use MatchResultTy here just in case we go for
2930 // a better error handling.
2931 OS
<< "OperandMatchResultTy " << Target
.getName() << ClassName
<< "::\n"
2932 << "MatchOperandParserImpl(OperandVector"
2933 << " &Operands,\n StringRef Mnemonic,\n"
2934 << " bool ParseForAllFeatures) {\n";
2936 // Emit code to get the available features.
2937 OS
<< " // Get the current feature set.\n";
2938 OS
<< " const FeatureBitset &AvailableFeatures = getAvailableFeatures();\n\n";
2940 OS
<< " // Get the next operand index.\n";
2941 OS
<< " unsigned NextOpNum = Operands.size()"
2942 << (HasMnemonicFirst
? " - 1" : "") << ";\n";
2944 // Emit code to search the table.
2945 OS
<< " // Search the table.\n";
2946 if (HasMnemonicFirst
) {
2947 OS
<< " auto MnemonicRange =\n";
2948 OS
<< " std::equal_range(std::begin(OperandMatchTable), "
2949 "std::end(OperandMatchTable),\n";
2950 OS
<< " Mnemonic, LessOpcodeOperand());\n\n";
2952 OS
<< " auto MnemonicRange = std::make_pair(std::begin(OperandMatchTable),"
2953 " std::end(OperandMatchTable));\n";
2954 OS
<< " if (!Mnemonic.empty())\n";
2955 OS
<< " MnemonicRange =\n";
2956 OS
<< " std::equal_range(std::begin(OperandMatchTable), "
2957 "std::end(OperandMatchTable),\n";
2958 OS
<< " Mnemonic, LessOpcodeOperand());\n\n";
2961 OS
<< " if (MnemonicRange.first == MnemonicRange.second)\n";
2962 OS
<< " return MatchOperand_NoMatch;\n\n";
2964 OS
<< " for (const OperandMatchEntry *it = MnemonicRange.first,\n"
2965 << " *ie = MnemonicRange.second; it != ie; ++it) {\n";
2967 OS
<< " // equal_range guarantees that instruction mnemonic matches.\n";
2968 OS
<< " assert(Mnemonic == it->getMnemonic());\n\n";
2970 // Emit check that the required features are available.
2971 OS
<< " // check if the available features match\n";
2972 OS
<< " const FeatureBitset &RequiredFeatures = "
2973 "FeatureBitsets[it->RequiredFeaturesIdx];\n";
2974 OS
<< " if (!ParseForAllFeatures && (AvailableFeatures & "
2975 "RequiredFeatures) != RequiredFeatures)\n";
2976 OS
<< " continue;\n\n";
2978 // Emit check to ensure the operand number matches.
2979 OS
<< " // check if the operand in question has a custom parser.\n";
2980 OS
<< " if (!(it->OperandMask & (1 << NextOpNum)))\n";
2981 OS
<< " continue;\n\n";
2983 // Emit call to the custom parser method
2984 OS
<< " // call custom parse method to handle the operand\n";
2985 OS
<< " OperandMatchResultTy Result = ";
2986 OS
<< "tryCustomParseOperand(Operands, it->Class);\n";
2987 OS
<< " if (Result != MatchOperand_NoMatch)\n";
2988 OS
<< " return Result;\n";
2991 OS
<< " // Okay, we had no match.\n";
2992 OS
<< " return MatchOperand_NoMatch;\n";
2996 static void emitAsmTiedOperandConstraints(CodeGenTarget
&Target
,
2997 AsmMatcherInfo
&Info
,
2999 std::string AsmParserName
=
3000 std::string(Info
.AsmParser
->getValueAsString("AsmParserClassName"));
3001 OS
<< "static bool ";
3002 OS
<< "checkAsmTiedOperandConstraints(const " << Target
.getName()
3003 << AsmParserName
<< "&AsmParser,\n";
3004 OS
<< " unsigned Kind,\n";
3005 OS
<< " const OperandVector &Operands,\n";
3006 OS
<< " uint64_t &ErrorInfo) {\n";
3007 OS
<< " assert(Kind < CVT_NUM_SIGNATURES && \"Invalid signature!\");\n";
3008 OS
<< " const uint8_t *Converter = ConversionTable[Kind];\n";
3009 OS
<< " for (const uint8_t *p = Converter; *p; p += 2) {\n";
3010 OS
<< " switch (*p) {\n";
3011 OS
<< " case CVT_Tied: {\n";
3012 OS
<< " unsigned OpIdx = *(p + 1);\n";
3013 OS
<< " assert(OpIdx < (size_t)(std::end(TiedAsmOperandTable) -\n";
3014 OS
<< " std::begin(TiedAsmOperandTable)) &&\n";
3015 OS
<< " \"Tied operand not found\");\n";
3016 OS
<< " unsigned OpndNum1 = TiedAsmOperandTable[OpIdx][1];\n";
3017 OS
<< " unsigned OpndNum2 = TiedAsmOperandTable[OpIdx][2];\n";
3018 OS
<< " if (OpndNum1 != OpndNum2) {\n";
3019 OS
<< " auto &SrcOp1 = Operands[OpndNum1];\n";
3020 OS
<< " auto &SrcOp2 = Operands[OpndNum2];\n";
3021 OS
<< " if (SrcOp1->isReg() && SrcOp2->isReg()) {\n";
3022 OS
<< " if (!AsmParser.regsEqual(*SrcOp1, *SrcOp2)) {\n";
3023 OS
<< " ErrorInfo = OpndNum2;\n";
3024 OS
<< " return false;\n";
3030 OS
<< " default:\n";
3034 OS
<< " return true;\n";
3038 static void emitMnemonicSpellChecker(raw_ostream
&OS
, CodeGenTarget
&Target
,
3039 unsigned VariantCount
) {
3040 OS
<< "static std::string " << Target
.getName()
3041 << "MnemonicSpellCheck(StringRef S, const FeatureBitset &FBS,"
3042 << " unsigned VariantID) {\n";
3044 OS
<< " return \"\";";
3046 OS
<< " const unsigned MaxEditDist = 2;\n";
3047 OS
<< " std::vector<StringRef> Candidates;\n";
3048 OS
<< " StringRef Prev = \"\";\n\n";
3050 OS
<< " // Find the appropriate table for this asm variant.\n";
3051 OS
<< " const MatchEntry *Start, *End;\n";
3052 OS
<< " switch (VariantID) {\n";
3053 OS
<< " default: llvm_unreachable(\"invalid variant!\");\n";
3054 for (unsigned VC
= 0; VC
!= VariantCount
; ++VC
) {
3055 Record
*AsmVariant
= Target
.getAsmParserVariant(VC
);
3056 int AsmVariantNo
= AsmVariant
->getValueAsInt("Variant");
3057 OS
<< " case " << AsmVariantNo
<< ": Start = std::begin(MatchTable" << VC
3058 << "); End = std::end(MatchTable" << VC
<< "); break;\n";
3061 OS
<< " for (auto I = Start; I < End; I++) {\n";
3062 OS
<< " // Ignore unsupported instructions.\n";
3063 OS
<< " const FeatureBitset &RequiredFeatures = "
3064 "FeatureBitsets[I->RequiredFeaturesIdx];\n";
3065 OS
<< " if ((FBS & RequiredFeatures) != RequiredFeatures)\n";
3066 OS
<< " continue;\n";
3068 OS
<< " StringRef T = I->getMnemonic();\n";
3069 OS
<< " // Avoid recomputing the edit distance for the same string.\n";
3070 OS
<< " if (T.equals(Prev))\n";
3071 OS
<< " continue;\n";
3073 OS
<< " Prev = T;\n";
3074 OS
<< " unsigned Dist = S.edit_distance(T, false, MaxEditDist);\n";
3075 OS
<< " if (Dist <= MaxEditDist)\n";
3076 OS
<< " Candidates.push_back(T);\n";
3079 OS
<< " if (Candidates.empty())\n";
3080 OS
<< " return \"\";\n";
3082 OS
<< " std::string Res = \", did you mean: \";\n";
3083 OS
<< " unsigned i = 0;\n";
3084 OS
<< " for (; i < Candidates.size() - 1; i++)\n";
3085 OS
<< " Res += Candidates[i].str() + \", \";\n";
3086 OS
<< " return Res + Candidates[i].str() + \"?\";\n";
3092 static void emitMnemonicChecker(raw_ostream
&OS
,
3093 CodeGenTarget
&Target
,
3094 unsigned VariantCount
,
3095 bool HasMnemonicFirst
,
3096 bool HasMnemonicAliases
) {
3097 OS
<< "static bool " << Target
.getName()
3098 << "CheckMnemonic(StringRef Mnemonic,\n";
3100 << "const FeatureBitset &AvailableFeatures,\n";
3102 << "unsigned VariantID) {\n";
3104 if (!VariantCount
) {
3105 OS
<< " return false;\n";
3107 if (HasMnemonicAliases
) {
3108 OS
<< " // Process all MnemonicAliases to remap the mnemonic.\n";
3109 OS
<< " applyMnemonicAliases(Mnemonic, AvailableFeatures, VariantID);";
3112 OS
<< " // Find the appropriate table for this asm variant.\n";
3113 OS
<< " const MatchEntry *Start, *End;\n";
3114 OS
<< " switch (VariantID) {\n";
3115 OS
<< " default: llvm_unreachable(\"invalid variant!\");\n";
3116 for (unsigned VC
= 0; VC
!= VariantCount
; ++VC
) {
3117 Record
*AsmVariant
= Target
.getAsmParserVariant(VC
);
3118 int AsmVariantNo
= AsmVariant
->getValueAsInt("Variant");
3119 OS
<< " case " << AsmVariantNo
<< ": Start = std::begin(MatchTable" << VC
3120 << "); End = std::end(MatchTable" << VC
<< "); break;\n";
3124 OS
<< " // Search the table.\n";
3125 if (HasMnemonicFirst
) {
3126 OS
<< " auto MnemonicRange = "
3127 "std::equal_range(Start, End, Mnemonic, LessOpcode());\n\n";
3129 OS
<< " auto MnemonicRange = std::make_pair(Start, End);\n";
3130 OS
<< " unsigned SIndex = Mnemonic.empty() ? 0 : 1;\n";
3131 OS
<< " if (!Mnemonic.empty())\n";
3132 OS
<< " MnemonicRange = "
3133 << "std::equal_range(Start, End, Mnemonic.lower(), LessOpcode());\n\n";
3136 OS
<< " if (MnemonicRange.first == MnemonicRange.second)\n";
3137 OS
<< " return false;\n\n";
3139 OS
<< " for (const MatchEntry *it = MnemonicRange.first, "
3140 << "*ie = MnemonicRange.second;\n";
3141 OS
<< " it != ie; ++it) {\n";
3142 OS
<< " const FeatureBitset &RequiredFeatures =\n";
3143 OS
<< " FeatureBitsets[it->RequiredFeaturesIdx];\n";
3144 OS
<< " if ((AvailableFeatures & RequiredFeatures) == ";
3145 OS
<< "RequiredFeatures)\n";
3146 OS
<< " return true;\n";
3148 OS
<< " return false;\n";
3154 // Emit a function mapping match classes to strings, for debugging.
3155 static void emitMatchClassKindNames(std::forward_list
<ClassInfo
> &Infos
,
3157 OS
<< "#ifndef NDEBUG\n";
3158 OS
<< "const char *getMatchClassName(MatchClassKind Kind) {\n";
3159 OS
<< " switch (Kind) {\n";
3161 OS
<< " case InvalidMatchClass: return \"InvalidMatchClass\";\n";
3162 OS
<< " case OptionalMatchClass: return \"OptionalMatchClass\";\n";
3163 for (const auto &CI
: Infos
) {
3164 OS
<< " case " << CI
.Name
<< ": return \"" << CI
.Name
<< "\";\n";
3166 OS
<< " case NumMatchClassKinds: return \"NumMatchClassKinds\";\n";
3169 OS
<< " llvm_unreachable(\"unhandled MatchClassKind!\");\n";
3171 OS
<< "#endif // NDEBUG\n";
3175 getNameForFeatureBitset(const std::vector
<Record
*> &FeatureBitset
) {
3176 std::string Name
= "AMFBS";
3177 for (const auto &Feature
: FeatureBitset
)
3178 Name
+= ("_" + Feature
->getName()).str();
3182 void AsmMatcherEmitter::run(raw_ostream
&OS
) {
3183 CodeGenTarget
Target(Records
);
3184 Record
*AsmParser
= Target
.getAsmParser();
3185 StringRef ClassName
= AsmParser
->getValueAsString("AsmParserClassName");
3187 // Compute the information on the instructions to match.
3188 AsmMatcherInfo
Info(AsmParser
, Target
, Records
);
3191 // Sort the instruction table using the partial order on classes. We use
3192 // stable_sort to ensure that ambiguous instructions are still
3193 // deterministically ordered.
3196 [](const std::unique_ptr
<MatchableInfo
> &a
,
3197 const std::unique_ptr
<MatchableInfo
> &b
) { return *a
< *b
; });
3199 #ifdef EXPENSIVE_CHECKS
3200 // Verify that the table is sorted and operator < works transitively.
3201 for (auto I
= Info
.Matchables
.begin(), E
= Info
.Matchables
.end(); I
!= E
;
3203 for (auto J
= I
; J
!= E
; ++J
) {
3204 assert(!(**J
< **I
));
3209 DEBUG_WITH_TYPE("instruction_info", {
3210 for (const auto &MI
: Info
.Matchables
)
3214 // Check for ambiguous matchables.
3215 DEBUG_WITH_TYPE("ambiguous_instrs", {
3216 unsigned NumAmbiguous
= 0;
3217 for (auto I
= Info
.Matchables
.begin(), E
= Info
.Matchables
.end(); I
!= E
;
3219 for (auto J
= std::next(I
); J
!= E
; ++J
) {
3220 const MatchableInfo
&A
= **I
;
3221 const MatchableInfo
&B
= **J
;
3223 if (A
.couldMatchAmbiguouslyWith(B
)) {
3224 errs() << "warning: ambiguous matchables:\n";
3226 errs() << "\nis incomparable with:\n";
3234 errs() << "warning: " << NumAmbiguous
3235 << " ambiguous matchables!\n";
3238 // Compute the information on the custom operand parsing.
3239 Info
.buildOperandMatchInfo();
3241 bool HasMnemonicFirst
= AsmParser
->getValueAsBit("HasMnemonicFirst");
3242 bool HasOptionalOperands
= Info
.hasOptionalOperands();
3243 bool ReportMultipleNearMisses
=
3244 AsmParser
->getValueAsBit("ReportMultipleNearMisses");
3246 // Write the output.
3248 // Information for the class declaration.
3249 OS
<< "\n#ifdef GET_ASSEMBLER_HEADER\n";
3250 OS
<< "#undef GET_ASSEMBLER_HEADER\n";
3251 OS
<< " // This should be included into the middle of the declaration of\n";
3252 OS
<< " // your subclasses implementation of MCTargetAsmParser.\n";
3253 OS
<< " FeatureBitset ComputeAvailableFeatures(const FeatureBitset &FB) const;\n";
3254 if (HasOptionalOperands
) {
3255 OS
<< " void convertToMCInst(unsigned Kind, MCInst &Inst, "
3256 << "unsigned Opcode,\n"
3257 << " const OperandVector &Operands,\n"
3258 << " const SmallBitVector &OptionalOperandsMask);\n";
3260 OS
<< " void convertToMCInst(unsigned Kind, MCInst &Inst, "
3261 << "unsigned Opcode,\n"
3262 << " const OperandVector &Operands);\n";
3264 OS
<< " void convertToMapAndConstraints(unsigned Kind,\n ";
3265 OS
<< " const OperandVector &Operands) override;\n";
3266 OS
<< " unsigned MatchInstructionImpl(const OperandVector &Operands,\n"
3267 << " MCInst &Inst,\n";
3268 if (ReportMultipleNearMisses
)
3269 OS
<< " SmallVectorImpl<NearMissInfo> *NearMisses,\n";
3271 OS
<< " uint64_t &ErrorInfo,\n"
3272 << " FeatureBitset &MissingFeatures,\n";
3273 OS
<< " bool matchingInlineAsm,\n"
3274 << " unsigned VariantID = 0);\n";
3275 if (!ReportMultipleNearMisses
)
3276 OS
<< " unsigned MatchInstructionImpl(const OperandVector &Operands,\n"
3277 << " MCInst &Inst,\n"
3278 << " uint64_t &ErrorInfo,\n"
3279 << " bool matchingInlineAsm,\n"
3280 << " unsigned VariantID = 0) {\n"
3281 << " FeatureBitset MissingFeatures;\n"
3282 << " return MatchInstructionImpl(Operands, Inst, ErrorInfo, MissingFeatures,\n"
3283 << " matchingInlineAsm, VariantID);\n"
3287 if (!Info
.OperandMatchInfo
.empty()) {
3288 OS
<< " OperandMatchResultTy MatchOperandParserImpl(\n";
3289 OS
<< " OperandVector &Operands,\n";
3290 OS
<< " StringRef Mnemonic,\n";
3291 OS
<< " bool ParseForAllFeatures = false);\n";
3293 OS
<< " OperandMatchResultTy tryCustomParseOperand(\n";
3294 OS
<< " OperandVector &Operands,\n";
3295 OS
<< " unsigned MCK);\n\n";
3298 OS
<< "#endif // GET_ASSEMBLER_HEADER_INFO\n\n";
3300 // Emit the operand match diagnostic enum names.
3301 OS
<< "\n#ifdef GET_OPERAND_DIAGNOSTIC_TYPES\n";
3302 OS
<< "#undef GET_OPERAND_DIAGNOSTIC_TYPES\n\n";
3303 emitOperandDiagnosticTypes(Info
, OS
);
3304 OS
<< "#endif // GET_OPERAND_DIAGNOSTIC_TYPES\n\n";
3306 OS
<< "\n#ifdef GET_REGISTER_MATCHER\n";
3307 OS
<< "#undef GET_REGISTER_MATCHER\n\n";
3309 // Emit the subtarget feature enumeration.
3310 SubtargetFeatureInfo::emitSubtargetFeatureBitEnumeration(
3311 Info
.SubtargetFeatures
, OS
);
3313 // Emit the function to match a register name to number.
3314 // This should be omitted for Mips target
3315 if (AsmParser
->getValueAsBit("ShouldEmitMatchRegisterName"))
3316 emitMatchRegisterName(Target
, AsmParser
, OS
);
3318 if (AsmParser
->getValueAsBit("ShouldEmitMatchRegisterAltName"))
3319 emitMatchRegisterAltName(Target
, AsmParser
, OS
);
3321 OS
<< "#endif // GET_REGISTER_MATCHER\n\n";
3323 OS
<< "\n#ifdef GET_SUBTARGET_FEATURE_NAME\n";
3324 OS
<< "#undef GET_SUBTARGET_FEATURE_NAME\n\n";
3326 // Generate the helper function to get the names for subtarget features.
3327 emitGetSubtargetFeatureName(Info
, OS
);
3329 OS
<< "#endif // GET_SUBTARGET_FEATURE_NAME\n\n";
3331 OS
<< "\n#ifdef GET_MATCHER_IMPLEMENTATION\n";
3332 OS
<< "#undef GET_MATCHER_IMPLEMENTATION\n\n";
3334 // Generate the function that remaps for mnemonic aliases.
3335 bool HasMnemonicAliases
= emitMnemonicAliases(OS
, Info
, Target
);
3337 // Generate the convertToMCInst function to convert operands into an MCInst.
3338 // Also, generate the convertToMapAndConstraints function for MS-style inline
3339 // assembly. The latter doesn't actually generate a MCInst.
3340 unsigned NumConverters
= emitConvertFuncs(Target
, ClassName
, Info
.Matchables
,
3342 HasOptionalOperands
, OS
);
3344 // Emit the enumeration for classes which participate in matching.
3345 emitMatchClassEnumeration(Target
, Info
.Classes
, OS
);
3347 // Emit a function to get the user-visible string to describe an operand
3348 // match failure in diagnostics.
3349 emitOperandMatchErrorDiagStrings(Info
, OS
);
3351 // Emit a function to map register classes to operand match failure codes.
3352 emitRegisterMatchErrorFunc(Info
, OS
);
3354 // Emit the routine to match token strings to their match class.
3355 emitMatchTokenString(Target
, Info
.Classes
, OS
);
3357 // Emit the subclass predicate routine.
3358 emitIsSubclass(Target
, Info
.Classes
, OS
);
3360 // Emit the routine to validate an operand against a match class.
3361 emitValidateOperandClass(Info
, OS
);
3363 emitMatchClassKindNames(Info
.Classes
, OS
);
3365 // Emit the available features compute function.
3366 SubtargetFeatureInfo::emitComputeAssemblerAvailableFeatures(
3367 Info
.Target
.getName(), ClassName
, "ComputeAvailableFeatures",
3368 Info
.SubtargetFeatures
, OS
);
3370 if (!ReportMultipleNearMisses
)
3371 emitAsmTiedOperandConstraints(Target
, Info
, OS
);
3373 StringToOffsetTable StringTable
;
3375 size_t MaxNumOperands
= 0;
3376 unsigned MaxMnemonicIndex
= 0;
3377 bool HasDeprecation
= false;
3378 for (const auto &MI
: Info
.Matchables
) {
3379 MaxNumOperands
= std::max(MaxNumOperands
, MI
->AsmOperands
.size());
3380 HasDeprecation
|= MI
->HasDeprecation
;
3382 // Store a pascal-style length byte in the mnemonic.
3383 std::string LenMnemonic
= char(MI
->Mnemonic
.size()) + MI
->Mnemonic
.lower();
3384 MaxMnemonicIndex
= std::max(MaxMnemonicIndex
,
3385 StringTable
.GetOrAddStringOffset(LenMnemonic
, false));
3388 OS
<< "static const char *const MnemonicTable =\n";
3389 StringTable
.EmitString(OS
);
3392 std::vector
<std::vector
<Record
*>> FeatureBitsets
;
3393 for (const auto &MI
: Info
.Matchables
) {
3394 if (MI
->RequiredFeatures
.empty())
3396 FeatureBitsets
.emplace_back();
3397 for (unsigned I
= 0, E
= MI
->RequiredFeatures
.size(); I
!= E
; ++I
)
3398 FeatureBitsets
.back().push_back(MI
->RequiredFeatures
[I
]->TheDef
);
3401 llvm::sort(FeatureBitsets
, [&](const std::vector
<Record
*> &A
,
3402 const std::vector
<Record
*> &B
) {
3403 if (A
.size() < B
.size())
3405 if (A
.size() > B
.size())
3407 for (auto Pair
: zip(A
, B
)) {
3408 if (std::get
<0>(Pair
)->getName() < std::get
<1>(Pair
)->getName())
3410 if (std::get
<0>(Pair
)->getName() > std::get
<1>(Pair
)->getName())
3415 FeatureBitsets
.erase(
3416 std::unique(FeatureBitsets
.begin(), FeatureBitsets
.end()),
3417 FeatureBitsets
.end());
3418 OS
<< "// Feature bitsets.\n"
3419 << "enum : " << getMinimalTypeForRange(FeatureBitsets
.size()) << " {\n"
3420 << " AMFBS_None,\n";
3421 for (const auto &FeatureBitset
: FeatureBitsets
) {
3422 if (FeatureBitset
.empty())
3424 OS
<< " " << getNameForFeatureBitset(FeatureBitset
) << ",\n";
3427 << "static constexpr FeatureBitset FeatureBitsets[] = {\n"
3428 << " {}, // AMFBS_None\n";
3429 for (const auto &FeatureBitset
: FeatureBitsets
) {
3430 if (FeatureBitset
.empty())
3433 for (const auto &Feature
: FeatureBitset
) {
3434 const auto &I
= Info
.SubtargetFeatures
.find(Feature
);
3435 assert(I
!= Info
.SubtargetFeatures
.end() && "Didn't import predicate?");
3436 OS
<< I
->second
.getEnumBitName() << ", ";
3442 // Emit the static match table; unused classes get initialized to 0 which is
3443 // guaranteed to be InvalidMatchClass.
3445 // FIXME: We can reduce the size of this table very easily. First, we change
3446 // it so that store the kinds in separate bit-fields for each index, which
3447 // only needs to be the max width used for classes at that index (we also need
3448 // to reject based on this during classification). If we then make sure to
3449 // order the match kinds appropriately (putting mnemonics last), then we
3450 // should only end up using a few bits for each class, especially the ones
3451 // following the mnemonic.
3452 OS
<< "namespace {\n";
3453 OS
<< " struct MatchEntry {\n";
3454 OS
<< " " << getMinimalTypeForRange(MaxMnemonicIndex
)
3456 OS
<< " uint16_t Opcode;\n";
3457 OS
<< " " << getMinimalTypeForRange(NumConverters
)
3459 OS
<< " " << getMinimalTypeForRange(FeatureBitsets
.size())
3460 << " RequiredFeaturesIdx;\n";
3461 OS
<< " " << getMinimalTypeForRange(
3462 std::distance(Info
.Classes
.begin(), Info
.Classes
.end()))
3463 << " Classes[" << MaxNumOperands
<< "];\n";
3464 OS
<< " StringRef getMnemonic() const {\n";
3465 OS
<< " return StringRef(MnemonicTable + Mnemonic + 1,\n";
3466 OS
<< " MnemonicTable[Mnemonic]);\n";
3470 OS
<< " // Predicate for searching for an opcode.\n";
3471 OS
<< " struct LessOpcode {\n";
3472 OS
<< " bool operator()(const MatchEntry &LHS, StringRef RHS) {\n";
3473 OS
<< " return LHS.getMnemonic() < RHS;\n";
3475 OS
<< " bool operator()(StringRef LHS, const MatchEntry &RHS) {\n";
3476 OS
<< " return LHS < RHS.getMnemonic();\n";
3478 OS
<< " bool operator()(const MatchEntry &LHS, const MatchEntry &RHS) {\n";
3479 OS
<< " return LHS.getMnemonic() < RHS.getMnemonic();\n";
3483 OS
<< "} // end anonymous namespace\n\n";
3485 unsigned VariantCount
= Target
.getAsmParserVariantCount();
3486 for (unsigned VC
= 0; VC
!= VariantCount
; ++VC
) {
3487 Record
*AsmVariant
= Target
.getAsmParserVariant(VC
);
3488 int AsmVariantNo
= AsmVariant
->getValueAsInt("Variant");
3490 OS
<< "static const MatchEntry MatchTable" << VC
<< "[] = {\n";
3492 for (const auto &MI
: Info
.Matchables
) {
3493 if (MI
->AsmVariantID
!= AsmVariantNo
)
3496 // Store a pascal-style length byte in the mnemonic.
3497 std::string LenMnemonic
=
3498 char(MI
->Mnemonic
.size()) + MI
->Mnemonic
.lower();
3499 OS
<< " { " << StringTable
.GetOrAddStringOffset(LenMnemonic
, false)
3500 << " /* " << MI
->Mnemonic
<< " */, "
3501 << Target
.getInstNamespace() << "::"
3502 << MI
->getResultInst()->TheDef
->getName() << ", "
3503 << MI
->ConversionFnKind
<< ", ";
3505 // Write the required features mask.
3507 if (MI
->RequiredFeatures
.empty())
3510 for (unsigned i
= 0, e
= MI
->RequiredFeatures
.size(); i
!= e
; ++i
)
3511 OS
<< '_' << MI
->RequiredFeatures
[i
]->TheDef
->getName();
3515 for (const MatchableInfo::AsmOperand
&Op
: MI
->AsmOperands
)
3516 OS
<< LS
<< Op
.Class
->Name
;
3523 OS
<< "#include \"llvm/Support/Debug.h\"\n";
3524 OS
<< "#include \"llvm/Support/Format.h\"\n\n";
3526 // Finally, build the match function.
3527 OS
<< "unsigned " << Target
.getName() << ClassName
<< "::\n"
3528 << "MatchInstructionImpl(const OperandVector &Operands,\n";
3529 OS
<< " MCInst &Inst,\n";
3530 if (ReportMultipleNearMisses
)
3531 OS
<< " SmallVectorImpl<NearMissInfo> *NearMisses,\n";
3533 OS
<< " uint64_t &ErrorInfo,\n"
3534 << " FeatureBitset &MissingFeatures,\n";
3535 OS
<< " bool matchingInlineAsm, unsigned VariantID) {\n";
3537 if (!ReportMultipleNearMisses
) {
3538 OS
<< " // Eliminate obvious mismatches.\n";
3539 OS
<< " if (Operands.size() > "
3540 << (MaxNumOperands
+ HasMnemonicFirst
) << ") {\n";
3541 OS
<< " ErrorInfo = "
3542 << (MaxNumOperands
+ HasMnemonicFirst
) << ";\n";
3543 OS
<< " return Match_InvalidOperand;\n";
3547 // Emit code to get the available features.
3548 OS
<< " // Get the current feature set.\n";
3549 OS
<< " const FeatureBitset &AvailableFeatures = getAvailableFeatures();\n\n";
3551 OS
<< " // Get the instruction mnemonic, which is the first token.\n";
3552 if (HasMnemonicFirst
) {
3553 OS
<< " StringRef Mnemonic = ((" << Target
.getName()
3554 << "Operand &)*Operands[0]).getToken();\n\n";
3556 OS
<< " StringRef Mnemonic;\n";
3557 OS
<< " if (Operands[0]->isToken())\n";
3558 OS
<< " Mnemonic = ((" << Target
.getName()
3559 << "Operand &)*Operands[0]).getToken();\n\n";
3562 if (HasMnemonicAliases
) {
3563 OS
<< " // Process all MnemonicAliases to remap the mnemonic.\n";
3564 OS
<< " applyMnemonicAliases(Mnemonic, AvailableFeatures, VariantID);\n\n";
3567 // Emit code to compute the class list for this operand vector.
3568 if (!ReportMultipleNearMisses
) {
3569 OS
<< " // Some state to try to produce better error messages.\n";
3570 OS
<< " bool HadMatchOtherThanFeatures = false;\n";
3571 OS
<< " bool HadMatchOtherThanPredicate = false;\n";
3572 OS
<< " unsigned RetCode = Match_InvalidOperand;\n";
3573 OS
<< " MissingFeatures.set();\n";
3574 OS
<< " // Set ErrorInfo to the operand that mismatches if it is\n";
3575 OS
<< " // wrong for all instances of the instruction.\n";
3576 OS
<< " ErrorInfo = ~0ULL;\n";
3579 if (HasOptionalOperands
) {
3580 OS
<< " SmallBitVector OptionalOperandsMask(" << MaxNumOperands
<< ");\n";
3583 // Emit code to search the table.
3584 OS
<< " // Find the appropriate table for this asm variant.\n";
3585 OS
<< " const MatchEntry *Start, *End;\n";
3586 OS
<< " switch (VariantID) {\n";
3587 OS
<< " default: llvm_unreachable(\"invalid variant!\");\n";
3588 for (unsigned VC
= 0; VC
!= VariantCount
; ++VC
) {
3589 Record
*AsmVariant
= Target
.getAsmParserVariant(VC
);
3590 int AsmVariantNo
= AsmVariant
->getValueAsInt("Variant");
3591 OS
<< " case " << AsmVariantNo
<< ": Start = std::begin(MatchTable" << VC
3592 << "); End = std::end(MatchTable" << VC
<< "); break;\n";
3596 OS
<< " // Search the table.\n";
3597 if (HasMnemonicFirst
) {
3598 OS
<< " auto MnemonicRange = "
3599 "std::equal_range(Start, End, Mnemonic, LessOpcode());\n\n";
3601 OS
<< " auto MnemonicRange = std::make_pair(Start, End);\n";
3602 OS
<< " unsigned SIndex = Mnemonic.empty() ? 0 : 1;\n";
3603 OS
<< " if (!Mnemonic.empty())\n";
3604 OS
<< " MnemonicRange = "
3605 "std::equal_range(Start, End, Mnemonic.lower(), LessOpcode());\n\n";
3608 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"AsmMatcher: found \" <<\n"
3609 << " std::distance(MnemonicRange.first, MnemonicRange.second) <<\n"
3610 << " \" encodings with mnemonic '\" << Mnemonic << \"'\\n\");\n\n";
3612 OS
<< " // Return a more specific error code if no mnemonics match.\n";
3613 OS
<< " if (MnemonicRange.first == MnemonicRange.second)\n";
3614 OS
<< " return Match_MnemonicFail;\n\n";
3616 OS
<< " for (const MatchEntry *it = MnemonicRange.first, "
3617 << "*ie = MnemonicRange.second;\n";
3618 OS
<< " it != ie; ++it) {\n";
3619 OS
<< " const FeatureBitset &RequiredFeatures = "
3620 "FeatureBitsets[it->RequiredFeaturesIdx];\n";
3621 OS
<< " bool HasRequiredFeatures =\n";
3622 OS
<< " (AvailableFeatures & RequiredFeatures) == RequiredFeatures;\n";
3623 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"Trying to match opcode \"\n";
3624 OS
<< " << MII.getName(it->Opcode) << \"\\n\");\n";
3626 if (ReportMultipleNearMisses
) {
3627 OS
<< " // Some state to record ways in which this instruction did not match.\n";
3628 OS
<< " NearMissInfo OperandNearMiss = NearMissInfo::getSuccess();\n";
3629 OS
<< " NearMissInfo FeaturesNearMiss = NearMissInfo::getSuccess();\n";
3630 OS
<< " NearMissInfo EarlyPredicateNearMiss = NearMissInfo::getSuccess();\n";
3631 OS
<< " NearMissInfo LatePredicateNearMiss = NearMissInfo::getSuccess();\n";
3632 OS
<< " bool MultipleInvalidOperands = false;\n";
3635 if (HasMnemonicFirst
) {
3636 OS
<< " // equal_range guarantees that instruction mnemonic matches.\n";
3637 OS
<< " assert(Mnemonic == it->getMnemonic());\n";
3640 // Emit check that the subclasses match.
3641 if (!ReportMultipleNearMisses
)
3642 OS
<< " bool OperandsValid = true;\n";
3643 if (HasOptionalOperands
) {
3644 OS
<< " OptionalOperandsMask.reset(0, " << MaxNumOperands
<< ");\n";
3646 OS
<< " for (unsigned FormalIdx = " << (HasMnemonicFirst
? "0" : "SIndex")
3647 << ", ActualIdx = " << (HasMnemonicFirst
? "1" : "SIndex")
3648 << "; FormalIdx != " << MaxNumOperands
<< "; ++FormalIdx) {\n";
3649 OS
<< " auto Formal = "
3650 << "static_cast<MatchClassKind>(it->Classes[FormalIdx]);\n";
3651 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\",\n";
3652 OS
<< " dbgs() << \" Matching formal operand class \" << getMatchClassName(Formal)\n";
3653 OS
<< " << \" against actual operand at index \" << ActualIdx);\n";
3654 OS
<< " if (ActualIdx < Operands.size())\n";
3655 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \" (\";\n";
3656 OS
<< " Operands[ActualIdx]->print(dbgs()); dbgs() << \"): \");\n";
3658 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \": \");\n";
3659 OS
<< " if (ActualIdx >= Operands.size()) {\n";
3660 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"actual operand index out of range \");\n";
3661 if (ReportMultipleNearMisses
) {
3662 OS
<< " bool ThisOperandValid = (Formal == " <<"InvalidMatchClass) || "
3663 "isSubclass(Formal, OptionalMatchClass);\n";
3664 OS
<< " if (!ThisOperandValid) {\n";
3665 OS
<< " if (!OperandNearMiss) {\n";
3666 OS
<< " // Record info about match failure for later use.\n";
3667 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"recording too-few-operands near miss\\n\");\n";
3668 OS
<< " OperandNearMiss =\n";
3669 OS
<< " NearMissInfo::getTooFewOperands(Formal, it->Opcode);\n";
3670 OS
<< " } else if (OperandNearMiss.getKind() != NearMissInfo::NearMissTooFewOperands) {\n";
3671 OS
<< " // If more than one operand is invalid, give up on this match entry.\n";
3672 OS
<< " DEBUG_WITH_TYPE(\n";
3673 OS
<< " \"asm-matcher\",\n";
3674 OS
<< " dbgs() << \"second invalid operand, giving up on this opcode\\n\");\n";
3675 OS
<< " MultipleInvalidOperands = true;\n";
3678 OS
<< " } else {\n";
3679 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"but formal operand not required\\n\");\n";
3682 OS
<< " continue;\n";
3684 OS
<< " OperandsValid = (Formal == InvalidMatchClass) || isSubclass(Formal, OptionalMatchClass);\n";
3685 OS
<< " if (!OperandsValid) ErrorInfo = ActualIdx;\n";
3686 if (HasOptionalOperands
) {
3687 OS
<< " OptionalOperandsMask.set(FormalIdx, " << MaxNumOperands
3693 OS
<< " MCParsedAsmOperand &Actual = *Operands[ActualIdx];\n";
3694 OS
<< " unsigned Diag = validateOperandClass(Actual, Formal);\n";
3695 OS
<< " if (Diag == Match_Success) {\n";
3696 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\",\n";
3697 OS
<< " dbgs() << \"match success using generic matcher\\n\");\n";
3698 OS
<< " ++ActualIdx;\n";
3699 OS
<< " continue;\n";
3701 OS
<< " // If the generic handler indicates an invalid operand\n";
3702 OS
<< " // failure, check for a special case.\n";
3703 OS
<< " if (Diag != Match_Success) {\n";
3704 OS
<< " unsigned TargetDiag = validateTargetOperandClass(Actual, Formal);\n";
3705 OS
<< " if (TargetDiag == Match_Success) {\n";
3706 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\",\n";
3707 OS
<< " dbgs() << \"match success using target matcher\\n\");\n";
3708 OS
<< " ++ActualIdx;\n";
3709 OS
<< " continue;\n";
3711 OS
<< " // If the target matcher returned a specific error code use\n";
3712 OS
<< " // that, else use the one from the generic matcher.\n";
3713 OS
<< " if (TargetDiag != Match_InvalidOperand && "
3714 "HasRequiredFeatures)\n";
3715 OS
<< " Diag = TargetDiag;\n";
3717 OS
<< " // If current formal operand wasn't matched and it is optional\n"
3718 << " // then try to match next formal operand\n";
3719 OS
<< " if (Diag == Match_InvalidOperand "
3720 << "&& isSubclass(Formal, OptionalMatchClass)) {\n";
3721 if (HasOptionalOperands
) {
3722 OS
<< " OptionalOperandsMask.set(FormalIdx);\n";
3724 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"ignoring optional operand\\n\");\n";
3725 OS
<< " continue;\n";
3728 if (ReportMultipleNearMisses
) {
3729 OS
<< " if (!OperandNearMiss) {\n";
3730 OS
<< " // If this is the first invalid operand we have seen, record some\n";
3731 OS
<< " // information about it.\n";
3732 OS
<< " DEBUG_WITH_TYPE(\n";
3733 OS
<< " \"asm-matcher\",\n";
3735 OS
<< " << \"operand match failed, recording near-miss with diag code \"\n";
3736 OS
<< " << Diag << \"\\n\");\n";
3737 OS
<< " OperandNearMiss =\n";
3738 OS
<< " NearMissInfo::getMissedOperand(Diag, Formal, it->Opcode, ActualIdx);\n";
3739 OS
<< " ++ActualIdx;\n";
3740 OS
<< " } else {\n";
3741 OS
<< " // If more than one operand is invalid, give up on this match entry.\n";
3742 OS
<< " DEBUG_WITH_TYPE(\n";
3743 OS
<< " \"asm-matcher\",\n";
3744 OS
<< " dbgs() << \"second operand mismatch, skipping this opcode\\n\");\n";
3745 OS
<< " MultipleInvalidOperands = true;\n";
3750 OS
<< " // If this operand is broken for all of the instances of this\n";
3751 OS
<< " // mnemonic, keep track of it so we can report loc info.\n";
3752 OS
<< " // If we already had a match that only failed due to a\n";
3753 OS
<< " // target predicate, that diagnostic is preferred.\n";
3754 OS
<< " if (!HadMatchOtherThanPredicate &&\n";
3755 OS
<< " (it == MnemonicRange.first || ErrorInfo <= ActualIdx)) {\n";
3756 OS
<< " if (HasRequiredFeatures && (ErrorInfo != ActualIdx || Diag "
3757 "!= Match_InvalidOperand))\n";
3758 OS
<< " RetCode = Diag;\n";
3759 OS
<< " ErrorInfo = ActualIdx;\n";
3761 OS
<< " // Otherwise, just reject this instance of the mnemonic.\n";
3762 OS
<< " OperandsValid = false;\n";
3767 if (ReportMultipleNearMisses
)
3768 OS
<< " if (MultipleInvalidOperands) {\n";
3770 OS
<< " if (!OperandsValid) {\n";
3771 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"Opcode result: multiple \"\n";
3772 OS
<< " \"operand mismatches, ignoring \"\n";
3773 OS
<< " \"this opcode\\n\");\n";
3774 OS
<< " continue;\n";
3777 // Emit check that the required features are available.
3778 OS
<< " if (!HasRequiredFeatures) {\n";
3779 if (!ReportMultipleNearMisses
)
3780 OS
<< " HadMatchOtherThanFeatures = true;\n";
3781 OS
<< " FeatureBitset NewMissingFeatures = RequiredFeatures & "
3782 "~AvailableFeatures;\n";
3783 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"Missing target features:\";\n";
3784 OS
<< " for (unsigned I = 0, E = NewMissingFeatures.size(); I != E; ++I)\n";
3785 OS
<< " if (NewMissingFeatures[I])\n";
3786 OS
<< " dbgs() << ' ' << I;\n";
3787 OS
<< " dbgs() << \"\\n\");\n";
3788 if (ReportMultipleNearMisses
) {
3789 OS
<< " FeaturesNearMiss = NearMissInfo::getMissedFeature(NewMissingFeatures);\n";
3791 OS
<< " if (NewMissingFeatures.count() <=\n"
3792 " MissingFeatures.count())\n";
3793 OS
<< " MissingFeatures = NewMissingFeatures;\n";
3794 OS
<< " continue;\n";
3798 OS
<< " Inst.clear();\n\n";
3799 OS
<< " Inst.setOpcode(it->Opcode);\n";
3800 // Verify the instruction with the target-specific match predicate function.
3801 OS
<< " // We have a potential match but have not rendered the operands.\n"
3802 << " // Check the target predicate to handle any context sensitive\n"
3803 " // constraints.\n"
3804 << " // For example, Ties that are referenced multiple times must be\n"
3805 " // checked here to ensure the input is the same for each match\n"
3806 " // constraints. If we leave it any later the ties will have been\n"
3807 " // canonicalized\n"
3808 << " unsigned MatchResult;\n"
3809 << " if ((MatchResult = checkEarlyTargetMatchPredicate(Inst, "
3810 "Operands)) != Match_Success) {\n"
3811 << " Inst.clear();\n";
3812 OS
<< " DEBUG_WITH_TYPE(\n";
3813 OS
<< " \"asm-matcher\",\n";
3814 OS
<< " dbgs() << \"Early target match predicate failed with diag code \"\n";
3815 OS
<< " << MatchResult << \"\\n\");\n";
3816 if (ReportMultipleNearMisses
) {
3817 OS
<< " EarlyPredicateNearMiss = NearMissInfo::getMissedPredicate(MatchResult);\n";
3819 OS
<< " RetCode = MatchResult;\n"
3820 << " HadMatchOtherThanPredicate = true;\n"
3825 if (ReportMultipleNearMisses
) {
3826 OS
<< " // If we did not successfully match the operands, then we can't convert to\n";
3827 OS
<< " // an MCInst, so bail out on this instruction variant now.\n";
3828 OS
<< " if (OperandNearMiss) {\n";
3829 OS
<< " // If the operand mismatch was the only problem, reprrt it as a near-miss.\n";
3830 OS
<< " if (NearMisses && !FeaturesNearMiss && !EarlyPredicateNearMiss) {\n";
3831 OS
<< " DEBUG_WITH_TYPE(\n";
3832 OS
<< " \"asm-matcher\",\n";
3834 OS
<< " << \"Opcode result: one mismatched operand, adding near-miss\\n\");\n";
3835 OS
<< " NearMisses->push_back(OperandNearMiss);\n";
3836 OS
<< " } else {\n";
3837 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"Opcode result: multiple \"\n";
3838 OS
<< " \"types of mismatch, so not \"\n";
3839 OS
<< " \"reporting near-miss\\n\");\n";
3841 OS
<< " continue;\n";
3845 OS
<< " if (matchingInlineAsm) {\n";
3846 OS
<< " convertToMapAndConstraints(it->ConvertFn, Operands);\n";
3847 if (!ReportMultipleNearMisses
) {
3848 OS
<< " if (!checkAsmTiedOperandConstraints(*this, it->ConvertFn, "
3849 "Operands, ErrorInfo))\n";
3850 OS
<< " return Match_InvalidTiedOperand;\n";
3853 OS
<< " return Match_Success;\n";
3855 OS
<< " // We have selected a definite instruction, convert the parsed\n"
3856 << " // operands into the appropriate MCInst.\n";
3857 if (HasOptionalOperands
) {
3858 OS
<< " convertToMCInst(it->ConvertFn, Inst, it->Opcode, Operands,\n"
3859 << " OptionalOperandsMask);\n";
3861 OS
<< " convertToMCInst(it->ConvertFn, Inst, it->Opcode, Operands);\n";
3865 // Verify the instruction with the target-specific match predicate function.
3866 OS
<< " // We have a potential match. Check the target predicate to\n"
3867 << " // handle any context sensitive constraints.\n"
3868 << " if ((MatchResult = checkTargetMatchPredicate(Inst)) !="
3869 << " Match_Success) {\n"
3870 << " DEBUG_WITH_TYPE(\"asm-matcher\",\n"
3871 << " dbgs() << \"Target match predicate failed with diag code \"\n"
3872 << " << MatchResult << \"\\n\");\n"
3873 << " Inst.clear();\n";
3874 if (ReportMultipleNearMisses
) {
3875 OS
<< " LatePredicateNearMiss = NearMissInfo::getMissedPredicate(MatchResult);\n";
3877 OS
<< " RetCode = MatchResult;\n"
3878 << " HadMatchOtherThanPredicate = true;\n"
3883 if (ReportMultipleNearMisses
) {
3884 OS
<< " int NumNearMisses = ((int)(bool)OperandNearMiss +\n";
3885 OS
<< " (int)(bool)FeaturesNearMiss +\n";
3886 OS
<< " (int)(bool)EarlyPredicateNearMiss +\n";
3887 OS
<< " (int)(bool)LatePredicateNearMiss);\n";
3888 OS
<< " if (NumNearMisses == 1) {\n";
3889 OS
<< " // We had exactly one type of near-miss, so add that to the list.\n";
3890 OS
<< " assert(!OperandNearMiss && \"OperandNearMiss was handled earlier\");\n";
3891 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"Opcode result: found one type of \"\n";
3892 OS
<< " \"mismatch, so reporting a \"\n";
3893 OS
<< " \"near-miss\\n\");\n";
3894 OS
<< " if (NearMisses && FeaturesNearMiss)\n";
3895 OS
<< " NearMisses->push_back(FeaturesNearMiss);\n";
3896 OS
<< " else if (NearMisses && EarlyPredicateNearMiss)\n";
3897 OS
<< " NearMisses->push_back(EarlyPredicateNearMiss);\n";
3898 OS
<< " else if (NearMisses && LatePredicateNearMiss)\n";
3899 OS
<< " NearMisses->push_back(LatePredicateNearMiss);\n";
3901 OS
<< " continue;\n";
3902 OS
<< " } else if (NumNearMisses > 1) {\n";
3903 OS
<< " // This instruction missed in more than one way, so ignore it.\n";
3904 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"Opcode result: multiple \"\n";
3905 OS
<< " \"types of mismatch, so not \"\n";
3906 OS
<< " \"reporting near-miss\\n\");\n";
3907 OS
<< " continue;\n";
3911 // Call the post-processing function, if used.
3912 StringRef InsnCleanupFn
= AsmParser
->getValueAsString("AsmParserInstCleanup");
3913 if (!InsnCleanupFn
.empty())
3914 OS
<< " " << InsnCleanupFn
<< "(Inst);\n";
3916 if (HasDeprecation
) {
3917 OS
<< " std::string Info;\n";
3918 OS
<< " if (!getParser().getTargetParser().\n";
3919 OS
<< " getTargetOptions().MCNoDeprecatedWarn &&\n";
3920 OS
<< " MII.getDeprecatedInfo(Inst, getSTI(), Info)) {\n";
3921 OS
<< " SMLoc Loc = ((" << Target
.getName()
3922 << "Operand &)*Operands[0]).getStartLoc();\n";
3923 OS
<< " getParser().Warning(Loc, Info, None);\n";
3927 if (!ReportMultipleNearMisses
) {
3928 OS
<< " if (!checkAsmTiedOperandConstraints(*this, it->ConvertFn, "
3929 "Operands, ErrorInfo))\n";
3930 OS
<< " return Match_InvalidTiedOperand;\n";
3934 OS
<< " DEBUG_WITH_TYPE(\n";
3935 OS
<< " \"asm-matcher\",\n";
3936 OS
<< " dbgs() << \"Opcode result: complete match, selecting this opcode\\n\");\n";
3937 OS
<< " return Match_Success;\n";
3940 if (ReportMultipleNearMisses
) {
3941 OS
<< " // No instruction variants matched exactly.\n";
3942 OS
<< " return Match_NearMisses;\n";
3944 OS
<< " // Okay, we had no match. Try to return a useful error code.\n";
3945 OS
<< " if (HadMatchOtherThanPredicate || !HadMatchOtherThanFeatures)\n";
3946 OS
<< " return RetCode;\n\n";
3947 OS
<< " ErrorInfo = 0;\n";
3948 OS
<< " return Match_MissingFeature;\n";
3952 if (!Info
.OperandMatchInfo
.empty())
3953 emitCustomOperandParsing(OS
, Target
, Info
, ClassName
, StringTable
,
3954 MaxMnemonicIndex
, FeatureBitsets
.size(),
3957 OS
<< "#endif // GET_MATCHER_IMPLEMENTATION\n\n";
3959 OS
<< "\n#ifdef GET_MNEMONIC_SPELL_CHECKER\n";
3960 OS
<< "#undef GET_MNEMONIC_SPELL_CHECKER\n\n";
3962 emitMnemonicSpellChecker(OS
, Target
, VariantCount
);
3964 OS
<< "#endif // GET_MNEMONIC_SPELL_CHECKER\n\n";
3966 OS
<< "\n#ifdef GET_MNEMONIC_CHECKER\n";
3967 OS
<< "#undef GET_MNEMONIC_CHECKER\n\n";
3969 emitMnemonicChecker(OS
, Target
, VariantCount
,
3970 HasMnemonicFirst
, HasMnemonicAliases
);
3972 OS
<< "#endif // GET_MNEMONIC_CHECKER\n\n";
3977 void EmitAsmMatcher(RecordKeeper
&RK
, raw_ostream
&OS
) {
3978 emitSourceFileHeader("Assembly Matcher Source Fragment", OS
);
3979 AsmMatcherEmitter(RK
).run(OS
);
3982 } // end namespace llvm