1 //===- AsmWriterInst.h - Classes encapsulating a printable inst -*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // These classes implement a parser for assembly strings. The parser splits
10 // the string into operands, which can be literal strings (the constant bits of
11 // the string), actual operands (i.e., operands from the MachineInstr), and
12 // dynamically-generated text, specified by raw C++ code.
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_UTILS_TABLEGEN_ASMWRITERINST_H
17 #define LLVM_UTILS_TABLEGEN_ASMWRITERINST_H
23 class CodeGenInstruction
;
26 struct AsmWriterOperand
{
28 // Output this text surrounded by quotes to the asm.
30 // This is the name of a routine to call to print the operand.
31 isMachineInstrOperand
,
32 // Output this text verbatim to the asm writer. It is code that
33 // will output some text to the asm.
34 isLiteralStatementOperand
37 /// MiOpNo - For isMachineInstrOperand, this is the operand number of the
38 /// machine instruction.
41 /// Str - For isLiteralTextOperand, this IS the literal text. For
42 /// isMachineInstrOperand, this is the PrinterMethodName for the operand..
43 /// For isLiteralStatementOperand, this is the code to insert verbatim
44 /// into the asm writer.
47 /// MiModifier - For isMachineInstrOperand, this is the modifier string for
48 /// an operand, specified with syntax like ${opname:modifier}.
49 std::string MiModifier
;
53 // To make VS STL happy
54 AsmWriterOperand(OpType op
= isLiteralTextOperand
):OperandType(op
) {}
56 AsmWriterOperand(const std::string
&LitStr
,
57 OpType op
= isLiteralTextOperand
)
58 : OperandType(op
), Str(LitStr
) {}
60 AsmWriterOperand(const std::string
&Printer
, unsigned _MIOpNo
,
61 const std::string
&Modifier
,
62 OpType op
= isMachineInstrOperand
, bool PCRel
= false)
63 : OperandType(op
), MIOpNo(_MIOpNo
), Str(Printer
), MiModifier(Modifier
),
66 bool operator!=(const AsmWriterOperand
&Other
) const {
67 if (OperandType
!= Other
.OperandType
|| Str
!= Other
.Str
) return true;
68 if (OperandType
== isMachineInstrOperand
)
69 return MIOpNo
!= Other
.MIOpNo
|| MiModifier
!= Other
.MiModifier
||
73 bool operator==(const AsmWriterOperand
&Other
) const {
74 return !operator!=(Other
);
77 /// getCode - Return the code that prints this operand.
78 std::string
getCode(bool PassSubtarget
) const;
83 std::vector
<AsmWriterOperand
> Operands
;
84 const CodeGenInstruction
*CGI
;
87 AsmWriterInst(const CodeGenInstruction
&CGI
, unsigned CGIIndex
,
90 /// MatchesAllButOneOp - If this instruction is exactly identical to the
91 /// specified instruction except for one differing operand, return the
92 /// differing operand number. Otherwise return ~0.
93 unsigned MatchesAllButOneOp(const AsmWriterInst
&Other
) const;
96 void AddLiteralString(const std::string
&Str
) {
97 // If the last operand was already a literal text string, append this to
98 // it, otherwise add a new operand.
99 if (!Operands
.empty() &&
100 Operands
.back().OperandType
== AsmWriterOperand::isLiteralTextOperand
)
101 Operands
.back().Str
.append(Str
);
103 Operands
.push_back(AsmWriterOperand(Str
));