LLVM: lib/Target/Hexagon/MCTargetDesc/HexagonMCDuplexInfo.cpp Source File (original) (raw)
35static const std::pair<unsigned, unsigned> opcodeData[] = {
36 std::make_pair((unsigned)SA1_addi, 0),
37 std::make_pair((unsigned)SA1_addrx, 6144),
38 std::make_pair((unsigned)SA1_addsp, 3072),
39 std::make_pair((unsigned)SA1_and1, 4608),
40 std::make_pair((unsigned)SA1_clrf, 6768),
41 std::make_pair((unsigned)SA1_clrfnew, 6736),
42 std::make_pair((unsigned)SA1_clrt, 6752),
43 std::make_pair((unsigned)SA1_clrtnew, 6720),
44 std::make_pair((unsigned)SA1_cmpeqi, 6400),
45 std::make_pair((unsigned)SA1_combine0i, 7168),
46 std::make_pair((unsigned)SA1_combine1i, 7176),
47 std::make_pair((unsigned)SA1_combine2i, 7184),
48 std::make_pair((unsigned)SA1_combine3i, 7192),
49 std::make_pair((unsigned)SA1_combinerz, 7432),
50 std::make_pair((unsigned)SA1_combinezr, 7424),
51 std::make_pair((unsigned)SA1_dec, 4864),
52 std::make_pair((unsigned)SA1_inc, 4352),
53 std::make_pair((unsigned)SA1_seti, 2048),
54 std::make_pair((unsigned)SA1_setin1, 6656),
55 std::make_pair((unsigned)SA1_sxtb, 5376),
56 std::make_pair((unsigned)SA1_sxth, 5120),
57 std::make_pair((unsigned)SA1_tfr, 4096),
58 std::make_pair((unsigned)SA1_zxtb, 5888),
59 std::make_pair((unsigned)SA1_zxth, 5632),
60 std::make_pair((unsigned)SL1_loadri_io, 0),
61 std::make_pair((unsigned)SL1_loadrub_io, 4096),
62 std::make_pair((unsigned)SL2_deallocframe, 7936),
63 std::make_pair((unsigned)SL2_jumpr31, 8128),
64 std::make_pair((unsigned)SL2_jumpr31_f, 8133),
65 std::make_pair((unsigned)SL2_jumpr31_fnew, 8135),
66 std::make_pair((unsigned)SL2_jumpr31_t, 8132),
67 std::make_pair((unsigned)SL2_jumpr31_tnew, 8134),
68 std::make_pair((unsigned)SL2_loadrb_io, 4096),
69 std::make_pair((unsigned)SL2_loadrd_sp, 7680),
70 std::make_pair((unsigned)SL2_loadrh_io, 0),
71 std::make_pair((unsigned)SL2_loadri_sp, 7168),
72 std::make_pair((unsigned)SL2_loadruh_io, 2048),
73 std::make_pair((unsigned)SL2_return, 8000),
74 std::make_pair((unsigned)SL2_return_f, 8005),
75 std::make_pair((unsigned)SL2_return_fnew, 8007),
76 std::make_pair((unsigned)SL2_return_t, 8004),
77 std::make_pair((unsigned)SL2_return_tnew, 8006),
78 std::make_pair((unsigned)SS1_storeb_io, 4096),
79 std::make_pair((unsigned)SS1_storew_io, 0),
80 std::make_pair((unsigned)SS2_allocframe, 7168),
81 std::make_pair((unsigned)SS2_storebi0, 4608),
82 std::make_pair((unsigned)SS2_storebi1, 4864),
83 std::make_pair((unsigned)SS2_stored_sp, 2560),
84 std::make_pair((unsigned)SS2_storeh_io, 0),
85 std::make_pair((unsigned)SS2_storew_sp, 2048),
86 std::make_pair((unsigned)SS2_storewi0, 4096),
87 std::make_pair((unsigned)SS2_storewi1, 4352)};
90 switch (Ga) {
92 default:
93 return false;
110 }
111 return false;
112}
115 switch (Ga) {
117 default:
118 break;
120 switch (Gb) {
121 default:
122 break;
124 return 0;
126 return 0x4;
127 }
128 break;
130 switch (Gb) {
131 default:
132 break;
134 return 0x1;
136 return 0x2;
138 return 0x5;
139 }
140 break;
142 switch (Gb) {
143 default:
144 break;
146 return 0x8;
148 return 0x9;
150 return 0xA;
152 return 0x6;
153 }
154 break;
156 switch (Gb) {
157 default:
158 break;
160 return 0xC;
162 return 0xD;
164 return 0xB;
166 return 0xE;
168 return 0x7;
169 }
170 break;
172 switch (Gb) {
173 default:
174 break;
176 return 0x3;
177 }
178 break;
180 switch (Gb) {
182 return 0xFFFFFFFF;
183 }
184 break;
185 }
186 return 0xFFFFFFFF;
187}
190 MCRegister DstReg, PredReg, SrcReg, Src1Reg, Src2Reg;
191
193 default:
195
196
197
198
199
200 case Hexagon::L2_loadri_io:
203
204
207 Hexagon::R29 == SrcReg && inRange<5, 2>(MCI, 2)) {
209 }
210
214 }
215 }
216 break;
217 case Hexagon::L2_loadrub_io:
218
225 }
226 break;
227
228
229
230
231
232
233
234
235
236
237 case Hexagon::L2_loadrh_io:
238 case Hexagon::L2_loadruh_io:
239
246 }
247 break;
248 case Hexagon::L2_loadrb_io:
249
256 }
257 break;
258 case Hexagon::L2_loadrd_io:
259
266 }
267 break;
268
269 case Hexagon::L4_return:
270 case Hexagon::L2_deallocframe:
272
273 case Hexagon::EH_RETURN_JMPR:
274 case Hexagon::J2_jumpr:
275 case Hexagon::PS_jmpret:
276
277
279 if (Hexagon::R31 == DstReg)
281 break;
282
283 case Hexagon::J2_jumprt:
284 case Hexagon::J2_jumprf:
285 case Hexagon::J2_jumprtnew:
286 case Hexagon::J2_jumprfnew:
287 case Hexagon::PS_jmprett:
288 case Hexagon::PS_jmpretf:
289 case Hexagon::PS_jmprettnew:
290 case Hexagon::PS_jmpretfnew:
291 case Hexagon::PS_jmprettnewpt:
292 case Hexagon::PS_jmpretfnewpt:
295
296 if ((Hexagon::P0 == SrcReg) && (Hexagon::R31 == DstReg)) {
298 }
299 break;
300 case Hexagon::L4_return_t:
301 case Hexagon::L4_return_f:
302 case Hexagon::L4_return_tnew_pnt:
303 case Hexagon::L4_return_fnew_pnt:
304
306 if (Hexagon::P0 == SrcReg) {
308 }
309 break;
310
311
312
313
314
315 case Hexagon::S2_storeri_io:
316
317
322 Hexagon::R29 == Src1Reg && inRange<5, 2>(MCI, 1)) {
324 }
325
330 }
331 break;
332 case Hexagon::S2_storerb_io:
333
340 }
341 break;
342
343
344
345
346
347
348
349
350
351 case Hexagon::S2_storerh_io:
352
359 }
360 break;
361 case Hexagon::S2_storerd_io:
362
369 }
370 break;
371 case Hexagon::S4_storeiri_io:
372
377 }
378 break;
379 case Hexagon::S4_storeirb_io:
380
385 }
386 break;
387 case Hexagon::S2_allocframe:
390 break;
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409 case Hexagon::A2_addi:
413
417 }
418
419 if (DstReg == SrcReg) {
421 }
422
423
427 }
428 }
429 break;
430 case Hexagon::A2_add:
431
438 }
439 break;
440 case Hexagon::A2_andir:
447 }
448 break;
449 case Hexagon::A2_tfr:
450
456 }
457 break;
458 case Hexagon::A2_tfrsi:
460
463 }
464 break;
465 case Hexagon::C2_cmoveit:
466 case Hexagon::C2_cmovenewit:
467 case Hexagon::C2_cmoveif:
468 case Hexagon::C2_cmovenewif:
469
470
471
475 Hexagon::P0 == PredReg && minConstant(MCI, 2) == 0) {
477 }
478 break;
479 case Hexagon::C2_cmpeqi:
480
483 if (Hexagon::P0 == DstReg &&
487 }
488 break;
489 case Hexagon::A2_combineii:
490 case Hexagon::A4_combineii:
491
496 }
497 break;
498 case Hexagon::A4_combineri:
499
506 }
507 break;
508 case Hexagon::A4_combineir:
509
516 }
517 break;
518 case Hexagon::A2_sxtb:
519 case Hexagon::A2_sxth:
520 case Hexagon::A2_zxtb:
521 case Hexagon::A2_zxth:
522
528 }
529 break;
530 }
531
533}
537 switch (potentialDuplex.getOpcode()) {
538 case Hexagon::A2_addi:
539
545 return true;
547 return true;
548 }
549 break;
550 case Hexagon::A2_tfrsi:
552
556 return true;
557
559 return false;
560
562 return true;
563 }
564 break;
565 default:
566 break;
567 }
568 return false;
569}
573 MCInst const &MIa, bool ExtendedA,
574 MCInst const &MIb, bool ExtendedB,
575 bool bisReversable,
577
578 if (ExtendedA)
579 return false;
580
581 if (ExtendedB) {
582 unsigned Opcode = MIb.getOpcode();
583 if ((Opcode != Hexagon::A2_addi) && (Opcode != Hexagon::A2_tfrsi))
584 return false;
585 }
588
589 static std::map<unsigned, unsigned> subinstOpcodeMap(std::begin(opcodeData),
591
592
593
597
598 unsigned zeroedSubInstS0 =
599 subinstOpcodeMap.find(SubInst0.getOpcode())->second;
600 unsigned zeroedSubInstS1 =
601 subinstOpcodeMap.find(SubInst1.getOpcode())->second;
602
603 if (zeroedSubInstS0 < zeroedSubInstS1)
604
605
606 return false;
607 }
608
609
610 if (MIb.getOpcode() == Hexagon::S2_allocframe)
611 return false;
612
614
615
616
618 return false;
619
620
621
623 return false;
624 }
625
626
630 return false;
633 return false;
634 }
635
639
640
643 return false;
644 }
645 }
646
648}
658 unsigned opNum) {
661 default:
663 break;
664 case Hexagon::R0:
665 case Hexagon::R1:
666 case Hexagon::R2:
667 case Hexagon::R3:
668 case Hexagon::R4:
669 case Hexagon::R5:
670 case Hexagon::R6:
671 case Hexagon::R7:
672 case Hexagon::D0:
673 case Hexagon::D1:
674 case Hexagon::D2:
675 case Hexagon::D3:
676 case Hexagon::R16:
677 case Hexagon::R17:
678 case Hexagon::R18:
679 case Hexagon::R19:
680 case Hexagon::R20:
681 case Hexagon::R21:
682 case Hexagon::R22:
683 case Hexagon::R23:
684 case Hexagon::D8:
685 case Hexagon::D9:
686 case Hexagon::D10:
687 case Hexagon::D11:
688 case Hexagon::P0:
690 break;
691 }
692 } else
694}
698 Result.setLoc(Inst.getLoc());
699 bool Absolute;
702 default:
703
705 break;
706 case Hexagon::A2_addi:
708 if (Absolute) {
709 if (Value == 1) {
710 Result.setOpcode(Hexagon::SA1_inc);
711 addOps(Result, Inst, 0);
712 addOps(Result, Inst, 1);
713 break;
714 }
715 if (Value == -1) {
716 Result.setOpcode(Hexagon::SA1_dec);
717 addOps(Result, Inst, 0);
718 addOps(Result, Inst, 1);
719 addOps(Result, Inst, 2);
720 break;
721 }
723 Result.setOpcode(Hexagon::SA1_addsp);
724 addOps(Result, Inst, 0);
725 addOps(Result, Inst, 2);
726 break;
727 }
728 }
729 Result.setOpcode(Hexagon::SA1_addi);
730 addOps(Result, Inst, 0);
731 addOps(Result, Inst, 1);
732 addOps(Result, Inst, 2);
733 break;
734 case Hexagon::A2_add:
735 Result.setOpcode(Hexagon::SA1_addrx);
736 addOps(Result, Inst, 0);
737 addOps(Result, Inst, 1);
738 addOps(Result, Inst, 2);
739 break;
740 case Hexagon::S2_allocframe:
741 Result.setOpcode(Hexagon::SS2_allocframe);
742 addOps(Result, Inst, 2);
743 break;
744 case Hexagon::A2_andir:
746 Result.setOpcode(Hexagon::SA1_zxtb);
747 addOps(Result, Inst, 0);
748 addOps(Result, Inst, 1);
749 break;
750 } else {
751 Result.setOpcode(Hexagon::SA1_and1);
752 addOps(Result, Inst, 0);
753 addOps(Result, Inst, 1);
754 break;
755 }
756 case Hexagon::C2_cmpeqi:
757 Result.setOpcode(Hexagon::SA1_cmpeqi);
758 addOps(Result, Inst, 1);
759 addOps(Result, Inst, 2);
760 break;
761 case Hexagon::A4_combineii:
762 case Hexagon::A2_combineii:
764 assert(Absolute);(void)Absolute;
765 if (Value == 1) {
766 Result.setOpcode(Hexagon::SA1_combine1i);
767 addOps(Result, Inst, 0);
768 addOps(Result, Inst, 2);
769 break;
770 }
771 if (Value == 3) {
772 Result.setOpcode(Hexagon::SA1_combine3i);
773 addOps(Result, Inst, 0);
774 addOps(Result, Inst, 2);
775 break;
776 }
777 if (Value == 0) {
778 Result.setOpcode(Hexagon::SA1_combine0i);
779 addOps(Result, Inst, 0);
780 addOps(Result, Inst, 2);
781 break;
782 }
783 if (Value == 2) {
784 Result.setOpcode(Hexagon::SA1_combine2i);
785 addOps(Result, Inst, 0);
786 addOps(Result, Inst, 2);
787 break;
788 }
789 break;
790 case Hexagon::A4_combineir:
791 Result.setOpcode(Hexagon::SA1_combinezr);
792 addOps(Result, Inst, 0);
793 addOps(Result, Inst, 2);
794 break;
795 case Hexagon::A4_combineri:
796 Result.setOpcode(Hexagon::SA1_combinerz);
797 addOps(Result, Inst, 0);
798 addOps(Result, Inst, 1);
799 break;
800 case Hexagon::L4_return_tnew_pnt:
801 case Hexagon::L4_return_tnew_pt:
802 Result.setOpcode(Hexagon::SL2_return_tnew);
803 break;
804 case Hexagon::L4_return_fnew_pnt:
805 case Hexagon::L4_return_fnew_pt:
806 Result.setOpcode(Hexagon::SL2_return_fnew);
807 break;
808 case Hexagon::L4_return_f:
809 Result.setOpcode(Hexagon::SL2_return_f);
810 break;
811 case Hexagon::L4_return_t:
812 Result.setOpcode(Hexagon::SL2_return_t);
813 break;
814 case Hexagon::L4_return:
815 Result.setOpcode(Hexagon::SL2_return);
816 break;
817 case Hexagon::L2_deallocframe:
818 Result.setOpcode(Hexagon::SL2_deallocframe);
819 break;
820 case Hexagon::EH_RETURN_JMPR:
821 case Hexagon::J2_jumpr:
822 case Hexagon::PS_jmpret:
823 Result.setOpcode(Hexagon::SL2_jumpr31);
824 break;
825 case Hexagon::J2_jumprf:
826 case Hexagon::PS_jmpretf:
827 Result.setOpcode(Hexagon::SL2_jumpr31_f);
828 break;
829 case Hexagon::J2_jumprfnew:
830 case Hexagon::PS_jmpretfnewpt:
831 case Hexagon::PS_jmpretfnew:
832 Result.setOpcode(Hexagon::SL2_jumpr31_fnew);
833 break;
834 case Hexagon::J2_jumprt:
835 case Hexagon::PS_jmprett:
836 Result.setOpcode(Hexagon::SL2_jumpr31_t);
837 break;
838 case Hexagon::J2_jumprtnew:
839 case Hexagon::PS_jmprettnewpt:
840 case Hexagon::PS_jmprettnew:
841 Result.setOpcode(Hexagon::SL2_jumpr31_tnew);
842 break;
843 case Hexagon::L2_loadrb_io:
844 Result.setOpcode(Hexagon::SL2_loadrb_io);
845 addOps(Result, Inst, 0);
846 addOps(Result, Inst, 1);
847 addOps(Result, Inst, 2);
848 break;
849 case Hexagon::L2_loadrd_io:
850 Result.setOpcode(Hexagon::SL2_loadrd_sp);
851 addOps(Result, Inst, 0);
852 addOps(Result, Inst, 2);
853 break;
854 case Hexagon::L2_loadrh_io:
855 Result.setOpcode(Hexagon::SL2_loadrh_io);
856 addOps(Result, Inst, 0);
857 addOps(Result, Inst, 1);
858 addOps(Result, Inst, 2);
859 break;
860 case Hexagon::L2_loadrub_io:
861 Result.setOpcode(Hexagon::SL1_loadrub_io);
862 addOps(Result, Inst, 0);
863 addOps(Result, Inst, 1);
864 addOps(Result, Inst, 2);
865 break;
866 case Hexagon::L2_loadruh_io:
867 Result.setOpcode(Hexagon::SL2_loadruh_io);
868 addOps(Result, Inst, 0);
869 addOps(Result, Inst, 1);
870 addOps(Result, Inst, 2);
871 break;
872 case Hexagon::L2_loadri_io:
874 Result.setOpcode(Hexagon::SL2_loadri_sp);
875 addOps(Result, Inst, 0);
876 addOps(Result, Inst, 2);
877 break;
878 } else {
879 Result.setOpcode(Hexagon::SL1_loadri_io);
880 addOps(Result, Inst, 0);
881 addOps(Result, Inst, 1);
882 addOps(Result, Inst, 2);
883 break;
884 }
885 case Hexagon::S4_storeirb_io:
887 assert(Absolute);(void)Absolute;
888 if (Value == 0) {
889 Result.setOpcode(Hexagon::SS2_storebi0);
890 addOps(Result, Inst, 0);
891 addOps(Result, Inst, 1);
892 break;
893 } else if (Value == 1) {
894 Result.setOpcode(Hexagon::SS2_storebi1);
895 addOps(Result, Inst, 0);
896 addOps(Result, Inst, 1);
897 break;
898 }
899 break;
900 case Hexagon::S2_storerb_io:
901 Result.setOpcode(Hexagon::SS1_storeb_io);
902 addOps(Result, Inst, 0);
903 addOps(Result, Inst, 1);
904 addOps(Result, Inst, 2);
905 break;
906 case Hexagon::S2_storerd_io:
907 Result.setOpcode(Hexagon::SS2_stored_sp);
908 addOps(Result, Inst, 1);
909 addOps(Result, Inst, 2);
910 break;
911 case Hexagon::S2_storerh_io:
912 Result.setOpcode(Hexagon::SS2_storeh_io);
913 addOps(Result, Inst, 0);
914 addOps(Result, Inst, 1);
915 addOps(Result, Inst, 2);
916 break;
917 case Hexagon::S4_storeiri_io:
919 assert(Absolute);(void)Absolute;
920 if (Value == 0) {
921 Result.setOpcode(Hexagon::SS2_storewi0);
922 addOps(Result, Inst, 0);
923 addOps(Result, Inst, 1);
924 break;
925 } else if (Value == 1) {
926 Result.setOpcode(Hexagon::SS2_storewi1);
927 addOps(Result, Inst, 0);
928 addOps(Result, Inst, 1);
929 break;
931 Result.setOpcode(Hexagon::SS2_storew_sp);
932 addOps(Result, Inst, 1);
933 addOps(Result, Inst, 2);
934 break;
935 }
936 break;
937 case Hexagon::S2_storeri_io:
939 Result.setOpcode(Hexagon::SS2_storew_sp);
940 addOps(Result, Inst, 1);
941 addOps(Result, Inst, 2);
942 } else {
943 Result.setOpcode(Hexagon::SS1_storew_io);
944 addOps(Result, Inst, 0);
945 addOps(Result, Inst, 1);
946 addOps(Result, Inst, 2);
947 }
948 break;
949 case Hexagon::A2_sxtb:
950 Result.setOpcode(Hexagon::SA1_sxtb);
951 addOps(Result, Inst, 0);
952 addOps(Result, Inst, 1);
953 break;
954 case Hexagon::A2_sxth:
955 Result.setOpcode(Hexagon::SA1_sxth);
956 addOps(Result, Inst, 0);
957 addOps(Result, Inst, 1);
958 break;
959 case Hexagon::A2_tfr:
960 Result.setOpcode(Hexagon::SA1_tfr);
961 addOps(Result, Inst, 0);
962 addOps(Result, Inst, 1);
963 break;
964 case Hexagon::C2_cmovenewif:
965 Result.setOpcode(Hexagon::SA1_clrfnew);
966 addOps(Result, Inst, 0);
967 addOps(Result, Inst, 1);
968 break;
969 case Hexagon::C2_cmovenewit:
970 Result.setOpcode(Hexagon::SA1_clrtnew);
971 addOps(Result, Inst, 0);
972 addOps(Result, Inst, 1);
973 break;
974 case Hexagon::C2_cmoveif:
975 Result.setOpcode(Hexagon::SA1_clrf);
976 addOps(Result, Inst, 0);
977 addOps(Result, Inst, 1);
978 break;
979 case Hexagon::C2_cmoveit:
980 Result.setOpcode(Hexagon::SA1_clrt);
981 addOps(Result, Inst, 0);
982 addOps(Result, Inst, 1);
983 break;
984 case Hexagon::A2_tfrsi:
986 if (Absolute && Value == -1) {
987 Result.setOpcode(Hexagon::SA1_setin1);
988 addOps(Result, Inst, 0);
989 addOps(Result, Inst, 1);
990 break;
991 } else {
992 Result.setOpcode(Hexagon::SA1_seti);
993 addOps(Result, Inst, 0);
994 addOps(Result, Inst, 1);
995 break;
996 }
997 case Hexagon::A2_zxtb:
998 Result.setOpcode(Hexagon::SA1_zxtb);
999 addOps(Result, Inst, 0);
1000 addOps(Result, Inst, 1);
1001 break;
1002
1003 case Hexagon::A2_zxth:
1004 Result.setOpcode(Hexagon::SA1_zxth);
1005 addOps(Result, Inst, 0);
1006 addOps(Result, Inst, 1);
1007 break;
1008 }
1009 return Result;
1010}
1013 switch (opCode) {
1014 case Hexagon::S2_storeri_io:
1015 case Hexagon::S2_storerb_io:
1016 case Hexagon::S2_storerh_io:
1017 case Hexagon::S2_storerd_io:
1018 case Hexagon::S4_storeiri_io:
1019 case Hexagon::S4_storeirb_io:
1020 case Hexagon::S2_allocframe:
1021 return true;
1022 default:
1023 return false;
1024 }
1025}
1030 MCInst const &MCB) {
1033
1035
1036 for (unsigned distance = 1; distance < numInstrInPacket; ++distance) {
1038 k = j + distance;
1039 (j < numInstrInPacket) && (k < numInstrInPacket); ++j, ++k) {
1040
1041
1042 bool bisReversable = true;
1045 LLVM_DEBUG(dbgs() << "skip out of order write pair: " << k << "," << j
1046 << "\n");
1047 bisReversable = false;
1048 }
1050 bisReversable = false;
1051
1052
1058 bisReversable, STI)) {
1059
1063
1064
1066 LLVM_DEBUG(dbgs() << "adding pair: " << j << "," << k << ":"
1069 continue;
1070 } else {
1071 LLVM_DEBUG(dbgs() << "skipping pair: " << j << "," << k << ":"
1074 }
1075
1076
1077 if (bisReversable) {
1083 bisReversable, STI)) {
1084
1088
1089
1092 << "adding pair:" << k << "," << j << ":"
1095 } else {
1097 << "skipping pair: " << k << "," << j << ":"
1100 }
1101 }
1102 }
1103 }
1104 return duplexToTry;
1105}