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 559 : uint64_t AVRMCCodeEmitter::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(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(7168), // ADCRdRr
228 : UINT64_C(3072), // ADDRdRr
229 : UINT64_C(38400), // ADIWRdK
230 : UINT64_C(28672), // ANDIRdK
231 : UINT64_C(8192), // ANDRdRr
232 : UINT64_C(37893), // ASRRd
233 : UINT64_C(38024), // BCLRs
234 : UINT64_C(63488), // BLD
235 : UINT64_C(62464), // BRBCsk
236 : UINT64_C(61440), // BRBSsk
237 : UINT64_C(38296), // BREAK
238 : UINT64_C(61441), // BREQk
239 : UINT64_C(62468), // BRGEk
240 : UINT64_C(61440), // BRLOk
241 : UINT64_C(61444), // BRLTk
242 : UINT64_C(61442), // BRMIk
243 : UINT64_C(62465), // BRNEk
244 : UINT64_C(62466), // BRPLk
245 : UINT64_C(62464), // BRSHk
246 : UINT64_C(37896), // BSETs
247 : UINT64_C(64000), // BST
248 : UINT64_C(2483945472), // CALLk
249 : UINT64_C(38912), // CBIAb
250 : UINT64_C(28672), // CBRRdK
251 : UINT64_C(37888), // COMRd
252 : UINT64_C(1024), // CPCRdRr
253 : UINT64_C(12288), // CPIRdK
254 : UINT64_C(5120), // CPRdRr
255 : UINT64_C(4096), // CPSE
256 : UINT64_C(37898), // DECRd
257 : UINT64_C(37899), // DESK
258 : UINT64_C(38169), // EICALL
259 : UINT64_C(37913), // EIJMP
260 : UINT64_C(38360), // ELPM
261 : UINT64_C(36870), // ELPMRdZ
262 : UINT64_C(36871), // ELPMRdZPi
263 : UINT64_C(9216), // EORRdRr
264 : UINT64_C(776), // FMUL
265 : UINT64_C(896), // FMULS
266 : UINT64_C(904), // FMULSU
267 : UINT64_C(38153), // ICALL
268 : UINT64_C(37897), // IJMP
269 : UINT64_C(37891), // INCRd
270 : UINT64_C(45056), // INRdA
271 : UINT64_C(2483814400), // JMPk
272 : UINT64_C(37382), // LACZRd
273 : UINT64_C(37381), // LASZRd
274 : UINT64_C(37383), // LATZRd
275 : UINT64_C(32768), // LDDRdPtrQ
276 : UINT64_C(57344), // LDIRdK
277 : UINT64_C(32768), // LDRdPtr
278 : UINT64_C(32770), // LDRdPtrPd
279 : UINT64_C(32769), // LDRdPtrPi
280 : UINT64_C(2415919104), // LDSRdK
281 : UINT64_C(38344), // LPM
282 : UINT64_C(36868), // LPMRdZ
283 : UINT64_C(36869), // LPMRdZPi
284 : UINT64_C(37894), // LSRRd
285 : UINT64_C(11264), // MOVRdRr
286 : UINT64_C(256), // MOVWRdRr
287 : UINT64_C(39936), // MULRdRr
288 : UINT64_C(512), // MULSRdRr
289 : UINT64_C(768), // MULSURdRr
290 : UINT64_C(37889), // NEGRd
291 : UINT64_C(0), // NOP
292 : UINT64_C(24576), // ORIRdK
293 : UINT64_C(10240), // ORRdRr
294 : UINT64_C(47104), // OUTARr
295 : UINT64_C(36879), // POPRd
296 : UINT64_C(37391), // PUSHRr
297 : UINT64_C(53248), // RCALLk
298 : UINT64_C(38152), // RET
299 : UINT64_C(38168), // RETI
300 : UINT64_C(49152), // RJMPk
301 : UINT64_C(37895), // RORRd
302 : UINT64_C(16384), // SBCIRdK
303 : UINT64_C(2048), // SBCRdRr
304 : UINT64_C(39424), // SBIAb
305 : UINT64_C(39168), // SBICAb
306 : UINT64_C(39680), // SBISAb
307 : UINT64_C(38656), // SBIWRdK
308 : UINT64_C(64512), // SBRCRrB
309 : UINT64_C(65024), // SBRSRrB
310 : UINT64_C(38280), // SLEEP
311 : UINT64_C(38376), // SPM
312 : UINT64_C(38392), // SPMZPi
313 : UINT64_C(33280), // STDPtrQRr
314 : UINT64_C(33282), // STPtrPdRr
315 : UINT64_C(33281), // STPtrPiRr
316 : UINT64_C(33280), // STPtrRr
317 : UINT64_C(2449473536), // STSKRr
318 : UINT64_C(20480), // SUBIRdK
319 : UINT64_C(6144), // SUBRdRr
320 : UINT64_C(37890), // SWAPRd
321 : UINT64_C(38312), // WDR
322 : UINT64_C(37380), // XCHZRd
323 : UINT64_C(0)
324 : };
325 559 : const unsigned opcode = MI.getOpcode();
326 559 : uint64_t Value = InstBits[opcode];
327 : uint64_t op = 0;
328 : (void)op; // suppress warning
329 559 : switch (opcode) {
330 : case AVR::BREAK:
331 : case AVR::EICALL:
332 : case AVR::EIJMP:
333 : case AVR::ELPM:
334 : case AVR::ICALL:
335 : case AVR::IJMP:
336 : case AVR::LPM:
337 : case AVR::NOP:
338 : case AVR::RET:
339 : case AVR::RETI:
340 : case AVR::SLEEP:
341 : case AVR::SPM:
342 : case AVR::SPMZPi:
343 : case AVR::WDR: {
344 : break;
345 : }
346 22 : case AVR::CBIAb:
347 : case AVR::SBIAb:
348 : case AVR::SBICAb:
349 : case AVR::SBISAb: {
350 : // op: A
351 22 : op = encodeImm<AVR::fixup_port5, 0>(MI, 0, Fixups, STI);
352 22 : Value |= (op & UINT64_C(31)) << 3;
353 : // op: b
354 22 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
355 22 : Value |= op & UINT64_C(7);
356 22 : break;
357 : }
358 5 : case AVR::OUTARr: {
359 : // op: A
360 5 : op = encodeImm<AVR::fixup_port6, 0>(MI, 0, Fixups, STI);
361 5 : Value |= (op & UINT64_C(48)) << 5;
362 5 : Value |= op & UINT64_C(15);
363 : // op: r
364 5 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
365 5 : Value |= (op & UINT64_C(31)) << 4;
366 5 : break;
367 : }
368 : case AVR::MOVWRdRr: {
369 : // op: d
370 4 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
371 4 : Value |= (op & UINT64_C(30)) << 3;
372 : // op: r
373 4 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
374 4 : Value |= (op & UINT64_C(30)) >> 1;
375 4 : break;
376 : }
377 : case AVR::ASRRd:
378 : case AVR::COMRd:
379 : case AVR::DECRd:
380 : case AVR::INCRd:
381 : case AVR::LSRRd:
382 : case AVR::NEGRd:
383 : case AVR::POPRd:
384 : case AVR::PUSHRr:
385 : case AVR::RORRd:
386 : case AVR::SWAPRd: {
387 : // op: d
388 40 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
389 40 : Value |= (op & UINT64_C(31)) << 4;
390 40 : break;
391 : }
392 : case AVR::INRdA: {
393 : // op: d
394 7 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
395 7 : Value |= (op & UINT64_C(31)) << 4;
396 : // op: A
397 7 : op = encodeImm<AVR::fixup_port6, 0>(MI, 1, Fixups, STI);
398 7 : Value |= (op & UINT64_C(48)) << 5;
399 7 : Value |= op & UINT64_C(15);
400 7 : break;
401 : }
402 : case AVR::ADIWRdK:
403 : case AVR::SBIWRdK: {
404 : // op: dst
405 22 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
406 22 : Value |= (op & UINT64_C(6)) << 3;
407 : // op: k
408 22 : op = encodeImm<AVR::fixup_6_adiw, 0>(MI, 2, Fixups, STI);
409 22 : Value |= (op & UINT64_C(48)) << 2;
410 22 : Value |= op & UINT64_C(15);
411 22 : break;
412 : }
413 14 : case AVR::CALLk:
414 : case AVR::JMPk: {
415 : // op: k
416 14 : op = encodeCallTarget(MI, 0, Fixups, STI);
417 14 : Value |= (op & UINT64_C(4063232)) << 3;
418 14 : Value |= op & UINT64_C(131071);
419 14 : break;
420 : }
421 14 : case AVR::RCALLk:
422 : case AVR::RJMPk: {
423 : // op: k
424 14 : op = encodeRelCondBrTarget<AVR::fixup_13_pcrel>(MI, 0, Fixups, STI);
425 14 : Value |= op & UINT64_C(4095);
426 14 : break;
427 : }
428 22 : case AVR::BREQk:
429 : case AVR::BRGEk:
430 : case AVR::BRLOk:
431 : case AVR::BRLTk:
432 : case AVR::BRMIk:
433 : case AVR::BRNEk:
434 : case AVR::BRPLk:
435 : case AVR::BRSHk: {
436 : // op: k
437 22 : op = encodeRelCondBrTarget<AVR::fixup_7_pcrel>(MI, 0, Fixups, STI);
438 22 : Value |= (op & UINT64_C(127)) << 3;
439 22 : break;
440 : }
441 42 : case AVR::BRBCsk:
442 : case AVR::BRBSsk: {
443 : // op: k
444 42 : op = encodeRelCondBrTarget<AVR::fixup_7_pcrel>(MI, 1, Fixups, STI);
445 42 : Value |= (op & UINT64_C(127)) << 3;
446 : // op: s
447 42 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
448 42 : Value |= op & UINT64_C(7);
449 42 : break;
450 : }
451 : case AVR::DESK: {
452 : // op: k
453 4 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
454 4 : Value |= (op & UINT64_C(15)) << 4;
455 4 : break;
456 : }
457 5 : case AVR::STDPtrQRr: {
458 : // op: memri
459 5 : op = encodeMemri(MI, 0, Fixups, STI);
460 5 : Value |= (op & UINT64_C(32)) << 8;
461 5 : Value |= (op & UINT64_C(24)) << 7;
462 5 : Value |= (op & UINT64_C(64)) >> 3;
463 5 : Value |= op & UINT64_C(7);
464 : // op: reg
465 5 : op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
466 5 : Value |= (op & UINT64_C(31)) << 4;
467 5 : break;
468 : }
469 5 : case AVR::LDDRdPtrQ: {
470 : // op: memri
471 5 : op = encodeMemri(MI, 1, Fixups, STI);
472 5 : Value |= (op & UINT64_C(32)) << 8;
473 5 : Value |= (op & UINT64_C(24)) << 7;
474 5 : Value |= (op & UINT64_C(64)) >> 3;
475 5 : Value |= op & UINT64_C(7);
476 : // op: reg
477 5 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
478 5 : Value |= (op & UINT64_C(31)) << 4;
479 5 : break;
480 : }
481 6 : case AVR::STPtrRr: {
482 : // op: ptrreg
483 6 : op = encodeLDSTPtrReg(MI, 0, Fixups, STI);
484 6 : Value |= (op & UINT64_C(3)) << 2;
485 : // op: reg
486 6 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
487 6 : Value |= (op & UINT64_C(31)) << 4;
488 6 : Value = loadStorePostEncoder(MI, Value, STI);
489 6 : break;
490 : }
491 6 : case AVR::LDRdPtr: {
492 : // op: ptrreg
493 6 : op = encodeLDSTPtrReg(MI, 1, Fixups, STI);
494 6 : Value |= (op & UINT64_C(3)) << 2;
495 : // op: reg
496 6 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
497 6 : Value |= (op & UINT64_C(31)) << 4;
498 6 : Value = loadStorePostEncoder(MI, Value, STI);
499 6 : break;
500 : }
501 12 : case AVR::STPtrPdRr:
502 : case AVR::STPtrPiRr: {
503 : // op: ptrreg
504 12 : op = encodeLDSTPtrReg(MI, 1, Fixups, STI);
505 12 : Value |= (op & UINT64_C(3)) << 2;
506 : // op: reg
507 12 : op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
508 12 : Value |= (op & UINT64_C(31)) << 4;
509 12 : Value = loadStorePostEncoder(MI, Value, STI);
510 12 : break;
511 : }
512 12 : case AVR::LDRdPtrPd:
513 : case AVR::LDRdPtrPi: {
514 : // op: ptrreg
515 12 : op = encodeLDSTPtrReg(MI, 2, Fixups, STI);
516 12 : Value |= (op & UINT64_C(3)) << 2;
517 : // op: reg
518 12 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
519 12 : Value |= (op & UINT64_C(31)) << 4;
520 12 : Value = loadStorePostEncoder(MI, Value, STI);
521 12 : break;
522 : }
523 : case AVR::CBRRdK: {
524 : // op: rd
525 4 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
526 4 : Value |= (op & UINT64_C(15)) << 4;
527 : // op: k
528 4 : op = encodeComplement(MI, 2, Fixups, STI);
529 4 : Value |= (op & UINT64_C(240)) << 4;
530 4 : Value |= op & UINT64_C(15);
531 4 : break;
532 : }
533 : case AVR::CPIRdK:
534 : case AVR::LDIRdK: {
535 : // op: rd
536 106 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
537 106 : Value |= (op & UINT64_C(15)) << 4;
538 : // op: k
539 106 : op = encodeImm<AVR::fixup_ldi, 0>(MI, 1, Fixups, STI);
540 106 : Value |= (op & UINT64_C(240)) << 4;
541 106 : Value |= op & UINT64_C(15);
542 106 : break;
543 : }
544 : case AVR::ANDIRdK:
545 : case AVR::ORIRdK:
546 : case AVR::SBCIRdK:
547 : case AVR::SUBIRdK: {
548 : // op: rd
549 25 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
550 25 : Value |= (op & UINT64_C(15)) << 4;
551 : // op: k
552 25 : op = encodeImm<AVR::fixup_ldi, 0>(MI, 2, Fixups, STI);
553 25 : Value |= (op & UINT64_C(240)) << 4;
554 25 : Value |= op & UINT64_C(15);
555 25 : break;
556 : }
557 : case AVR::MULSRdRr:
558 : case AVR::MULSURdRr: {
559 : // op: rd
560 8 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
561 8 : Value |= (op & UINT64_C(15)) << 4;
562 : // op: rr
563 8 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
564 8 : Value |= op & UINT64_C(15);
565 8 : break;
566 : }
567 : case AVR::LDSRdK: {
568 : // op: rd
569 7 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
570 7 : Value |= (op & UINT64_C(31)) << 20;
571 : // op: k
572 7 : op = encodeImm<AVR::fixup_16, 2>(MI, 1, Fixups, STI);
573 7 : Value |= op & UINT64_C(65535);
574 7 : break;
575 : }
576 : case AVR::LACZRd:
577 : case AVR::LASZRd:
578 : case AVR::LATZRd:
579 : case AVR::XCHZRd: {
580 : // op: rd
581 16 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
582 16 : Value |= (op & UINT64_C(31)) << 4;
583 16 : break;
584 : }
585 : case AVR::BLD:
586 : case AVR::BST:
587 : case AVR::SBRCRrB:
588 : case AVR::SBRSRrB: {
589 : // op: rd
590 12 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
591 12 : Value |= (op & UINT64_C(31)) << 4;
592 : // op: b
593 12 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
594 12 : Value |= op & UINT64_C(7);
595 12 : break;
596 : }
597 : case AVR::CPCRdRr:
598 : case AVR::CPRdRr:
599 : case AVR::CPSE:
600 : case AVR::MOVRdRr:
601 : case AVR::MULRdRr: {
602 : // op: rd
603 20 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
604 20 : Value |= (op & UINT64_C(31)) << 4;
605 : // op: rr
606 20 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
607 20 : Value |= (op & UINT64_C(16)) << 5;
608 20 : Value |= op & UINT64_C(15);
609 20 : break;
610 : }
611 : case AVR::ADCRdRr:
612 : case AVR::ADDRdRr:
613 : case AVR::ANDRdRr:
614 : case AVR::EORRdRr:
615 : case AVR::ORRdRr:
616 : case AVR::SBCRdRr:
617 : case AVR::SUBRdRr: {
618 : // op: rd
619 49 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
620 49 : Value |= (op & UINT64_C(31)) << 4;
621 : // op: rr
622 49 : op = getMachineOpValue(MI, MI.getOperand(2), Fixups, STI);
623 49 : Value |= (op & UINT64_C(16)) << 5;
624 49 : Value |= op & UINT64_C(15);
625 49 : break;
626 : }
627 : case AVR::FMUL:
628 : case AVR::FMULS:
629 : case AVR::FMULSU: {
630 : // op: rd
631 12 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
632 12 : Value |= (op & UINT64_C(7)) << 4;
633 : // op: rr
634 12 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
635 12 : Value |= op & UINT64_C(7);
636 12 : break;
637 : }
638 : case AVR::STSKRr: {
639 : // op: rd
640 3 : op = getMachineOpValue(MI, MI.getOperand(1), Fixups, STI);
641 3 : Value |= (op & UINT64_C(31)) << 20;
642 : // op: k
643 3 : op = encodeImm<AVR::fixup_16, 2>(MI, 0, Fixups, STI);
644 3 : Value |= op & UINT64_C(65535);
645 3 : break;
646 : }
647 : case AVR::ELPMRdZ:
648 : case AVR::ELPMRdZPi:
649 : case AVR::LPMRdZ:
650 : case AVR::LPMRdZPi: {
651 : // op: reg
652 8 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
653 8 : Value |= (op & UINT64_C(31)) << 4;
654 8 : break;
655 : }
656 : case AVR::BCLRs:
657 : case AVR::BSETs: {
658 : // op: s
659 32 : op = getMachineOpValue(MI, MI.getOperand(0), Fixups, STI);
660 32 : Value |= (op & UINT64_C(7)) << 4;
661 32 : break;
662 : }
663 : default:
664 : std::string msg;
665 : raw_string_ostream Msg(msg);
666 0 : Msg << "Not supported instr: " << MI;
667 0 : report_fatal_error(Msg.str());
668 : }
669 559 : return Value;
670 : }
671 :
672 : #ifdef ENABLE_INSTR_PREDICATE_VERIFIER
673 : #undef ENABLE_INSTR_PREDICATE_VERIFIER
674 : #include <sstream>
675 :
676 : // Flags for subtarget features that participate in instruction matching.
677 : enum SubtargetFeatureFlag : uint32_t {
678 : Feature_HasSRAM = (1ULL << 13),
679 : Feature_HasJMPCALL = (1ULL << 7),
680 : Feature_HasIJMPCALL = (1ULL << 6),
681 : Feature_HasEIJMPCALL = (1ULL << 3),
682 : Feature_HasADDSUBIW = (1ULL << 0),
683 : Feature_HasSmallStack = (1ULL << 14),
684 : Feature_HasMOVW = (1ULL << 10),
685 : Feature_HasLPM = (1ULL << 8),
686 : Feature_HasLPMX = (1ULL << 9),
687 : Feature_HasELPM = (1ULL << 4),
688 : Feature_HasELPMX = (1ULL << 5),
689 : Feature_HasSPM = (1ULL << 11),
690 : Feature_HasSPMX = (1ULL << 12),
691 : Feature_HasDES = (1ULL << 2),
692 : Feature_SupportsRMW = (1ULL << 17),
693 : Feature_SupportsMultiplication = (1ULL << 16),
694 : Feature_HasBREAK = (1ULL << 1),
695 : Feature_HasTinyEncoding = (1ULL << 15),
696 : Feature_None = 0
697 : };
698 :
699 : #ifndef NDEBUG
700 : static const char *SubtargetFeatureNames[] = {
701 : "Feature_HasADDSUBIW",
702 : "Feature_HasBREAK",
703 : "Feature_HasDES",
704 : "Feature_HasEIJMPCALL",
705 : "Feature_HasELPM",
706 : "Feature_HasELPMX",
707 : "Feature_HasIJMPCALL",
708 : "Feature_HasJMPCALL",
709 : "Feature_HasLPM",
710 : "Feature_HasLPMX",
711 : "Feature_HasMOVW",
712 : "Feature_HasSPM",
713 : "Feature_HasSPMX",
714 : "Feature_HasSRAM",
715 : "Feature_HasSmallStack",
716 : "Feature_HasTinyEncoding",
717 : "Feature_SupportsMultiplication",
718 : "Feature_SupportsRMW",
719 : nullptr
720 : };
721 :
722 : #endif // NDEBUG
723 : uint64_t AVRMCCodeEmitter::
724 : computeAvailableFeatures(const FeatureBitset& FB) const {
725 : uint64_t Features = 0;
726 : if ((FB[AVR::FeatureSRAM]))
727 : Features |= Feature_HasSRAM;
728 : if ((FB[AVR::FeatureJMPCALL]))
729 : Features |= Feature_HasJMPCALL;
730 : if ((FB[AVR::FeatureIJMPCALL]))
731 : Features |= Feature_HasIJMPCALL;
732 : if ((FB[AVR::FeatureEIJMPCALL]))
733 : Features |= Feature_HasEIJMPCALL;
734 : if ((FB[AVR::FeatureADDSUBIW]))
735 : Features |= Feature_HasADDSUBIW;
736 : if ((FB[AVR::FeatureSmallStack]))
737 : Features |= Feature_HasSmallStack;
738 : if ((FB[AVR::FeatureMOVW]))
739 : Features |= Feature_HasMOVW;
740 : if ((FB[AVR::FeatureLPM]))
741 : Features |= Feature_HasLPM;
742 : if ((FB[AVR::FeatureLPMX]))
743 : Features |= Feature_HasLPMX;
744 : if ((FB[AVR::FeatureELPM]))
745 : Features |= Feature_HasELPM;
746 : if ((FB[AVR::FeatureELPMX]))
747 : Features |= Feature_HasELPMX;
748 : if ((FB[AVR::FeatureSPM]))
749 : Features |= Feature_HasSPM;
750 : if ((FB[AVR::FeatureSPMX]))
751 : Features |= Feature_HasSPMX;
752 : if ((FB[AVR::FeatureDES]))
753 : Features |= Feature_HasDES;
754 : if ((FB[AVR::FeatureRMW]))
755 : Features |= Feature_SupportsRMW;
756 : if ((FB[AVR::FeatureMultiplication]))
757 : Features |= Feature_SupportsMultiplication;
758 : if ((FB[AVR::FeatureBREAK]))
759 : Features |= Feature_HasBREAK;
760 : if ((FB[AVR::FeatureTinyEncoding]))
761 : Features |= Feature_HasTinyEncoding;
762 : return Features;
763 : }
764 :
765 : void AVRMCCodeEmitter::verifyInstructionPredicates(
766 : const MCInst &Inst, uint64_t AvailableFeatures) const {
767 : #ifndef NDEBUG
768 : static uint64_t RequiredFeatures[] = {
769 : 0, // PHI = 0
770 : 0, // INLINEASM = 1
771 : 0, // CFI_INSTRUCTION = 2
772 : 0, // EH_LABEL = 3
773 : 0, // GC_LABEL = 4
774 : 0, // ANNOTATION_LABEL = 5
775 : 0, // KILL = 6
776 : 0, // EXTRACT_SUBREG = 7
777 : 0, // INSERT_SUBREG = 8
778 : 0, // IMPLICIT_DEF = 9
779 : 0, // SUBREG_TO_REG = 10
780 : 0, // COPY_TO_REGCLASS = 11
781 : 0, // DBG_VALUE = 12
782 : 0, // DBG_LABEL = 13
783 : 0, // REG_SEQUENCE = 14
784 : 0, // COPY = 15
785 : 0, // BUNDLE = 16
786 : 0, // LIFETIME_START = 17
787 : 0, // LIFETIME_END = 18
788 : 0, // STACKMAP = 19
789 : 0, // FENTRY_CALL = 20
790 : 0, // PATCHPOINT = 21
791 : 0, // LOAD_STACK_GUARD = 22
792 : 0, // STATEPOINT = 23
793 : 0, // LOCAL_ESCAPE = 24
794 : 0, // FAULTING_OP = 25
795 : 0, // PATCHABLE_OP = 26
796 : 0, // PATCHABLE_FUNCTION_ENTER = 27
797 : 0, // PATCHABLE_RET = 28
798 : 0, // PATCHABLE_FUNCTION_EXIT = 29
799 : 0, // PATCHABLE_TAIL_CALL = 30
800 : 0, // PATCHABLE_EVENT_CALL = 31
801 : 0, // PATCHABLE_TYPED_EVENT_CALL = 32
802 : 0, // ICALL_BRANCH_FUNNEL = 33
803 : 0, // G_ADD = 34
804 : 0, // G_SUB = 35
805 : 0, // G_MUL = 36
806 : 0, // G_SDIV = 37
807 : 0, // G_UDIV = 38
808 : 0, // G_SREM = 39
809 : 0, // G_UREM = 40
810 : 0, // G_AND = 41
811 : 0, // G_OR = 42
812 : 0, // G_XOR = 43
813 : 0, // G_IMPLICIT_DEF = 44
814 : 0, // G_PHI = 45
815 : 0, // G_FRAME_INDEX = 46
816 : 0, // G_GLOBAL_VALUE = 47
817 : 0, // G_EXTRACT = 48
818 : 0, // G_UNMERGE_VALUES = 49
819 : 0, // G_INSERT = 50
820 : 0, // G_MERGE_VALUES = 51
821 : 0, // G_PTRTOINT = 52
822 : 0, // G_INTTOPTR = 53
823 : 0, // G_BITCAST = 54
824 : 0, // G_INTRINSIC_TRUNC = 55
825 : 0, // G_INTRINSIC_ROUND = 56
826 : 0, // G_LOAD = 57
827 : 0, // G_SEXTLOAD = 58
828 : 0, // G_ZEXTLOAD = 59
829 : 0, // G_STORE = 60
830 : 0, // G_ATOMIC_CMPXCHG_WITH_SUCCESS = 61
831 : 0, // G_ATOMIC_CMPXCHG = 62
832 : 0, // G_ATOMICRMW_XCHG = 63
833 : 0, // G_ATOMICRMW_ADD = 64
834 : 0, // G_ATOMICRMW_SUB = 65
835 : 0, // G_ATOMICRMW_AND = 66
836 : 0, // G_ATOMICRMW_NAND = 67
837 : 0, // G_ATOMICRMW_OR = 68
838 : 0, // G_ATOMICRMW_XOR = 69
839 : 0, // G_ATOMICRMW_MAX = 70
840 : 0, // G_ATOMICRMW_MIN = 71
841 : 0, // G_ATOMICRMW_UMAX = 72
842 : 0, // G_ATOMICRMW_UMIN = 73
843 : 0, // G_BRCOND = 74
844 : 0, // G_BRINDIRECT = 75
845 : 0, // G_INTRINSIC = 76
846 : 0, // G_INTRINSIC_W_SIDE_EFFECTS = 77
847 : 0, // G_ANYEXT = 78
848 : 0, // G_TRUNC = 79
849 : 0, // G_CONSTANT = 80
850 : 0, // G_FCONSTANT = 81
851 : 0, // G_VASTART = 82
852 : 0, // G_VAARG = 83
853 : 0, // G_SEXT = 84
854 : 0, // G_ZEXT = 85
855 : 0, // G_SHL = 86
856 : 0, // G_LSHR = 87
857 : 0, // G_ASHR = 88
858 : 0, // G_ICMP = 89
859 : 0, // G_FCMP = 90
860 : 0, // G_SELECT = 91
861 : 0, // G_UADDO = 92
862 : 0, // G_UADDE = 93
863 : 0, // G_USUBO = 94
864 : 0, // G_USUBE = 95
865 : 0, // G_SADDO = 96
866 : 0, // G_SADDE = 97
867 : 0, // G_SSUBO = 98
868 : 0, // G_SSUBE = 99
869 : 0, // G_UMULO = 100
870 : 0, // G_SMULO = 101
871 : 0, // G_UMULH = 102
872 : 0, // G_SMULH = 103
873 : 0, // G_FADD = 104
874 : 0, // G_FSUB = 105
875 : 0, // G_FMUL = 106
876 : 0, // G_FMA = 107
877 : 0, // G_FDIV = 108
878 : 0, // G_FREM = 109
879 : 0, // G_FPOW = 110
880 : 0, // G_FEXP = 111
881 : 0, // G_FEXP2 = 112
882 : 0, // G_FLOG = 113
883 : 0, // G_FLOG2 = 114
884 : 0, // G_FNEG = 115
885 : 0, // G_FPEXT = 116
886 : 0, // G_FPTRUNC = 117
887 : 0, // G_FPTOSI = 118
888 : 0, // G_FPTOUI = 119
889 : 0, // G_SITOFP = 120
890 : 0, // G_UITOFP = 121
891 : 0, // G_FABS = 122
892 : 0, // G_GEP = 123
893 : 0, // G_PTR_MASK = 124
894 : 0, // G_BR = 125
895 : 0, // G_INSERT_VECTOR_ELT = 126
896 : 0, // G_EXTRACT_VECTOR_ELT = 127
897 : 0, // G_SHUFFLE_VECTOR = 128
898 : 0, // G_CTTZ = 129
899 : 0, // G_CTTZ_ZERO_UNDEF = 130
900 : 0, // G_CTLZ = 131
901 : 0, // G_CTLZ_ZERO_UNDEF = 132
902 : 0, // G_CTPOP = 133
903 : 0, // G_BSWAP = 134
904 : 0, // G_ADDRSPACE_CAST = 135
905 : 0, // G_BLOCK_ADDR = 136
906 : 0, // ADCWRdRr = 137
907 : 0, // ADDWRdRr = 138
908 : 0, // ADJCALLSTACKDOWN = 139
909 : 0, // ADJCALLSTACKUP = 140
910 : 0, // ANDIWRdK = 141
911 : 0, // ANDWRdRr = 142
912 : 0, // ASRWRd = 143
913 : 0, // Asr16 = 144
914 : 0, // Asr8 = 145
915 : 0, // AtomicFence = 146
916 : 0, // AtomicLoad16 = 147
917 : 0, // AtomicLoad8 = 148
918 : 0, // AtomicLoadAdd16 = 149
919 : 0, // AtomicLoadAdd8 = 150
920 : 0, // AtomicLoadAnd16 = 151
921 : 0, // AtomicLoadAnd8 = 152
922 : 0, // AtomicLoadOr16 = 153
923 : 0, // AtomicLoadOr8 = 154
924 : 0, // AtomicLoadSub16 = 155
925 : 0, // AtomicLoadSub8 = 156
926 : 0, // AtomicLoadXor16 = 157
927 : 0, // AtomicLoadXor8 = 158
928 : 0, // AtomicStore16 = 159
929 : 0, // AtomicStore8 = 160
930 : 0, // COMWRd = 161
931 : 0, // CPCWRdRr = 162
932 : 0, // CPWRdRr = 163
933 : 0, // EORWRdRr = 164
934 : 0, // FRMIDX = 165
935 : 0, // INWRdA = 166
936 : Feature_HasSRAM | 0, // LDDWRdPtrQ = 167
937 : Feature_HasSRAM | 0, // LDDWRdYQ = 168
938 : 0, // LDIWRdK = 169
939 : Feature_HasSRAM | 0, // LDSWRdK = 170
940 : Feature_HasSRAM | 0, // LDWRdPtr = 171
941 : Feature_HasSRAM | 0, // LDWRdPtrPd = 172
942 : Feature_HasSRAM | 0, // LDWRdPtrPi = 173
943 : Feature_HasLPMX | 0, // LPMWRdZ = 174
944 : Feature_HasLPMX | 0, // LPMWRdZPi = 175
945 : 0, // LSLWRd = 176
946 : 0, // LSRWRd = 177
947 : 0, // Lsl16 = 178
948 : 0, // Lsl8 = 179
949 : 0, // Lsr16 = 180
950 : 0, // Lsr8 = 181
951 : 0, // ORIWRdK = 182
952 : 0, // ORWRdRr = 183
953 : 0, // OUTWARr = 184
954 : Feature_HasSRAM | 0, // POPWRd = 185
955 : Feature_HasSRAM | 0, // PUSHWRr = 186
956 : 0, // ROLWRd = 187
957 : 0, // RORWRd = 188
958 : 0, // Rol16 = 189
959 : 0, // Rol8 = 190
960 : 0, // Ror16 = 191
961 : 0, // Ror8 = 192
962 : 0, // SBCIWRdK = 193
963 : 0, // SBCWRdRr = 194
964 : 0, // SEXT = 195
965 : 0, // SPREAD = 196
966 : 0, // SPWRITE = 197
967 : 0, // STDSPQRr = 198
968 : Feature_HasSRAM | 0, // STDWPtrQRr = 199
969 : 0, // STDWSPQRr = 200
970 : Feature_HasSRAM | 0, // STSWKRr = 201
971 : Feature_HasSRAM | 0, // STWPtrPdRr = 202
972 : Feature_HasSRAM | 0, // STWPtrPiRr = 203
973 : Feature_HasSRAM | 0, // STWPtrRr = 204
974 : 0, // SUBIWRdK = 205
975 : 0, // SUBWRdRr = 206
976 : 0, // Select16 = 207
977 : 0, // Select8 = 208
978 : 0, // ZEXT = 209
979 : 0, // ADCRdRr = 210
980 : 0, // ADDRdRr = 211
981 : Feature_HasADDSUBIW | 0, // ADIWRdK = 212
982 : 0, // ANDIRdK = 213
983 : 0, // ANDRdRr = 214
984 : 0, // ASRRd = 215
985 : 0, // BCLRs = 216
986 : 0, // BLD = 217
987 : 0, // BRBCsk = 218
988 : 0, // BRBSsk = 219
989 : Feature_HasBREAK | 0, // BREAK = 220
990 : 0, // BREQk = 221
991 : 0, // BRGEk = 222
992 : 0, // BRLOk = 223
993 : 0, // BRLTk = 224
994 : 0, // BRMIk = 225
995 : 0, // BRNEk = 226
996 : 0, // BRPLk = 227
997 : 0, // BRSHk = 228
998 : 0, // BSETs = 229
999 : 0, // BST = 230
1000 : Feature_HasJMPCALL | 0, // CALLk = 231
1001 : 0, // CBIAb = 232
1002 : 0, // CBRRdK = 233
1003 : 0, // COMRd = 234
1004 : 0, // CPCRdRr = 235
1005 : 0, // CPIRdK = 236
1006 : 0, // CPRdRr = 237
1007 : 0, // CPSE = 238
1008 : 0, // DECRd = 239
1009 : Feature_HasDES | 0, // DESK = 240
1010 : Feature_HasEIJMPCALL | 0, // EICALL = 241
1011 : Feature_HasEIJMPCALL | 0, // EIJMP = 242
1012 : Feature_HasELPM | 0, // ELPM = 243
1013 : Feature_HasELPMX | 0, // ELPMRdZ = 244
1014 : Feature_HasELPMX | 0, // ELPMRdZPi = 245
1015 : 0, // EORRdRr = 246
1016 : Feature_SupportsMultiplication | 0, // FMUL = 247
1017 : Feature_SupportsMultiplication | 0, // FMULS = 248
1018 : Feature_SupportsMultiplication | 0, // FMULSU = 249
1019 : Feature_HasIJMPCALL | 0, // ICALL = 250
1020 : Feature_HasIJMPCALL | 0, // IJMP = 251
1021 : 0, // INCRd = 252
1022 : 0, // INRdA = 253
1023 : Feature_HasJMPCALL | 0, // JMPk = 254
1024 : Feature_SupportsRMW | 0, // LACZRd = 255
1025 : Feature_SupportsRMW | 0, // LASZRd = 256
1026 : Feature_SupportsRMW | 0, // LATZRd = 257
1027 : Feature_HasSRAM | 0, // LDDRdPtrQ = 258
1028 : 0, // LDIRdK = 259
1029 : Feature_HasSRAM | 0, // LDRdPtr = 260
1030 : Feature_HasSRAM | 0, // LDRdPtrPd = 261
1031 : Feature_HasSRAM | 0, // LDRdPtrPi = 262
1032 : Feature_HasSRAM | 0, // LDSRdK = 263
1033 : Feature_HasLPM | 0, // LPM = 264
1034 : Feature_HasLPMX | 0, // LPMRdZ = 265
1035 : Feature_HasLPMX | 0, // LPMRdZPi = 266
1036 : 0, // LSRRd = 267
1037 : 0, // MOVRdRr = 268
1038 : Feature_HasMOVW | 0, // MOVWRdRr = 269
1039 : Feature_SupportsMultiplication | 0, // MULRdRr = 270
1040 : Feature_SupportsMultiplication | 0, // MULSRdRr = 271
1041 : Feature_SupportsMultiplication | 0, // MULSURdRr = 272
1042 : 0, // NEGRd = 273
1043 : 0, // NOP = 274
1044 : 0, // ORIRdK = 275
1045 : 0, // ORRdRr = 276
1046 : 0, // OUTARr = 277
1047 : Feature_HasSRAM | 0, // POPRd = 278
1048 : Feature_HasSRAM | 0, // PUSHRr = 279
1049 : 0, // RCALLk = 280
1050 : 0, // RET = 281
1051 : 0, // RETI = 282
1052 : 0, // RJMPk = 283
1053 : 0, // RORRd = 284
1054 : 0, // SBCIRdK = 285
1055 : 0, // SBCRdRr = 286
1056 : 0, // SBIAb = 287
1057 : 0, // SBICAb = 288
1058 : 0, // SBISAb = 289
1059 : Feature_HasADDSUBIW | 0, // SBIWRdK = 290
1060 : 0, // SBRCRrB = 291
1061 : 0, // SBRSRrB = 292
1062 : 0, // SLEEP = 293
1063 : Feature_HasSPM | 0, // SPM = 294
1064 : Feature_HasSPMX | 0, // SPMZPi = 295
1065 : Feature_HasSRAM | 0, // STDPtrQRr = 296
1066 : Feature_HasSRAM | 0, // STPtrPdRr = 297
1067 : Feature_HasSRAM | 0, // STPtrPiRr = 298
1068 : Feature_HasSRAM | 0, // STPtrRr = 299
1069 : Feature_HasSRAM | 0, // STSKRr = 300
1070 : 0, // SUBIRdK = 301
1071 : 0, // SUBRdRr = 302
1072 : 0, // SWAPRd = 303
1073 : 0, // WDR = 304
1074 : Feature_SupportsRMW | 0, // XCHZRd = 305
1075 : };
1076 :
1077 : assert(Inst.getOpcode() < 306);
1078 : uint64_t MissingFeatures =
1079 : (AvailableFeatures & RequiredFeatures[Inst.getOpcode()]) ^
1080 : RequiredFeatures[Inst.getOpcode()];
1081 : if (MissingFeatures) {
1082 : std::ostringstream Msg;
1083 : Msg << "Attempting to emit " << MCII.getName(Inst.getOpcode()).str()
1084 : << " instruction but the ";
1085 : for (unsigned i = 0; i < 8 * sizeof(MissingFeatures); ++i)
1086 : if (MissingFeatures & (1ULL << i))
1087 : Msg << SubtargetFeatureNames[i] << " ";
1088 : Msg << "predicate(s) are not met";
1089 : report_fatal_error(Msg.str());
1090 : }
1091 : #else
1092 : // Silence unused variable warning on targets that don't use MCII for other purposes (e.g. BPF).
1093 : (void)MCII;
1094 : #endif // NDEBUG
1095 : }
1096 : #endif
|