LLVM: lib/Target/Hexagon/HexagonBitTracker.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
27#include
28#include
29#include
30#include
31#include
32#include
33
34using namespace llvm;
35
37
42 : MachineEvaluator(tri, mri), MF(mf), MFI(mf.getFrameInfo()), TII(tii) {
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 unsigned InVirtReg, InPhysReg = 0;
60
62 Type *ATy = Arg.getType();
63 unsigned Width = 0;
67 Width = 32;
68
69
70 if (Width == 0 || Width > 64)
71 break;
72 if (Arg.hasAttribute(Attribute::ByVal))
73 continue;
74 InPhysReg = getNextPhysReg(InPhysReg, Width);
75 if (!InPhysReg)
76 break;
77 InVirtReg = getVirtRegFor(InPhysReg);
78 if (!InVirtReg)
79 continue;
80 if (Arg.hasAttribute(Attribute::SExt))
81 VRX.insert(std::make_pair(InVirtReg, ExtType(ExtType::SExt, Width)));
82 else if (Arg.hasAttribute(Attribute::ZExt))
83 VRX.insert(std::make_pair(InVirtReg, ExtType(ExtType::ZExt, Width)));
84 }
85}
86
88 if (Sub == 0)
89 return MachineEvaluator::mask(Reg, 0);
94 bool IsSubLo = (Sub == HRI.getHexagonSubRegIndex(RC, Hexagon::ps_sub_lo));
95 switch (ID) {
96 case Hexagon::DoubleRegsRegClassID:
97 case Hexagon::HvxWRRegClassID:
98 case Hexagon::HvxVQRRegClassID:
101 default:
102 break;
103 }
104#ifndef NDEBUG
107#endif
109}
110
112 using namespace Hexagon;
114 if (HST.useHVXOps()) {
115 for (auto &RC : {HvxVRRegClass, HvxWRRegClass, HvxQRRegClass,
116 HvxVQRRegClass})
117 if (RC.contains(Reg))
119 }
120
123
125 (Twine("Unhandled physical register") + TRI.getName(Reg)).str().c_str());
126}
127
130 if (Idx == 0)
131 return RC;
132
133#ifndef NDEBUG
137 assert(IsSubLo != IsSubHi && "Must refer to either low or high subreg");
138#endif
139
140 switch (RC.getID()) {
141 case Hexagon::DoubleRegsRegClassID:
142 return Hexagon::IntRegsRegClass;
143 case Hexagon::HvxWRRegClassID:
144 return Hexagon::HvxVRRegClass;
145 case Hexagon::HvxVQRRegClassID:
146 return Hexagon::HvxWRRegClass;
147 default:
148 break;
149 }
150#ifndef NDEBUG
151 dbgs() << "Reg class id: " << RC.getID() << " idx: " << Idx << '\n';
152#endif
153 llvm_unreachable("Unimplemented combination of reg class/subreg idx");
154}
155
156namespace {
157
158class RegisterRefs {
159 std::vectorBT::RegisterRef Vector;
160
161public:
163 for (unsigned i = 0, n = Vector.size(); i < n; ++i) {
167
168
169 }
170 }
171
172 size_t size() const { return Vector.size(); }
173
175
178 }
179};
180
181}
182
186 using namespace Hexagon;
187
188 unsigned NumDefs = 0;
189
190
192 if (!MO.isReg() || !MO.isDef())
193 continue;
194 NumDefs++;
195 assert(MO.getSubReg() == 0);
196 }
197
198 if (NumDefs == 0)
199 return false;
200
201 unsigned Opc = MI.getOpcode();
202
203 if (MI.mayLoad()) {
204 switch (Opc) {
205
206
207 case CONST32:
208 case CONST64:
209 break;
210 default:
211 return evaluateLoad(MI, Inputs, Outputs);
212 }
213 }
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229 if (MI.isCopy()) {
230 if (evaluateFormalCopy(MI, Inputs, Outputs))
231 return true;
232 }
233
234
235
236
237
238
239
241 if (MO.isGlobal() || MO.isBlockAddress() || MO.isSymbol() || MO.isJTI() ||
242 MO.isCPI())
243 return false;
244 }
245
246 RegisterRefs Reg(MI);
247#define op(i) MI.getOperand(i)
248#define rc(i) RegisterCell::ref(getCell(Reg[i], Inputs))
249#define im(i) MI.getOperand(i).getImm()
250
251
252 if (Reg.size() == 0)
253 return false;
254
255
257 -> bool {
258 putCell(Reg[0], Val, Outputs);
259 return true;
260 };
261
262 auto cop = [this, &Reg, &MI, &Inputs](unsigned N,
265 if (Op.isImm())
266 return eIMM(Op.getImm(), W);
267 if (.isReg())
271 };
272
276 return eXTR(RC, 0, RW);
277 };
278
283 return eXTR(RC, W-RW, W);
284 };
285
289 return eXTR(RC, N*16, N*16+16);
290 };
291
297 I += 2;
298 while (I*BW < Ws) {
300 I += 2;
301 }
302 return RC;
303 };
304
305
306
307
308
310
311
312 unsigned Reg0 = Reg[0].Reg;
313
314 switch (Opc) {
315
316
317 case A2_tfrsi:
318 case A2_tfrpi:
319 case CONST32:
320 case CONST64:
321 return rr0(eIMM(im(1), W0), Outputs);
322 case PS_false:
323 return rr0(RegisterCell(W0).fill(0, W0, BT::BitValue::Zero), Outputs);
324 case PS_true:
325 return rr0(RegisterCell(W0).fill(0, W0, BT::BitValue::One), Outputs);
326 case PS_fi: {
327 int FI = op(1).getIndex();
328 int Off = op(2).getImm();
332 RC.fill(0, L, BT::BitValue::Zero);
333 return rr0(RC, Outputs);
334 }
335
336
337
338 case A2_tfr:
339 case A2_tfrp:
340 case C2_pxfer_map:
341 return rr0(rc(1), Outputs);
342 case C2_tfrpr: {
344 uint16_t PW = 8;
348 RC.fill(PW, RW, BT::BitValue::Zero);
349 return rr0(RC, Outputs);
350 }
351 case C2_tfrrp: {
353 uint16_t PW = 8;
355 RC.fill(PW, RW, BT::BitValue::Zero);
356 return rr0(eINS(RC, eXTR(rc(1), 0, PW), 0), Outputs);
357 }
358
359
360
361 case A2_abs:
362 case A2_absp:
363
364 break;
365
366 case A2_addsp: {
368 assert(W0 == 64 && W1 == 32);
371 return rr0(RC, Outputs);
372 }
373 case A2_add:
374 case A2_addp:
375 return rr0(eADD(rc(1), rc(2)), Outputs);
376 case A2_addi:
377 return rr0(eADD(rc(1), eIMM(im(2), W0)), Outputs);
378 case S4_addi_asl_ri: {
380 return rr0(RC, Outputs);
381 }
382 case S4_addi_lsr_ri: {
384 return rr0(RC, Outputs);
385 }
386 case S4_addaddi: {
388 return rr0(RC, Outputs);
389 }
390 case M4_mpyri_addi: {
393 return rr0(RC, Outputs);
394 }
395 case M4_mpyrr_addi: {
398 return rr0(RC, Outputs);
399 }
400 case M4_mpyri_addr_u2: {
403 return rr0(RC, Outputs);
404 }
405 case M4_mpyri_addr: {
408 return rr0(RC, Outputs);
409 }
410 case M4_mpyrr_addr: {
413 return rr0(RC, Outputs);
414 }
415 case S4_subaddi: {
417 return rr0(RC, Outputs);
418 }
419 case M2_accii: {
421 return rr0(RC, Outputs);
422 }
423 case M2_acci: {
425 return rr0(RC, Outputs);
426 }
427 case M2_subacc: {
429 return rr0(RC, Outputs);
430 }
431 case S2_addasl_rrri: {
433 return rr0(RC, Outputs);
434 }
435 case C4_addipc: {
437 RPC.fill(0, 2, BT::BitValue::Zero);
438 return rr0(eADD(RPC, eIMM(im(2), W0)), Outputs);
439 }
440 case A2_sub:
441 case A2_subp:
442 return rr0(eSUB(rc(1), rc(2)), Outputs);
443 case A2_subri:
444 return rr0(eSUB(eIMM(im(1), W0), rc(2)), Outputs);
445 case S4_subi_asl_ri: {
447 return rr0(RC, Outputs);
448 }
449 case S4_subi_lsr_ri: {
451 return rr0(RC, Outputs);
452 }
453 case M2_naccii: {
455 return rr0(RC, Outputs);
456 }
457 case M2_nacci: {
459 return rr0(RC, Outputs);
460 }
461
462 case A2_negp:
463 return rr0(eSUB(eIMM(0, W0), rc(1)), Outputs);
464
465 case M2_mpy_up: {
467 return rr0(hi(M, W0), Outputs);
468 }
469 case M2_dpmpyss_s0:
470 return rr0(eMLS(rc(1), rc(2)), Outputs);
471 case M2_dpmpyss_acc_s0:
472 return rr0(eADD(rc(1), eMLS(rc(2), rc(3))), Outputs);
473 case M2_dpmpyss_nac_s0:
474 return rr0(eSUB(rc(1), eMLS(rc(2), rc(3))), Outputs);
475 case M2_mpyi: {
477 return rr0(lo(M, W0), Outputs);
478 }
479 case M2_macsip: {
482 return rr0(RC, Outputs);
483 }
484 case M2_macsin: {
487 return rr0(RC, Outputs);
488 }
489 case M2_maci: {
492 return rr0(RC, Outputs);
493 }
494 case M2_mnaci: {
497 return rr0(RC, Outputs);
498 }
499 case M2_mpysmi: {
501 return rr0(lo(M, 32), Outputs);
502 }
503 case M2_mpysin: {
505 return rr0(lo(M, 32), Outputs);
506 }
507 case M2_mpysip: {
509 return rr0(lo(M, 32), Outputs);
510 }
511 case M2_mpyu_up: {
513 return rr0(hi(M, W0), Outputs);
514 }
515 case M2_dpmpyuu_s0:
516 return rr0(eMLU(rc(1), rc(2)), Outputs);
517 case M2_dpmpyuu_acc_s0:
518 return rr0(eADD(rc(1), eMLU(rc(2), rc(3))), Outputs);
519 case M2_dpmpyuu_nac_s0:
520 return rr0(eSUB(rc(1), eMLU(rc(2), rc(3))), Outputs);
521
522
523
524
525 case A2_andir:
526 return rr0(eAND(rc(1), eIMM(im(2), W0)), Outputs);
527 case A2_and:
528 case A2_andp:
529 return rr0(eAND(rc(1), rc(2)), Outputs);
530 case A4_andn:
531 case A4_andnp:
532 return rr0(eAND(rc(1), eNOT(rc(2))), Outputs);
533 case S4_andi_asl_ri: {
535 return rr0(RC, Outputs);
536 }
537 case S4_andi_lsr_ri: {
539 return rr0(RC, Outputs);
540 }
541 case M4_and_and:
542 return rr0(eAND(rc(1), eAND(rc(2), rc(3))), Outputs);
543 case M4_and_andn:
545 case M4_and_or:
546 return rr0(eAND(rc(1), eORL(rc(2), rc(3))), Outputs);
547 case M4_and_xor:
548 return rr0(eAND(rc(1), eXOR(rc(2), rc(3))), Outputs);
549 case A2_orir:
550 return rr0(eORL(rc(1), eIMM(im(2), W0)), Outputs);
551 case A2_or:
552 case A2_orp:
553 return rr0(eORL(rc(1), rc(2)), Outputs);
554 case A4_orn:
555 case A4_ornp:
556 return rr0(eORL(rc(1), eNOT(rc(2))), Outputs);
557 case S4_ori_asl_ri: {
559 return rr0(RC, Outputs);
560 }
561 case S4_ori_lsr_ri: {
563 return rr0(RC, Outputs);
564 }
565 case M4_or_and:
566 return rr0(eORL(rc(1), eAND(rc(2), rc(3))), Outputs);
567 case M4_or_andn:
569 case S4_or_andi:
570 case S4_or_andix: {
572 return rr0(RC, Outputs);
573 }
574 case S4_or_ori: {
576 return rr0(RC, Outputs);
577 }
578 case M4_or_or:
579 return rr0(eORL(rc(1), eORL(rc(2), rc(3))), Outputs);
580 case M4_or_xor:
581 return rr0(eORL(rc(1), eXOR(rc(2), rc(3))), Outputs);
582 case A2_xor:
583 case A2_xorp:
584 return rr0(eXOR(rc(1), rc(2)), Outputs);
585 case M4_xor_and:
586 return rr0(eXOR(rc(1), eAND(rc(2), rc(3))), Outputs);
587 case M4_xor_andn:
589 case M4_xor_or:
590 return rr0(eXOR(rc(1), eORL(rc(2), rc(3))), Outputs);
591 case M4_xor_xacc:
592 return rr0(eXOR(rc(1), eXOR(rc(2), rc(3))), Outputs);
593 case A2_not:
594 case A2_notp:
595 return rr0(eNOT(rc(1)), Outputs);
596
597 case S2_asl_i_r:
598 case S2_asl_i_p:
599 return rr0(eASL(rc(1), im(2)), Outputs);
600 case A2_aslh:
601 return rr0(eASL(rc(1), 16), Outputs);
602 case S2_asl_i_r_acc:
603 case S2_asl_i_p_acc:
604 return rr0(eADD(rc(1), eASL(rc(2), im(3))), Outputs);
605 case S2_asl_i_r_nac:
606 case S2_asl_i_p_nac:
607 return rr0(eSUB(rc(1), eASL(rc(2), im(3))), Outputs);
608 case S2_asl_i_r_and:
609 case S2_asl_i_p_and:
610 return rr0(eAND(rc(1), eASL(rc(2), im(3))), Outputs);
611 case S2_asl_i_r_or:
612 case S2_asl_i_p_or:
613 return rr0(eORL(rc(1), eASL(rc(2), im(3))), Outputs);
614 case S2_asl_i_r_xacc:
615 case S2_asl_i_p_xacc:
616 return rr0(eXOR(rc(1), eASL(rc(2), im(3))), Outputs);
617 case S2_asl_i_vh:
618 case S2_asl_i_vw:
619
620 break;
621
622 case S2_asr_i_r:
623 case S2_asr_i_p:
624 return rr0(eASR(rc(1), im(2)), Outputs);
625 case A2_asrh:
626 return rr0(eASR(rc(1), 16), Outputs);
627 case S2_asr_i_r_acc:
628 case S2_asr_i_p_acc:
629 return rr0(eADD(rc(1), eASR(rc(2), im(3))), Outputs);
630 case S2_asr_i_r_nac:
631 case S2_asr_i_p_nac:
632 return rr0(eSUB(rc(1), eASR(rc(2), im(3))), Outputs);
633 case S2_asr_i_r_and:
634 case S2_asr_i_p_and:
635 return rr0(eAND(rc(1), eASR(rc(2), im(3))), Outputs);
636 case S2_asr_i_r_or:
637 case S2_asr_i_p_or:
638 return rr0(eORL(rc(1), eASR(rc(2), im(3))), Outputs);
639 case S2_asr_i_r_rnd: {
640
641
645 return rr0(eXTR(RC, 0, W0), Outputs);
646 }
647 case S2_asr_i_r_rnd_goodsyntax: {
648 int64_t S = im(2);
649 if (S == 0)
650 return rr0(rc(1), Outputs);
651
654 return rr0(eXTR(RC, 0, W0), Outputs);
655 }
656 case S2_asr_r_vh:
657 case S2_asr_i_vw:
658 case S2_asr_i_svw_trun:
659
660 break;
661
662 case S2_lsr_i_r:
663 case S2_lsr_i_p:
664 return rr0(eLSR(rc(1), im(2)), Outputs);
665 case S2_lsr_i_r_acc:
666 case S2_lsr_i_p_acc:
667 return rr0(eADD(rc(1), eLSR(rc(2), im(3))), Outputs);
668 case S2_lsr_i_r_nac:
669 case S2_lsr_i_p_nac:
670 return rr0(eSUB(rc(1), eLSR(rc(2), im(3))), Outputs);
671 case S2_lsr_i_r_and:
672 case S2_lsr_i_p_and:
673 return rr0(eAND(rc(1), eLSR(rc(2), im(3))), Outputs);
674 case S2_lsr_i_r_or:
675 case S2_lsr_i_p_or:
676 return rr0(eORL(rc(1), eLSR(rc(2), im(3))), Outputs);
677 case S2_lsr_i_r_xacc:
678 case S2_lsr_i_p_xacc:
679 return rr0(eXOR(rc(1), eLSR(rc(2), im(3))), Outputs);
680
681 case S2_clrbit_i: {
683 RC[im(2)] = BT::BitValue::Zero;
684 return rr0(RC, Outputs);
685 }
686 case S2_setbit_i: {
688 RC[im(2)] = BT::BitValue::One;
689 return rr0(RC, Outputs);
690 }
691 case S2_togglebit_i: {
694 RC[BX] = RC[BX].is(0) ? BT::BitValue::One
695 : RC[BX].is(1) ? BT::BitValue::Zero
696 : BT::BitValue::self();
697 return rr0(RC, Outputs);
698 }
699
700 case A4_bitspliti: {
703
704 const BT::BitValue Zero = BT::BitValue::Zero;
706 .fill(W1+(W1-BX), W0, Zero);
709 return rr0(RC, Outputs);
710 }
711 case S4_extract:
712 case S4_extractp:
713 case S2_extractu:
714 case S2_extractup: {
717 if (Wd == 0)
718 return rr0(eIMM(0, W0), Outputs);
719
720
723
725 if (Opc == S2_extractu || Opc == S2_extractup)
726 return rr0(eZXT(RC, Wd), Outputs);
727 return rr0(eSXT(RC, Wd), Outputs);
728 }
729 case S2_insert:
730 case S2_insertp: {
733
734 if (Wd+Of > W0)
735 Wd = W0-Of;
736 if (Wd == 0)
737 return rr0(rc(1), Outputs);
738 return rr0(eINS(rc(1), eXTR(rc(2), 0, Wd), Of), Outputs);
739 }
740
741
742
743 case A2_combineii:
744 case A4_combineii:
745 case A4_combineir:
746 case A4_combineri:
747 case A2_combinew:
748 case V6_vcombine:
750 return rr0(cop(2, W0/2).cat(cop(1, W0/2)), Outputs);
751 case A2_combine_ll:
752 case A2_combine_lh:
753 case A2_combine_hl:
754 case A2_combine_hh: {
757
758 unsigned LoH = !(Opc == A2_combine_ll || Opc == A2_combine_hl);
759
760 unsigned HiH = !(Opc == A2_combine_ll || Opc == A2_combine_lh);
764 return rr0(RC, Outputs);
765 }
766 case S2_packhl: {
772 .cat(half(R1, 1));
773 return rr0(RC, Outputs);
774 }
775 case S2_shuffeb: {
777 return rr0(RC, Outputs);
778 }
779 case S2_shuffeh: {
781 return rr0(RC, Outputs);
782 }
783 case S2_shuffob: {
785 return rr0(RC, Outputs);
786 }
787 case S2_shuffoh: {
789 return rr0(RC, Outputs);
790 }
791 case C2_mask: {
793 uint16_t WP = 8;
794 assert(WR == 64 && WP == 8);
797 for (uint16_t i = 0; i < WP; ++i) {
799 BT::BitValue F = (V.is(0) || V.is(1)) ? V : BT::BitValue::self();
801 }
802 return rr0(RC, Outputs);
803 }
804
805
806
807 case C2_muxii:
808 case C2_muxir:
809 case C2_muxri:
810 case C2_mux: {
814 if (PC0.is(0) || PC0.is(1))
816 R2.meet(R3, Reg[0].Reg);
817 return rr0(R2, Outputs);
818 }
819 case C2_vmux:
820
821 break;
822
823
824
825 case A2_sxtb:
826 return rr0(eSXT(rc(1), 8), Outputs);
827 case A2_sxth:
828 return rr0(eSXT(rc(1), 16), Outputs);
829 case A2_sxtw: {
831 assert(W0 == 64 && W1 == 32);
833 return rr0(RC, Outputs);
834 }
835 case A2_zxtb:
836 return rr0(eZXT(rc(1), 8), Outputs);
837 case A2_zxth:
838 return rr0(eZXT(rc(1), 16), Outputs);
839
840
841
842 case A2_satb:
844 case A2_sath:
846 case A2_satub:
848 case A2_satuh:
850
851
852
853 case S2_cl0:
854 case S2_cl0p:
855
856 return rr0(eCLB(rc(1), false, 32), Outputs);
857 case S2_cl1:
858 case S2_cl1p:
859 return rr0(eCLB(rc(1), true, 32), Outputs);
860 case S2_clb:
861 case S2_clbp: {
866 return rr0(eCLB(R1, TV, 32), Outputs);
867 break;
868 }
869 case S2_ct0:
870 case S2_ct0p:
871 return rr0(eCTB(rc(1), false, 32), Outputs);
872 case S2_ct1:
873 case S2_ct1p:
874 return rr0(eCTB(rc(1), true, 32), Outputs);
875 case S5_popcountp:
876
877 break;
878
879 case C2_all8: {
881 bool Has0 = false, All1 = true;
882 for (uint16_t i = 0; i < 8; ++i) {
883 if (!P1[i].is(1))
884 All1 = false;
885 if (!P1[i].is(0))
886 continue;
887 Has0 = true;
888 break;
889 }
890 if (!Has0 && !All1)
891 break;
893 RC.fill(0, W0, (All1 ? BT::BitValue::One : BT::BitValue::Zero));
894 return rr0(RC, Outputs);
895 }
896 case C2_any8: {
898 bool Has1 = false, All0 = true;
899 for (uint16_t i = 0; i < 8; ++i) {
900 if (!P1[i].is(0))
901 All0 = false;
902 if (!P1[i].is(1))
903 continue;
904 Has1 = true;
905 break;
906 }
907 if (!Has1 && !All0)
908 break;
910 RC.fill(0, W0, (Has1 ? BT::BitValue::One : BT::BitValue::Zero));
911 return rr0(RC, Outputs);
912 }
913 case C2_and:
914 return rr0(eAND(rc(1), rc(2)), Outputs);
915 case C2_andn:
916 return rr0(eAND(rc(1), eNOT(rc(2))), Outputs);
917 case C2_not:
918 return rr0(eNOT(rc(1)), Outputs);
919 case C2_or:
920 return rr0(eORL(rc(1), rc(2)), Outputs);
921 case C2_orn:
922 return rr0(eORL(rc(1), eNOT(rc(2))), Outputs);
923 case C2_xor:
924 return rr0(eXOR(rc(1), rc(2)), Outputs);
925 case C4_and_and:
926 return rr0(eAND(rc(1), eAND(rc(2), rc(3))), Outputs);
927 case C4_and_andn:
929 case C4_and_or:
930 return rr0(eAND(rc(1), eORL(rc(2), rc(3))), Outputs);
931 case C4_and_orn:
933 case C4_or_and:
934 return rr0(eORL(rc(1), eAND(rc(2), rc(3))), Outputs);
935 case C4_or_andn:
937 case C4_or_or:
938 return rr0(eORL(rc(1), eORL(rc(2), rc(3))), Outputs);
939 case C4_or_orn:
941 case C2_bitsclr:
942 case C2_bitsclri:
943 case C2_bitsset:
944 case C4_nbitsclr:
945 case C4_nbitsclri:
946 case C4_nbitsset:
947
948 break;
949 case S2_tstbit_i:
950 case S4_ntstbit_i: {
952 if (V.is(0) || V.is(1)) {
953
954 bool TV = (Opc == S2_tstbit_i);
955 BT::BitValue F = V.is(TV) ? BT::BitValue::One : BT::BitValue::Zero;
956 return rr0(RegisterCell(W0).fill(0, W0, F), Outputs);
957 }
958 break;
959 }
960
961 default:
962
963
964 if (unsigned DefR = getUniqueDefVReg(MI)) {
965 if (MRI.getRegClass(DefR) == &Hexagon::PredRegsRegClass) {
968 uint16_t PW = 8;
970 RC.fill(PW, RW, BT::BitValue::Zero);
971 putCell(PD, RC, Outputs);
972 return true;
973 }
974 }
975 return MachineEvaluator::evaluate(MI, Inputs, Outputs);
976 }
977 #undef im
978 #undef rc
979 #undef op
980 return false;
981}
982
986 bool &FallsThru) const {
987
988
990 bool SimpleBranch = false;
991 bool Negated = false;
992 switch (Opc) {
993 case Hexagon::J2_jumpf:
994 case Hexagon::J2_jumpfpt:
995 case Hexagon::J2_jumpfnew:
996 case Hexagon::J2_jumpfnewpt:
997 Negated = true;
998 [[fallthrough]];
999 case Hexagon::J2_jumpt:
1000 case Hexagon::J2_jumptpt:
1001 case Hexagon::J2_jumptnew:
1002 case Hexagon::J2_jumptnewpt:
1003
1004
1005 SimpleBranch = true;
1006 break;
1007 case Hexagon::J2_jump:
1009 FallsThru = false;
1010 return true;
1011 default:
1012
1013
1014 return false;
1015 }
1016
1017 if (!SimpleBranch)
1018 return false;
1019
1020
1024
1025
1026 if (.is(0) &&
.is(1))
1027 return false;
1028
1029
1030 if (.is(!Negated)) {
1031
1032 FallsThru = true;
1033 return true;
1034 }
1035
1037 FallsThru = false;
1038 return true;
1039}
1040
1041unsigned HexagonEvaluator::getUniqueDefVReg(const MachineInstr &MI) const {
1042 unsigned DefReg = 0;
1044 if (.isReg() ||
.isDef())
1045 continue;
1047 if (!R.isVirtual())
1048 continue;
1049 if (DefReg != 0)
1050 return 0;
1051 DefReg = R;
1052 }
1053 return DefReg;
1054}
1055
1056bool HexagonEvaluator::evaluateLoad(const MachineInstr &MI,
1057 const CellMapType &Inputs,
1058 CellMapType &Outputs) const {
1059 using namespace Hexagon;
1060
1062 return false;
1063 assert(MI.mayLoad() && "A load that mayn't?");
1064 unsigned Opc = MI.getOpcode();
1065
1067 bool SignEx;
1068
1069 switch (Opc) {
1070 default:
1071 return false;
1072
1073#if 0
1074
1075 case L2_loadalignb_pbr:
1076 case L2_loadalignb_pcr:
1077 case L2_loadalignb_pi:
1078
1079 case L2_loadalignh_pbr:
1080 case L2_loadalignh_pcr:
1081 case L2_loadalignh_pi:
1082
1083 case L2_loadbsw2_pbr:
1084 case L2_loadbsw2_pci:
1085 case L2_loadbsw2_pcr:
1086 case L2_loadbsw2_pi:
1087 case L2_loadbsw4_pbr:
1088 case L2_loadbsw4_pci:
1089 case L2_loadbsw4_pcr:
1090 case L2_loadbsw4_pi:
1091
1092 case L2_loadbzw2_pbr:
1093 case L2_loadbzw2_pci:
1094 case L2_loadbzw2_pcr:
1095 case L2_loadbzw2_pi:
1096 case L2_loadbzw4_pbr:
1097 case L2_loadbzw4_pci:
1098 case L2_loadbzw4_pcr:
1099 case L2_loadbzw4_pi:
1100#endif
1101
1102 case L2_loadrbgp:
1103 case L2_loadrb_io:
1104 case L2_loadrb_pbr:
1105 case L2_loadrb_pci:
1106 case L2_loadrb_pcr:
1107 case L2_loadrb_pi:
1108 case PS_loadrbabs:
1109 case L4_loadrb_ap:
1110 case L4_loadrb_rr:
1111 case L4_loadrb_ur:
1112 BitNum = 8;
1113 SignEx = true;
1114 break;
1115
1116 case L2_loadrubgp:
1117 case L2_loadrub_io:
1118 case L2_loadrub_pbr:
1119 case L2_loadrub_pci:
1120 case L2_loadrub_pcr:
1121 case L2_loadrub_pi:
1122 case PS_loadrubabs:
1123 case L4_loadrub_ap:
1124 case L4_loadrub_rr:
1125 case L4_loadrub_ur:
1126 BitNum = 8;
1127 SignEx = false;
1128 break;
1129
1130 case L2_loadrhgp:
1131 case L2_loadrh_io:
1132 case L2_loadrh_pbr:
1133 case L2_loadrh_pci:
1134 case L2_loadrh_pcr:
1135 case L2_loadrh_pi:
1136 case PS_loadrhabs:
1137 case L4_loadrh_ap:
1138 case L4_loadrh_rr:
1139 case L4_loadrh_ur:
1140 BitNum = 16;
1141 SignEx = true;
1142 break;
1143
1144 case L2_loadruhgp:
1145 case L2_loadruh_io:
1146 case L2_loadruh_pbr:
1147 case L2_loadruh_pci:
1148 case L2_loadruh_pcr:
1149 case L2_loadruh_pi:
1150 case L4_loadruh_rr:
1151 case PS_loadruhabs:
1152 case L4_loadruh_ap:
1153 case L4_loadruh_ur:
1154 BitNum = 16;
1155 SignEx = false;
1156 break;
1157
1158 case L2_loadrigp:
1159 case L2_loadri_io:
1160 case L2_loadri_pbr:
1161 case L2_loadri_pci:
1162 case L2_loadri_pcr:
1163 case L2_loadri_pi:
1164 case L2_loadw_locked:
1165 case PS_loadriabs:
1166 case L4_loadri_ap:
1167 case L4_loadri_rr:
1168 case L4_loadri_ur:
1169 case LDriw_pred:
1170 BitNum = 32;
1171 SignEx = true;
1172 break;
1173
1174 case L2_loadrdgp:
1175 case L2_loadrd_io:
1176 case L2_loadrd_pbr:
1177 case L2_loadrd_pci:
1178 case L2_loadrd_pcr:
1179 case L2_loadrd_pi:
1180 case L4_loadd_locked:
1181 case PS_loadrdabs:
1182 case L4_loadrd_ap:
1183 case L4_loadrd_rr:
1184 case L4_loadrd_ur:
1185 BitNum = 64;
1186 SignEx = true;
1187 break;
1188 }
1189
1193
1195 assert(W >= BitNum && BitNum > 0);
1197
1198 for (uint16_t i = 0; i < BitNum; ++i)
1199 Res[i] = BT::BitValue::self(BT::BitRef(RD.Reg, i));
1200
1201 if (SignEx) {
1203 for (uint16_t i = BitNum; i < W; ++i)
1204 Res[i] = BT::BitValue::ref(Sign);
1205 } else {
1206 for (uint16_t i = BitNum; i < W; ++i)
1207 Res[i] = BT::BitValue::Zero;
1208 }
1209
1210 putCell(RD, Res, Outputs);
1211 return true;
1212}
1213
1214bool HexagonEvaluator::evaluateFormalCopy(const MachineInstr &MI,
1215 const CellMapType &Inputs,
1216 CellMapType &Outputs) const {
1217
1218
1220
1223 assert(RD.Sub == 0);
1224 if (!RS.Reg.isPhysical())
1225 return false;
1228 return false;
1229
1231
1232
1233
1234
1236
1238
1239 if (F->second.Type == ExtType::SExt)
1241 else if (F->second.Type == ExtType::ZExt)
1243
1244 putCell(RD, Res, Outputs);
1245 return true;
1246}
1247
1248unsigned HexagonEvaluator::getNextPhysReg(unsigned PReg, unsigned Width) const {
1249 using namespace Hexagon;
1250
1251 bool Is64 = DoubleRegsRegClass.contains(PReg);
1252 assert(PReg == 0 || Is64 || IntRegsRegClass.contains(PReg));
1253
1254 static const unsigned Phys32[] = { R0, R1, R2, R3, R4, R5 };
1255 static const unsigned Phys64[] = { D0, D1, D2 };
1256 const unsigned Num32 = sizeof(Phys32)/sizeof(unsigned);
1257 const unsigned Num64 = sizeof(Phys64)/sizeof(unsigned);
1258
1259
1260 if (PReg == 0)
1261 return (Width <= 32) ? Phys32[0] : Phys64[0];
1262
1263
1264
1265 unsigned Idx32 = 0, Idx64 = 0;
1266 if (!Is64) {
1267 while (Idx32 < Num32) {
1268 if (Phys32[Idx32] == PReg)
1269 break;
1270 Idx32++;
1271 }
1272 Idx64 = Idx32/2;
1273 } else {
1274 while (Idx64 < Num64) {
1275 if (Phys64[Idx64] == PReg)
1276 break;
1277 Idx64++;
1278 }
1279 Idx32 = Idx64*2+1;
1280 }
1281
1282 if (Width <= 32)
1283 return (Idx32+1 < Num32) ? Phys32[Idx32+1] : 0;
1284 return (Idx64+1 < Num64) ? Phys64[Idx64+1] : 0;
1285}
1286
1287unsigned HexagonEvaluator::getVirtRegFor(unsigned PReg) const {
1288 for (std::pair<MCRegister, Register> P : MRI.liveins())
1289 if (P.first == PReg)
1290 return P.second;
1291 return 0;
1292}
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
const HexagonInstrInfo * TII
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
support::ulittle32_t & Wd
This class represents an incoming formal argument to a Function.
This class represents an Operation in the Expression.
iterator find(const_arg_type_t< KeyT > Val)
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
iterator_range< arg_iterator > args()
bool isPredicated(const MachineInstr &MI) const override
Returns true if the instruction is already predicated.
const char * getName(MCRegister RegNo) const
Return the human-readable symbolic target-specific name for the specified physical register.
Wrapper class representing physical registers. Should be passed by value.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Function & getFunction()
Return the LLVM function that this machine code represents.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
MachineOperand class - Representation of each machine instruction operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineBasicBlock * getMBB() const
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
ArrayRef< std::pair< MCRegister, Register > > liveins() const
Wrapper class representing virtual and physical registers.
A vector that has set insertion semantics.
bool insert(const value_type &X)
Insert a new element into the SetVector.
unsigned getID() const
Return the register class ID number.
const TargetRegisterClass * getMinimalPhysRegClass(MCRegister Reg, MVT VT=MVT::Other) const
Returns the Register Class of a physical register of the given type, picking the most sub register cl...
TypeSize getRegSizeInBits(const TargetRegisterClass &RC) const
Return the size in bits of a register from class RC.
const char * getRegClassName(const TargetRegisterClass *Class) const
Returns the name of the register class.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
unsigned getIntegerBitWidth() const
bool isPointerTy() const
True if this is an instance of PointerType.
bool isIntegerTy() const
True if this is an instance of IntegerType.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
void shuffle(Iterator first, Iterator last, RNG &&g)
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
uint64_t value() const
This is a hole in the type system and should not be abused.
bool is(unsigned T) const
RegisterCell eXOR(const RegisterCell &A1, const RegisterCell &A2) const
const TargetRegisterInfo & TRI
RegisterCell eNOT(const RegisterCell &A1) const
RegisterCell eIMM(int64_t V, uint16_t W) const
RegisterCell eLSR(const RegisterCell &A1, uint16_t Sh) const
RegisterCell eMLU(const RegisterCell &A1, const RegisterCell &A2) const
RegisterCell eZXT(const RegisterCell &A1, uint16_t FromN) const
RegisterCell eMLS(const RegisterCell &A1, const RegisterCell &A2) const
uint16_t getRegBitWidth(const RegisterRef &RR) const
RegisterCell eCLB(const RegisterCell &A1, bool B, uint16_t W) const
MachineRegisterInfo & MRI
RegisterCell eASR(const RegisterCell &A1, uint16_t Sh) const
RegisterCell eASL(const RegisterCell &A1, uint16_t Sh) const
void putCell(const RegisterRef &RR, RegisterCell RC, CellMapType &M) const
RegisterCell eCTB(const RegisterCell &A1, bool B, uint16_t W) const
RegisterCell getCell(const RegisterRef &RR, const CellMapType &M) const
RegisterCell eAND(const RegisterCell &A1, const RegisterCell &A2) const
RegisterCell eORL(const RegisterCell &A1, const RegisterCell &A2) const
RegisterCell eSXT(const RegisterCell &A1, uint16_t FromN) const
RegisterCell eINS(const RegisterCell &A1, const RegisterCell &A2, uint16_t AtN) const
RegisterCell eADD(const RegisterCell &A1, const RegisterCell &A2) const
RegisterCell eSUB(const RegisterCell &A1, const RegisterCell &A2) const
RegisterCell eXTR(const RegisterCell &A1, uint16_t B, uint16_t E) const
RegisterCell & cat(const RegisterCell &RC)
static RegisterCell self(unsigned Reg, uint16_t Width)
static RegisterCell ref(const RegisterCell &C)
RegisterCell & fill(uint16_t B, uint16_t E, const BitValue &V)
RegisterCell & insert(const RegisterCell &RC, const BitMask &M)
BitTracker::BitMask mask(Register Reg, unsigned Sub) const override
uint16_t getPhysRegBitWidth(MCRegister Reg) const override
bool evaluate(const MachineInstr &MI, const CellMapType &Inputs, CellMapType &Outputs) const override
HexagonEvaluator(const HexagonRegisterInfo &tri, MachineRegisterInfo &mri, const HexagonInstrInfo &tii, MachineFunction &mf)
BitTracker::RegisterCell RegisterCell
const HexagonInstrInfo & TII
const TargetRegisterClass & composeWithSubRegIndex(const TargetRegisterClass &RC, unsigned Idx) const override
BitTracker::CellMapType CellMapType
BitTracker::RegisterRef RegisterRef