52#define DEBUG_TYPE "x86-instr-info"
54#define GET_INSTRINFO_CTOR_DTOR
55#include "X86GenInstrInfo.inc"
61 cl::desc(
"Disable fusing of spill code into instructions"),
65 cl::desc(
"Print instructions that the allocator wants to"
66 " fuse, but the X86 backend currently can't"),
70 cl::desc(
"Re-materialize load from stub in PIC mode"),
74 cl::desc(
"Clearance between two register writes "
75 "for inserting XOR to avoid partial "
79 "undef-reg-clearance",
80 cl::desc(
"How many idle instructions we would like before "
81 "certain undef register reads"),
85 "x86-max-nf-conversions-for-cmp-reuse",
86 cl::desc(
"Maximum number of NF conversions allowed to reuse EFLAGS from a "
87 "producer dominating a multi-predecessor block"),
91void X86InstrInfo::anchor() {}
95 (STI.isTarget64BitLP64() ?
X86::ADJCALLSTACKDOWN64
96 :
X86::ADJCALLSTACKDOWN32),
97 (STI.isTarget64BitLP64() ?
X86::ADJCALLSTACKUP64
98 :
X86::ADJCALLSTACKUP32),
100 Subtarget(STI), RI(STI.getTargetTriple()) {}
103 unsigned OpNum)
const {
107 if (!RC || !Subtarget.hasEGPR())
119 unsigned &SubIdx)
const {
120 switch (
MI.getOpcode()) {
123 case X86::MOVSX16rr8:
124 case X86::MOVZX16rr8:
125 case X86::MOVSX32rr8:
126 case X86::MOVZX32rr8:
127 case X86::MOVSX64rr8:
128 if (!Subtarget.is64Bit())
133 case X86::MOVSX32rr16:
134 case X86::MOVZX32rr16:
135 case X86::MOVSX64rr16:
136 case X86::MOVSX64rr32: {
137 if (
MI.getOperand(0).getSubReg() ||
MI.getOperand(1).getSubReg())
140 SrcReg =
MI.getOperand(1).getReg();
141 DstReg =
MI.getOperand(0).getReg();
142 switch (
MI.getOpcode()) {
145 case X86::MOVSX16rr8:
146 case X86::MOVZX16rr8:
147 case X86::MOVSX32rr8:
148 case X86::MOVZX32rr8:
149 case X86::MOVSX64rr8:
150 SubIdx = X86::sub_8bit;
152 case X86::MOVSX32rr16:
153 case X86::MOVZX32rr16:
154 case X86::MOVSX64rr16:
155 SubIdx = X86::sub_16bit;
157 case X86::MOVSX64rr32:
158 SubIdx = X86::sub_32bit;
168 if (
MI.mayLoad() ||
MI.mayStore())
173 if (
MI.isCopyLike() ||
MI.isInsertSubreg())
176 unsigned Opcode =
MI.getOpcode();
187 if (isBSF(Opcode) || isBSR(Opcode) || isLZCNT(Opcode) || isPOPCNT(Opcode) ||
193 if (isBLCFILL(Opcode) || isBLCI(Opcode) || isBLCIC(Opcode) ||
194 isBLCMSK(Opcode) || isBLCS(Opcode) || isBLSFILL(Opcode) ||
195 isBLSI(Opcode) || isBLSIC(Opcode) || isBLSMSK(Opcode) || isBLSR(Opcode) ||
200 if (isBEXTR(Opcode) || isBZHI(Opcode))
203 if (isROL(Opcode) || isROR(Opcode) || isSAR(Opcode) || isSHL(Opcode) ||
204 isSHR(Opcode) || isSHLD(Opcode) || isSHRD(Opcode))
207 if (isADC(Opcode) || isADD(Opcode) || isAND(Opcode) || isOR(Opcode) ||
208 isSBB(Opcode) || isSUB(Opcode) || isXOR(Opcode))
214 if (isDEC(Opcode) || isINC(Opcode) || isNEG(Opcode))
222 if (isMOVSX(Opcode) || isMOVZX(Opcode) || isMOVSXD(Opcode) || isMOV(Opcode))
225 if (isRORX(Opcode) || isSARX(Opcode) || isSHLX(Opcode) || isSHRX(Opcode))
235 switch (
MI.getOpcode()) {
248 case X86::IMUL64rmi32:
263 case X86::POPCNT16rm:
264 case X86::POPCNT32rm:
265 case X86::POPCNT64rm:
273 case X86::BLCFILL32rm:
274 case X86::BLCFILL64rm:
279 case X86::BLCMSK32rm:
280 case X86::BLCMSK64rm:
283 case X86::BLSFILL32rm:
284 case X86::BLSFILL64rm:
289 case X86::BLSMSK32rm:
290 case X86::BLSMSK64rm:
300 case X86::BEXTRI32mi:
301 case X86::BEXTRI64mi:
354 case X86::CVTTSD2SI64rm:
355 case X86::VCVTTSD2SI64rm:
356 case X86::VCVTTSD2SI64Zrm:
357 case X86::CVTTSD2SIrm:
358 case X86::VCVTTSD2SIrm:
359 case X86::VCVTTSD2SIZrm:
360 case X86::CVTTSS2SI64rm:
361 case X86::VCVTTSS2SI64rm:
362 case X86::VCVTTSS2SI64Zrm:
363 case X86::CVTTSS2SIrm:
364 case X86::VCVTTSS2SIrm:
365 case X86::VCVTTSS2SIZrm:
366 case X86::CVTSI2SDrm:
367 case X86::VCVTSI2SDrm:
368 case X86::VCVTSI2SDZrm:
369 case X86::CVTSI2SSrm:
370 case X86::VCVTSI2SSrm:
371 case X86::VCVTSI2SSZrm:
372 case X86::CVTSI642SDrm:
373 case X86::VCVTSI642SDrm:
374 case X86::VCVTSI642SDZrm:
375 case X86::CVTSI642SSrm:
376 case X86::VCVTSI642SSrm:
377 case X86::VCVTSI642SSZrm:
378 case X86::CVTSS2SDrm:
379 case X86::VCVTSS2SDrm:
380 case X86::VCVTSS2SDZrm:
381 case X86::CVTSD2SSrm:
382 case X86::VCVTSD2SSrm:
383 case X86::VCVTSD2SSZrm:
385 case X86::VCVTTSD2USI64Zrm:
386 case X86::VCVTTSD2USIZrm:
387 case X86::VCVTTSS2USI64Zrm:
388 case X86::VCVTTSS2USIZrm:
389 case X86::VCVTUSI2SDZrm:
390 case X86::VCVTUSI642SDZrm:
391 case X86::VCVTUSI2SSZrm:
392 case X86::VCVTUSI642SSZrm:
396 case X86::MOV8rm_NOREX:
400 case X86::MOVSX16rm8:
401 case X86::MOVSX32rm16:
402 case X86::MOVSX32rm8:
403 case X86::MOVSX32rm8_NOREX:
404 case X86::MOVSX64rm16:
405 case X86::MOVSX64rm32:
406 case X86::MOVSX64rm8:
407 case X86::MOVZX16rm8:
408 case X86::MOVZX32rm16:
409 case X86::MOVZX32rm8:
410 case X86::MOVZX32rm8_NOREX:
411 case X86::MOVZX64rm16:
412 case X86::MOVZX64rm8:
421 if (isFrameInstr(
MI)) {
424 if (!isFrameSetup(
MI))
435 for (
auto E =
MBB->end();
I != E; ++
I) {
436 if (
I->getOpcode() == getCallFrameDestroyOpcode() ||
I->isCall())
442 if (
I->getOpcode() != getCallFrameDestroyOpcode())
445 return -(
I->getOperand(1).
getImm());
450 switch (
MI.getOpcode()) {
469 int &FrameIndex)
const {
489 case X86::KMOVBkm_EVEX:
494 case X86::KMOVWkm_EVEX:
496 case X86::VMOVSHZrm_alt:
501 case X86::MOVSSrm_alt:
503 case X86::VMOVSSrm_alt:
505 case X86::VMOVSSZrm_alt:
507 case X86::KMOVDkm_EVEX:
513 case X86::MOVSDrm_alt:
515 case X86::VMOVSDrm_alt:
517 case X86::VMOVSDZrm_alt:
518 case X86::MMX_MOVD64rm:
519 case X86::MMX_MOVQ64rm:
521 case X86::KMOVQkm_EVEX:
536 case X86::VMOVAPSZ128rm:
537 case X86::VMOVUPSZ128rm:
538 case X86::VMOVAPSZ128rm_NOVLX:
539 case X86::VMOVUPSZ128rm_NOVLX:
540 case X86::VMOVAPDZ128rm:
541 case X86::VMOVUPDZ128rm:
542 case X86::VMOVDQU8Z128rm:
543 case X86::VMOVDQU16Z128rm:
544 case X86::VMOVDQA32Z128rm:
545 case X86::VMOVDQU32Z128rm:
546 case X86::VMOVDQA64Z128rm:
547 case X86::VMOVDQU64Z128rm:
550 case X86::VMOVAPSYrm:
551 case X86::VMOVUPSYrm:
552 case X86::VMOVAPDYrm:
553 case X86::VMOVUPDYrm:
554 case X86::VMOVDQAYrm:
555 case X86::VMOVDQUYrm:
556 case X86::VMOVAPSZ256rm:
557 case X86::VMOVUPSZ256rm:
558 case X86::VMOVAPSZ256rm_NOVLX:
559 case X86::VMOVUPSZ256rm_NOVLX:
560 case X86::VMOVAPDZ256rm:
561 case X86::VMOVUPDZ256rm:
562 case X86::VMOVDQU8Z256rm:
563 case X86::VMOVDQU16Z256rm:
564 case X86::VMOVDQA32Z256rm:
565 case X86::VMOVDQU32Z256rm:
566 case X86::VMOVDQA64Z256rm:
567 case X86::VMOVDQU64Z256rm:
570 case X86::VMOVAPSZrm:
571 case X86::VMOVUPSZrm:
572 case X86::VMOVAPDZrm:
573 case X86::VMOVUPDZrm:
574 case X86::VMOVDQU8Zrm:
575 case X86::VMOVDQU16Zrm:
576 case X86::VMOVDQA32Zrm:
577 case X86::VMOVDQU32Zrm:
578 case X86::VMOVDQA64Zrm:
579 case X86::VMOVDQU64Zrm:
591 case X86::KMOVBmk_EVEX:
596 case X86::KMOVWmk_EVEX:
605 case X86::KMOVDmk_EVEX:
613 case X86::MMX_MOVD64mr:
614 case X86::MMX_MOVQ64mr:
615 case X86::MMX_MOVNTQmr:
617 case X86::KMOVQmk_EVEX:
632 case X86::VMOVUPSZ128mr:
633 case X86::VMOVAPSZ128mr:
634 case X86::VMOVUPSZ128mr_NOVLX:
635 case X86::VMOVAPSZ128mr_NOVLX:
636 case X86::VMOVUPDZ128mr:
637 case X86::VMOVAPDZ128mr:
638 case X86::VMOVDQA32Z128mr:
639 case X86::VMOVDQU32Z128mr:
640 case X86::VMOVDQA64Z128mr:
641 case X86::VMOVDQU64Z128mr:
642 case X86::VMOVDQU8Z128mr:
643 case X86::VMOVDQU16Z128mr:
646 case X86::VMOVUPSYmr:
647 case X86::VMOVAPSYmr:
648 case X86::VMOVUPDYmr:
649 case X86::VMOVAPDYmr:
650 case X86::VMOVDQUYmr:
651 case X86::VMOVDQAYmr:
652 case X86::VMOVUPSZ256mr:
653 case X86::VMOVAPSZ256mr:
654 case X86::VMOVUPSZ256mr_NOVLX:
655 case X86::VMOVAPSZ256mr_NOVLX:
656 case X86::VMOVUPDZ256mr:
657 case X86::VMOVAPDZ256mr:
658 case X86::VMOVDQU8Z256mr:
659 case X86::VMOVDQU16Z256mr:
660 case X86::VMOVDQA32Z256mr:
661 case X86::VMOVDQU32Z256mr:
662 case X86::VMOVDQA64Z256mr:
663 case X86::VMOVDQU64Z256mr:
666 case X86::VMOVUPSZmr:
667 case X86::VMOVAPSZmr:
668 case X86::VMOVUPDZmr:
669 case X86::VMOVAPDZmr:
670 case X86::VMOVDQU8Zmr:
671 case X86::VMOVDQU16Zmr:
672 case X86::VMOVDQA32Zmr:
673 case X86::VMOVDQU32Zmr:
674 case X86::VMOVDQA64Zmr:
675 case X86::VMOVDQU64Zmr:
683 int &FrameIndex)
const {
692 if (
MI.getOperand(0).getSubReg() == 0 && isFrameOperand(
MI, 1, FrameIndex))
693 return MI.getOperand(0).getReg();
698 int &FrameIndex)
const {
709 return MI.getOperand(0).getReg();
716 int &FrameIndex)
const {
726 isFrameOperand(
MI, 0, FrameIndex))
732 int &FrameIndex)
const {
752 if (!BaseReg.isVirtual())
754 bool isPICBase =
false;
756 if (
DefMI.getOpcode() != X86::MOVPC32r)
758 assert(!isPICBase &&
"More than one PIC base?");
766 switch (
MI.getOpcode()) {
772 case X86::IMPLICIT_DEF:
775 case X86::LOAD_STACK_GUARD:
782 case X86::AVX1_SETALLONES:
783 case X86::AVX2_SETALLONES:
784 case X86::AVX512_128_SET0:
785 case X86::AVX512_128_SETALLONES:
786 case X86::AVX512_256_SETALLONES:
787 case X86::AVX512_512_SETALLONES:
788 case X86::AVX512_FsFLD0SD:
789 case X86::AVX512_FsFLD0SH:
790 case X86::AVX512_FsFLD0SS:
791 case X86::AVX512_FsFLD0F128:
795 case X86::FsFLD0F128:
805 case X86::MOV32ImmSExti8:
810 case X86::MOV64ImmSExti8:
812 case X86::V_SETALLONES:
818 case X86::PTILEZEROV:
822 case X86::MOV8rm_NOREX:
827 case X86::MOVSSrm_alt:
829 case X86::MOVSDrm_alt:
837 case X86::VMOVSSrm_alt:
839 case X86::VMOVSDrm_alt:
846 case X86::VMOVAPSYrm:
847 case X86::VMOVUPSYrm:
848 case X86::VMOVAPDYrm:
849 case X86::VMOVUPDYrm:
850 case X86::VMOVDQAYrm:
851 case X86::VMOVDQUYrm:
852 case X86::MMX_MOVD64rm:
853 case X86::MMX_MOVQ64rm:
854 case X86::VBROADCASTSSrm:
855 case X86::VBROADCASTSSYrm:
856 case X86::VBROADCASTSDYrm:
858 case X86::VPBROADCASTBZ128rm:
859 case X86::VPBROADCASTBZ256rm:
860 case X86::VPBROADCASTBZrm:
861 case X86::VBROADCASTF32X2Z256rm:
862 case X86::VBROADCASTF32X2Zrm:
863 case X86::VBROADCASTI32X2Z128rm:
864 case X86::VBROADCASTI32X2Z256rm:
865 case X86::VBROADCASTI32X2Zrm:
866 case X86::VPBROADCASTWZ128rm:
867 case X86::VPBROADCASTWZ256rm:
868 case X86::VPBROADCASTWZrm:
869 case X86::VPBROADCASTDZ128rm:
870 case X86::VPBROADCASTDZ256rm:
871 case X86::VPBROADCASTDZrm:
872 case X86::VBROADCASTSSZ128rm:
873 case X86::VBROADCASTSSZ256rm:
874 case X86::VBROADCASTSSZrm:
875 case X86::VPBROADCASTQZ128rm:
876 case X86::VPBROADCASTQZ256rm:
877 case X86::VPBROADCASTQZrm:
878 case X86::VBROADCASTSDZ256rm:
879 case X86::VBROADCASTSDZrm:
881 case X86::VMOVSSZrm_alt:
883 case X86::VMOVSDZrm_alt:
885 case X86::VMOVSHZrm_alt:
886 case X86::VMOVAPDZ128rm:
887 case X86::VMOVAPDZ256rm:
888 case X86::VMOVAPDZrm:
889 case X86::VMOVAPSZ128rm:
890 case X86::VMOVAPSZ256rm:
891 case X86::VMOVAPSZ128rm_NOVLX:
892 case X86::VMOVAPSZ256rm_NOVLX:
893 case X86::VMOVAPSZrm:
894 case X86::VMOVDQA32Z128rm:
895 case X86::VMOVDQA32Z256rm:
896 case X86::VMOVDQA32Zrm:
897 case X86::VMOVDQA64Z128rm:
898 case X86::VMOVDQA64Z256rm:
899 case X86::VMOVDQA64Zrm:
900 case X86::VMOVDQU16Z128rm:
901 case X86::VMOVDQU16Z256rm:
902 case X86::VMOVDQU16Zrm:
903 case X86::VMOVDQU32Z128rm:
904 case X86::VMOVDQU32Z256rm:
905 case X86::VMOVDQU32Zrm:
906 case X86::VMOVDQU64Z128rm:
907 case X86::VMOVDQU64Z256rm:
908 case X86::VMOVDQU64Zrm:
909 case X86::VMOVDQU8Z128rm:
910 case X86::VMOVDQU8Z256rm:
911 case X86::VMOVDQU8Zrm:
912 case X86::VMOVUPDZ128rm:
913 case X86::VMOVUPDZ256rm:
914 case X86::VMOVUPDZrm:
915 case X86::VMOVUPSZ128rm:
916 case X86::VMOVUPSZ256rm:
917 case X86::VMOVUPSZ128rm_NOVLX:
918 case X86::VMOVUPSZ256rm_NOVLX:
919 case X86::VMOVUPSZrm: {
925 MI.isDereferenceableInvariantLoad()) {
927 if (BaseReg == 0 || BaseReg == X86::RIP)
970 if (ClobbersEFLAGS &&
MBB.computeRegisterLiveness(&
TRI, X86::EFLAGS,
I) !=
1005 if (MO.isReg() && MO.isDef() && MO.getReg() == X86::EFLAGS &&
1015 unsigned ShiftAmtOperandIdx) {
1017 unsigned ShiftCountMask = (
MI.getDesc().TSFlags &
X86II::REX_W) ? 63 : 31;
1018 unsigned Imm =
MI.getOperand(ShiftAmtOperandIdx).getImm();
1019 return Imm & ShiftCountMask;
1030 return ShAmt < 4 && ShAmt > 0;
1037 bool &NoSignFlag,
bool &ClearsOverflowFlag) {
1038 if (!(CmpValDefInstr.
getOpcode() == X86::SUBREG_TO_REG &&
1039 CmpInstr.
getOpcode() == X86::TEST64rr) &&
1040 !(CmpValDefInstr.
getOpcode() == X86::COPY &&
1048 "CmpInstr is an analyzable TEST16rr/TEST64rr, and "
1049 "`X86InstrInfo::analyzeCompare` requires two reg operands are the"
1058 "Caller guarantees that TEST64rr is a user of SUBREG_TO_REG or TEST16rr "
1059 "is a user of COPY sub16bit.");
1061 if (CmpInstr.
getOpcode() == X86::TEST16rr) {
1070 if (!((VregDefInstr->
getOpcode() == X86::AND32ri ||
1071 VregDefInstr->
getOpcode() == X86::AND64ri32) &&
1076 if (CmpInstr.
getOpcode() == X86::TEST64rr) {
1085 assert(VregDefInstr &&
"Must have a definition (SSA)");
1095 if (X86::isAND(VregDefInstr->
getOpcode()) &&
1116 if (Instr.modifiesRegister(X86::EFLAGS,
TRI))
1120 *AndInstr = VregDefInstr;
1141 ClearsOverflowFlag =
true;
1149 unsigned &NewSrcSubReg,
bool &isKill,
1155 RC =
Opc != X86::LEA32r ? &X86::GR64RegClass : &X86::GR32RegClass;
1157 RC =
Opc != X86::LEA32r ? &X86::GR64_NOSPRegClass : &X86::GR32_NOSPRegClass;
1160 unsigned SubReg = Src.getSubReg();
1161 isKill =
MI.killsRegister(SrcReg,
nullptr);
1163 NewSrcSubReg = X86::NoSubRegister;
1167 if (
Opc != X86::LEA64_32r) {
1169 NewSrcSubReg = SubReg;
1170 assert(!Src.isUndef() &&
"Undef op doesn't need optimization");
1185 assert(!SubReg &&
"no superregister for source");
1187 assert(!Src.isUndef() &&
"Undef op doesn't need optimization");
1192 NewSrcSubReg = X86::NoSubRegister;
1218MachineInstr *X86InstrInfo::convertToThreeAddressWithLEA(
unsigned MIOpc,
1222 bool Is8BitOp)
const {
1227 RegInfo.getTargetRegisterInfo()->getRegSizeInBits(
1228 *RegInfo.getRegClass(
MI.getOperand(0).getReg())) == 16) &&
1229 "Unexpected type for LEA transform");
1238 if (!Subtarget.is64Bit())
1241 unsigned Opcode = X86::LEA64_32r;
1242 Register InRegLEA = RegInfo.createVirtualRegister(&X86::GR64_NOSPRegClass);
1243 Register OutRegLEA = RegInfo.createVirtualRegister(&X86::GR32RegClass);
1256 unsigned SrcSubReg =
MI.getOperand(1).getSubReg();
1258 unsigned Src2SubReg;
1259 bool IsDead =
MI.getOperand(0).isDead();
1260 bool IsKill =
MI.getOperand(1).isKill();
1261 unsigned SubReg = Is8BitOp ? X86::sub_8bit : X86::sub_16bit;
1262 assert(!
MI.getOperand(1).isUndef() &&
"Undef op doesn't need optimization");
1274#define CASE_NF(OP) \
1282 unsigned ShAmt =
MI.getOperand(2).getImm();
1300 case X86::ADD8ri_DB:
1301 case X86::ADD16ri_DB:
1306 case X86::ADD8rr_DB:
1307 case X86::ADD16rr_DB: {
1308 Src2 =
MI.getOperand(2).getReg();
1309 Src2SubReg =
MI.getOperand(2).getSubReg();
1310 bool IsKill2 =
MI.getOperand(2).isKill();
1311 assert(!
MI.getOperand(2).isUndef() &&
"Undef op doesn't need optimization");
1315 addRegReg(MIB, InRegLEA,
true, X86::NoSubRegister, InRegLEA,
false,
1316 X86::NoSubRegister);
1318 if (Subtarget.is64Bit())
1324 ImpDef2 =
BuildMI(
MBB, &*MIB,
MI.getDebugLoc(),
get(X86::IMPLICIT_DEF),
1326 InsMI2 =
BuildMI(
MBB, &*MIB,
MI.getDebugLoc(),
get(TargetOpcode::COPY))
1329 addRegReg(MIB, InRegLEA,
true, X86::NoSubRegister, InRegLEA2,
true,
1330 X86::NoSubRegister);
1332 if (LV && IsKill2 && InsMI2)
1338 MachineInstr *NewMI = MIB;
1339 MachineInstr *ExtMI =
1387 LiveRange::Segment *DestSeg =
1428 if (
MI.getNumOperands() > 2)
1429 if (
MI.getOperand(2).isReg() &&
MI.getOperand(2).isUndef())
1434 unsigned SrcSubReg, SrcSubReg2;
1435 bool Is64Bit = Subtarget.is64Bit();
1437 bool Is8BitOp =
false;
1438 unsigned NumRegOperands = 2;
1439 unsigned MIOpc =
MI.getOpcode();
1444 assert(
MI.getNumOperands() >= 3 &&
"Unknown shift instruction!");
1451 Src.getReg(), &X86::GR64_NOSPRegClass))
1454 NewMI =
BuildMI(MF,
MI.getDebugLoc(),
get(X86::LEA64r))
1464 assert(
MI.getNumOperands() >= 3 &&
"Unknown shift instruction!");
1469 unsigned Opc = Is64Bit ? X86::LEA64_32r : X86::LEA32r;
1475 isKill, ImplicitOp, LV, LIS))
1486 if (ImplicitOp.
getReg() != 0)
1487 MIB.
add(ImplicitOp);
1491 if (LV && SrcReg != Src.getReg())
1499 assert(
MI.getNumOperands() >= 3 &&
"Unknown shift instruction!");
1503 return convertToThreeAddressWithLEA(MIOpc,
MI, LV, LIS, Is8BitOp);
1507 assert(
MI.getNumOperands() >= 2 &&
"Unknown inc instruction!");
1508 unsigned Opc = (MIOpc == X86::INC64r || MIOpc == X86::INC64r_NF)
1510 : (Is64Bit ? X86::LEA64_32r : X86::LEA32r);
1514 isKill, ImplicitOp, LV, LIS))
1520 if (ImplicitOp.
getReg() != 0)
1521 MIB.
add(ImplicitOp);
1526 if (LV && SrcReg != Src.getReg())
1532 assert(
MI.getNumOperands() >= 2 &&
"Unknown dec instruction!");
1533 unsigned Opc = (MIOpc == X86::DEC64r || MIOpc == X86::DEC64r_NF)
1535 : (Is64Bit ? X86::LEA64_32r : X86::LEA32r);
1540 isKill, ImplicitOp, LV, LIS))
1546 if (ImplicitOp.
getReg() != 0)
1547 MIB.
add(ImplicitOp);
1552 if (LV && SrcReg != Src.getReg())
1562 return convertToThreeAddressWithLEA(MIOpc,
MI, LV, LIS, Is8BitOp);
1565 case X86::ADD64rr_DB:
1566 case X86::ADD32rr_DB: {
1567 assert(
MI.getNumOperands() >= 3 &&
"Unknown add instruction!");
1569 if (MIOpc == X86::ADD64rr || MIOpc == X86::ADD64rr_NF ||
1570 MIOpc == X86::ADD64rr_DB)
1573 Opc = Is64Bit ? X86::LEA64_32r : X86::LEA32r;
1579 isKill2, ImplicitOp2, LV, LIS))
1584 if (Src.getReg() == Src2.
getReg()) {
1589 SrcSubReg = SrcSubReg2;
1592 isKill, ImplicitOp, LV, LIS))
1597 if (ImplicitOp.
getReg() != 0)
1598 MIB.
add(ImplicitOp);
1599 if (ImplicitOp2.
getReg() != 0)
1600 MIB.
add(ImplicitOp2);
1603 addRegReg(MIB, SrcReg, isKill, SrcSubReg, SrcReg2, isKill2, SrcSubReg2);
1607 if (SrcReg2 != Src2.
getReg())
1609 if (SrcReg != SrcReg2 && SrcReg != Src.getReg())
1616 case X86::ADD8rr_DB:
1620 case X86::ADD16rr_DB:
1621 return convertToThreeAddressWithLEA(MIOpc,
MI, LV, LIS, Is8BitOp);
1623 case X86::ADD64ri32_DB:
1624 assert(
MI.getNumOperands() >= 3 &&
"Unknown add instruction!");
1626 BuildMI(MF,
MI.getDebugLoc(),
get(X86::LEA64r)).add(Dest).add(Src),
1630 case X86::ADD32ri_DB: {
1631 assert(
MI.getNumOperands() >= 3 &&
"Unknown add instruction!");
1632 unsigned Opc = Is64Bit ? X86::LEA64_32r : X86::LEA32r;
1637 isKill, ImplicitOp, LV, LIS))
1644 if (ImplicitOp.
getReg() != 0)
1645 MIB.
add(ImplicitOp);
1650 if (LV && SrcReg != Src.getReg())
1655 case X86::ADD8ri_DB:
1659 case X86::ADD16ri_DB:
1660 return convertToThreeAddressWithLEA(MIOpc,
MI, LV, LIS, Is8BitOp);
1666 if (!
MI.getOperand(2).isImm())
1668 int64_t
Imm =
MI.getOperand(2).getImm();
1672 assert(
MI.getNumOperands() >= 3 &&
"Unknown add instruction!");
1673 unsigned Opc = Is64Bit ? X86::LEA64_32r : X86::LEA32r;
1678 isKill, ImplicitOp, LV, LIS))
1685 if (ImplicitOp.
getReg() != 0)
1686 MIB.
add(ImplicitOp);
1691 if (LV && SrcReg != Src.getReg())
1697 if (!
MI.getOperand(2).isImm())
1699 int64_t
Imm =
MI.getOperand(2).getImm();
1703 assert(
MI.getNumOperands() >= 3 &&
"Unknown sub instruction!");
1711 case X86::VMOVDQU8Z128rmk:
1712 case X86::VMOVDQU8Z256rmk:
1713 case X86::VMOVDQU8Zrmk:
1714 case X86::VMOVDQU16Z128rmk:
1715 case X86::VMOVDQU16Z256rmk:
1716 case X86::VMOVDQU16Zrmk:
1717 case X86::VMOVDQU32Z128rmk:
1718 case X86::VMOVDQA32Z128rmk:
1719 case X86::VMOVDQU32Z256rmk:
1720 case X86::VMOVDQA32Z256rmk:
1721 case X86::VMOVDQU32Zrmk:
1722 case X86::VMOVDQA32Zrmk:
1723 case X86::VMOVDQU64Z128rmk:
1724 case X86::VMOVDQA64Z128rmk:
1725 case X86::VMOVDQU64Z256rmk:
1726 case X86::VMOVDQA64Z256rmk:
1727 case X86::VMOVDQU64Zrmk:
1728 case X86::VMOVDQA64Zrmk:
1729 case X86::VMOVUPDZ128rmk:
1730 case X86::VMOVAPDZ128rmk:
1731 case X86::VMOVUPDZ256rmk:
1732 case X86::VMOVAPDZ256rmk:
1733 case X86::VMOVUPDZrmk:
1734 case X86::VMOVAPDZrmk:
1735 case X86::VMOVUPSZ128rmk:
1736 case X86::VMOVAPSZ128rmk:
1737 case X86::VMOVUPSZ256rmk:
1738 case X86::VMOVAPSZ256rmk:
1739 case X86::VMOVUPSZrmk:
1740 case X86::VMOVAPSZrmk:
1741 case X86::VBROADCASTSDZ256rmk:
1742 case X86::VBROADCASTSDZrmk:
1743 case X86::VBROADCASTSSZ128rmk:
1744 case X86::VBROADCASTSSZ256rmk:
1745 case X86::VBROADCASTSSZrmk:
1746 case X86::VPBROADCASTDZ128rmk:
1747 case X86::VPBROADCASTDZ256rmk:
1748 case X86::VPBROADCASTDZrmk:
1749 case X86::VPBROADCASTQZ128rmk:
1750 case X86::VPBROADCASTQZ256rmk:
1751 case X86::VPBROADCASTQZrmk: {
1756 case X86::VMOVDQU8Z128rmk:
1757 Opc = X86::VPBLENDMBZ128rmk;
1759 case X86::VMOVDQU8Z256rmk:
1760 Opc = X86::VPBLENDMBZ256rmk;
1762 case X86::VMOVDQU8Zrmk:
1763 Opc = X86::VPBLENDMBZrmk;
1765 case X86::VMOVDQU16Z128rmk:
1766 Opc = X86::VPBLENDMWZ128rmk;
1768 case X86::VMOVDQU16Z256rmk:
1769 Opc = X86::VPBLENDMWZ256rmk;
1771 case X86::VMOVDQU16Zrmk:
1772 Opc = X86::VPBLENDMWZrmk;
1774 case X86::VMOVDQU32Z128rmk:
1775 Opc = X86::VPBLENDMDZ128rmk;
1777 case X86::VMOVDQU32Z256rmk:
1778 Opc = X86::VPBLENDMDZ256rmk;
1780 case X86::VMOVDQU32Zrmk:
1781 Opc = X86::VPBLENDMDZrmk;
1783 case X86::VMOVDQU64Z128rmk:
1784 Opc = X86::VPBLENDMQZ128rmk;
1786 case X86::VMOVDQU64Z256rmk:
1787 Opc = X86::VPBLENDMQZ256rmk;
1789 case X86::VMOVDQU64Zrmk:
1790 Opc = X86::VPBLENDMQZrmk;
1792 case X86::VMOVUPDZ128rmk:
1793 Opc = X86::VBLENDMPDZ128rmk;
1795 case X86::VMOVUPDZ256rmk:
1796 Opc = X86::VBLENDMPDZ256rmk;
1798 case X86::VMOVUPDZrmk:
1799 Opc = X86::VBLENDMPDZrmk;
1801 case X86::VMOVUPSZ128rmk:
1802 Opc = X86::VBLENDMPSZ128rmk;
1804 case X86::VMOVUPSZ256rmk:
1805 Opc = X86::VBLENDMPSZ256rmk;
1807 case X86::VMOVUPSZrmk:
1808 Opc = X86::VBLENDMPSZrmk;
1810 case X86::VMOVDQA32Z128rmk:
1811 Opc = X86::VPBLENDMDZ128rmk;
1813 case X86::VMOVDQA32Z256rmk:
1814 Opc = X86::VPBLENDMDZ256rmk;
1816 case X86::VMOVDQA32Zrmk:
1817 Opc = X86::VPBLENDMDZrmk;
1819 case X86::VMOVDQA64Z128rmk:
1820 Opc = X86::VPBLENDMQZ128rmk;
1822 case X86::VMOVDQA64Z256rmk:
1823 Opc = X86::VPBLENDMQZ256rmk;
1825 case X86::VMOVDQA64Zrmk:
1826 Opc = X86::VPBLENDMQZrmk;
1828 case X86::VMOVAPDZ128rmk:
1829 Opc = X86::VBLENDMPDZ128rmk;
1831 case X86::VMOVAPDZ256rmk:
1832 Opc = X86::VBLENDMPDZ256rmk;
1834 case X86::VMOVAPDZrmk:
1835 Opc = X86::VBLENDMPDZrmk;
1837 case X86::VMOVAPSZ128rmk:
1838 Opc = X86::VBLENDMPSZ128rmk;
1840 case X86::VMOVAPSZ256rmk:
1841 Opc = X86::VBLENDMPSZ256rmk;
1843 case X86::VMOVAPSZrmk:
1844 Opc = X86::VBLENDMPSZrmk;
1846 case X86::VBROADCASTSDZ256rmk:
1847 Opc = X86::VBLENDMPDZ256rmbk;
1849 case X86::VBROADCASTSDZrmk:
1850 Opc = X86::VBLENDMPDZrmbk;
1852 case X86::VBROADCASTSSZ128rmk:
1853 Opc = X86::VBLENDMPSZ128rmbk;
1855 case X86::VBROADCASTSSZ256rmk:
1856 Opc = X86::VBLENDMPSZ256rmbk;
1858 case X86::VBROADCASTSSZrmk:
1859 Opc = X86::VBLENDMPSZrmbk;
1861 case X86::VPBROADCASTDZ128rmk:
1862 Opc = X86::VPBLENDMDZ128rmbk;
1864 case X86::VPBROADCASTDZ256rmk:
1865 Opc = X86::VPBLENDMDZ256rmbk;
1867 case X86::VPBROADCASTDZrmk:
1868 Opc = X86::VPBLENDMDZrmbk;
1870 case X86::VPBROADCASTQZ128rmk:
1871 Opc = X86::VPBLENDMQZ128rmbk;
1873 case X86::VPBROADCASTQZ256rmk:
1874 Opc = X86::VPBLENDMQZ256rmbk;
1876 case X86::VPBROADCASTQZrmk:
1877 Opc = X86::VPBLENDMQZrmbk;
1883 .
add(
MI.getOperand(2))
1885 .
add(
MI.getOperand(3))
1886 .
add(
MI.getOperand(4))
1887 .
add(
MI.getOperand(5))
1888 .
add(
MI.getOperand(6))
1889 .
add(
MI.getOperand(7));
1894 case X86::VMOVDQU8Z128rrk:
1895 case X86::VMOVDQU8Z256rrk:
1896 case X86::VMOVDQU8Zrrk:
1897 case X86::VMOVDQU16Z128rrk:
1898 case X86::VMOVDQU16Z256rrk:
1899 case X86::VMOVDQU16Zrrk:
1900 case X86::VMOVDQU32Z128rrk:
1901 case X86::VMOVDQA32Z128rrk:
1902 case X86::VMOVDQU32Z256rrk:
1903 case X86::VMOVDQA32Z256rrk:
1904 case X86::VMOVDQU32Zrrk:
1905 case X86::VMOVDQA32Zrrk:
1906 case X86::VMOVDQU64Z128rrk:
1907 case X86::VMOVDQA64Z128rrk:
1908 case X86::VMOVDQU64Z256rrk:
1909 case X86::VMOVDQA64Z256rrk:
1910 case X86::VMOVDQU64Zrrk:
1911 case X86::VMOVDQA64Zrrk:
1912 case X86::VMOVUPDZ128rrk:
1913 case X86::VMOVAPDZ128rrk:
1914 case X86::VMOVUPDZ256rrk:
1915 case X86::VMOVAPDZ256rrk:
1916 case X86::VMOVUPDZrrk:
1917 case X86::VMOVAPDZrrk:
1918 case X86::VMOVUPSZ128rrk:
1919 case X86::VMOVAPSZ128rrk:
1920 case X86::VMOVUPSZ256rrk:
1921 case X86::VMOVAPSZ256rrk:
1922 case X86::VMOVUPSZrrk:
1923 case X86::VMOVAPSZrrk: {
1928 case X86::VMOVDQU8Z128rrk:
1929 Opc = X86::VPBLENDMBZ128rrk;
1931 case X86::VMOVDQU8Z256rrk:
1932 Opc = X86::VPBLENDMBZ256rrk;
1934 case X86::VMOVDQU8Zrrk:
1935 Opc = X86::VPBLENDMBZrrk;
1937 case X86::VMOVDQU16Z128rrk:
1938 Opc = X86::VPBLENDMWZ128rrk;
1940 case X86::VMOVDQU16Z256rrk:
1941 Opc = X86::VPBLENDMWZ256rrk;
1943 case X86::VMOVDQU16Zrrk:
1944 Opc = X86::VPBLENDMWZrrk;
1946 case X86::VMOVDQU32Z128rrk:
1947 Opc = X86::VPBLENDMDZ128rrk;
1949 case X86::VMOVDQU32Z256rrk:
1950 Opc = X86::VPBLENDMDZ256rrk;
1952 case X86::VMOVDQU32Zrrk:
1953 Opc = X86::VPBLENDMDZrrk;
1955 case X86::VMOVDQU64Z128rrk:
1956 Opc = X86::VPBLENDMQZ128rrk;
1958 case X86::VMOVDQU64Z256rrk:
1959 Opc = X86::VPBLENDMQZ256rrk;
1961 case X86::VMOVDQU64Zrrk:
1962 Opc = X86::VPBLENDMQZrrk;
1964 case X86::VMOVUPDZ128rrk:
1965 Opc = X86::VBLENDMPDZ128rrk;
1967 case X86::VMOVUPDZ256rrk:
1968 Opc = X86::VBLENDMPDZ256rrk;
1970 case X86::VMOVUPDZrrk:
1971 Opc = X86::VBLENDMPDZrrk;
1973 case X86::VMOVUPSZ128rrk:
1974 Opc = X86::VBLENDMPSZ128rrk;
1976 case X86::VMOVUPSZ256rrk:
1977 Opc = X86::VBLENDMPSZ256rrk;
1979 case X86::VMOVUPSZrrk:
1980 Opc = X86::VBLENDMPSZrrk;
1982 case X86::VMOVDQA32Z128rrk:
1983 Opc = X86::VPBLENDMDZ128rrk;
1985 case X86::VMOVDQA32Z256rrk:
1986 Opc = X86::VPBLENDMDZ256rrk;
1988 case X86::VMOVDQA32Zrrk:
1989 Opc = X86::VPBLENDMDZrrk;
1991 case X86::VMOVDQA64Z128rrk:
1992 Opc = X86::VPBLENDMQZ128rrk;
1994 case X86::VMOVDQA64Z256rrk:
1995 Opc = X86::VPBLENDMQZ256rrk;
1997 case X86::VMOVDQA64Zrrk:
1998 Opc = X86::VPBLENDMQZrrk;
2000 case X86::VMOVAPDZ128rrk:
2001 Opc = X86::VBLENDMPDZ128rrk;
2003 case X86::VMOVAPDZ256rrk:
2004 Opc = X86::VBLENDMPDZ256rrk;
2006 case X86::VMOVAPDZrrk:
2007 Opc = X86::VBLENDMPDZrrk;
2009 case X86::VMOVAPSZ128rrk:
2010 Opc = X86::VBLENDMPSZ128rrk;
2012 case X86::VMOVAPSZ256rrk:
2013 Opc = X86::VBLENDMPSZ256rrk;
2015 case X86::VMOVAPSZrrk:
2016 Opc = X86::VBLENDMPSZrrk;
2022 .
add(
MI.getOperand(2))
2024 .
add(
MI.getOperand(3));
2035 for (
unsigned I = 0;
I < NumRegOperands; ++
I) {
2037 if (
Op.isReg() && (
Op.isDead() ||
Op.isKill()))
2043 MBB.insert(
MI.getIterator(), NewMI);
2064 unsigned SrcOpIdx2) {
2066 if (SrcOpIdx1 > SrcOpIdx2)
2069 unsigned Op1 = 1, Op2 = 2, Op3 = 3;
2075 if (SrcOpIdx1 == Op1 && SrcOpIdx2 == Op2)
2077 if (SrcOpIdx1 == Op1 && SrcOpIdx2 == Op3)
2079 if (SrcOpIdx1 == Op2 && SrcOpIdx2 == Op3)
2088 unsigned Opc =
MI.getOpcode();
2097 "Intrinsic instructions can't commute operand 1");
2102 assert(Case < 3 &&
"Unexpected case number!");
2107 const unsigned Form132Index = 0;
2108 const unsigned Form213Index = 1;
2109 const unsigned Form231Index = 2;
2110 static const unsigned FormMapping[][3] = {
2115 {Form231Index, Form213Index, Form132Index},
2120 {Form132Index, Form231Index, Form213Index},
2125 {Form213Index, Form132Index, Form231Index}};
2127 unsigned FMAForms[3];
2133 for (
unsigned FormIndex = 0; FormIndex < 3; FormIndex++)
2134 if (
Opc == FMAForms[FormIndex])
2135 return FMAForms[FormMapping[Case][FormIndex]];
2141 unsigned SrcOpIdx2) {
2145 assert(Case < 3 &&
"Unexpected case value!");
2148 static const uint8_t SwapMasks[3][4] = {
2149 {0x04, 0x10, 0x08, 0x20},
2150 {0x02, 0x10, 0x08, 0x40},
2151 {0x02, 0x04, 0x20, 0x40},
2156 uint8_t NewImm =
Imm & ~(SwapMasks[Case][0] | SwapMasks[Case][1] |
2157 SwapMasks[Case][2] | SwapMasks[Case][3]);
2159 if (
Imm & SwapMasks[Case][0])
2160 NewImm |= SwapMasks[Case][1];
2161 if (
Imm & SwapMasks[Case][1])
2162 NewImm |= SwapMasks[Case][0];
2163 if (
Imm & SwapMasks[Case][2])
2164 NewImm |= SwapMasks[Case][3];
2165 if (
Imm & SwapMasks[Case][3])
2166 NewImm |= SwapMasks[Case][2];
2167 MI.getOperand(
MI.getNumOperands() - 1).setImm(NewImm);
2173#define VPERM_CASES(Suffix) \
2174 case X86::VPERMI2##Suffix##Z128rr: \
2175 case X86::VPERMT2##Suffix##Z128rr: \
2176 case X86::VPERMI2##Suffix##Z256rr: \
2177 case X86::VPERMT2##Suffix##Z256rr: \
2178 case X86::VPERMI2##Suffix##Zrr: \
2179 case X86::VPERMT2##Suffix##Zrr: \
2180 case X86::VPERMI2##Suffix##Z128rm: \
2181 case X86::VPERMT2##Suffix##Z128rm: \
2182 case X86::VPERMI2##Suffix##Z256rm: \
2183 case X86::VPERMT2##Suffix##Z256rm: \
2184 case X86::VPERMI2##Suffix##Zrm: \
2185 case X86::VPERMT2##Suffix##Zrm: \
2186 case X86::VPERMI2##Suffix##Z128rrkz: \
2187 case X86::VPERMT2##Suffix##Z128rrkz: \
2188 case X86::VPERMI2##Suffix##Z256rrkz: \
2189 case X86::VPERMT2##Suffix##Z256rrkz: \
2190 case X86::VPERMI2##Suffix##Zrrkz: \
2191 case X86::VPERMT2##Suffix##Zrrkz: \
2192 case X86::VPERMI2##Suffix##Z128rmkz: \
2193 case X86::VPERMT2##Suffix##Z128rmkz: \
2194 case X86::VPERMI2##Suffix##Z256rmkz: \
2195 case X86::VPERMT2##Suffix##Z256rmkz: \
2196 case X86::VPERMI2##Suffix##Zrmkz: \
2197 case X86::VPERMT2##Suffix##Zrmkz:
2199#define VPERM_CASES_BROADCAST(Suffix) \
2200 VPERM_CASES(Suffix) \
2201 case X86::VPERMI2##Suffix##Z128rmb: \
2202 case X86::VPERMT2##Suffix##Z128rmb: \
2203 case X86::VPERMI2##Suffix##Z256rmb: \
2204 case X86::VPERMT2##Suffix##Z256rmb: \
2205 case X86::VPERMI2##Suffix##Zrmb: \
2206 case X86::VPERMT2##Suffix##Zrmb: \
2207 case X86::VPERMI2##Suffix##Z128rmbkz: \
2208 case X86::VPERMT2##Suffix##Z128rmbkz: \
2209 case X86::VPERMI2##Suffix##Z256rmbkz: \
2210 case X86::VPERMT2##Suffix##Z256rmbkz: \
2211 case X86::VPERMI2##Suffix##Zrmbkz: \
2212 case X86::VPERMT2##Suffix##Zrmbkz:
2225#undef VPERM_CASES_BROADCAST
2232#define VPERM_CASES(Orig, New) \
2233 case X86::Orig##Z128rr: \
2234 return X86::New##Z128rr; \
2235 case X86::Orig##Z128rrkz: \
2236 return X86::New##Z128rrkz; \
2237 case X86::Orig##Z128rm: \
2238 return X86::New##Z128rm; \
2239 case X86::Orig##Z128rmkz: \
2240 return X86::New##Z128rmkz; \
2241 case X86::Orig##Z256rr: \
2242 return X86::New##Z256rr; \
2243 case X86::Orig##Z256rrkz: \
2244 return X86::New##Z256rrkz; \
2245 case X86::Orig##Z256rm: \
2246 return X86::New##Z256rm; \
2247 case X86::Orig##Z256rmkz: \
2248 return X86::New##Z256rmkz; \
2249 case X86::Orig##Zrr: \
2250 return X86::New##Zrr; \
2251 case X86::Orig##Zrrkz: \
2252 return X86::New##Zrrkz; \
2253 case X86::Orig##Zrm: \
2254 return X86::New##Zrm; \
2255 case X86::Orig##Zrmkz: \
2256 return X86::New##Zrmkz;
2258#define VPERM_CASES_BROADCAST(Orig, New) \
2259 VPERM_CASES(Orig, New) \
2260 case X86::Orig##Z128rmb: \
2261 return X86::New##Z128rmb; \
2262 case X86::Orig##Z128rmbkz: \
2263 return X86::New##Z128rmbkz; \
2264 case X86::Orig##Z256rmb: \
2265 return X86::New##Z256rmb; \
2266 case X86::Orig##Z256rmbkz: \
2267 return X86::New##Z256rmbkz; \
2268 case X86::Orig##Zrmb: \
2269 return X86::New##Zrmb; \
2270 case X86::Orig##Zrmbkz: \
2271 return X86::New##Zrmbkz;
2289#undef VPERM_CASES_BROADCAST
2295 unsigned OpIdx2)
const {
2297 return std::exchange(NewMI,
false)
2298 ?
MI.getParent()->getParent()->CloneMachineInstr(&
MI)
2302 unsigned Opc =
MI.getOpcode();
2304#define CASE_ND(OP) \
2320#define FROM_TO_SIZE(A, B, S) \
2326 Opc = X86::B##_ND; \
2334 Opc = X86::A##_ND; \
2343 WorkingMI = CloneIfNew(
MI);
2352 WorkingMI = CloneIfNew(
MI);
2354 get(X86::PFSUBRrr ==
Opc ? X86::PFSUBrr : X86::PFSUBRrr));
2356 case X86::BLENDPDrri:
2357 case X86::BLENDPSrri:
2358 case X86::PBLENDWrri:
2359 case X86::VBLENDPDrri:
2360 case X86::VBLENDPSrri:
2361 case X86::VBLENDPDYrri:
2362 case X86::VBLENDPSYrri:
2363 case X86::VPBLENDDrri:
2364 case X86::VPBLENDWrri:
2365 case X86::VPBLENDDYrri:
2366 case X86::VPBLENDWYrri: {
2371 case X86::BLENDPDrri:
2372 Mask = (int8_t)0x03;
2374 case X86::BLENDPSrri:
2375 Mask = (int8_t)0x0F;
2377 case X86::PBLENDWrri:
2378 Mask = (int8_t)0xFF;
2380 case X86::VBLENDPDrri:
2381 Mask = (int8_t)0x03;
2383 case X86::VBLENDPSrri:
2384 Mask = (int8_t)0x0F;
2386 case X86::VBLENDPDYrri:
2387 Mask = (int8_t)0x0F;
2389 case X86::VBLENDPSYrri:
2390 Mask = (int8_t)0xFF;
2392 case X86::VPBLENDDrri:
2393 Mask = (int8_t)0x0F;
2395 case X86::VPBLENDWrri:
2396 Mask = (int8_t)0xFF;
2398 case X86::VPBLENDDYrri:
2399 Mask = (int8_t)0xFF;
2401 case X86::VPBLENDWYrri:
2402 Mask = (int8_t)0xFF;
2408 int8_t
Imm =
MI.getOperand(3).getImm() & Mask;
2409 WorkingMI = CloneIfNew(
MI);
2413 case X86::INSERTPSrri:
2414 case X86::VINSERTPSrri:
2415 case X86::VINSERTPSZrri: {
2416 unsigned Imm =
MI.getOperand(
MI.getNumOperands() - 1).getImm();
2417 unsigned ZMask =
Imm & 15;
2418 unsigned DstIdx = (
Imm >> 4) & 3;
2419 unsigned SrcIdx = (
Imm >> 6) & 3;
2423 if (DstIdx == SrcIdx && (ZMask & (1 << DstIdx)) == 0 &&
2426 assert(AltIdx < 4 &&
"Illegal insertion index");
2427 unsigned AltImm = (AltIdx << 6) | (AltIdx << 4) | ZMask;
2428 WorkingMI = CloneIfNew(
MI);
2437 case X86::VMOVSSrr: {
2439 if (Subtarget.hasSSE41()) {
2445 Opc = X86::BLENDPDrri;
2449 Opc = X86::BLENDPSrri;
2453 Opc = X86::VBLENDPDrri;
2457 Opc = X86::VBLENDPSrri;
2462 WorkingMI = CloneIfNew(
MI);
2468 assert(
Opc == X86::MOVSDrr &&
"Only MOVSD can commute to SHUFPD");
2469 WorkingMI = CloneIfNew(
MI);
2474 case X86::SHUFPDrri: {
2476 assert(
MI.getOperand(3).getImm() == 0x02 &&
"Unexpected immediate!");
2477 WorkingMI = CloneIfNew(
MI);
2482 case X86::PCLMULQDQrri:
2483 case X86::VPCLMULQDQrri:
2484 case X86::VPCLMULQDQYrri:
2485 case X86::VPCLMULQDQZrri:
2486 case X86::VPCLMULQDQZ128rri:
2487 case X86::VPCLMULQDQZ256rri: {
2490 unsigned Imm =
MI.getOperand(3).getImm();
2491 unsigned Src1Hi =
Imm & 0x01;
2492 unsigned Src2Hi =
Imm & 0x10;
2493 WorkingMI = CloneIfNew(
MI);
2497 case X86::VPCMPBZ128rri:
2498 case X86::VPCMPUBZ128rri:
2499 case X86::VPCMPBZ256rri:
2500 case X86::VPCMPUBZ256rri:
2501 case X86::VPCMPBZrri:
2502 case X86::VPCMPUBZrri:
2503 case X86::VPCMPDZ128rri:
2504 case X86::VPCMPUDZ128rri:
2505 case X86::VPCMPDZ256rri:
2506 case X86::VPCMPUDZ256rri:
2507 case X86::VPCMPDZrri:
2508 case X86::VPCMPUDZrri:
2509 case X86::VPCMPQZ128rri:
2510 case X86::VPCMPUQZ128rri:
2511 case X86::VPCMPQZ256rri:
2512 case X86::VPCMPUQZ256rri:
2513 case X86::VPCMPQZrri:
2514 case X86::VPCMPUQZrri:
2515 case X86::VPCMPWZ128rri:
2516 case X86::VPCMPUWZ128rri:
2517 case X86::VPCMPWZ256rri:
2518 case X86::VPCMPUWZ256rri:
2519 case X86::VPCMPWZrri:
2520 case X86::VPCMPUWZrri:
2521 case X86::VPCMPBZ128rrik:
2522 case X86::VPCMPUBZ128rrik:
2523 case X86::VPCMPBZ256rrik:
2524 case X86::VPCMPUBZ256rrik:
2525 case X86::VPCMPBZrrik:
2526 case X86::VPCMPUBZrrik:
2527 case X86::VPCMPDZ128rrik:
2528 case X86::VPCMPUDZ128rrik:
2529 case X86::VPCMPDZ256rrik:
2530 case X86::VPCMPUDZ256rrik:
2531 case X86::VPCMPDZrrik:
2532 case X86::VPCMPUDZrrik:
2533 case X86::VPCMPQZ128rrik:
2534 case X86::VPCMPUQZ128rrik:
2535 case X86::VPCMPQZ256rrik:
2536 case X86::VPCMPUQZ256rrik:
2537 case X86::VPCMPQZrrik:
2538 case X86::VPCMPUQZrrik:
2539 case X86::VPCMPWZ128rrik:
2540 case X86::VPCMPUWZ128rrik:
2541 case X86::VPCMPWZ256rrik:
2542 case X86::VPCMPUWZ256rrik:
2543 case X86::VPCMPWZrrik:
2544 case X86::VPCMPUWZrrik:
2545 WorkingMI = CloneIfNew(
MI);
2549 MI.getOperand(
MI.getNumOperands() - 1).getImm() & 0x7));
2552 case X86::VPCOMUBri:
2554 case X86::VPCOMUDri:
2556 case X86::VPCOMUQri:
2558 case X86::VPCOMUWri:
2559 WorkingMI = CloneIfNew(
MI);
2564 case X86::VCMPSDZrri:
2565 case X86::VCMPSSZrri:
2566 case X86::VCMPPDZrri:
2567 case X86::VCMPPSZrri:
2568 case X86::VCMPSHZrri:
2569 case X86::VCMPPHZrri:
2570 case X86::VCMPPHZ128rri:
2571 case X86::VCMPPHZ256rri:
2572 case X86::VCMPPDZ128rri:
2573 case X86::VCMPPSZ128rri:
2574 case X86::VCMPPDZ256rri:
2575 case X86::VCMPPSZ256rri:
2576 case X86::VCMPPDZrrik:
2577 case X86::VCMPPSZrrik:
2578 case X86::VCMPPHZrrik:
2579 case X86::VCMPPDZ128rrik:
2580 case X86::VCMPPSZ128rrik:
2581 case X86::VCMPPHZ128rrik:
2582 case X86::VCMPPDZ256rrik:
2583 case X86::VCMPPSZ256rrik:
2584 case X86::VCMPPHZ256rrik:
2585 WorkingMI = CloneIfNew(
MI);
2588 MI.getOperand(
MI.getNumExplicitOperands() - 1).getImm() & 0x1f));
2590 case X86::VPERM2F128rri:
2591 case X86::VPERM2I128rri:
2595 WorkingMI = CloneIfNew(
MI);
2598 case X86::MOVHLPSrr:
2599 case X86::UNPCKHPDrr:
2600 case X86::VMOVHLPSrr:
2601 case X86::VUNPCKHPDrr:
2602 case X86::VMOVHLPSZrr:
2603 case X86::VUNPCKHPDZ128rr:
2604 assert(Subtarget.hasSSE2() &&
"Commuting MOVHLP/UNPCKHPD requires SSE2!");
2609 case X86::MOVHLPSrr:
2610 Opc = X86::UNPCKHPDrr;
2612 case X86::UNPCKHPDrr:
2613 Opc = X86::MOVHLPSrr;
2615 case X86::VMOVHLPSrr:
2616 Opc = X86::VUNPCKHPDrr;
2618 case X86::VUNPCKHPDrr:
2619 Opc = X86::VMOVHLPSrr;
2621 case X86::VMOVHLPSZrr:
2622 Opc = X86::VUNPCKHPDZ128rr;
2624 case X86::VUNPCKHPDZ128rr:
2625 Opc = X86::VMOVHLPSZrr;
2628 WorkingMI = CloneIfNew(
MI);
2634 WorkingMI = CloneIfNew(
MI);
2635 unsigned OpNo =
MI.getDesc().getNumOperands() - 1;
2640 case X86::VPTERNLOGDZrri:
2641 case X86::VPTERNLOGDZrmi:
2642 case X86::VPTERNLOGDZ128rri:
2643 case X86::VPTERNLOGDZ128rmi:
2644 case X86::VPTERNLOGDZ256rri:
2645 case X86::VPTERNLOGDZ256rmi:
2646 case X86::VPTERNLOGQZrri:
2647 case X86::VPTERNLOGQZrmi:
2648 case X86::VPTERNLOGQZ128rri:
2649 case X86::VPTERNLOGQZ128rmi:
2650 case X86::VPTERNLOGQZ256rri:
2651 case X86::VPTERNLOGQZ256rmi:
2652 case X86::VPTERNLOGDZrrik:
2653 case X86::VPTERNLOGDZ128rrik:
2654 case X86::VPTERNLOGDZ256rrik:
2655 case X86::VPTERNLOGQZrrik:
2656 case X86::VPTERNLOGQZ128rrik:
2657 case X86::VPTERNLOGQZ256rrik:
2658 case X86::VPTERNLOGDZrrikz:
2659 case X86::VPTERNLOGDZrmikz:
2660 case X86::VPTERNLOGDZ128rrikz:
2661 case X86::VPTERNLOGDZ128rmikz:
2662 case X86::VPTERNLOGDZ256rrikz:
2663 case X86::VPTERNLOGDZ256rmikz:
2664 case X86::VPTERNLOGQZrrikz:
2665 case X86::VPTERNLOGQZrmikz:
2666 case X86::VPTERNLOGQZ128rrikz:
2667 case X86::VPTERNLOGQZ128rmikz:
2668 case X86::VPTERNLOGQZ256rrikz:
2669 case X86::VPTERNLOGQZ256rmikz:
2670 case X86::VPTERNLOGDZ128rmbi:
2671 case X86::VPTERNLOGDZ256rmbi:
2672 case X86::VPTERNLOGDZrmbi:
2673 case X86::VPTERNLOGQZ128rmbi:
2674 case X86::VPTERNLOGQZ256rmbi:
2675 case X86::VPTERNLOGQZrmbi:
2676 case X86::VPTERNLOGDZ128rmbikz:
2677 case X86::VPTERNLOGDZ256rmbikz:
2678 case X86::VPTERNLOGDZrmbikz:
2679 case X86::VPTERNLOGQZ128rmbikz:
2680 case X86::VPTERNLOGQZ256rmbikz:
2681 case X86::VPTERNLOGQZrmbikz: {
2682 WorkingMI = CloneIfNew(
MI);
2688 WorkingMI = CloneIfNew(
MI);
2694 WorkingMI = CloneIfNew(
MI);
2703bool X86InstrInfo::findThreeSrcCommutedOpIndices(
const MachineInstr &
MI,
2704 unsigned &SrcOpIdx1,
2705 unsigned &SrcOpIdx2,
2706 bool IsIntrinsic)
const {
2707 uint64_t TSFlags =
MI.getDesc().TSFlags;
2709 unsigned FirstCommutableVecOp = 1;
2710 unsigned LastCommutableVecOp = 3;
2711 unsigned KMaskOp = -1U;
2734 FirstCommutableVecOp = 3;
2736 LastCommutableVecOp++;
2737 }
else if (IsIntrinsic) {
2740 FirstCommutableVecOp = 2;
2743 if (
isMem(
MI, LastCommutableVecOp))
2744 LastCommutableVecOp--;
2749 if (SrcOpIdx1 != CommuteAnyOperandIndex &&
2750 (SrcOpIdx1 < FirstCommutableVecOp || SrcOpIdx1 > LastCommutableVecOp ||
2751 SrcOpIdx1 == KMaskOp))
2753 if (SrcOpIdx2 != CommuteAnyOperandIndex &&
2754 (SrcOpIdx2 < FirstCommutableVecOp || SrcOpIdx2 > LastCommutableVecOp ||
2755 SrcOpIdx2 == KMaskOp))
2760 if (SrcOpIdx1 == CommuteAnyOperandIndex ||
2761 SrcOpIdx2 == CommuteAnyOperandIndex) {
2762 unsigned CommutableOpIdx2 = SrcOpIdx2;
2766 if (SrcOpIdx1 == SrcOpIdx2)
2769 CommutableOpIdx2 = LastCommutableVecOp;
2770 else if (SrcOpIdx2 == CommuteAnyOperandIndex)
2772 CommutableOpIdx2 = SrcOpIdx1;
2776 Register Op2Reg =
MI.getOperand(CommutableOpIdx2).getReg();
2778 unsigned CommutableOpIdx1;
2779 for (CommutableOpIdx1 = LastCommutableVecOp;
2780 CommutableOpIdx1 >= FirstCommutableVecOp; CommutableOpIdx1--) {
2782 if (CommutableOpIdx1 == KMaskOp)
2788 if (Op2Reg !=
MI.getOperand(CommutableOpIdx1).getReg())
2793 if (CommutableOpIdx1 < FirstCommutableVecOp)
2798 if (!fixCommutedOpIndices(SrcOpIdx1, SrcOpIdx2, CommutableOpIdx1,
2807 unsigned &SrcOpIdx1,
2808 unsigned &SrcOpIdx2)
const {
2810 if (!
Desc.isCommutable())
2813 switch (
MI.getOpcode()) {
2818 case X86::VCMPSDrri:
2819 case X86::VCMPSSrri:
2820 case X86::VCMPPDrri:
2821 case X86::VCMPPSrri:
2822 case X86::VCMPPDYrri:
2823 case X86::VCMPPSYrri:
2824 case X86::VCMPSDZrri:
2825 case X86::VCMPSSZrri:
2826 case X86::VCMPPDZrri:
2827 case X86::VCMPPSZrri:
2828 case X86::VCMPSHZrri:
2829 case X86::VCMPPHZrri:
2830 case X86::VCMPPHZ128rri:
2831 case X86::VCMPPHZ256rri:
2832 case X86::VCMPPDZ128rri:
2833 case X86::VCMPPSZ128rri:
2834 case X86::VCMPPDZ256rri:
2835 case X86::VCMPPSZ256rri:
2836 case X86::VCMPPDZrrik:
2837 case X86::VCMPPSZrrik:
2838 case X86::VCMPPHZrrik:
2839 case X86::VCMPPDZ128rrik:
2840 case X86::VCMPPSZ128rrik:
2841 case X86::VCMPPHZ128rrik:
2842 case X86::VCMPPDZ256rrik:
2843 case X86::VCMPPSZ256rrik:
2844 case X86::VCMPPHZ256rrik: {
2849 unsigned Imm =
MI.getOperand(3 + OpOffset).getImm() & 0x7;
2866 return fixCommutedOpIndices(SrcOpIdx1, SrcOpIdx2, 1 + OpOffset,
2873 if (Subtarget.hasSSE41())
2876 case X86::SHUFPDrri:
2878 if (
MI.getOperand(3).getImm() == 0x02)
2881 case X86::MOVHLPSrr:
2882 case X86::UNPCKHPDrr:
2883 case X86::VMOVHLPSrr:
2884 case X86::VUNPCKHPDrr:
2885 case X86::VMOVHLPSZrr:
2886 case X86::VUNPCKHPDZ128rr:
2887 if (Subtarget.hasSSE2())
2890 case X86::VPTERNLOGDZrri:
2891 case X86::VPTERNLOGDZrmi:
2892 case X86::VPTERNLOGDZ128rri:
2893 case X86::VPTERNLOGDZ128rmi:
2894 case X86::VPTERNLOGDZ256rri:
2895 case X86::VPTERNLOGDZ256rmi:
2896 case X86::VPTERNLOGQZrri:
2897 case X86::VPTERNLOGQZrmi:
2898 case X86::VPTERNLOGQZ128rri:
2899 case X86::VPTERNLOGQZ128rmi:
2900 case X86::VPTERNLOGQZ256rri:
2901 case X86::VPTERNLOGQZ256rmi:
2902 case X86::VPTERNLOGDZrrik:
2903 case X86::VPTERNLOGDZ128rrik:
2904 case X86::VPTERNLOGDZ256rrik:
2905 case X86::VPTERNLOGQZrrik:
2906 case X86::VPTERNLOGQZ128rrik:
2907 case X86::VPTERNLOGQZ256rrik:
2908 case X86::VPTERNLOGDZrrikz:
2909 case X86::VPTERNLOGDZrmikz:
2910 case X86::VPTERNLOGDZ128rrikz:
2911 case X86::VPTERNLOGDZ128rmikz:
2912 case X86::VPTERNLOGDZ256rrikz:
2913 case X86::VPTERNLOGDZ256rmikz:
2914 case X86::VPTERNLOGQZrrikz:
2915 case X86::VPTERNLOGQZrmikz:
2916 case X86::VPTERNLOGQZ128rrikz:
2917 case X86::VPTERNLOGQZ128rmikz:
2918 case X86::VPTERNLOGQZ256rrikz:
2919 case X86::VPTERNLOGQZ256rmikz:
2920 case X86::VPTERNLOGDZ128rmbi:
2921 case X86::VPTERNLOGDZ256rmbi:
2922 case X86::VPTERNLOGDZrmbi:
2923 case X86::VPTERNLOGQZ128rmbi:
2924 case X86::VPTERNLOGQZ256rmbi:
2925 case X86::VPTERNLOGQZrmbi:
2926 case X86::VPTERNLOGDZ128rmbikz:
2927 case X86::VPTERNLOGDZ256rmbikz:
2928 case X86::VPTERNLOGDZrmbikz:
2929 case X86::VPTERNLOGQZ128rmbikz:
2930 case X86::VPTERNLOGQZ256rmbikz:
2931 case X86::VPTERNLOGQZrmbikz:
2932 return findThreeSrcCommutedOpIndices(
MI, SrcOpIdx1, SrcOpIdx2);
2933 case X86::VPDPWSSDYrr:
2934 case X86::VPDPWSSDrr:
2935 case X86::VPDPWSSDSYrr:
2936 case X86::VPDPWSSDSrr:
2937 case X86::VPDPWUUDrr:
2938 case X86::VPDPWUUDYrr:
2939 case X86::VPDPWUUDSrr:
2940 case X86::VPDPWUUDSYrr:
2941 case X86::VPDPBSSDSrr:
2942 case X86::VPDPBSSDSYrr:
2943 case X86::VPDPBSSDrr:
2944 case X86::VPDPBSSDYrr:
2945 case X86::VPDPBUUDSrr:
2946 case X86::VPDPBUUDSYrr:
2947 case X86::VPDPBUUDrr:
2948 case X86::VPDPBUUDYrr:
2949 case X86::VPDPBSSDSZ128rr:
2950 case X86::VPDPBSSDSZ128rrk:
2951 case X86::VPDPBSSDSZ128rrkz:
2952 case X86::VPDPBSSDSZ256rr:
2953 case X86::VPDPBSSDSZ256rrk:
2954 case X86::VPDPBSSDSZ256rrkz:
2955 case X86::VPDPBSSDSZrr:
2956 case X86::VPDPBSSDSZrrk:
2957 case X86::VPDPBSSDSZrrkz:
2958 case X86::VPDPBSSDZ128rr:
2959 case X86::VPDPBSSDZ128rrk:
2960 case X86::VPDPBSSDZ128rrkz:
2961 case X86::VPDPBSSDZ256rr:
2962 case X86::VPDPBSSDZ256rrk:
2963 case X86::VPDPBSSDZ256rrkz:
2964 case X86::VPDPBSSDZrr:
2965 case X86::VPDPBSSDZrrk:
2966 case X86::VPDPBSSDZrrkz:
2967 case X86::VPDPBUUDSZ128rr:
2968 case X86::VPDPBUUDSZ128rrk:
2969 case X86::VPDPBUUDSZ128rrkz:
2970 case X86::VPDPBUUDSZ256rr:
2971 case X86::VPDPBUUDSZ256rrk:
2972 case X86::VPDPBUUDSZ256rrkz:
2973 case X86::VPDPBUUDSZrr:
2974 case X86::VPDPBUUDSZrrk:
2975 case X86::VPDPBUUDSZrrkz:
2976 case X86::VPDPBUUDZ128rr:
2977 case X86::VPDPBUUDZ128rrk:
2978 case X86::VPDPBUUDZ128rrkz:
2979 case X86::VPDPBUUDZ256rr:
2980 case X86::VPDPBUUDZ256rrk:
2981 case X86::VPDPBUUDZ256rrkz:
2982 case X86::VPDPBUUDZrr:
2983 case X86::VPDPBUUDZrrk:
2984 case X86::VPDPBUUDZrrkz:
2985 case X86::VPDPWSSDZ128rr:
2986 case X86::VPDPWSSDZ128rrk:
2987 case X86::VPDPWSSDZ128rrkz:
2988 case X86::VPDPWSSDZ256rr:
2989 case X86::VPDPWSSDZ256rrk:
2990 case X86::VPDPWSSDZ256rrkz:
2991 case X86::VPDPWSSDZrr:
2992 case X86::VPDPWSSDZrrk:
2993 case X86::VPDPWSSDZrrkz:
2994 case X86::VPDPWSSDSZ128rr:
2995 case X86::VPDPWSSDSZ128rrk:
2996 case X86::VPDPWSSDSZ128rrkz:
2997 case X86::VPDPWSSDSZ256rr:
2998 case X86::VPDPWSSDSZ256rrk:
2999 case X86::VPDPWSSDSZ256rrkz:
3000 case X86::VPDPWSSDSZrr:
3001 case X86::VPDPWSSDSZrrk:
3002 case X86::VPDPWSSDSZrrkz:
3003 case X86::VPDPWUUDZ128rr:
3004 case X86::VPDPWUUDZ128rrk:
3005 case X86::VPDPWUUDZ128rrkz:
3006 case X86::VPDPWUUDZ256rr:
3007 case X86::VPDPWUUDZ256rrk:
3008 case X86::VPDPWUUDZ256rrkz:
3009 case X86::VPDPWUUDZrr:
3010 case X86::VPDPWUUDZrrk:
3011 case X86::VPDPWUUDZrrkz:
3012 case X86::VPDPWUUDSZ128rr:
3013 case X86::VPDPWUUDSZ128rrk:
3014 case X86::VPDPWUUDSZ128rrkz:
3015 case X86::VPDPWUUDSZ256rr:
3016 case X86::VPDPWUUDSZ256rrk:
3017 case X86::VPDPWUUDSZ256rrkz:
3018 case X86::VPDPWUUDSZrr:
3019 case X86::VPDPWUUDSZrrk:
3020 case X86::VPDPWUUDSZrrkz:
3021 case X86::VPMADD52HUQrr:
3022 case X86::VPMADD52HUQYrr:
3023 case X86::VPMADD52HUQZ128r:
3024 case X86::VPMADD52HUQZ128rk:
3025 case X86::VPMADD52HUQZ128rkz:
3026 case X86::VPMADD52HUQZ256r:
3027 case X86::VPMADD52HUQZ256rk:
3028 case X86::VPMADD52HUQZ256rkz:
3029 case X86::VPMADD52HUQZr:
3030 case X86::VPMADD52HUQZrk:
3031 case X86::VPMADD52HUQZrkz:
3032 case X86::VPMADD52LUQrr:
3033 case X86::VPMADD52LUQYrr:
3034 case X86::VPMADD52LUQZ128r:
3035 case X86::VPMADD52LUQZ128rk:
3036 case X86::VPMADD52LUQZ128rkz:
3037 case X86::VPMADD52LUQZ256r:
3038 case X86::VPMADD52LUQZ256rk:
3039 case X86::VPMADD52LUQZ256rkz:
3040 case X86::VPMADD52LUQZr:
3041 case X86::VPMADD52LUQZrk:
3042 case X86::VPMADD52LUQZrkz:
3043 case X86::VFMADDCPHZr:
3044 case X86::VFMADDCPHZrk:
3045 case X86::VFMADDCPHZrkz:
3046 case X86::VFMADDCPHZ128r:
3047 case X86::VFMADDCPHZ128rk:
3048 case X86::VFMADDCPHZ128rkz:
3049 case X86::VFMADDCPHZ256r:
3050 case X86::VFMADDCPHZ256rk:
3051 case X86::VFMADDCPHZ256rkz:
3052 case X86::VFMADDCSHZr:
3053 case X86::VFMADDCSHZrk:
3054 case X86::VFMADDCSHZrkz: {
3055 unsigned CommutableOpIdx1 = 2;
3056 unsigned CommutableOpIdx2 = 3;
3062 if (!fixCommutedOpIndices(SrcOpIdx1, SrcOpIdx2, CommutableOpIdx1,
3065 if (!
MI.getOperand(SrcOpIdx1).isReg() || !
MI.getOperand(SrcOpIdx2).isReg())
3075 return findThreeSrcCommutedOpIndices(
MI, SrcOpIdx1, SrcOpIdx2,
3082 unsigned CommutableOpIdx1 =
Desc.getNumDefs() + 1;
3083 unsigned CommutableOpIdx2 =
Desc.getNumDefs() + 2;
3086 if ((
MI.getDesc().getOperandConstraint(
Desc.getNumDefs(),
3101 if (!fixCommutedOpIndices(SrcOpIdx1, SrcOpIdx2, CommutableOpIdx1,
3105 if (!
MI.getOperand(SrcOpIdx1).isReg() ||
3106 !
MI.getOperand(SrcOpIdx2).isReg())
3118 unsigned Opcode =
MI->getOpcode();
3119 if (Opcode != X86::LEA32r && Opcode != X86::LEA64r &&
3120 Opcode != X86::LEA64_32r)
3142 unsigned Opcode =
MI.getOpcode();
3143 if (Opcode != X86::ADD32rr && Opcode != X86::ADD64rr)
3170 unsigned Opcode =
MCID.getOpcode();
3171 if (!(X86::isJCC(Opcode) || X86::isSETCC(Opcode) || X86::isSETZUCC(Opcode) ||
3172 X86::isCMOVCC(Opcode) || X86::isCFCMOVCC(Opcode) ||
3173 X86::isCCMPCC(Opcode) || X86::isCTESTCC(Opcode)))
3176 unsigned NumUses =
MCID.getNumOperands() -
MCID.getNumDefs();
3185 CondNo +=
MCID.getNumDefs();
3195 return X86::isSETCC(
MI.getOpcode()) || X86::isSETZUCC(
MI.getOpcode())
3211 return X86::isCCMPCC(
MI.getOpcode()) || X86::isCTESTCC(
MI.getOpcode())
3242 enum { CF = 1, ZF = 2, SF = 4, OF = 8, PF = CF };
3273#define GET_X86_NF_TRANSFORM_TABLE
3274#define GET_X86_ND2NONND_TABLE
3275#include "X86GenInstrMapping.inc"
3280 return (
I ==
Table.end() ||
I->OldOpc !=
Opc) ? 0U :
I->NewOpc;
3283#if defined(EXPENSIVE_CHECKS) && !defined(NDEBUG)
3285 static std::atomic<bool> NFTableChecked(
false);
3286 if (!NFTableChecked.load(std::memory_order_relaxed)) {
3288 "X86NFTransformTable is not sorted!");
3289 NFTableChecked.store(
true, std::memory_order_relaxed);
3297 if (!
MI.registerDefIsDead(X86::EFLAGS,
TRI))
3309#if defined(EXPENSIVE_CHECKS) && !defined(NDEBUG)
3311 static std::atomic<bool> NDTableChecked(
false);
3312 if (!NDTableChecked.load(std::memory_order_relaxed)) {
3314 "X86ND2NonNDTableis not sorted!");
3315 NDTableChecked.store(
true, std::memory_order_relaxed);
3395std::pair<X86::CondCode, bool>
3398 bool NeedSwap =
false;
3399 switch (Predicate) {
3478 return std::make_pair(CC, NeedSwap);
3487#define GET_ND_IF_ENABLED(OPC) (HasNDD ? OPC##_ND : OPC)
3502 return X86::MOV32ri;
3505 return X86::MOV32ri64;
3507 return X86::MOV64ri32;
3508 return X86::MOV64ri;
3592 switch (
Imm & 0x3) {
3610 if (Info.RegClass == X86::VR128RegClassID ||
3611 Info.RegClass == X86::VR128XRegClassID)
3613 if (Info.RegClass == X86::VR256RegClassID ||
3614 Info.RegClass == X86::VR256XRegClassID)
3616 if (Info.RegClass == X86::VR512RegClassID)
3623 return (
Reg == X86::FPCW ||
Reg == X86::FPSW ||
3624 (
Reg >= X86::ST0 &&
Reg <= X86::ST7));
3632 if (
MI.isCall() ||
MI.isInlineAsm())
3656#ifdef EXPENSIVE_CHECKS
3658 "Got false negative from X86II::getMemoryOperandIdx()!");
3668#ifdef EXPENSIVE_CHECKS
3670 "Expected no operands to have OPERAND_MEMORY type!");
3679 if (IsMemOp(
Desc.operands()[
I])) {
3680#ifdef EXPENSIVE_CHECKS
3684 "Expected all five operands in the memory reference to have "
3685 "OPERAND_MEMORY type!");
3697 "Unexpected number of operands!");
3700 if (!Index.isReg() || Index.getReg() != X86::NoRegister)
3708 MI.getParent()->getParent()->getConstantPool()->getConstants();
3720 switch (
MI.getOpcode()) {
3721 case X86::TCRETURNdi:
3722 case X86::TCRETURNri:
3723 case X86::TCRETURNmi:
3724 case X86::TCRETURNdi64:
3725 case X86::TCRETURNri64:
3726 case X86::TCRETURNri64_ImpCall:
3727 case X86::TCRETURNmi64:
3746 if (Symbol ==
"__x86_indirect_thunk_r11")
3751 if (TailCall.
getOpcode() != X86::TCRETURNdi &&
3752 TailCall.
getOpcode() != X86::TCRETURNdi64) {
3757 if (Subtarget.isTargetWin64() && MF->
hasWinCFI()) {
3784 while (
I !=
MBB.begin()) {
3786 if (
I->isDebugInstr())
3789 assert(0 &&
"Can't find the branch to replace!");
3793 if (CC != BranchCond[0].
getImm())
3799 unsigned Opc = TailCall.
getOpcode() == X86::TCRETURNdi ? X86::TCRETURNdicc
3800 : X86::TCRETURNdi64cc;
3813 LiveRegs.stepForward(*MIB, Clobbers);
3814 for (
const auto &
C : Clobbers) {
3819 I->eraseFromParent();
3833 if (Succ->isEHPad() || (Succ ==
TBB && FallthroughBB))
3836 if (FallthroughBB && FallthroughBB !=
TBB)
3838 FallthroughBB = Succ;
3840 return FallthroughBB;
3843bool X86InstrInfo::analyzeBranchImpl(
3854 if (
I->isDebugInstr())
3859 if (!isUnpredicatedTerminator(*
I))
3868 if (
I->getOpcode() == X86::JMP_1) {
3872 TBB =
I->getOperand(0).getMBB();
3887 UnCondBrIter =
MBB.
end();
3892 TBB =
I->getOperand(0).getMBB();
3903 if (
I->findRegisterUseOperand(X86::EFLAGS,
nullptr)->isUndef())
3909 TBB =
I->getOperand(0).getMBB();
3924 if (OldBranchCode == BranchCode &&
TBB == NewTBB)
3930 if (
TBB == NewTBB &&
3963 Cond[0].setImm(BranchCode);
3974 bool AllowModify)
const {
3976 return analyzeBranchImpl(
MBB,
TBB, FBB,
Cond, CondBranches, AllowModify);
3981 assert(MemRefBegin >= 0 &&
"Expected a memory operand");
3992 if (!
Reg.isVirtual())
3997 unsigned Opcode =
MI->getOpcode();
3998 if (Opcode != X86::LEA64r && Opcode != X86::LEA32r)
4004 unsigned Opcode =
MI.getOpcode();
4007 if (Opcode == X86::JMP64m || Opcode == X86::JMP32m) {
4015 if (Opcode == X86::JMP64r || Opcode == X86::JMP32r) {
4017 if (!Reg.isVirtual())
4024 if (
Add->getOpcode() != X86::ADD64rr &&
Add->getOpcode() != X86::ADD32rr)
4037 MachineBranchPredicate &MBP,
4038 bool AllowModify)
const {
4039 using namespace std::placeholders;
4043 if (analyzeBranchImpl(
MBB, MBP.TrueDest, MBP.FalseDest,
Cond, CondBranches,
4047 if (
Cond.size() != 1)
4050 assert(MBP.TrueDest &&
"expected!");
4053 MBP.FalseDest =
MBB.getNextNode();
4058 bool SingleUseCondition =
true;
4061 if (
MI.modifiesRegister(X86::EFLAGS,
TRI)) {
4066 if (
MI.readsRegister(X86::EFLAGS,
TRI))
4067 SingleUseCondition =
false;
4073 if (SingleUseCondition) {
4074 for (
auto *Succ :
MBB.successors())
4075 if (Succ->isLiveIn(X86::EFLAGS))
4076 SingleUseCondition =
false;
4079 MBP.ConditionDef = ConditionDef;
4080 MBP.SingleUseCondition = SingleUseCondition;
4087 const unsigned TestOpcode =
4088 Subtarget.is64Bit() ? X86::TEST64rr : X86::TEST32rr;
4090 if (ConditionDef->
getOpcode() == TestOpcode &&
4097 ? MachineBranchPredicate::PRED_NE
4098 : MachineBranchPredicate::PRED_EQ;
4106 int *BytesRemoved)
const {
4107 assert(!BytesRemoved &&
"code size not handled");
4112 while (
I !=
MBB.begin()) {
4114 if (
I->isDebugInstr())
4116 if (
I->getOpcode() != X86::JMP_1 &&
4120 I->eraseFromParent();
4134 assert(
TBB &&
"insertBranch must not be told to insert a fallthrough");
4136 "X86 branch conditions have one component!");
4137 assert(!BytesAdded &&
"code size not handled");
4141 assert(!FBB &&
"Unconditional branch with multiple successors!");
4147 bool FallThru = FBB ==
nullptr;
4162 if (FBB ==
nullptr) {
4164 assert(FBB &&
"MBB cannot be the last block in function when the false "
4165 "body is a fall-through.");
4189 Register FalseReg,
int &CondCycles,
4190 int &TrueCycles,
int &FalseCycles)
const {
4192 if (!Subtarget.canUseCMOV())
4194 if (
Cond.size() != 1)
4208 if (X86::GR16RegClass.hasSubClassEq(RC) ||
4209 X86::GR32RegClass.hasSubClassEq(RC) ||
4210 X86::GR64RegClass.hasSubClassEq(RC)) {
4231 assert(
Cond.size() == 1 &&
"Invalid Cond array");
4234 false , Subtarget.hasNDD());
4243 return X86::GR8_ABCD_HRegClass.contains(
Reg);
4249 bool HasAVX = Subtarget.
hasAVX();
4251 bool HasEGPR = Subtarget.hasEGPR();
4258 if (X86::VK16RegClass.
contains(SrcReg)) {
4259 if (X86::GR64RegClass.
contains(DestReg)) {
4260 assert(Subtarget.hasBWI());
4261 return HasEGPR ? X86::KMOVQrk_EVEX : X86::KMOVQrk;
4263 if (X86::GR32RegClass.
contains(DestReg))
4264 return Subtarget.hasBWI() ? (HasEGPR ? X86::KMOVDrk_EVEX : X86::KMOVDrk)
4265 : (HasEGPR ? X86::KMOVWrk_EVEX : X86::KMOVWrk);
4273 if (X86::VK16RegClass.
contains(DestReg)) {
4274 if (X86::GR64RegClass.
contains(SrcReg)) {
4275 assert(Subtarget.hasBWI());
4276 return HasEGPR ? X86::KMOVQkr_EVEX : X86::KMOVQkr;
4278 if (X86::GR32RegClass.
contains(SrcReg))
4279 return Subtarget.hasBWI() ? (HasEGPR ? X86::KMOVDkr_EVEX : X86::KMOVDkr)
4280 : (HasEGPR ? X86::KMOVWkr_EVEX : X86::KMOVWkr);
4288 if (X86::GR64RegClass.
contains(DestReg)) {
4289 if (X86::VR128XRegClass.
contains(SrcReg))
4291 return HasAVX512 ? X86::VMOVPQIto64Zrr
4292 : HasAVX ? X86::VMOVPQIto64rr
4293 : X86::MOVPQIto64rr;
4294 if (X86::VR64RegClass.
contains(SrcReg))
4296 return X86::MMX_MOVD64from64rr;
4297 }
else if (X86::GR64RegClass.
contains(SrcReg)) {
4299 if (X86::VR128XRegClass.
contains(DestReg))
4300 return HasAVX512 ? X86::VMOV64toPQIZrr
4301 : HasAVX ? X86::VMOV64toPQIrr
4302 : X86::MOV64toPQIrr;
4304 if (X86::VR64RegClass.
contains(DestReg))
4305 return X86::MMX_MOVD64to64rr;
4311 if (X86::GR32RegClass.
contains(DestReg) &&
4312 X86::VR128XRegClass.
contains(SrcReg))
4314 return HasAVX512 ? X86::VMOVPDI2DIZrr
4315 : HasAVX ? X86::VMOVPDI2DIrr
4318 if (X86::VR128XRegClass.
contains(DestReg) &&
4319 X86::GR32RegClass.
contains(SrcReg))
4321 return HasAVX512 ? X86::VMOVDI2PDIZrr
4322 : HasAVX ? X86::VMOVDI2PDIrr
4332 bool RenamableDest,
bool RenamableSrc)
const {
4334 bool HasAVX = Subtarget.hasAVX();
4335 bool HasVLX = Subtarget.hasVLX();
4336 bool HasEGPR = Subtarget.hasEGPR();
4338 if (X86::GR64RegClass.
contains(DestReg, SrcReg))
4340 else if (X86::GR32RegClass.
contains(DestReg, SrcReg))
4342 else if (X86::GR16RegClass.
contains(DestReg, SrcReg))
4344 else if (X86::GR8RegClass.
contains(DestReg, SrcReg)) {
4347 if ((
isHReg(DestReg) ||
isHReg(SrcReg)) && Subtarget.is64Bit()) {
4348 Opc = X86::MOV8rr_NOREX;
4351 "8-bit H register can not be copied outside GR8_NOREX");
4354 }
else if (X86::VR64RegClass.
contains(DestReg, SrcReg))
4355 Opc = X86::MMX_MOVQ64rr;
4356 else if (X86::VR128XRegClass.
contains(DestReg, SrcReg)) {
4358 Opc = X86::VMOVAPSZ128rr;
4359 else if (X86::VR128RegClass.
contains(DestReg, SrcReg))
4360 Opc = HasAVX ? X86::VMOVAPSrr : X86::MOVAPSrr;
4364 Opc = X86::VMOVAPSZrr;
4367 TRI->getMatchingSuperReg(DestReg, X86::sub_xmm, &X86::VR512RegClass);
4369 TRI->getMatchingSuperReg(SrcReg, X86::sub_xmm, &X86::VR512RegClass);
4371 }
else if (X86::VR256XRegClass.
contains(DestReg, SrcReg)) {
4373 Opc = X86::VMOVAPSZ256rr;
4374 else if (X86::VR256RegClass.
contains(DestReg, SrcReg))
4375 Opc = X86::VMOVAPSYrr;
4379 Opc = X86::VMOVAPSZrr;
4382 TRI->getMatchingSuperReg(DestReg, X86::sub_ymm, &X86::VR512RegClass);
4384 TRI->getMatchingSuperReg(SrcReg, X86::sub_ymm, &X86::VR512RegClass);
4386 }
else if (X86::VR512RegClass.
contains(DestReg, SrcReg))
4387 Opc = X86::VMOVAPSZrr;
4390 else if (X86::VK16RegClass.
contains(DestReg, SrcReg))
4391 Opc = Subtarget.hasBWI() ? (HasEGPR ? X86::KMOVQkk_EVEX : X86::KMOVQkk)
4392 : (HasEGPR ? X86::KMOVWkk_EVEX : X86::KMOVWkk);
4403 if (SrcReg == X86::EFLAGS || DestReg == X86::EFLAGS) {
4411 LLVM_DEBUG(
dbgs() <<
"Cannot copy " << RI.getName(SrcReg) <<
" to "
4412 << RI.getName(DestReg) <<
'\n');
4416std::optional<DestSourcePair>
4418 if (
MI.isMoveReg()) {
4422 if (
MI.getOperand(0).isUndef() &&
MI.getOperand(0).getSubReg())
4423 return std::nullopt;
4427 return std::nullopt;
4432 return Load ? X86::VMOVSHZrm_alt : X86::VMOVSHZmr;
4434 return X86::MOVSHPrm;
4435 return X86::MOVSHPmr;
4440 bool IsStackAligned,
4442 bool HasAVX = STI.
hasAVX();
4444 bool HasVLX = STI.hasVLX();
4445 bool HasEGPR = STI.hasEGPR();
4447 assert(RC !=
nullptr &&
"Invalid target register class");
4452 assert(X86::GR8RegClass.hasSubClassEq(RC) &&
"Unknown 1-byte regclass");
4456 if (
isHReg(
Reg) || X86::GR8_ABCD_HRegClass.hasSubClassEq(RC))
4457 return Load ? X86::MOV8rm_NOREX : X86::MOV8mr_NOREX;
4458 return Load ? X86::MOV8rm : X86::MOV8mr;
4460 if (X86::VK16RegClass.hasSubClassEq(RC))
4461 return Load ? (HasEGPR ? X86::KMOVWkm_EVEX : X86::KMOVWkm)
4462 : (HasEGPR ? X86::KMOVWmk_EVEX : X86::KMOVWmk);
4463 assert(X86::GR16RegClass.hasSubClassEq(RC) &&
"Unknown 2-byte regclass");
4464 return Load ? X86::MOV16rm : X86::MOV16mr;
4466 if (X86::GR32RegClass.hasSubClassEq(RC))
4467 return Load ? X86::MOV32rm : X86::MOV32mr;
4468 if (X86::FR32XRegClass.hasSubClassEq(RC))
4469 return Load ? (HasAVX512 ? X86::VMOVSSZrm_alt
4470 : HasAVX ? X86::VMOVSSrm_alt
4472 : (HasAVX512 ? X86::VMOVSSZmr
4473 : HasAVX ? X86::VMOVSSmr
4475 if (X86::RFP32RegClass.hasSubClassEq(RC))
4476 return Load ? X86::LD_Fp32m : X86::ST_Fp32m;
4477 if (X86::VK32RegClass.hasSubClassEq(RC)) {
4478 assert(STI.hasBWI() &&
"KMOVD requires BWI");
4479 return Load ? (HasEGPR ? X86::KMOVDkm_EVEX : X86::KMOVDkm)
4480 : (HasEGPR ? X86::KMOVDmk_EVEX : X86::KMOVDmk);
4484 if (X86::VK1PAIRRegClass.hasSubClassEq(RC) ||
4485 X86::VK2PAIRRegClass.hasSubClassEq(RC) ||
4486 X86::VK4PAIRRegClass.hasSubClassEq(RC) ||
4487 X86::VK8PAIRRegClass.hasSubClassEq(RC) ||
4488 X86::VK16PAIRRegClass.hasSubClassEq(RC))
4489 return Load ? X86::MASKPAIR16LOAD : X86::MASKPAIR16STORE;
4490 if (X86::FR16RegClass.hasSubClassEq(RC) ||
4491 X86::FR16XRegClass.hasSubClassEq(RC))
4495 if (X86::GR64RegClass.hasSubClassEq(RC))
4496 return Load ? X86::MOV64rm : X86::MOV64mr;
4497 if (X86::FR64XRegClass.hasSubClassEq(RC))
4498 return Load ? (HasAVX512 ? X86::VMOVSDZrm_alt
4499 : HasAVX ? X86::VMOVSDrm_alt
4501 : (HasAVX512 ? X86::VMOVSDZmr
4502 : HasAVX ? X86::VMOVSDmr
4504 if (X86::VR64RegClass.hasSubClassEq(RC))
4505 return Load ? X86::MMX_MOVQ64rm : X86::MMX_MOVQ64mr;
4506 if (X86::RFP64RegClass.hasSubClassEq(RC))
4507 return Load ? X86::LD_Fp64m : X86::ST_Fp64m;
4508 if (X86::VK64RegClass.hasSubClassEq(RC)) {
4509 assert(STI.hasBWI() &&
"KMOVQ requires BWI");
4510 return Load ? (HasEGPR ? X86::KMOVQkm_EVEX : X86::KMOVQkm)
4511 : (HasEGPR ? X86::KMOVQmk_EVEX : X86::KMOVQmk);
4515 assert(X86::RFP80RegClass.hasSubClassEq(RC) &&
"Unknown 10-byte regclass");
4516 return Load ? X86::LD_Fp80m : X86::ST_FpP80m;
4518 if (X86::VR128XRegClass.hasSubClassEq(RC)) {
4521 return Load ? (HasVLX ? X86::VMOVAPSZ128rm
4522 : HasAVX512 ? X86::VMOVAPSZ128rm_NOVLX
4523 : HasAVX ? X86::VMOVAPSrm
4525 : (HasVLX ? X86::VMOVAPSZ128mr
4526 : HasAVX512 ? X86::VMOVAPSZ128mr_NOVLX
4527 : HasAVX ? X86::VMOVAPSmr
4530 return Load ? (HasVLX ? X86::VMOVUPSZ128rm
4531 : HasAVX512 ? X86::VMOVUPSZ128rm_NOVLX
4532 : HasAVX ? X86::VMOVUPSrm
4534 : (HasVLX ? X86::VMOVUPSZ128mr
4535 : HasAVX512 ? X86::VMOVUPSZ128mr_NOVLX
4536 : HasAVX ? X86::VMOVUPSmr
4542 assert(X86::VR256XRegClass.hasSubClassEq(RC) &&
"Unknown 32-byte regclass");
4545 return Load ? (HasVLX ? X86::VMOVAPSZ256rm
4546 : HasAVX512 ? X86::VMOVAPSZ256rm_NOVLX
4548 : (HasVLX ? X86::VMOVAPSZ256mr
4549 : HasAVX512 ? X86::VMOVAPSZ256mr_NOVLX
4552 return Load ? (HasVLX ? X86::VMOVUPSZ256rm
4553 : HasAVX512 ? X86::VMOVUPSZ256rm_NOVLX
4555 : (HasVLX ? X86::VMOVUPSZ256mr
4556 : HasAVX512 ? X86::VMOVUPSZ256mr_NOVLX
4559 assert(X86::VR512RegClass.hasSubClassEq(RC) &&
"Unknown 64-byte regclass");
4562 return Load ? X86::VMOVAPSZrm : X86::VMOVAPSZmr;
4564 return Load ? X86::VMOVUPSZrm : X86::VMOVUPSZmr;
4566 assert(X86::TILERegClass.hasSubClassEq(RC) &&
"Unknown 1024-byte regclass");
4567 assert(STI.hasAMXTILE() &&
"Using 8*1024-bit register requires AMX-TILE");
4568#define GET_EGPR_IF_ENABLED(OPC) (STI.hasEGPR() ? OPC##_EVEX : OPC)
4571#undef GET_EGPR_IF_ENABLED
4575std::optional<ExtAddrMode>
4579 if (MemRefBegin < 0)
4580 return std::nullopt;
4583 if (!BaseOp.isReg())
4584 return std::nullopt;
4588 if (!DispMO.
isImm())
4589 return std::nullopt;
4615 ErrInfo =
"Scale factor in address must be 1, 2, 4 or 8";
4620 ErrInfo =
"Displacement in address must fit into 32-bit signed "
4630 int64_t &ImmVal)
const {
4636 if (
MI.isSubregToReg()) {
4640 unsigned SubIdx =
MI.getOperand(2).getImm();
4641 MovReg =
MI.getOperand(1).getReg();
4642 if (SubIdx != X86::sub_32bit)
4650 if (MovMI->
getOpcode() == X86::MOV32r0 &&
4656 if (MovMI->
getOpcode() != X86::MOV32ri &&
4670 if (!
MI->modifiesRegister(NullValueReg,
TRI))
4672 switch (
MI->getOpcode()) {
4679 assert(
MI->getOperand(0).isDef() &&
MI->getOperand(1).isUse() &&
4680 "expected for shift opcode!");
4681 return MI->getOperand(0).getReg() == NullValueReg &&
4682 MI->getOperand(1).getReg() == NullValueReg;
4687 return TRI->isSubRegisterEq(NullValueReg, MO.getReg());
4700 if (MemRefBegin < 0)
4705 if (!BaseOp->
isReg())
4718 if (!DispMO.
isImm())
4723 if (!BaseOp->
isReg())
4726 OffsetIsScalable =
false;
4730 Width = !
MemOp.memoperands_empty() ?
MemOp.memoperands().front()->getSize()
4738 bool IsStackAligned,
4753 case X86::TILELOADD:
4754 case X86::TILESTORED:
4755 case X86::TILELOADD_EVEX:
4756 case X86::TILESTORED_EVEX:
4764 bool isKill)
const {
4768 case X86::TILESTORED:
4769 case X86::TILESTORED_EVEX: {
4772 Register VirtReg = RegInfo.createVirtualRegister(&X86::GR64_NOSPRegClass);
4782 case X86::TILELOADD:
4783 case X86::TILELOADD_EVEX: {
4786 Register VirtReg = RegInfo.createVirtualRegister(&X86::GR64_NOSPRegClass);
4806 "Stack slot too small for store");
4808 unsigned Alignment = std::max<uint32_t>(RI.getSpillSize(*RC), 16);
4810 (Subtarget.getFrameLowering()->
getStackAlign() >= Alignment) ||
4831 "Load size exceeds stack slot");
4832 unsigned Alignment = std::max<uint32_t>(RI.getSpillSize(*RC), 16);
4834 (Subtarget.getFrameLowering()->
getStackAlign() >= Alignment) ||
4846 Register &SrcReg2, int64_t &CmpMask,
4847 int64_t &CmpValue)
const {
4848 switch (
MI.getOpcode()) {
4851 case X86::CMP64ri32:
4855 SrcReg =
MI.getOperand(0).getReg();
4857 if (
MI.getOperand(1).isImm()) {
4859 CmpValue =
MI.getOperand(1).getImm();
4861 CmpMask = CmpValue = 0;
4869 SrcReg =
MI.getOperand(1).getReg();
4878 SrcReg =
MI.getOperand(1).getReg();
4879 SrcReg2 =
MI.getOperand(2).getReg();
4887 SrcReg =
MI.getOperand(1).getReg();
4889 if (
MI.getOperand(2).isImm()) {
4891 CmpValue =
MI.getOperand(2).getImm();
4893 CmpMask = CmpValue = 0;
4900 SrcReg =
MI.getOperand(0).getReg();
4901 SrcReg2 =
MI.getOperand(1).getReg();
4909 SrcReg =
MI.getOperand(0).getReg();
4910 if (
MI.getOperand(1).getReg() != SrcReg)
4917 case X86::TEST64ri32:
4921 SrcReg =
MI.getOperand(0).getReg();
4931bool X86InstrInfo::isRedundantFlagInstr(
const MachineInstr &FlagI,
4933 int64_t ImmMask, int64_t ImmValue,
4935 int64_t *ImmDelta)
const {
4950 OIMask != ImmMask || OIValue != ImmValue)
4952 if (SrcReg == OISrcReg && SrcReg2 == OISrcReg2) {
4956 if (SrcReg == OISrcReg2 && SrcReg2 == OISrcReg) {
4962 case X86::CMP64ri32:
4966 case X86::TEST64ri32:
4977 case X86::TEST8rr: {
4984 SrcReg == OISrcReg && ImmMask == OIMask) {
4985 if (OIValue == ImmValue) {
4988 }
else if (
static_cast<uint64_t>(ImmValue) ==
4989 static_cast<uint64_t>(OIValue) - 1) {
4992 }
else if (
static_cast<uint64_t>(ImmValue) ==
4993 static_cast<uint64_t>(OIValue) + 1) {
5009 int64_t ImmMask, int64_t ImmValue,
5014 case X86::LZCNT16rr:
5015 case X86::LZCNT32rr:
5016 case X86::LZCNT64rr:
5017 case X86::TZCNT16rr:
5018 case X86::TZCNT32rr:
5019 case X86::TZCNT64rr: {
5020 if (ImmMask != 0 && !SrcReg2.
isValid() && ImmValue == 1 &&
5029#define CASE_EVEX(OP) \
5031 case X86::OP##_EVEX:
5036 bool &ClearsOverflowFlag) {
5038 ClearsOverflowFlag =
false;
5044 if (
MI.getOpcode() == X86::ADD64rm ||
MI.getOpcode() == X86::ADD32rm) {
5045 unsigned Flags =
MI.getOperand(5).getTargetFlags();
5051 switch (
MI.getOpcode()) {
5147 case X86::LZCNT16rr:
5148 case X86::LZCNT16rm:
5149 case X86::LZCNT32rr:
5150 case X86::LZCNT32rm:
5151 case X86::LZCNT64rr:
5152 case X86::LZCNT64rm:
5153 case X86::POPCNT16rr:
5154 case X86::POPCNT16rm:
5155 case X86::POPCNT32rr:
5156 case X86::POPCNT32rm:
5157 case X86::POPCNT64rr:
5158 case X86::POPCNT64rm:
5159 case X86::TZCNT16rr:
5160 case X86::TZCNT16rm:
5161 case X86::TZCNT32rr:
5162 case X86::TZCNT32rm:
5163 case X86::TZCNT64rr:
5164 case X86::TZCNT64rm:
5218 case X86::BLCFILL32rr:
5219 case X86::BLCFILL32rm:
5220 case X86::BLCFILL64rr:
5221 case X86::BLCFILL64rm:
5226 case X86::BLCIC32rr:
5227 case X86::BLCIC32rm:
5228 case X86::BLCIC64rr:
5229 case X86::BLCIC64rm:
5230 case X86::BLCMSK32rr:
5231 case X86::BLCMSK32rm:
5232 case X86::BLCMSK64rr:
5233 case X86::BLCMSK64rm:
5238 case X86::BLSFILL32rr:
5239 case X86::BLSFILL32rm:
5240 case X86::BLSFILL64rr:
5241 case X86::BLSFILL64rm:
5242 case X86::BLSIC32rr:
5243 case X86::BLSIC32rm:
5244 case X86::BLSIC64rr:
5245 case X86::BLSIC64rm:
5250 case X86::T1MSKC32rr:
5251 case X86::T1MSKC32rm:
5252 case X86::T1MSKC64rr:
5253 case X86::T1MSKC64rm:
5254 case X86::TZMSK32rr:
5255 case X86::TZMSK32rm:
5256 case X86::TZMSK64rr:
5257 case X86::TZMSK64rm:
5261 ClearsOverflowFlag =
true;
5267 case X86::BEXTRI32ri:
5268 case X86::BEXTRI32mi:
5269 case X86::BEXTRI64ri:
5270 case X86::BEXTRI64mi:
5281 switch (
MI.getOpcode()) {
5289 case X86::LZCNT16rr:
5290 case X86::LZCNT32rr:
5291 case X86::LZCNT64rr:
5293 case X86::POPCNT16rr:
5294 case X86::POPCNT32rr:
5295 case X86::POPCNT64rr:
5297 case X86::TZCNT16rr:
5298 case X86::TZCNT32rr:
5299 case X86::TZCNT64rr:
5321MachineInstr *X86InstrInfo::findDominatingRedundantFlagInstr(
5325 SmallVectorImpl<std::pair<MachineInstr *, unsigned>> &InstsToUpdate)
const {
5326 assert(Subtarget.hasNF() &&
"NF feature required");
5354 MachineInstr *
Sub =
nullptr;
5355 MachineBasicBlock *SubMBB =
nullptr;
5357 SmallPtrSet<MachineBasicBlock *, 8> Visited;
5359 Visited.
insert(MultiPredMBB);
5360 for (MachineBasicBlock *Pred : MultiPredMBB->
predecessors())
5361 if (Visited.
insert(Pred).second)
5363 while (!Worklist.
empty()) {
5367 if (!Inst.modifiesRegister(X86::EFLAGS,
TRI))
5369 if (isRedundantFlagInstr(CmpInstr, SrcReg, SrcReg2, CmpMask, CmpValue,
5370 Inst, &IsSwapped, &ImmDelta)) {
5379 Pending.
push_back(std::make_pair(&Inst, NewOpc));
5383 if (
Sub && SubMBB !=
MBB)
5393 if (Visited.
insert(Pred).second)
5405 if (IsSwapped || ImmDelta != 0)
5408 InstsToUpdate.append(Pending.
begin(), Pending.
end());
5438 unsigned NewOpcode = 0;
5439#define FROM_TO(A, B) \
5440 CASE_ND(A) NewOpcode = X86::B; \
5464 if (NewOpcode == X86::CMP64rm || NewOpcode == X86::CMP32rm ||
5465 NewOpcode == X86::CMP16rm || NewOpcode == X86::CMP8rm)
5473 bool IsCmpZero = (CmpMask != 0 && CmpValue == 0);
5487 bool NoSignFlag =
false;
5488 bool ClearsOverflowFlag =
false;
5489 bool ShouldUpdateCC =
false;
5490 bool IsSwapped =
false;
5491 bool HasNF = Subtarget.hasNF();
5494 int64_t ImmDelta = 0;
5507 if (&Inst == SrcRegDef) {
5530 Subtarget, NoSignFlag, ClearsOverflowFlag)) {
5539 if (Inst.modifiesRegister(X86::EFLAGS,
TRI)) {
5550 Inst.getOperand(OpNo).getReg() == SrcReg) {
5551 ShouldUpdateCC =
true;
5562 if (isRedundantFlagInstr(CmpInstr, SrcReg, SrcReg2, CmpMask, CmpValue,
5563 Inst, &IsSwapped, &ImmDelta)) {
5577 if (!Movr0Inst && Inst.
getOpcode() == X86::MOV32r0 &&
5578 Inst.registerDefIsDead(X86::EFLAGS,
TRI)) {
5589 InstsToUpdate.
push_back(std::make_pair(&Inst, NewOp));
5598 if (
MI ||
Sub || LTZCNTInst)
5604 if (
MBB->pred_size() != 1) {
5618 Sub = findDominatingRedundantFlagInstr(
5619 CmpInstr, SrcReg, SrcReg2, CmpMask, CmpValue,
MBB, IsSwapped,
5620 ImmDelta, InstsToUpdate);
5625 MBB = *
MBB->pred_begin();
5626 From =
MBB->rbegin();
5633 bool FlagsMayLiveOut =
true;
5638 bool ModifyEFLAGS = Instr.modifiesRegister(X86::EFLAGS,
TRI);
5639 bool UseEFLAGS = Instr.readsRegister(X86::EFLAGS,
TRI);
5641 if (!UseEFLAGS && ModifyEFLAGS) {
5643 FlagsMayLiveOut =
false;
5646 if (!UseEFLAGS && !ModifyEFLAGS)
5677 if (!ClearsOverflowFlag)
5696 ReplacementCC = NewCC;
5702 }
else if (IsSwapped) {
5709 ShouldUpdateCC =
true;
5710 }
else if (ImmDelta != 0) {
5721 if (ImmDelta != 1 || CmpValue == 0)
5731 if (ImmDelta != 1 || CmpValue == 0)
5758 ShouldUpdateCC =
true;
5762 unsigned InstCode = Instr.getOpcode();
5763 if (!X86::isADC(InstCode) && !X86::isSBB(InstCode) &&
5764 !X86::isRCL(InstCode) && !X86::isRCR(InstCode))
5770 if (ShouldUpdateCC && ReplacementCC != OldCC) {
5774 OpsToUpdate.
push_back(std::make_pair(&Instr, ReplacementCC));
5776 if (ModifyEFLAGS || Instr.killsRegister(X86::EFLAGS,
TRI)) {
5778 FlagsMayLiveOut =
false;
5785 if ((
MI !=
nullptr || ShouldUpdateCC) && FlagsMayLiveOut) {
5792 assert((
MI ==
nullptr ||
Sub ==
nullptr) &&
"Should not have Sub and MI set");
5799 if (&CmpMBB != SubBB)
5803 InsertE =
Sub->getParent()->rend();
5804 for (; InsertI != InsertE; ++InsertI) {
5806 if (!Instr->readsRegister(X86::EFLAGS,
TRI) &&
5807 Instr->modifiesRegister(X86::EFLAGS,
TRI)) {
5814 if (InsertI == InsertE)
5819 for (
auto &Inst : InstsToUpdate) {
5820 Inst.first->setDesc(
get(Inst.second));
5821 Inst.first->removeOperand(
5822 Inst.first->findRegisterDefOperandIdx(X86::EFLAGS,
nullptr));
5827 Sub->findRegisterDefOperand(X86::EFLAGS,
nullptr);
5828 assert(FlagDef &&
"Unable to locate a def EFLAGS operand");
5834 for (
auto &
Op : OpsToUpdate) {
5835 Op.first->getOperand(
Op.first->getDesc().getNumOperands() - 1)
5848 while (!Worklist.
empty()) {
5853 if (!
MBB->isLiveIn(X86::EFLAGS))
5854 MBB->addLiveIn(X86::EFLAGS);
5856 if (Visited.
insert(Pred).second)
5885#define FROM_TO(FROM, TO) \
5888 case X86::FROM##_ND: \
5889 return X86::TO##_ND;
5917#define FROM_TO(FROM, TO) \
5923 FROM_TO(CTEST64rr, CTEST64ri32)
5931 case X86::ADD64rr_ND:
5932 return X86::ADD64ri32_ND;
5933 case X86::SUB64rr_ND:
5934 return X86::SUB64ri32_ND;
5946 bool MakeChange)
const {
5956 (
Reg.
isVirtual() && X86::GR64RegClass.hasSubClassEq(RC))) {
5961 if (
UseMI.findRegisterUseOperand(
Reg,
nullptr)->getSubReg())
5971 if (
Opc == TargetOpcode::COPY) {
5976 bool GR32Reg = (ToReg.
isVirtual() && X86::GR32RegClass.hasSubClassEq(RC)) ||
5978 bool GR64Reg = (ToReg.
isVirtual() && X86::GR64RegClass.hasSubClassEq(RC)) ||
5980 bool GR8Reg = (ToReg.
isVirtual() && X86::GR8RegClass.hasSubClassEq(RC)) ||
5991 NewOpc = X86::MOV32ri64;
5993 NewOpc = X86::MOV64ri;
5994 }
else if (GR32Reg) {
5995 NewOpc = X86::MOV32ri;
5999 if (
UseMI.getParent()->computeRegisterLiveness(
6008 UseMI.removeOperand(
6009 UseMI.findRegisterUseOperandIdx(
Reg,
nullptr));
6017 NewOpc = X86::MOV8ri;
6027 if ((NewOpc == X86::SUB64ri32 || NewOpc == X86::SUB32ri ||
6028 NewOpc == X86::SBB64ri32 || NewOpc == X86::SBB32ri ||
6029 NewOpc == X86::SUB64ri32_ND || NewOpc == X86::SUB32ri_ND ||
6030 NewOpc == X86::SBB64ri32_ND || NewOpc == X86::SBB32ri_ND) &&
6031 UseMI.findRegisterUseOperandIdx(
Reg,
nullptr) != 2)
6034 if (((NewOpc == X86::CMP64ri32 || NewOpc == X86::CMP32ri) ||
6035 (NewOpc == X86::CCMP64ri32 || NewOpc == X86::CCMP32ri)) &&
6036 UseMI.findRegisterUseOperandIdx(
Reg,
nullptr) != 1)
6039 using namespace X86;
6040 if (isSHL(
Opc) || isSHR(
Opc) || isSAR(
Opc) || isROL(
Opc) || isROR(
Opc) ||
6041 isRCL(
Opc) || isRCR(
Opc)) {
6042 unsigned RegIdx =
UseMI.findRegisterUseOperandIdx(
Reg,
nullptr);
6052 UseMI.removeOperand(RegIdx);
6066 UseMI.registerDefIsDead(X86::EFLAGS,
nullptr)) {
6070 UseMI.setDesc(
get(TargetOpcode::COPY));
6071 UseMI.removeOperand(
6072 UseMI.findRegisterUseOperandIdx(
Reg,
nullptr));
6073 UseMI.removeOperand(
6074 UseMI.findRegisterDefOperandIdx(X86::EFLAGS,
nullptr));
6075 UseMI.untieRegOperand(0);
6079 unsigned Op1 = 1, Op2 = CommuteAnyOperandIndex;
6080 unsigned ImmOpNum = 2;
6081 if (!
UseMI.getOperand(0).isDef()) {
6085 if (
Opc == TargetOpcode::COPY)
6089 commuteInstruction(
UseMI);
6093 UseMI.getOperand(ImmOpNum).ChangeToImmediate(ImmVal);
6111 return foldImmediateImpl(
UseMI, &
DefMI, Reg, ImmVal, MRI,
true);
6123 assert(
Desc.getNumOperands() == 3 &&
"Expected two-addr instruction.");
6143 assert(
Desc.getNumOperands() == 3 &&
"Expected two-addr instruction.");
6161 MIB->
setDesc(
TII.get(MinusOne ? X86::DEC32r : X86::INC32r));
6173 assert(
Imm != 0 &&
"Using push/pop for 0 is not efficient.");
6176 int StackAdjustment;
6178 if (Subtarget.is64Bit()) {
6180 MIB->
getOpcode() == X86::MOV32ImmSExti8);
6194 StackAdjustment = 8;
6200 StackAdjustment = 4;
6212 bool EmitCFI = !TFL->
hasFP(MF) && NeedsDwarfCFI;
6259 MIB->
getOpcode() == X86::XOR64_FP ? X86::XOR64rr : X86::XOR32rr;
6271 const MCInstrDesc &BroadcastDesc,
unsigned SubIdx) {
6274 if (
TRI->getEncodingValue(DestReg) < 16) {
6281 DestReg =
TRI->getMatchingSuperReg(DestReg, SubIdx, &X86::VR512RegClass);
6293 const MCInstrDesc &ExtractDesc,
unsigned SubIdx) {
6296 if (
TRI->getEncodingValue(SrcReg) < 16) {
6303 SrcReg =
TRI->getMatchingSuperReg(SrcReg, SubIdx, &X86::VR512RegClass);
6326 if (
MI.getOpcode() == X86::MOVSHPrm) {
6327 NewOpc = HasAVX ? X86::VMOVSSrm : X86::MOVSSrm;
6329 if (
Reg > X86::XMM15)
6330 NewOpc = X86::VMOVSSZrm;
6332 NewOpc = HasAVX ? X86::VMOVSSmr : X86::MOVSSmr;
6334 if (
Reg > X86::XMM15)
6335 NewOpc = X86::VMOVSSZmr;
6343 bool HasAVX = Subtarget.hasAVX();
6345 switch (
MI.getOpcode()) {
6352 case X86::MOV32ImmSExti8:
6353 case X86::MOV64ImmSExti8:
6355 case X86::SETB_C32r:
6357 case X86::SETB_C64r:
6365 case X86::FsFLD0F128:
6367 case X86::AVX512_128_SET0:
6368 case X86::AVX512_FsFLD0SH:
6369 case X86::AVX512_FsFLD0SS:
6370 case X86::AVX512_FsFLD0SD:
6371 case X86::AVX512_FsFLD0F128: {
6372 bool HasVLX = Subtarget.hasVLX();
6375 if (HasVLX ||
TRI->getEncodingValue(SrcReg) < 16)
6377 get(HasVLX ? X86::VPXORDZ128rr : X86::VXORPSrr));
6380 TRI->getMatchingSuperReg(SrcReg, X86::sub_xmm, &X86::VR512RegClass);
6387 case X86::V_SETALLONES:
6389 get(HasAVX ? X86::VPCMPEQDrr : X86::PCMPEQDrr));
6390 case X86::AVX2_SETALLONES:
6392 case X86::AVX1_SETALLONES: {
6399 case X86::AVX512_128_SETALLONES:
6400 case X86::AVX512_256_SETALLONES:
6401 case X86::AVX512_512_SETALLONES: {
6404 switch (
MI.getOpcode()) {
6405 case X86::AVX512_128_SETALLONES: {
6406 if (X86::VR128RegClass.
contains(Reg))
6409 Opc = X86::VPTERNLOGDZ128rri;
6412 case X86::AVX512_256_SETALLONES: {
6413 if (X86::VR256RegClass.
contains(Reg))
6416 Opc = X86::VPTERNLOGDZ256rri;
6419 case X86::AVX512_512_SETALLONES:
6420 Opc = X86::VPTERNLOGDZrri;
6432 case X86::AVX512_512_SEXT_MASK_32:
6433 case X86::AVX512_512_SEXT_MASK_64: {
6437 unsigned Opc = (
MI.getOpcode() == X86::AVX512_512_SEXT_MASK_64)
6438 ? X86::VPTERNLOGQZrrikz
6439 : X86::VPTERNLOGDZrrikz;
6440 MI.removeOperand(1);
6445 .
addReg(MaskReg, MaskState)
6451 case X86::VMOVAPSZ128rm_NOVLX:
6453 get(X86::VBROADCASTF32X4Zrm), X86::sub_xmm);
6454 case X86::VMOVUPSZ128rm_NOVLX:
6456 get(X86::VBROADCASTF32X4Zrm), X86::sub_xmm);
6457 case X86::VMOVAPSZ256rm_NOVLX:
6459 get(X86::VBROADCASTF64X4Zrm), X86::sub_ymm);
6460 case X86::VMOVUPSZ256rm_NOVLX:
6462 get(X86::VBROADCASTF64X4Zrm), X86::sub_ymm);
6463 case X86::VMOVAPSZ128mr_NOVLX:
6465 get(X86::VEXTRACTF32X4Zmri), X86::sub_xmm);
6466 case X86::VMOVUPSZ128mr_NOVLX:
6468 get(X86::VEXTRACTF32X4Zmri), X86::sub_xmm);
6469 case X86::VMOVAPSZ256mr_NOVLX:
6471 get(X86::VEXTRACTF64X4Zmri), X86::sub_ymm);
6472 case X86::VMOVUPSZ256mr_NOVLX:
6474 get(X86::VEXTRACTF64X4Zmri), X86::sub_ymm);
6475 case X86::MOV32ri64: {
6477 Register Reg32 = RI.getSubReg(Reg, X86::sub_32bit);
6478 MI.setDesc(
get(X86::MOV32ri));
6484 case X86::RDFLAGS32:
6485 case X86::RDFLAGS64: {
6486 unsigned Is64Bit =
MI.getOpcode() == X86::RDFLAGS64;
6490 get(Is64Bit ? X86::PUSHF64 : X86::PUSHF32))
6498 "Unexpected register in operand! Should be EFLAGS.");
6501 "Unexpected register in operand! Should be DF.");
6504 MIB->
setDesc(
get(Is64Bit ? X86::POP64r : X86::POP32r));
6508 case X86::WRFLAGS32:
6509 case X86::WRFLAGS64: {
6510 unsigned Is64Bit =
MI.getOpcode() == X86::WRFLAGS64;
6514 get(Is64Bit ? X86::PUSH64r : X86::PUSH32r))
6515 .
addReg(
MI.getOperand(0).getReg());
6517 get(Is64Bit ? X86::POPF64 : X86::POPF32));
6518 MI.eraseFromParent();
6545 case TargetOpcode::LOAD_STACK_GUARD:
6551 case X86::SHLDROT32ri:
6553 case X86::SHLDROT64ri:
6555 case X86::SHRDROT32ri:
6557 case X86::SHRDROT64ri:
6559 case X86::ADD8rr_DB:
6562 case X86::ADD16rr_DB:
6565 case X86::ADD32rr_DB:
6568 case X86::ADD64rr_DB:
6571 case X86::ADD8ri_DB:
6574 case X86::ADD16ri_DB:
6577 case X86::ADD32ri_DB:
6580 case X86::ADD64ri32_DB:
6604 bool ForLoadFold =
false) {
6606 case X86::CVTSI2SSrr:
6607 case X86::CVTSI2SSrm:
6608 case X86::CVTSI642SSrr:
6609 case X86::CVTSI642SSrm:
6610 case X86::CVTSI2SDrr:
6611 case X86::CVTSI2SDrm:
6612 case X86::CVTSI642SDrr:
6613 case X86::CVTSI642SDrm:
6616 return !ForLoadFold;
6617 case X86::CVTSD2SSrr:
6618 case X86::CVTSD2SSrm:
6619 case X86::CVTSS2SDrr:
6620 case X86::CVTSS2SDrm:
6627 case X86::RCPSSr_Int:
6628 case X86::RCPSSm_Int:
6629 case X86::ROUNDSDri:
6630 case X86::ROUNDSDmi:
6631 case X86::ROUNDSSri:
6632 case X86::ROUNDSSmi:
6635 case X86::RSQRTSSr_Int:
6636 case X86::RSQRTSSm_Int:
6639 case X86::SQRTSSr_Int:
6640 case X86::SQRTSSm_Int:
6643 case X86::SQRTSDr_Int:
6644 case X86::SQRTSDm_Int:
6646 case X86::VFCMULCPHZ128rm:
6647 case X86::VFCMULCPHZ128rmb:
6648 case X86::VFCMULCPHZ128rmbkz:
6649 case X86::VFCMULCPHZ128rmkz:
6650 case X86::VFCMULCPHZ128rr:
6651 case X86::VFCMULCPHZ128rrkz:
6652 case X86::VFCMULCPHZ256rm:
6653 case X86::VFCMULCPHZ256rmb:
6654 case X86::VFCMULCPHZ256rmbkz:
6655 case X86::VFCMULCPHZ256rmkz:
6656 case X86::VFCMULCPHZ256rr:
6657 case X86::VFCMULCPHZ256rrkz:
6658 case X86::VFCMULCPHZrm:
6659 case X86::VFCMULCPHZrmb:
6660 case X86::VFCMULCPHZrmbkz:
6661 case X86::VFCMULCPHZrmkz:
6662 case X86::VFCMULCPHZrr:
6663 case X86::VFCMULCPHZrrb:
6664 case X86::VFCMULCPHZrrbkz:
6665 case X86::VFCMULCPHZrrkz:
6666 case X86::VFMULCPHZ128rm:
6667 case X86::VFMULCPHZ128rmb:
6668 case X86::VFMULCPHZ128rmbkz:
6669 case X86::VFMULCPHZ128rmkz:
6670 case X86::VFMULCPHZ128rr:
6671 case X86::VFMULCPHZ128rrkz:
6672 case X86::VFMULCPHZ256rm:
6673 case X86::VFMULCPHZ256rmb:
6674 case X86::VFMULCPHZ256rmbkz:
6675 case X86::VFMULCPHZ256rmkz:
6676 case X86::VFMULCPHZ256rr:
6677 case X86::VFMULCPHZ256rrkz:
6678 case X86::VFMULCPHZrm:
6679 case X86::VFMULCPHZrmb:
6680 case X86::VFMULCPHZrmbkz:
6681 case X86::VFMULCPHZrmkz:
6682 case X86::VFMULCPHZrr:
6683 case X86::VFMULCPHZrrb:
6684 case X86::VFMULCPHZrrbkz:
6685 case X86::VFMULCPHZrrkz:
6686 case X86::VFCMULCSHZrm:
6687 case X86::VFCMULCSHZrmkz:
6688 case X86::VFCMULCSHZrr:
6689 case X86::VFCMULCSHZrrb:
6690 case X86::VFCMULCSHZrrbkz:
6691 case X86::VFCMULCSHZrrkz:
6692 case X86::VFMULCSHZrm:
6693 case X86::VFMULCSHZrmkz:
6694 case X86::VFMULCSHZrr:
6695 case X86::VFMULCSHZrrb:
6696 case X86::VFMULCSHZrrbkz:
6697 case X86::VFMULCSHZrrkz:
6698 return Subtarget.hasMULCFalseDeps();
6699 case X86::VPERMDYrm:
6700 case X86::VPERMDYrr:
6701 case X86::VPERMQYmi:
6702 case X86::VPERMQYri:
6703 case X86::VPERMPSYrm:
6704 case X86::VPERMPSYrr:
6705 case X86::VPERMPDYmi:
6706 case X86::VPERMPDYri:
6707 case X86::VPERMDZ256rm:
6708 case X86::VPERMDZ256rmb:
6709 case X86::VPERMDZ256rmbkz:
6710 case X86::VPERMDZ256rmkz:
6711 case X86::VPERMDZ256rr:
6712 case X86::VPERMDZ256rrkz:
6713 case X86::VPERMDZrm:
6714 case X86::VPERMDZrmb:
6715 case X86::VPERMDZrmbkz:
6716 case X86::VPERMDZrmkz:
6717 case X86::VPERMDZrr:
6718 case X86::VPERMDZrrkz:
6719 case X86::VPERMQZ256mbi:
6720 case X86::VPERMQZ256mbikz:
6721 case X86::VPERMQZ256mi:
6722 case X86::VPERMQZ256mikz:
6723 case X86::VPERMQZ256ri:
6724 case X86::VPERMQZ256rikz:
6725 case X86::VPERMQZ256rm:
6726 case X86::VPERMQZ256rmb:
6727 case X86::VPERMQZ256rmbkz:
6728 case X86::VPERMQZ256rmkz:
6729 case X86::VPERMQZ256rr:
6730 case X86::VPERMQZ256rrkz:
6731 case X86::VPERMQZmbi:
6732 case X86::VPERMQZmbikz:
6733 case X86::VPERMQZmi:
6734 case X86::VPERMQZmikz:
6735 case X86::VPERMQZri:
6736 case X86::VPERMQZrikz:
6737 case X86::VPERMQZrm:
6738 case X86::VPERMQZrmb:
6739 case X86::VPERMQZrmbkz:
6740 case X86::VPERMQZrmkz:
6741 case X86::VPERMQZrr:
6742 case X86::VPERMQZrrkz:
6743 case X86::VPERMPSZ256rm:
6744 case X86::VPERMPSZ256rmb:
6745 case X86::VPERMPSZ256rmbkz:
6746 case X86::VPERMPSZ256rmkz:
6747 case X86::VPERMPSZ256rr:
6748 case X86::VPERMPSZ256rrkz:
6749 case X86::VPERMPSZrm:
6750 case X86::VPERMPSZrmb:
6751 case X86::VPERMPSZrmbkz:
6752 case X86::VPERMPSZrmkz:
6753 case X86::VPERMPSZrr:
6754 case X86::VPERMPSZrrkz:
6755 case X86::VPERMPDZ256mbi:
6756 case X86::VPERMPDZ256mbikz:
6757 case X86::VPERMPDZ256mi:
6758 case X86::VPERMPDZ256mikz:
6759 case X86::VPERMPDZ256ri:
6760 case X86::VPERMPDZ256rikz:
6761 case X86::VPERMPDZ256rm:
6762 case X86::VPERMPDZ256rmb:
6763 case X86::VPERMPDZ256rmbkz:
6764 case X86::VPERMPDZ256rmkz:
6765 case X86::VPERMPDZ256rr:
6766 case X86::VPERMPDZ256rrkz:
6767 case X86::VPERMPDZmbi:
6768 case X86::VPERMPDZmbikz:
6769 case X86::VPERMPDZmi:
6770 case X86::VPERMPDZmikz:
6771 case X86::VPERMPDZri:
6772 case X86::VPERMPDZrikz:
6773 case X86::VPERMPDZrm:
6774 case X86::VPERMPDZrmb:
6775 case X86::VPERMPDZrmbkz:
6776 case X86::VPERMPDZrmkz:
6777 case X86::VPERMPDZrr:
6778 case X86::VPERMPDZrrkz:
6779 return Subtarget.hasPERMFalseDeps();
6780 case X86::VRANGEPDZ128rmbi:
6781 case X86::VRANGEPDZ128rmbikz:
6782 case X86::VRANGEPDZ128rmi:
6783 case X86::VRANGEPDZ128rmikz:
6784 case X86::VRANGEPDZ128rri:
6785 case X86::VRANGEPDZ128rrikz:
6786 case X86::VRANGEPDZ256rmbi:
6787 case X86::VRANGEPDZ256rmbikz:
6788 case X86::VRANGEPDZ256rmi:
6789 case X86::VRANGEPDZ256rmikz:
6790 case X86::VRANGEPDZ256rri:
6791 case X86::VRANGEPDZ256rrikz:
6792 case X86::VRANGEPDZrmbi:
6793 case X86::VRANGEPDZrmbikz:
6794 case X86::VRANGEPDZrmi:
6795 case X86::VRANGEPDZrmikz:
6796 case X86::VRANGEPDZrri:
6797 case X86::VRANGEPDZrrib:
6798 case X86::VRANGEPDZrribkz:
6799 case X86::VRANGEPDZrrikz:
6800 case X86::VRANGEPSZ128rmbi:
6801 case X86::VRANGEPSZ128rmbikz:
6802 case X86::VRANGEPSZ128rmi:
6803 case X86::VRANGEPSZ128rmikz:
6804 case X86::VRANGEPSZ128rri:
6805 case X86::VRANGEPSZ128rrikz:
6806 case X86::VRANGEPSZ256rmbi:
6807 case X86::VRANGEPSZ256rmbikz:
6808 case X86::VRANGEPSZ256rmi:
6809 case X86::VRANGEPSZ256rmikz:
6810 case X86::VRANGEPSZ256rri:
6811 case X86::VRANGEPSZ256rrikz:
6812 case X86::VRANGEPSZrmbi:
6813 case X86::VRANGEPSZrmbikz:
6814 case X86::VRANGEPSZrmi:
6815 case X86::VRANGEPSZrmikz:
6816 case X86::VRANGEPSZrri:
6817 case X86::VRANGEPSZrrib:
6818 case X86::VRANGEPSZrribkz:
6819 case X86::VRANGEPSZrrikz:
6820 case X86::VRANGESDZrmi:
6821 case X86::VRANGESDZrmikz:
6822 case X86::VRANGESDZrri:
6823 case X86::VRANGESDZrrib:
6824 case X86::VRANGESDZrribkz:
6825 case X86::VRANGESDZrrikz:
6826 case X86::VRANGESSZrmi:
6827 case X86::VRANGESSZrmikz:
6828 case X86::VRANGESSZrri:
6829 case X86::VRANGESSZrrib:
6830 case X86::VRANGESSZrribkz:
6831 case X86::VRANGESSZrrikz:
6832 return Subtarget.hasRANGEFalseDeps();
6833 case X86::VGETMANTSSZrmi:
6834 case X86::VGETMANTSSZrmikz:
6835 case X86::VGETMANTSSZrri:
6836 case X86::VGETMANTSSZrrib:
6837 case X86::VGETMANTSSZrribkz:
6838 case X86::VGETMANTSSZrrikz:
6839 case X86::VGETMANTSDZrmi:
6840 case X86::VGETMANTSDZrmikz:
6841 case X86::VGETMANTSDZrri:
6842 case X86::VGETMANTSDZrrib:
6843 case X86::VGETMANTSDZrribkz:
6844 case X86::VGETMANTSDZrrikz:
6845 case X86::VGETMANTSHZrmi:
6846 case X86::VGETMANTSHZrmikz:
6847 case X86::VGETMANTSHZrri:
6848 case X86::VGETMANTSHZrrib:
6849 case X86::VGETMANTSHZrribkz:
6850 case X86::VGETMANTSHZrrikz:
6851 case X86::VGETMANTPSZ128rmbi:
6852 case X86::VGETMANTPSZ128rmbikz:
6853 case X86::VGETMANTPSZ128rmi:
6854 case X86::VGETMANTPSZ128rmikz:
6855 case X86::VGETMANTPSZ256rmbi:
6856 case X86::VGETMANTPSZ256rmbikz:
6857 case X86::VGETMANTPSZ256rmi:
6858 case X86::VGETMANTPSZ256rmikz:
6859 case X86::VGETMANTPSZrmbi:
6860 case X86::VGETMANTPSZrmbikz:
6861 case X86::VGETMANTPSZrmi:
6862 case X86::VGETMANTPSZrmikz:
6863 case X86::VGETMANTPDZ128rmbi:
6864 case X86::VGETMANTPDZ128rmbikz:
6865 case X86::VGETMANTPDZ128rmi:
6866 case X86::VGETMANTPDZ128rmikz:
6867 case X86::VGETMANTPDZ256rmbi:
6868 case X86::VGETMANTPDZ256rmbikz:
6869 case X86::VGETMANTPDZ256rmi:
6870 case X86::VGETMANTPDZ256rmikz:
6871 case X86::VGETMANTPDZrmbi:
6872 case X86::VGETMANTPDZrmbikz:
6873 case X86::VGETMANTPDZrmi:
6874 case X86::VGETMANTPDZrmikz:
6875 return Subtarget.hasGETMANTFalseDeps();
6876 case X86::VPMULLQZ128rm:
6877 case X86::VPMULLQZ128rmb:
6878 case X86::VPMULLQZ128rmbkz:
6879 case X86::VPMULLQZ128rmkz:
6880 case X86::VPMULLQZ128rr:
6881 case X86::VPMULLQZ128rrkz:
6882 case X86::VPMULLQZ256rm:
6883 case X86::VPMULLQZ256rmb:
6884 case X86::VPMULLQZ256rmbkz:
6885 case X86::VPMULLQZ256rmkz:
6886 case X86::VPMULLQZ256rr:
6887 case X86::VPMULLQZ256rrkz:
6888 case X86::VPMULLQZrm:
6889 case X86::VPMULLQZrmb:
6890 case X86::VPMULLQZrmbkz:
6891 case X86::VPMULLQZrmkz:
6892 case X86::VPMULLQZrr:
6893 case X86::VPMULLQZrrkz:
6894 return Subtarget.hasMULLQFalseDeps();
6895 case X86::VPCOMPRESSBZ128rrkz:
6896 case X86::VPCOMPRESSBZ256rrkz:
6897 case X86::VPCOMPRESSBZrrkz:
6898 case X86::VPCOMPRESSWZ128rrkz:
6899 case X86::VPCOMPRESSWZ256rrkz:
6900 case X86::VPCOMPRESSWZrrkz:
6901 case X86::VPCOMPRESSDZ128rrkz:
6902 case X86::VPCOMPRESSDZ256rrkz:
6903 case X86::VPCOMPRESSDZrrkz:
6904 case X86::VPCOMPRESSQZ128rrkz:
6905 case X86::VPCOMPRESSQZ256rrkz:
6906 case X86::VPCOMPRESSQZrrkz:
6907 case X86::VCOMPRESSPSZ128rrkz:
6908 case X86::VCOMPRESSPSZ256rrkz:
6909 case X86::VCOMPRESSPSZrrkz:
6910 case X86::VCOMPRESSPDZ128rrkz:
6911 case X86::VCOMPRESSPDZ256rrkz:
6912 case X86::VCOMPRESSPDZrrkz:
6913 return Subtarget.hasCOMPRESSFalseDeps();
6914 case X86::VPEXPANDBZ128rmkz:
6915 case X86::VPEXPANDBZ128rrkz:
6916 case X86::VPEXPANDBZ256rmkz:
6917 case X86::VPEXPANDBZ256rrkz:
6918 case X86::VPEXPANDBZrmkz:
6919 case X86::VPEXPANDBZrrkz:
6920 case X86::VPEXPANDWZ128rmkz:
6921 case X86::VPEXPANDWZ128rrkz:
6922 case X86::VPEXPANDWZ256rmkz:
6923 case X86::VPEXPANDWZ256rrkz:
6924 case X86::VPEXPANDWZrmkz:
6925 case X86::VPEXPANDWZrrkz:
6926 case X86::VPEXPANDDZ128rmkz:
6927 case X86::VPEXPANDDZ128rrkz:
6928 case X86::VPEXPANDDZ256rmkz:
6929 case X86::VPEXPANDDZ256rrkz:
6930 case X86::VPEXPANDDZrmkz:
6931 case X86::VPEXPANDDZrrkz:
6932 case X86::VPEXPANDQZ128rmkz:
6933 case X86::VPEXPANDQZ128rrkz:
6934 case X86::VPEXPANDQZ256rmkz:
6935 case X86::VPEXPANDQZ256rrkz:
6936 case X86::VPEXPANDQZrmkz:
6937 case X86::VPEXPANDQZrrkz:
6938 case X86::VEXPANDPSZ128rmkz:
6939 case X86::VEXPANDPSZ128rrkz:
6940 case X86::VEXPANDPSZ256rmkz:
6941 case X86::VEXPANDPSZ256rrkz:
6942 case X86::VEXPANDPSZrmkz:
6943 case X86::VEXPANDPSZrrkz:
6944 case X86::VEXPANDPDZ128rmkz:
6945 case X86::VEXPANDPDZ128rrkz:
6946 case X86::VEXPANDPDZ256rmkz:
6947 case X86::VEXPANDPDZ256rrkz:
6948 case X86::VEXPANDPDZrmkz:
6949 case X86::VEXPANDPDZrrkz:
6950 return Subtarget.hasEXPANDFalseDeps();
6952 case X86::POPCNT32rm:
6953 case X86::POPCNT32rr:
6954 case X86::POPCNT64rm:
6955 case X86::POPCNT64rr:
6956 return Subtarget.hasPOPCNTFalseDeps();
6957 case X86::LZCNT32rm:
6958 case X86::LZCNT32rr:
6959 case X86::LZCNT64rm:
6960 case X86::LZCNT64rr:
6961 return Subtarget.hasLZCNTFalseDeps();
6962 case X86::TZCNT32rm:
6963 case X86::TZCNT32rr:
6964 case X86::TZCNT64rm:
6965 case X86::TZCNT64rr:
6966 return Subtarget.hasTZCNTFalseDeps();
6975 case X86::BLSMSK32rr:
6976 case X86::BLSMSK32rm:
6977 case X86::BLSMSK64rr:
6978 case X86::BLSMSK64rm:
6979 return Subtarget.hasBLSFalseDeps() && !ForLoadFold;
6996 bool HasNDDPartialWrite =
false;
6999 if (!Reg.isVirtual())
7000 HasNDDPartialWrite =
7001 X86::GR8RegClass.contains(Reg) || X86::GR16RegClass.contains(Reg);
7014 bool ReadsReg =
false;
7015 if (Reg.isVirtual())
7016 ReadsReg = (MO.
readsReg() ||
MI.readsVirtualRegister(Reg));
7018 ReadsReg =
MI.readsRegister(Reg,
TRI);
7019 if (ReadsReg != HasNDDPartialWrite)
7033 bool ForLoadFold =
false) {
7036 case X86::MMX_PUNPCKHBWrr:
7037 case X86::MMX_PUNPCKHWDrr:
7038 case X86::MMX_PUNPCKHDQrr:
7039 case X86::MMX_PUNPCKLBWrr:
7040 case X86::MMX_PUNPCKLWDrr:
7041 case X86::MMX_PUNPCKLDQrr:
7042 case X86::MOVHLPSrr:
7043 case X86::PACKSSWBrr:
7044 case X86::PACKUSWBrr:
7045 case X86::PACKSSDWrr:
7046 case X86::PACKUSDWrr:
7047 case X86::PUNPCKHBWrr:
7048 case X86::PUNPCKLBWrr:
7049 case X86::PUNPCKHWDrr:
7050 case X86::PUNPCKLWDrr:
7051 case X86::PUNPCKHDQrr:
7052 case X86::PUNPCKLDQrr:
7053 case X86::PUNPCKHQDQrr:
7054 case X86::PUNPCKLQDQrr:
7055 case X86::SHUFPDrri:
7056 case X86::SHUFPSrri:
7062 return OpNum == 2 && !ForLoadFold;
7064 case X86::VMOVLHPSrr:
7065 case X86::VMOVLHPSZrr:
7066 case X86::VPACKSSWBrr:
7067 case X86::VPACKUSWBrr:
7068 case X86::VPACKSSDWrr:
7069 case X86::VPACKUSDWrr:
7070 case X86::VPACKSSWBZ128rr:
7071 case X86::VPACKUSWBZ128rr:
7072 case X86::VPACKSSDWZ128rr:
7073 case X86::VPACKUSDWZ128rr:
7074 case X86::VPERM2F128rri:
7075 case X86::VPERM2I128rri:
7076 case X86::VSHUFF32X4Z256rri:
7077 case X86::VSHUFF32X4Zrri:
7078 case X86::VSHUFF64X2Z256rri:
7079 case X86::VSHUFF64X2Zrri:
7080 case X86::VSHUFI32X4Z256rri:
7081 case X86::VSHUFI32X4Zrri:
7082 case X86::VSHUFI64X2Z256rri:
7083 case X86::VSHUFI64X2Zrri:
7084 case X86::VPUNPCKHBWrr:
7085 case X86::VPUNPCKLBWrr:
7086 case X86::VPUNPCKHBWYrr:
7087 case X86::VPUNPCKLBWYrr:
7088 case X86::VPUNPCKHBWZ128rr:
7089 case X86::VPUNPCKLBWZ128rr:
7090 case X86::VPUNPCKHBWZ256rr:
7091 case X86::VPUNPCKLBWZ256rr:
7092 case X86::VPUNPCKHBWZrr:
7093 case X86::VPUNPCKLBWZrr:
7094 case X86::VPUNPCKHWDrr:
7095 case X86::VPUNPCKLWDrr:
7096 case X86::VPUNPCKHWDYrr:
7097 case X86::VPUNPCKLWDYrr:
7098 case X86::VPUNPCKHWDZ128rr:
7099 case X86::VPUNPCKLWDZ128rr:
7100 case X86::VPUNPCKHWDZ256rr:
7101 case X86::VPUNPCKLWDZ256rr:
7102 case X86::VPUNPCKHWDZrr:
7103 case X86::VPUNPCKLWDZrr:
7104 case X86::VPUNPCKHDQrr:
7105 case X86::VPUNPCKLDQrr:
7106 case X86::VPUNPCKHDQYrr:
7107 case X86::VPUNPCKLDQYrr:
7108 case X86::VPUNPCKHDQZ128rr:
7109 case X86::VPUNPCKLDQZ128rr:
7110 case X86::VPUNPCKHDQZ256rr:
7111 case X86::VPUNPCKLDQZ256rr:
7112 case X86::VPUNPCKHDQZrr:
7113 case X86::VPUNPCKLDQZrr:
7114 case X86::VPUNPCKHQDQrr:
7115 case X86::VPUNPCKLQDQrr:
7116 case X86::VPUNPCKHQDQYrr:
7117 case X86::VPUNPCKLQDQYrr:
7118 case X86::VPUNPCKHQDQZ128rr:
7119 case X86::VPUNPCKLQDQZ128rr:
7120 case X86::VPUNPCKHQDQZ256rr:
7121 case X86::VPUNPCKLQDQZ256rr:
7122 case X86::VPUNPCKHQDQZrr:
7123 case X86::VPUNPCKLQDQZrr:
7127 return (OpNum == 1 || OpNum == 2) && !ForLoadFold;
7129 case X86::VCVTSI2SSrr:
7130 case X86::VCVTSI2SSrm:
7131 case X86::VCVTSI2SSrr_Int:
7132 case X86::VCVTSI2SSrm_Int:
7133 case X86::VCVTSI642SSrr:
7134 case X86::VCVTSI642SSrm:
7135 case X86::VCVTSI642SSrr_Int:
7136 case X86::VCVTSI642SSrm_Int:
7137 case X86::VCVTSI2SDrr:
7138 case X86::VCVTSI2SDrm:
7139 case X86::VCVTSI2SDrr_Int:
7140 case X86::VCVTSI2SDrm_Int:
7141 case X86::VCVTSI642SDrr:
7142 case X86::VCVTSI642SDrm:
7143 case X86::VCVTSI642SDrr_Int:
7144 case X86::VCVTSI642SDrm_Int:
7146 case X86::VCVTSI2SSZrr:
7147 case X86::VCVTSI2SSZrm:
7148 case X86::VCVTSI2SSZrr_Int:
7149 case X86::VCVTSI2SSZrrb_Int:
7150 case X86::VCVTSI2SSZrm_Int:
7151 case X86::VCVTSI642SSZrr:
7152 case X86::VCVTSI642SSZrm:
7153 case X86::VCVTSI642SSZrr_Int:
7154 case X86::VCVTSI642SSZrrb_Int:
7155 case X86::VCVTSI642SSZrm_Int:
7156 case X86::VCVTSI2SDZrr:
7157 case X86::VCVTSI2SDZrm:
7158 case X86::VCVTSI2SDZrr_Int:
7159 case X86::VCVTSI2SDZrm_Int:
7160 case X86::VCVTSI642SDZrr:
7161 case X86::VCVTSI642SDZrm:
7162 case X86::VCVTSI642SDZrr_Int:
7163 case X86::VCVTSI642SDZrrb_Int:
7164 case X86::VCVTSI642SDZrm_Int:
7165 case X86::VCVTUSI2SSZrr:
7166 case X86::VCVTUSI2SSZrm:
7167 case X86::VCVTUSI2SSZrr_Int:
7168 case X86::VCVTUSI2SSZrrb_Int:
7169 case X86::VCVTUSI2SSZrm_Int:
7170 case X86::VCVTUSI642SSZrr:
7171 case X86::VCVTUSI642SSZrm:
7172 case X86::VCVTUSI642SSZrr_Int:
7173 case X86::VCVTUSI642SSZrrb_Int:
7174 case X86::VCVTUSI642SSZrm_Int:
7175 case X86::VCVTUSI2SDZrr:
7176 case X86::VCVTUSI2SDZrm:
7177 case X86::VCVTUSI2SDZrr_Int:
7178 case X86::VCVTUSI2SDZrm_Int:
7179 case X86::VCVTUSI642SDZrr:
7180 case X86::VCVTUSI642SDZrm:
7181 case X86::VCVTUSI642SDZrr_Int:
7182 case X86::VCVTUSI642SDZrrb_Int:
7183 case X86::VCVTUSI642SDZrm_Int:
7184 case X86::VCVTSI2SHZrr:
7185 case X86::VCVTSI2SHZrm:
7186 case X86::VCVTSI2SHZrr_Int:
7187 case X86::VCVTSI2SHZrrb_Int:
7188 case X86::VCVTSI2SHZrm_Int:
7189 case X86::VCVTSI642SHZrr:
7190 case X86::VCVTSI642SHZrm:
7191 case X86::VCVTSI642SHZrr_Int:
7192 case X86::VCVTSI642SHZrrb_Int:
7193 case X86::VCVTSI642SHZrm_Int:
7194 case X86::VCVTUSI2SHZrr:
7195 case X86::VCVTUSI2SHZrm:
7196 case X86::VCVTUSI2SHZrr_Int:
7197 case X86::VCVTUSI2SHZrrb_Int:
7198 case X86::VCVTUSI2SHZrm_Int:
7199 case X86::VCVTUSI642SHZrr:
7200 case X86::VCVTUSI642SHZrm:
7201 case X86::VCVTUSI642SHZrr_Int:
7202 case X86::VCVTUSI642SHZrrb_Int:
7203 case X86::VCVTUSI642SHZrm_Int:
7206 return OpNum == 1 && !ForLoadFold;
7207 case X86::VCVTSD2SSrr:
7208 case X86::VCVTSD2SSrm:
7209 case X86::VCVTSD2SSrr_Int:
7210 case X86::VCVTSD2SSrm_Int:
7211 case X86::VCVTSS2SDrr:
7212 case X86::VCVTSS2SDrm:
7213 case X86::VCVTSS2SDrr_Int:
7214 case X86::VCVTSS2SDrm_Int:
7216 case X86::VRCPSSr_Int:
7218 case X86::VRCPSSm_Int:
7219 case X86::VROUNDSDri:
7220 case X86::VROUNDSDmi:
7221 case X86::VROUNDSDri_Int:
7222 case X86::VROUNDSDmi_Int:
7223 case X86::VROUNDSSri:
7224 case X86::VROUNDSSmi:
7225 case X86::VROUNDSSri_Int:
7226 case X86::VROUNDSSmi_Int:
7227 case X86::VRSQRTSSr:
7228 case X86::VRSQRTSSr_Int:
7229 case X86::VRSQRTSSm:
7230 case X86::VRSQRTSSm_Int:
7232 case X86::VSQRTSSr_Int:
7234 case X86::VSQRTSSm_Int:
7236 case X86::VSQRTSDr_Int:
7238 case X86::VSQRTSDm_Int:
7240 case X86::VCVTSD2SSZrr:
7241 case X86::VCVTSD2SSZrr_Int:
7242 case X86::VCVTSD2SSZrrb_Int:
7243 case X86::VCVTSD2SSZrm:
7244 case X86::VCVTSD2SSZrm_Int:
7245 case X86::VCVTSS2SDZrr:
7246 case X86::VCVTSS2SDZrr_Int:
7247 case X86::VCVTSS2SDZrrb_Int:
7248 case X86::VCVTSS2SDZrm:
7249 case X86::VCVTSS2SDZrm_Int:
7250 case X86::VGETEXPSDZr:
7251 case X86::VGETEXPSDZrb:
7252 case X86::VGETEXPSDZm:
7253 case X86::VGETEXPSSZr:
7254 case X86::VGETEXPSSZrb:
7255 case X86::VGETEXPSSZm:
7256 case X86::VGETMANTSDZrri:
7257 case X86::VGETMANTSDZrrib:
7258 case X86::VGETMANTSDZrmi:
7259 case X86::VGETMANTSSZrri:
7260 case X86::VGETMANTSSZrrib:
7261 case X86::VGETMANTSSZrmi:
7262 case X86::VRNDSCALESDZrri:
7263 case X86::VRNDSCALESDZrri_Int:
7264 case X86::VRNDSCALESDZrrib_Int:
7265 case X86::VRNDSCALESDZrmi:
7266 case X86::VRNDSCALESDZrmi_Int:
7267 case X86::VRNDSCALESSZrri:
7268 case X86::VRNDSCALESSZrri_Int:
7269 case X86::VRNDSCALESSZrrib_Int:
7270 case X86::VRNDSCALESSZrmi:
7271 case X86::VRNDSCALESSZrmi_Int:
7272 case X86::VRCP14SDZrr:
7273 case X86::VRCP14SDZrm:
7274 case X86::VRCP14SSZrr:
7275 case X86::VRCP14SSZrm:
7276 case X86::VRCPSHZrr:
7277 case X86::VRCPSHZrm:
7278 case X86::VRSQRTSHZrr:
7279 case X86::VRSQRTSHZrm:
7280 case X86::VREDUCESHZrmi:
7281 case X86::VREDUCESHZrri:
7282 case X86::VREDUCESHZrrib:
7283 case X86::VGETEXPSHZr:
7284 case X86::VGETEXPSHZrb:
7285 case X86::VGETEXPSHZm:
7286 case X86::VGETMANTSHZrri:
7287 case X86::VGETMANTSHZrrib:
7288 case X86::VGETMANTSHZrmi:
7289 case X86::VRNDSCALESHZrri:
7290 case X86::VRNDSCALESHZrri_Int:
7291 case X86::VRNDSCALESHZrrib_Int:
7292 case X86::VRNDSCALESHZrmi:
7293 case X86::VRNDSCALESHZrmi_Int:
7294 case X86::VSQRTSHZr:
7295 case X86::VSQRTSHZr_Int:
7296 case X86::VSQRTSHZrb_Int:
7297 case X86::VSQRTSHZm:
7298 case X86::VSQRTSHZm_Int:
7299 case X86::VRCP28SDZr:
7300 case X86::VRCP28SDZrb:
7301 case X86::VRCP28SDZm:
7302 case X86::VRCP28SSZr:
7303 case X86::VRCP28SSZrb:
7304 case X86::VRCP28SSZm:
7305 case X86::VREDUCESSZrmi:
7306 case X86::VREDUCESSZrri:
7307 case X86::VREDUCESSZrrib:
7308 case X86::VRSQRT14SDZrr:
7309 case X86::VRSQRT14SDZrm:
7310 case X86::VRSQRT14SSZrr:
7311 case X86::VRSQRT14SSZrm:
7312 case X86::VRSQRT28SDZr:
7313 case X86::VRSQRT28SDZrb:
7314 case X86::VRSQRT28SDZm:
7315 case X86::VRSQRT28SSZr:
7316 case X86::VRSQRT28SSZrb:
7317 case X86::VRSQRT28SSZm:
7318 case X86::VSQRTSSZr:
7319 case X86::VSQRTSSZr_Int:
7320 case X86::VSQRTSSZrb_Int:
7321 case X86::VSQRTSSZm:
7322 case X86::VSQRTSSZm_Int:
7323 case X86::VSQRTSDZr:
7324 case X86::VSQRTSDZr_Int:
7325 case X86::VSQRTSDZrb_Int:
7326 case X86::VSQRTSDZm:
7327 case X86::VSQRTSDZm_Int:
7328 case X86::VCVTSD2SHZrr:
7329 case X86::VCVTSD2SHZrr_Int:
7330 case X86::VCVTSD2SHZrrb_Int:
7331 case X86::VCVTSD2SHZrm:
7332 case X86::VCVTSD2SHZrm_Int:
7333 case X86::VCVTSS2SHZrr:
7334 case X86::VCVTSS2SHZrr_Int:
7335 case X86::VCVTSS2SHZrrb_Int:
7336 case X86::VCVTSS2SHZrm:
7337 case X86::VCVTSS2SHZrm_Int:
7338 case X86::VCVTSH2SDZrr:
7339 case X86::VCVTSH2SDZrr_Int:
7340 case X86::VCVTSH2SDZrrb_Int:
7341 case X86::VCVTSH2SDZrm:
7342 case X86::VCVTSH2SDZrm_Int:
7343 case X86::VCVTSH2SSZrr:
7344 case X86::VCVTSH2SSZrr_Int:
7345 case X86::VCVTSH2SSZrrb_Int:
7346 case X86::VCVTSH2SSZrm:
7347 case X86::VCVTSH2SSZrm_Int:
7349 case X86::VMOVSSZrrk:
7350 case X86::VMOVSDZrrk:
7351 return OpNum == 3 && !ForLoadFold;
7352 case X86::VMOVSSZrrkz:
7353 case X86::VMOVSDZrrkz:
7354 return OpNum == 2 && !ForLoadFold;
7386 Register Reg =
MI.getOperand(OpNum).getReg();
7388 if (
MI.killsRegister(Reg,
TRI))
7391 if (X86::VR128RegClass.
contains(Reg)) {
7394 unsigned Opc = Subtarget.hasAVX() ? X86::VXORPSrr : X86::XORPSrr;
7398 MI.addRegisterKilled(Reg,
TRI,
true);
7399 }
else if (X86::VR256RegClass.
contains(Reg)) {
7402 Register XReg =
TRI->getSubReg(Reg, X86::sub_xmm);
7407 MI.addRegisterKilled(Reg,
TRI,
true);
7408 }
else if (X86::VR128XRegClass.
contains(Reg)) {
7410 if (!Subtarget.hasVLX())
7413 BuildMI(*
MI.getParent(),
MI,
MI.getDebugLoc(),
get(X86::VPXORDZ128rr), Reg)
7416 MI.addRegisterKilled(Reg,
TRI,
true);
7417 }
else if (X86::VR256XRegClass.
contains(Reg) ||
7418 X86::VR512RegClass.
contains(Reg)) {
7420 if (!Subtarget.hasVLX())
7424 Register XReg =
TRI->getSubReg(Reg, X86::sub_xmm);
7425 BuildMI(*
MI.getParent(),
MI,
MI.getDebugLoc(),
get(X86::VPXORDZ128rr), XReg)
7429 MI.addRegisterKilled(Reg,
TRI,
true);
7430 }
else if (X86::GR64RegClass.
contains(Reg)) {
7433 Register XReg =
TRI->getSubReg(Reg, X86::sub_32bit);
7438 MI.addRegisterKilled(Reg,
TRI,
true);
7439 }
else if (X86::GR32RegClass.
contains(Reg)) {
7443 MI.addRegisterKilled(Reg,
TRI,
true);
7444 }
else if ((X86::GR16RegClass.
contains(Reg) ||
7453 if (!
MI.definesRegister(SuperReg,
nullptr))
7459 int PtrOffset = 0) {
7460 unsigned NumAddrOps = MOs.
size();
7462 if (NumAddrOps < 4) {
7464 for (
unsigned i = 0; i != NumAddrOps; ++i)
7470 assert(MOs.
size() == 5 &&
"Unexpected memory operand list length");
7471 for (
unsigned i = 0; i != NumAddrOps; ++i) {
7473 if (i == 3 && PtrOffset != 0) {
7493 if (!
Reg.isVirtual())
7500 dbgs() <<
"WARNING: Unable to update register constraint for operand "
7501 << Idx <<
" of instruction:\n";
7515 MF.CreateMachineInstr(
TII.get(Opcode),
MI.getDebugLoc(),
true);
7520 unsigned NumOps =
MI.getDesc().getNumOperands() - 2;
7521 for (
unsigned i = 0; i !=
NumOps; ++i) {
7531 MBB->insert(InsertPt, NewMI);
7540 int PtrOffset = 0) {
7543 MF.CreateMachineInstr(
TII.get(Opcode),
MI.getDebugLoc(),
true);
7546 for (
unsigned i = 0, e =
MI.getNumOperands(); i != e; ++i) {
7549 assert(MO.
isReg() &&
"Expected to fold into reg operand!");
7563 MBB->insert(InsertPt, NewMI);
7573 MI.getDebugLoc(),
TII.get(Opcode));
7582 switch (
MI.getOpcode()) {
7583 case X86::INSERTPSrri:
7584 case X86::VINSERTPSrri:
7585 case X86::VINSERTPSZrri:
7589 unsigned Imm =
MI.getOperand(
MI.getNumOperands() - 1).getImm();
7590 unsigned ZMask =
Imm & 15;
7591 unsigned DstIdx = (
Imm >> 4) & 3;
7592 unsigned SrcIdx = (
Imm >> 6) & 3;
7596 unsigned RCSize =
TRI.getRegSizeInBits(*RC) / 8;
7597 if ((
Size == 0 ||
Size >= 16) && RCSize >= 16 &&
7598 (
MI.getOpcode() != X86::INSERTPSrri || Alignment >=
Align(4))) {
7599 int PtrOffset = SrcIdx * 4;
7600 unsigned NewImm = (DstIdx << 4) | ZMask;
7601 unsigned NewOpCode =
7602 (
MI.getOpcode() == X86::VINSERTPSZrri) ? X86::VINSERTPSZrmi
7603 : (
MI.getOpcode() == X86::VINSERTPSrri) ? X86::VINSERTPSrmi
7605 MachineInstr *NewMI =
7606 fuseInst(MF, NewOpCode, OpNum, MOs, InsertPt,
MI, *
this, PtrOffset);
7612 case X86::MOVHLPSrr:
7613 case X86::VMOVHLPSrr:
7614 case X86::VMOVHLPSZrr:
7621 unsigned RCSize =
TRI.getRegSizeInBits(*RC) / 8;
7622 if ((
Size == 0 ||
Size >= 16) && RCSize >= 16 && Alignment >=
Align(8)) {
7623 unsigned NewOpCode =
7624 (
MI.getOpcode() == X86::VMOVHLPSZrr) ? X86::VMOVLPSZ128rm
7625 : (
MI.getOpcode() == X86::VMOVHLPSrr) ? X86::VMOVLPSrm
7627 MachineInstr *NewMI =
7628 fuseInst(MF, NewOpCode, OpNum, MOs, InsertPt,
MI, *
this, 8);
7633 case X86::UNPCKLPDrr:
7640 unsigned RCSize =
TRI.getRegSizeInBits(*RC) / 8;
7641 if ((
Size == 0 ||
Size >= 16) && RCSize >= 16 && Alignment <
Align(16)) {
7642 MachineInstr *NewMI =
7643 fuseInst(MF, X86::MOVHPDrm, OpNum, MOs, InsertPt,
MI, *
this);
7650 makeM0Inst(*
this, (
Size == 4) ? X86::MOV32mi : X86::MOV64mi32, MOs,
7662 !
MI.getOperand(1).isReg())
7670 if (
MI.getOperand(1).isUndef())
7679 unsigned Idx1)
const {
7680 unsigned Idx2 = CommuteAnyOperandIndex;
7684 bool HasDef =
MI.getDesc().getNumDefs();
7686 Register Reg1 =
MI.getOperand(Idx1).getReg();
7687 Register Reg2 =
MI.getOperand(Idx2).getReg();
7688 bool Tied1 = 0 ==
MI.getDesc().getOperandConstraint(Idx1,
MCOI::TIED_TO);
7689 bool Tied2 = 0 ==
MI.getDesc().getOperandConstraint(Idx2,
MCOI::TIED_TO);
7693 if ((HasDef && Reg0 == Reg1 && Tied1) || (HasDef && Reg0 == Reg2 && Tied2))
7696 return commuteInstruction(
MI,
false, Idx1, Idx2) ? Idx2 : Idx1;
7701 dbgs() <<
"We failed to fuse operand " << Idx <<
" in " <<
MI;
7709 bool isSlowTwoMemOps = Subtarget.slowTwoMemOps();
7710 bool isSlowIndirectCall = Subtarget.slowIndirectCall();
7711 unsigned Opc =
MI.getOpcode();
7715 if ((isSlowTwoMemOps || isSlowIndirectCall) &&
7717 (
Opc == X86::CALL32r ||
Opc == X86::CALL64r ||
7718 Opc == X86::CALL64r_ImpCall))
7724 (
Opc == X86::PUSH16r ||
Opc == X86::PUSH32r ||
Opc == X86::PUSH64r))
7733 unsigned NumOps =
MI.getDesc().getNumOperands();
7734 bool IsTwoAddr =
NumOps > 1 && OpNum < 2 &&
MI.getOperand(0).isReg() &&
7735 MI.getOperand(1).isReg() &&
7736 MI.getOperand(0).getReg() ==
MI.getOperand(1).getReg();
7740 if (
Opc == X86::ADD32ri &&
7749 Opc != X86::ADD64rr)
7754 if (
MI.isCall() &&
MI.getCFIType())
7758 if (
auto *CustomMI = foldMemoryOperandCustom(MF,
MI, OpNum, MOs, InsertPt,
7769 bool NoNDDM = NonNDOpc && !Subtarget.hasNDDM();
7772 if (NoNDDM && !IsTwoAddr && !MRI.
isSSA()) {
7781 if (
MI.getOperand(0).getSubReg())
7787 if (VRM && Dst !=
MI.getOperand(1).getReg() &&
7788 (!Dst.isVirtual() || VRM->
getPhys(Dst)))
7798 unsigned Opcode =
I->DstOp;
7802 bool NarrowToMOV32rm =
false;
7806 unsigned RCSize =
TRI.getRegSizeInBits(*RC) / 8;
7814 if (Opcode != X86::MOV64rm || RCSize != 8 ||
Size != 4)
7816 if (
MI.getOperand(0).getSubReg() ||
MI.getOperand(1).getSubReg())
7818 Opcode = X86::MOV32rm;
7819 NarrowToMOV32rm =
true;
7829 :
fuseInst(MF, Opcode, OpNum, MOs, InsertPt,
MI, *
this);
7831 if (NarrowToMOV32rm) {
7842 if (NoNDDM && !IsTwoAddr) {
7844 unsigned SrcSub =
MI.getOperand(1).getSubReg();
7845 if (
MI.killsRegister(SrcReg,
nullptr) ||
7846 MI.getOperand(0).getReg() == SrcReg)
7854 get(TargetOpcode::COPY))
7856 .
addReg(SrcReg, {}, SrcSub);
7866 unsigned CommuteOpIdx2 = commuteOperandsForFold(
MI, OpNum);
7867 if (CommuteOpIdx2 == OpNum) {
7873 Alignment,
false, CopyMI);
7877 commuteInstruction(
MI,
false, OpNum, CommuteOpIdx2);
7901 for (
auto Op :
Ops) {
7906 if (
MI.getOpcode() == X86::MOV32r0 && SubReg == X86::sub_32bit)
7908 if (SubReg && (MO.
isDef() || SubReg == X86::sub_8bit_hi))
7917 if (!RI.hasStackRealignment(MF))
7919 std::min(Alignment, Subtarget.getFrameLowering()->getStackAlign());
7924 Alignment,
true, CopyMI, VRM);
7926 if (
Ops.size() == 2 &&
Ops[0] == 0 &&
Ops[1] == 1) {
7927 unsigned NewOpc = 0;
7928 unsigned RCSize = 0;
7929 unsigned Opc =
MI.getOpcode();
7936 NewOpc = X86::CMP8ri;
7940 NewOpc = X86::CMP16ri;
7944 NewOpc = X86::CMP32ri;
7948 NewOpc = X86::CMP64ri32;
7957 MI.setDesc(
get(NewOpc));
7958 MI.getOperand(1).ChangeToImmediate(0);
7959 }
else if (
Ops.size() != 1)
7987 unsigned RegSize =
TRI.getRegSizeInBits(*RC);
7989 if ((
Opc == X86::MOVSSrm ||
Opc == X86::VMOVSSrm ||
Opc == X86::VMOVSSZrm ||
7990 Opc == X86::MOVSSrm_alt ||
Opc == X86::VMOVSSrm_alt ||
7991 Opc == X86::VMOVSSZrm_alt) &&
7997 case X86::CVTSS2SDrr_Int:
7998 case X86::VCVTSS2SDrr_Int:
7999 case X86::VCVTSS2SDZrr_Int:
8000 case X86::VCVTSS2SDZrrk_Int:
8001 case X86::VCVTSS2SDZrrkz_Int:
8002 case X86::CVTSS2SIrr_Int:
8003 case X86::CVTSS2SI64rr_Int:
8004 case X86::VCVTSS2SIrr_Int:
8005 case X86::VCVTSS2SI64rr_Int:
8006 case X86::VCVTSS2SIZrr_Int:
8007 case X86::VCVTSS2SI64Zrr_Int:
8008 case X86::CVTTSS2SIrr_Int:
8009 case X86::CVTTSS2SI64rr_Int:
8010 case X86::VCVTTSS2SIrr_Int:
8011 case X86::VCVTTSS2SI64rr_Int:
8012 case X86::VCVTTSS2SIZrr_Int:
8013 case X86::VCVTTSS2SI64Zrr_Int:
8014 case X86::VCVTSS2USIZrr_Int:
8015 case X86::VCVTSS2USI64Zrr_Int:
8016 case X86::VCVTTSS2USIZrr_Int:
8017 case X86::VCVTTSS2USI64Zrr_Int:
8018 case X86::RCPSSr_Int:
8019 case X86::VRCPSSr_Int:
8020 case X86::RSQRTSSr_Int:
8021 case X86::VRSQRTSSr_Int:
8022 case X86::ROUNDSSri_Int:
8023 case X86::VROUNDSSri_Int:
8024 case X86::COMISSrr_Int:
8025 case X86::VCOMISSrr_Int:
8026 case X86::VCOMISSZrr_Int:
8027 case X86::UCOMISSrr_Int:
8028 case X86::VUCOMISSrr_Int:
8029 case X86::VUCOMISSZrr_Int:
8030 case X86::ADDSSrr_Int:
8031 case X86::VADDSSrr_Int:
8032 case X86::VADDSSZrr_Int:
8033 case X86::CMPSSrri_Int:
8034 case X86::VCMPSSrri_Int:
8035 case X86::VCMPSSZrri_Int:
8036 case X86::DIVSSrr_Int:
8037 case X86::VDIVSSrr_Int:
8038 case X86::VDIVSSZrr_Int:
8039 case X86::MAXSSrr_Int:
8040 case X86::VMAXSSrr_Int:
8041 case X86::VMAXSSZrr_Int:
8042 case X86::MINSSrr_Int:
8043 case X86::VMINSSrr_Int:
8044 case X86::VMINSSZrr_Int:
8045 case X86::MULSSrr_Int:
8046 case X86::VMULSSrr_Int:
8047 case X86::VMULSSZrr_Int:
8048 case X86::SQRTSSr_Int:
8049 case X86::VSQRTSSr_Int:
8050 case X86::VSQRTSSZr_Int:
8051 case X86::SUBSSrr_Int:
8052 case X86::VSUBSSrr_Int:
8053 case X86::VSUBSSZrr_Int:
8054 case X86::VADDSSZrrk_Int:
8055 case X86::VADDSSZrrkz_Int:
8056 case X86::VCMPSSZrrik_Int:
8057 case X86::VDIVSSZrrk_Int:
8058 case X86::VDIVSSZrrkz_Int:
8059 case X86::VMAXSSZrrk_Int:
8060 case X86::VMAXSSZrrkz_Int:
8061 case X86::VMINSSZrrk_Int:
8062 case X86::VMINSSZrrkz_Int:
8063 case X86::VMULSSZrrk_Int:
8064 case X86::VMULSSZrrkz_Int:
8065 case X86::VSQRTSSZrk_Int:
8066 case X86::VSQRTSSZrkz_Int:
8067 case X86::VSUBSSZrrk_Int:
8068 case X86::VSUBSSZrrkz_Int:
8069 case X86::VFMADDSS4rr_Int:
8070 case X86::VFNMADDSS4rr_Int:
8071 case X86::VFMSUBSS4rr_Int:
8072 case X86::VFNMSUBSS4rr_Int:
8073 case X86::VFMADD132SSr_Int:
8074 case X86::VFNMADD132SSr_Int:
8075 case X86::VFMADD213SSr_Int:
8076 case X86::VFNMADD213SSr_Int:
8077 case X86::VFMADD231SSr_Int:
8078 case X86::VFNMADD231SSr_Int:
8079 case X86::VFMSUB132SSr_Int:
8080 case X86::VFNMSUB132SSr_Int:
8081 case X86::VFMSUB213SSr_Int:
8082 case X86::VFNMSUB213SSr_Int:
8083 case X86::VFMSUB231SSr_Int:
8084 case X86::VFNMSUB231SSr_Int:
8085 case X86::VFMADD132SSZr_Int:
8086 case X86::VFNMADD132SSZr_Int:
8087 case X86::VFMADD213SSZr_Int:
8088 case X86::VFNMADD213SSZr_Int:
8089 case X86::VFMADD231SSZr_Int:
8090 case X86::VFNMADD231SSZr_Int:
8091 case X86::VFMSUB132SSZr_Int:
8092 case X86::VFNMSUB132SSZr_Int:
8093 case X86::VFMSUB213SSZr_Int:
8094 case X86::VFNMSUB213SSZr_Int:
8095 case X86::VFMSUB231SSZr_Int:
8096 case X86::VFNMSUB231SSZr_Int:
8097 case X86::VFMADD132SSZrk_Int:
8098 case X86::VFNMADD132SSZrk_Int:
8099 case X86::VFMADD213SSZrk_Int:
8100 case X86::VFNMADD213SSZrk_Int:
8101 case X86::VFMADD231SSZrk_Int:
8102 case X86::VFNMADD231SSZrk_Int:
8103 case X86::VFMSUB132SSZrk_Int:
8104 case X86::VFNMSUB132SSZrk_Int:
8105 case X86::VFMSUB213SSZrk_Int:
8106 case X86::VFNMSUB213SSZrk_Int:
8107 case X86::VFMSUB231SSZrk_Int:
8108 case X86::VFNMSUB231SSZrk_Int:
8109 case X86::VFMADD132SSZrkz_Int:
8110 case X86::VFNMADD132SSZrkz_Int:
8111 case X86::VFMADD213SSZrkz_Int:
8112 case X86::VFNMADD213SSZrkz_Int:
8113 case X86::VFMADD231SSZrkz_Int:
8114 case X86::VFNMADD231SSZrkz_Int:
8115 case X86::VFMSUB132SSZrkz_Int:
8116 case X86::VFNMSUB132SSZrkz_Int:
8117 case X86::VFMSUB213SSZrkz_Int:
8118 case X86::VFNMSUB213SSZrkz_Int:
8119 case X86::VFMSUB231SSZrkz_Int:
8120 case X86::VFNMSUB231SSZrkz_Int:
8121 case X86::VFIXUPIMMSSZrri:
8122 case X86::VFIXUPIMMSSZrrik:
8123 case X86::VFIXUPIMMSSZrrikz:
8124 case X86::VFPCLASSSSZri:
8125 case X86::VFPCLASSSSZrik:
8126 case X86::VGETEXPSSZr:
8127 case X86::VGETEXPSSZrk:
8128 case X86::VGETEXPSSZrkz:
8129 case X86::VGETMANTSSZrri:
8130 case X86::VGETMANTSSZrrik:
8131 case X86::VGETMANTSSZrrikz:
8132 case X86::VRANGESSZrri:
8133 case X86::VRANGESSZrrik:
8134 case X86::VRANGESSZrrikz:
8135 case X86::VRCP14SSZrr:
8136 case X86::VRCP14SSZrrk:
8137 case X86::VRCP14SSZrrkz:
8138 case X86::VRCP28SSZr:
8139 case X86::VRCP28SSZrk:
8140 case X86::VRCP28SSZrkz:
8141 case X86::VREDUCESSZrri:
8142 case X86::VREDUCESSZrrik:
8143 case X86::VREDUCESSZrrikz:
8144 case X86::VRNDSCALESSZrri_Int:
8145 case X86::VRNDSCALESSZrrik_Int:
8146 case X86::VRNDSCALESSZrrikz_Int:
8147 case X86::VRSQRT14SSZrr:
8148 case X86::VRSQRT14SSZrrk:
8149 case X86::VRSQRT14SSZrrkz:
8150 case X86::VRSQRT28SSZr:
8151 case X86::VRSQRT28SSZrk:
8152 case X86::VRSQRT28SSZrkz:
8153 case X86::VSCALEFSSZrr:
8154 case X86::VSCALEFSSZrrk:
8155 case X86::VSCALEFSSZrrkz:
8162 if ((
Opc == X86::MOVSDrm ||
Opc == X86::VMOVSDrm ||
Opc == X86::VMOVSDZrm ||
8163 Opc == X86::MOVSDrm_alt ||
Opc == X86::VMOVSDrm_alt ||
8164 Opc == X86::VMOVSDZrm_alt) &&
8170 case X86::CVTSD2SSrr_Int:
8171 case X86::VCVTSD2SSrr_Int:
8172 case X86::VCVTSD2SSZrr_Int:
8173 case X86::VCVTSD2SSZrrk_Int:
8174 case X86::VCVTSD2SSZrrkz_Int:
8175 case X86::CVTSD2SIrr_Int:
8176 case X86::CVTSD2SI64rr_Int:
8177 case X86::VCVTSD2SIrr_Int:
8178 case X86::VCVTSD2SI64rr_Int:
8179 case X86::VCVTSD2SIZrr_Int:
8180 case X86::VCVTSD2SI64Zrr_Int:
8181 case X86::CVTTSD2SIrr_Int:
8182 case X86::CVTTSD2SI64rr_Int:
8183 case X86::VCVTTSD2SIrr_Int:
8184 case X86::VCVTTSD2SI64rr_Int:
8185 case X86::VCVTTSD2SIZrr_Int:
8186 case X86::VCVTTSD2SI64Zrr_Int:
8187 case X86::VCVTSD2USIZrr_Int:
8188 case X86::VCVTSD2USI64Zrr_Int:
8189 case X86::VCVTTSD2USIZrr_Int:
8190 case X86::VCVTTSD2USI64Zrr_Int:
8191 case X86::ROUNDSDri_Int:
8192 case X86::VROUNDSDri_Int:
8193 case X86::COMISDrr_Int:
8194 case X86::VCOMISDrr_Int:
8195 case X86::VCOMISDZrr_Int:
8196 case X86::UCOMISDrr_Int:
8197 case X86::VUCOMISDrr_Int:
8198 case X86::VUCOMISDZrr_Int:
8199 case X86::ADDSDrr_Int:
8200 case X86::VADDSDrr_Int:
8201 case X86::VADDSDZrr_Int:
8202 case X86::CMPSDrri_Int:
8203 case X86::VCMPSDrri_Int:
8204 case X86::VCMPSDZrri_Int:
8205 case X86::DIVSDrr_Int:
8206 case X86::VDIVSDrr_Int:
8207 case X86::VDIVSDZrr_Int:
8208 case X86::MAXSDrr_Int:
8209 case X86::VMAXSDrr_Int:
8210 case X86::VMAXSDZrr_Int:
8211 case X86::MINSDrr_Int:
8212 case X86::VMINSDrr_Int:
8213 case X86::VMINSDZrr_Int:
8214 case X86::MULSDrr_Int:
8215 case X86::VMULSDrr_Int:
8216 case X86::VMULSDZrr_Int:
8217 case X86::SQRTSDr_Int:
8218 case X86::VSQRTSDr_Int:
8219 case X86::VSQRTSDZr_Int:
8220 case X86::SUBSDrr_Int:
8221 case X86::VSUBSDrr_Int:
8222 case X86::VSUBSDZrr_Int:
8223 case X86::VADDSDZrrk_Int:
8224 case X86::VADDSDZrrkz_Int:
8225 case X86::VCMPSDZrrik_Int:
8226 case X86::VDIVSDZrrk_Int:
8227 case X86::VDIVSDZrrkz_Int:
8228 case X86::VMAXSDZrrk_Int:
8229 case X86::VMAXSDZrrkz_Int:
8230 case X86::VMINSDZrrk_Int:
8231 case X86::VMINSDZrrkz_Int:
8232 case X86::VMULSDZrrk_Int:
8233 case X86::VMULSDZrrkz_Int:
8234 case X86::VSQRTSDZrk_Int:
8235 case X86::VSQRTSDZrkz_Int:
8236 case X86::VSUBSDZrrk_Int:
8237 case X86::VSUBSDZrrkz_Int:
8238 case X86::VFMADDSD4rr_Int:
8239 case X86::VFNMADDSD4rr_Int:
8240 case X86::VFMSUBSD4rr_Int:
8241 case X86::VFNMSUBSD4rr_Int:
8242 case X86::VFMADD132SDr_Int:
8243 case X86::VFNMADD132SDr_Int:
8244 case X86::VFMADD213SDr_Int:
8245 case X86::VFNMADD213SDr_Int:
8246 case X86::VFMADD231SDr_Int:
8247 case X86::VFNMADD231SDr_Int:
8248 case X86::VFMSUB132SDr_Int:
8249 case X86::VFNMSUB132SDr_Int:
8250 case X86::VFMSUB213SDr_Int:
8251 case X86::VFNMSUB213SDr_Int:
8252 case X86::VFMSUB231SDr_Int:
8253 case X86::VFNMSUB231SDr_Int:
8254 case X86::VFMADD132SDZr_Int:
8255 case X86::VFNMADD132SDZr_Int:
8256 case X86::VFMADD213SDZr_Int:
8257 case X86::VFNMADD213SDZr_Int:
8258 case X86::VFMADD231SDZr_Int:
8259 case X86::VFNMADD231SDZr_Int:
8260 case X86::VFMSUB132SDZr_Int:
8261 case X86::VFNMSUB132SDZr_Int:
8262 case X86::VFMSUB213SDZr_Int:
8263 case X86::VFNMSUB213SDZr_Int:
8264 case X86::VFMSUB231SDZr_Int:
8265 case X86::VFNMSUB231SDZr_Int:
8266 case X86::VFMADD132SDZrk_Int:
8267 case X86::VFNMADD132SDZrk_Int:
8268 case X86::VFMADD213SDZrk_Int:
8269 case X86::VFNMADD213SDZrk_Int:
8270 case X86::VFMADD231SDZrk_Int:
8271 case X86::VFNMADD231SDZrk_Int:
8272 case X86::VFMSUB132SDZrk_Int:
8273 case X86::VFNMSUB132SDZrk_Int:
8274 case X86::VFMSUB213SDZrk_Int:
8275 case X86::VFNMSUB213SDZrk_Int:
8276 case X86::VFMSUB231SDZrk_Int:
8277 case X86::VFNMSUB231SDZrk_Int:
8278 case X86::VFMADD132SDZrkz_Int:
8279 case X86::VFNMADD132SDZrkz_Int:
8280 case X86::VFMADD213SDZrkz_Int:
8281 case X86::VFNMADD213SDZrkz_Int:
8282 case X86::VFMADD231SDZrkz_Int:
8283 case X86::VFNMADD231SDZrkz_Int:
8284 case X86::VFMSUB132SDZrkz_Int:
8285 case X86::VFNMSUB132SDZrkz_Int:
8286 case X86::VFMSUB213SDZrkz_Int:
8287 case X86::VFNMSUB213SDZrkz_Int:
8288 case X86::VFMSUB231SDZrkz_Int:
8289 case X86::VFNMSUB231SDZrkz_Int:
8290 case X86::VFIXUPIMMSDZrri:
8291 case X86::VFIXUPIMMSDZrrik:
8292 case X86::VFIXUPIMMSDZrrikz:
8293 case X86::VFPCLASSSDZri:
8294 case X86::VFPCLASSSDZrik:
8295 case X86::VGETEXPSDZr:
8296 case X86::VGETEXPSDZrk:
8297 case X86::VGETEXPSDZrkz:
8298 case X86::VGETMANTSDZrri:
8299 case X86::VGETMANTSDZrrik:
8300 case X86::VGETMANTSDZrrikz:
8301 case X86::VRANGESDZrri:
8302 case X86::VRANGESDZrrik:
8303 case X86::VRANGESDZrrikz:
8304 case X86::VRCP14SDZrr:
8305 case X86::VRCP14SDZrrk:
8306 case X86::VRCP14SDZrrkz:
8307 case X86::VRCP28SDZr:
8308 case X86::VRCP28SDZrk:
8309 case X86::VRCP28SDZrkz:
8310 case X86::VREDUCESDZrri:
8311 case X86::VREDUCESDZrrik:
8312 case X86::VREDUCESDZrrikz:
8313 case X86::VRNDSCALESDZrri_Int:
8314 case X86::VRNDSCALESDZrrik_Int:
8315 case X86::VRNDSCALESDZrrikz_Int:
8316 case X86::VRSQRT14SDZrr:
8317 case X86::VRSQRT14SDZrrk:
8318 case X86::VRSQRT14SDZrrkz:
8319 case X86::VRSQRT28SDZr:
8320 case X86::VRSQRT28SDZrk:
8321 case X86::VRSQRT28SDZrkz:
8322 case X86::VSCALEFSDZrr:
8323 case X86::VSCALEFSDZrrk:
8324 case X86::VSCALEFSDZrrkz:
8331 if ((
Opc == X86::VMOVSHZrm ||
Opc == X86::VMOVSHZrm_alt) &&
RegSize > 16) {
8336 case X86::VADDSHZrr_Int:
8337 case X86::VCMPSHZrri_Int:
8338 case X86::VDIVSHZrr_Int:
8339 case X86::VMAXSHZrr_Int:
8340 case X86::VMINSHZrr_Int:
8341 case X86::VMULSHZrr_Int:
8342 case X86::VSUBSHZrr_Int:
8343 case X86::VADDSHZrrk_Int:
8344 case X86::VADDSHZrrkz_Int:
8345 case X86::VCMPSHZrrik_Int:
8346 case X86::VDIVSHZrrk_Int:
8347 case X86::VDIVSHZrrkz_Int:
8348 case X86::VMAXSHZrrk_Int:
8349 case X86::VMAXSHZrrkz_Int:
8350 case X86::VMINSHZrrk_Int:
8351 case X86::VMINSHZrrkz_Int:
8352 case X86::VMULSHZrrk_Int:
8353 case X86::VMULSHZrrkz_Int:
8354 case X86::VSUBSHZrrk_Int:
8355 case X86::VSUBSHZrrkz_Int:
8356 case X86::VFMADD132SHZr_Int:
8357 case X86::VFNMADD132SHZr_Int:
8358 case X86::VFMADD213SHZr_Int:
8359 case X86::VFNMADD213SHZr_Int:
8360 case X86::VFMADD231SHZr_Int:
8361 case X86::VFNMADD231SHZr_Int:
8362 case X86::VFMSUB132SHZr_Int:
8363 case X86::VFNMSUB132SHZr_Int:
8364 case X86::VFMSUB213SHZr_Int:
8365 case X86::VFNMSUB213SHZr_Int:
8366 case X86::VFMSUB231SHZr_Int:
8367 case X86::VFNMSUB231SHZr_Int:
8368 case X86::VFMADD132SHZrk_Int:
8369 case X86::VFNMADD132SHZrk_Int:
8370 case X86::VFMADD213SHZrk_Int:
8371 case X86::VFNMADD213SHZrk_Int:
8372 case X86::VFMADD231SHZrk_Int:
8373 case X86::VFNMADD231SHZrk_Int:
8374 case X86::VFMSUB132SHZrk_Int:
8375 case X86::VFNMSUB132SHZrk_Int:
8376 case X86::VFMSUB213SHZrk_Int:
8377 case X86::VFNMSUB213SHZrk_Int:
8378 case X86::VFMSUB231SHZrk_Int:
8379 case X86::VFNMSUB231SHZrk_Int:
8380 case X86::VFMADD132SHZrkz_Int:
8381 case X86::VFNMADD132SHZrkz_Int:
8382 case X86::VFMADD213SHZrkz_Int:
8383 case X86::VFNMADD213SHZrkz_Int:
8384 case X86::VFMADD231SHZrkz_Int:
8385 case X86::VFNMADD231SHZrkz_Int:
8386 case X86::VFMSUB132SHZrkz_Int:
8387 case X86::VFNMSUB132SHZrkz_Int:
8388 case X86::VFMSUB213SHZrkz_Int:
8389 case X86::VFNMSUB213SHZrkz_Int:
8390 case X86::VFMSUB231SHZrkz_Int:
8391 case X86::VFNMSUB231SHZrkz_Int:
8417 return RC == &X86::VK2WMRegClass || RC == &X86::VK4WMRegClass ||
8418 RC == &X86::VK8WMRegClass || RC == &X86::VK16WMRegClass ||
8419 RC == &X86::VK32WMRegClass || RC == &X86::VK64WMRegClass;
8433 bool HasSameMask =
false;
8434 for (
unsigned I = 1, E =
MI.getDesc().getNumOperands();
I < E; ++
I) {
8436 if (
Op.isReg() &&
Op.getReg() == MaskReg) {
8448 for (
auto Op :
Ops) {
8449 if (
MI.getOperand(
Op).getSubReg())
8474 uint64_t TSFlags =
MI.getDesc().TSFlags;
8486 case X86::AVX512_512_SETALLONES:
8487 Alignment =
Align(64);
8489 case X86::AVX2_SETALLONES:
8490 case X86::AVX1_SETALLONES:
8491 case X86::AVX512_256_SETALLONES:
8492 Alignment =
Align(32);
8495 case X86::V_SETALLONES:
8496 case X86::AVX512_128_SET0:
8497 case X86::FsFLD0F128:
8498 case X86::AVX512_FsFLD0F128:
8499 case X86::AVX512_128_SETALLONES:
8500 Alignment =
Align(16);
8504 case X86::AVX512_FsFLD0SD:
8505 Alignment =
Align(8);
8508 case X86::AVX512_FsFLD0SS:
8509 Alignment =
Align(4);
8512 case X86::AVX512_FsFLD0SH:
8513 Alignment =
Align(2);
8518 if (
Ops.size() == 2 &&
Ops[0] == 0 &&
Ops[1] == 1) {
8519 unsigned NewOpc = 0;
8520 switch (
MI.getOpcode()) {
8524 NewOpc = X86::CMP8ri;
8527 NewOpc = X86::CMP16ri;
8530 NewOpc = X86::CMP32ri;
8533 NewOpc = X86::CMP64ri32;
8537 MI.setDesc(
get(NewOpc));
8538 MI.getOperand(1).ChangeToImmediate(0);
8539 }
else if (
Ops.size() != 1)
8551 case X86::V_SETALLONES:
8552 case X86::AVX2_SETALLONES:
8553 case X86::AVX1_SETALLONES:
8554 case X86::AVX512_128_SET0:
8555 case X86::AVX512_128_SETALLONES:
8556 case X86::AVX512_256_SETALLONES:
8557 case X86::AVX512_512_SETALLONES:
8559 case X86::AVX512_FsFLD0SH:
8561 case X86::AVX512_FsFLD0SD:
8563 case X86::AVX512_FsFLD0SS:
8564 case X86::FsFLD0F128:
8565 case X86::AVX512_FsFLD0F128: {
8574 unsigned PICBase = 0;
8577 if (Subtarget.is64Bit()) {
8590 bool IsAllOnes =
false;
8593 case X86::AVX512_FsFLD0SS:
8597 case X86::AVX512_FsFLD0SD:
8600 case X86::FsFLD0F128:
8601 case X86::AVX512_FsFLD0F128:
8605 case X86::AVX512_FsFLD0SH:
8608 case X86::AVX512_512_SETALLONES:
8611 case X86::AVX1_SETALLONES:
8612 case X86::AVX2_SETALLONES:
8613 case X86::AVX512_256_SETALLONES:
8623 case X86::V_SETALLONES:
8624 case X86::AVX512_128_SETALLONES:
8628 case X86::AVX512_128_SET0:
8646 case X86::VPBROADCASTBZ128rm:
8647 case X86::VPBROADCASTBZ256rm:
8648 case X86::VPBROADCASTBZrm:
8649 case X86::VBROADCASTF32X2Z256rm:
8650 case X86::VBROADCASTF32X2Zrm:
8651 case X86::VBROADCASTI32X2Z128rm:
8652 case X86::VBROADCASTI32X2Z256rm:
8653 case X86::VBROADCASTI32X2Zrm:
8657#define FOLD_BROADCAST(SIZE) \
8658 MOs.append(LoadMI.operands_begin() + NumOps - X86::AddrNumOperands, \
8659 LoadMI.operands_begin() + NumOps); \
8660 return foldMemoryBroadcast(MF, MI, Ops[0], MOs, InsertPt, SIZE, \
8662 case X86::VPBROADCASTWZ128rm:
8663 case X86::VPBROADCASTWZ256rm:
8664 case X86::VPBROADCASTWZrm:
8666 case X86::VPBROADCASTDZ128rm:
8667 case X86::VPBROADCASTDZ256rm:
8668 case X86::VPBROADCASTDZrm:
8669 case X86::VBROADCASTSSZ128rm:
8670 case X86::VBROADCASTSSZ256rm:
8671 case X86::VBROADCASTSSZrm:
8673 case X86::VPBROADCASTQZ128rm:
8674 case X86::VPBROADCASTQZ256rm:
8675 case X86::VPBROADCASTQZrm:
8676 case X86::VBROADCASTSDZ256rm:
8677 case X86::VBROADCASTSDZrm:
8698 unsigned BitsSize,
bool AllowCommute)
const {
8702 ?
fuseInst(MF,
I->DstOp, OpNum, MOs, InsertPt,
MI, *
this)
8708 unsigned CommuteOpIdx2 = commuteOperandsForFold(
MI, OpNum);
8709 if (CommuteOpIdx2 == OpNum) {
8714 foldMemoryBroadcast(MF,
MI, CommuteOpIdx2, MOs, InsertPt, BitsSize,
8719 commuteInstruction(
MI,
false, OpNum, CommuteOpIdx2);
8734 if (!MMO->isStore()) {
8752 if (!MMO->isStore())
8755 if (!MMO->isLoad()) {
8773 assert((SpillSize == 64 || STI.hasVLX()) &&
8774 "Can't broadcast less than 64 bytes without AVX512VL!");
8776#define CASE_BCAST_TYPE_OPC(TYPE, OP16, OP32, OP64) \
8778 switch (SpillSize) { \
8780 llvm_unreachable("Unknown spill size"); \
8814 unsigned Opc =
I->DstOp;
8818 if (UnfoldLoad && !FoldedLoad)
8820 UnfoldLoad &= FoldedLoad;
8821 if (UnfoldStore && !FoldedStore)
8823 UnfoldStore &= FoldedStore;
8830 if (!
MI.hasOneMemOperand() && RC == &X86::VR128RegClass &&
8831 Subtarget.isUnalignedMem16Slow())
8840 for (
unsigned i = 0, e =
MI.getNumOperands(); i != e; ++i) {
8844 else if (
Op.isReg() &&
Op.isImplicit())
8860 unsigned Alignment = std::max<uint32_t>(
TRI.getSpillSize(*RC), 16);
8861 bool isAligned = !MMOs.empty() && MMOs.front()->getAlign() >= Alignment;
8905 case X86::CMP64ri32:
8916 case X86::CMP64ri32:
8917 NewOpc = X86::TEST64rr;
8920 NewOpc = X86::TEST32rr;
8923 NewOpc = X86::TEST16rr;
8926 NewOpc = X86::TEST8rr;
8940 unsigned Alignment = std::max<uint32_t>(
TRI.getSpillSize(*DstRC), 16);
8941 bool isAligned = !MMOs.empty() && MMOs.front()->getAlign() >= Alignment;
8957 if (!
N->isMachineOpcode())
8963 unsigned Opc =
I->DstOp;
8971 unsigned NumDefs =
MCID.NumDefs;
8972 std::vector<SDValue> AddrOps;
8973 std::vector<SDValue> BeforeOps;
8974 std::vector<SDValue> AfterOps;
8976 unsigned NumOps =
N->getNumOperands();
8977 for (
unsigned i = 0; i !=
NumOps - 1; ++i) {
8980 AddrOps.push_back(
Op);
8981 else if (i < Index - NumDefs)
8982 BeforeOps.push_back(
Op);
8983 else if (i > Index - NumDefs)
8984 AfterOps.push_back(
Op);
8987 AddrOps.push_back(Chain);
8992 EVT VT = *
TRI.legalclasstypes_begin(*RC);
8994 if (MMOs.empty() && RC == &X86::VR128RegClass &&
8995 Subtarget.isUnalignedMem16Slow())
9005 unsigned Alignment = std::max<uint32_t>(
TRI.getSpillSize(*RC), 16);
9006 bool isAligned = !MMOs.empty() && MMOs.front()->getAlign() >= Alignment;
9018 std::vector<EVT> VTs;
9020 if (
MCID.getNumDefs() > 0) {
9022 VTs.push_back(*
TRI.legalclasstypes_begin(*DstRC));
9024 for (
unsigned i = 0, e =
N->getNumValues(); i != e; ++i) {
9025 EVT VT =
N->getValueType(i);
9026 if (VT != MVT::Other && i >= (
unsigned)
MCID.getNumDefs())
9036 case X86::CMP64ri32:
9044 case X86::CMP64ri32:
9045 Opc = X86::TEST64rr;
9048 Opc = X86::TEST32rr;
9051 Opc = X86::TEST16rr;
9057 BeforeOps[1] = BeforeOps[0];
9066 AddrOps.push_back(
SDValue(NewNode, 0));
9067 AddrOps.push_back(Chain);
9069 if (MMOs.empty() && RC == &X86::VR128RegClass &&
9070 Subtarget.isUnalignedMem16Slow())
9075 unsigned Alignment = std::max<uint32_t>(
TRI.getSpillSize(*RC), 16);
9076 bool isAligned = !MMOs.empty() && MMOs.front()->getAlign() >= Alignment;
9079 dl, MVT::Other, AddrOps);
9092 unsigned *LoadRegIndex)
const {
9098 if (UnfoldLoad && !FoldedLoad)
9100 if (UnfoldStore && !FoldedStore)
9109 int64_t &Offset2)
const {
9113 auto IsLoadOpcode = [&](
unsigned Opcode) {
9125 case X86::MOVSSrm_alt:
9127 case X86::MOVSDrm_alt:
9128 case X86::MMX_MOVD64rm:
9129 case X86::MMX_MOVQ64rm:
9138 case X86::VMOVSSrm_alt:
9140 case X86::VMOVSDrm_alt:
9141 case X86::VMOVAPSrm:
9142 case X86::VMOVUPSrm:
9143 case X86::VMOVAPDrm:
9144 case X86::VMOVUPDrm:
9145 case X86::VMOVDQArm:
9146 case X86::VMOVDQUrm:
9147 case X86::VMOVAPSYrm:
9148 case X86::VMOVUPSYrm:
9149 case X86::VMOVAPDYrm:
9150 case X86::VMOVUPDYrm:
9151 case X86::VMOVDQAYrm:
9152 case X86::VMOVDQUYrm:
9154 case X86::VMOVSSZrm:
9155 case X86::VMOVSSZrm_alt:
9156 case X86::VMOVSDZrm:
9157 case X86::VMOVSDZrm_alt:
9158 case X86::VMOVAPSZ128rm:
9159 case X86::VMOVUPSZ128rm:
9160 case X86::VMOVAPSZ128rm_NOVLX:
9161 case X86::VMOVUPSZ128rm_NOVLX:
9162 case X86::VMOVAPDZ128rm:
9163 case X86::VMOVUPDZ128rm:
9164 case X86::VMOVDQU8Z128rm:
9165 case X86::VMOVDQU16Z128rm:
9166 case X86::VMOVDQA32Z128rm:
9167 case X86::VMOVDQU32Z128rm:
9168 case X86::VMOVDQA64Z128rm:
9169 case X86::VMOVDQU64Z128rm:
9170 case X86::VMOVAPSZ256rm:
9171 case X86::VMOVUPSZ256rm:
9172 case X86::VMOVAPSZ256rm_NOVLX:
9173 case X86::VMOVUPSZ256rm_NOVLX:
9174 case X86::VMOVAPDZ256rm:
9175 case X86::VMOVUPDZ256rm:
9176 case X86::VMOVDQU8Z256rm:
9177 case X86::VMOVDQU16Z256rm:
9178 case X86::VMOVDQA32Z256rm:
9179 case X86::VMOVDQU32Z256rm:
9180 case X86::VMOVDQA64Z256rm:
9181 case X86::VMOVDQU64Z256rm:
9182 case X86::VMOVAPSZrm:
9183 case X86::VMOVUPSZrm:
9184 case X86::VMOVAPDZrm:
9185 case X86::VMOVUPDZrm:
9186 case X86::VMOVDQU8Zrm:
9187 case X86::VMOVDQU16Zrm:
9188 case X86::VMOVDQA32Zrm:
9189 case X86::VMOVDQU32Zrm:
9190 case X86::VMOVDQA64Zrm:
9191 case X86::VMOVDQU64Zrm:
9193 case X86::KMOVBkm_EVEX:
9195 case X86::KMOVWkm_EVEX:
9197 case X86::KMOVDkm_EVEX:
9199 case X86::KMOVQkm_EVEX:
9209 auto HasSameOp = [&](
int I) {
9225 if (!Disp1 || !Disp2)
9228 Offset1 = Disp1->getSExtValue();
9229 Offset2 = Disp2->getSExtValue();
9234 int64_t Offset1, int64_t Offset2,
9235 unsigned NumLoads)
const {
9236 assert(Offset2 > Offset1);
9237 if ((Offset2 - Offset1) / 8 > 64)
9251 case X86::MMX_MOVD64rm:
9252 case X86::MMX_MOVQ64rm:
9261 if (Subtarget.is64Bit()) {
9264 }
else if (NumLoads) {
9287 unsigned Opcode =
MI.getOpcode();
9288 if (Opcode == X86::ENDBR64 || Opcode == X86::ENDBR32 ||
9289 Opcode == X86::PLDTILECFGV)
9302 assert(
Cond.size() == 1 &&
"Invalid X86 branch condition!");
9312 return !(RC == &X86::CCRRegClass || RC == &X86::DFCCRRegClass ||
9313 RC == &X86::RFP32RegClass || RC == &X86::RFP64RegClass ||
9314 RC == &X86::RFP80RegClass);
9327 return GlobalBaseReg;
9332 GlobalBaseReg = RegInfo.createVirtualRegister(
9333 Subtarget.is64Bit() ? &X86::GR64_NOSPRegClass : &X86::GR32_NOSPRegClass);
9335 return GlobalBaseReg;
9344 if (Row[domain - 1] == opcode)
9353 if (Row[domain - 1] == opcode || (domain == 3 && Row[3] == opcode))
9360 unsigned NewWidth,
unsigned *pNewMask =
nullptr) {
9361 assert(((OldWidth % NewWidth) == 0 || (NewWidth % OldWidth) == 0) &&
9362 "Illegal blend mask scale");
9363 unsigned NewMask = 0;
9365 if ((OldWidth % NewWidth) == 0) {
9366 unsigned Scale = OldWidth / NewWidth;
9367 unsigned SubMask = (1u << Scale) - 1;
9368 for (
unsigned i = 0; i != NewWidth; ++i) {
9369 unsigned Sub = (OldMask >> (i * Scale)) & SubMask;
9371 NewMask |= (1u << i);
9372 else if (
Sub != 0x0)
9376 unsigned Scale = NewWidth / OldWidth;
9377 unsigned SubMask = (1u << Scale) - 1;
9378 for (
unsigned i = 0; i != OldWidth; ++i) {
9379 if (OldMask & (1 << i)) {
9380 NewMask |= (SubMask << (i * Scale));
9386 *pNewMask = NewMask;
9391 unsigned Opcode =
MI.getOpcode();
9392 unsigned NumOperands =
MI.getDesc().getNumOperands();
9394 auto GetBlendDomains = [&](
unsigned ImmWidth,
bool Is256) {
9396 if (
MI.getOperand(NumOperands - 1).isImm()) {
9397 unsigned Imm =
MI.getOperand(NumOperands - 1).getImm();
9399 validDomains |= 0x2;
9401 validDomains |= 0x4;
9402 if (!Is256 || Subtarget.hasAVX2())
9403 validDomains |= 0x8;
9405 return validDomains;
9409 case X86::BLENDPDrmi:
9410 case X86::BLENDPDrri:
9411 case X86::VBLENDPDrmi:
9412 case X86::VBLENDPDrri:
9413 return GetBlendDomains(2,
false);
9414 case X86::VBLENDPDYrmi:
9415 case X86::VBLENDPDYrri:
9416 return GetBlendDomains(4,
true);
9417 case X86::BLENDPSrmi:
9418 case X86::BLENDPSrri:
9419 case X86::VBLENDPSrmi:
9420 case X86::VBLENDPSrri:
9421 case X86::VPBLENDDrmi:
9422 case X86::VPBLENDDrri:
9423 return GetBlendDomains(4,
false);
9424 case X86::VBLENDPSYrmi:
9425 case X86::VBLENDPSYrri:
9426 case X86::VPBLENDDYrmi:
9427 case X86::VPBLENDDYrri:
9428 return GetBlendDomains(8,
true);
9429 case X86::PBLENDWrmi:
9430 case X86::PBLENDWrri:
9431 case X86::VPBLENDWrmi:
9432 case X86::VPBLENDWrri:
9434 case X86::VPBLENDWYrmi:
9435 case X86::VPBLENDWYrri:
9436 return GetBlendDomains(8,
false);
9437 case X86::VPANDDZ128rr:
9438 case X86::VPANDDZ128rm:
9439 case X86::VPANDDZ256rr:
9440 case X86::VPANDDZ256rm:
9441 case X86::VPANDQZ128rr:
9442 case X86::VPANDQZ128rm:
9443 case X86::VPANDQZ256rr:
9444 case X86::VPANDQZ256rm:
9445 case X86::VPANDNDZ128rr:
9446 case X86::VPANDNDZ128rm:
9447 case X86::VPANDNDZ256rr:
9448 case X86::VPANDNDZ256rm:
9449 case X86::VPANDNQZ128rr:
9450 case X86::VPANDNQZ128rm:
9451 case X86::VPANDNQZ256rr:
9452 case X86::VPANDNQZ256rm:
9453 case X86::VPORDZ128rr:
9454 case X86::VPORDZ128rm:
9455 case X86::VPORDZ256rr:
9456 case X86::VPORDZ256rm:
9457 case X86::VPORQZ128rr:
9458 case X86::VPORQZ128rm:
9459 case X86::VPORQZ256rr:
9460 case X86::VPORQZ256rm:
9461 case X86::VPXORDZ128rr:
9462 case X86::VPXORDZ128rm:
9463 case X86::VPXORDZ256rr:
9464 case X86::VPXORDZ256rm:
9465 case X86::VPXORQZ128rr:
9466 case X86::VPXORQZ128rm:
9467 case X86::VPXORQZ256rr:
9468 case X86::VPXORQZ256rm:
9471 if (Subtarget.hasDQI())
9474 if (RI.getEncodingValue(
MI.getOperand(0).getReg()) >= 16)
9476 if (RI.getEncodingValue(
MI.getOperand(1).getReg()) >= 16)
9479 if (NumOperands == 3 &&
9480 RI.getEncodingValue(
MI.getOperand(2).getReg()) >= 16)
9485 case X86::MOVHLPSrr:
9492 if (
MI.getOperand(1).getReg() ==
MI.getOperand(2).getReg() &&
9493 MI.getOperand(0).getSubReg() == 0 &&
9494 MI.getOperand(1).getSubReg() == 0 &&
MI.getOperand(2).getSubReg() == 0)
9497 case X86::SHUFPDrri:
9503#include "X86ReplaceableInstrs.def"
9509 assert(dom &&
"Not an SSE instruction");
9511 unsigned Opcode =
MI.getOpcode();
9512 unsigned NumOperands =
MI.getDesc().getNumOperands();
9514 auto SetBlendDomain = [&](
unsigned ImmWidth,
bool Is256) {
9515 if (
MI.getOperand(NumOperands - 1).isImm()) {
9516 unsigned Imm =
MI.getOperand(NumOperands - 1).getImm() & 255;
9518 unsigned NewImm =
Imm;
9520 const uint16_t *table =
lookup(Opcode, dom, ReplaceableBlendInstrs);
9522 table =
lookup(Opcode, dom, ReplaceableBlendAVX2Instrs);
9526 }
else if (
Domain == 2) {
9528 }
else if (
Domain == 3) {
9529 if (Subtarget.hasAVX2()) {
9531 if ((ImmWidth / (Is256 ? 2 : 1)) != 8) {
9532 table =
lookup(Opcode, dom, ReplaceableBlendAVX2Instrs);
9536 assert(!Is256 &&
"128-bit vector expected");
9541 assert(table && table[
Domain - 1] &&
"Unknown domain op");
9543 MI.getOperand(NumOperands - 1).setImm(NewImm & 255);
9549 case X86::BLENDPDrmi:
9550 case X86::BLENDPDrri:
9551 case X86::VBLENDPDrmi:
9552 case X86::VBLENDPDrri:
9553 return SetBlendDomain(2,
false);
9554 case X86::VBLENDPDYrmi:
9555 case X86::VBLENDPDYrri:
9556 return SetBlendDomain(4,
true);
9557 case X86::BLENDPSrmi:
9558 case X86::BLENDPSrri:
9559 case X86::VBLENDPSrmi:
9560 case X86::VBLENDPSrri:
9561 case X86::VPBLENDDrmi:
9562 case X86::VPBLENDDrri:
9563 return SetBlendDomain(4,
false);
9564 case X86::VBLENDPSYrmi:
9565 case X86::VBLENDPSYrri:
9566 case X86::VPBLENDDYrmi:
9567 case X86::VPBLENDDYrri:
9568 return SetBlendDomain(8,
true);
9569 case X86::PBLENDWrmi:
9570 case X86::PBLENDWrri:
9571 case X86::VPBLENDWrmi:
9572 case X86::VPBLENDWrri:
9573 return SetBlendDomain(8,
false);
9574 case X86::VPBLENDWYrmi:
9575 case X86::VPBLENDWYrri:
9576 return SetBlendDomain(16,
true);
9577 case X86::VPANDDZ128rr:
9578 case X86::VPANDDZ128rm:
9579 case X86::VPANDDZ256rr:
9580 case X86::VPANDDZ256rm:
9581 case X86::VPANDQZ128rr:
9582 case X86::VPANDQZ128rm:
9583 case X86::VPANDQZ256rr:
9584 case X86::VPANDQZ256rm:
9585 case X86::VPANDNDZ128rr:
9586 case X86::VPANDNDZ128rm:
9587 case X86::VPANDNDZ256rr:
9588 case X86::VPANDNDZ256rm:
9589 case X86::VPANDNQZ128rr:
9590 case X86::VPANDNQZ128rm:
9591 case X86::VPANDNQZ256rr:
9592 case X86::VPANDNQZ256rm:
9593 case X86::VPORDZ128rr:
9594 case X86::VPORDZ128rm:
9595 case X86::VPORDZ256rr:
9596 case X86::VPORDZ256rm:
9597 case X86::VPORQZ128rr:
9598 case X86::VPORQZ128rm:
9599 case X86::VPORQZ256rr:
9600 case X86::VPORQZ256rm:
9601 case X86::VPXORDZ128rr:
9602 case X86::VPXORDZ128rm:
9603 case X86::VPXORDZ256rr:
9604 case X86::VPXORDZ256rm:
9605 case X86::VPXORQZ128rr:
9606 case X86::VPXORQZ128rm:
9607 case X86::VPXORQZ256rr:
9608 case X86::VPXORQZ256rm: {
9610 if (Subtarget.hasDQI())
9614 lookupAVX512(
MI.getOpcode(), dom, ReplaceableCustomAVX512LogicInstrs);
9615 assert(table &&
"Instruction not found in table?");
9618 if (
Domain == 3 && (dom == 1 || table[3] ==
MI.getOpcode()))
9623 case X86::UNPCKHPDrr:
9624 case X86::MOVHLPSrr:
9627 MI.getOperand(1).getReg() ==
MI.getOperand(2).getReg() &&
9628 MI.getOperand(0).getSubReg() == 0 &&
9629 MI.getOperand(1).getSubReg() == 0 &&
9630 MI.getOperand(2).getSubReg() == 0) {
9631 commuteInstruction(
MI,
false);
9635 if (Opcode == X86::MOVHLPSrr)
9638 case X86::SHUFPDrri: {
9640 unsigned Imm =
MI.getOperand(3).getImm();
9641 unsigned NewImm = 0x44;
9646 MI.getOperand(3).setImm(NewImm);
9647 MI.setDesc(
get(X86::SHUFPSrri));
9655std::pair<uint16_t, uint16_t>
9658 unsigned opcode =
MI.getOpcode();
9664 return std::make_pair(domain, validDomains);
9666 if (
lookup(opcode, domain, ReplaceableInstrs)) {
9668 }
else if (
lookup(opcode, domain, ReplaceableInstrsAVX2)) {
9669 validDomains = Subtarget.hasAVX2() ? 0xe : 0x6;
9670 }
else if (
lookup(opcode, domain, ReplaceableInstrsFP)) {
9672 }
else if (
lookup(opcode, domain, ReplaceableInstrsAVX2InsertExtract)) {
9675 if (!Subtarget.hasAVX2())
9676 return std::make_pair(0, 0);
9678 }
else if (
lookupAVX512(opcode, domain, ReplaceableInstrsAVX512)) {
9680 }
else if (Subtarget.hasDQI() &&
9681 lookupAVX512(opcode, domain, ReplaceableInstrsAVX512DQ)) {
9683 }
else if (Subtarget.hasDQI()) {
9685 lookupAVX512(opcode, domain, ReplaceableInstrsAVX512DQMasked)) {
9686 if (domain == 1 || (domain == 3 && table[3] == opcode))
9693 return std::make_pair(domain, validDomains);
9699 assert(dom &&
"Not an SSE instruction");
9708 "256-bit vector operations only available in AVX2");
9709 table =
lookup(
MI.getOpcode(), dom, ReplaceableInstrsAVX2);
9712 table =
lookup(
MI.getOpcode(), dom, ReplaceableInstrsFP);
9714 "Can only select PackedSingle or PackedDouble");
9717 assert(Subtarget.hasAVX2() &&
9718 "256-bit insert/extract only available in AVX2");
9719 table =
lookup(
MI.getOpcode(), dom, ReplaceableInstrsAVX2InsertExtract);
9722 assert(Subtarget.hasAVX512() &&
"Requires AVX-512");
9723 table =
lookupAVX512(
MI.getOpcode(), dom, ReplaceableInstrsAVX512);
9725 if (table &&
Domain == 3 && table[3] ==
MI.getOpcode())
9729 assert((Subtarget.hasDQI() ||
Domain >= 3) &&
"Requires AVX-512DQ");
9730 table =
lookupAVX512(
MI.getOpcode(), dom, ReplaceableInstrsAVX512DQ);
9733 if (table &&
Domain == 3 && (dom == 1 || table[3] ==
MI.getOpcode()))
9737 assert((Subtarget.hasDQI() ||
Domain >= 3) &&
"Requires AVX-512DQ");
9738 table =
lookupAVX512(
MI.getOpcode(), dom, ReplaceableInstrsAVX512DQMasked);
9739 if (table &&
Domain == 3 && (dom == 1 || table[3] ==
MI.getOpcode()))
9742 assert(table &&
"Cannot change domain");
9768 case X86::DIVSDrm_Int:
9770 case X86::DIVSDrr_Int:
9772 case X86::DIVSSrm_Int:
9774 case X86::DIVSSrr_Int:
9780 case X86::SQRTSDm_Int:
9782 case X86::SQRTSDr_Int:
9784 case X86::SQRTSSm_Int:
9786 case X86::SQRTSSr_Int:
9790 case X86::VDIVPDYrm:
9791 case X86::VDIVPDYrr:
9794 case X86::VDIVPSYrm:
9795 case X86::VDIVPSYrr:
9797 case X86::VDIVSDrm_Int:
9799 case X86::VDIVSDrr_Int:
9801 case X86::VDIVSSrm_Int:
9803 case X86::VDIVSSrr_Int:
9806 case X86::VSQRTPDYm:
9807 case X86::VSQRTPDYr:
9810 case X86::VSQRTPSYm:
9811 case X86::VSQRTPSYr:
9813 case X86::VSQRTSDm_Int:
9815 case X86::VSQRTSDr_Int:
9817 case X86::VSQRTSSm_Int:
9819 case X86::VSQRTSSr_Int:
9821 case X86::VDIVPDZ128rm:
9822 case X86::VDIVPDZ128rmb:
9823 case X86::VDIVPDZ128rmbk:
9824 case X86::VDIVPDZ128rmbkz:
9825 case X86::VDIVPDZ128rmk:
9826 case X86::VDIVPDZ128rmkz:
9827 case X86::VDIVPDZ128rr:
9828 case X86::VDIVPDZ128rrk:
9829 case X86::VDIVPDZ128rrkz:
9830 case X86::VDIVPDZ256rm:
9831 case X86::VDIVPDZ256rmb:
9832 case X86::VDIVPDZ256rmbk:
9833 case X86::VDIVPDZ256rmbkz:
9834 case X86::VDIVPDZ256rmk:
9835 case X86::VDIVPDZ256rmkz:
9836 case X86::VDIVPDZ256rr:
9837 case X86::VDIVPDZ256rrk:
9838 case X86::VDIVPDZ256rrkz:
9839 case X86::VDIVPDZrrb:
9840 case X86::VDIVPDZrrbk:
9841 case X86::VDIVPDZrrbkz:
9842 case X86::VDIVPDZrm:
9843 case X86::VDIVPDZrmb:
9844 case X86::VDIVPDZrmbk:
9845 case X86::VDIVPDZrmbkz:
9846 case X86::VDIVPDZrmk:
9847 case X86::VDIVPDZrmkz:
9848 case X86::VDIVPDZrr:
9849 case X86::VDIVPDZrrk:
9850 case X86::VDIVPDZrrkz:
9851 case X86::VDIVPSZ128rm:
9852 case X86::VDIVPSZ128rmb:
9853 case X86::VDIVPSZ128rmbk:
9854 case X86::VDIVPSZ128rmbkz:
9855 case X86::VDIVPSZ128rmk:
9856 case X86::VDIVPSZ128rmkz:
9857 case X86::VDIVPSZ128rr:
9858 case X86::VDIVPSZ128rrk:
9859 case X86::VDIVPSZ128rrkz:
9860 case X86::VDIVPSZ256rm:
9861 case X86::VDIVPSZ256rmb:
9862 case X86::VDIVPSZ256rmbk:
9863 case X86::VDIVPSZ256rmbkz:
9864 case X86::VDIVPSZ256rmk:
9865 case X86::VDIVPSZ256rmkz:
9866 case X86::VDIVPSZ256rr:
9867 case X86::VDIVPSZ256rrk:
9868 case X86::VDIVPSZ256rrkz:
9869 case X86::VDIVPSZrrb:
9870 case X86::VDIVPSZrrbk:
9871 case X86::VDIVPSZrrbkz:
9872 case X86::VDIVPSZrm:
9873 case X86::VDIVPSZrmb:
9874 case X86::VDIVPSZrmbk:
9875 case X86::VDIVPSZrmbkz:
9876 case X86::VDIVPSZrmk:
9877 case X86::VDIVPSZrmkz:
9878 case X86::VDIVPSZrr:
9879 case X86::VDIVPSZrrk:
9880 case X86::VDIVPSZrrkz:
9881 case X86::VDIVSDZrm:
9882 case X86::VDIVSDZrr:
9883 case X86::VDIVSDZrm_Int:
9884 case X86::VDIVSDZrmk_Int:
9885 case X86::VDIVSDZrmkz_Int:
9886 case X86::VDIVSDZrr_Int:
9887 case X86::VDIVSDZrrk_Int:
9888 case X86::VDIVSDZrrkz_Int:
9889 case X86::VDIVSDZrrb_Int:
9890 case X86::VDIVSDZrrbk_Int:
9891 case X86::VDIVSDZrrbkz_Int:
9892 case X86::VDIVSSZrm:
9893 case X86::VDIVSSZrr:
9894 case X86::VDIVSSZrm_Int:
9895 case X86::VDIVSSZrmk_Int:
9896 case X86::VDIVSSZrmkz_Int:
9897 case X86::VDIVSSZrr_Int:
9898 case X86::VDIVSSZrrk_Int:
9899 case X86::VDIVSSZrrkz_Int:
9900 case X86::VDIVSSZrrb_Int:
9901 case X86::VDIVSSZrrbk_Int:
9902 case X86::VDIVSSZrrbkz_Int:
9903 case X86::VSQRTPDZ128m:
9904 case X86::VSQRTPDZ128mb:
9905 case X86::VSQRTPDZ128mbk:
9906 case X86::VSQRTPDZ128mbkz:
9907 case X86::VSQRTPDZ128mk:
9908 case X86::VSQRTPDZ128mkz:
9909 case X86::VSQRTPDZ128r:
9910 case X86::VSQRTPDZ128rk:
9911 case X86::VSQRTPDZ128rkz:
9912 case X86::VSQRTPDZ256m:
9913 case X86::VSQRTPDZ256mb:
9914 case X86::VSQRTPDZ256mbk:
9915 case X86::VSQRTPDZ256mbkz:
9916 case X86::VSQRTPDZ256mk:
9917 case X86::VSQRTPDZ256mkz:
9918 case X86::VSQRTPDZ256r:
9919 case X86::VSQRTPDZ256rk:
9920 case X86::VSQRTPDZ256rkz:
9921 case X86::VSQRTPDZm:
9922 case X86::VSQRTPDZmb:
9923 case X86::VSQRTPDZmbk:
9924 case X86::VSQRTPDZmbkz:
9925 case X86::VSQRTPDZmk:
9926 case X86::VSQRTPDZmkz:
9927 case X86::VSQRTPDZr:
9928 case X86::VSQRTPDZrb:
9929 case X86::VSQRTPDZrbk:
9930 case X86::VSQRTPDZrbkz:
9931 case X86::VSQRTPDZrk:
9932 case X86::VSQRTPDZrkz:
9933 case X86::VSQRTPSZ128m:
9934 case X86::VSQRTPSZ128mb:
9935 case X86::VSQRTPSZ128mbk:
9936 case X86::VSQRTPSZ128mbkz:
9937 case X86::VSQRTPSZ128mk:
9938 case X86::VSQRTPSZ128mkz:
9939 case X86::VSQRTPSZ128r:
9940 case X86::VSQRTPSZ128rk:
9941 case X86::VSQRTPSZ128rkz:
9942 case X86::VSQRTPSZ256m:
9943 case X86::VSQRTPSZ256mb:
9944 case X86::VSQRTPSZ256mbk:
9945 case X86::VSQRTPSZ256mbkz:
9946 case X86::VSQRTPSZ256mk:
9947 case X86::VSQRTPSZ256mkz:
9948 case X86::VSQRTPSZ256r:
9949 case X86::VSQRTPSZ256rk:
9950 case X86::VSQRTPSZ256rkz:
9951 case X86::VSQRTPSZm:
9952 case X86::VSQRTPSZmb:
9953 case X86::VSQRTPSZmbk:
9954 case X86::VSQRTPSZmbkz:
9955 case X86::VSQRTPSZmk:
9956 case X86::VSQRTPSZmkz:
9957 case X86::VSQRTPSZr:
9958 case X86::VSQRTPSZrb:
9959 case X86::VSQRTPSZrbk:
9960 case X86::VSQRTPSZrbkz:
9961 case X86::VSQRTPSZrk:
9962 case X86::VSQRTPSZrkz:
9963 case X86::VSQRTSDZm:
9964 case X86::VSQRTSDZm_Int:
9965 case X86::VSQRTSDZmk_Int:
9966 case X86::VSQRTSDZmkz_Int:
9967 case X86::VSQRTSDZr:
9968 case X86::VSQRTSDZr_Int:
9969 case X86::VSQRTSDZrk_Int:
9970 case X86::VSQRTSDZrkz_Int:
9971 case X86::VSQRTSDZrb_Int:
9972 case X86::VSQRTSDZrbk_Int:
9973 case X86::VSQRTSDZrbkz_Int:
9974 case X86::VSQRTSSZm:
9975 case X86::VSQRTSSZm_Int:
9976 case X86::VSQRTSSZmk_Int:
9977 case X86::VSQRTSSZmkz_Int:
9978 case X86::VSQRTSSZr:
9979 case X86::VSQRTSSZr_Int:
9980 case X86::VSQRTSSZrk_Int:
9981 case X86::VSQRTSSZrkz_Int:
9982 case X86::VSQRTSSZrb_Int:
9983 case X86::VSQRTSSZrbk_Int:
9984 case X86::VSQRTSSZrbkz_Int:
9986 case X86::VGATHERDPDYrm:
9987 case X86::VGATHERDPDZ128rm:
9988 case X86::VGATHERDPDZ256rm:
9989 case X86::VGATHERDPDZrm:
9990 case X86::VGATHERDPDrm:
9991 case X86::VGATHERDPSYrm:
9992 case X86::VGATHERDPSZ128rm:
9993 case X86::VGATHERDPSZ256rm:
9994 case X86::VGATHERDPSZrm:
9995 case X86::VGATHERDPSrm:
9996 case X86::VGATHERPF0DPDm:
9997 case X86::VGATHERPF0DPSm:
9998 case X86::VGATHERPF0QPDm:
9999 case X86::VGATHERPF0QPSm:
10000 case X86::VGATHERPF1DPDm:
10001 case X86::VGATHERPF1DPSm:
10002 case X86::VGATHERPF1QPDm:
10003 case X86::VGATHERPF1QPSm:
10004 case X86::VGATHERQPDYrm:
10005 case X86::VGATHERQPDZ128rm:
10006 case X86::VGATHERQPDZ256rm:
10007 case X86::VGATHERQPDZrm:
10008 case X86::VGATHERQPDrm:
10009 case X86::VGATHERQPSYrm:
10010 case X86::VGATHERQPSZ128rm:
10011 case X86::VGATHERQPSZ256rm:
10012 case X86::VGATHERQPSZrm:
10013 case X86::VGATHERQPSrm:
10014 case X86::VPGATHERDDYrm:
10015 case X86::VPGATHERDDZ128rm:
10016 case X86::VPGATHERDDZ256rm:
10017 case X86::VPGATHERDDZrm:
10018 case X86::VPGATHERDDrm:
10019 case X86::VPGATHERDQYrm:
10020 case X86::VPGATHERDQZ128rm:
10021 case X86::VPGATHERDQZ256rm:
10022 case X86::VPGATHERDQZrm:
10023 case X86::VPGATHERDQrm:
10024 case X86::VPGATHERQDYrm:
10025 case X86::VPGATHERQDZ128rm:
10026 case X86::VPGATHERQDZ256rm:
10027 case X86::VPGATHERQDZrm:
10028 case X86::VPGATHERQDrm:
10029 case X86::VPGATHERQQYrm:
10030 case X86::VPGATHERQQZ128rm:
10031 case X86::VPGATHERQQZ256rm:
10032 case X86::VPGATHERQQZrm:
10033 case X86::VPGATHERQQrm:
10034 case X86::VSCATTERDPDZ128mr:
10035 case X86::VSCATTERDPDZ256mr:
10036 case X86::VSCATTERDPDZmr:
10037 case X86::VSCATTERDPSZ128mr:
10038 case X86::VSCATTERDPSZ256mr:
10039 case X86::VSCATTERDPSZmr:
10040 case X86::VSCATTERPF0DPDm:
10041 case X86::VSCATTERPF0DPSm:
10042 case X86::VSCATTERPF0QPDm:
10043 case X86::VSCATTERPF0QPSm:
10044 case X86::VSCATTERPF1DPDm:
10045 case X86::VSCATTERPF1DPSm:
10046 case X86::VSCATTERPF1QPDm:
10047 case X86::VSCATTERPF1QPSm:
10048 case X86::VSCATTERQPDZ128mr:
10049 case X86::VSCATTERQPDZ256mr:
10050 case X86::VSCATTERQPDZmr:
10051 case X86::VSCATTERQPSZ128mr:
10052 case X86::VSCATTERQPSZ256mr:
10053 case X86::VSCATTERQPSZmr:
10054 case X86::VPSCATTERDDZ128mr:
10055 case X86::VPSCATTERDDZ256mr:
10056 case X86::VPSCATTERDDZmr:
10057 case X86::VPSCATTERDQZ128mr:
10058 case X86::VPSCATTERDQZ256mr:
10059 case X86::VPSCATTERDQZmr:
10060 case X86::VPSCATTERQDZ128mr:
10061 case X86::VPSCATTERQDZ256mr:
10062 case X86::VPSCATTERQDZmr:
10063 case X86::VPSCATTERQQZ128mr:
10064 case X86::VPSCATTERQQZ256mr:
10065 case X86::VPSCATTERQQZmr:
10075 unsigned UseIdx)
const {
10082 Inst.
getNumDefs() <= 2 &&
"Reassociation needs binary operators");
10092 assert((Inst.
getNumDefs() == 1 || FlagDef) &&
"Implicit def isn't flags?");
10093 if (FlagDef && !FlagDef->
isDead())
10104 bool Invert)
const {
10140 case X86::PMULLWrr:
10141 case X86::PMULLDrr:
10142 case X86::PMAXSBrr:
10143 case X86::PMAXSDrr:
10144 case X86::PMAXSWrr:
10145 case X86::PMAXUBrr:
10146 case X86::PMAXUDrr:
10147 case X86::PMAXUWrr:
10148 case X86::PMINSBrr:
10149 case X86::PMINSDrr:
10150 case X86::PMINSWrr:
10151 case X86::PMINUBrr:
10152 case X86::PMINUDrr:
10153 case X86::PMINUWrr:
10155 case X86::VPANDYrr:
10156 case X86::VPANDDZ128rr:
10157 case X86::VPANDDZ256rr:
10158 case X86::VPANDDZrr:
10159 case X86::VPANDQZ128rr:
10160 case X86::VPANDQZ256rr:
10161 case X86::VPANDQZrr:
10164 case X86::VPORDZ128rr:
10165 case X86::VPORDZ256rr:
10166 case X86::VPORDZrr:
10167 case X86::VPORQZ128rr:
10168 case X86::VPORQZ256rr:
10169 case X86::VPORQZrr:
10171 case X86::VPXORYrr:
10172 case X86::VPXORDZ128rr:
10173 case X86::VPXORDZ256rr:
10174 case X86::VPXORDZrr:
10175 case X86::VPXORQZ128rr:
10176 case X86::VPXORQZ256rr:
10177 case X86::VPXORQZrr:
10178 case X86::VANDPDrr:
10179 case X86::VANDPSrr:
10180 case X86::VANDPDYrr:
10181 case X86::VANDPSYrr:
10182 case X86::VANDPDZ128rr:
10183 case X86::VANDPSZ128rr:
10184 case X86::VANDPDZ256rr:
10185 case X86::VANDPSZ256rr:
10186 case X86::VANDPDZrr:
10187 case X86::VANDPSZrr:
10190 case X86::VORPDYrr:
10191 case X86::VORPSYrr:
10192 case X86::VORPDZ128rr:
10193 case X86::VORPSZ128rr:
10194 case X86::VORPDZ256rr:
10195 case X86::VORPSZ256rr:
10196 case X86::VORPDZrr:
10197 case X86::VORPSZrr:
10198 case X86::VXORPDrr:
10199 case X86::VXORPSrr:
10200 case X86::VXORPDYrr:
10201 case X86::VXORPSYrr:
10202 case X86::VXORPDZ128rr:
10203 case X86::VXORPSZ128rr:
10204 case X86::VXORPDZ256rr:
10205 case X86::VXORPSZ256rr:
10206 case X86::VXORPDZrr:
10207 case X86::VXORPSZrr:
10224 case X86::VPADDBrr:
10225 case X86::VPADDWrr:
10226 case X86::VPADDDrr:
10227 case X86::VPADDQrr:
10228 case X86::VPADDBYrr:
10229 case X86::VPADDWYrr:
10230 case X86::VPADDDYrr:
10231 case X86::VPADDQYrr:
10232 case X86::VPADDBZ128rr:
10233 case X86::VPADDWZ128rr:
10234 case X86::VPADDDZ128rr:
10235 case X86::VPADDQZ128rr:
10236 case X86::VPADDBZ256rr:
10237 case X86::VPADDWZ256rr:
10238 case X86::VPADDDZ256rr:
10239 case X86::VPADDQZ256rr:
10240 case X86::VPADDBZrr:
10241 case X86::VPADDWZrr:
10242 case X86::VPADDDZrr:
10243 case X86::VPADDQZrr:
10244 case X86::VPMULLWrr:
10245 case X86::VPMULLWYrr:
10246 case X86::VPMULLWZ128rr:
10247 case X86::VPMULLWZ256rr:
10248 case X86::VPMULLWZrr:
10249 case X86::VPMULLDrr:
10250 case X86::VPMULLDYrr:
10251 case X86::VPMULLDZ128rr:
10252 case X86::VPMULLDZ256rr:
10253 case X86::VPMULLDZrr:
10254 case X86::VPMULLQZ128rr:
10255 case X86::VPMULLQZ256rr:
10256 case X86::VPMULLQZrr:
10257 case X86::VPMAXSBrr:
10258 case X86::VPMAXSBYrr:
10259 case X86::VPMAXSBZ128rr:
10260 case X86::VPMAXSBZ256rr:
10261 case X86::VPMAXSBZrr:
10262 case X86::VPMAXSDrr:
10263 case X86::VPMAXSDYrr:
10264 case X86::VPMAXSDZ128rr:
10265 case X86::VPMAXSDZ256rr:
10266 case X86::VPMAXSDZrr:
10267 case X86::VPMAXSQZ128rr:
10268 case X86::VPMAXSQZ256rr:
10269 case X86::VPMAXSQZrr:
10270 case X86::VPMAXSWrr:
10271 case X86::VPMAXSWYrr:
10272 case X86::VPMAXSWZ128rr:
10273 case X86::VPMAXSWZ256rr:
10274 case X86::VPMAXSWZrr:
10275 case X86::VPMAXUBrr:
10276 case X86::VPMAXUBYrr:
10277 case X86::VPMAXUBZ128rr:
10278 case X86::VPMAXUBZ256rr:
10279 case X86::VPMAXUBZrr:
10280 case X86::VPMAXUDrr:
10281 case X86::VPMAXUDYrr:
10282 case X86::VPMAXUDZ128rr:
10283 case X86::VPMAXUDZ256rr:
10284 case X86::VPMAXUDZrr:
10285 case X86::VPMAXUQZ128rr:
10286 case X86::VPMAXUQZ256rr:
10287 case X86::VPMAXUQZrr:
10288 case X86::VPMAXUWrr:
10289 case X86::VPMAXUWYrr:
10290 case X86::VPMAXUWZ128rr:
10291 case X86::VPMAXUWZ256rr:
10292 case X86::VPMAXUWZrr:
10293 case X86::VPMINSBrr:
10294 case X86::VPMINSBYrr:
10295 case X86::VPMINSBZ128rr:
10296 case X86::VPMINSBZ256rr:
10297 case X86::VPMINSBZrr:
10298 case X86::VPMINSDrr:
10299 case X86::VPMINSDYrr:
10300 case X86::VPMINSDZ128rr:
10301 case X86::VPMINSDZ256rr:
10302 case X86::VPMINSDZrr:
10303 case X86::VPMINSQZ128rr:
10304 case X86::VPMINSQZ256rr:
10305 case X86::VPMINSQZrr:
10306 case X86::VPMINSWrr:
10307 case X86::VPMINSWYrr:
10308 case X86::VPMINSWZ128rr:
10309 case X86::VPMINSWZ256rr:
10310 case X86::VPMINSWZrr:
10311 case X86::VPMINUBrr:
10312 case X86::VPMINUBYrr:
10313 case X86::VPMINUBZ128rr:
10314 case X86::VPMINUBZ256rr:
10315 case X86::VPMINUBZrr:
10316 case X86::VPMINUDrr:
10317 case X86::VPMINUDYrr:
10318 case X86::VPMINUDZ128rr:
10319 case X86::VPMINUDZ256rr:
10320 case X86::VPMINUDZrr:
10321 case X86::VPMINUQZ128rr:
10322 case X86::VPMINUQZ256rr:
10323 case X86::VPMINUQZrr:
10324 case X86::VPMINUWrr:
10325 case X86::VPMINUWYrr:
10326 case X86::VPMINUWZ128rr:
10327 case X86::VPMINUWZ256rr:
10328 case X86::VPMINUWZrr:
10332 case X86::MAXCPDrr:
10333 case X86::MAXCPSrr:
10334 case X86::MAXCSDrr:
10335 case X86::MAXCSSrr:
10336 case X86::MINCPDrr:
10337 case X86::MINCPSrr:
10338 case X86::MINCSDrr:
10339 case X86::MINCSSrr:
10340 case X86::VMAXCPDrr:
10341 case X86::VMAXCPSrr:
10342 case X86::VMAXCPDYrr:
10343 case X86::VMAXCPSYrr:
10344 case X86::VMAXCPDZ128rr:
10345 case X86::VMAXCPSZ128rr:
10346 case X86::VMAXCPDZ256rr:
10347 case X86::VMAXCPSZ256rr:
10348 case X86::VMAXCPDZrr:
10349 case X86::VMAXCPSZrr:
10350 case X86::VMAXCSDrr:
10351 case X86::VMAXCSSrr:
10352 case X86::VMAXCSDZrr:
10353 case X86::VMAXCSSZrr:
10354 case X86::VMINCPDrr:
10355 case X86::VMINCPSrr:
10356 case X86::VMINCPDYrr:
10357 case X86::VMINCPSYrr:
10358 case X86::VMINCPDZ128rr:
10359 case X86::VMINCPSZ128rr:
10360 case X86::VMINCPDZ256rr:
10361 case X86::VMINCPSZ256rr:
10362 case X86::VMINCPDZrr:
10363 case X86::VMINCPSZrr:
10364 case X86::VMINCSDrr:
10365 case X86::VMINCSSrr:
10366 case X86::VMINCSDZrr:
10367 case X86::VMINCSSZrr:
10368 case X86::VMAXCPHZ128rr:
10369 case X86::VMAXCPHZ256rr:
10370 case X86::VMAXCPHZrr:
10371 case X86::VMAXCSHZrr:
10372 case X86::VMINCPHZ128rr:
10373 case X86::VMINCPHZ256rr:
10374 case X86::VMINCPHZrr:
10375 case X86::VMINCSHZrr:
10385 case X86::VADDPDrr:
10386 case X86::VADDPSrr:
10387 case X86::VADDPDYrr:
10388 case X86::VADDPSYrr:
10389 case X86::VADDPDZ128rr:
10390 case X86::VADDPSZ128rr:
10391 case X86::VADDPDZ256rr:
10392 case X86::VADDPSZ256rr:
10393 case X86::VADDPDZrr:
10394 case X86::VADDPSZrr:
10395 case X86::VADDSDrr:
10396 case X86::VADDSSrr:
10397 case X86::VADDSDZrr:
10398 case X86::VADDSSZrr:
10399 case X86::VMULPDrr:
10400 case X86::VMULPSrr:
10401 case X86::VMULPDYrr:
10402 case X86::VMULPSYrr:
10403 case X86::VMULPDZ128rr:
10404 case X86::VMULPSZ128rr:
10405 case X86::VMULPDZ256rr:
10406 case X86::VMULPSZ256rr:
10407 case X86::VMULPDZrr:
10408 case X86::VMULPSZrr:
10409 case X86::VMULSDrr:
10410 case X86::VMULSSrr:
10411 case X86::VMULSDZrr:
10412 case X86::VMULSSZrr:
10413 case X86::VADDPHZ128rr:
10414 case X86::VADDPHZ256rr:
10415 case X86::VADDPHZrr:
10416 case X86::VADDSHZrr:
10417 case X86::VMULPHZ128rr:
10418 case X86::VMULPHZ256rr:
10419 case X86::VMULPHZrr:
10420 case X86::VMULSHZrr:
10431static std::optional<ParamLoadedValue>
10434 Register DestReg =
MI.getOperand(0).getReg();
10435 Register SrcReg =
MI.getOperand(1).getReg();
10440 if (DestReg == DescribedReg)
10445 if (
unsigned SubRegIdx =
TRI->getSubRegIndex(DestReg, DescribedReg)) {
10446 Register SrcSubReg =
TRI->getSubReg(SrcReg, SubRegIdx);
10456 if (
MI.getOpcode() == X86::MOV8rr ||
MI.getOpcode() == X86::MOV16rr ||
10457 !
TRI->isSuperRegister(DestReg, DescribedReg))
10458 return std::nullopt;
10460 assert(
MI.getOpcode() == X86::MOV32rr &&
"Unexpected super-register case");
10464std::optional<ParamLoadedValue>
10471 switch (
MI.getOpcode()) {
10474 case X86::LEA64_32r: {
10476 if (!
TRI->isSuperRegisterEq(
MI.getOperand(0).getReg(), Reg))
10477 return std::nullopt;