Line data Source code
1 : /*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
2 : |* *|
3 : |* Machine Code Emitter *|
4 : |* *|
5 : |* Automatically generated file, do not edit! *|
6 : |* *|
7 : \*===----------------------------------------------------------------------===*/
8 :
9 : // Undef for HURD
10 : #ifdef EIEIO
11 : #undef EIEIO
12 : #endif
13 0 : uint64_t RISCVMCCodeEmitter::getBinaryCodeForInstr(const MCInst &MI,
14 : SmallVectorImpl<MCFixup> &Fixups,
15 : const MCSubtargetInfo &STI) const {
16 : static const uint64_t InstBits[] = {
17 : UINT64_C(0),
18 : UINT64_C(0),
19 : UINT64_C(0),
20 : UINT64_C(0),
21 : UINT64_C(0),
22 : UINT64_C(0),
23 : UINT64_C(0),
24 : UINT64_C(0),
25 : UINT64_C(0),
26 : UINT64_C(0),
27 : UINT64_C(0),
28 : UINT64_C(0),
29 : UINT64_C(0),
30 : UINT64_C(0),
31 : UINT64_C(0),
32 : UINT64_C(0),
33 : UINT64_C(0),
34 : UINT64_C(0),
35 : UINT64_C(0),
36 : UINT64_C(0),
37 : UINT64_C(0),
38 : UINT64_C(0),
39 : UINT64_C(0),
40 : UINT64_C(0),
41 : UINT64_C(0),
42 : UINT64_C(0),
43 : UINT64_C(0),
44 : UINT64_C(0),
45 : UINT64_C(0),
46 : UINT64_C(0),
47 : UINT64_C(0),
48 : UINT64_C(0),
49 : UINT64_C(0),
50 : UINT64_C(0),
51 : UINT64_C(0),
52 : UINT64_C(0),
53 : UINT64_C(0),
54 : UINT64_C(0),
55 : UINT64_C(0),
56 : UINT64_C(0),
57 : UINT64_C(0),
58 : UINT64_C(0),
59 : UINT64_C(0),
60 : UINT64_C(0),
61 : UINT64_C(0),
62 : UINT64_C(0),
63 : UINT64_C(0),
64 : UINT64_C(0),
65 : UINT64_C(0),
66 : UINT64_C(0),
67 : UINT64_C(0),
68 : UINT64_C(0),
69 : UINT64_C(0),
70 : UINT64_C(0),
71 : UINT64_C(0),
72 : UINT64_C(0),
73 : UINT64_C(0),
74 : UINT64_C(0),
75 : UINT64_C(0),
76 : UINT64_C(0),
77 : UINT64_C(0),
78 : UINT64_C(0),
79 : UINT64_C(0),
80 : UINT64_C(0),
81 : UINT64_C(0),
82 : UINT64_C(0),
83 : UINT64_C(0),
84 : UINT64_C(0),
85 : UINT64_C(0),
86 : UINT64_C(0),
87 : UINT64_C(0),
88 : UINT64_C(0),
89 : UINT64_C(0),
90 : UINT64_C(0),
91 : UINT64_C(0),
92 : UINT64_C(0),
93 : UINT64_C(0),
94 : UINT64_C(0),
95 : UINT64_C(0),
96 : UINT64_C(0),
97 : UINT64_C(0),
98 : UINT64_C(0),
99 : UINT64_C(0),
100 : UINT64_C(0),
101 : UINT64_C(0),
102 : UINT64_C(0),
103 : UINT64_C(0),
104 : UINT64_C(0),
105 : UINT64_C(0),
106 : UINT64_C(0),
107 : UINT64_C(0),
108 : UINT64_C(0),
109 : UINT64_C(0),
110 : UINT64_C(0),
111 : UINT64_C(0),
112 : UINT64_C(0),
113 : UINT64_C(0),
114 : UINT64_C(0),
115 : UINT64_C(0),
116 : UINT64_C(0),
117 : UINT64_C(0),
118 : UINT64_C(0),
119 : UINT64_C(51), // ADD
120 : UINT64_C(19), // ADDI
121 : UINT64_C(28723), // AND
122 : UINT64_C(28691), // ANDI
123 : UINT64_C(24627), // OR
124 : UINT64_C(24595), // ORI
125 : UINT64_C(4147), // SLL
126 : UINT64_C(8243), // SLT
127 : UINT64_C(8211), // SLTI
128 : UINT64_C(12307), // SLTIU
129 : UINT64_C(12339), // SLTU
130 : UINT64_C(1073762355), // SRA
131 : UINT64_C(20531), // SRL
132 : UINT64_C(1073741875), // SUB
133 : UINT64_C(16435), // XOR
134 : UINT64_C(16403), // XORI
135 : UINT64_C(0)
136 : };
137 0 : const unsigned opcode = MI.getOpcode();
138 0 : uint64_t Value = InstBits[opcode];
139 0 : uint64_t op = 0;
140 : (void)op; // suppress warning
141 : switch (opcode) {
142 : case RISCV::ADDI:
143 : case RISCV::ANDI:
144 : case RISCV::ORI:
145 : case RISCV::SLTI:
146 : case RISCV::SLTIU:
147 : case RISCV::XORI: {
148 : // op: imm12
149 0 : op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
150 0 : Value |= (op & UINT64_C(4095)) << 20;
151 : // op: rs1
152 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
153 0 : Value |= (op & UINT64_C(31)) << 15;
154 : // op: rd
155 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
156 0 : Value |= (op & UINT64_C(31)) << 7;
157 : break;
158 : }
159 : case RISCV::ADD:
160 : case RISCV::AND:
161 : case RISCV::OR:
162 : case RISCV::SLL:
163 : case RISCV::SLT:
164 : case RISCV::SLTU:
165 : case RISCV::SRA:
166 : case RISCV::SRL:
167 : case RISCV::SUB:
168 : case RISCV::XOR: {
169 : // op: rs2
170 0 : op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
171 0 : Value |= (op & UINT64_C(31)) << 20;
172 : // op: rs1
173 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
174 0 : Value |= (op & UINT64_C(31)) << 15;
175 : // op: rd
176 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
177 0 : Value |= (op & UINT64_C(31)) << 7;
178 : break;
179 : }
180 : default:
181 0 : std::string msg;
182 0 : raw_string_ostream Msg(msg);
183 0 : Msg << "Not supported instr: " << MI;
184 0 : report_fatal_error(Msg.str());
185 : }
186 0 : return Value;
187 : }
188 :
189 : #ifdef ENABLE_INSTR_PREDICATE_VERIFIER
190 : #undef ENABLE_INSTR_PREDICATE_VERIFIER
191 : #include <sstream>
192 :
193 : // Flags for subtarget features that participate in instruction matching.
194 : enum SubtargetFeatureFlag : uint8_t {
195 : Feature_None = 0
196 : };
197 :
198 : #ifndef NDEBUG
199 : static const char *SubtargetFeatureNames[] = {
200 : nullptr
201 : };
202 :
203 : #endif // NDEBUG
204 : uint64_t RISCVMCCodeEmitter::
205 : computeAvailableFeatures(const FeatureBitset& FB) const {
206 : uint64_t Features = 0;
207 : return Features;
208 : }
209 :
210 : void RISCVMCCodeEmitter::verifyInstructionPredicates(
211 : const MCInst &Inst, uint64_t AvailableFeatures) const {
212 : #ifndef NDEBUG
213 : static uint64_t RequiredFeatures[] = {
214 : 0, // PHI = 0
215 : 0, // INLINEASM = 1
216 : 0, // CFI_INSTRUCTION = 2
217 : 0, // EH_LABEL = 3
218 : 0, // GC_LABEL = 4
219 : 0, // KILL = 5
220 : 0, // EXTRACT_SUBREG = 6
221 : 0, // INSERT_SUBREG = 7
222 : 0, // IMPLICIT_DEF = 8
223 : 0, // SUBREG_TO_REG = 9
224 : 0, // COPY_TO_REGCLASS = 10
225 : 0, // DBG_VALUE = 11
226 : 0, // REG_SEQUENCE = 12
227 : 0, // COPY = 13
228 : 0, // BUNDLE = 14
229 : 0, // LIFETIME_START = 15
230 : 0, // LIFETIME_END = 16
231 : 0, // STACKMAP = 17
232 : 0, // FENTRY_CALL = 18
233 : 0, // PATCHPOINT = 19
234 : 0, // LOAD_STACK_GUARD = 20
235 : 0, // STATEPOINT = 21
236 : 0, // LOCAL_ESCAPE = 22
237 : 0, // FAULTING_OP = 23
238 : 0, // PATCHABLE_OP = 24
239 : 0, // PATCHABLE_FUNCTION_ENTER = 25
240 : 0, // PATCHABLE_RET = 26
241 : 0, // PATCHABLE_FUNCTION_EXIT = 27
242 : 0, // PATCHABLE_TAIL_CALL = 28
243 : 0, // PATCHABLE_EVENT_CALL = 29
244 : 0, // G_ADD = 30
245 : 0, // G_SUB = 31
246 : 0, // G_MUL = 32
247 : 0, // G_SDIV = 33
248 : 0, // G_UDIV = 34
249 : 0, // G_SREM = 35
250 : 0, // G_UREM = 36
251 : 0, // G_AND = 37
252 : 0, // G_OR = 38
253 : 0, // G_XOR = 39
254 : 0, // G_IMPLICIT_DEF = 40
255 : 0, // G_FRAME_INDEX = 41
256 : 0, // G_GLOBAL_VALUE = 42
257 : 0, // G_EXTRACT = 43
258 : 0, // G_UNMERGE_VALUES = 44
259 : 0, // G_INSERT = 45
260 : 0, // G_MERGE_VALUES = 46
261 : 0, // G_PTRTOINT = 47
262 : 0, // G_INTTOPTR = 48
263 : 0, // G_BITCAST = 49
264 : 0, // G_LOAD = 50
265 : 0, // G_STORE = 51
266 : 0, // G_BRCOND = 52
267 : 0, // G_BRINDIRECT = 53
268 : 0, // G_INTRINSIC = 54
269 : 0, // G_INTRINSIC_W_SIDE_EFFECTS = 55
270 : 0, // G_ANYEXT = 56
271 : 0, // G_TRUNC = 57
272 : 0, // G_CONSTANT = 58
273 : 0, // G_FCONSTANT = 59
274 : 0, // G_VASTART = 60
275 : 0, // G_VAARG = 61
276 : 0, // G_SEXT = 62
277 : 0, // G_ZEXT = 63
278 : 0, // G_SHL = 64
279 : 0, // G_LSHR = 65
280 : 0, // G_ASHR = 66
281 : 0, // G_ICMP = 67
282 : 0, // G_FCMP = 68
283 : 0, // G_SELECT = 69
284 : 0, // G_UADDE = 70
285 : 0, // G_USUBE = 71
286 : 0, // G_SADDO = 72
287 : 0, // G_SSUBO = 73
288 : 0, // G_UMULO = 74
289 : 0, // G_SMULO = 75
290 : 0, // G_UMULH = 76
291 : 0, // G_SMULH = 77
292 : 0, // G_FADD = 78
293 : 0, // G_FSUB = 79
294 : 0, // G_FMUL = 80
295 : 0, // G_FMA = 81
296 : 0, // G_FDIV = 82
297 : 0, // G_FREM = 83
298 : 0, // G_FPOW = 84
299 : 0, // G_FEXP = 85
300 : 0, // G_FEXP2 = 86
301 : 0, // G_FLOG = 87
302 : 0, // G_FLOG2 = 88
303 : 0, // G_FNEG = 89
304 : 0, // G_FPEXT = 90
305 : 0, // G_FPTRUNC = 91
306 : 0, // G_FPTOSI = 92
307 : 0, // G_FPTOUI = 93
308 : 0, // G_SITOFP = 94
309 : 0, // G_UITOFP = 95
310 : 0, // G_GEP = 96
311 : 0, // G_PTR_MASK = 97
312 : 0, // G_BR = 98
313 : 0, // G_INSERT_VECTOR_ELT = 99
314 : 0, // G_EXTRACT_VECTOR_ELT = 100
315 : 0, // G_SHUFFLE_VECTOR = 101
316 : 0, // ADD = 102
317 : 0, // ADDI = 103
318 : 0, // AND = 104
319 : 0, // ANDI = 105
320 : 0, // OR = 106
321 : 0, // ORI = 107
322 : 0, // SLL = 108
323 : 0, // SLT = 109
324 : 0, // SLTI = 110
325 : 0, // SLTIU = 111
326 : 0, // SLTU = 112
327 : 0, // SRA = 113
328 : 0, // SRL = 114
329 : 0, // SUB = 115
330 : 0, // XOR = 116
331 : 0, // XORI = 117
332 : };
333 :
334 : assert(Inst.getOpcode() < 118);
335 : uint64_t MissingFeatures =
336 : (AvailableFeatures & RequiredFeatures[Inst.getOpcode()]) ^
337 : RequiredFeatures[Inst.getOpcode()];
338 : if (MissingFeatures) {
339 : std::ostringstream Msg;
340 : Msg << "Attempting to emit " << MCII.getName(Inst.getOpcode()).str()
341 : << " instruction but the ";
342 : for (unsigned i = 0; i < 8 * sizeof(MissingFeatures); ++i)
343 : if (MissingFeatures & (1ULL << i))
344 : Msg << SubtargetFeatureNames[i] << " ";
345 : Msg << "predicate(s) are not met";
346 : report_fatal_error(Msg.str());
347 : }
348 : #else
349 : // Silence unused variable warning on targets that don't use MCII for other purposes (e.g. BPF).
350 : (void)MCII;
351 : #endif // NDEBUG
352 : }
353 : #endif
|