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 LanaiMCCodeEmitter::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(0),
120 : UINT64_C(0),
121 : UINT64_C(0),
122 : UINT64_C(0),
123 : UINT64_C(0),
124 : UINT64_C(0),
125 : UINT64_C(0),
126 : UINT64_C(0),
127 : UINT64_C(0),
128 : UINT64_C(0),
129 : UINT64_C(0),
130 : UINT64_C(0),
131 : UINT64_C(0),
132 : UINT64_C(0),
133 : UINT64_C(0),
134 : UINT64_C(0),
135 : UINT64_C(0),
136 : UINT64_C(0),
137 : UINT64_C(0),
138 : UINT64_C(0),
139 : UINT64_C(0),
140 : UINT64_C(0),
141 : UINT64_C(0),
142 : UINT64_C(0),
143 : UINT64_C(0),
144 : UINT64_C(0),
145 : UINT64_C(0),
146 : UINT64_C(0),
147 : UINT64_C(0),
148 : UINT64_C(0),
149 : UINT64_C(0),
150 : UINT64_C(0),
151 : UINT64_C(0),
152 : UINT64_C(0),
153 : UINT64_C(0),
154 : UINT64_C(0),
155 : UINT64_C(0),
156 : UINT64_C(0),
157 : UINT64_C(0),
158 : UINT64_C(0),
159 : UINT64_C(268632064), // ADDC_F_I_HI
160 : UINT64_C(268566528), // ADDC_F_I_LO
161 : UINT64_C(3221356800), // ADDC_F_R
162 : UINT64_C(268500992), // ADDC_I_HI
163 : UINT64_C(268435456), // ADDC_I_LO
164 : UINT64_C(3221225728), // ADDC_R
165 : UINT64_C(196608), // ADD_F_I_HI
166 : UINT64_C(131072), // ADD_F_I_LO
167 : UINT64_C(3221356544), // ADD_F_R
168 : UINT64_C(65536), // ADD_I_HI
169 : UINT64_C(0), // ADD_I_LO
170 : UINT64_C(3221225472), // ADD_R
171 : UINT64_C(1073938432), // AND_F_I_HI
172 : UINT64_C(1073872896), // AND_F_I_LO
173 : UINT64_C(3221357568), // AND_F_R
174 : UINT64_C(1073807360), // AND_I_HI
175 : UINT64_C(1073741824), // AND_I_LO
176 : UINT64_C(3221226496), // AND_R
177 : UINT64_C(3758096384), // BRCC
178 : UINT64_C(3238003968), // BRIND_CC
179 : UINT64_C(3238003968), // BRIND_CCA
180 : UINT64_C(3774873602), // BRR
181 : UINT64_C(3758096384), // BT
182 : UINT64_C(3238003968), // JR
183 : UINT64_C(4026531840), // LDADDR
184 : UINT64_C(4026744832), // LDBs_RI
185 : UINT64_C(2684354564), // LDBs_RR
186 : UINT64_C(4026748928), // LDBz_RI
187 : UINT64_C(2684354565), // LDBz_RR
188 : UINT64_C(4026728448), // LDHs_RI
189 : UINT64_C(2684354560), // LDHs_RR
190 : UINT64_C(4026732544), // LDHz_RI
191 : UINT64_C(2684354561), // LDHz_RR
192 : UINT64_C(2147483648), // LDW_RI
193 : UINT64_C(2684354562), // LDW_RR
194 : UINT64_C(2684354563), // LDWz_RR
195 : UINT64_C(3489660930), // LEADZ
196 : UINT64_C(2), // LOG0
197 : UINT64_C(3), // LOG1
198 : UINT64_C(4), // LOG2
199 : UINT64_C(5), // LOG3
200 : UINT64_C(6), // LOG4
201 : UINT64_C(65536), // MOVHI
202 : UINT64_C(1), // NOP
203 : UINT64_C(1342373888), // OR_F_I_HI
204 : UINT64_C(1342308352), // OR_F_I_LO
205 : UINT64_C(3221357824), // OR_F_R
206 : UINT64_C(1342242816), // OR_I_HI
207 : UINT64_C(1342177280), // OR_I_LO
208 : UINT64_C(3221226752), // OR_R
209 : UINT64_C(3489660929), // POPC
210 : UINT64_C(2165768188), // RET
211 : UINT64_C(1879244800), // SA_F_I
212 : UINT64_C(1879113728), // SA_I
213 : UINT64_C(3758096386), // SCC
214 : UINT64_C(3221227264), // SELECT
215 : UINT64_C(537067520), // SFSUB_F_RI_HI
216 : UINT64_C(537001984), // SFSUB_F_RI_LO
217 : UINT64_C(3221357056), // SFSUB_F_RR
218 : UINT64_C(3221358464), // SHL_F_R
219 : UINT64_C(3221227392), // SHL_R
220 : UINT64_C(4026662912), // SLI
221 : UINT64_C(1879179264), // SL_F_I
222 : UINT64_C(1879048192), // SL_I
223 : UINT64_C(3221358528), // SRA_F_R
224 : UINT64_C(3221227456), // SRA_R
225 : UINT64_C(3221358464), // SRL_F_R
226 : UINT64_C(3221227392), // SRL_R
227 : UINT64_C(4026597376), // STADDR
228 : UINT64_C(4026753024), // STB_RI
229 : UINT64_C(2952790020), // STB_RR
230 : UINT64_C(4026736640), // STH_RI
231 : UINT64_C(2952790016), // STH_RR
232 : UINT64_C(805502976), // SUBB_F_I_HI
233 : UINT64_C(805437440), // SUBB_F_I_LO
234 : UINT64_C(3221357312), // SUBB_F_R
235 : UINT64_C(805371904), // SUBB_I_HI
236 : UINT64_C(805306368), // SUBB_I_LO
237 : UINT64_C(3221226240), // SUBB_R
238 : UINT64_C(537067520), // SUB_F_I_HI
239 : UINT64_C(537001984), // SUB_F_I_LO
240 : UINT64_C(3221357056), // SUB_F_R
241 : UINT64_C(536936448), // SUB_I_HI
242 : UINT64_C(536870912), // SUB_I_LO
243 : UINT64_C(3221225984), // SUB_R
244 : UINT64_C(2415919104), // SW_RI
245 : UINT64_C(2952790018), // SW_RR
246 : UINT64_C(3489660931), // TRAILZ
247 : UINT64_C(1610809344), // XOR_F_I_HI
248 : UINT64_C(1610743808), // XOR_F_I_LO
249 : UINT64_C(3221358080), // XOR_F_R
250 : UINT64_C(1610678272), // XOR_I_HI
251 : UINT64_C(1610612736), // XOR_I_LO
252 : UINT64_C(3221227008), // XOR_R
253 : UINT64_C(0)
254 : };
255 0 : const unsigned opcode = MI.getOpcode();
256 0 : uint64_t Value = InstBits[opcode];
257 : uint64_t op = 0;
258 : (void)op; // suppress warning
259 0 : switch (opcode) {
260 : case Lanai::LOG0:
261 : case Lanai::LOG1:
262 : case Lanai::LOG2:
263 : case Lanai::LOG3:
264 : case Lanai::LOG4:
265 : case Lanai::NOP:
266 : case Lanai::RET: {
267 : break;
268 : }
269 : case Lanai::BRR: {
270 : // op: DDDI
271 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
272 0 : Value |= (op & UINT64_C(14)) << 24;
273 0 : Value |= op & UINT64_C(1);
274 : // op: imm16
275 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
276 0 : Value |= op & UINT64_C(65532);
277 0 : break;
278 : }
279 : case Lanai::STB_RI:
280 : case Lanai::STH_RI: {
281 : // op: Rd
282 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
283 0 : Value |= (op & UINT64_C(31)) << 23;
284 : // op: P
285 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
286 0 : Value |= (op & UINT64_C(1)) << 11;
287 : // op: Q
288 0 : op = getSplsOpValue(MI, 1, Fixups, STI);
289 0 : Value |= (op & UINT64_C(1)) << 10;
290 : // op: dst
291 0 : op = getSplsOpValue(MI, 1, Fixups, STI);
292 0 : Value |= (op & UINT64_C(126976)) << 6;
293 0 : Value |= op & UINT64_C(1023);
294 0 : Value = adjustPqBitsSpls(MI, Value, STI);
295 0 : break;
296 : }
297 : case Lanai::LDBs_RI:
298 : case Lanai::LDBz_RI:
299 : case Lanai::LDHs_RI:
300 : case Lanai::LDHz_RI: {
301 : // op: Rd
302 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
303 0 : Value |= (op & UINT64_C(31)) << 23;
304 : // op: P
305 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
306 0 : Value |= (op & UINT64_C(1)) << 11;
307 : // op: Q
308 0 : op = getSplsOpValue(MI, 1, Fixups, STI);
309 0 : Value |= (op & UINT64_C(1)) << 10;
310 : // op: src
311 0 : op = getSplsOpValue(MI, 1, Fixups, STI);
312 0 : Value |= (op & UINT64_C(126976)) << 6;
313 0 : Value |= op & UINT64_C(1023);
314 0 : Value = adjustPqBitsSpls(MI, Value, STI);
315 0 : break;
316 : }
317 : case Lanai::SW_RI: {
318 : // op: Rd
319 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
320 0 : Value |= (op & UINT64_C(31)) << 23;
321 : // op: P
322 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
323 0 : Value |= (op & UINT64_C(1)) << 17;
324 : // op: Q
325 0 : op = getRiMemoryOpValue(MI, 1, Fixups, STI);
326 0 : Value |= (op & UINT64_C(1)) << 16;
327 : // op: dst
328 0 : op = getRiMemoryOpValue(MI, 1, Fixups, STI);
329 0 : Value |= op & UINT64_C(8126464);
330 0 : Value |= op & UINT64_C(65535);
331 0 : Value = adjustPqBitsRmAndRrm(MI, Value, STI);
332 0 : break;
333 : }
334 : case Lanai::LDW_RI: {
335 : // op: Rd
336 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
337 0 : Value |= (op & UINT64_C(31)) << 23;
338 : // op: P
339 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
340 0 : Value |= (op & UINT64_C(1)) << 17;
341 : // op: Q
342 0 : op = getRiMemoryOpValue(MI, 1, Fixups, STI);
343 0 : Value |= (op & UINT64_C(1)) << 16;
344 : // op: src
345 0 : op = getRiMemoryOpValue(MI, 1, Fixups, STI);
346 0 : Value |= op & UINT64_C(8126464);
347 0 : Value |= op & UINT64_C(65535);
348 0 : Value = adjustPqBitsRmAndRrm(MI, Value, STI);
349 0 : break;
350 : }
351 : case Lanai::STB_RR:
352 : case Lanai::STH_RR:
353 : case Lanai::SW_RR: {
354 : // op: Rd
355 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
356 0 : Value |= (op & UINT64_C(31)) << 23;
357 : // op: P
358 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
359 0 : Value |= (op & UINT64_C(1)) << 17;
360 : // op: Q
361 0 : op = getRrMemoryOpValue(MI, 1, Fixups, STI);
362 0 : Value |= (op & UINT64_C(1)) << 16;
363 : // op: dst
364 : op = getRrMemoryOpValue(MI, 1, Fixups, STI);
365 0 : Value |= (op & UINT64_C(1015808)) << 3;
366 0 : Value |= (op & UINT64_C(31744)) << 1;
367 0 : Value |= (op & UINT64_C(255)) << 3;
368 0 : Value = adjustPqBitsRmAndRrm(MI, Value, STI);
369 0 : break;
370 : }
371 : case Lanai::LDBs_RR:
372 : case Lanai::LDBz_RR:
373 : case Lanai::LDHs_RR:
374 : case Lanai::LDHz_RR:
375 : case Lanai::LDW_RR:
376 : case Lanai::LDWz_RR: {
377 : // op: Rd
378 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
379 0 : Value |= (op & UINT64_C(31)) << 23;
380 : // op: P
381 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
382 0 : Value |= (op & UINT64_C(1)) << 17;
383 : // op: Q
384 0 : op = getRrMemoryOpValue(MI, 1, Fixups, STI);
385 0 : Value |= (op & UINT64_C(1)) << 16;
386 : // op: src
387 : op = getRrMemoryOpValue(MI, 1, Fixups, STI);
388 0 : Value |= (op & UINT64_C(1015808)) << 3;
389 0 : Value |= (op & UINT64_C(31744)) << 1;
390 0 : Value |= (op & UINT64_C(255)) << 3;
391 0 : Value = adjustPqBitsRmAndRrm(MI, Value, STI);
392 0 : break;
393 : }
394 : case Lanai::LEADZ:
395 : case Lanai::POPC:
396 : case Lanai::TRAILZ: {
397 : // op: Rd
398 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
399 0 : Value |= (op & UINT64_C(31)) << 23;
400 : // op: Rs1
401 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
402 0 : Value |= (op & UINT64_C(31)) << 18;
403 0 : break;
404 : }
405 : case Lanai::ADDC_F_R:
406 : case Lanai::ADDC_R:
407 : case Lanai::ADD_F_R:
408 : case Lanai::ADD_R:
409 : case Lanai::AND_F_R:
410 : case Lanai::AND_R:
411 : case Lanai::OR_F_R:
412 : case Lanai::OR_R:
413 : case Lanai::SELECT:
414 : case Lanai::SHL_F_R:
415 : case Lanai::SHL_R:
416 : case Lanai::SRA_F_R:
417 : case Lanai::SRA_R:
418 : case Lanai::SRL_F_R:
419 : case Lanai::SRL_R:
420 : case Lanai::SUBB_F_R:
421 : case Lanai::SUBB_R:
422 : case Lanai::SUB_F_R:
423 : case Lanai::SUB_R:
424 : case Lanai::XOR_F_R:
425 : case Lanai::XOR_R: {
426 : // op: Rd
427 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
428 0 : Value |= (op & UINT64_C(31)) << 23;
429 : // op: Rs1
430 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
431 0 : Value |= (op & UINT64_C(31)) << 18;
432 : // op: Rs2
433 0 : op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
434 0 : Value |= (op & UINT64_C(31)) << 11;
435 : // op: DDDI
436 0 : op = getMachineOpValue(MI, MI.getOperand(3), Fixups, STI);
437 0 : Value |= (op & UINT64_C(1)) << 16;
438 0 : Value |= (op & UINT64_C(14)) >> 1;
439 0 : break;
440 : }
441 : case Lanai::ADDC_F_I_HI:
442 : case Lanai::ADDC_F_I_LO:
443 : case Lanai::ADDC_I_HI:
444 : case Lanai::ADDC_I_LO:
445 : case Lanai::ADD_F_I_HI:
446 : case Lanai::ADD_F_I_LO:
447 : case Lanai::ADD_I_HI:
448 : case Lanai::ADD_I_LO:
449 : case Lanai::AND_F_I_HI:
450 : case Lanai::AND_F_I_LO:
451 : case Lanai::AND_I_HI:
452 : case Lanai::AND_I_LO:
453 : case Lanai::OR_F_I_HI:
454 : case Lanai::OR_F_I_LO:
455 : case Lanai::OR_I_HI:
456 : case Lanai::OR_I_LO:
457 : case Lanai::SA_F_I:
458 : case Lanai::SA_I:
459 : case Lanai::SL_F_I:
460 : case Lanai::SL_I:
461 : case Lanai::SUBB_F_I_HI:
462 : case Lanai::SUBB_F_I_LO:
463 : case Lanai::SUBB_I_HI:
464 : case Lanai::SUBB_I_LO:
465 : case Lanai::SUB_F_I_HI:
466 : case Lanai::SUB_F_I_LO:
467 : case Lanai::SUB_I_HI:
468 : case Lanai::SUB_I_LO:
469 : case Lanai::XOR_F_I_HI:
470 : case Lanai::XOR_F_I_LO:
471 : case Lanai::XOR_I_HI:
472 : case Lanai::XOR_I_LO: {
473 : // op: Rd
474 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
475 0 : Value |= (op & UINT64_C(31)) << 23;
476 : // op: Rs1
477 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
478 0 : Value |= (op & UINT64_C(31)) << 18;
479 : // op: imm16
480 0 : op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
481 0 : Value |= op & UINT64_C(65535);
482 0 : break;
483 : }
484 : case Lanai::STADDR: {
485 : // op: Rd
486 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
487 0 : Value |= (op & UINT64_C(31)) << 23;
488 : // op: dst
489 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
490 0 : Value |= (op & UINT64_C(2031616)) << 2;
491 0 : Value |= op & UINT64_C(65535);
492 0 : break;
493 : }
494 : case Lanai::SLI: {
495 : // op: Rd
496 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
497 0 : Value |= (op & UINT64_C(31)) << 23;
498 : // op: imm
499 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
500 0 : Value |= (op & UINT64_C(2031616)) << 2;
501 0 : Value |= op & UINT64_C(65535);
502 0 : break;
503 : }
504 : case Lanai::MOVHI: {
505 : // op: Rd
506 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
507 0 : Value |= (op & UINT64_C(31)) << 23;
508 : // op: imm16
509 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
510 0 : Value |= op & UINT64_C(65535);
511 0 : break;
512 : }
513 : case Lanai::LDADDR: {
514 : // op: Rd
515 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
516 0 : Value |= (op & UINT64_C(31)) << 23;
517 : // op: src
518 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
519 0 : Value |= (op & UINT64_C(2031616)) << 2;
520 0 : Value |= op & UINT64_C(65535);
521 0 : break;
522 : }
523 : case Lanai::BRIND_CC: {
524 : // op: Rs1
525 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
526 0 : Value |= (op & UINT64_C(31)) << 18;
527 : // op: DDDI
528 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
529 0 : Value |= (op & UINT64_C(1)) << 16;
530 0 : Value |= (op & UINT64_C(14)) >> 1;
531 0 : break;
532 : }
533 : case Lanai::SCC: {
534 : // op: Rs1
535 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
536 0 : Value |= (op & UINT64_C(31)) << 18;
537 : // op: DDDI
538 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
539 0 : Value |= (op & UINT64_C(14)) << 24;
540 0 : Value |= op & UINT64_C(1);
541 0 : break;
542 : }
543 : case Lanai::SFSUB_F_RR: {
544 : // op: Rs1
545 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
546 0 : Value |= (op & UINT64_C(31)) << 18;
547 : // op: Rs2
548 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
549 0 : Value |= (op & UINT64_C(31)) << 11;
550 0 : break;
551 : }
552 : case Lanai::BRIND_CCA: {
553 : // op: Rs1
554 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
555 0 : Value |= (op & UINT64_C(31)) << 18;
556 : // op: Rs2
557 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
558 0 : Value |= (op & UINT64_C(31)) << 11;
559 : // op: DDDI
560 0 : op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
561 0 : Value |= (op & UINT64_C(1)) << 16;
562 0 : Value |= (op & UINT64_C(14)) >> 1;
563 0 : break;
564 : }
565 : case Lanai::SFSUB_F_RI_HI:
566 : case Lanai::SFSUB_F_RI_LO: {
567 : // op: Rs1
568 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
569 0 : Value |= (op & UINT64_C(31)) << 18;
570 : // op: imm16
571 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
572 0 : Value |= op & UINT64_C(65535);
573 0 : break;
574 : }
575 : case Lanai::JR: {
576 : // op: Rs2
577 0 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
578 0 : Value |= (op & UINT64_C(31)) << 11;
579 0 : break;
580 : }
581 0 : case Lanai::BT: {
582 : // op: addr
583 0 : op = getBranchTargetOpValue(MI, 0, Fixups, STI);
584 0 : Value |= op & UINT64_C(33554428);
585 0 : break;
586 : }
587 0 : case Lanai::BRCC: {
588 : // op: addr
589 0 : op = getBranchTargetOpValue(MI, 0, Fixups, STI);
590 0 : Value |= op & UINT64_C(33554428);
591 : // op: DDDI
592 0 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
593 0 : Value |= (op & UINT64_C(14)) << 24;
594 0 : Value |= op & UINT64_C(1);
595 0 : break;
596 : }
597 : default:
598 : std::string msg;
599 : raw_string_ostream Msg(msg);
600 0 : Msg << "Not supported instr: " << MI;
601 0 : report_fatal_error(Msg.str());
602 : }
603 0 : return Value;
604 : }
605 :
606 : #ifdef ENABLE_INSTR_PREDICATE_VERIFIER
607 : #undef ENABLE_INSTR_PREDICATE_VERIFIER
608 : #include <sstream>
609 :
610 : // Flags for subtarget features that participate in instruction matching.
611 : enum SubtargetFeatureFlag : uint8_t {
612 : Feature_None = 0
613 : };
614 :
615 : #ifndef NDEBUG
616 : static const char *SubtargetFeatureNames[] = {
617 : nullptr
618 : };
619 :
620 : #endif // NDEBUG
621 : uint64_t LanaiMCCodeEmitter::
622 : computeAvailableFeatures(const FeatureBitset& FB) const {
623 : uint64_t Features = 0;
624 : return Features;
625 : }
626 :
627 : void LanaiMCCodeEmitter::verifyInstructionPredicates(
628 : const MCInst &Inst, uint64_t AvailableFeatures) const {
629 : #ifndef NDEBUG
630 : static uint64_t RequiredFeatures[] = {
631 : 0, // PHI = 0
632 : 0, // INLINEASM = 1
633 : 0, // CFI_INSTRUCTION = 2
634 : 0, // EH_LABEL = 3
635 : 0, // GC_LABEL = 4
636 : 0, // ANNOTATION_LABEL = 5
637 : 0, // KILL = 6
638 : 0, // EXTRACT_SUBREG = 7
639 : 0, // INSERT_SUBREG = 8
640 : 0, // IMPLICIT_DEF = 9
641 : 0, // SUBREG_TO_REG = 10
642 : 0, // COPY_TO_REGCLASS = 11
643 : 0, // DBG_VALUE = 12
644 : 0, // DBG_LABEL = 13
645 : 0, // REG_SEQUENCE = 14
646 : 0, // COPY = 15
647 : 0, // BUNDLE = 16
648 : 0, // LIFETIME_START = 17
649 : 0, // LIFETIME_END = 18
650 : 0, // STACKMAP = 19
651 : 0, // FENTRY_CALL = 20
652 : 0, // PATCHPOINT = 21
653 : 0, // LOAD_STACK_GUARD = 22
654 : 0, // STATEPOINT = 23
655 : 0, // LOCAL_ESCAPE = 24
656 : 0, // FAULTING_OP = 25
657 : 0, // PATCHABLE_OP = 26
658 : 0, // PATCHABLE_FUNCTION_ENTER = 27
659 : 0, // PATCHABLE_RET = 28
660 : 0, // PATCHABLE_FUNCTION_EXIT = 29
661 : 0, // PATCHABLE_TAIL_CALL = 30
662 : 0, // PATCHABLE_EVENT_CALL = 31
663 : 0, // PATCHABLE_TYPED_EVENT_CALL = 32
664 : 0, // ICALL_BRANCH_FUNNEL = 33
665 : 0, // G_ADD = 34
666 : 0, // G_SUB = 35
667 : 0, // G_MUL = 36
668 : 0, // G_SDIV = 37
669 : 0, // G_UDIV = 38
670 : 0, // G_SREM = 39
671 : 0, // G_UREM = 40
672 : 0, // G_AND = 41
673 : 0, // G_OR = 42
674 : 0, // G_XOR = 43
675 : 0, // G_IMPLICIT_DEF = 44
676 : 0, // G_PHI = 45
677 : 0, // G_FRAME_INDEX = 46
678 : 0, // G_GLOBAL_VALUE = 47
679 : 0, // G_EXTRACT = 48
680 : 0, // G_UNMERGE_VALUES = 49
681 : 0, // G_INSERT = 50
682 : 0, // G_MERGE_VALUES = 51
683 : 0, // G_PTRTOINT = 52
684 : 0, // G_INTTOPTR = 53
685 : 0, // G_BITCAST = 54
686 : 0, // G_INTRINSIC_TRUNC = 55
687 : 0, // G_INTRINSIC_ROUND = 56
688 : 0, // G_LOAD = 57
689 : 0, // G_SEXTLOAD = 58
690 : 0, // G_ZEXTLOAD = 59
691 : 0, // G_STORE = 60
692 : 0, // G_ATOMIC_CMPXCHG_WITH_SUCCESS = 61
693 : 0, // G_ATOMIC_CMPXCHG = 62
694 : 0, // G_ATOMICRMW_XCHG = 63
695 : 0, // G_ATOMICRMW_ADD = 64
696 : 0, // G_ATOMICRMW_SUB = 65
697 : 0, // G_ATOMICRMW_AND = 66
698 : 0, // G_ATOMICRMW_NAND = 67
699 : 0, // G_ATOMICRMW_OR = 68
700 : 0, // G_ATOMICRMW_XOR = 69
701 : 0, // G_ATOMICRMW_MAX = 70
702 : 0, // G_ATOMICRMW_MIN = 71
703 : 0, // G_ATOMICRMW_UMAX = 72
704 : 0, // G_ATOMICRMW_UMIN = 73
705 : 0, // G_BRCOND = 74
706 : 0, // G_BRINDIRECT = 75
707 : 0, // G_INTRINSIC = 76
708 : 0, // G_INTRINSIC_W_SIDE_EFFECTS = 77
709 : 0, // G_ANYEXT = 78
710 : 0, // G_TRUNC = 79
711 : 0, // G_CONSTANT = 80
712 : 0, // G_FCONSTANT = 81
713 : 0, // G_VASTART = 82
714 : 0, // G_VAARG = 83
715 : 0, // G_SEXT = 84
716 : 0, // G_ZEXT = 85
717 : 0, // G_SHL = 86
718 : 0, // G_LSHR = 87
719 : 0, // G_ASHR = 88
720 : 0, // G_ICMP = 89
721 : 0, // G_FCMP = 90
722 : 0, // G_SELECT = 91
723 : 0, // G_UADDO = 92
724 : 0, // G_UADDE = 93
725 : 0, // G_USUBO = 94
726 : 0, // G_USUBE = 95
727 : 0, // G_SADDO = 96
728 : 0, // G_SADDE = 97
729 : 0, // G_SSUBO = 98
730 : 0, // G_SSUBE = 99
731 : 0, // G_UMULO = 100
732 : 0, // G_SMULO = 101
733 : 0, // G_UMULH = 102
734 : 0, // G_SMULH = 103
735 : 0, // G_FADD = 104
736 : 0, // G_FSUB = 105
737 : 0, // G_FMUL = 106
738 : 0, // G_FMA = 107
739 : 0, // G_FDIV = 108
740 : 0, // G_FREM = 109
741 : 0, // G_FPOW = 110
742 : 0, // G_FEXP = 111
743 : 0, // G_FEXP2 = 112
744 : 0, // G_FLOG = 113
745 : 0, // G_FLOG2 = 114
746 : 0, // G_FNEG = 115
747 : 0, // G_FPEXT = 116
748 : 0, // G_FPTRUNC = 117
749 : 0, // G_FPTOSI = 118
750 : 0, // G_FPTOUI = 119
751 : 0, // G_SITOFP = 120
752 : 0, // G_UITOFP = 121
753 : 0, // G_FABS = 122
754 : 0, // G_GEP = 123
755 : 0, // G_PTR_MASK = 124
756 : 0, // G_BR = 125
757 : 0, // G_INSERT_VECTOR_ELT = 126
758 : 0, // G_EXTRACT_VECTOR_ELT = 127
759 : 0, // G_SHUFFLE_VECTOR = 128
760 : 0, // G_CTTZ = 129
761 : 0, // G_CTTZ_ZERO_UNDEF = 130
762 : 0, // G_CTLZ = 131
763 : 0, // G_CTLZ_ZERO_UNDEF = 132
764 : 0, // G_CTPOP = 133
765 : 0, // G_BSWAP = 134
766 : 0, // G_ADDRSPACE_CAST = 135
767 : 0, // G_BLOCK_ADDR = 136
768 : 0, // ADJCALLSTACKDOWN = 137
769 : 0, // ADJCALLSTACKUP = 138
770 : 0, // ADJDYNALLOC = 139
771 : 0, // CALL = 140
772 : 0, // CALLR = 141
773 : 0, // ADDC_F_I_HI = 142
774 : 0, // ADDC_F_I_LO = 143
775 : 0, // ADDC_F_R = 144
776 : 0, // ADDC_I_HI = 145
777 : 0, // ADDC_I_LO = 146
778 : 0, // ADDC_R = 147
779 : 0, // ADD_F_I_HI = 148
780 : 0, // ADD_F_I_LO = 149
781 : 0, // ADD_F_R = 150
782 : 0, // ADD_I_HI = 151
783 : 0, // ADD_I_LO = 152
784 : 0, // ADD_R = 153
785 : 0, // AND_F_I_HI = 154
786 : 0, // AND_F_I_LO = 155
787 : 0, // AND_F_R = 156
788 : 0, // AND_I_HI = 157
789 : 0, // AND_I_LO = 158
790 : 0, // AND_R = 159
791 : 0, // BRCC = 160
792 : 0, // BRIND_CC = 161
793 : 0, // BRIND_CCA = 162
794 : 0, // BRR = 163
795 : 0, // BT = 164
796 : 0, // JR = 165
797 : 0, // LDADDR = 166
798 : 0, // LDBs_RI = 167
799 : 0, // LDBs_RR = 168
800 : 0, // LDBz_RI = 169
801 : 0, // LDBz_RR = 170
802 : 0, // LDHs_RI = 171
803 : 0, // LDHs_RR = 172
804 : 0, // LDHz_RI = 173
805 : 0, // LDHz_RR = 174
806 : 0, // LDW_RI = 175
807 : 0, // LDW_RR = 176
808 : 0, // LDWz_RR = 177
809 : 0, // LEADZ = 178
810 : 0, // LOG0 = 179
811 : 0, // LOG1 = 180
812 : 0, // LOG2 = 181
813 : 0, // LOG3 = 182
814 : 0, // LOG4 = 183
815 : 0, // MOVHI = 184
816 : 0, // NOP = 185
817 : 0, // OR_F_I_HI = 186
818 : 0, // OR_F_I_LO = 187
819 : 0, // OR_F_R = 188
820 : 0, // OR_I_HI = 189
821 : 0, // OR_I_LO = 190
822 : 0, // OR_R = 191
823 : 0, // POPC = 192
824 : 0, // RET = 193
825 : 0, // SA_F_I = 194
826 : 0, // SA_I = 195
827 : 0, // SCC = 196
828 : 0, // SELECT = 197
829 : 0, // SFSUB_F_RI_HI = 198
830 : 0, // SFSUB_F_RI_LO = 199
831 : 0, // SFSUB_F_RR = 200
832 : 0, // SHL_F_R = 201
833 : 0, // SHL_R = 202
834 : 0, // SLI = 203
835 : 0, // SL_F_I = 204
836 : 0, // SL_I = 205
837 : 0, // SRA_F_R = 206
838 : 0, // SRA_R = 207
839 : 0, // SRL_F_R = 208
840 : 0, // SRL_R = 209
841 : 0, // STADDR = 210
842 : 0, // STB_RI = 211
843 : 0, // STB_RR = 212
844 : 0, // STH_RI = 213
845 : 0, // STH_RR = 214
846 : 0, // SUBB_F_I_HI = 215
847 : 0, // SUBB_F_I_LO = 216
848 : 0, // SUBB_F_R = 217
849 : 0, // SUBB_I_HI = 218
850 : 0, // SUBB_I_LO = 219
851 : 0, // SUBB_R = 220
852 : 0, // SUB_F_I_HI = 221
853 : 0, // SUB_F_I_LO = 222
854 : 0, // SUB_F_R = 223
855 : 0, // SUB_I_HI = 224
856 : 0, // SUB_I_LO = 225
857 : 0, // SUB_R = 226
858 : 0, // SW_RI = 227
859 : 0, // SW_RR = 228
860 : 0, // TRAILZ = 229
861 : 0, // XOR_F_I_HI = 230
862 : 0, // XOR_F_I_LO = 231
863 : 0, // XOR_F_R = 232
864 : 0, // XOR_I_HI = 233
865 : 0, // XOR_I_LO = 234
866 : 0, // XOR_R = 235
867 : };
868 :
869 : assert(Inst.getOpcode() < 236);
870 : uint64_t MissingFeatures =
871 : (AvailableFeatures & RequiredFeatures[Inst.getOpcode()]) ^
872 : RequiredFeatures[Inst.getOpcode()];
873 : if (MissingFeatures) {
874 : std::ostringstream Msg;
875 : Msg << "Attempting to emit " << MCII.getName(Inst.getOpcode()).str()
876 : << " instruction but the ";
877 : for (unsigned i = 0; i < 8 * sizeof(MissingFeatures); ++i)
878 : if (MissingFeatures & (1ULL << i))
879 : Msg << SubtargetFeatureNames[i] << " ";
880 : Msg << "predicate(s) are not met";
881 : report_fatal_error(Msg.str());
882 : }
883 : #else
884 : // Silence unused variable warning on targets that don't use MCII for other purposes (e.g. BPF).
885 : (void)MCII;
886 : #endif // NDEBUG
887 : }
888 : #endif
|