1 | //===- CodeGenInstAlias.h - InstAlias Class Wrapper -------------*- C++ -*-===// |
2 | // |
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 |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file defines a wrapper class for the 'InstAlias' TableGen class. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #ifndef LLVM_UTILS_TABLEGEN_CODEGENINSTALIAS_H |
14 | #define LLVM_UTILS_TABLEGEN_CODEGENINSTALIAS_H |
15 | |
16 | #include "llvm/ADT/StringRef.h" |
17 | #include <cassert> |
18 | #include <cstdint> |
19 | #include <string> |
20 | #include <utility> |
21 | #include <vector> |
22 | |
23 | namespace llvm { |
24 | |
25 | template <typename T> class ArrayRef; |
26 | class CodeGenInstruction; |
27 | class CodeGenTarget; |
28 | class DagInit; |
29 | class SMLoc; |
30 | class Record; |
31 | |
32 | /// CodeGenInstAlias - This represents an InstAlias definition. |
33 | class CodeGenInstAlias { |
34 | public: |
35 | Record *TheDef; // The actual record defining this InstAlias. |
36 | |
37 | /// AsmString - The format string used to emit a .s file for the |
38 | /// instruction. |
39 | std::string AsmString; |
40 | |
41 | /// Result - The result instruction. |
42 | DagInit *Result; |
43 | |
44 | /// ResultInst - The instruction generated by the alias (decoded from |
45 | /// Result). |
46 | CodeGenInstruction *ResultInst; |
47 | |
48 | struct ResultOperand { |
49 | private: |
50 | std::string Name; |
51 | Record *R = nullptr; |
52 | int64_t Imm = 0; |
53 | |
54 | public: |
55 | enum { K_Record, K_Imm, K_Reg } Kind; |
56 | |
57 | ResultOperand(std::string N, Record *r) |
58 | : Name(std::move(N)), R(r), Kind(K_Record) {} |
59 | ResultOperand(int64_t I) : Imm(I), Kind(K_Imm) {} |
60 | ResultOperand(Record *r) : R(r), Kind(K_Reg) {} |
61 | |
62 | bool isRecord() const { return Kind == K_Record; } |
63 | bool isImm() const { return Kind == K_Imm; } |
64 | bool isReg() const { return Kind == K_Reg; } |
65 | |
66 | StringRef getName() const { |
67 | assert(isRecord()); |
68 | return Name; |
69 | } |
70 | Record *getRecord() const { |
71 | assert(isRecord()); |
72 | return R; |
73 | } |
74 | int64_t getImm() const { |
75 | assert(isImm()); |
76 | return Imm; |
77 | } |
78 | Record *getRegister() const { |
79 | assert(isReg()); |
80 | return R; |
81 | } |
82 | |
83 | unsigned getMINumOperands() const; |
84 | }; |
85 | |
86 | /// ResultOperands - The decoded operands for the result instruction. |
87 | std::vector<ResultOperand> ResultOperands; |
88 | |
89 | /// ResultInstOperandIndex - For each operand, this vector holds a pair of |
90 | /// indices to identify the corresponding operand in the result |
91 | /// instruction. The first index specifies the operand and the second |
92 | /// index specifies the suboperand. If there are no suboperands or if all |
93 | /// of them are matched by the operand, the second value should be -1. |
94 | std::vector<std::pair<unsigned, int>> ResultInstOperandIndex; |
95 | |
96 | CodeGenInstAlias(Record *R, CodeGenTarget &T); |
97 | |
98 | bool tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo, Record *InstOpRec, |
99 | bool hasSubOps, ArrayRef<SMLoc> Loc, CodeGenTarget &T, |
100 | ResultOperand &ResOp); |
101 | }; |
102 | |
103 | } // namespace llvm |
104 | |
105 | #endif // LLVM_UTILS_TABLEGEN_CODEGENINSTALIAS_H |
106 | |