1 | /*===- TableGen'erated file -------------------------------------*- C++ -*-===*\ |
2 | |* *| |
3 | |* Machine Code Emitter *| |
4 | |* *| |
5 | |* Automatically generated file, do not edit! *| |
6 | |* *| |
7 | \*===----------------------------------------------------------------------===*/ |
8 | |
9 | uint64_t LanaiMCCodeEmitter::getBinaryCodeForInstr(const MCInst &MI, |
10 | SmallVectorImpl<MCFixup> &Fixups, |
11 | const MCSubtargetInfo &STI) const { |
12 | static const uint64_t InstBits[] = { |
13 | UINT64_C(0), |
14 | UINT64_C(0), |
15 | UINT64_C(0), |
16 | UINT64_C(0), |
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(0), |
160 | UINT64_C(0), |
161 | UINT64_C(0), |
162 | UINT64_C(0), |
163 | UINT64_C(0), |
164 | UINT64_C(0), |
165 | UINT64_C(0), |
166 | UINT64_C(0), |
167 | UINT64_C(0), |
168 | UINT64_C(0), |
169 | UINT64_C(0), |
170 | UINT64_C(0), |
171 | UINT64_C(0), |
172 | UINT64_C(0), |
173 | UINT64_C(0), |
174 | UINT64_C(0), |
175 | UINT64_C(0), |
176 | UINT64_C(0), |
177 | UINT64_C(0), |
178 | UINT64_C(0), |
179 | UINT64_C(0), |
180 | UINT64_C(0), |
181 | UINT64_C(0), |
182 | UINT64_C(0), |
183 | UINT64_C(0), |
184 | UINT64_C(0), |
185 | UINT64_C(0), |
186 | UINT64_C(0), |
187 | UINT64_C(0), |
188 | UINT64_C(0), |
189 | UINT64_C(0), |
190 | UINT64_C(0), |
191 | UINT64_C(0), |
192 | UINT64_C(0), |
193 | UINT64_C(0), |
194 | UINT64_C(0), |
195 | UINT64_C(0), |
196 | UINT64_C(0), |
197 | UINT64_C(0), |
198 | UINT64_C(0), |
199 | UINT64_C(0), |
200 | UINT64_C(0), |
201 | UINT64_C(0), |
202 | UINT64_C(0), |
203 | UINT64_C(0), |
204 | UINT64_C(0), |
205 | UINT64_C(0), |
206 | UINT64_C(0), |
207 | UINT64_C(0), |
208 | UINT64_C(0), |
209 | UINT64_C(0), |
210 | UINT64_C(0), |
211 | UINT64_C(0), |
212 | UINT64_C(0), |
213 | UINT64_C(0), |
214 | UINT64_C(0), |
215 | UINT64_C(0), |
216 | UINT64_C(0), |
217 | UINT64_C(0), |
218 | UINT64_C(0), |
219 | UINT64_C(0), |
220 | UINT64_C(0), |
221 | UINT64_C(0), |
222 | UINT64_C(0), |
223 | UINT64_C(0), |
224 | UINT64_C(0), |
225 | UINT64_C(0), |
226 | UINT64_C(0), |
227 | UINT64_C(0), |
228 | UINT64_C(0), |
229 | UINT64_C(0), |
230 | UINT64_C(0), |
231 | UINT64_C(0), |
232 | UINT64_C(0), |
233 | UINT64_C(0), |
234 | UINT64_C(0), |
235 | UINT64_C(0), |
236 | UINT64_C(0), |
237 | UINT64_C(0), |
238 | UINT64_C(0), |
239 | UINT64_C(0), |
240 | UINT64_C(0), |
241 | UINT64_C(0), |
242 | UINT64_C(0), |
243 | UINT64_C(0), |
244 | UINT64_C(0), |
245 | UINT64_C(0), |
246 | UINT64_C(0), |
247 | UINT64_C(0), |
248 | UINT64_C(0), |
249 | UINT64_C(0), |
250 | UINT64_C(0), |
251 | UINT64_C(0), |
252 | UINT64_C(0), |
253 | UINT64_C(0), |
254 | UINT64_C(0), |
255 | UINT64_C(0), |
256 | UINT64_C(0), |
257 | UINT64_C(0), |
258 | UINT64_C(0), |
259 | UINT64_C(0), |
260 | UINT64_C(0), |
261 | UINT64_C(0), |
262 | UINT64_C(0), |
263 | UINT64_C(0), |
264 | UINT64_C(0), |
265 | UINT64_C(0), |
266 | UINT64_C(0), |
267 | UINT64_C(0), |
268 | UINT64_C(0), |
269 | UINT64_C(0), |
270 | UINT64_C(0), |
271 | UINT64_C(0), |
272 | UINT64_C(0), |
273 | UINT64_C(0), |
274 | UINT64_C(0), |
275 | UINT64_C(0), |
276 | UINT64_C(0), |
277 | UINT64_C(0), |
278 | UINT64_C(0), |
279 | UINT64_C(0), |
280 | UINT64_C(0), |
281 | UINT64_C(0), |
282 | UINT64_C(0), |
283 | UINT64_C(0), |
284 | UINT64_C(0), |
285 | UINT64_C(0), |
286 | UINT64_C(0), |
287 | UINT64_C(0), |
288 | UINT64_C(0), |
289 | UINT64_C(0), |
290 | UINT64_C(0), |
291 | UINT64_C(0), |
292 | UINT64_C(0), |
293 | UINT64_C(0), |
294 | UINT64_C(0), |
295 | UINT64_C(0), |
296 | UINT64_C(0), |
297 | UINT64_C(0), |
298 | UINT64_C(0), |
299 | UINT64_C(0), |
300 | UINT64_C(0), |
301 | UINT64_C(0), |
302 | UINT64_C(0), |
303 | UINT64_C(0), |
304 | UINT64_C(0), |
305 | UINT64_C(0), |
306 | UINT64_C(0), |
307 | UINT64_C(0), |
308 | UINT64_C(0), |
309 | UINT64_C(0), |
310 | UINT64_C(0), |
311 | UINT64_C(0), |
312 | UINT64_C(0), |
313 | UINT64_C(0), |
314 | UINT64_C(0), |
315 | UINT64_C(0), |
316 | UINT64_C(0), |
317 | UINT64_C(0), |
318 | UINT64_C(0), |
319 | UINT64_C(0), |
320 | UINT64_C(0), |
321 | UINT64_C(0), |
322 | UINT64_C(0), |
323 | UINT64_C(0), |
324 | UINT64_C(0), |
325 | UINT64_C(0), |
326 | UINT64_C(0), |
327 | UINT64_C(0), |
328 | UINT64_C(268632064), // ADDC_F_I_HI |
329 | UINT64_C(268566528), // ADDC_F_I_LO |
330 | UINT64_C(3221356800), // ADDC_F_R |
331 | UINT64_C(268500992), // ADDC_I_HI |
332 | UINT64_C(268435456), // ADDC_I_LO |
333 | UINT64_C(3221225728), // ADDC_R |
334 | UINT64_C(196608), // ADD_F_I_HI |
335 | UINT64_C(131072), // ADD_F_I_LO |
336 | UINT64_C(3221356544), // ADD_F_R |
337 | UINT64_C(65536), // ADD_I_HI |
338 | UINT64_C(0), // ADD_I_LO |
339 | UINT64_C(3221225472), // ADD_R |
340 | UINT64_C(1073938432), // AND_F_I_HI |
341 | UINT64_C(1073872896), // AND_F_I_LO |
342 | UINT64_C(3221357568), // AND_F_R |
343 | UINT64_C(1073807360), // AND_I_HI |
344 | UINT64_C(1073741824), // AND_I_LO |
345 | UINT64_C(3221226496), // AND_R |
346 | UINT64_C(3758096384), // BRCC |
347 | UINT64_C(3238003968), // BRIND_CC |
348 | UINT64_C(3238003968), // BRIND_CCA |
349 | UINT64_C(3774873602), // BRR |
350 | UINT64_C(3758096384), // BT |
351 | UINT64_C(3238003968), // JR |
352 | UINT64_C(4026531840), // LDADDR |
353 | UINT64_C(4026744832), // LDBs_RI |
354 | UINT64_C(2684354564), // LDBs_RR |
355 | UINT64_C(4026748928), // LDBz_RI |
356 | UINT64_C(2684354565), // LDBz_RR |
357 | UINT64_C(4026728448), // LDHs_RI |
358 | UINT64_C(2684354560), // LDHs_RR |
359 | UINT64_C(4026732544), // LDHz_RI |
360 | UINT64_C(2684354561), // LDHz_RR |
361 | UINT64_C(2147483648), // LDW_RI |
362 | UINT64_C(2684354562), // LDW_RR |
363 | UINT64_C(2684354563), // LDWz_RR |
364 | UINT64_C(3489660930), // LEADZ |
365 | UINT64_C(2), // LOG0 |
366 | UINT64_C(3), // LOG1 |
367 | UINT64_C(4), // LOG2 |
368 | UINT64_C(5), // LOG3 |
369 | UINT64_C(6), // LOG4 |
370 | UINT64_C(65536), // MOVHI |
371 | UINT64_C(1), // NOP |
372 | UINT64_C(1342373888), // OR_F_I_HI |
373 | UINT64_C(1342308352), // OR_F_I_LO |
374 | UINT64_C(3221357824), // OR_F_R |
375 | UINT64_C(1342242816), // OR_I_HI |
376 | UINT64_C(1342177280), // OR_I_LO |
377 | UINT64_C(3221226752), // OR_R |
378 | UINT64_C(3489660929), // POPC |
379 | UINT64_C(2165768188), // RET |
380 | UINT64_C(1879244800), // SA_F_I |
381 | UINT64_C(1879113728), // SA_I |
382 | UINT64_C(3758096386), // SCC |
383 | UINT64_C(3221227264), // SELECT |
384 | UINT64_C(537067520), // SFSUB_F_RI_HI |
385 | UINT64_C(537001984), // SFSUB_F_RI_LO |
386 | UINT64_C(3221357056), // SFSUB_F_RR |
387 | UINT64_C(3221358464), // SHL_F_R |
388 | UINT64_C(3221227392), // SHL_R |
389 | UINT64_C(4026662912), // SLI |
390 | UINT64_C(1879179264), // SL_F_I |
391 | UINT64_C(1879048192), // SL_I |
392 | UINT64_C(3221358528), // SRA_F_R |
393 | UINT64_C(3221227456), // SRA_R |
394 | UINT64_C(3221358464), // SRL_F_R |
395 | UINT64_C(3221227392), // SRL_R |
396 | UINT64_C(4026597376), // STADDR |
397 | UINT64_C(4026753024), // STB_RI |
398 | UINT64_C(2952790020), // STB_RR |
399 | UINT64_C(4026736640), // STH_RI |
400 | UINT64_C(2952790016), // STH_RR |
401 | UINT64_C(805502976), // SUBB_F_I_HI |
402 | UINT64_C(805437440), // SUBB_F_I_LO |
403 | UINT64_C(3221357312), // SUBB_F_R |
404 | UINT64_C(805371904), // SUBB_I_HI |
405 | UINT64_C(805306368), // SUBB_I_LO |
406 | UINT64_C(3221226240), // SUBB_R |
407 | UINT64_C(537067520), // SUB_F_I_HI |
408 | UINT64_C(537001984), // SUB_F_I_LO |
409 | UINT64_C(3221357056), // SUB_F_R |
410 | UINT64_C(536936448), // SUB_I_HI |
411 | UINT64_C(536870912), // SUB_I_LO |
412 | UINT64_C(3221225984), // SUB_R |
413 | UINT64_C(2415919104), // SW_RI |
414 | UINT64_C(2952790018), // SW_RR |
415 | UINT64_C(3489660931), // TRAILZ |
416 | UINT64_C(1610809344), // XOR_F_I_HI |
417 | UINT64_C(1610743808), // XOR_F_I_LO |
418 | UINT64_C(3221358080), // XOR_F_R |
419 | UINT64_C(1610678272), // XOR_I_HI |
420 | UINT64_C(1610612736), // XOR_I_LO |
421 | UINT64_C(3221227008), // XOR_R |
422 | UINT64_C(0) |
423 | }; |
424 | const unsigned opcode = MI.getOpcode(); |
425 | uint64_t Value = InstBits[opcode]; |
426 | uint64_t op = 0; |
427 | (void)op; // suppress warning |
428 | switch (opcode) { |
429 | case Lanai::LOG0: |
430 | case Lanai::LOG1: |
431 | case Lanai::LOG2: |
432 | case Lanai::LOG3: |
433 | case Lanai::LOG4: |
434 | case Lanai::NOP: |
435 | case Lanai::RET: { |
436 | break; |
437 | } |
438 | case Lanai::BRR: { |
439 | // op: DDDI |
440 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 1), Fixups, SubtargetInfo: STI); |
441 | Value |= (op & UINT64_C(14)) << 24; |
442 | Value |= (op & UINT64_C(1)); |
443 | // op: imm16 |
444 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
445 | op &= UINT64_C(65532); |
446 | Value |= op; |
447 | break; |
448 | } |
449 | case Lanai::LEADZ: |
450 | case Lanai::POPC: |
451 | case Lanai::TRAILZ: { |
452 | // op: Rd |
453 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
454 | op &= UINT64_C(31); |
455 | op <<= 23; |
456 | Value |= op; |
457 | // op: Rs1 |
458 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 1), Fixups, SubtargetInfo: STI); |
459 | op &= UINT64_C(31); |
460 | op <<= 18; |
461 | Value |= op; |
462 | break; |
463 | } |
464 | case Lanai::ADDC_F_R: |
465 | case Lanai::ADDC_R: |
466 | case Lanai::ADD_F_R: |
467 | case Lanai::ADD_R: |
468 | case Lanai::AND_F_R: |
469 | case Lanai::AND_R: |
470 | case Lanai::OR_F_R: |
471 | case Lanai::OR_R: |
472 | case Lanai::SELECT: |
473 | case Lanai::SHL_F_R: |
474 | case Lanai::SHL_R: |
475 | case Lanai::SRA_F_R: |
476 | case Lanai::SRA_R: |
477 | case Lanai::SRL_F_R: |
478 | case Lanai::SRL_R: |
479 | case Lanai::SUBB_F_R: |
480 | case Lanai::SUBB_R: |
481 | case Lanai::SUB_F_R: |
482 | case Lanai::SUB_R: |
483 | case Lanai::XOR_F_R: |
484 | case Lanai::XOR_R: { |
485 | // op: Rd |
486 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
487 | op &= UINT64_C(31); |
488 | op <<= 23; |
489 | Value |= op; |
490 | // op: Rs1 |
491 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 1), Fixups, SubtargetInfo: STI); |
492 | op &= UINT64_C(31); |
493 | op <<= 18; |
494 | Value |= op; |
495 | // op: Rs2 |
496 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 2), Fixups, SubtargetInfo: STI); |
497 | op &= UINT64_C(31); |
498 | op <<= 11; |
499 | Value |= op; |
500 | // op: DDDI |
501 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 3), Fixups, SubtargetInfo: STI); |
502 | Value |= (op & UINT64_C(1)) << 16; |
503 | Value |= (op & UINT64_C(14)) >> 1; |
504 | break; |
505 | } |
506 | case Lanai::ADDC_F_I_HI: |
507 | case Lanai::ADDC_F_I_LO: |
508 | case Lanai::ADDC_I_HI: |
509 | case Lanai::ADDC_I_LO: |
510 | case Lanai::ADD_F_I_HI: |
511 | case Lanai::ADD_F_I_LO: |
512 | case Lanai::ADD_I_HI: |
513 | case Lanai::ADD_I_LO: |
514 | case Lanai::AND_F_I_HI: |
515 | case Lanai::AND_F_I_LO: |
516 | case Lanai::AND_I_HI: |
517 | case Lanai::AND_I_LO: |
518 | case Lanai::OR_F_I_HI: |
519 | case Lanai::OR_F_I_LO: |
520 | case Lanai::OR_I_HI: |
521 | case Lanai::OR_I_LO: |
522 | case Lanai::SA_F_I: |
523 | case Lanai::SA_I: |
524 | case Lanai::SL_F_I: |
525 | case Lanai::SL_I: |
526 | case Lanai::SUBB_F_I_HI: |
527 | case Lanai::SUBB_F_I_LO: |
528 | case Lanai::SUBB_I_HI: |
529 | case Lanai::SUBB_I_LO: |
530 | case Lanai::SUB_F_I_HI: |
531 | case Lanai::SUB_F_I_LO: |
532 | case Lanai::SUB_I_HI: |
533 | case Lanai::SUB_I_LO: |
534 | case Lanai::XOR_F_I_HI: |
535 | case Lanai::XOR_F_I_LO: |
536 | case Lanai::XOR_I_HI: |
537 | case Lanai::XOR_I_LO: { |
538 | // op: Rd |
539 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
540 | op &= UINT64_C(31); |
541 | op <<= 23; |
542 | Value |= op; |
543 | // op: Rs1 |
544 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 1), Fixups, SubtargetInfo: STI); |
545 | op &= UINT64_C(31); |
546 | op <<= 18; |
547 | Value |= op; |
548 | // op: imm16 |
549 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 2), Fixups, SubtargetInfo: STI); |
550 | op &= UINT64_C(65535); |
551 | Value |= op; |
552 | break; |
553 | } |
554 | case Lanai::STADDR: { |
555 | // op: Rd |
556 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
557 | op &= UINT64_C(31); |
558 | op <<= 23; |
559 | Value |= op; |
560 | // op: dst |
561 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 1), Fixups, SubtargetInfo: STI); |
562 | Value |= (op & UINT64_C(2031616)) << 2; |
563 | Value |= (op & UINT64_C(65535)); |
564 | break; |
565 | } |
566 | case Lanai::SW_RI: { |
567 | // op: Rd |
568 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
569 | op &= UINT64_C(31); |
570 | op <<= 23; |
571 | Value |= op; |
572 | // op: dst |
573 | op = getRiMemoryOpValue(Inst: MI, OpNo: 1, Fixups, SubtargetInfo: STI); |
574 | op &= UINT64_C(8388607); |
575 | Value |= op; |
576 | Value = adjustPqBitsRmAndRrm(Inst: MI, Value, STI); |
577 | break; |
578 | } |
579 | case Lanai::STB_RR: |
580 | case Lanai::STH_RR: |
581 | case Lanai::SW_RR: { |
582 | // op: Rd |
583 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
584 | op &= UINT64_C(31); |
585 | op <<= 23; |
586 | Value |= op; |
587 | // op: dst |
588 | op = getRrMemoryOpValue(Inst: MI, OpNo: 1, Fixups, SubtargetInfo: STI); |
589 | Value |= (op & UINT64_C(1015808)) << 3; |
590 | Value |= (op & UINT64_C(768)) << 8; |
591 | Value |= (op & UINT64_C(31744)) << 1; |
592 | Value |= (op & UINT64_C(255)) << 3; |
593 | Value = adjustPqBitsRmAndRrm(Inst: MI, Value, STI); |
594 | break; |
595 | } |
596 | case Lanai::STB_RI: |
597 | case Lanai::STH_RI: { |
598 | // op: Rd |
599 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
600 | op &= UINT64_C(31); |
601 | op <<= 23; |
602 | Value |= op; |
603 | // op: dst |
604 | op = getSplsOpValue(Inst: MI, OpNo: 1, Fixups, SubtargetInfo: STI); |
605 | Value |= (op & UINT64_C(126976)) << 6; |
606 | Value |= (op & UINT64_C(4095)); |
607 | Value = adjustPqBitsSpls(Inst: MI, Value, STI); |
608 | break; |
609 | } |
610 | case Lanai::SLI: { |
611 | // op: Rd |
612 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
613 | op &= UINT64_C(31); |
614 | op <<= 23; |
615 | Value |= op; |
616 | // op: imm |
617 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 1), Fixups, SubtargetInfo: STI); |
618 | Value |= (op & UINT64_C(2031616)) << 2; |
619 | Value |= (op & UINT64_C(65535)); |
620 | break; |
621 | } |
622 | case Lanai::MOVHI: { |
623 | // op: Rd |
624 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
625 | op &= UINT64_C(31); |
626 | op <<= 23; |
627 | Value |= op; |
628 | // op: imm16 |
629 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 1), Fixups, SubtargetInfo: STI); |
630 | op &= UINT64_C(65535); |
631 | Value |= op; |
632 | break; |
633 | } |
634 | case Lanai::LDADDR: { |
635 | // op: Rd |
636 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
637 | op &= UINT64_C(31); |
638 | op <<= 23; |
639 | Value |= op; |
640 | // op: src |
641 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 1), Fixups, SubtargetInfo: STI); |
642 | Value |= (op & UINT64_C(2031616)) << 2; |
643 | Value |= (op & UINT64_C(65535)); |
644 | break; |
645 | } |
646 | case Lanai::LDW_RI: { |
647 | // op: Rd |
648 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
649 | op &= UINT64_C(31); |
650 | op <<= 23; |
651 | Value |= op; |
652 | // op: src |
653 | op = getRiMemoryOpValue(Inst: MI, OpNo: 1, Fixups, SubtargetInfo: STI); |
654 | op &= UINT64_C(8388607); |
655 | Value |= op; |
656 | Value = adjustPqBitsRmAndRrm(Inst: MI, Value, STI); |
657 | break; |
658 | } |
659 | case Lanai::LDBs_RR: |
660 | case Lanai::LDBz_RR: |
661 | case Lanai::LDHs_RR: |
662 | case Lanai::LDHz_RR: |
663 | case Lanai::LDW_RR: |
664 | case Lanai::LDWz_RR: { |
665 | // op: Rd |
666 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
667 | op &= UINT64_C(31); |
668 | op <<= 23; |
669 | Value |= op; |
670 | // op: src |
671 | op = getRrMemoryOpValue(Inst: MI, OpNo: 1, Fixups, SubtargetInfo: STI); |
672 | Value |= (op & UINT64_C(1015808)) << 3; |
673 | Value |= (op & UINT64_C(768)) << 8; |
674 | Value |= (op & UINT64_C(31744)) << 1; |
675 | Value |= (op & UINT64_C(255)) << 3; |
676 | Value = adjustPqBitsRmAndRrm(Inst: MI, Value, STI); |
677 | break; |
678 | } |
679 | case Lanai::LDBs_RI: |
680 | case Lanai::LDBz_RI: |
681 | case Lanai::LDHs_RI: |
682 | case Lanai::LDHz_RI: { |
683 | // op: Rd |
684 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
685 | op &= UINT64_C(31); |
686 | op <<= 23; |
687 | Value |= op; |
688 | // op: src |
689 | op = getSplsOpValue(Inst: MI, OpNo: 1, Fixups, SubtargetInfo: STI); |
690 | Value |= (op & UINT64_C(126976)) << 6; |
691 | Value |= (op & UINT64_C(4095)); |
692 | Value = adjustPqBitsSpls(Inst: MI, Value, STI); |
693 | break; |
694 | } |
695 | case Lanai::BRIND_CC: { |
696 | // op: Rs1 |
697 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
698 | op &= UINT64_C(31); |
699 | op <<= 18; |
700 | Value |= op; |
701 | // op: DDDI |
702 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 1), Fixups, SubtargetInfo: STI); |
703 | Value |= (op & UINT64_C(1)) << 16; |
704 | Value |= (op & UINT64_C(14)) >> 1; |
705 | break; |
706 | } |
707 | case Lanai::SCC: { |
708 | // op: Rs1 |
709 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
710 | op &= UINT64_C(31); |
711 | op <<= 18; |
712 | Value |= op; |
713 | // op: DDDI |
714 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 1), Fixups, SubtargetInfo: STI); |
715 | Value |= (op & UINT64_C(14)) << 24; |
716 | Value |= (op & UINT64_C(1)); |
717 | break; |
718 | } |
719 | case Lanai::SFSUB_F_RR: { |
720 | // op: Rs1 |
721 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
722 | op &= UINT64_C(31); |
723 | op <<= 18; |
724 | Value |= op; |
725 | // op: Rs2 |
726 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 1), Fixups, SubtargetInfo: STI); |
727 | op &= UINT64_C(31); |
728 | op <<= 11; |
729 | Value |= op; |
730 | break; |
731 | } |
732 | case Lanai::BRIND_CCA: { |
733 | // op: Rs1 |
734 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
735 | op &= UINT64_C(31); |
736 | op <<= 18; |
737 | Value |= op; |
738 | // op: Rs2 |
739 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 1), Fixups, SubtargetInfo: STI); |
740 | op &= UINT64_C(31); |
741 | op <<= 11; |
742 | Value |= op; |
743 | // op: DDDI |
744 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 2), Fixups, SubtargetInfo: STI); |
745 | Value |= (op & UINT64_C(1)) << 16; |
746 | Value |= (op & UINT64_C(14)) >> 1; |
747 | break; |
748 | } |
749 | case Lanai::SFSUB_F_RI_HI: |
750 | case Lanai::SFSUB_F_RI_LO: { |
751 | // op: Rs1 |
752 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
753 | op &= UINT64_C(31); |
754 | op <<= 18; |
755 | Value |= op; |
756 | // op: imm16 |
757 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 1), Fixups, SubtargetInfo: STI); |
758 | op &= UINT64_C(65535); |
759 | Value |= op; |
760 | break; |
761 | } |
762 | case Lanai::JR: { |
763 | // op: Rs2 |
764 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 0), Fixups, SubtargetInfo: STI); |
765 | op &= UINT64_C(31); |
766 | op <<= 11; |
767 | Value |= op; |
768 | break; |
769 | } |
770 | case Lanai::BT: { |
771 | // op: addr |
772 | op = getBranchTargetOpValue(Inst: MI, OpNo: 0, Fixups, SubtargetInfo: STI); |
773 | op &= UINT64_C(33554428); |
774 | Value |= op; |
775 | break; |
776 | } |
777 | case Lanai::BRCC: { |
778 | // op: addr |
779 | op = getBranchTargetOpValue(Inst: MI, OpNo: 0, Fixups, SubtargetInfo: STI); |
780 | op &= UINT64_C(33554428); |
781 | Value |= op; |
782 | // op: DDDI |
783 | op = getMachineOpValue(Inst: MI, MCOp: MI.getOperand(i: 1), Fixups, SubtargetInfo: STI); |
784 | Value |= (op & UINT64_C(14)) << 24; |
785 | Value |= (op & UINT64_C(1)); |
786 | break; |
787 | } |
788 | default: |
789 | std::string msg; |
790 | raw_string_ostream Msg(msg); |
791 | Msg << "Not supported instr: " << MI; |
792 | report_fatal_error(reason: Msg.str().c_str()); |
793 | } |
794 | return Value; |
795 | } |
796 | |
797 | #ifdef GET_OPERAND_BIT_OFFSET |
798 | #undef GET_OPERAND_BIT_OFFSET |
799 | |
800 | uint32_t LanaiMCCodeEmitter::getOperandBitOffset(const MCInst &MI, |
801 | unsigned OpNum, |
802 | const MCSubtargetInfo &STI) const { |
803 | switch (MI.getOpcode()) { |
804 | case Lanai::LOG0: |
805 | case Lanai::LOG1: |
806 | case Lanai::LOG2: |
807 | case Lanai::LOG3: |
808 | case Lanai::LOG4: |
809 | case Lanai::NOP: |
810 | case Lanai::RET: { |
811 | break; |
812 | } |
813 | case Lanai::ADDC_F_R: |
814 | case Lanai::ADDC_R: |
815 | case Lanai::ADD_F_R: |
816 | case Lanai::ADD_R: |
817 | case Lanai::AND_F_R: |
818 | case Lanai::AND_R: |
819 | case Lanai::OR_F_R: |
820 | case Lanai::OR_R: |
821 | case Lanai::SELECT: |
822 | case Lanai::SHL_F_R: |
823 | case Lanai::SHL_R: |
824 | case Lanai::SRA_F_R: |
825 | case Lanai::SRA_R: |
826 | case Lanai::SRL_F_R: |
827 | case Lanai::SRL_R: |
828 | case Lanai::SUBB_F_R: |
829 | case Lanai::SUBB_R: |
830 | case Lanai::SUB_F_R: |
831 | case Lanai::SUB_R: |
832 | case Lanai::XOR_F_R: |
833 | case Lanai::XOR_R: { |
834 | switch (OpNum) { |
835 | case 0: |
836 | // op: Rd |
837 | return 23; |
838 | case 1: |
839 | // op: Rs1 |
840 | return 18; |
841 | case 2: |
842 | // op: Rs2 |
843 | return 11; |
844 | case 3: |
845 | // op: DDDI |
846 | return 0; |
847 | } |
848 | break; |
849 | } |
850 | case Lanai::ADDC_F_I_HI: |
851 | case Lanai::ADDC_F_I_LO: |
852 | case Lanai::ADDC_I_HI: |
853 | case Lanai::ADDC_I_LO: |
854 | case Lanai::ADD_F_I_HI: |
855 | case Lanai::ADD_F_I_LO: |
856 | case Lanai::ADD_I_HI: |
857 | case Lanai::ADD_I_LO: |
858 | case Lanai::AND_F_I_HI: |
859 | case Lanai::AND_F_I_LO: |
860 | case Lanai::AND_I_HI: |
861 | case Lanai::AND_I_LO: |
862 | case Lanai::OR_F_I_HI: |
863 | case Lanai::OR_F_I_LO: |
864 | case Lanai::OR_I_HI: |
865 | case Lanai::OR_I_LO: |
866 | case Lanai::SA_F_I: |
867 | case Lanai::SA_I: |
868 | case Lanai::SL_F_I: |
869 | case Lanai::SL_I: |
870 | case Lanai::SUBB_F_I_HI: |
871 | case Lanai::SUBB_F_I_LO: |
872 | case Lanai::SUBB_I_HI: |
873 | case Lanai::SUBB_I_LO: |
874 | case Lanai::SUB_F_I_HI: |
875 | case Lanai::SUB_F_I_LO: |
876 | case Lanai::SUB_I_HI: |
877 | case Lanai::SUB_I_LO: |
878 | case Lanai::XOR_F_I_HI: |
879 | case Lanai::XOR_F_I_LO: |
880 | case Lanai::XOR_I_HI: |
881 | case Lanai::XOR_I_LO: { |
882 | switch (OpNum) { |
883 | case 0: |
884 | // op: Rd |
885 | return 23; |
886 | case 1: |
887 | // op: Rs1 |
888 | return 18; |
889 | case 2: |
890 | // op: imm16 |
891 | return 0; |
892 | } |
893 | break; |
894 | } |
895 | case Lanai::LEADZ: |
896 | case Lanai::POPC: |
897 | case Lanai::TRAILZ: { |
898 | switch (OpNum) { |
899 | case 0: |
900 | // op: Rd |
901 | return 23; |
902 | case 1: |
903 | // op: Rs1 |
904 | return 18; |
905 | } |
906 | break; |
907 | } |
908 | case Lanai::STADDR: |
909 | case Lanai::STB_RI: |
910 | case Lanai::STH_RI: |
911 | case Lanai::SW_RI: { |
912 | switch (OpNum) { |
913 | case 0: |
914 | // op: Rd |
915 | return 23; |
916 | case 1: |
917 | // op: dst |
918 | return 0; |
919 | } |
920 | break; |
921 | } |
922 | case Lanai::STB_RR: |
923 | case Lanai::STH_RR: |
924 | case Lanai::SW_RR: { |
925 | switch (OpNum) { |
926 | case 0: |
927 | // op: Rd |
928 | return 23; |
929 | case 1: |
930 | // op: dst |
931 | return 3; |
932 | } |
933 | break; |
934 | } |
935 | case Lanai::SLI: { |
936 | switch (OpNum) { |
937 | case 0: |
938 | // op: Rd |
939 | return 23; |
940 | case 1: |
941 | // op: imm |
942 | return 0; |
943 | } |
944 | break; |
945 | } |
946 | case Lanai::MOVHI: { |
947 | switch (OpNum) { |
948 | case 0: |
949 | // op: Rd |
950 | return 23; |
951 | case 1: |
952 | // op: imm16 |
953 | return 0; |
954 | } |
955 | break; |
956 | } |
957 | case Lanai::LDADDR: |
958 | case Lanai::LDBs_RI: |
959 | case Lanai::LDBz_RI: |
960 | case Lanai::LDHs_RI: |
961 | case Lanai::LDHz_RI: |
962 | case Lanai::LDW_RI: { |
963 | switch (OpNum) { |
964 | case 0: |
965 | // op: Rd |
966 | return 23; |
967 | case 1: |
968 | // op: src |
969 | return 0; |
970 | } |
971 | break; |
972 | } |
973 | case Lanai::LDBs_RR: |
974 | case Lanai::LDBz_RR: |
975 | case Lanai::LDHs_RR: |
976 | case Lanai::LDHz_RR: |
977 | case Lanai::LDW_RR: |
978 | case Lanai::LDWz_RR: { |
979 | switch (OpNum) { |
980 | case 0: |
981 | // op: Rd |
982 | return 23; |
983 | case 1: |
984 | // op: src |
985 | return 3; |
986 | } |
987 | break; |
988 | } |
989 | case Lanai::BRIND_CC: |
990 | case Lanai::SCC: { |
991 | switch (OpNum) { |
992 | case 0: |
993 | // op: Rs1 |
994 | return 18; |
995 | case 1: |
996 | // op: DDDI |
997 | return 0; |
998 | } |
999 | break; |
1000 | } |
1001 | case Lanai::BRIND_CCA: { |
1002 | switch (OpNum) { |
1003 | case 0: |
1004 | // op: Rs1 |
1005 | return 18; |
1006 | case 1: |
1007 | // op: Rs2 |
1008 | return 11; |
1009 | case 2: |
1010 | // op: DDDI |
1011 | return 0; |
1012 | } |
1013 | break; |
1014 | } |
1015 | case Lanai::SFSUB_F_RR: { |
1016 | switch (OpNum) { |
1017 | case 0: |
1018 | // op: Rs1 |
1019 | return 18; |
1020 | case 1: |
1021 | // op: Rs2 |
1022 | return 11; |
1023 | } |
1024 | break; |
1025 | } |
1026 | case Lanai::SFSUB_F_RI_HI: |
1027 | case Lanai::SFSUB_F_RI_LO: { |
1028 | switch (OpNum) { |
1029 | case 0: |
1030 | // op: Rs1 |
1031 | return 18; |
1032 | case 1: |
1033 | // op: imm16 |
1034 | return 0; |
1035 | } |
1036 | break; |
1037 | } |
1038 | case Lanai::JR: { |
1039 | switch (OpNum) { |
1040 | case 0: |
1041 | // op: Rs2 |
1042 | return 11; |
1043 | } |
1044 | break; |
1045 | } |
1046 | case Lanai::BRCC: { |
1047 | switch (OpNum) { |
1048 | case 0: |
1049 | // op: addr |
1050 | return 2; |
1051 | case 1: |
1052 | // op: DDDI |
1053 | return 0; |
1054 | } |
1055 | break; |
1056 | } |
1057 | case Lanai::BT: { |
1058 | switch (OpNum) { |
1059 | case 0: |
1060 | // op: addr |
1061 | return 2; |
1062 | } |
1063 | break; |
1064 | } |
1065 | case Lanai::BRR: { |
1066 | switch (OpNum) { |
1067 | case 1: |
1068 | // op: DDDI |
1069 | return 0; |
1070 | case 0: |
1071 | // op: imm16 |
1072 | return 2; |
1073 | } |
1074 | break; |
1075 | } |
1076 | } |
1077 | std::string msg; |
1078 | raw_string_ostream Msg(msg); |
1079 | Msg << "Not supported instr[opcode]: " << MI << "[" << OpNum << "]" ; |
1080 | report_fatal_error(Msg.str().c_str()); |
1081 | } |
1082 | |
1083 | #endif // GET_OPERAND_BIT_OFFSET |
1084 | |
1085 | |