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(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 find_if(Classes
, [](const ClassInfo
&Class
) {
793 return Class
.IsOptional
;
798 } // end anonymous namespace
800 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
801 LLVM_DUMP_METHOD
void MatchableInfo::dump() const {
802 errs() << TheDef
->getName() << " -- " << "flattened:\"" << AsmString
<<"\"\n";
804 errs() << " variant: " << AsmVariantID
<< "\n";
806 for (unsigned i
= 0, e
= AsmOperands
.size(); i
!= e
; ++i
) {
807 const AsmOperand
&Op
= AsmOperands
[i
];
808 errs() << " op[" << i
<< "] = " << Op
.Class
->ClassName
<< " - ";
809 errs() << '\"' << Op
.Token
<< "\"\n";
814 static std::pair
<StringRef
, StringRef
>
815 parseTwoOperandConstraint(StringRef S
, ArrayRef
<SMLoc
> Loc
) {
816 // Split via the '='.
817 std::pair
<StringRef
, StringRef
> Ops
= S
.split('=');
818 if (Ops
.second
== "")
819 PrintFatalError(Loc
, "missing '=' in two-operand alias constraint");
820 // Trim whitespace and the leading '$' on the operand names.
821 size_t start
= Ops
.first
.find_first_of('$');
822 if (start
== std::string::npos
)
823 PrintFatalError(Loc
, "expected '$' prefix on asm operand name");
824 Ops
.first
= Ops
.first
.slice(start
+ 1, std::string::npos
);
825 size_t end
= Ops
.first
.find_last_of(" \t");
826 Ops
.first
= Ops
.first
.slice(0, end
);
827 // Now the second operand.
828 start
= Ops
.second
.find_first_of('$');
829 if (start
== std::string::npos
)
830 PrintFatalError(Loc
, "expected '$' prefix on asm operand name");
831 Ops
.second
= Ops
.second
.slice(start
+ 1, std::string::npos
);
832 end
= Ops
.second
.find_last_of(" \t");
833 Ops
.first
= Ops
.first
.slice(0, end
);
837 void MatchableInfo::formTwoOperandAlias(StringRef Constraint
) {
838 // Figure out which operands are aliased and mark them as tied.
839 std::pair
<StringRef
, StringRef
> Ops
=
840 parseTwoOperandConstraint(Constraint
, TheDef
->getLoc());
842 // Find the AsmOperands that refer to the operands we're aliasing.
843 int SrcAsmOperand
= findAsmOperandNamed(Ops
.first
);
844 int DstAsmOperand
= findAsmOperandNamed(Ops
.second
);
845 if (SrcAsmOperand
== -1)
846 PrintFatalError(TheDef
->getLoc(),
847 "unknown source two-operand alias operand '" + Ops
.first
+
849 if (DstAsmOperand
== -1)
850 PrintFatalError(TheDef
->getLoc(),
851 "unknown destination two-operand alias operand '" +
854 // Find the ResOperand that refers to the operand we're aliasing away
855 // and update it to refer to the combined operand instead.
856 for (ResOperand
&Op
: ResOperands
) {
857 if (Op
.Kind
== ResOperand::RenderAsmOperand
&&
858 Op
.AsmOperandNum
== (unsigned)SrcAsmOperand
) {
859 Op
.AsmOperandNum
= DstAsmOperand
;
863 // Remove the AsmOperand for the alias operand.
864 AsmOperands
.erase(AsmOperands
.begin() + SrcAsmOperand
);
865 // Adjust the ResOperand references to any AsmOperands that followed
866 // the one we just deleted.
867 for (ResOperand
&Op
: ResOperands
) {
870 // Nothing to do for operands that don't reference AsmOperands.
872 case ResOperand::RenderAsmOperand
:
873 if (Op
.AsmOperandNum
> (unsigned)SrcAsmOperand
)
880 /// extractSingletonRegisterForAsmOperand - Extract singleton register,
881 /// if present, from specified token.
883 extractSingletonRegisterForAsmOperand(MatchableInfo::AsmOperand
&Op
,
884 const AsmMatcherInfo
&Info
,
885 StringRef RegisterPrefix
) {
886 StringRef Tok
= Op
.Token
;
888 // If this token is not an isolated token, i.e., it isn't separated from
889 // other tokens (e.g. with whitespace), don't interpret it as a register name.
890 if (!Op
.IsIsolatedToken
)
893 if (RegisterPrefix
.empty()) {
894 std::string LoweredTok
= Tok
.lower();
895 if (const CodeGenRegister
*Reg
= Info
.Target
.getRegisterByName(LoweredTok
))
896 Op
.SingletonReg
= Reg
->TheDef
;
900 if (!Tok
.startswith(RegisterPrefix
))
903 StringRef RegName
= Tok
.substr(RegisterPrefix
.size());
904 if (const CodeGenRegister
*Reg
= Info
.Target
.getRegisterByName(RegName
))
905 Op
.SingletonReg
= Reg
->TheDef
;
907 // If there is no register prefix (i.e. "%" in "%eax"), then this may
908 // be some random non-register token, just ignore it.
911 void MatchableInfo::initialize(const AsmMatcherInfo
&Info
,
912 SmallPtrSetImpl
<Record
*> &SingletonRegisters
,
913 AsmVariantInfo
const &Variant
,
914 bool HasMnemonicFirst
) {
915 AsmVariantID
= Variant
.AsmVariantNo
;
917 CodeGenInstruction::FlattenAsmStringVariants(AsmString
,
918 Variant
.AsmVariantNo
);
920 tokenizeAsmString(Info
, Variant
);
922 // The first token of the instruction is the mnemonic, which must be a
923 // simple string, not a $foo variable or a singleton register.
924 if (AsmOperands
.empty())
925 PrintFatalError(TheDef
->getLoc(),
926 "Instruction '" + TheDef
->getName() + "' has no tokens");
928 assert(!AsmOperands
[0].Token
.empty());
929 if (HasMnemonicFirst
) {
930 Mnemonic
= AsmOperands
[0].Token
;
931 if (Mnemonic
[0] == '$')
932 PrintFatalError(TheDef
->getLoc(),
933 "Invalid instruction mnemonic '" + Mnemonic
+ "'!");
935 // Remove the first operand, it is tracked in the mnemonic field.
936 AsmOperands
.erase(AsmOperands
.begin());
937 } else if (AsmOperands
[0].Token
[0] != '$')
938 Mnemonic
= AsmOperands
[0].Token
;
940 // Compute the require features.
941 for (Record
*Predicate
: TheDef
->getValueAsListOfDefs("Predicates"))
942 if (const SubtargetFeatureInfo
*Feature
=
943 Info
.getSubtargetFeature(Predicate
))
944 RequiredFeatures
.push_back(Feature
);
946 // Collect singleton registers, if used.
947 for (MatchableInfo::AsmOperand
&Op
: AsmOperands
) {
948 extractSingletonRegisterForAsmOperand(Op
, Info
, Variant
.RegisterPrefix
);
949 if (Record
*Reg
= Op
.SingletonReg
)
950 SingletonRegisters
.insert(Reg
);
953 const RecordVal
*DepMask
= TheDef
->getValue("DeprecatedFeatureMask");
955 DepMask
= TheDef
->getValue("ComplexDeprecationPredicate");
958 DepMask
? !DepMask
->getValue()->getAsUnquotedString().empty() : false;
961 /// Append an AsmOperand for the given substring of AsmString.
962 void MatchableInfo::addAsmOperand(StringRef Token
, bool IsIsolatedToken
) {
963 AsmOperands
.push_back(AsmOperand(IsIsolatedToken
, Token
));
966 /// tokenizeAsmString - Tokenize a simplified assembly string.
967 void MatchableInfo::tokenizeAsmString(const AsmMatcherInfo
&Info
,
968 AsmVariantInfo
const &Variant
) {
969 StringRef String
= AsmString
;
972 bool IsIsolatedToken
= true;
973 for (size_t i
= 0, e
= String
.size(); i
!= e
; ++i
) {
974 char Char
= String
[i
];
975 if (Variant
.BreakCharacters
.find(Char
) != std::string::npos
) {
977 addAsmOperand(String
.slice(Prev
, i
), false);
979 IsIsolatedToken
= false;
984 if (Variant
.TokenizingCharacters
.find(Char
) != std::string::npos
) {
986 addAsmOperand(String
.slice(Prev
, i
), IsIsolatedToken
);
988 IsIsolatedToken
= false;
990 addAsmOperand(String
.slice(i
, i
+ 1), IsIsolatedToken
);
992 IsIsolatedToken
= true;
995 if (Variant
.SeparatorCharacters
.find(Char
) != std::string::npos
) {
997 addAsmOperand(String
.slice(Prev
, i
), IsIsolatedToken
);
1001 IsIsolatedToken
= true;
1008 addAsmOperand(String
.slice(Prev
, i
), false);
1010 IsIsolatedToken
= false;
1013 assert(i
!= String
.size() && "Invalid quoted character");
1014 addAsmOperand(String
.slice(i
, i
+ 1), IsIsolatedToken
);
1016 IsIsolatedToken
= false;
1021 addAsmOperand(String
.slice(Prev
, i
), false);
1023 IsIsolatedToken
= false;
1026 // If this isn't "${", start new identifier looking like "$xxx"
1027 if (i
+ 1 == String
.size() || String
[i
+ 1] != '{') {
1032 size_t EndPos
= String
.find('}', i
);
1033 assert(EndPos
!= StringRef::npos
&&
1034 "Missing brace in operand reference!");
1035 addAsmOperand(String
.slice(i
, EndPos
+1), IsIsolatedToken
);
1038 IsIsolatedToken
= false;
1047 if (InTok
&& Prev
!= String
.size())
1048 addAsmOperand(String
.substr(Prev
), IsIsolatedToken
);
1051 bool MatchableInfo::validate(StringRef CommentDelimiter
, bool IsAlias
) const {
1052 // Reject matchables with no .s string.
1053 if (AsmString
.empty())
1054 PrintFatalError(TheDef
->getLoc(), "instruction with empty asm string");
1056 // Reject any matchables with a newline in them, they should be marked
1057 // isCodeGenOnly if they are pseudo instructions.
1058 if (AsmString
.find('\n') != std::string::npos
)
1059 PrintFatalError(TheDef
->getLoc(),
1060 "multiline instruction is not valid for the asmparser, "
1061 "mark it isCodeGenOnly");
1063 // Remove comments from the asm string. We know that the asmstring only
1065 if (!CommentDelimiter
.empty() &&
1066 StringRef(AsmString
).find(CommentDelimiter
) != StringRef::npos
)
1067 PrintFatalError(TheDef
->getLoc(),
1068 "asmstring for instruction has comment character in it, "
1069 "mark it isCodeGenOnly");
1071 // Reject matchables with operand modifiers, these aren't something we can
1072 // handle, the target should be refactored to use operands instead of
1075 // Also, check for instructions which reference the operand multiple times;
1076 // this implies a constraint we 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
&& Tok
[0] == '$' && !OperandNames
.insert(Tok
).second
) {
1088 errs() << "warning: '" << TheDef
->getName() << "': "
1089 << "ignoring instruction with tied operand '"
1099 static std::string
getEnumNameForToken(StringRef Str
) {
1102 for (StringRef::iterator it
= Str
.begin(), ie
= Str
.end(); it
!= ie
; ++it
) {
1104 case '*': Res
+= "_STAR_"; break;
1105 case '%': Res
+= "_PCT_"; break;
1106 case ':': Res
+= "_COLON_"; break;
1107 case '!': Res
+= "_EXCLAIM_"; break;
1108 case '.': Res
+= "_DOT_"; break;
1109 case '<': Res
+= "_LT_"; break;
1110 case '>': Res
+= "_GT_"; break;
1111 case '-': Res
+= "_MINUS_"; break;
1113 if ((*it
>= 'A' && *it
<= 'Z') ||
1114 (*it
>= 'a' && *it
<= 'z') ||
1115 (*it
>= '0' && *it
<= '9'))
1118 Res
+= "_" + utostr((unsigned) *it
) + "_";
1125 ClassInfo
*AsmMatcherInfo::getTokenClass(StringRef Token
) {
1126 ClassInfo
*&Entry
= TokenClasses
[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
= 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
= SI
->getValue();
1312 Init
*DiagnosticString
= Def
->getValueInit("DiagnosticString");
1313 if (StringInit
*SI
= dyn_cast
<StringInit
>(DiagnosticString
))
1314 CI
->DiagnosticString
= 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 (std::map
<Record
*, RegisterSet
>::iterator it
= RegisterMap
.begin(),
1326 ie
= RegisterMap
.end(); it
!= ie
; ++it
)
1327 RegisterClasses
[it
->first
] = RegisterSetClasses
[it
->second
];
1329 // Name the register classes which correspond to singleton registers.
1330 for (Record
*Rec
: SingletonRegisters
) {
1331 ClassInfo
*CI
= RegisterClasses
[Rec
];
1332 assert(CI
&& "Missing singleton register class info!");
1334 if (CI
->ValueName
.empty()) {
1335 CI
->ClassName
= Rec
->getName();
1336 CI
->Name
= "MCK_" + Rec
->getName().str();
1337 CI
->ValueName
= Rec
->getName();
1339 CI
->ValueName
= CI
->ValueName
+ "," + Rec
->getName().str();
1343 void AsmMatcherInfo::buildOperandClasses() {
1344 std::vector
<Record
*> AsmOperands
=
1345 Records
.getAllDerivedDefinitions("AsmOperandClass");
1347 // Pre-populate AsmOperandClasses map.
1348 for (Record
*Rec
: AsmOperands
) {
1349 Classes
.emplace_front();
1350 AsmOperandClasses
[Rec
] = &Classes
.front();
1354 for (Record
*Rec
: AsmOperands
) {
1355 ClassInfo
*CI
= AsmOperandClasses
[Rec
];
1356 CI
->Kind
= ClassInfo::UserClass0
+ Index
;
1358 ListInit
*Supers
= Rec
->getValueAsListInit("SuperClasses");
1359 for (Init
*I
: Supers
->getValues()) {
1360 DefInit
*DI
= dyn_cast
<DefInit
>(I
);
1362 PrintError(Rec
->getLoc(), "Invalid super class reference!");
1366 ClassInfo
*SC
= AsmOperandClasses
[DI
->getDef()];
1368 PrintError(Rec
->getLoc(), "Invalid super class reference!");
1370 CI
->SuperClasses
.push_back(SC
);
1372 CI
->ClassName
= Rec
->getValueAsString("Name");
1373 CI
->Name
= "MCK_" + CI
->ClassName
;
1374 CI
->ValueName
= Rec
->getName();
1376 // Get or construct the predicate method name.
1377 Init
*PMName
= Rec
->getValueInit("PredicateMethod");
1378 if (StringInit
*SI
= dyn_cast
<StringInit
>(PMName
)) {
1379 CI
->PredicateMethod
= SI
->getValue();
1381 assert(isa
<UnsetInit
>(PMName
) && "Unexpected PredicateMethod field!");
1382 CI
->PredicateMethod
= "is" + CI
->ClassName
;
1385 // Get or construct the render method name.
1386 Init
*RMName
= Rec
->getValueInit("RenderMethod");
1387 if (StringInit
*SI
= dyn_cast
<StringInit
>(RMName
)) {
1388 CI
->RenderMethod
= SI
->getValue();
1390 assert(isa
<UnsetInit
>(RMName
) && "Unexpected RenderMethod field!");
1391 CI
->RenderMethod
= "add" + CI
->ClassName
+ "Operands";
1394 // Get the parse method name or leave it as empty.
1395 Init
*PRMName
= Rec
->getValueInit("ParserMethod");
1396 if (StringInit
*SI
= dyn_cast
<StringInit
>(PRMName
))
1397 CI
->ParserMethod
= SI
->getValue();
1399 // Get the diagnostic type and string or leave them as empty.
1400 Init
*DiagnosticType
= Rec
->getValueInit("DiagnosticType");
1401 if (StringInit
*SI
= dyn_cast
<StringInit
>(DiagnosticType
))
1402 CI
->DiagnosticType
= SI
->getValue();
1403 Init
*DiagnosticString
= Rec
->getValueInit("DiagnosticString");
1404 if (StringInit
*SI
= dyn_cast
<StringInit
>(DiagnosticString
))
1405 CI
->DiagnosticString
= SI
->getValue();
1406 // If we have a DiagnosticString, we need a DiagnosticType for use within
1408 if (!CI
->DiagnosticString
.empty() && CI
->DiagnosticType
.empty())
1409 CI
->DiagnosticType
= CI
->ClassName
;
1411 Init
*IsOptional
= Rec
->getValueInit("IsOptional");
1412 if (BitInit
*BI
= dyn_cast
<BitInit
>(IsOptional
))
1413 CI
->IsOptional
= BI
->getValue();
1415 // Get or construct the default method name.
1416 Init
*DMName
= Rec
->getValueInit("DefaultMethod");
1417 if (StringInit
*SI
= dyn_cast
<StringInit
>(DMName
)) {
1418 CI
->DefaultMethod
= SI
->getValue();
1420 assert(isa
<UnsetInit
>(DMName
) && "Unexpected DefaultMethod field!");
1421 CI
->DefaultMethod
= "default" + CI
->ClassName
+ "Operands";
1428 AsmMatcherInfo::AsmMatcherInfo(Record
*asmParser
,
1429 CodeGenTarget
&target
,
1430 RecordKeeper
&records
)
1431 : Records(records
), AsmParser(asmParser
), Target(target
) {
1434 /// buildOperandMatchInfo - Build the necessary information to handle user
1435 /// defined operand parsing methods.
1436 void AsmMatcherInfo::buildOperandMatchInfo() {
1438 /// Map containing a mask with all operands indices that can be found for
1439 /// that class inside a instruction.
1440 typedef std::map
<ClassInfo
*, unsigned, less_ptr
<ClassInfo
>> OpClassMaskTy
;
1441 OpClassMaskTy OpClassMask
;
1443 for (const auto &MI
: Matchables
) {
1444 OpClassMask
.clear();
1446 // Keep track of all operands of this instructions which belong to the
1448 for (unsigned i
= 0, e
= MI
->AsmOperands
.size(); i
!= e
; ++i
) {
1449 const MatchableInfo::AsmOperand
&Op
= MI
->AsmOperands
[i
];
1450 if (Op
.Class
->ParserMethod
.empty())
1452 unsigned &OperandMask
= OpClassMask
[Op
.Class
];
1453 OperandMask
|= (1 << i
);
1456 // Generate operand match info for each mnemonic/operand class pair.
1457 for (const auto &OCM
: OpClassMask
) {
1458 unsigned OpMask
= OCM
.second
;
1459 ClassInfo
*CI
= OCM
.first
;
1460 OperandMatchInfo
.push_back(OperandMatchEntry::create(MI
.get(), CI
,
1466 void AsmMatcherInfo::buildInfo() {
1467 // Build information about all of the AssemblerPredicates.
1468 const std::vector
<std::pair
<Record
*, SubtargetFeatureInfo
>>
1469 &SubtargetFeaturePairs
= SubtargetFeatureInfo::getAll(Records
);
1470 SubtargetFeatures
.insert(SubtargetFeaturePairs
.begin(),
1471 SubtargetFeaturePairs
.end());
1473 for (const auto &Pair
: SubtargetFeatures
)
1474 LLVM_DEBUG(Pair
.second
.dump());
1476 assert(SubtargetFeatures
.size() <= 64 && "Too many subtarget features!");
1478 bool HasMnemonicFirst
= AsmParser
->getValueAsBit("HasMnemonicFirst");
1479 bool ReportMultipleNearMisses
=
1480 AsmParser
->getValueAsBit("ReportMultipleNearMisses");
1482 // Parse the instructions; we need to do this first so that we can gather the
1483 // singleton register classes.
1484 SmallPtrSet
<Record
*, 16> SingletonRegisters
;
1485 unsigned VariantCount
= Target
.getAsmParserVariantCount();
1486 for (unsigned VC
= 0; VC
!= VariantCount
; ++VC
) {
1487 Record
*AsmVariant
= Target
.getAsmParserVariant(VC
);
1488 StringRef CommentDelimiter
=
1489 AsmVariant
->getValueAsString("CommentDelimiter");
1490 AsmVariantInfo Variant
;
1491 Variant
.RegisterPrefix
= AsmVariant
->getValueAsString("RegisterPrefix");
1492 Variant
.TokenizingCharacters
=
1493 AsmVariant
->getValueAsString("TokenizingCharacters");
1494 Variant
.SeparatorCharacters
=
1495 AsmVariant
->getValueAsString("SeparatorCharacters");
1496 Variant
.BreakCharacters
=
1497 AsmVariant
->getValueAsString("BreakCharacters");
1498 Variant
.Name
= AsmVariant
->getValueAsString("Name");
1499 Variant
.AsmVariantNo
= AsmVariant
->getValueAsInt("Variant");
1501 for (const CodeGenInstruction
*CGI
: Target
.getInstructionsByEnumValue()) {
1503 // If the tblgen -match-prefix option is specified (for tblgen hackers),
1504 // filter the set of instructions we consider.
1505 if (!StringRef(CGI
->TheDef
->getName()).startswith(MatchPrefix
))
1508 // Ignore "codegen only" instructions.
1509 if (CGI
->TheDef
->getValueAsBit("isCodeGenOnly"))
1512 // Ignore instructions for different instructions
1513 StringRef V
= CGI
->TheDef
->getValueAsString("AsmVariantName");
1514 if (!V
.empty() && V
!= Variant
.Name
)
1517 auto II
= llvm::make_unique
<MatchableInfo
>(*CGI
);
1519 II
->initialize(*this, SingletonRegisters
, Variant
, HasMnemonicFirst
);
1521 // Ignore instructions which shouldn't be matched and diagnose invalid
1522 // instruction definitions with an error.
1523 if (!II
->validate(CommentDelimiter
, false))
1526 Matchables
.push_back(std::move(II
));
1529 // Parse all of the InstAlias definitions and stick them in the list of
1531 std::vector
<Record
*> AllInstAliases
=
1532 Records
.getAllDerivedDefinitions("InstAlias");
1533 for (unsigned i
= 0, e
= AllInstAliases
.size(); i
!= e
; ++i
) {
1534 auto Alias
= llvm::make_unique
<CodeGenInstAlias
>(AllInstAliases
[i
],
1537 // If the tblgen -match-prefix option is specified (for tblgen hackers),
1538 // filter the set of instruction aliases we consider, based on the target
1540 if (!StringRef(Alias
->ResultInst
->TheDef
->getName())
1541 .startswith( MatchPrefix
))
1544 StringRef V
= Alias
->TheDef
->getValueAsString("AsmVariantName");
1545 if (!V
.empty() && V
!= Variant
.Name
)
1548 auto II
= llvm::make_unique
<MatchableInfo
>(std::move(Alias
));
1550 II
->initialize(*this, SingletonRegisters
, Variant
, HasMnemonicFirst
);
1552 // Validate the alias definitions.
1553 II
->validate(CommentDelimiter
, true);
1555 Matchables
.push_back(std::move(II
));
1559 // Build info for the register classes.
1560 buildRegisterClasses(SingletonRegisters
);
1562 // Build info for the user defined assembly operand classes.
1563 buildOperandClasses();
1565 // Build the information about matchables, now that we have fully formed
1567 std::vector
<std::unique_ptr
<MatchableInfo
>> NewMatchables
;
1568 for (auto &II
: Matchables
) {
1569 // Parse the tokens after the mnemonic.
1570 // Note: buildInstructionOperandReference may insert new AsmOperands, so
1571 // don't precompute the loop bound.
1572 for (unsigned i
= 0; i
!= II
->AsmOperands
.size(); ++i
) {
1573 MatchableInfo::AsmOperand
&Op
= II
->AsmOperands
[i
];
1574 StringRef Token
= Op
.Token
;
1576 // Check for singleton registers.
1577 if (Record
*RegRecord
= Op
.SingletonReg
) {
1578 Op
.Class
= RegisterClasses
[RegRecord
];
1579 assert(Op
.Class
&& Op
.Class
->Registers
.size() == 1 &&
1580 "Unexpected class for singleton register");
1584 // Check for simple tokens.
1585 if (Token
[0] != '$') {
1586 Op
.Class
= getTokenClass(Token
);
1590 if (Token
.size() > 1 && isdigit(Token
[1])) {
1591 Op
.Class
= getTokenClass(Token
);
1595 // Otherwise this is an operand reference.
1596 StringRef OperandName
;
1597 if (Token
[1] == '{')
1598 OperandName
= Token
.substr(2, Token
.size() - 3);
1600 OperandName
= Token
.substr(1);
1602 if (II
->DefRec
.is
<const CodeGenInstruction
*>())
1603 buildInstructionOperandReference(II
.get(), OperandName
, i
);
1605 buildAliasOperandReference(II
.get(), OperandName
, Op
);
1608 if (II
->DefRec
.is
<const CodeGenInstruction
*>()) {
1609 II
->buildInstructionResultOperands();
1610 // If the instruction has a two-operand alias, build up the
1611 // matchable here. We'll add them in bulk at the end to avoid
1612 // confusing this loop.
1613 StringRef Constraint
=
1614 II
->TheDef
->getValueAsString("TwoOperandAliasConstraint");
1615 if (Constraint
!= "") {
1616 // Start by making a copy of the original matchable.
1617 auto AliasII
= llvm::make_unique
<MatchableInfo
>(*II
);
1619 // Adjust it to be a two-operand alias.
1620 AliasII
->formTwoOperandAlias(Constraint
);
1622 // Add the alias to the matchables list.
1623 NewMatchables
.push_back(std::move(AliasII
));
1626 // FIXME: The tied operands checking is not yet integrated with the
1627 // framework for reporting multiple near misses. To prevent invalid
1628 // formats from being matched with an alias if a tied-operands check
1629 // would otherwise have disallowed it, we just disallow such constructs
1630 // in TableGen completely.
1631 II
->buildAliasResultOperands(!ReportMultipleNearMisses
);
1633 if (!NewMatchables
.empty())
1634 Matchables
.insert(Matchables
.end(),
1635 std::make_move_iterator(NewMatchables
.begin()),
1636 std::make_move_iterator(NewMatchables
.end()));
1638 // Process token alias definitions and set up the associated superclass
1640 std::vector
<Record
*> AllTokenAliases
=
1641 Records
.getAllDerivedDefinitions("TokenAlias");
1642 for (Record
*Rec
: AllTokenAliases
) {
1643 ClassInfo
*FromClass
= getTokenClass(Rec
->getValueAsString("FromToken"));
1644 ClassInfo
*ToClass
= getTokenClass(Rec
->getValueAsString("ToToken"));
1645 if (FromClass
== ToClass
)
1646 PrintFatalError(Rec
->getLoc(),
1647 "error: Destination value identical to source value.");
1648 FromClass
->SuperClasses
.push_back(ToClass
);
1651 // Reorder classes so that classes precede super classes.
1654 #ifdef EXPENSIVE_CHECKS
1655 // Verify that the table is sorted and operator < works transitively.
1656 for (auto I
= Classes
.begin(), E
= Classes
.end(); I
!= E
; ++I
) {
1657 for (auto J
= I
; J
!= E
; ++J
) {
1659 assert(I
== J
|| !J
->isSubsetOf(*I
));
1665 /// buildInstructionOperandReference - The specified operand is a reference to a
1666 /// named operand such as $src. Resolve the Class and OperandInfo pointers.
1667 void AsmMatcherInfo::
1668 buildInstructionOperandReference(MatchableInfo
*II
,
1669 StringRef OperandName
,
1670 unsigned AsmOpIdx
) {
1671 const CodeGenInstruction
&CGI
= *II
->DefRec
.get
<const CodeGenInstruction
*>();
1672 const CGIOperandList
&Operands
= CGI
.Operands
;
1673 MatchableInfo::AsmOperand
*Op
= &II
->AsmOperands
[AsmOpIdx
];
1675 // Map this token to an operand.
1677 if (!Operands
.hasOperandNamed(OperandName
, Idx
))
1678 PrintFatalError(II
->TheDef
->getLoc(),
1679 "error: unable to find operand: '" + OperandName
+ "'");
1681 // If the instruction operand has multiple suboperands, but the parser
1682 // match class for the asm operand is still the default "ImmAsmOperand",
1683 // then handle each suboperand separately.
1684 if (Op
->SubOpIdx
== -1 && Operands
[Idx
].MINumOperands
> 1) {
1685 Record
*Rec
= Operands
[Idx
].Rec
;
1686 assert(Rec
->isSubClassOf("Operand") && "Unexpected operand!");
1687 Record
*MatchClass
= Rec
->getValueAsDef("ParserMatchClass");
1688 if (MatchClass
&& MatchClass
->getValueAsString("Name") == "Imm") {
1689 // Insert remaining suboperands after AsmOpIdx in II->AsmOperands.
1690 StringRef Token
= Op
->Token
; // save this in case Op gets moved
1691 for (unsigned SI
= 1, SE
= Operands
[Idx
].MINumOperands
; SI
!= SE
; ++SI
) {
1692 MatchableInfo::AsmOperand
NewAsmOp(/*IsIsolatedToken=*/true, Token
);
1693 NewAsmOp
.SubOpIdx
= SI
;
1694 II
->AsmOperands
.insert(II
->AsmOperands
.begin()+AsmOpIdx
+SI
, NewAsmOp
);
1696 // Replace Op with first suboperand.
1697 Op
= &II
->AsmOperands
[AsmOpIdx
]; // update the pointer in case it moved
1702 // Set up the operand class.
1703 Op
->Class
= getOperandClass(Operands
[Idx
], Op
->SubOpIdx
);
1704 Op
->OrigSrcOpName
= OperandName
;
1706 // If the named operand is tied, canonicalize it to the untied operand.
1707 // For example, something like:
1708 // (outs GPR:$dst), (ins GPR:$src)
1709 // with an asmstring of
1711 // we want to canonicalize to:
1713 // so that we know how to provide the $dst operand when filling in the result.
1715 if (Operands
[Idx
].MINumOperands
== 1)
1716 OITied
= Operands
[Idx
].getTiedRegister();
1718 // The tied operand index is an MIOperand index, find the operand that
1720 std::pair
<unsigned, unsigned> Idx
= Operands
.getSubOperandNumber(OITied
);
1721 OperandName
= Operands
[Idx
.first
].Name
;
1722 Op
->SubOpIdx
= Idx
.second
;
1725 Op
->SrcOpName
= OperandName
;
1728 /// buildAliasOperandReference - When parsing an operand reference out of the
1729 /// matching string (e.g. "movsx $src, $dst"), determine what the class of the
1730 /// operand reference is by looking it up in the result pattern definition.
1731 void AsmMatcherInfo::buildAliasOperandReference(MatchableInfo
*II
,
1732 StringRef OperandName
,
1733 MatchableInfo::AsmOperand
&Op
) {
1734 const CodeGenInstAlias
&CGA
= *II
->DefRec
.get
<const CodeGenInstAlias
*>();
1736 // Set up the operand class.
1737 for (unsigned i
= 0, e
= CGA
.ResultOperands
.size(); i
!= e
; ++i
)
1738 if (CGA
.ResultOperands
[i
].isRecord() &&
1739 CGA
.ResultOperands
[i
].getName() == OperandName
) {
1740 // It's safe to go with the first one we find, because CodeGenInstAlias
1741 // validates that all operands with the same name have the same record.
1742 Op
.SubOpIdx
= CGA
.ResultInstOperandIndex
[i
].second
;
1743 // Use the match class from the Alias definition, not the
1744 // destination instruction, as we may have an immediate that's
1745 // being munged by the match class.
1746 Op
.Class
= getOperandClass(CGA
.ResultOperands
[i
].getRecord(),
1748 Op
.SrcOpName
= OperandName
;
1749 Op
.OrigSrcOpName
= OperandName
;
1753 PrintFatalError(II
->TheDef
->getLoc(),
1754 "error: unable to find operand: '" + OperandName
+ "'");
1757 void MatchableInfo::buildInstructionResultOperands() {
1758 const CodeGenInstruction
*ResultInst
= getResultInst();
1760 // Loop over all operands of the result instruction, determining how to
1762 for (const CGIOperandList::OperandInfo
&OpInfo
: ResultInst
->Operands
) {
1763 // If this is a tied operand, just copy from the previously handled operand.
1765 if (OpInfo
.MINumOperands
== 1)
1766 TiedOp
= OpInfo
.getTiedRegister();
1768 int TiedSrcOperand
= findAsmOperandOriginallyNamed(OpInfo
.Name
);
1769 if (TiedSrcOperand
!= -1 &&
1770 ResOperands
[TiedOp
].Kind
== ResOperand::RenderAsmOperand
)
1771 ResOperands
.push_back(ResOperand::getTiedOp(
1772 TiedOp
, ResOperands
[TiedOp
].AsmOperandNum
, TiedSrcOperand
));
1774 ResOperands
.push_back(ResOperand::getTiedOp(TiedOp
, 0, 0));
1778 int SrcOperand
= findAsmOperandNamed(OpInfo
.Name
);
1779 if (OpInfo
.Name
.empty() || SrcOperand
== -1) {
1780 // This may happen for operands that are tied to a suboperand of a
1781 // complex operand. Simply use a dummy value here; nobody should
1782 // use this operand slot.
1783 // FIXME: The long term goal is for the MCOperand list to not contain
1784 // tied operands at all.
1785 ResOperands
.push_back(ResOperand::getImmOp(0));
1789 // Check if the one AsmOperand populates the entire operand.
1790 unsigned NumOperands
= OpInfo
.MINumOperands
;
1791 if (AsmOperands
[SrcOperand
].SubOpIdx
== -1) {
1792 ResOperands
.push_back(ResOperand::getRenderedOp(SrcOperand
, NumOperands
));
1796 // Add a separate ResOperand for each suboperand.
1797 for (unsigned AI
= 0; AI
< NumOperands
; ++AI
) {
1798 assert(AsmOperands
[SrcOperand
+AI
].SubOpIdx
== (int)AI
&&
1799 AsmOperands
[SrcOperand
+AI
].SrcOpName
== OpInfo
.Name
&&
1800 "unexpected AsmOperands for suboperands");
1801 ResOperands
.push_back(ResOperand::getRenderedOp(SrcOperand
+ AI
, 1));
1806 void MatchableInfo::buildAliasResultOperands(bool AliasConstraintsAreChecked
) {
1807 const CodeGenInstAlias
&CGA
= *DefRec
.get
<const CodeGenInstAlias
*>();
1808 const CodeGenInstruction
*ResultInst
= getResultInst();
1810 // Map of: $reg -> #lastref
1811 // where $reg is the name of the operand in the asm string
1812 // where #lastref is the last processed index where $reg was referenced in
1814 SmallDenseMap
<StringRef
, int> OperandRefs
;
1816 // Loop over all operands of the result instruction, determining how to
1818 unsigned AliasOpNo
= 0;
1819 unsigned LastOpNo
= CGA
.ResultInstOperandIndex
.size();
1820 for (unsigned i
= 0, e
= ResultInst
->Operands
.size(); i
!= e
; ++i
) {
1821 const CGIOperandList::OperandInfo
*OpInfo
= &ResultInst
->Operands
[i
];
1823 // If this is a tied operand, just copy from the previously handled operand.
1825 if (OpInfo
->MINumOperands
== 1)
1826 TiedOp
= OpInfo
->getTiedRegister();
1828 unsigned SrcOp1
= 0;
1829 unsigned SrcOp2
= 0;
1831 // If an operand has been specified twice in the asm string,
1832 // add the two source operand's indices to the TiedOp so that
1833 // at runtime the 'tied' constraint is checked.
1834 if (ResOperands
[TiedOp
].Kind
== ResOperand::RenderAsmOperand
) {
1835 SrcOp1
= ResOperands
[TiedOp
].AsmOperandNum
;
1837 // Find the next operand (similarly named operand) in the string.
1838 StringRef Name
= AsmOperands
[SrcOp1
].SrcOpName
;
1839 auto Insert
= OperandRefs
.try_emplace(Name
, SrcOp1
);
1840 SrcOp2
= findAsmOperandNamed(Name
, Insert
.first
->second
);
1842 // Not updating the record in OperandRefs will cause TableGen
1843 // to fail with an error at the end of this function.
1844 if (AliasConstraintsAreChecked
)
1845 Insert
.first
->second
= SrcOp2
;
1847 // In case it only has one reference in the asm string,
1848 // it doesn't need to be checked for tied constraints.
1849 SrcOp2
= (SrcOp2
== (unsigned)-1) ? SrcOp1
: SrcOp2
;
1852 // If the alias operand is of a different operand class, we only want
1853 // to benefit from the tied-operands check and just match the operand
1854 // as a normal, but not copy the original (TiedOp) to the result
1855 // instruction. We do this by passing -1 as the tied operand to copy.
1856 if (ResultInst
->Operands
[i
].Rec
->getName() !=
1857 ResultInst
->Operands
[TiedOp
].Rec
->getName()) {
1858 SrcOp1
= ResOperands
[TiedOp
].AsmOperandNum
;
1859 int SubIdx
= CGA
.ResultInstOperandIndex
[AliasOpNo
].second
;
1860 StringRef Name
= CGA
.ResultOperands
[AliasOpNo
].getName();
1861 SrcOp2
= findAsmOperand(Name
, SubIdx
);
1862 ResOperands
.push_back(
1863 ResOperand::getTiedOp((unsigned)-1, SrcOp1
, SrcOp2
));
1865 ResOperands
.push_back(ResOperand::getTiedOp(TiedOp
, SrcOp1
, SrcOp2
));
1870 // Handle all the suboperands for this operand.
1871 const std::string
&OpName
= OpInfo
->Name
;
1872 for ( ; AliasOpNo
< LastOpNo
&&
1873 CGA
.ResultInstOperandIndex
[AliasOpNo
].first
== i
; ++AliasOpNo
) {
1874 int SubIdx
= CGA
.ResultInstOperandIndex
[AliasOpNo
].second
;
1876 // Find out what operand from the asmparser that this MCInst operand
1878 switch (CGA
.ResultOperands
[AliasOpNo
].Kind
) {
1879 case CodeGenInstAlias::ResultOperand::K_Record
: {
1880 StringRef Name
= CGA
.ResultOperands
[AliasOpNo
].getName();
1881 int SrcOperand
= findAsmOperand(Name
, SubIdx
);
1882 if (SrcOperand
== -1)
1883 PrintFatalError(TheDef
->getLoc(), "Instruction '" +
1884 TheDef
->getName() + "' has operand '" + OpName
+
1885 "' that doesn't appear in asm string!");
1887 // Add it to the operand references. If it is added a second time, the
1888 // record won't be updated and it will fail later on.
1889 OperandRefs
.try_emplace(Name
, SrcOperand
);
1891 unsigned NumOperands
= (SubIdx
== -1 ? OpInfo
->MINumOperands
: 1);
1892 ResOperands
.push_back(ResOperand::getRenderedOp(SrcOperand
,
1896 case CodeGenInstAlias::ResultOperand::K_Imm
: {
1897 int64_t ImmVal
= CGA
.ResultOperands
[AliasOpNo
].getImm();
1898 ResOperands
.push_back(ResOperand::getImmOp(ImmVal
));
1901 case CodeGenInstAlias::ResultOperand::K_Reg
: {
1902 Record
*Reg
= CGA
.ResultOperands
[AliasOpNo
].getRegister();
1903 ResOperands
.push_back(ResOperand::getRegOp(Reg
));
1910 // Check that operands are not repeated more times than is supported.
1911 for (auto &T
: OperandRefs
) {
1912 if (T
.second
!= -1 && findAsmOperandNamed(T
.first
, T
.second
) != -1)
1913 PrintFatalError(TheDef
->getLoc(),
1914 "Operand '" + T
.first
+ "' can never be matched");
1919 getConverterOperandID(const std::string
&Name
,
1920 SmallSetVector
<CachedHashString
, 16> &Table
,
1922 IsNew
= Table
.insert(CachedHashString(Name
));
1924 unsigned ID
= IsNew
? Table
.size() - 1 : find(Table
, Name
) - Table
.begin();
1926 assert(ID
< Table
.size());
1931 static void emitConvertFuncs(CodeGenTarget
&Target
, StringRef ClassName
,
1932 std::vector
<std::unique_ptr
<MatchableInfo
>> &Infos
,
1933 bool HasMnemonicFirst
, bool HasOptionalOperands
,
1935 SmallSetVector
<CachedHashString
, 16> OperandConversionKinds
;
1936 SmallSetVector
<CachedHashString
, 16> InstructionConversionKinds
;
1937 std::vector
<std::vector
<uint8_t> > ConversionTable
;
1938 size_t MaxRowLength
= 2; // minimum is custom converter plus terminator.
1940 // TargetOperandClass - This is the target's operand class, like X86Operand.
1941 std::string TargetOperandClass
= Target
.getName().str() + "Operand";
1943 // Write the convert function to a separate stream, so we can drop it after
1944 // the enum. We'll build up the conversion handlers for the individual
1945 // operand types opportunistically as we encounter them.
1946 std::string ConvertFnBody
;
1947 raw_string_ostream
CvtOS(ConvertFnBody
);
1948 // Start the unified conversion function.
1949 if (HasOptionalOperands
) {
1950 CvtOS
<< "void " << Target
.getName() << ClassName
<< "::\n"
1951 << "convertToMCInst(unsigned Kind, MCInst &Inst, "
1952 << "unsigned Opcode,\n"
1953 << " const OperandVector &Operands,\n"
1954 << " const SmallBitVector &OptionalOperandsMask) {\n";
1956 CvtOS
<< "void " << Target
.getName() << ClassName
<< "::\n"
1957 << "convertToMCInst(unsigned Kind, MCInst &Inst, "
1958 << "unsigned Opcode,\n"
1959 << " const OperandVector &Operands) {\n";
1961 CvtOS
<< " assert(Kind < CVT_NUM_SIGNATURES && \"Invalid signature!\");\n";
1962 CvtOS
<< " const uint8_t *Converter = ConversionTable[Kind];\n";
1963 if (HasOptionalOperands
) {
1964 size_t MaxNumOperands
= 0;
1965 for (const auto &MI
: Infos
) {
1966 MaxNumOperands
= std::max(MaxNumOperands
, MI
->AsmOperands
.size());
1968 CvtOS
<< " unsigned DefaultsOffset[" << (MaxNumOperands
+ 1)
1970 CvtOS
<< " assert(OptionalOperandsMask.size() == " << (MaxNumOperands
)
1972 CvtOS
<< " for (unsigned i = 0, NumDefaults = 0; i < " << (MaxNumOperands
)
1974 CvtOS
<< " DefaultsOffset[i + 1] = NumDefaults;\n";
1975 CvtOS
<< " NumDefaults += (OptionalOperandsMask[i] ? 1 : 0);\n";
1978 CvtOS
<< " unsigned OpIdx;\n";
1979 CvtOS
<< " Inst.setOpcode(Opcode);\n";
1980 CvtOS
<< " for (const uint8_t *p = Converter; *p; p+= 2) {\n";
1981 if (HasOptionalOperands
) {
1982 CvtOS
<< " OpIdx = *(p + 1) - DefaultsOffset[*(p + 1)];\n";
1984 CvtOS
<< " OpIdx = *(p + 1);\n";
1986 CvtOS
<< " switch (*p) {\n";
1987 CvtOS
<< " default: llvm_unreachable(\"invalid conversion entry!\");\n";
1988 CvtOS
<< " case CVT_Reg:\n";
1989 CvtOS
<< " static_cast<" << TargetOperandClass
1990 << "&>(*Operands[OpIdx]).addRegOperands(Inst, 1);\n";
1991 CvtOS
<< " break;\n";
1992 CvtOS
<< " case CVT_Tied: {\n";
1993 CvtOS
<< " assert(OpIdx < (size_t)(std::end(TiedAsmOperandTable) -\n";
1994 CvtOS
<< " std::begin(TiedAsmOperandTable)) &&\n";
1995 CvtOS
<< " \"Tied operand not found\");\n";
1996 CvtOS
<< " unsigned TiedResOpnd = TiedAsmOperandTable[OpIdx][0];\n";
1997 CvtOS
<< " if (TiedResOpnd != (uint8_t) -1)\n";
1998 CvtOS
<< " Inst.addOperand(Inst.getOperand(TiedResOpnd));\n";
1999 CvtOS
<< " break;\n";
2002 std::string OperandFnBody
;
2003 raw_string_ostream
OpOS(OperandFnBody
);
2004 // Start the operand number lookup function.
2005 OpOS
<< "void " << Target
.getName() << ClassName
<< "::\n"
2006 << "convertToMapAndConstraints(unsigned Kind,\n";
2008 OpOS
<< "const OperandVector &Operands) {\n"
2009 << " assert(Kind < CVT_NUM_SIGNATURES && \"Invalid signature!\");\n"
2010 << " unsigned NumMCOperands = 0;\n"
2011 << " const uint8_t *Converter = ConversionTable[Kind];\n"
2012 << " for (const uint8_t *p = Converter; *p; p+= 2) {\n"
2013 << " switch (*p) {\n"
2014 << " default: llvm_unreachable(\"invalid conversion entry!\");\n"
2015 << " case CVT_Reg:\n"
2016 << " Operands[*(p + 1)]->setMCOperandNum(NumMCOperands);\n"
2017 << " Operands[*(p + 1)]->setConstraint(\"r\");\n"
2018 << " ++NumMCOperands;\n"
2020 << " case CVT_Tied:\n"
2021 << " ++NumMCOperands;\n"
2024 // Pre-populate the operand conversion kinds with the standard always
2025 // available entries.
2026 OperandConversionKinds
.insert(CachedHashString("CVT_Done"));
2027 OperandConversionKinds
.insert(CachedHashString("CVT_Reg"));
2028 OperandConversionKinds
.insert(CachedHashString("CVT_Tied"));
2029 enum { CVT_Done
, CVT_Reg
, CVT_Tied
};
2031 // Map of e.g. <0, 2, 3> -> "Tie_0_2_3" enum label.
2032 std::map
<std::tuple
<uint8_t, uint8_t, uint8_t>, std::string
>
2033 TiedOperandsEnumMap
;
2035 for (auto &II
: Infos
) {
2036 // Check if we have a custom match function.
2037 StringRef AsmMatchConverter
=
2038 II
->getResultInst()->TheDef
->getValueAsString("AsmMatchConverter");
2039 if (!AsmMatchConverter
.empty() && II
->UseInstAsmMatchConverter
) {
2040 std::string Signature
= ("ConvertCustom_" + AsmMatchConverter
).str();
2041 II
->ConversionFnKind
= Signature
;
2043 // Check if we have already generated this signature.
2044 if (!InstructionConversionKinds
.insert(CachedHashString(Signature
)))
2047 // Remember this converter for the kind enum.
2048 unsigned KindID
= OperandConversionKinds
.size();
2049 OperandConversionKinds
.insert(
2050 CachedHashString("CVT_" + getEnumNameForToken(AsmMatchConverter
)));
2052 // Add the converter row for this instruction.
2053 ConversionTable
.emplace_back();
2054 ConversionTable
.back().push_back(KindID
);
2055 ConversionTable
.back().push_back(CVT_Done
);
2057 // Add the handler to the conversion driver function.
2058 CvtOS
<< " case CVT_"
2059 << getEnumNameForToken(AsmMatchConverter
) << ":\n"
2060 << " " << AsmMatchConverter
<< "(Inst, Operands);\n"
2063 // FIXME: Handle the operand number lookup for custom match functions.
2067 // Build the conversion function signature.
2068 std::string Signature
= "Convert";
2070 std::vector
<uint8_t> ConversionRow
;
2072 // Compute the convert enum and the case body.
2073 MaxRowLength
= std::max(MaxRowLength
, II
->ResOperands
.size()*2 + 1 );
2075 for (unsigned i
= 0, e
= II
->ResOperands
.size(); i
!= e
; ++i
) {
2076 const MatchableInfo::ResOperand
&OpInfo
= II
->ResOperands
[i
];
2078 // Generate code to populate each result operand.
2079 switch (OpInfo
.Kind
) {
2080 case MatchableInfo::ResOperand::RenderAsmOperand
: {
2081 // This comes from something we parsed.
2082 const MatchableInfo::AsmOperand
&Op
=
2083 II
->AsmOperands
[OpInfo
.AsmOperandNum
];
2085 // Registers are always converted the same, don't duplicate the
2086 // conversion function based on them.
2089 Class
= Op
.Class
->isRegisterClass() ? "Reg" : Op
.Class
->ClassName
;
2091 Signature
+= utostr(OpInfo
.MINumOperands
);
2092 Signature
+= "_" + itostr(OpInfo
.AsmOperandNum
);
2094 // Add the conversion kind, if necessary, and get the associated ID
2095 // the index of its entry in the vector).
2096 std::string Name
= "CVT_" + (Op
.Class
->isRegisterClass() ? "Reg" :
2097 Op
.Class
->RenderMethod
);
2098 if (Op
.Class
->IsOptional
) {
2099 // For optional operands we must also care about DefaultMethod
2100 assert(HasOptionalOperands
);
2101 Name
+= "_" + Op
.Class
->DefaultMethod
;
2103 Name
= getEnumNameForToken(Name
);
2105 bool IsNewConverter
= false;
2106 unsigned ID
= getConverterOperandID(Name
, OperandConversionKinds
,
2109 // Add the operand entry to the instruction kind conversion row.
2110 ConversionRow
.push_back(ID
);
2111 ConversionRow
.push_back(OpInfo
.AsmOperandNum
+ HasMnemonicFirst
);
2113 if (!IsNewConverter
)
2116 // This is a new operand kind. Add a handler for it to the
2117 // converter driver.
2118 CvtOS
<< " case " << Name
<< ":\n";
2119 if (Op
.Class
->IsOptional
) {
2120 // If optional operand is not present in actual instruction then we
2121 // should call its DefaultMethod before RenderMethod
2122 assert(HasOptionalOperands
);
2123 CvtOS
<< " if (OptionalOperandsMask[*(p + 1) - 1]) {\n"
2124 << " " << Op
.Class
->DefaultMethod
<< "()"
2125 << "->" << Op
.Class
->RenderMethod
<< "(Inst, "
2126 << OpInfo
.MINumOperands
<< ");\n"
2128 << " static_cast<" << TargetOperandClass
2129 << "&>(*Operands[OpIdx])." << Op
.Class
->RenderMethod
2130 << "(Inst, " << OpInfo
.MINumOperands
<< ");\n"
2133 CvtOS
<< " static_cast<" << TargetOperandClass
2134 << "&>(*Operands[OpIdx])." << Op
.Class
->RenderMethod
2135 << "(Inst, " << OpInfo
.MINumOperands
<< ");\n";
2137 CvtOS
<< " break;\n";
2139 // Add a handler for the operand number lookup.
2140 OpOS
<< " case " << Name
<< ":\n"
2141 << " Operands[*(p + 1)]->setMCOperandNum(NumMCOperands);\n";
2143 if (Op
.Class
->isRegisterClass())
2144 OpOS
<< " Operands[*(p + 1)]->setConstraint(\"r\");\n";
2146 OpOS
<< " Operands[*(p + 1)]->setConstraint(\"m\");\n";
2147 OpOS
<< " NumMCOperands += " << OpInfo
.MINumOperands
<< ";\n"
2151 case MatchableInfo::ResOperand::TiedOperand
: {
2152 // If this operand is tied to a previous one, just copy the MCInst
2153 // operand from the earlier one.We can only tie single MCOperand values.
2154 assert(OpInfo
.MINumOperands
== 1 && "Not a singular MCOperand");
2155 uint8_t TiedOp
= OpInfo
.TiedOperands
.ResOpnd
;
2157 OpInfo
.TiedOperands
.SrcOpnd1Idx
+ HasMnemonicFirst
;
2159 OpInfo
.TiedOperands
.SrcOpnd2Idx
+ HasMnemonicFirst
;
2160 assert((i
> TiedOp
|| TiedOp
== (uint8_t)-1) &&
2161 "Tied operand precedes its target!");
2162 auto TiedTupleName
= std::string("Tie") + utostr(TiedOp
) + '_' +
2163 utostr(SrcOp1
) + '_' + utostr(SrcOp2
);
2164 Signature
+= "__" + TiedTupleName
;
2165 ConversionRow
.push_back(CVT_Tied
);
2166 ConversionRow
.push_back(TiedOp
);
2167 ConversionRow
.push_back(SrcOp1
);
2168 ConversionRow
.push_back(SrcOp2
);
2170 // Also create an 'enum' for this combination of tied operands.
2171 auto Key
= std::make_tuple(TiedOp
, SrcOp1
, SrcOp2
);
2172 TiedOperandsEnumMap
.emplace(Key
, TiedTupleName
);
2175 case MatchableInfo::ResOperand::ImmOperand
: {
2176 int64_t Val
= OpInfo
.ImmVal
;
2177 std::string Ty
= "imm_" + itostr(Val
);
2178 Ty
= getEnumNameForToken(Ty
);
2179 Signature
+= "__" + Ty
;
2181 std::string Name
= "CVT_" + Ty
;
2182 bool IsNewConverter
= false;
2183 unsigned ID
= getConverterOperandID(Name
, OperandConversionKinds
,
2185 // Add the operand entry to the instruction kind conversion row.
2186 ConversionRow
.push_back(ID
);
2187 ConversionRow
.push_back(0);
2189 if (!IsNewConverter
)
2192 CvtOS
<< " case " << Name
<< ":\n"
2193 << " Inst.addOperand(MCOperand::createImm(" << Val
<< "));\n"
2196 OpOS
<< " case " << Name
<< ":\n"
2197 << " Operands[*(p + 1)]->setMCOperandNum(NumMCOperands);\n"
2198 << " Operands[*(p + 1)]->setConstraint(\"\");\n"
2199 << " ++NumMCOperands;\n"
2203 case MatchableInfo::ResOperand::RegOperand
: {
2204 std::string Reg
, Name
;
2205 if (!OpInfo
.Register
) {
2209 Reg
= getQualifiedName(OpInfo
.Register
);
2210 Name
= "reg" + OpInfo
.Register
->getName().str();
2212 Signature
+= "__" + Name
;
2213 Name
= "CVT_" + Name
;
2214 bool IsNewConverter
= false;
2215 unsigned ID
= getConverterOperandID(Name
, OperandConversionKinds
,
2217 // Add the operand entry to the instruction kind conversion row.
2218 ConversionRow
.push_back(ID
);
2219 ConversionRow
.push_back(0);
2221 if (!IsNewConverter
)
2223 CvtOS
<< " case " << Name
<< ":\n"
2224 << " Inst.addOperand(MCOperand::createReg(" << Reg
<< "));\n"
2227 OpOS
<< " case " << Name
<< ":\n"
2228 << " Operands[*(p + 1)]->setMCOperandNum(NumMCOperands);\n"
2229 << " Operands[*(p + 1)]->setConstraint(\"m\");\n"
2230 << " ++NumMCOperands;\n"
2236 // If there were no operands, add to the signature to that effect
2237 if (Signature
== "Convert")
2238 Signature
+= "_NoOperands";
2240 II
->ConversionFnKind
= Signature
;
2242 // Save the signature. If we already have it, don't add a new row
2244 if (!InstructionConversionKinds
.insert(CachedHashString(Signature
)))
2247 // Add the row to the table.
2248 ConversionTable
.push_back(std::move(ConversionRow
));
2251 // Finish up the converter driver function.
2252 CvtOS
<< " }\n }\n}\n\n";
2254 // Finish up the operand number lookup function.
2255 OpOS
<< " }\n }\n}\n\n";
2257 // Output a static table for tied operands.
2258 if (TiedOperandsEnumMap
.size()) {
2259 // The number of tied operand combinations will be small in practice,
2260 // but just add the assert to be sure.
2261 assert(TiedOperandsEnumMap
.size() <= 254 &&
2262 "Too many tied-operand combinations to reference with "
2263 "an 8bit offset from the conversion table, where index "
2264 "'255' is reserved as operand not to be copied.");
2267 for (auto &KV
: TiedOperandsEnumMap
) {
2268 OS
<< " " << KV
.second
<< ",\n";
2272 OS
<< "static const uint8_t TiedAsmOperandTable[][3] = {\n";
2273 for (auto &KV
: TiedOperandsEnumMap
) {
2274 OS
<< " /* " << KV
.second
<< " */ { "
2275 << utostr(std::get
<0>(KV
.first
)) << ", "
2276 << utostr(std::get
<1>(KV
.first
)) << ", "
2277 << utostr(std::get
<2>(KV
.first
)) << " },\n";
2281 OS
<< "static const uint8_t TiedAsmOperandTable[][3] = "
2282 "{ /* empty */ {0, 0, 0} };\n\n";
2284 OS
<< "namespace {\n";
2286 // Output the operand conversion kind enum.
2287 OS
<< "enum OperatorConversionKind {\n";
2288 for (const auto &Converter
: OperandConversionKinds
)
2289 OS
<< " " << Converter
<< ",\n";
2290 OS
<< " CVT_NUM_CONVERTERS\n";
2293 // Output the instruction conversion kind enum.
2294 OS
<< "enum InstructionConversionKind {\n";
2295 for (const auto &Signature
: InstructionConversionKinds
)
2296 OS
<< " " << Signature
<< ",\n";
2297 OS
<< " CVT_NUM_SIGNATURES\n";
2300 OS
<< "} // end anonymous namespace\n\n";
2302 // Output the conversion table.
2303 OS
<< "static const uint8_t ConversionTable[CVT_NUM_SIGNATURES]["
2304 << MaxRowLength
<< "] = {\n";
2306 for (unsigned Row
= 0, ERow
= ConversionTable
.size(); Row
!= ERow
; ++Row
) {
2307 assert(ConversionTable
[Row
].size() % 2 == 0 && "bad conversion row!");
2308 OS
<< " // " << InstructionConversionKinds
[Row
] << "\n";
2310 for (unsigned i
= 0, e
= ConversionTable
[Row
].size(); i
!= e
; i
+= 2) {
2311 OS
<< OperandConversionKinds
[ConversionTable
[Row
][i
]] << ", ";
2312 if (OperandConversionKinds
[ConversionTable
[Row
][i
]] !=
2313 CachedHashString("CVT_Tied")) {
2314 OS
<< (unsigned)(ConversionTable
[Row
][i
+ 1]) << ", ";
2318 // For a tied operand, emit a reference to the TiedAsmOperandTable
2319 // that contains the operand to copy, and the parsed operands to
2320 // check for their tied constraints.
2321 auto Key
= std::make_tuple((uint8_t)ConversionTable
[Row
][i
+ 1],
2322 (uint8_t)ConversionTable
[Row
][i
+ 2],
2323 (uint8_t)ConversionTable
[Row
][i
+ 3]);
2324 auto TiedOpndEnum
= TiedOperandsEnumMap
.find(Key
);
2325 assert(TiedOpndEnum
!= TiedOperandsEnumMap
.end() &&
2326 "No record for tied operand pair");
2327 OS
<< TiedOpndEnum
->second
<< ", ";
2330 OS
<< "CVT_Done },\n";
2335 // Spit out the conversion driver function.
2338 // Spit out the operand number lookup function.
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";
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.
2389 Info
.Classes
.begin(), Info
.Classes
.end(),
2390 [](const ClassInfo
&CI
) { 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(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(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
.getEnumName() << ": 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");
2694 unsigned NumFeatures
= 0;
2695 for (unsigned i
= 0, e
= ReqFeatures
.size(); i
!= e
; ++i
) {
2696 const SubtargetFeatureInfo
*F
= Info
.getSubtargetFeature(ReqFeatures
[i
]);
2699 PrintFatalError(R
->getLoc(), "Predicate '" + ReqFeatures
[i
]->getName() +
2700 "' is not marked as an AssemblerPredicate!");
2705 Result
+= F
->getEnumName();
2709 if (NumFeatures
> 1)
2710 Result
= '(' + Result
+ ')';
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")].push_back(R
);
2729 if (AliasesFromMnemonic
.empty())
2732 // Process each alias a "from" mnemonic at a time, building the code executed
2733 // by the string remapper.
2734 std::vector
<StringMatcher::StringPair
> Cases
;
2735 for (const auto &AliasEntry
: AliasesFromMnemonic
) {
2736 const std::vector
<Record
*> &ToVec
= AliasEntry
.second
;
2738 // Loop through each alias and emit code that handles each case. If there
2739 // are two instructions without predicates, emit an error. If there is one,
2741 std::string MatchCode
;
2742 int AliasWithNoPredicate
= -1;
2744 for (unsigned i
= 0, e
= ToVec
.size(); i
!= e
; ++i
) {
2745 Record
*R
= ToVec
[i
];
2746 std::string FeatureMask
= GetAliasRequiredFeatures(R
, Info
);
2748 // If this unconditionally matches, remember it for later and diagnose
2750 if (FeatureMask
.empty()) {
2751 if (AliasWithNoPredicate
!= -1) {
2752 // We can't have two aliases from the same mnemonic with no predicate.
2753 PrintError(ToVec
[AliasWithNoPredicate
]->getLoc(),
2754 "two MnemonicAliases with the same 'from' mnemonic!");
2755 PrintFatalError(R
->getLoc(), "this is the other MnemonicAlias.");
2758 AliasWithNoPredicate
= i
;
2761 if (R
->getValueAsString("ToMnemonic") == AliasEntry
.first
)
2762 PrintFatalError(R
->getLoc(), "MnemonicAlias to the same string");
2764 if (!MatchCode
.empty())
2765 MatchCode
+= "else ";
2766 MatchCode
+= "if ((Features & " + FeatureMask
+ ") == "+FeatureMask
+")\n";
2767 MatchCode
+= " Mnemonic = \"";
2768 MatchCode
+= R
->getValueAsString("ToMnemonic");
2769 MatchCode
+= "\";\n";
2772 if (AliasWithNoPredicate
!= -1) {
2773 Record
*R
= ToVec
[AliasWithNoPredicate
];
2774 if (!MatchCode
.empty())
2775 MatchCode
+= "else\n ";
2776 MatchCode
+= "Mnemonic = \"";
2777 MatchCode
+= R
->getValueAsString("ToMnemonic");
2778 MatchCode
+= "\";\n";
2781 MatchCode
+= "return;";
2783 Cases
.push_back(std::make_pair(AliasEntry
.first
, MatchCode
));
2785 StringMatcher("Mnemonic", Cases
, OS
).Emit(Indent
);
2788 /// emitMnemonicAliases - If the target has any MnemonicAlias<> definitions,
2789 /// emit a function for them and return true, otherwise return false.
2790 static bool emitMnemonicAliases(raw_ostream
&OS
, const AsmMatcherInfo
&Info
,
2791 CodeGenTarget
&Target
) {
2792 // Ignore aliases when match-prefix is set.
2793 if (!MatchPrefix
.empty())
2796 std::vector
<Record
*> Aliases
=
2797 Info
.getRecords().getAllDerivedDefinitions("MnemonicAlias");
2798 if (Aliases
.empty()) return false;
2800 OS
<< "static void applyMnemonicAliases(StringRef &Mnemonic, "
2801 "uint64_t Features, unsigned VariantID) {\n";
2802 OS
<< " switch (VariantID) {\n";
2803 unsigned VariantCount
= Target
.getAsmParserVariantCount();
2804 for (unsigned VC
= 0; VC
!= VariantCount
; ++VC
) {
2805 Record
*AsmVariant
= Target
.getAsmParserVariant(VC
);
2806 int AsmParserVariantNo
= AsmVariant
->getValueAsInt("Variant");
2807 StringRef AsmParserVariantName
= AsmVariant
->getValueAsString("Name");
2808 OS
<< " case " << AsmParserVariantNo
<< ":\n";
2809 emitMnemonicAliasVariant(OS
, Info
, Aliases
, /*Indent=*/2,
2810 AsmParserVariantName
);
2815 // Emit aliases that apply to all variants.
2816 emitMnemonicAliasVariant(OS
, Info
, Aliases
);
2823 static void emitCustomOperandParsing(raw_ostream
&OS
, CodeGenTarget
&Target
,
2824 const AsmMatcherInfo
&Info
, StringRef ClassName
,
2825 StringToOffsetTable
&StringTable
,
2826 unsigned MaxMnemonicIndex
, bool HasMnemonicFirst
) {
2827 unsigned MaxMask
= 0;
2828 for (const OperandMatchEntry
&OMI
: Info
.OperandMatchInfo
) {
2829 MaxMask
|= OMI
.OperandMask
;
2832 // Emit the static custom operand parsing table;
2833 OS
<< "namespace {\n";
2834 OS
<< " struct OperandMatchEntry {\n";
2835 OS
<< " " << getMinimalTypeForEnumBitfield(Info
.SubtargetFeatures
.size())
2836 << " RequiredFeatures;\n";
2837 OS
<< " " << getMinimalTypeForRange(MaxMnemonicIndex
)
2839 OS
<< " " << getMinimalTypeForRange(std::distance(
2840 Info
.Classes
.begin(), Info
.Classes
.end())) << " Class;\n";
2841 OS
<< " " << getMinimalTypeForRange(MaxMask
)
2842 << " OperandMask;\n\n";
2843 OS
<< " StringRef getMnemonic() const {\n";
2844 OS
<< " return StringRef(MnemonicTable + Mnemonic + 1,\n";
2845 OS
<< " MnemonicTable[Mnemonic]);\n";
2849 OS
<< " // Predicate for searching for an opcode.\n";
2850 OS
<< " struct LessOpcodeOperand {\n";
2851 OS
<< " bool operator()(const OperandMatchEntry &LHS, StringRef RHS) {\n";
2852 OS
<< " return LHS.getMnemonic() < RHS;\n";
2854 OS
<< " bool operator()(StringRef LHS, const OperandMatchEntry &RHS) {\n";
2855 OS
<< " return LHS < RHS.getMnemonic();\n";
2857 OS
<< " bool operator()(const OperandMatchEntry &LHS,";
2858 OS
<< " const OperandMatchEntry &RHS) {\n";
2859 OS
<< " return LHS.getMnemonic() < RHS.getMnemonic();\n";
2863 OS
<< "} // end anonymous namespace.\n\n";
2865 OS
<< "static const OperandMatchEntry OperandMatchTable["
2866 << Info
.OperandMatchInfo
.size() << "] = {\n";
2868 OS
<< " /* Operand List Mask, Mnemonic, Operand Class, Features */\n";
2869 for (const OperandMatchEntry
&OMI
: Info
.OperandMatchInfo
) {
2870 const MatchableInfo
&II
= *OMI
.MI
;
2874 // Write the required features mask.
2875 if (!II
.RequiredFeatures
.empty()) {
2876 for (unsigned i
= 0, e
= II
.RequiredFeatures
.size(); i
!= e
; ++i
) {
2878 OS
<< II
.RequiredFeatures
[i
]->getEnumName();
2883 // Store a pascal-style length byte in the mnemonic.
2884 std::string LenMnemonic
= char(II
.Mnemonic
.size()) + II
.Mnemonic
.str();
2885 OS
<< ", " << StringTable
.GetOrAddStringOffset(LenMnemonic
, false)
2886 << " /* " << II
.Mnemonic
<< " */, ";
2890 OS
<< ", " << OMI
.OperandMask
;
2892 bool printComma
= false;
2893 for (int i
= 0, e
= 31; i
!=e
; ++i
)
2894 if (OMI
.OperandMask
& (1 << i
)) {
2906 // Emit the operand class switch to call the correct custom parser for
2907 // the found operand class.
2908 OS
<< "OperandMatchResultTy " << Target
.getName() << ClassName
<< "::\n"
2909 << "tryCustomParseOperand(OperandVector"
2910 << " &Operands,\n unsigned MCK) {\n\n"
2911 << " switch(MCK) {\n";
2913 for (const auto &CI
: Info
.Classes
) {
2914 if (CI
.ParserMethod
.empty())
2916 OS
<< " case " << CI
.Name
<< ":\n"
2917 << " return " << CI
.ParserMethod
<< "(Operands);\n";
2920 OS
<< " default:\n";
2921 OS
<< " return MatchOperand_NoMatch;\n";
2923 OS
<< " return MatchOperand_NoMatch;\n";
2926 // Emit the static custom operand parser. This code is very similar with
2927 // the other matcher. Also use MatchResultTy here just in case we go for
2928 // a better error handling.
2929 OS
<< "OperandMatchResultTy " << Target
.getName() << ClassName
<< "::\n"
2930 << "MatchOperandParserImpl(OperandVector"
2931 << " &Operands,\n StringRef Mnemonic,\n"
2932 << " bool ParseForAllFeatures) {\n";
2934 // Emit code to get the available features.
2935 OS
<< " // Get the current feature set.\n";
2936 OS
<< " uint64_t AvailableFeatures = getAvailableFeatures();\n\n";
2938 OS
<< " // Get the next operand index.\n";
2939 OS
<< " unsigned NextOpNum = Operands.size()"
2940 << (HasMnemonicFirst
? " - 1" : "") << ";\n";
2942 // Emit code to search the table.
2943 OS
<< " // Search the table.\n";
2944 if (HasMnemonicFirst
) {
2945 OS
<< " auto MnemonicRange =\n";
2946 OS
<< " std::equal_range(std::begin(OperandMatchTable), "
2947 "std::end(OperandMatchTable),\n";
2948 OS
<< " Mnemonic, LessOpcodeOperand());\n\n";
2950 OS
<< " auto MnemonicRange = std::make_pair(std::begin(OperandMatchTable),"
2951 " std::end(OperandMatchTable));\n";
2952 OS
<< " if (!Mnemonic.empty())\n";
2953 OS
<< " MnemonicRange =\n";
2954 OS
<< " std::equal_range(std::begin(OperandMatchTable), "
2955 "std::end(OperandMatchTable),\n";
2956 OS
<< " Mnemonic, LessOpcodeOperand());\n\n";
2959 OS
<< " if (MnemonicRange.first == MnemonicRange.second)\n";
2960 OS
<< " return MatchOperand_NoMatch;\n\n";
2962 OS
<< " for (const OperandMatchEntry *it = MnemonicRange.first,\n"
2963 << " *ie = MnemonicRange.second; it != ie; ++it) {\n";
2965 OS
<< " // equal_range guarantees that instruction mnemonic matches.\n";
2966 OS
<< " assert(Mnemonic == it->getMnemonic());\n\n";
2968 // Emit check that the required features are available.
2969 OS
<< " // check if the available features match\n";
2970 OS
<< " if (!ParseForAllFeatures && (AvailableFeatures & "
2971 "it->RequiredFeatures) != it->RequiredFeatures)\n";
2972 OS
<< " continue;\n\n";
2974 // Emit check to ensure the operand number matches.
2975 OS
<< " // check if the operand in question has a custom parser.\n";
2976 OS
<< " if (!(it->OperandMask & (1 << NextOpNum)))\n";
2977 OS
<< " continue;\n\n";
2979 // Emit call to the custom parser method
2980 OS
<< " // call custom parse method to handle the operand\n";
2981 OS
<< " OperandMatchResultTy Result = ";
2982 OS
<< "tryCustomParseOperand(Operands, it->Class);\n";
2983 OS
<< " if (Result != MatchOperand_NoMatch)\n";
2984 OS
<< " return Result;\n";
2987 OS
<< " // Okay, we had no match.\n";
2988 OS
<< " return MatchOperand_NoMatch;\n";
2992 static void emitAsmTiedOperandConstraints(CodeGenTarget
&Target
,
2993 AsmMatcherInfo
&Info
,
2995 std::string AsmParserName
=
2996 Info
.AsmParser
->getValueAsString("AsmParserClassName");
2997 OS
<< "static bool ";
2998 OS
<< "checkAsmTiedOperandConstraints(const " << Target
.getName()
2999 << AsmParserName
<< "&AsmParser,\n";
3000 OS
<< " unsigned Kind,\n";
3001 OS
<< " const OperandVector &Operands,\n";
3002 OS
<< " uint64_t &ErrorInfo) {\n";
3003 OS
<< " assert(Kind < CVT_NUM_SIGNATURES && \"Invalid signature!\");\n";
3004 OS
<< " const uint8_t *Converter = ConversionTable[Kind];\n";
3005 OS
<< " for (const uint8_t *p = Converter; *p; p+= 2) {\n";
3006 OS
<< " switch (*p) {\n";
3007 OS
<< " case CVT_Tied: {\n";
3008 OS
<< " unsigned OpIdx = *(p+1);\n";
3009 OS
<< " assert(OpIdx < (size_t)(std::end(TiedAsmOperandTable) -\n";
3010 OS
<< " std::begin(TiedAsmOperandTable)) &&\n";
3011 OS
<< " \"Tied operand not found\");\n";
3012 OS
<< " unsigned OpndNum1 = TiedAsmOperandTable[OpIdx][1];\n";
3013 OS
<< " unsigned OpndNum2 = TiedAsmOperandTable[OpIdx][2];\n";
3014 OS
<< " if (OpndNum1 != OpndNum2) {\n";
3015 OS
<< " auto &SrcOp1 = Operands[OpndNum1];\n";
3016 OS
<< " auto &SrcOp2 = Operands[OpndNum2];\n";
3017 OS
<< " if (SrcOp1->isReg() && SrcOp2->isReg()) {\n";
3018 OS
<< " if (!AsmParser.regsEqual(*SrcOp1, *SrcOp2)) {\n";
3019 OS
<< " ErrorInfo = OpndNum2;\n";
3020 OS
<< " return false;\n";
3026 OS
<< " default:\n";
3030 OS
<< " return true;\n";
3034 static void emitMnemonicSpellChecker(raw_ostream
&OS
, CodeGenTarget
&Target
,
3035 unsigned VariantCount
) {
3036 OS
<< "static std::string " << Target
.getName()
3037 << "MnemonicSpellCheck(StringRef S, uint64_t FBS, unsigned VariantID) {\n";
3039 OS
<< " return \"\";";
3041 OS
<< " const unsigned MaxEditDist = 2;\n";
3042 OS
<< " std::vector<StringRef> Candidates;\n";
3043 OS
<< " StringRef Prev = \"\";\n\n";
3045 OS
<< " // Find the appropriate table for this asm variant.\n";
3046 OS
<< " const MatchEntry *Start, *End;\n";
3047 OS
<< " switch (VariantID) {\n";
3048 OS
<< " default: llvm_unreachable(\"invalid variant!\");\n";
3049 for (unsigned VC
= 0; VC
!= VariantCount
; ++VC
) {
3050 Record
*AsmVariant
= Target
.getAsmParserVariant(VC
);
3051 int AsmVariantNo
= AsmVariant
->getValueAsInt("Variant");
3052 OS
<< " case " << AsmVariantNo
<< ": Start = std::begin(MatchTable" << VC
3053 << "); End = std::end(MatchTable" << VC
<< "); break;\n";
3056 OS
<< " for (auto I = Start; I < End; I++) {\n";
3057 OS
<< " // Ignore unsupported instructions.\n";
3058 OS
<< " if ((FBS & I->RequiredFeatures) != I->RequiredFeatures)\n";
3059 OS
<< " continue;\n";
3061 OS
<< " StringRef T = I->getMnemonic();\n";
3062 OS
<< " // Avoid recomputing the edit distance for the same string.\n";
3063 OS
<< " if (T.equals(Prev))\n";
3064 OS
<< " continue;\n";
3066 OS
<< " Prev = T;\n";
3067 OS
<< " unsigned Dist = S.edit_distance(T, false, MaxEditDist);\n";
3068 OS
<< " if (Dist <= MaxEditDist)\n";
3069 OS
<< " Candidates.push_back(T);\n";
3072 OS
<< " if (Candidates.empty())\n";
3073 OS
<< " return \"\";\n";
3075 OS
<< " std::string Res = \", did you mean: \";\n";
3076 OS
<< " unsigned i = 0;\n";
3077 OS
<< " for( ; i < Candidates.size() - 1; i++)\n";
3078 OS
<< " Res += Candidates[i].str() + \", \";\n";
3079 OS
<< " return Res + Candidates[i].str() + \"?\";\n";
3086 // Emit a function mapping match classes to strings, for debugging.
3087 static void emitMatchClassKindNames(std::forward_list
<ClassInfo
> &Infos
,
3089 OS
<< "#ifndef NDEBUG\n";
3090 OS
<< "const char *getMatchClassName(MatchClassKind Kind) {\n";
3091 OS
<< " switch (Kind) {\n";
3093 OS
<< " case InvalidMatchClass: return \"InvalidMatchClass\";\n";
3094 OS
<< " case OptionalMatchClass: return \"OptionalMatchClass\";\n";
3095 for (const auto &CI
: Infos
) {
3096 OS
<< " case " << CI
.Name
<< ": return \"" << CI
.Name
<< "\";\n";
3098 OS
<< " case NumMatchClassKinds: return \"NumMatchClassKinds\";\n";
3101 OS
<< " llvm_unreachable(\"unhandled MatchClassKind!\");\n";
3103 OS
<< "#endif // NDEBUG\n";
3106 void AsmMatcherEmitter::run(raw_ostream
&OS
) {
3107 CodeGenTarget
Target(Records
);
3108 Record
*AsmParser
= Target
.getAsmParser();
3109 StringRef ClassName
= AsmParser
->getValueAsString("AsmParserClassName");
3111 // Compute the information on the instructions to match.
3112 AsmMatcherInfo
Info(AsmParser
, Target
, Records
);
3115 // Sort the instruction table using the partial order on classes. We use
3116 // stable_sort to ensure that ambiguous instructions are still
3117 // deterministically ordered.
3118 std::stable_sort(Info
.Matchables
.begin(), Info
.Matchables
.end(),
3119 [](const std::unique_ptr
<MatchableInfo
> &a
,
3120 const std::unique_ptr
<MatchableInfo
> &b
){
3123 #ifdef EXPENSIVE_CHECKS
3124 // Verify that the table is sorted and operator < works transitively.
3125 for (auto I
= Info
.Matchables
.begin(), E
= Info
.Matchables
.end(); I
!= E
;
3127 for (auto J
= I
; J
!= E
; ++J
) {
3128 assert(!(**J
< **I
));
3133 DEBUG_WITH_TYPE("instruction_info", {
3134 for (const auto &MI
: Info
.Matchables
)
3138 // Check for ambiguous matchables.
3139 DEBUG_WITH_TYPE("ambiguous_instrs", {
3140 unsigned NumAmbiguous
= 0;
3141 for (auto I
= Info
.Matchables
.begin(), E
= Info
.Matchables
.end(); I
!= E
;
3143 for (auto J
= std::next(I
); J
!= E
; ++J
) {
3144 const MatchableInfo
&A
= **I
;
3145 const MatchableInfo
&B
= **J
;
3147 if (A
.couldMatchAmbiguouslyWith(B
)) {
3148 errs() << "warning: ambiguous matchables:\n";
3150 errs() << "\nis incomparable with:\n";
3158 errs() << "warning: " << NumAmbiguous
3159 << " ambiguous matchables!\n";
3162 // Compute the information on the custom operand parsing.
3163 Info
.buildOperandMatchInfo();
3165 bool HasMnemonicFirst
= AsmParser
->getValueAsBit("HasMnemonicFirst");
3166 bool HasOptionalOperands
= Info
.hasOptionalOperands();
3167 bool ReportMultipleNearMisses
=
3168 AsmParser
->getValueAsBit("ReportMultipleNearMisses");
3170 // Write the output.
3172 // Information for the class declaration.
3173 OS
<< "\n#ifdef GET_ASSEMBLER_HEADER\n";
3174 OS
<< "#undef GET_ASSEMBLER_HEADER\n";
3175 OS
<< " // This should be included into the middle of the declaration of\n";
3176 OS
<< " // your subclasses implementation of MCTargetAsmParser.\n";
3177 OS
<< " uint64_t ComputeAvailableFeatures(const FeatureBitset& FB) const;\n";
3178 if (HasOptionalOperands
) {
3179 OS
<< " void convertToMCInst(unsigned Kind, MCInst &Inst, "
3180 << "unsigned Opcode,\n"
3181 << " const OperandVector &Operands,\n"
3182 << " const SmallBitVector &OptionalOperandsMask);\n";
3184 OS
<< " void convertToMCInst(unsigned Kind, MCInst &Inst, "
3185 << "unsigned Opcode,\n"
3186 << " const OperandVector &Operands);\n";
3188 OS
<< " void convertToMapAndConstraints(unsigned Kind,\n ";
3189 OS
<< " const OperandVector &Operands) override;\n";
3190 OS
<< " unsigned MatchInstructionImpl(const OperandVector &Operands,\n"
3191 << " MCInst &Inst,\n";
3192 if (ReportMultipleNearMisses
)
3193 OS
<< " SmallVectorImpl<NearMissInfo> *NearMisses,\n";
3195 OS
<< " uint64_t &ErrorInfo,\n";
3196 OS
<< " bool matchingInlineAsm,\n"
3197 << " unsigned VariantID = 0);\n";
3199 if (!Info
.OperandMatchInfo
.empty()) {
3200 OS
<< " OperandMatchResultTy MatchOperandParserImpl(\n";
3201 OS
<< " OperandVector &Operands,\n";
3202 OS
<< " StringRef Mnemonic,\n";
3203 OS
<< " bool ParseForAllFeatures = false);\n";
3205 OS
<< " OperandMatchResultTy tryCustomParseOperand(\n";
3206 OS
<< " OperandVector &Operands,\n";
3207 OS
<< " unsigned MCK);\n\n";
3210 OS
<< "#endif // GET_ASSEMBLER_HEADER_INFO\n\n";
3212 // Emit the operand match diagnostic enum names.
3213 OS
<< "\n#ifdef GET_OPERAND_DIAGNOSTIC_TYPES\n";
3214 OS
<< "#undef GET_OPERAND_DIAGNOSTIC_TYPES\n\n";
3215 emitOperandDiagnosticTypes(Info
, OS
);
3216 OS
<< "#endif // GET_OPERAND_DIAGNOSTIC_TYPES\n\n";
3218 OS
<< "\n#ifdef GET_REGISTER_MATCHER\n";
3219 OS
<< "#undef GET_REGISTER_MATCHER\n\n";
3221 // Emit the subtarget feature enumeration.
3222 SubtargetFeatureInfo::emitSubtargetFeatureFlagEnumeration(
3223 Info
.SubtargetFeatures
, OS
);
3225 // Emit the function to match a register name to number.
3226 // This should be omitted for Mips target
3227 if (AsmParser
->getValueAsBit("ShouldEmitMatchRegisterName"))
3228 emitMatchRegisterName(Target
, AsmParser
, OS
);
3230 if (AsmParser
->getValueAsBit("ShouldEmitMatchRegisterAltName"))
3231 emitMatchRegisterAltName(Target
, AsmParser
, OS
);
3233 OS
<< "#endif // GET_REGISTER_MATCHER\n\n";
3235 OS
<< "\n#ifdef GET_SUBTARGET_FEATURE_NAME\n";
3236 OS
<< "#undef GET_SUBTARGET_FEATURE_NAME\n\n";
3238 // Generate the helper function to get the names for subtarget features.
3239 emitGetSubtargetFeatureName(Info
, OS
);
3241 OS
<< "#endif // GET_SUBTARGET_FEATURE_NAME\n\n";
3243 OS
<< "\n#ifdef GET_MATCHER_IMPLEMENTATION\n";
3244 OS
<< "#undef GET_MATCHER_IMPLEMENTATION\n\n";
3246 // Generate the function that remaps for mnemonic aliases.
3247 bool HasMnemonicAliases
= emitMnemonicAliases(OS
, Info
, Target
);
3249 // Generate the convertToMCInst function to convert operands into an MCInst.
3250 // Also, generate the convertToMapAndConstraints function for MS-style inline
3251 // assembly. The latter doesn't actually generate a MCInst.
3252 emitConvertFuncs(Target
, ClassName
, Info
.Matchables
, HasMnemonicFirst
,
3253 HasOptionalOperands
, OS
);
3255 // Emit the enumeration for classes which participate in matching.
3256 emitMatchClassEnumeration(Target
, Info
.Classes
, OS
);
3258 // Emit a function to get the user-visible string to describe an operand
3259 // match failure in diagnostics.
3260 emitOperandMatchErrorDiagStrings(Info
, OS
);
3262 // Emit a function to map register classes to operand match failure codes.
3263 emitRegisterMatchErrorFunc(Info
, OS
);
3265 // Emit the routine to match token strings to their match class.
3266 emitMatchTokenString(Target
, Info
.Classes
, OS
);
3268 // Emit the subclass predicate routine.
3269 emitIsSubclass(Target
, Info
.Classes
, OS
);
3271 // Emit the routine to validate an operand against a match class.
3272 emitValidateOperandClass(Info
, OS
);
3274 emitMatchClassKindNames(Info
.Classes
, OS
);
3276 // Emit the available features compute function.
3277 SubtargetFeatureInfo::emitComputeAssemblerAvailableFeatures(
3278 Info
.Target
.getName(), ClassName
, "ComputeAvailableFeatures",
3279 Info
.SubtargetFeatures
, OS
);
3281 if (!ReportMultipleNearMisses
)
3282 emitAsmTiedOperandConstraints(Target
, Info
, OS
);
3284 StringToOffsetTable StringTable
;
3286 size_t MaxNumOperands
= 0;
3287 unsigned MaxMnemonicIndex
= 0;
3288 bool HasDeprecation
= false;
3289 for (const auto &MI
: Info
.Matchables
) {
3290 MaxNumOperands
= std::max(MaxNumOperands
, MI
->AsmOperands
.size());
3291 HasDeprecation
|= MI
->HasDeprecation
;
3293 // Store a pascal-style length byte in the mnemonic.
3294 std::string LenMnemonic
= char(MI
->Mnemonic
.size()) + MI
->Mnemonic
.str();
3295 MaxMnemonicIndex
= std::max(MaxMnemonicIndex
,
3296 StringTable
.GetOrAddStringOffset(LenMnemonic
, false));
3299 OS
<< "static const char *const MnemonicTable =\n";
3300 StringTable
.EmitString(OS
);
3303 // Emit the static match table; unused classes get initialized to 0 which is
3304 // guaranteed to be InvalidMatchClass.
3306 // FIXME: We can reduce the size of this table very easily. First, we change
3307 // it so that store the kinds in separate bit-fields for each index, which
3308 // only needs to be the max width used for classes at that index (we also need
3309 // to reject based on this during classification). If we then make sure to
3310 // order the match kinds appropriately (putting mnemonics last), then we
3311 // should only end up using a few bits for each class, especially the ones
3312 // following the mnemonic.
3313 OS
<< "namespace {\n";
3314 OS
<< " struct MatchEntry {\n";
3315 OS
<< " " << getMinimalTypeForRange(MaxMnemonicIndex
)
3317 OS
<< " uint16_t Opcode;\n";
3318 OS
<< " " << getMinimalTypeForRange(Info
.Matchables
.size())
3320 OS
<< " " << getMinimalTypeForEnumBitfield(Info
.SubtargetFeatures
.size())
3321 << " RequiredFeatures;\n";
3322 OS
<< " " << getMinimalTypeForRange(
3323 std::distance(Info
.Classes
.begin(), Info
.Classes
.end()))
3324 << " Classes[" << MaxNumOperands
<< "];\n";
3325 OS
<< " StringRef getMnemonic() const {\n";
3326 OS
<< " return StringRef(MnemonicTable + Mnemonic + 1,\n";
3327 OS
<< " MnemonicTable[Mnemonic]);\n";
3331 OS
<< " // Predicate for searching for an opcode.\n";
3332 OS
<< " struct LessOpcode {\n";
3333 OS
<< " bool operator()(const MatchEntry &LHS, StringRef RHS) {\n";
3334 OS
<< " return LHS.getMnemonic() < RHS;\n";
3336 OS
<< " bool operator()(StringRef LHS, const MatchEntry &RHS) {\n";
3337 OS
<< " return LHS < RHS.getMnemonic();\n";
3339 OS
<< " bool operator()(const MatchEntry &LHS, const MatchEntry &RHS) {\n";
3340 OS
<< " return LHS.getMnemonic() < RHS.getMnemonic();\n";
3344 OS
<< "} // end anonymous namespace.\n\n";
3346 unsigned VariantCount
= Target
.getAsmParserVariantCount();
3347 for (unsigned VC
= 0; VC
!= VariantCount
; ++VC
) {
3348 Record
*AsmVariant
= Target
.getAsmParserVariant(VC
);
3349 int AsmVariantNo
= AsmVariant
->getValueAsInt("Variant");
3351 OS
<< "static const MatchEntry MatchTable" << VC
<< "[] = {\n";
3353 for (const auto &MI
: Info
.Matchables
) {
3354 if (MI
->AsmVariantID
!= AsmVariantNo
)
3357 // Store a pascal-style length byte in the mnemonic.
3358 std::string LenMnemonic
= char(MI
->Mnemonic
.size()) + MI
->Mnemonic
.str();
3359 OS
<< " { " << StringTable
.GetOrAddStringOffset(LenMnemonic
, false)
3360 << " /* " << MI
->Mnemonic
<< " */, "
3361 << Target
.getInstNamespace() << "::"
3362 << MI
->getResultInst()->TheDef
->getName() << ", "
3363 << MI
->ConversionFnKind
<< ", ";
3365 // Write the required features mask.
3366 if (!MI
->RequiredFeatures
.empty()) {
3367 for (unsigned i
= 0, e
= MI
->RequiredFeatures
.size(); i
!= e
; ++i
) {
3369 OS
<< MI
->RequiredFeatures
[i
]->getEnumName();
3375 for (unsigned i
= 0, e
= MI
->AsmOperands
.size(); i
!= e
; ++i
) {
3376 const MatchableInfo::AsmOperand
&Op
= MI
->AsmOperands
[i
];
3379 OS
<< Op
.Class
->Name
;
3387 OS
<< "#include \"llvm/Support/Debug.h\"\n";
3388 OS
<< "#include \"llvm/Support/Format.h\"\n\n";
3390 // Finally, build the match function.
3391 OS
<< "unsigned " << Target
.getName() << ClassName
<< "::\n"
3392 << "MatchInstructionImpl(const OperandVector &Operands,\n";
3393 OS
<< " MCInst &Inst,\n";
3394 if (ReportMultipleNearMisses
)
3395 OS
<< " SmallVectorImpl<NearMissInfo> *NearMisses,\n";
3397 OS
<< " uint64_t &ErrorInfo,\n";
3398 OS
<< " bool matchingInlineAsm, unsigned VariantID) {\n";
3400 if (!ReportMultipleNearMisses
) {
3401 OS
<< " // Eliminate obvious mismatches.\n";
3402 OS
<< " if (Operands.size() > "
3403 << (MaxNumOperands
+ HasMnemonicFirst
) << ") {\n";
3404 OS
<< " ErrorInfo = "
3405 << (MaxNumOperands
+ HasMnemonicFirst
) << ";\n";
3406 OS
<< " return Match_InvalidOperand;\n";
3410 // Emit code to get the available features.
3411 OS
<< " // Get the current feature set.\n";
3412 OS
<< " uint64_t AvailableFeatures = getAvailableFeatures();\n\n";
3414 OS
<< " // Get the instruction mnemonic, which is the first token.\n";
3415 if (HasMnemonicFirst
) {
3416 OS
<< " StringRef Mnemonic = ((" << Target
.getName()
3417 << "Operand&)*Operands[0]).getToken();\n\n";
3419 OS
<< " StringRef Mnemonic;\n";
3420 OS
<< " if (Operands[0]->isToken())\n";
3421 OS
<< " Mnemonic = ((" << Target
.getName()
3422 << "Operand&)*Operands[0]).getToken();\n\n";
3425 if (HasMnemonicAliases
) {
3426 OS
<< " // Process all MnemonicAliases to remap the mnemonic.\n";
3427 OS
<< " applyMnemonicAliases(Mnemonic, AvailableFeatures, VariantID);\n\n";
3430 // Emit code to compute the class list for this operand vector.
3431 if (!ReportMultipleNearMisses
) {
3432 OS
<< " // Some state to try to produce better error messages.\n";
3433 OS
<< " bool HadMatchOtherThanFeatures = false;\n";
3434 OS
<< " bool HadMatchOtherThanPredicate = false;\n";
3435 OS
<< " unsigned RetCode = Match_InvalidOperand;\n";
3436 OS
<< " uint64_t MissingFeatures = ~0ULL;\n";
3437 OS
<< " // Set ErrorInfo to the operand that mismatches if it is\n";
3438 OS
<< " // wrong for all instances of the instruction.\n";
3439 OS
<< " ErrorInfo = ~0ULL;\n";
3442 if (HasOptionalOperands
) {
3443 OS
<< " SmallBitVector OptionalOperandsMask(" << MaxNumOperands
<< ");\n";
3446 // Emit code to search the table.
3447 OS
<< " // Find the appropriate table for this asm variant.\n";
3448 OS
<< " const MatchEntry *Start, *End;\n";
3449 OS
<< " switch (VariantID) {\n";
3450 OS
<< " default: llvm_unreachable(\"invalid variant!\");\n";
3451 for (unsigned VC
= 0; VC
!= VariantCount
; ++VC
) {
3452 Record
*AsmVariant
= Target
.getAsmParserVariant(VC
);
3453 int AsmVariantNo
= AsmVariant
->getValueAsInt("Variant");
3454 OS
<< " case " << AsmVariantNo
<< ": Start = std::begin(MatchTable" << VC
3455 << "); End = std::end(MatchTable" << VC
<< "); break;\n";
3459 OS
<< " // Search the table.\n";
3460 if (HasMnemonicFirst
) {
3461 OS
<< " auto MnemonicRange = "
3462 "std::equal_range(Start, End, Mnemonic, LessOpcode());\n\n";
3464 OS
<< " auto MnemonicRange = std::make_pair(Start, End);\n";
3465 OS
<< " unsigned SIndex = Mnemonic.empty() ? 0 : 1;\n";
3466 OS
<< " if (!Mnemonic.empty())\n";
3467 OS
<< " MnemonicRange = "
3468 "std::equal_range(Start, End, Mnemonic.lower(), LessOpcode());\n\n";
3471 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"AsmMatcher: found \" <<\n"
3472 << " std::distance(MnemonicRange.first, MnemonicRange.second) << \n"
3473 << " \" encodings with mnemonic '\" << Mnemonic << \"'\\n\");\n\n";
3475 OS
<< " // Return a more specific error code if no mnemonics match.\n";
3476 OS
<< " if (MnemonicRange.first == MnemonicRange.second)\n";
3477 OS
<< " return Match_MnemonicFail;\n\n";
3479 OS
<< " for (const MatchEntry *it = MnemonicRange.first, "
3480 << "*ie = MnemonicRange.second;\n";
3481 OS
<< " it != ie; ++it) {\n";
3482 OS
<< " bool HasRequiredFeatures =\n";
3483 OS
<< " (AvailableFeatures & it->RequiredFeatures) == "
3484 "it->RequiredFeatures;\n";
3485 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"Trying to match opcode \"\n";
3486 OS
<< " << MII.getName(it->Opcode) << \"\\n\");\n";
3488 if (ReportMultipleNearMisses
) {
3489 OS
<< " // Some state to record ways in which this instruction did not match.\n";
3490 OS
<< " NearMissInfo OperandNearMiss = NearMissInfo::getSuccess();\n";
3491 OS
<< " NearMissInfo FeaturesNearMiss = NearMissInfo::getSuccess();\n";
3492 OS
<< " NearMissInfo EarlyPredicateNearMiss = NearMissInfo::getSuccess();\n";
3493 OS
<< " NearMissInfo LatePredicateNearMiss = NearMissInfo::getSuccess();\n";
3494 OS
<< " bool MultipleInvalidOperands = false;\n";
3497 if (HasMnemonicFirst
) {
3498 OS
<< " // equal_range guarantees that instruction mnemonic matches.\n";
3499 OS
<< " assert(Mnemonic == it->getMnemonic());\n";
3502 // Emit check that the subclasses match.
3503 if (!ReportMultipleNearMisses
)
3504 OS
<< " bool OperandsValid = true;\n";
3505 if (HasOptionalOperands
) {
3506 OS
<< " OptionalOperandsMask.reset(0, " << MaxNumOperands
<< ");\n";
3508 OS
<< " for (unsigned FormalIdx = " << (HasMnemonicFirst
? "0" : "SIndex")
3509 << ", ActualIdx = " << (HasMnemonicFirst
? "1" : "SIndex")
3510 << "; FormalIdx != " << MaxNumOperands
<< "; ++FormalIdx) {\n";
3511 OS
<< " auto Formal = "
3512 << "static_cast<MatchClassKind>(it->Classes[FormalIdx]);\n";
3513 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\",\n";
3514 OS
<< " dbgs() << \" Matching formal operand class \" << getMatchClassName(Formal)\n";
3515 OS
<< " << \" against actual operand at index \" << ActualIdx);\n";
3516 OS
<< " if (ActualIdx < Operands.size())\n";
3517 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \" (\";\n";
3518 OS
<< " Operands[ActualIdx]->print(dbgs()); dbgs() << \"): \");\n";
3520 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \": \");\n";
3521 OS
<< " if (ActualIdx >= Operands.size()) {\n";
3522 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"actual operand index out of range \");\n";
3523 if (ReportMultipleNearMisses
) {
3524 OS
<< " bool ThisOperandValid = (Formal == " <<"InvalidMatchClass) || "
3525 "isSubclass(Formal, OptionalMatchClass);\n";
3526 OS
<< " if (!ThisOperandValid) {\n";
3527 OS
<< " if (!OperandNearMiss) {\n";
3528 OS
<< " // Record info about match failure for later use.\n";
3529 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"recording too-few-operands near miss\\n\");\n";
3530 OS
<< " OperandNearMiss =\n";
3531 OS
<< " NearMissInfo::getTooFewOperands(Formal, it->Opcode);\n";
3532 OS
<< " } else if (OperandNearMiss.getKind() != NearMissInfo::NearMissTooFewOperands) {\n";
3533 OS
<< " // If more than one operand is invalid, give up on this match entry.\n";
3534 OS
<< " DEBUG_WITH_TYPE(\n";
3535 OS
<< " \"asm-matcher\",\n";
3536 OS
<< " dbgs() << \"second invalid operand, giving up on this opcode\\n\");\n";
3537 OS
<< " MultipleInvalidOperands = true;\n";
3540 OS
<< " } else {\n";
3541 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"but formal operand not required\\n\");\n";
3544 OS
<< " continue;\n";
3546 OS
<< " OperandsValid = (Formal == InvalidMatchClass) || isSubclass(Formal, OptionalMatchClass);\n";
3547 OS
<< " if (!OperandsValid) ErrorInfo = ActualIdx;\n";
3548 if (HasOptionalOperands
) {
3549 OS
<< " OptionalOperandsMask.set(FormalIdx, " << MaxNumOperands
3555 OS
<< " MCParsedAsmOperand &Actual = *Operands[ActualIdx];\n";
3556 OS
<< " unsigned Diag = validateOperandClass(Actual, Formal);\n";
3557 OS
<< " if (Diag == Match_Success) {\n";
3558 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\",\n";
3559 OS
<< " dbgs() << \"match success using generic matcher\\n\");\n";
3560 OS
<< " ++ActualIdx;\n";
3561 OS
<< " continue;\n";
3563 OS
<< " // If the generic handler indicates an invalid operand\n";
3564 OS
<< " // failure, check for a special case.\n";
3565 OS
<< " if (Diag != Match_Success) {\n";
3566 OS
<< " unsigned TargetDiag = validateTargetOperandClass(Actual, Formal);\n";
3567 OS
<< " if (TargetDiag == Match_Success) {\n";
3568 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\",\n";
3569 OS
<< " dbgs() << \"match success using target matcher\\n\");\n";
3570 OS
<< " ++ActualIdx;\n";
3571 OS
<< " continue;\n";
3573 OS
<< " // If the target matcher returned a specific error code use\n";
3574 OS
<< " // that, else use the one from the generic matcher.\n";
3575 OS
<< " if (TargetDiag != Match_InvalidOperand && "
3576 "HasRequiredFeatures)\n";
3577 OS
<< " Diag = TargetDiag;\n";
3579 OS
<< " // If current formal operand wasn't matched and it is optional\n"
3580 << " // then try to match next formal operand\n";
3581 OS
<< " if (Diag == Match_InvalidOperand "
3582 << "&& isSubclass(Formal, OptionalMatchClass)) {\n";
3583 if (HasOptionalOperands
) {
3584 OS
<< " OptionalOperandsMask.set(FormalIdx);\n";
3586 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"ignoring optional operand\\n\");\n";
3587 OS
<< " continue;\n";
3590 if (ReportMultipleNearMisses
) {
3591 OS
<< " if (!OperandNearMiss) {\n";
3592 OS
<< " // If this is the first invalid operand we have seen, record some\n";
3593 OS
<< " // information about it.\n";
3594 OS
<< " DEBUG_WITH_TYPE(\n";
3595 OS
<< " \"asm-matcher\",\n";
3597 OS
<< " << \"operand match failed, recording near-miss with diag code \"\n";
3598 OS
<< " << Diag << \"\\n\");\n";
3599 OS
<< " OperandNearMiss =\n";
3600 OS
<< " NearMissInfo::getMissedOperand(Diag, Formal, it->Opcode, ActualIdx);\n";
3601 OS
<< " ++ActualIdx;\n";
3602 OS
<< " } else {\n";
3603 OS
<< " // If more than one operand is invalid, give up on this match entry.\n";
3604 OS
<< " DEBUG_WITH_TYPE(\n";
3605 OS
<< " \"asm-matcher\",\n";
3606 OS
<< " dbgs() << \"second operand mismatch, skipping this opcode\\n\");\n";
3607 OS
<< " MultipleInvalidOperands = true;\n";
3612 OS
<< " // If this operand is broken for all of the instances of this\n";
3613 OS
<< " // mnemonic, keep track of it so we can report loc info.\n";
3614 OS
<< " // If we already had a match that only failed due to a\n";
3615 OS
<< " // target predicate, that diagnostic is preferred.\n";
3616 OS
<< " if (!HadMatchOtherThanPredicate &&\n";
3617 OS
<< " (it == MnemonicRange.first || ErrorInfo <= ActualIdx)) {\n";
3618 OS
<< " if (HasRequiredFeatures && (ErrorInfo != ActualIdx || Diag "
3619 "!= Match_InvalidOperand))\n";
3620 OS
<< " RetCode = Diag;\n";
3621 OS
<< " ErrorInfo = ActualIdx;\n";
3623 OS
<< " // Otherwise, just reject this instance of the mnemonic.\n";
3624 OS
<< " OperandsValid = false;\n";
3629 if (ReportMultipleNearMisses
)
3630 OS
<< " if (MultipleInvalidOperands) {\n";
3632 OS
<< " if (!OperandsValid) {\n";
3633 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"Opcode result: multiple \"\n";
3634 OS
<< " \"operand mismatches, ignoring \"\n";
3635 OS
<< " \"this opcode\\n\");\n";
3636 OS
<< " continue;\n";
3639 // Emit check that the required features are available.
3640 OS
<< " if (!HasRequiredFeatures) {\n";
3641 if (!ReportMultipleNearMisses
)
3642 OS
<< " HadMatchOtherThanFeatures = true;\n";
3643 OS
<< " uint64_t NewMissingFeatures = it->RequiredFeatures & "
3644 "~AvailableFeatures;\n";
3645 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"Missing target features: \"\n";
3646 OS
<< " << format_hex(NewMissingFeatures, 18)\n";
3647 OS
<< " << \"\\n\");\n";
3648 if (ReportMultipleNearMisses
) {
3649 OS
<< " FeaturesNearMiss = NearMissInfo::getMissedFeature(NewMissingFeatures);\n";
3651 OS
<< " if (countPopulation(NewMissingFeatures) <=\n"
3652 " countPopulation(MissingFeatures))\n";
3653 OS
<< " MissingFeatures = NewMissingFeatures;\n";
3654 OS
<< " continue;\n";
3658 OS
<< " Inst.clear();\n\n";
3659 OS
<< " Inst.setOpcode(it->Opcode);\n";
3660 // Verify the instruction with the target-specific match predicate function.
3661 OS
<< " // We have a potential match but have not rendered the operands.\n"
3662 << " // Check the target predicate to handle any context sensitive\n"
3663 " // constraints.\n"
3664 << " // For example, Ties that are referenced multiple times must be\n"
3665 " // checked here to ensure the input is the same for each match\n"
3666 " // constraints. If we leave it any later the ties will have been\n"
3667 " // canonicalized\n"
3668 << " unsigned MatchResult;\n"
3669 << " if ((MatchResult = checkEarlyTargetMatchPredicate(Inst, "
3670 "Operands)) != Match_Success) {\n"
3671 << " Inst.clear();\n";
3672 OS
<< " DEBUG_WITH_TYPE(\n";
3673 OS
<< " \"asm-matcher\",\n";
3674 OS
<< " dbgs() << \"Early target match predicate failed with diag code \"\n";
3675 OS
<< " << MatchResult << \"\\n\");\n";
3676 if (ReportMultipleNearMisses
) {
3677 OS
<< " EarlyPredicateNearMiss = NearMissInfo::getMissedPredicate(MatchResult);\n";
3679 OS
<< " RetCode = MatchResult;\n"
3680 << " HadMatchOtherThanPredicate = true;\n"
3685 if (ReportMultipleNearMisses
) {
3686 OS
<< " // If we did not successfully match the operands, then we can't convert to\n";
3687 OS
<< " // an MCInst, so bail out on this instruction variant now.\n";
3688 OS
<< " if (OperandNearMiss) {\n";
3689 OS
<< " // If the operand mismatch was the only problem, reprrt it as a near-miss.\n";
3690 OS
<< " if (NearMisses && !FeaturesNearMiss && !EarlyPredicateNearMiss) {\n";
3691 OS
<< " DEBUG_WITH_TYPE(\n";
3692 OS
<< " \"asm-matcher\",\n";
3694 OS
<< " << \"Opcode result: one mismatched operand, adding near-miss\\n\");\n";
3695 OS
<< " NearMisses->push_back(OperandNearMiss);\n";
3696 OS
<< " } else {\n";
3697 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"Opcode result: multiple \"\n";
3698 OS
<< " \"types of mismatch, so not \"\n";
3699 OS
<< " \"reporting near-miss\\n\");\n";
3701 OS
<< " continue;\n";
3705 OS
<< " if (matchingInlineAsm) {\n";
3706 OS
<< " convertToMapAndConstraints(it->ConvertFn, Operands);\n";
3707 if (!ReportMultipleNearMisses
) {
3708 OS
<< " if (!checkAsmTiedOperandConstraints(*this, it->ConvertFn, "
3709 "Operands, ErrorInfo))\n";
3710 OS
<< " return Match_InvalidTiedOperand;\n";
3713 OS
<< " return Match_Success;\n";
3715 OS
<< " // We have selected a definite instruction, convert the parsed\n"
3716 << " // operands into the appropriate MCInst.\n";
3717 if (HasOptionalOperands
) {
3718 OS
<< " convertToMCInst(it->ConvertFn, Inst, it->Opcode, Operands,\n"
3719 << " OptionalOperandsMask);\n";
3721 OS
<< " convertToMCInst(it->ConvertFn, Inst, it->Opcode, Operands);\n";
3725 // Verify the instruction with the target-specific match predicate function.
3726 OS
<< " // We have a potential match. Check the target predicate to\n"
3727 << " // handle any context sensitive constraints.\n"
3728 << " if ((MatchResult = checkTargetMatchPredicate(Inst)) !="
3729 << " Match_Success) {\n"
3730 << " DEBUG_WITH_TYPE(\"asm-matcher\",\n"
3731 << " dbgs() << \"Target match predicate failed with diag code \"\n"
3732 << " << MatchResult << \"\\n\");\n"
3733 << " Inst.clear();\n";
3734 if (ReportMultipleNearMisses
) {
3735 OS
<< " LatePredicateNearMiss = NearMissInfo::getMissedPredicate(MatchResult);\n";
3737 OS
<< " RetCode = MatchResult;\n"
3738 << " HadMatchOtherThanPredicate = true;\n"
3743 if (ReportMultipleNearMisses
) {
3744 OS
<< " int NumNearMisses = ((int)(bool)OperandNearMiss +\n";
3745 OS
<< " (int)(bool)FeaturesNearMiss +\n";
3746 OS
<< " (int)(bool)EarlyPredicateNearMiss +\n";
3747 OS
<< " (int)(bool)LatePredicateNearMiss);\n";
3748 OS
<< " if (NumNearMisses == 1) {\n";
3749 OS
<< " // We had exactly one type of near-miss, so add that to the list.\n";
3750 OS
<< " assert(!OperandNearMiss && \"OperandNearMiss was handled earlier\");\n";
3751 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"Opcode result: found one type of \"\n";
3752 OS
<< " \"mismatch, so reporting a \"\n";
3753 OS
<< " \"near-miss\\n\");\n";
3754 OS
<< " if (NearMisses && FeaturesNearMiss)\n";
3755 OS
<< " NearMisses->push_back(FeaturesNearMiss);\n";
3756 OS
<< " else if (NearMisses && EarlyPredicateNearMiss)\n";
3757 OS
<< " NearMisses->push_back(EarlyPredicateNearMiss);\n";
3758 OS
<< " else if (NearMisses && LatePredicateNearMiss)\n";
3759 OS
<< " NearMisses->push_back(LatePredicateNearMiss);\n";
3761 OS
<< " continue;\n";
3762 OS
<< " } else if (NumNearMisses > 1) {\n";
3763 OS
<< " // This instruction missed in more than one way, so ignore it.\n";
3764 OS
<< " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"Opcode result: multiple \"\n";
3765 OS
<< " \"types of mismatch, so not \"\n";
3766 OS
<< " \"reporting near-miss\\n\");\n";
3767 OS
<< " continue;\n";
3771 // Call the post-processing function, if used.
3772 StringRef InsnCleanupFn
= AsmParser
->getValueAsString("AsmParserInstCleanup");
3773 if (!InsnCleanupFn
.empty())
3774 OS
<< " " << InsnCleanupFn
<< "(Inst);\n";
3776 if (HasDeprecation
) {
3777 OS
<< " std::string Info;\n";
3778 OS
<< " if (!getParser().getTargetParser().\n";
3779 OS
<< " getTargetOptions().MCNoDeprecatedWarn &&\n";
3780 OS
<< " MII.get(Inst.getOpcode()).getDeprecatedInfo(Inst, getSTI(), Info)) {\n";
3781 OS
<< " SMLoc Loc = ((" << Target
.getName()
3782 << "Operand&)*Operands[0]).getStartLoc();\n";
3783 OS
<< " getParser().Warning(Loc, Info, None);\n";
3787 if (!ReportMultipleNearMisses
) {
3788 OS
<< " if (!checkAsmTiedOperandConstraints(*this, it->ConvertFn, "
3789 "Operands, ErrorInfo))\n";
3790 OS
<< " return Match_InvalidTiedOperand;\n";
3794 OS
<< " DEBUG_WITH_TYPE(\n";
3795 OS
<< " \"asm-matcher\",\n";
3796 OS
<< " dbgs() << \"Opcode result: complete match, selecting this opcode\\n\");\n";
3797 OS
<< " return Match_Success;\n";
3800 if (ReportMultipleNearMisses
) {
3801 OS
<< " // No instruction variants matched exactly.\n";
3802 OS
<< " return Match_NearMisses;\n";
3804 OS
<< " // Okay, we had no match. Try to return a useful error code.\n";
3805 OS
<< " if (HadMatchOtherThanPredicate || !HadMatchOtherThanFeatures)\n";
3806 OS
<< " return RetCode;\n\n";
3807 OS
<< " // Missing feature matches return which features were missing\n";
3808 OS
<< " ErrorInfo = MissingFeatures;\n";
3809 OS
<< " return Match_MissingFeature;\n";
3813 if (!Info
.OperandMatchInfo
.empty())
3814 emitCustomOperandParsing(OS
, Target
, Info
, ClassName
, StringTable
,
3815 MaxMnemonicIndex
, HasMnemonicFirst
);
3817 OS
<< "#endif // GET_MATCHER_IMPLEMENTATION\n\n";
3819 OS
<< "\n#ifdef GET_MNEMONIC_SPELL_CHECKER\n";
3820 OS
<< "#undef GET_MNEMONIC_SPELL_CHECKER\n\n";
3822 emitMnemonicSpellChecker(OS
, Target
, VariantCount
);
3824 OS
<< "#endif // GET_MNEMONIC_SPELL_CHECKER\n\n";
3829 void EmitAsmMatcher(RecordKeeper
&RK
, raw_ostream
&OS
) {
3830 emitSourceFileHeader("Assembly Matcher Source Fragment", OS
);
3831 AsmMatcherEmitter(RK
).run(OS
);
3834 } // end namespace llvm