1fa3d789dSPierre van Houtryve //===- AsmWriterInst.h - Classes encapsulating a printable inst -*- C++ -*-===// 2fa3d789dSPierre van Houtryve // 3fa3d789dSPierre van Houtryve // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4fa3d789dSPierre van Houtryve // See https://llvm.org/LICENSE.txt for license information. 5fa3d789dSPierre van Houtryve // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6fa3d789dSPierre van Houtryve // 7fa3d789dSPierre van Houtryve //===----------------------------------------------------------------------===// 8fa3d789dSPierre van Houtryve // 9fa3d789dSPierre van Houtryve // These classes implement a parser for assembly strings. The parser splits 10fa3d789dSPierre van Houtryve // the string into operands, which can be literal strings (the constant bits of 11fa3d789dSPierre van Houtryve // the string), actual operands (i.e., operands from the MachineInstr), and 12fa3d789dSPierre van Houtryve // dynamically-generated text, specified by raw C++ code. 13fa3d789dSPierre van Houtryve // 14fa3d789dSPierre van Houtryve //===----------------------------------------------------------------------===// 15fa3d789dSPierre van Houtryve 16*8a61bfcfSRahul Joshi #ifndef LLVM_UTILS_TABLEGEN_COMMON_ASMWRITERINST_H 17*8a61bfcfSRahul Joshi #define LLVM_UTILS_TABLEGEN_COMMON_ASMWRITERINST_H 18fa3d789dSPierre van Houtryve 19fa3d789dSPierre van Houtryve #include <string> 20fa3d789dSPierre van Houtryve #include <vector> 21fa3d789dSPierre van Houtryve 22fa3d789dSPierre van Houtryve namespace llvm { 23fa3d789dSPierre van Houtryve class CodeGenInstruction; 24fa3d789dSPierre van Houtryve 25fa3d789dSPierre van Houtryve struct AsmWriterOperand { 26fa3d789dSPierre van Houtryve enum OpType { 27fa3d789dSPierre van Houtryve // Output this text surrounded by quotes to the asm. 28fa3d789dSPierre van Houtryve isLiteralTextOperand, 29fa3d789dSPierre van Houtryve // This is the name of a routine to call to print the operand. 30fa3d789dSPierre van Houtryve isMachineInstrOperand, 31fa3d789dSPierre van Houtryve // Output this text verbatim to the asm writer. It is code that 32fa3d789dSPierre van Houtryve // will output some text to the asm. 33fa3d789dSPierre van Houtryve isLiteralStatementOperand 34fa3d789dSPierre van Houtryve } OperandType; 35fa3d789dSPierre van Houtryve 36fa3d789dSPierre van Houtryve /// MiOpNo - For isMachineInstrOperand, this is the operand number of the 37fa3d789dSPierre van Houtryve /// machine instruction. 38fa3d789dSPierre van Houtryve unsigned MIOpNo = 0; 39fa3d789dSPierre van Houtryve 40fa3d789dSPierre van Houtryve /// Str - For isLiteralTextOperand, this IS the literal text. For 41fa3d789dSPierre van Houtryve /// isMachineInstrOperand, this is the PrinterMethodName for the operand.. 42fa3d789dSPierre van Houtryve /// For isLiteralStatementOperand, this is the code to insert verbatim 43fa3d789dSPierre van Houtryve /// into the asm writer. 44fa3d789dSPierre van Houtryve std::string Str; 45fa3d789dSPierre van Houtryve 46fa3d789dSPierre van Houtryve /// MiModifier - For isMachineInstrOperand, this is the modifier string for 47fa3d789dSPierre van Houtryve /// an operand, specified with syntax like ${opname:modifier}. 48fa3d789dSPierre van Houtryve std::string MiModifier; 49fa3d789dSPierre van Houtryve 50fa3d789dSPierre van Houtryve bool PCRel = false; 51fa3d789dSPierre van Houtryve 52fa3d789dSPierre van Houtryve // To make VS STL happy 53fa3d789dSPierre van Houtryve AsmWriterOperand(OpType op = isLiteralTextOperand) : OperandType(op) {} 54fa3d789dSPierre van Houtryve 55fa3d789dSPierre van Houtryve AsmWriterOperand(const std::string &LitStr, OpType op = isLiteralTextOperand) 56fa3d789dSPierre van Houtryve : OperandType(op), Str(LitStr) {} 57fa3d789dSPierre van Houtryve 58fa3d789dSPierre van Houtryve AsmWriterOperand(const std::string &Printer, unsigned _MIOpNo, 59fa3d789dSPierre van Houtryve const std::string &Modifier, 60fa3d789dSPierre van Houtryve OpType op = isMachineInstrOperand, bool PCRel = false) 61fa3d789dSPierre van Houtryve : OperandType(op), MIOpNo(_MIOpNo), Str(Printer), MiModifier(Modifier), 62fa3d789dSPierre van Houtryve PCRel(PCRel) {} 63fa3d789dSPierre van Houtryve 64fa3d789dSPierre van Houtryve bool operator!=(const AsmWriterOperand &Other) const { 65fa3d789dSPierre van Houtryve if (OperandType != Other.OperandType || Str != Other.Str) 66fa3d789dSPierre van Houtryve return true; 67fa3d789dSPierre van Houtryve if (OperandType == isMachineInstrOperand) 68fa3d789dSPierre van Houtryve return MIOpNo != Other.MIOpNo || MiModifier != Other.MiModifier || 69fa3d789dSPierre van Houtryve PCRel != Other.PCRel; 70fa3d789dSPierre van Houtryve return false; 71fa3d789dSPierre van Houtryve } 72fa3d789dSPierre van Houtryve bool operator==(const AsmWriterOperand &Other) const { 73fa3d789dSPierre van Houtryve return !operator!=(Other); 74fa3d789dSPierre van Houtryve } 75fa3d789dSPierre van Houtryve 76fa3d789dSPierre van Houtryve /// getCode - Return the code that prints this operand. 77fa3d789dSPierre van Houtryve std::string getCode(bool PassSubtarget) const; 78fa3d789dSPierre van Houtryve }; 79fa3d789dSPierre van Houtryve 80fa3d789dSPierre van Houtryve class AsmWriterInst { 81fa3d789dSPierre van Houtryve public: 82fa3d789dSPierre van Houtryve std::vector<AsmWriterOperand> Operands; 83fa3d789dSPierre van Houtryve const CodeGenInstruction *CGI; 84fa3d789dSPierre van Houtryve unsigned CGIIndex; 85fa3d789dSPierre van Houtryve 86fa3d789dSPierre van Houtryve AsmWriterInst(const CodeGenInstruction &CGI, unsigned CGIIndex, 87fa3d789dSPierre van Houtryve unsigned Variant); 88fa3d789dSPierre van Houtryve 89fa3d789dSPierre van Houtryve /// MatchesAllButOneOp - If this instruction is exactly identical to the 90fa3d789dSPierre van Houtryve /// specified instruction except for one differing operand, return the 91fa3d789dSPierre van Houtryve /// differing operand number. Otherwise return ~0. 92fa3d789dSPierre van Houtryve unsigned MatchesAllButOneOp(const AsmWriterInst &Other) const; 93fa3d789dSPierre van Houtryve 94fa3d789dSPierre van Houtryve private: 95fa3d789dSPierre van Houtryve void AddLiteralString(const std::string &Str) { 96fa3d789dSPierre van Houtryve // If the last operand was already a literal text string, append this to 97fa3d789dSPierre van Houtryve // it, otherwise add a new operand. 98fa3d789dSPierre van Houtryve if (!Operands.empty() && 99fa3d789dSPierre van Houtryve Operands.back().OperandType == AsmWriterOperand::isLiteralTextOperand) 100fa3d789dSPierre van Houtryve Operands.back().Str.append(Str); 101fa3d789dSPierre van Houtryve else 102fa3d789dSPierre van Houtryve Operands.push_back(AsmWriterOperand(Str)); 103fa3d789dSPierre van Houtryve } 104fa3d789dSPierre van Houtryve }; 105fa3d789dSPierre van Houtryve } // namespace llvm 106fa3d789dSPierre van Houtryve 107*8a61bfcfSRahul Joshi #endif // LLVM_UTILS_TABLEGEN_COMMON_ASMWRITERINST_H 108