264 if (Opcode == Instruction::Mul && Ty->isVectorTy() &&
265 Ty->getPrimitiveSizeInBits() <= 64 && Ty->getScalarSizeInBits() == 8) {
280 int ISD = TLI->InstructionOpcodeToISD(Opcode);
283 if (
ISD ==
ISD::MUL && Args.size() == 2 && LT.second.isVector() &&
284 (LT.second.getScalarType() == MVT::i32 ||
285 LT.second.getScalarType() == MVT::i64)) {
287 bool Op1Signed =
false, Op2Signed =
false;
290 unsigned OpMinSize = std::max(Op1MinSize, Op2MinSize);
291 bool SignedMode = Op1Signed || Op2Signed;
296 if (OpMinSize <= 15 && !ST->isPMADDWDSlow() &&
297 LT.second.getScalarType() == MVT::i32) {
303 (Op1MinSize == 15 || (Op1MinSize < 15 && !ST->hasSSE41()));
305 (Op2MinSize == 15 || (Op2MinSize < 15 && !ST->hasSSE41()));
307 bool IsZeroExtended = !Op1Signed || !Op2Signed;
308 bool IsConstant = Op1Constant || Op2Constant;
309 bool IsSext = Op1Sext || Op2Sext;
310 if (IsConstant || IsZeroExtended || IsSext)
318 if (ST->useSLMArithCosts() && LT.second == MVT::v4i32) {
321 if (!SignedMode && OpMinSize <= 8)
325 if (!SignedMode && OpMinSize <= 16)
332 if (!SignedMode && OpMinSize <= 32 && LT.second.getScalarType() == MVT::i64)
333 ISD = X86ISD::PMULUDQ;
390 constexpr unsigned MaxUses = 64;
392 ISD ==
ISD::SREM ? Instruction::SDiv : Instruction::UDiv;
399 return match(U, m_BinOp(DivOpcode, m_Specific(X), m_Specific(Y))) &&
400 cast<Instruction>(U)->getParent() == CtxI->getParent();
417 return LT.first *
Cost;
421 {
ISD::SHL, MVT::v16i8, { 1, 6, 1, 2 } },
422 {
ISD::SRL, MVT::v16i8, { 1, 6, 1, 2 } },
423 {
ISD::SRA, MVT::v16i8, { 1, 6, 1, 2 } },
424 {
ISD::SHL, MVT::v32i8, { 1, 6, 1, 2 } },
425 {
ISD::SRL, MVT::v32i8, { 1, 6, 1, 2 } },
426 {
ISD::SRA, MVT::v32i8, { 1, 6, 1, 2 } },
427 {
ISD::SHL, MVT::v64i8, { 1, 6, 1, 2 } },
428 {
ISD::SRL, MVT::v64i8, { 1, 6, 1, 2 } },
429 {
ISD::SRA, MVT::v64i8, { 1, 6, 1, 2 } },
433 if (
const auto *Entry =
435 if (
auto KindCost = Entry->Cost[CostKind])
436 return LT.first * *KindCost;
439 {
ISD::SHL, MVT::v16i8, { 1, 7, 2, 3 } },
440 {
ISD::SRL, MVT::v16i8, { 1, 7, 2, 3 } },
441 {
ISD::SRA, MVT::v16i8, { 1, 8, 4, 5 } },
442 {
ISD::SHL, MVT::v32i8, { 1, 8, 2, 3 } },
443 {
ISD::SRL, MVT::v32i8, { 1, 8, 2, 3 } },
444 {
ISD::SRA, MVT::v32i8, { 1, 9, 4, 5 } },
445 {
ISD::SHL, MVT::v64i8, { 1, 8, 2, 3 } },
446 {
ISD::SRL, MVT::v64i8, { 1, 8, 2, 3 } },
447 {
ISD::SRA, MVT::v64i8, { 1, 9, 4, 6 } },
449 {
ISD::SHL, MVT::v16i16, { 1, 1, 1, 1 } },
450 {
ISD::SRL, MVT::v16i16, { 1, 1, 1, 1 } },
451 {
ISD::SRA, MVT::v16i16, { 1, 1, 1, 1 } },
452 {
ISD::SHL, MVT::v32i16, { 1, 1, 1, 1 } },
453 {
ISD::SRL, MVT::v32i16, { 1, 1, 1, 1 } },
454 {
ISD::SRA, MVT::v32i16, { 1, 1, 1, 1 } },
458 if (
const auto *Entry =
460 if (
auto KindCost = Entry->Cost[CostKind])
461 return LT.first * *KindCost;
476 if (
const auto *Entry =
478 if (
auto KindCost = Entry->Cost[CostKind])
479 return LT.first * *KindCost;
482 {
ISD::SHL, MVT::v64i8, { 2, 12, 5, 6 } },
483 {
ISD::SRL, MVT::v64i8, { 2, 12, 5, 6 } },
484 {
ISD::SRA, MVT::v64i8, { 3, 10, 12, 12 } },
486 {
ISD::SHL, MVT::v16i16, { 2, 7, 4, 4 } },
487 {
ISD::SRL, MVT::v16i16, { 2, 7, 4, 4 } },
488 {
ISD::SRA, MVT::v16i16, { 2, 7, 4, 4 } },
490 {
ISD::SHL, MVT::v8i32, { 1, 1, 1, 1 } },
491 {
ISD::SRL, MVT::v8i32, { 1, 1, 1, 1 } },
492 {
ISD::SRA, MVT::v8i32, { 1, 1, 1, 1 } },
493 {
ISD::SHL, MVT::v16i32, { 1, 1, 1, 1 } },
494 {
ISD::SRL, MVT::v16i32, { 1, 1, 1, 1 } },
495 {
ISD::SRA, MVT::v16i32, { 1, 1, 1, 1 } },
497 {
ISD::SRA, MVT::v2i64, { 1, 1, 1, 1 } },
498 {
ISD::SHL, MVT::v4i64, { 1, 1, 1, 1 } },
499 {
ISD::SRL, MVT::v4i64, { 1, 1, 1, 1 } },
500 {
ISD::SRA, MVT::v4i64, { 1, 1, 1, 1 } },
501 {
ISD::SHL, MVT::v8i64, { 1, 1, 1, 1 } },
502 {
ISD::SRL, MVT::v8i64, { 1, 1, 1, 1 } },
503 {
ISD::SRA, MVT::v8i64, { 1, 1, 1, 1 } },
515 if (
const auto *Entry =
517 if (
auto KindCost = Entry->Cost[CostKind])
518 return LT.first * *KindCost;
521 {
ISD::SHL, MVT::v16i8, { 1, 8, 2, 3 } },
522 {
ISD::SRL, MVT::v16i8, { 1, 8, 2, 3 } },
523 {
ISD::SRA, MVT::v16i8, { 2, 10, 5, 6 } },
524 {
ISD::SHL, MVT::v32i8, { 2, 8, 2, 4 } },
525 {
ISD::SRL, MVT::v32i8, { 2, 8, 2, 4 } },
526 {
ISD::SRA, MVT::v32i8, { 3, 10, 5, 9 } },
528 {
ISD::SHL, MVT::v8i16, { 1, 1, 1, 1 } },
529 {
ISD::SRL, MVT::v8i16, { 1, 1, 1, 1 } },
530 {
ISD::SRA, MVT::v8i16, { 1, 1, 1, 1 } },
531 {
ISD::SHL, MVT::v16i16,{ 2, 2, 1, 2 } },
532 {
ISD::SRL, MVT::v16i16,{ 2, 2, 1, 2 } },
533 {
ISD::SRA, MVT::v16i16,{ 2, 2, 1, 2 } },
535 {
ISD::SHL, MVT::v4i32, { 1, 1, 1, 1 } },
536 {
ISD::SRL, MVT::v4i32, { 1, 1, 1, 1 } },
537 {
ISD::SRA, MVT::v4i32, { 1, 1, 1, 1 } },
538 {
ISD::SHL, MVT::v8i32, { 2, 2, 1, 2 } },
539 {
ISD::SRL, MVT::v8i32, { 2, 2, 1, 2 } },
540 {
ISD::SRA, MVT::v8i32, { 2, 2, 1, 2 } },
542 {
ISD::SHL, MVT::v2i64, { 1, 1, 1, 1 } },
543 {
ISD::SRL, MVT::v2i64, { 1, 1, 1, 1 } },
544 {
ISD::SRA, MVT::v2i64, { 2, 3, 3, 3 } },
545 {
ISD::SHL, MVT::v4i64, { 2, 2, 1, 2 } },
546 {
ISD::SRL, MVT::v4i64, { 2, 2, 1, 2 } },
547 {
ISD::SRA, MVT::v4i64, { 4, 4, 3, 6 } },
559 if (
const auto *Entry =
561 if (
auto KindCost = Entry->Cost[CostKind])
562 return LT.first * *KindCost;
565 {
ISD::SHL, MVT::v16i8, { 2, 7, 2, 3 } },
566 {
ISD::SRL, MVT::v16i8, { 2, 7, 2, 3 } },
567 {
ISD::SRA, MVT::v16i8, { 3, 9, 5, 6 } },
568 {
ISD::SHL, MVT::v32i8, { 4, 7, 7, 8 } },
569 {
ISD::SRL, MVT::v32i8, { 4, 7, 7, 8 } },
570 {
ISD::SRA, MVT::v32i8, { 7, 7, 12, 13 } },
572 {
ISD::SHL, MVT::v8i16, { 1, 2, 1, 1 } },
573 {
ISD::SRL, MVT::v8i16, { 1, 2, 1, 1 } },
574 {
ISD::SRA, MVT::v8i16, { 1, 2, 1, 1 } },
575 {
ISD::SHL, MVT::v16i16,{ 3, 6, 4, 5 } },
576 {
ISD::SRL, MVT::v16i16,{ 3, 6, 4, 5 } },
577 {
ISD::SRA, MVT::v16i16,{ 3, 6, 4, 5 } },
579 {
ISD::SHL, MVT::v4i32, { 1, 2, 1, 1 } },
580 {
ISD::SRL, MVT::v4i32, { 1, 2, 1, 1 } },
581 {
ISD::SRA, MVT::v4i32, { 1, 2, 1, 1 } },
582 {
ISD::SHL, MVT::v8i32, { 3, 6, 4, 5 } },
583 {
ISD::SRL, MVT::v8i32, { 3, 6, 4, 5 } },
584 {
ISD::SRA, MVT::v8i32, { 3, 6, 4, 5 } },
586 {
ISD::SHL, MVT::v2i64, { 1, 2, 1, 1 } },
587 {
ISD::SRL, MVT::v2i64, { 1, 2, 1, 1 } },
588 {
ISD::SRA, MVT::v2i64, { 2, 3, 3, 3 } },
589 {
ISD::SHL, MVT::v4i64, { 3, 6, 4, 5 } },
590 {
ISD::SRL, MVT::v4i64, { 3, 6, 4, 5 } },
591 {
ISD::SRA, MVT::v4i64, { 5, 7, 8, 9 } },
601 (!ST->hasXOP() || LT.second.getScalarSizeInBits() != 8))
602 if (
const auto *Entry =
604 if (
auto KindCost = Entry->Cost[CostKind])
605 return LT.first * *KindCost;
608 {
ISD::SHL, MVT::v16i8, { 1, 7, 2, 3 } },
609 {
ISD::SRL, MVT::v16i8, { 1, 7, 2, 3 } },
610 {
ISD::SRA, MVT::v16i8, { 3, 9, 5, 6 } },
612 {
ISD::SHL, MVT::v8i16, { 1, 1, 1, 1 } },
613 {
ISD::SRL, MVT::v8i16, { 1, 1, 1, 1 } },
614 {
ISD::SRA, MVT::v8i16, { 1, 1, 1, 1 } },
616 {
ISD::SHL, MVT::v4i32, { 1, 1, 1, 1 } },
617 {
ISD::SRL, MVT::v4i32, { 1, 1, 1, 1 } },
618 {
ISD::SRA, MVT::v4i32, { 1, 1, 1, 1 } },
620 {
ISD::SHL, MVT::v2i64, { 1, 1, 1, 1 } },
621 {
ISD::SRL, MVT::v2i64, { 1, 1, 1, 1 } },
622 {
ISD::SRA, MVT::v2i64, { 3, 5, 6, 6 } },
632 (!ST->hasXOP() || LT.second.getScalarSizeInBits() != 8))
633 if (
const auto *Entry =
635 if (
auto KindCost = Entry->Cost[CostKind])
636 return LT.first * *KindCost;
651 if (
const auto *Entry =
653 if (
auto KindCost = Entry->Cost[CostKind])
654 return LT.first * *KindCost;
668 if (
const auto *Entry =
670 if (
auto KindCost = Entry->Cost[CostKind])
671 return LT.first * *KindCost;
694 if (
const auto *Entry =
696 if (
auto KindCost = Entry->Cost[CostKind])
697 return LT.first * *KindCost;
721 if (
auto KindCost = Entry->Cost[CostKind])
722 return LT.first * *KindCost;
743 if (
auto KindCost = Entry->Cost[CostKind])
744 return LT.first * *KindCost;
752 if (
const auto *Entry =
754 if (
auto KindCost = Entry->Cost[CostKind])
755 return LT.first * *KindCost;
776 if (
auto KindCost = Entry->Cost[CostKind])
777 return LT.first * *KindCost;
781 {
ISD::SDIV, MVT::i8, { 15, 20, 2, 4 } },
782 {
ISD::UDIV, MVT::i8, { 15, 20, 2, 4 } },
783 {
ISD::SREM, MVT::i8, { 15, 20, 2, 4 } },
784 {
ISD::UREM, MVT::i8, { 15, 20, 2, 4 } },
785 {
ISD::SDIV, MVT::i16, { 17, 20, 2, 4 } },
786 {
ISD::UDIV, MVT::i16, { 17, 20, 2, 4 } },
787 {
ISD::SREM, MVT::i16, { 17, 20, 2, 4 } },
788 {
ISD::UREM, MVT::i16, { 17, 20, 2, 4 } },
789 {
ISD::SDIV, MVT::i32, { 25, 22, 2, 4 } },
790 {
ISD::UDIV, MVT::i32, { 25, 22, 2, 4 } },
791 {
ISD::SREM, MVT::i32, { 25, 22, 2, 4 } },
792 {
ISD::UREM, MVT::i32, { 25, 22, 2, 4 } },
793 {
ISD::SDIV, MVT::i64, { 41, 24, 2, 4 } },
794 {
ISD::UDIV, MVT::i64, { 41, 24, 2, 4 } },
795 {
ISD::SREM, MVT::i64, { 41, 24, 2, 4 } },
796 {
ISD::UREM, MVT::i64, { 41, 24, 2, 4 } },
799 if (!LT.second.isVector() && !Op2Info.
isConstant())
800 if (
const auto *Entry =
802 if (
auto KindCost = Entry->Cost[CostKind])
803 return LT.first * *KindCost;
811 bool VarDivToFP = IsDivRem && !Op2Info.
isConstant() &&
812 (!IsStrictFP || ST->useAVX512Regs());
849 auto OperandsFit = [&](
unsigned Mantissa) {
850 if (Args.size() != 2 || !CtxI)
852 unsigned EltBits = LT.second.getScalarSizeInBits();
854 auto Fits = [&](
const Value *V) {
859 .countMaxActiveBits() <= Mantissa;
861 return Fits(Args[0]) && Fits(Args[1]);
867 VarDivToFP && LT.second.getScalarType() == MVT::i32 &&
870 if (VarDivToFP && ST->hasDQI() && ST->useAVX512Regs() &&
871 LT.second.getScalarType() == MVT::i64) {
877 !ExactFPDiv && LT.second == MVT::v2i64 && ST->isPMULLQSlow();
881 ExactFPDiv ? AVX512DQExactVarDivCostTable : AVX512DQVarDivCostTable;
883 if (
auto KindCost = Entry->Cost[CostKind])
884 return LT.first * *KindCost;
942 if (VarDivToFP && ST->hasBWI()) {
945 Tbl = AVX512BWExactVarDivCostTable;
947 if (
auto KindCost = Entry->Cost[CostKind])
948 return LT.first * *KindCost;
1005 if (VarDivToFP && ST->hasAVX512()) {
1008 Tbl = AVX512ExactVarDivCostTable;
1010 if (
auto KindCost = Entry->Cost[CostKind])
1011 return LT.first * *KindCost;
1052 if (VarDivToFP && ST->hasAVX2()) {
1055 Tbl = AVX2ExactVarDivCostTable;
1057 if (
auto KindCost = Entry->Cost[CostKind])
1058 return LT.first * *KindCost;
1093 if (VarDivToFP && ST->hasAVX()) {
1096 Tbl = AVX1ExactVarDivCostTable;
1098 if (
auto KindCost = Entry->Cost[CostKind])
1099 return LT.first * *KindCost;
1120 if (VarDivToFP && ST->hasSSE2()) {
1123 Tbl = SSE2ExactVarDivCostTable;
1125 if (
auto KindCost = Entry->Cost[CostKind])
1126 return LT.first * *KindCost;
1130 {
ISD::SHL, MVT::v16i8, { 3, 5, 5, 7 } },
1131 {
ISD::SRL, MVT::v16i8, { 3,10, 5, 8 } },
1132 {
ISD::SRA, MVT::v16i8, { 4,12, 8,12 } },
1133 {
ISD::SHL, MVT::v32i8, { 4, 7, 6, 8 } },
1134 {
ISD::SRL, MVT::v32i8, { 4, 8, 7, 9 } },
1135 {
ISD::SRA, MVT::v32i8, { 5,10,10,13 } },
1136 {
ISD::SHL, MVT::v64i8, { 4, 7, 6, 8 } },
1137 {
ISD::SRL, MVT::v64i8, { 4, 8, 7,10 } },
1138 {
ISD::SRA, MVT::v64i8, { 5,10,10,15 } },
1140 {
ISD::SHL, MVT::v32i16, { 2, 4, 2, 3 } },
1141 {
ISD::SRL, MVT::v32i16, { 2, 4, 2, 3 } },
1142 {
ISD::SRA, MVT::v32i16, { 2, 4, 2, 3 } },
1145 if (ST->hasBWI() && Op2Info.
isUniform())
1146 if (
const auto *Entry =
1148 if (
auto KindCost = Entry->Cost[CostKind])
1149 return LT.first * *KindCost;
1152 {
ISD::SHL, MVT::v32i16, { 5,10, 5, 7 } },
1153 {
ISD::SRL, MVT::v32i16, { 5,10, 5, 7 } },
1154 {
ISD::SRA, MVT::v32i16, { 5,10, 5, 7 } },
1156 {
ISD::SHL, MVT::v16i32, { 2, 4, 2, 3 } },
1157 {
ISD::SRL, MVT::v16i32, { 2, 4, 2, 3 } },
1158 {
ISD::SRA, MVT::v16i32, { 2, 4, 2, 3 } },
1160 {
ISD::SRA, MVT::v2i64, { 1, 2, 1, 2 } },
1161 {
ISD::SHL, MVT::v4i64, { 1, 4, 1, 2 } },
1162 {
ISD::SRL, MVT::v4i64, { 1, 4, 1, 2 } },
1163 {
ISD::SRA, MVT::v4i64, { 1, 4, 1, 2 } },
1164 {
ISD::SHL, MVT::v8i64, { 1, 4, 1, 2 } },
1165 {
ISD::SRL, MVT::v8i64, { 1, 4, 1, 2 } },
1166 {
ISD::SRA, MVT::v8i64, { 1, 4, 1, 2 } },
1169 if (ST->hasAVX512() && Op2Info.
isUniform())
1170 if (
const auto *Entry =
1172 if (
auto KindCost = Entry->Cost[CostKind])
1173 return LT.first * *KindCost;
1177 {
ISD::SHL, MVT::v16i8, { 3, 5, 5, 7 } },
1178 {
ISD::SRL, MVT::v16i8, { 3, 9, 5, 8 } },
1179 {
ISD::SRA, MVT::v16i8, { 4, 5, 9,13 } },
1180 {
ISD::SHL, MVT::v32i8, { 4, 7, 6, 8 } },
1181 {
ISD::SRL, MVT::v32i8, { 4, 8, 7, 9 } },
1182 {
ISD::SRA, MVT::v32i8, { 6, 9,11,16 } },
1184 {
ISD::SHL, MVT::v8i16, { 1, 2, 1, 2 } },
1185 {
ISD::SRL, MVT::v8i16, { 1, 2, 1, 2 } },
1186 {
ISD::SRA, MVT::v8i16, { 1, 2, 1, 2 } },
1187 {
ISD::SHL, MVT::v16i16, { 2, 4, 2, 3 } },
1188 {
ISD::SRL, MVT::v16i16, { 2, 4, 2, 3 } },
1189 {
ISD::SRA, MVT::v16i16, { 2, 4, 2, 3 } },
1191 {
ISD::SHL, MVT::v4i32, { 1, 2, 1, 2 } },
1192 {
ISD::SRL, MVT::v4i32, { 1, 2, 1, 2 } },
1193 {
ISD::SRA, MVT::v4i32, { 1, 2, 1, 2 } },
1194 {
ISD::SHL, MVT::v8i32, { 2, 4, 2, 3 } },
1195 {
ISD::SRL, MVT::v8i32, { 2, 4, 2, 3 } },
1196 {
ISD::SRA, MVT::v8i32, { 2, 4, 2, 3 } },
1198 {
ISD::SHL, MVT::v2i64, { 1, 2, 1, 2 } },
1199 {
ISD::SRL, MVT::v2i64, { 1, 2, 1, 2 } },
1200 {
ISD::SRA, MVT::v2i64, { 2, 4, 5, 7 } },
1201 {
ISD::SHL, MVT::v4i64, { 2, 4, 1, 2 } },
1202 {
ISD::SRL, MVT::v4i64, { 2, 4, 1, 2 } },
1203 {
ISD::SRA, MVT::v4i64, { 4, 6, 5, 9 } },
1206 if (ST->hasAVX2() && Op2Info.
isUniform())
1207 if (
const auto *Entry =
1209 if (
auto KindCost = Entry->Cost[CostKind])
1210 return LT.first * *KindCost;
1213 {
ISD::SHL, MVT::v16i8, { 4, 4, 6, 8 } },
1214 {
ISD::SRL, MVT::v16i8, { 4, 8, 5, 8 } },
1215 {
ISD::SRA, MVT::v16i8, { 6, 6, 9,13 } },
1216 {
ISD::SHL, MVT::v32i8, { 7, 8,11,14 } },
1217 {
ISD::SRL, MVT::v32i8, { 7, 9,10,14 } },
1218 {
ISD::SRA, MVT::v32i8, { 10,11,16,21 } },
1220 {
ISD::SHL, MVT::v8i16, { 1, 3, 1, 2 } },
1221 {
ISD::SRL, MVT::v8i16, { 1, 3, 1, 2 } },
1222 {
ISD::SRA, MVT::v8i16, { 1, 3, 1, 2 } },
1223 {
ISD::SHL, MVT::v16i16, { 3, 7, 5, 7 } },
1224 {
ISD::SRL, MVT::v16i16, { 3, 7, 5, 7 } },
1225 {
ISD::SRA, MVT::v16i16, { 3, 7, 5, 7 } },
1227 {
ISD::SHL, MVT::v4i32, { 1, 3, 1, 2 } },
1228 {
ISD::SRL, MVT::v4i32, { 1, 3, 1, 2 } },
1229 {
ISD::SRA, MVT::v4i32, { 1, 3, 1, 2 } },
1230 {
ISD::SHL, MVT::v8i32, { 3, 7, 5, 7 } },
1231 {
ISD::SRL, MVT::v8i32, { 3, 7, 5, 7 } },
1232 {
ISD::SRA, MVT::v8i32, { 3, 7, 5, 7 } },
1234 {
ISD::SHL, MVT::v2i64, { 1, 3, 1, 2 } },
1235 {
ISD::SRL, MVT::v2i64, { 1, 3, 1, 2 } },
1236 {
ISD::SRA, MVT::v2i64, { 3, 4, 5, 7 } },
1237 {
ISD::SHL, MVT::v4i64, { 3, 7, 4, 6 } },
1238 {
ISD::SRL, MVT::v4i64, { 3, 7, 4, 6 } },
1239 {
ISD::SRA, MVT::v4i64, { 6, 7,10,13 } },
1243 if (ST->hasAVX() && Op2Info.
isUniform() &&
1244 (!ST->hasXOP() || LT.second.getScalarSizeInBits() != 8))
1245 if (
const auto *Entry =
1247 if (
auto KindCost = Entry->Cost[CostKind])
1248 return LT.first * *KindCost;
1252 {
ISD::SHL, MVT::v16i8, { 9, 10, 6, 9 } },
1253 {
ISD::SRL, MVT::v16i8, { 9, 13, 5, 9 } },
1254 {
ISD::SRA, MVT::v16i8, { 11, 15, 9,13 } },
1256 {
ISD::SHL, MVT::v8i16, { 2, 2, 1, 2 } },
1257 {
ISD::SRL, MVT::v8i16, { 2, 2, 1, 2 } },
1258 {
ISD::SRA, MVT::v8i16, { 2, 2, 1, 2 } },
1260 {
ISD::SHL, MVT::v4i32, { 2, 2, 1, 2 } },
1261 {
ISD::SRL, MVT::v4i32, { 2, 2, 1, 2 } },
1262 {
ISD::SRA, MVT::v4i32, { 2, 2, 1, 2 } },
1264 {
ISD::SHL, MVT::v2i64, { 2, 2, 1, 2 } },
1265 {
ISD::SRL, MVT::v2i64, { 2, 2, 1, 2 } },
1266 {
ISD::SRA, MVT::v2i64, { 5, 9, 5, 7 } },
1269 if (ST->hasSSE2() && Op2Info.
isUniform() &&
1270 (!ST->hasXOP() || LT.second.getScalarSizeInBits() != 8))
1271 if (
const auto *Entry =
1273 if (
auto KindCost = Entry->Cost[CostKind])
1274 return LT.first * *KindCost;
1277 {
ISD::MUL, MVT::v2i64, { 2, 15, 1, 3 } },
1278 {
ISD::MUL, MVT::v4i64, { 2, 15, 1, 3 } },
1279 {
ISD::MUL, MVT::v8i64, { 3, 15, 1, 3 } }
1285 if (
auto KindCost = Entry->Cost[CostKind])
1286 return LT.first * *KindCost;
1289 {
ISD::SHL, MVT::v16i8, { 4, 8, 4, 5 } },
1290 {
ISD::SRL, MVT::v16i8, { 4, 8, 4, 5 } },
1291 {
ISD::SRA, MVT::v16i8, { 4, 8, 4, 5 } },
1292 {
ISD::SHL, MVT::v32i8, { 4, 23,11,16 } },
1293 {
ISD::SRL, MVT::v32i8, { 4, 30,12,18 } },
1294 {
ISD::SRA, MVT::v32i8, { 6, 13,24,30 } },
1295 {
ISD::SHL, MVT::v64i8, { 6, 19,13,15 } },
1296 {
ISD::SRL, MVT::v64i8, { 7, 27,15,18 } },
1297 {
ISD::SRA, MVT::v64i8, { 15, 15,30,30 } },
1299 {
ISD::SHL, MVT::v8i16, { 1, 1, 1, 1 } },
1300 {
ISD::SRL, MVT::v8i16, { 1, 1, 1, 1 } },
1301 {
ISD::SRA, MVT::v8i16, { 1, 1, 1, 1 } },
1302 {
ISD::SHL, MVT::v16i16, { 1, 1, 1, 1 } },
1303 {
ISD::SRL, MVT::v16i16, { 1, 1, 1, 1 } },
1304 {
ISD::SRA, MVT::v16i16, { 1, 1, 1, 1 } },
1305 {
ISD::SHL, MVT::v32i16, { 1, 1, 1, 1 } },
1306 {
ISD::SRL, MVT::v32i16, { 1, 1, 1, 1 } },
1307 {
ISD::SRA, MVT::v32i16, { 1, 1, 1, 1 } },
1309 {
ISD::ADD, MVT::v64i8, { 1, 1, 1, 1 } },
1310 {
ISD::ADD, MVT::v32i16, { 1, 1, 1, 1 } },
1312 {
ISD::ADD, MVT::v32i8, { 1, 1, 1, 1 } },
1313 {
ISD::ADD, MVT::v16i16, { 1, 1, 1, 1 } },
1314 {
ISD::ADD, MVT::v8i32, { 1, 1, 1, 1 } },
1315 {
ISD::ADD, MVT::v4i64, { 1, 1, 1, 1 } },
1317 {
ISD::SUB, MVT::v64i8, { 1, 1, 1, 1 } },
1318 {
ISD::SUB, MVT::v32i16, { 1, 1, 1, 1 } },
1320 {
ISD::MUL, MVT::v16i8, { 4, 12, 4, 5 } },
1321 {
ISD::MUL, MVT::v32i8, { 3, 10, 7,10 } },
1322 {
ISD::MUL, MVT::v64i8, { 3, 11, 7,10 } },
1323 {
ISD::MUL, MVT::v32i16, { 1, 5, 1, 1 } },
1325 {
ISD::SUB, MVT::v32i8, { 1, 1, 1, 1 } },
1326 {
ISD::SUB, MVT::v16i16, { 1, 1, 1, 1 } },
1327 {
ISD::SUB, MVT::v8i32, { 1, 1, 1, 1 } },
1328 {
ISD::SUB, MVT::v4i64, { 1, 1, 1, 1 } },
1334 if (
auto KindCost = Entry->Cost[CostKind])
1335 return LT.first * *KindCost;
1338 {
ISD::SHL, MVT::v64i8, { 15, 19,27,33 } },
1339 {
ISD::SRL, MVT::v64i8, { 15, 19,30,36 } },
1340 {
ISD::SRA, MVT::v64i8, { 37, 37,51,63 } },
1342 {
ISD::SHL, MVT::v32i16, { 11, 16,11,15 } },
1343 {
ISD::SRL, MVT::v32i16, { 11, 16,11,15 } },
1344 {
ISD::SRA, MVT::v32i16, { 11, 16,11,15 } },
1346 {
ISD::SHL, MVT::v4i32, { 1, 1, 1, 1 } },
1347 {
ISD::SRL, MVT::v4i32, { 1, 1, 1, 1 } },
1348 {
ISD::SRA, MVT::v4i32, { 1, 1, 1, 1 } },
1349 {
ISD::SHL, MVT::v8i32, { 1, 1, 1, 1 } },
1350 {
ISD::SRL, MVT::v8i32, { 1, 1, 1, 1 } },
1351 {
ISD::SRA, MVT::v8i32, { 1, 1, 1, 1 } },
1352 {
ISD::SHL, MVT::v16i32, { 1, 1, 1, 1 } },
1353 {
ISD::SRL, MVT::v16i32, { 1, 1, 1, 1 } },
1354 {
ISD::SRA, MVT::v16i32, { 1, 1, 1, 1 } },
1356 {
ISD::SHL, MVT::v2i64, { 1, 1, 1, 1 } },
1357 {
ISD::SRL, MVT::v2i64, { 1, 1, 1, 1 } },
1358 {
ISD::SRA, MVT::v2i64, { 1, 1, 1, 1 } },
1359 {
ISD::SHL, MVT::v4i64, { 1, 1, 1, 1 } },
1360 {
ISD::SRL, MVT::v4i64, { 1, 1, 1, 1 } },
1361 {
ISD::SRA, MVT::v4i64, { 1, 1, 1, 1 } },
1362 {
ISD::SHL, MVT::v8i64, { 1, 1, 1, 1 } },
1363 {
ISD::SRL, MVT::v8i64, { 1, 1, 1, 1 } },
1364 {
ISD::SRA, MVT::v8i64, { 1, 1, 1, 1 } },
1366 {
ISD::ADD, MVT::v64i8, { 3, 7, 5, 5 } },
1367 {
ISD::ADD, MVT::v32i16, { 3, 7, 5, 5 } },
1369 {
ISD::SUB, MVT::v64i8, { 3, 7, 5, 5 } },
1370 {
ISD::SUB, MVT::v32i16, { 3, 7, 5, 5 } },
1372 {
ISD::AND, MVT::v32i8, { 1, 1, 1, 1 } },
1373 {
ISD::AND, MVT::v16i16, { 1, 1, 1, 1 } },
1374 {
ISD::AND, MVT::v8i32, { 1, 1, 1, 1 } },
1375 {
ISD::AND, MVT::v4i64, { 1, 1, 1, 1 } },
1377 {
ISD::OR, MVT::v32i8, { 1, 1, 1, 1 } },
1378 {
ISD::OR, MVT::v16i16, { 1, 1, 1, 1 } },
1379 {
ISD::OR, MVT::v8i32, { 1, 1, 1, 1 } },
1380 {
ISD::OR, MVT::v4i64, { 1, 1, 1, 1 } },
1382 {
ISD::XOR, MVT::v32i8, { 1, 1, 1, 1 } },
1383 {
ISD::XOR, MVT::v16i16, { 1, 1, 1, 1 } },
1384 {
ISD::XOR, MVT::v8i32, { 1, 1, 1, 1 } },
1385 {
ISD::XOR, MVT::v4i64, { 1, 1, 1, 1 } },
1387 {
ISD::MUL, MVT::v16i32, { 1, 10, 1, 2 } },
1388 {
ISD::MUL, MVT::v8i32, { 1, 10, 1, 2 } },
1389 {
ISD::MUL, MVT::v4i32, { 1, 10, 1, 2 } },
1390 {
ISD::MUL, MVT::v8i64, { 6, 9, 8, 8 } },
1393 { X86ISD::PMULUDQ, MVT::v8i64, { 1, 5, 1, 1 } },
1395 {
ISD::FNEG, MVT::v8f64, { 1, 1, 1, 2 } },
1396 {
ISD::FADD, MVT::v8f64, { 1, 4, 1, 1 } },
1397 {
ISD::FADD, MVT::v4f64, { 1, 4, 1, 1 } },
1398 {
ISD::FSUB, MVT::v8f64, { 1, 4, 1, 1 } },
1399 {
ISD::FSUB, MVT::v4f64, { 1, 4, 1, 1 } },
1400 {
ISD::FMUL, MVT::v8f64, { 1, 4, 1, 1 } },
1401 {
ISD::FMUL, MVT::v4f64, { 1, 4, 1, 1 } },
1402 {
ISD::FMUL, MVT::v2f64, { 1, 4, 1, 1 } },
1403 {
ISD::FMUL, MVT::f64, { 1, 4, 1, 1 } },
1405 {
ISD::FDIV, MVT::f64, { 4, 14, 1, 1 } },
1406 {
ISD::FDIV, MVT::v2f64, { 4, 14, 1, 1 } },
1407 {
ISD::FDIV, MVT::v4f64, { 8, 14, 1, 1 } },
1408 {
ISD::FDIV, MVT::v8f64, { 16, 23, 1, 3 } },
1410 {
ISD::FNEG, MVT::v16f32, { 1, 1, 1, 2 } },
1411 {
ISD::FADD, MVT::v16f32, { 1, 4, 1, 1 } },
1412 {
ISD::FADD, MVT::v8f32, { 1, 4, 1, 1 } },
1413 {
ISD::FSUB, MVT::v16f32, { 1, 4, 1, 1 } },
1414 {
ISD::FSUB, MVT::v8f32, { 1, 4, 1, 1 } },
1415 {
ISD::FMUL, MVT::v16f32, { 1, 4, 1, 1 } },
1416 {
ISD::FMUL, MVT::v8f32, { 1, 4, 1, 1 } },
1417 {
ISD::FMUL, MVT::v4f32, { 1, 4, 1, 1 } },
1418 {
ISD::FMUL, MVT::f32, { 1, 4, 1, 1 } },
1420 {
ISD::FDIV, MVT::f32, { 3, 11, 1, 1 } },
1421 {
ISD::FDIV, MVT::v4f32, { 3, 11, 1, 1 } },
1422 {
ISD::FDIV, MVT::v8f32, { 5, 11, 1, 1 } },
1423 {
ISD::FDIV, MVT::v16f32, { 10, 18, 1, 3 } },
1426 if (ST->hasAVX512())
1428 if (
auto KindCost = Entry->Cost[CostKind])
1429 return LT.first * *KindCost;
1434 {
ISD::SHL, MVT::v4i32, { 2, 3, 1, 3 } },
1435 {
ISD::SRL, MVT::v4i32, { 2, 3, 1, 3 } },
1436 {
ISD::SRA, MVT::v4i32, { 2, 3, 1, 3 } },
1437 {
ISD::SHL, MVT::v8i32, { 4, 4, 1, 3 } },
1438 {
ISD::SRL, MVT::v8i32, { 4, 4, 1, 3 } },
1439 {
ISD::SRA, MVT::v8i32, { 4, 4, 1, 3 } },
1440 {
ISD::SHL, MVT::v2i64, { 2, 3, 1, 1 } },
1441 {
ISD::SRL, MVT::v2i64, { 2, 3, 1, 1 } },
1442 {
ISD::SHL, MVT::v4i64, { 4, 4, 1, 2 } },
1443 {
ISD::SRL, MVT::v4i64, { 4, 4, 1, 2 } },
1446 if (ST->hasAVX512()) {
1455 if (ST->hasAVX2() && !(ST->hasXOP() && LT.second == MVT::v4i32)) {
1456 if (
ISD ==
ISD::SHL && LT.second == MVT::v16i16 &&
1464 if (
auto KindCost = Entry->Cost[CostKind])
1465 return LT.first * *KindCost;
1470 {
ISD::SHL, MVT::v16i8, { 1, 3, 1, 1 } },
1471 {
ISD::SRL, MVT::v16i8, { 2, 3, 1, 1 } },
1472 {
ISD::SRA, MVT::v16i8, { 2, 3, 1, 1 } },
1473 {
ISD::SHL, MVT::v8i16, { 1, 3, 1, 1 } },
1474 {
ISD::SRL, MVT::v8i16, { 2, 3, 1, 1 } },
1475 {
ISD::SRA, MVT::v8i16, { 2, 3, 1, 1 } },
1476 {
ISD::SHL, MVT::v4i32, { 1, 3, 1, 1 } },
1477 {
ISD::SRL, MVT::v4i32, { 2, 3, 1, 1 } },
1478 {
ISD::SRA, MVT::v4i32, { 2, 3, 1, 1 } },
1479 {
ISD::SHL, MVT::v2i64, { 1, 3, 1, 1 } },
1480 {
ISD::SRL, MVT::v2i64, { 2, 3, 1, 1 } },
1481 {
ISD::SRA, MVT::v2i64, { 2, 3, 1, 1 } },
1483 {
ISD::SHL, MVT::v32i8, { 4, 7, 5, 6 } },
1484 {
ISD::SRL, MVT::v32i8, { 6, 7, 5, 6 } },
1485 {
ISD::SRA, MVT::v32i8, { 6, 7, 5, 6 } },
1486 {
ISD::SHL, MVT::v16i16, { 4, 7, 5, 6 } },
1487 {
ISD::SRL, MVT::v16i16, { 6, 7, 5, 6 } },
1488 {
ISD::SRA, MVT::v16i16, { 6, 7, 5, 6 } },
1489 {
ISD::SHL, MVT::v8i32, { 4, 7, 5, 6 } },
1490 {
ISD::SRL, MVT::v8i32, { 6, 7, 5, 6 } },
1491 {
ISD::SRA, MVT::v8i32, { 6, 7, 5, 6 } },
1492 {
ISD::SHL, MVT::v4i64, { 4, 7, 5, 6 } },
1493 {
ISD::SRL, MVT::v4i64, { 6, 7, 5, 6 } },
1494 {
ISD::SRA, MVT::v4i64, { 6, 7, 5, 6 } },
1504 if (
const auto *Entry =
1506 if (
auto KindCost = Entry->Cost[CostKind])
1507 return LT.first * *KindCost;
1514 if (((VT == MVT::v8i16 || VT == MVT::v4i32) && ST->hasSSE2()) ||
1515 ((VT == MVT::v16i16 || VT == MVT::v8i32) && ST->hasAVX()))
1520 {
ISD::FDIV, MVT::f32, { 18, 19, 1, 1 } },
1521 {
ISD::FDIV, MVT::v4f32, { 35, 36, 1, 1 } },
1522 {
ISD::FDIV, MVT::f64, { 33, 34, 1, 1 } },
1523 {
ISD::FDIV, MVT::v2f64, { 65, 66, 1, 1 } },
1526 if (ST->useGLMDivSqrtCosts())
1528 if (
auto KindCost = Entry->Cost[CostKind])
1529 return LT.first * *KindCost;
1532 {
ISD::MUL, MVT::v4i32, { 11, 11, 1, 7 } },
1533 {
ISD::MUL, MVT::v8i16, { 2, 5, 1, 1 } },
1534 {
ISD::FMUL, MVT::f64, { 2, 5, 1, 1 } },
1535 {
ISD::FMUL, MVT::f32, { 1, 4, 1, 1 } },
1536 {
ISD::FMUL, MVT::v2f64, { 4, 7, 1, 1 } },
1537 {
ISD::FMUL, MVT::v4f32, { 2, 5, 1, 1 } },
1538 {
ISD::FDIV, MVT::f32, { 17, 19, 1, 1 } },
1539 {
ISD::FDIV, MVT::v4f32, { 39, 39, 1, 6 } },
1540 {
ISD::FDIV, MVT::f64, { 32, 34, 1, 1 } },
1541 {
ISD::FDIV, MVT::v2f64, { 69, 69, 1, 6 } },
1542 {
ISD::FADD, MVT::v2f64, { 2, 4, 1, 1 } },
1543 {
ISD::FSUB, MVT::v2f64, { 2, 4, 1, 1 } },
1549 {
ISD::MUL, MVT::v2i64, { 17, 22, 9, 9 } },
1551 {
ISD::ADD, MVT::v2i64, { 4, 2, 1, 2 } },
1552 {
ISD::SUB, MVT::v2i64, { 4, 2, 1, 2 } },
1555 if (ST->useSLMArithCosts())
1557 if (
auto KindCost = Entry->Cost[CostKind])
1558 return LT.first * *KindCost;
1561 {
ISD::SHL, MVT::v16i8, { 6, 21,11,16 } },
1562 {
ISD::SHL, MVT::v32i8, { 6, 23,11,22 } },
1563 {
ISD::SHL, MVT::v8i16, { 5, 18, 5,10 } },
1564 {
ISD::SHL, MVT::v16i16, { 8, 10,10,14 } },
1566 {
ISD::SRL, MVT::v16i8, { 6, 27,12,18 } },
1567 {
ISD::SRL, MVT::v32i8, { 8, 30,12,24 } },
1568 {
ISD::SRL, MVT::v8i16, { 5, 11, 5,10 } },
1569 {
ISD::SRL, MVT::v16i16, { 8, 10,10,14 } },
1571 {
ISD::SRA, MVT::v16i8, { 17, 17,24,30 } },
1572 {
ISD::SRA, MVT::v32i8, { 18, 20,24,43 } },
1573 {
ISD::SRA, MVT::v8i16, { 5, 11, 5,10 } },
1574 {
ISD::SRA, MVT::v16i16, { 8, 10,10,14 } },
1575 {
ISD::SRA, MVT::v2i64, { 4, 5, 5, 5 } },
1576 {
ISD::SRA, MVT::v4i64, { 8, 8, 5, 9 } },
1578 {
ISD::SUB, MVT::v32i8, { 1, 1, 1, 2 } },
1579 {
ISD::ADD, MVT::v32i8, { 1, 1, 1, 2 } },
1580 {
ISD::SUB, MVT::v16i16, { 1, 1, 1, 2 } },
1581 {
ISD::ADD, MVT::v16i16, { 1, 1, 1, 2 } },
1582 {
ISD::SUB, MVT::v8i32, { 1, 1, 1, 2 } },
1583 {
ISD::ADD, MVT::v8i32, { 1, 1, 1, 2 } },
1584 {
ISD::SUB, MVT::v4i64, { 1, 1, 1, 2 } },
1585 {
ISD::ADD, MVT::v4i64, { 1, 1, 1, 2 } },
1587 {
ISD::MUL, MVT::v16i8, { 5, 18, 6,12 } },
1588 {
ISD::MUL, MVT::v32i8, { 4, 8, 8,16 } },
1589 {
ISD::MUL, MVT::v16i16, { 2, 5, 1, 2 } },
1590 {
ISD::MUL, MVT::v8i32, { 4, 10, 1, 2 } },
1591 {
ISD::MUL, MVT::v4i32, { 2, 10, 1, 2 } },
1592 {
ISD::MUL, MVT::v4i64, { 6, 10, 8,13 } },
1593 {
ISD::MUL, MVT::v2i64, { 6, 10, 8, 8 } },
1595 { X86ISD::PMULUDQ, MVT::v4i64, { 1, 5, 1, 1 } },
1597 {
ISD::FNEG, MVT::v4f64, { 1, 1, 1, 2 } },
1598 {
ISD::FNEG, MVT::v8f32, { 1, 1, 1, 2 } },
1600 {
ISD::FADD, MVT::f64, { 1, 4, 1, 1 } },
1601 {
ISD::FADD, MVT::f32, { 1, 4, 1, 1 } },
1602 {
ISD::FADD, MVT::v2f64, { 1, 4, 1, 1 } },
1603 {
ISD::FADD, MVT::v4f32, { 1, 4, 1, 1 } },
1604 {
ISD::FADD, MVT::v4f64, { 1, 4, 1, 2 } },
1605 {
ISD::FADD, MVT::v8f32, { 1, 4, 1, 2 } },
1607 {
ISD::FSUB, MVT::f64, { 1, 4, 1, 1 } },
1608 {
ISD::FSUB, MVT::f32, { 1, 4, 1, 1 } },
1609 {
ISD::FSUB, MVT::v2f64, { 1, 4, 1, 1 } },
1610 {
ISD::FSUB, MVT::v4f32, { 1, 4, 1, 1 } },
1611 {
ISD::FSUB, MVT::v4f64, { 1, 4, 1, 2 } },
1612 {
ISD::FSUB, MVT::v8f32, { 1, 4, 1, 2 } },
1614 {
ISD::FMUL, MVT::f64, { 1, 5, 1, 1 } },
1615 {
ISD::FMUL, MVT::f32, { 1, 5, 1, 1 } },
1616 {
ISD::FMUL, MVT::v2f64, { 1, 5, 1, 1 } },
1617 {
ISD::FMUL, MVT::v4f32, { 1, 5, 1, 1 } },
1618 {
ISD::FMUL, MVT::v4f64, { 1, 5, 1, 2 } },
1619 {
ISD::FMUL, MVT::v8f32, { 1, 5, 1, 2 } },
1621 {
ISD::FDIV, MVT::f32, { 7, 13, 1, 1 } },
1622 {
ISD::FDIV, MVT::v4f32, { 7, 13, 1, 1 } },
1623 {
ISD::FDIV, MVT::v8f32, { 14, 21, 1, 3 } },
1624 {
ISD::FDIV, MVT::f64, { 14, 20, 1, 1 } },
1625 {
ISD::FDIV, MVT::v2f64, { 14, 20, 1, 1 } },
1626 {
ISD::FDIV, MVT::v4f64, { 28, 35, 1, 3 } },
1632 if (
auto KindCost = Entry->Cost[CostKind])
1633 return LT.first * *KindCost;
1639 {
ISD::MUL, MVT::v32i8, { 10, 11, 18, 19 } },
1640 {
ISD::MUL, MVT::v16i8, { 5, 6, 8, 12 } },
1641 {
ISD::MUL, MVT::v16i16, { 4, 8, 5, 6 } },
1642 {
ISD::MUL, MVT::v8i32, { 5, 8, 5, 10 } },
1643 {
ISD::MUL, MVT::v4i32, { 2, 5, 1, 3 } },
1644 {
ISD::MUL, MVT::v4i64, { 12, 15, 19, 20 } },
1646 { X86ISD::PMULUDQ, MVT::v4i64, { 3, 5, 5, 6 } },
1648 {
ISD::AND, MVT::v32i8, { 1, 1, 1, 2 } },
1649 {
ISD::AND, MVT::v16i16, { 1, 1, 1, 2 } },
1650 {
ISD::AND, MVT::v8i32, { 1, 1, 1, 2 } },
1651 {
ISD::AND, MVT::v4i64, { 1, 1, 1, 2 } },
1653 {
ISD::OR, MVT::v32i8, { 1, 1, 1, 2 } },
1654 {
ISD::OR, MVT::v16i16, { 1, 1, 1, 2 } },
1655 {
ISD::OR, MVT::v8i32, { 1, 1, 1, 2 } },
1656 {
ISD::OR, MVT::v4i64, { 1, 1, 1, 2 } },
1658 {
ISD::XOR, MVT::v32i8, { 1, 1, 1, 2 } },
1659 {
ISD::XOR, MVT::v16i16, { 1, 1, 1, 2 } },
1660 {
ISD::XOR, MVT::v8i32, { 1, 1, 1, 2 } },
1661 {
ISD::XOR, MVT::v4i64, { 1, 1, 1, 2 } },
1663 {
ISD::SUB, MVT::v32i8, { 4, 2, 5, 6 } },
1664 {
ISD::ADD, MVT::v32i8, { 4, 2, 5, 6 } },
1665 {
ISD::SUB, MVT::v16i16, { 4, 2, 5, 6 } },
1666 {
ISD::ADD, MVT::v16i16, { 4, 2, 5, 6 } },
1667 {
ISD::SUB, MVT::v8i32, { 4, 2, 5, 6 } },
1668 {
ISD::ADD, MVT::v8i32, { 4, 2, 5, 6 } },
1669 {
ISD::SUB, MVT::v4i64, { 4, 2, 5, 6 } },
1670 {
ISD::ADD, MVT::v4i64, { 4, 2, 5, 6 } },
1671 {
ISD::SUB, MVT::v2i64, { 1, 1, 1, 1 } },
1672 {
ISD::ADD, MVT::v2i64, { 1, 1, 1, 1 } },
1674 {
ISD::SHL, MVT::v16i8, { 10, 21,11,17 } },
1675 {
ISD::SHL, MVT::v32i8, { 22, 22,27,40 } },
1676 {
ISD::SHL, MVT::v8i16, { 6, 9,11,11 } },
1677 {
ISD::SHL, MVT::v16i16, { 13, 16,24,25 } },
1678 {
ISD::SHL, MVT::v4i32, { 3, 11, 4, 6 } },
1679 {
ISD::SHL, MVT::v8i32, { 9, 11,12,17 } },
1680 {
ISD::SHL, MVT::v2i64, { 2, 4, 4, 6 } },
1681 {
ISD::SHL, MVT::v4i64, { 6, 7,11,15 } },
1683 {
ISD::SRL, MVT::v16i8, { 11, 27,12,18 } },
1684 {
ISD::SRL, MVT::v32i8, { 23, 23,30,43 } },
1685 {
ISD::SRL, MVT::v8i16, { 13, 16,14,22 } },
1686 {
ISD::SRL, MVT::v16i16, { 28, 30,31,48 } },
1687 {
ISD::SRL, MVT::v4i32, { 6, 7,12,16 } },
1688 {
ISD::SRL, MVT::v8i32, { 14, 14,26,34 } },
1689 {
ISD::SRL, MVT::v2i64, { 2, 4, 4, 6 } },
1690 {
ISD::SRL, MVT::v4i64, { 6, 7,11,15 } },
1692 {
ISD::SRA, MVT::v16i8, { 21, 22,24,36 } },
1693 {
ISD::SRA, MVT::v32i8, { 44, 45,51,76 } },
1694 {
ISD::SRA, MVT::v8i16, { 13, 16,14,22 } },
1695 {
ISD::SRA, MVT::v16i16, { 28, 30,31,48 } },
1696 {
ISD::SRA, MVT::v4i32, { 6, 7,12,16 } },
1697 {
ISD::SRA, MVT::v8i32, { 14, 14,26,34 } },
1698 {
ISD::SRA, MVT::v2i64, { 5, 6,10,14 } },
1699 {
ISD::SRA, MVT::v4i64, { 12, 12,22,30 } },
1701 {
ISD::FNEG, MVT::v4f64, { 2, 2, 1, 2 } },
1702 {
ISD::FNEG, MVT::v8f32, { 2, 2, 1, 2 } },
1704 {
ISD::FADD, MVT::f64, { 1, 5, 1, 1 } },
1705 {
ISD::FADD, MVT::f32, { 1, 5, 1, 1 } },
1706 {
ISD::FADD, MVT::v2f64, { 1, 5, 1, 1 } },
1707 {
ISD::FADD, MVT::v4f32, { 1, 5, 1, 1 } },
1708 {
ISD::FADD, MVT::v4f64, { 2, 5, 1, 2 } },
1709 {
ISD::FADD, MVT::v8f32, { 2, 5, 1, 2 } },
1711 {
ISD::FSUB, MVT::f64, { 1, 5, 1, 1 } },
1712 {
ISD::FSUB, MVT::f32, { 1, 5, 1, 1 } },
1713 {
ISD::FSUB, MVT::v2f64, { 1, 5, 1, 1 } },
1714 {
ISD::FSUB, MVT::v4f32, { 1, 5, 1, 1 } },
1715 {
ISD::FSUB, MVT::v4f64, { 2, 5, 1, 2 } },
1716 {
ISD::FSUB, MVT::v8f32, { 2, 5, 1, 2 } },
1718 {
ISD::FMUL, MVT::f64, { 2, 5, 1, 1 } },
1719 {
ISD::FMUL, MVT::f32, { 1, 5, 1, 1 } },
1720 {
ISD::FMUL, MVT::v2f64, { 2, 5, 1, 1 } },
1721 {
ISD::FMUL, MVT::v4f32, { 1, 5, 1, 1 } },
1722 {
ISD::FMUL, MVT::v4f64, { 4, 5, 1, 2 } },
1723 {
ISD::FMUL, MVT::v8f32, { 2, 5, 1, 2 } },
1725 {
ISD::FDIV, MVT::f32, { 14, 14, 1, 1 } },
1726 {
ISD::FDIV, MVT::v4f32, { 14, 14, 1, 1 } },
1727 {
ISD::FDIV, MVT::v8f32, { 28, 29, 1, 3 } },
1728 {
ISD::FDIV, MVT::f64, { 22, 22, 1, 1 } },
1729 {
ISD::FDIV, MVT::v2f64, { 22, 22, 1, 1 } },
1730 {
ISD::FDIV, MVT::v4f64, { 44, 45, 1, 3 } },
1735 if (
auto KindCost = Entry->Cost[CostKind])
1736 return LT.first * *KindCost;
1739 {
ISD::FADD, MVT::f64, { 1, 3, 1, 1 } },
1740 {
ISD::FADD, MVT::f32, { 1, 3, 1, 1 } },
1741 {
ISD::FADD, MVT::v2f64, { 1, 3, 1, 1 } },
1742 {
ISD::FADD, MVT::v4f32, { 1, 3, 1, 1 } },
1744 {
ISD::FSUB, MVT::f64, { 1, 3, 1, 1 } },
1745 {
ISD::FSUB, MVT::f32 , { 1, 3, 1, 1 } },
1746 {
ISD::FSUB, MVT::v2f64, { 1, 3, 1, 1 } },
1747 {
ISD::FSUB, MVT::v4f32, { 1, 3, 1, 1 } },
1749 {
ISD::FMUL, MVT::f64, { 1, 5, 1, 1 } },
1750 {
ISD::FMUL, MVT::f32, { 1, 5, 1, 1 } },
1751 {
ISD::FMUL, MVT::v2f64, { 1, 5, 1, 1 } },
1752 {
ISD::FMUL, MVT::v4f32, { 1, 5, 1, 1 } },
1754 {
ISD::FDIV, MVT::f32, { 14, 14, 1, 1 } },
1755 {
ISD::FDIV, MVT::v4f32, { 14, 14, 1, 1 } },
1756 {
ISD::FDIV, MVT::f64, { 22, 22, 1, 1 } },
1757 {
ISD::FDIV, MVT::v2f64, { 22, 22, 1, 1 } },
1759 {
ISD::MUL, MVT::v2i64, { 6, 10,10,10 } }
1764 if (
auto KindCost = Entry->Cost[CostKind])
1765 return LT.first * *KindCost;
1768 {
ISD::SHL, MVT::v16i8, { 15, 24,17,22 } },
1769 {
ISD::SHL, MVT::v8i16, { 11, 14,11,11 } },
1770 {
ISD::SHL, MVT::v4i32, { 14, 20, 4,10 } },
1772 {
ISD::SRL, MVT::v16i8, { 16, 27,18,24 } },
1773 {
ISD::SRL, MVT::v8i16, { 22, 26,23,27 } },
1774 {
ISD::SRL, MVT::v4i32, { 16, 17,15,19 } },
1775 {
ISD::SRL, MVT::v2i64, { 4, 6, 5, 7 } },
1777 {
ISD::SRA, MVT::v16i8, { 38, 41,30,36 } },
1778 {
ISD::SRA, MVT::v8i16, { 22, 26,23,27 } },
1779 {
ISD::SRA, MVT::v4i32, { 16, 17,15,19 } },
1780 {
ISD::SRA, MVT::v2i64, { 8, 17, 5, 7 } },
1782 {
ISD::MUL, MVT::v4i32, { 2, 11, 1, 1 } }
1787 if (
auto KindCost = Entry->Cost[CostKind])
1788 return LT.first * *KindCost;
1791 {
ISD::MUL, MVT::v16i8, { 5, 18,10,12 } },
1796 if (
auto KindCost = Entry->Cost[CostKind])
1797 return LT.first * *KindCost;
1802 {
ISD::SHL, MVT::v16i8, { 13, 21,26,28 } },
1803 {
ISD::SHL, MVT::v8i16, { 24, 27,16,20 } },
1804 {
ISD::SHL, MVT::v4i32, { 17, 19,10,12 } },
1805 {
ISD::SHL, MVT::v2i64, { 4, 6, 5, 7 } },
1807 {
ISD::SRL, MVT::v16i8, { 14, 28,27,30 } },
1808 {
ISD::SRL, MVT::v8i16, { 16, 19,31,31 } },
1809 {
ISD::SRL, MVT::v4i32, { 12, 12,15,19 } },
1810 {
ISD::SRL, MVT::v2i64, { 4, 6, 5, 7 } },
1812 {
ISD::SRA, MVT::v16i8, { 27, 30,54,54 } },
1813 {
ISD::SRA, MVT::v8i16, { 16, 19,31,31 } },
1814 {
ISD::SRA, MVT::v4i32, { 12, 12,15,19 } },
1815 {
ISD::SRA, MVT::v2i64, { 8, 11,12,16 } },
1817 {
ISD::AND, MVT::v16i8, { 1, 1, 1, 1 } },
1818 {
ISD::AND, MVT::v8i16, { 1, 1, 1, 1 } },
1819 {
ISD::AND, MVT::v4i32, { 1, 1, 1, 1 } },
1820 {
ISD::AND, MVT::v2i64, { 1, 1, 1, 1 } },
1822 {
ISD::OR, MVT::v16i8, { 1, 1, 1, 1 } },
1823 {
ISD::OR, MVT::v8i16, { 1, 1, 1, 1 } },
1824 {
ISD::OR, MVT::v4i32, { 1, 1, 1, 1 } },
1825 {
ISD::OR, MVT::v2i64, { 1, 1, 1, 1 } },
1827 {
ISD::XOR, MVT::v16i8, { 1, 1, 1, 1 } },
1828 {
ISD::XOR, MVT::v8i16, { 1, 1, 1, 1 } },
1829 {
ISD::XOR, MVT::v4i32, { 1, 1, 1, 1 } },
1830 {
ISD::XOR, MVT::v2i64, { 1, 1, 1, 1 } },
1832 {
ISD::ADD, MVT::v2i64, { 1, 2, 1, 2 } },
1833 {
ISD::SUB, MVT::v2i64, { 1, 2, 1, 2 } },
1835 {
ISD::MUL, MVT::v16i8, { 6, 18,12,12 } },
1836 {
ISD::MUL, MVT::v8i16, { 1, 5, 1, 1 } },
1837 {
ISD::MUL, MVT::v4i32, { 6, 8, 7, 7 } },
1838 {
ISD::MUL, MVT::v2i64, { 7, 10,10,10 } },
1840 { X86ISD::PMULUDQ, MVT::v2i64, { 1, 5, 1, 1 } },
1842 {
ISD::FDIV, MVT::f32, { 23, 23, 1, 1 } },
1843 {
ISD::FDIV, MVT::v4f32, { 39, 39, 1, 1 } },
1844 {
ISD::FDIV, MVT::f64, { 38, 38, 1, 1 } },
1845 {
ISD::FDIV, MVT::v2f64, { 69, 69, 1, 1 } },
1847 {
ISD::FNEG, MVT::f32, { 1, 1, 1, 1 } },
1848 {
ISD::FNEG, MVT::f64, { 1, 1, 1, 1 } },
1849 {
ISD::FNEG, MVT::v4f32, { 1, 1, 1, 1 } },
1850 {
ISD::FNEG, MVT::v2f64, { 1, 1, 1, 1 } },
1852 {
ISD::FADD, MVT::f32, { 2, 3, 1, 1 } },
1853 {
ISD::FADD, MVT::f64, { 2, 3, 1, 1 } },
1854 {
ISD::FADD, MVT::v2f64, { 2, 3, 1, 1 } },
1856 {
ISD::FSUB, MVT::f32, { 2, 3, 1, 1 } },
1857 {
ISD::FSUB, MVT::f64, { 2, 3, 1, 1 } },
1858 {
ISD::FSUB, MVT::v2f64, { 2, 3, 1, 1 } },
1860 {
ISD::FMUL, MVT::f64, { 2, 5, 1, 1 } },
1861 {
ISD::FMUL, MVT::v2f64, { 2, 5, 1, 1 } },
1866 if (
auto KindCost = Entry->Cost[CostKind])
1867 return LT.first * *KindCost;
1870 {
ISD::FDIV, MVT::f32, { 17, 18, 1, 1 } },
1871 {
ISD::FDIV, MVT::v4f32, { 34, 48, 1, 1 } },
1873 {
ISD::FNEG, MVT::f32, { 2, 2, 1, 2 } },
1874 {
ISD::FNEG, MVT::v4f32, { 2, 2, 1, 2 } },
1876 {
ISD::FADD, MVT::f32, { 1, 3, 1, 1 } },
1877 {
ISD::FADD, MVT::v4f32, { 2, 3, 1, 1 } },
1879 {
ISD::FSUB, MVT::f32, { 1, 3, 1, 1 } },
1880 {
ISD::FSUB, MVT::v4f32, { 2, 3, 1, 1 } },
1882 {
ISD::FMUL, MVT::f32, { 2, 5, 1, 1 } },
1883 {
ISD::FMUL, MVT::v4f32, { 2, 5, 1, 1 } },
1888 if (
auto KindCost = Entry->Cost[CostKind])
1889 return LT.first * *KindCost;
1894 {
ISD::MUL, MVT::i64, { 2, 6, 1, 2 } },
1899 if (
auto KindCost = Entry->Cost[CostKind])
1900 return LT.first * *KindCost;
1911 {
ISD::MUL, MVT::i8, { 3, 4, 1, 1 } },
1912 {
ISD::MUL, MVT::i16, { 2, 4, 1, 1 } },
1913 {
ISD::MUL, MVT::i32, { 1, 4, 1, 1 } },
1915 {
ISD::FNEG, MVT::f64, { 2, 2, 1, 3 } },
1916 {
ISD::FADD, MVT::f64, { 2, 3, 1, 1 } },
1917 {
ISD::FSUB, MVT::f64, { 2, 3, 1, 1 } },
1918 {
ISD::FMUL, MVT::f64, { 2, 5, 1, 1 } },
1919 {
ISD::FDIV, MVT::f64, { 38, 38, 1, 1 } },
1923 if (
auto KindCost = Entry->Cost[CostKind])
1924 return LT.first * *KindCost;
1938 return 20 * LT.first * LT.second.getVectorNumElements() * ScalarCost;
1979 "Expected the Mask to match the return size if given");
1981 "Expected the same scalar types");
1990 if (!Args.empty() &&
1996 Mask.size() == (2 * SrcTy->getElementCount().getKnownMinValue()) &&
2001 CostKind, Mask, Mask.size() / 2, SrcTy);
2005 if (LT.second != MVT::v4f64 && LT.second != MVT::v4i64)
2019 auto IsBroadcastLoadFoldUser = [&](
const User *U) {
2022 if (U->getType()->isVectorTy())
2027 if (
I->isTerminator() ||
2032 return CB->doesNotAccessMemory() && !CB->mayHaveSideEffects();
2035 auto IsFoldableSLPBroadcastLoad = [&]() {
2043 if (Args[0]->getNumUses() != FVT->getNumElements())
2045 return all_of(Args[0]->
users(), IsBroadcastLoadFoldUser);
2047 if (!Args.empty() &&
2049 IsFoldableSLPBroadcastLoad()) &&
2051 (ST->hasAVX() && LT.second.getScalarSizeInBits() >= 32)))
2058 bool IsInLaneShuffle =
false;
2059 bool IsSingleElementMask =
false;
2060 if (SrcTy->getPrimitiveSizeInBits() > 0 &&
2061 (SrcTy->getPrimitiveSizeInBits() % 128) == 0 &&
2062 SrcTy->getScalarSizeInBits() == LT.second.getScalarSizeInBits() &&
2063 Mask.size() == SrcTy->getElementCount().getKnownMinValue()) {
2064 unsigned NumLanes = SrcTy->getPrimitiveSizeInBits() / 128;
2065 unsigned NumEltsPerLane = Mask.size() / NumLanes;
2066 if ((Mask.size() % NumLanes) == 0) {
2069 ((
P.value() % Mask.size()) / NumEltsPerLane) ==
2070 (
P.index() / NumEltsPerLane);
2072 IsSingleElementMask =
2073 (Mask.size() - 1) ==
static_cast<unsigned>(
count_if(Mask, [](
int M) {
2080 if (LT.second.isVectorOf(MVT::bf16))
2081 LT.second = LT.second.changeVectorElementType(MVT::f16);
2086 int NumElts = LT.second.getVectorNumElements();
2087 if ((Index % NumElts) == 0)
2090 if (SubLT.second.isVector()) {
2091 int NumSubElts = SubLT.second.getVectorNumElements();
2092 if ((Index % NumSubElts) == 0 && (NumElts % NumSubElts) == 0)
2101 if (NumSubElts > OrigSubElts && (Index % OrigSubElts) == 0 &&
2102 (NumSubElts % OrigSubElts) == 0 &&
2103 LT.second.getVectorElementType() ==
2104 SubLT.second.getVectorElementType() &&
2105 LT.second.getVectorElementType().getSizeInBits() ==
2106 SrcTy->getElementType()->getPrimitiveSizeInBits()) {
2107 assert(NumElts >= NumSubElts && NumElts > OrigSubElts &&
2108 "Unexpected number of elements!");
2110 LT.second.getVectorNumElements());
2112 SubLT.second.getVectorNumElements());
2113 int ExtractIndex =
alignDown((Index % NumElts), NumSubElts);
2116 ExtractIndex, SubTy);
2121 return ExtractCost + 1;
2124 "Unexpected vector size");
2126 return ExtractCost + 2;
2140 int NumElts = DstLT.second.getVectorNumElements();
2142 if (SubLT.second.isVector()) {
2143 int NumSubElts = SubLT.second.getVectorNumElements();
2144 bool MatchingTypes =
2145 NumElts == NumSubElts &&
2147 if ((Index % NumSubElts) == 0 && (NumElts % NumSubElts) == 0)
2154 if (LT.first == 1 && LT.second == MVT::v4f32 && SubLT.first == 1 &&
2155 SubLT.second == MVT::f32 && (Index == 0 || ST->hasSSE41()))
2166 EVT VT = TLI->getValueType(
DL, SrcTy);
2200 if (
const auto *Entry =
2202 if (
auto KindCost = Entry->Cost[CostKind])
2203 return LT.first * *KindCost;
2209 if (LT.first != 1) {
2210 MVT LegalVT = LT.second;
2213 SrcTy->getElementType()->getPrimitiveSizeInBits() &&
2216 unsigned VecTySize =
DL.getTypeStoreSize(SrcTy);
2219 unsigned NumOfSrcs = (VecTySize + LegalVTSize - 1) / LegalVTSize;
2226 if (!Mask.empty() && NumOfDests.
isValid()) {
2244 unsigned E = NumOfDests.
getValue();
2245 unsigned NormalizedVF =
2251 unsigned PrevSrcReg = 0;
2255 NormalizedMask, NumOfSrcRegs, NumOfDestRegs, NumOfDestRegs, []() {},
2256 [
this, SingleOpTy, CostKind, &PrevSrcReg, &PrevRegMask,
2261 if (PrevRegMask.
empty() || PrevSrcReg != SrcReg ||
2262 PrevRegMask != RegMask)
2265 SingleOpTy, CostKind, RegMask, 0,
nullptr);
2271 if (SrcReg != DestReg &&
2276 PrevSrcReg = SrcReg;
2277 PrevRegMask = RegMask;
2279 [
this, SingleOpTy, CostKind,
2283 SingleOpTy, CostKind, RegMask, 0,
nullptr);
2290 SingleOpTy, CostKind, {}, 0,
2300 if (LT.first == 1 && IsInLaneShuffle && IsSingleElementMask)
2314 if (
const auto *Entry =
2316 if (
auto KindCost = Entry->Cost[CostKind])
2317 return LT.first * *KindCost;
2323 if (IsInLaneShuffle && ST->hasBWI())
2324 if (
const auto *Entry =
2326 if (
auto KindCost = Entry->Cost[CostKind])
2327 return LT.first * *KindCost;
2361 if (
const auto *Entry =
2363 if (
auto KindCost = Entry->Cost[CostKind])
2364 return LT.first * *KindCost;
2377 if (IsInLaneShuffle && ST->hasAVX512())
2378 if (
const auto *Entry =
2380 if (
auto KindCost = Entry->Cost[CostKind])
2381 return LT.first * *KindCost;
2464 if (ST->hasAVX512())
2465 if (
const auto *Entry =
CostTableLookup(AVX512ShuffleTbl, Kind, LT.second))
2466 if (
auto KindCost = Entry->Cost[CostKind])
2467 return LT.first * *KindCost;
2486 if (IsInLaneShuffle && ST->hasAVX2())
2487 if (
const auto *Entry =
2489 if (
auto KindCost = Entry->Cost[CostKind])
2490 return LT.first * *KindCost;
2540 if (
const auto *Entry =
CostTableLookup(AVX2ShuffleTbl, Kind, LT.second))
2541 if (
auto KindCost = Entry->Cost[CostKind])
2542 return LT.first * *KindCost;
2564 if (
const auto *Entry =
CostTableLookup(XOPShuffleTbl, Kind, LT.second))
2565 if (
auto KindCost = Entry->Cost[CostKind])
2566 return LT.first * *KindCost;
2596 if (IsInLaneShuffle && ST->hasAVX())
2597 if (
const auto *Entry =
2599 if (
auto KindCost = Entry->Cost[CostKind])
2600 return LT.first * *KindCost;
2662 if (
const auto *Entry =
CostTableLookup(AVX1ShuffleTbl, Kind, LT.second))
2663 if (
auto KindCost = Entry->Cost[CostKind])
2664 return LT.first * *KindCost;
2677 if (
const auto *Entry =
CostTableLookup(SSE41ShuffleTbl, Kind, LT.second))
2678 if (
auto KindCost = Entry->Cost[CostKind])
2679 return LT.first * *KindCost;
2706 if (
const auto *Entry =
CostTableLookup(SSSE3ShuffleTbl, Kind, LT.second))
2707 if (
auto KindCost = Entry->Cost[CostKind])
2708 return LT.first * *KindCost;
2762 if (ST->hasSSE2()) {
2765 if (ST->hasSSE3() && IsLoad)
2766 if (
const auto *Entry =
2769 LT.second.getVectorElementCount()) &&
2770 "Table entry missing from isLegalBroadcastLoad()");
2771 return LT.first * Entry->Cost;
2774 if (
const auto *Entry =
CostTableLookup(SSE2ShuffleTbl, Kind, LT.second))
2775 if (
auto KindCost = Entry->Cost[CostKind])
2776 return LT.first * *KindCost;
2788 if (ST->hasSSE1()) {
2789 if (LT.first == 1 && LT.second == MVT::v4f32 && Mask.size() == 4) {
2791 auto MatchSHUFPS = [](
int X,
int Y) {
2792 return X < 0 ||
Y < 0 || ((
X & 4) == (
Y & 4));
2794 if (MatchSHUFPS(Mask[0], Mask[1]) && MatchSHUFPS(Mask[2], Mask[3]))
2797 if (
const auto *Entry =
CostTableLookup(SSE1ShuffleTbl, Kind, LT.second))
2798 if (
auto KindCost = Entry->Cost[CostKind])
2799 return LT.first * *KindCost;
2811 int ISD = TLI->InstructionOpcodeToISD(Opcode);
2823 Src->getScalarSizeInBits() < 32) {
2824 const Use &U = *
I->use_begin();
2827 const Value *
Op =
I->getOperand(0);
2837 if (
A->hasAttribute(Attribute::ZExt))
2840 .countMinLeadingZeros() > 0)
2970 {
ISD::FP_ROUND, MVT::v16f16, MVT::v16f32, { 1, 1, 1, 1 } },
2992 {
ISD::TRUNCATE, MVT::v16i16, MVT::v16i32, { 2, 1, 1, 1 } },
2993 {
ISD::TRUNCATE, MVT::v32i16, MVT::v16i32, { 2, 1, 1, 1 } },
3340 {
ISD::TRUNCATE, MVT::v16i16, MVT::v16i32, { 4, 1, 1, 1 } },
3417 {
ISD::TRUNCATE, MVT::v16i16, MVT::v16i32, { 6, 1, 1, 1 } },
3641 {
ISD::TRUNCATE, MVT::v16i16, MVT::v16i32, {10, 1, 1, 1 } },
3659 EVT SrcTy = TLI->getValueType(
DL, Src);
3660 EVT DstTy = TLI->getValueType(
DL, Dst);
3666 if (
I && Opcode == Instruction::CastOps::SExt &&
3667 SrcTy.isFixedLengthVectorOf(MVT::i1)) {
3669 Type *CmpTy = CmpI->getOperand(0)->getType();
3677 if (SrcTy.isSimple() && DstTy.
isSimple()) {
3678 MVT SimpleSrcTy = SrcTy.getSimpleVT();
3681 if (ST->useAVX512Regs()) {
3684 AVX512BWConversionTbl,
ISD, SimpleDstTy, SimpleSrcTy))
3685 if (
auto KindCost = Entry->Cost[CostKind])
3690 AVX512DQConversionTbl,
ISD, SimpleDstTy, SimpleSrcTy))
3691 if (
auto KindCost = Entry->Cost[CostKind])
3694 if (ST->hasAVX512())
3696 AVX512FConversionTbl,
ISD, SimpleDstTy, SimpleSrcTy))
3697 if (
auto KindCost = Entry->Cost[CostKind])
3703 AVX512BWVLConversionTbl,
ISD, SimpleDstTy, SimpleSrcTy))
3704 if (
auto KindCost = Entry->Cost[CostKind])
3709 AVX512DQVLConversionTbl,
ISD, SimpleDstTy, SimpleSrcTy))
3710 if (
auto KindCost = Entry->Cost[CostKind])
3713 if (ST->hasAVX512())
3715 SimpleDstTy, SimpleSrcTy))
3716 if (
auto KindCost = Entry->Cost[CostKind])
3719 if (ST->hasAVX2()) {
3721 SimpleDstTy, SimpleSrcTy))
3722 if (
auto KindCost = Entry->Cost[CostKind])
3728 SimpleDstTy, SimpleSrcTy))
3729 if (
auto KindCost = Entry->Cost[CostKind])
3733 if (ST->hasF16C()) {
3735 SimpleDstTy, SimpleSrcTy))
3736 if (
auto KindCost = Entry->Cost[CostKind])
3740 if (ST->hasSSE41()) {
3742 SimpleDstTy, SimpleSrcTy))
3743 if (
auto KindCost = Entry->Cost[CostKind])
3747 if (ST->hasSSE2()) {
3749 SimpleDstTy, SimpleSrcTy))
3750 if (
auto KindCost = Entry->Cost[CostKind])
3770 if (ST->useAVX512Regs()) {
3773 AVX512BWConversionTbl,
ISD, LTDest.second, LTSrc.second))
3774 if (
auto KindCost = Entry->Cost[CostKind])
3775 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3779 AVX512DQConversionTbl,
ISD, LTDest.second, LTSrc.second))
3780 if (
auto KindCost = Entry->Cost[CostKind])
3781 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3783 if (ST->hasAVX512())
3785 AVX512FConversionTbl,
ISD, LTDest.second, LTSrc.second))
3786 if (
auto KindCost = Entry->Cost[CostKind])
3787 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3792 LTDest.second, LTSrc.second))
3793 if (
auto KindCost = Entry->Cost[CostKind])
3794 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3798 LTDest.second, LTSrc.second))
3799 if (
auto KindCost = Entry->Cost[CostKind])
3800 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3802 if (ST->hasAVX512())
3804 LTDest.second, LTSrc.second))
3805 if (
auto KindCost = Entry->Cost[CostKind])
3806 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3810 LTDest.second, LTSrc.second))
3811 if (
auto KindCost = Entry->Cost[CostKind])
3812 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3816 LTDest.second, LTSrc.second))
3817 if (
auto KindCost = Entry->Cost[CostKind])
3818 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3820 if (ST->hasF16C()) {
3822 LTDest.second, LTSrc.second))
3823 if (
auto KindCost = Entry->Cost[CostKind])
3824 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3829 LTDest.second, LTSrc.second))
3830 if (
auto KindCost = Entry->Cost[CostKind])
3831 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3835 LTDest.second, LTSrc.second))
3836 if (
auto KindCost = Entry->Cost[CostKind])
3837 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3842 1 < Src->getScalarSizeInBits() && Src->getScalarSizeInBits() < 32) {
3859 1 < Dst->getScalarSizeInBits() && Dst->getScalarSizeInBits() < 32) {
3861 return getCastInstrCost(Instruction::FPToSI, TruncDst, Src, CCH, CostKind) +
3870 return Cost == 0 ? 0 :
N;
4234 {
ISD::FSHL, MVT::v8i64, { 1, 1, 1, 1 } },
4235 {
ISD::FSHL, MVT::v4i64, { 1, 1, 1, 1 } },
4236 {
ISD::FSHL, MVT::v2i64, { 1, 1, 1, 1 } },
4237 {
ISD::FSHL, MVT::v16i32, { 1, 1, 1, 1 } },
4238 {
ISD::FSHL, MVT::v8i32, { 1, 1, 1, 1 } },
4239 {
ISD::FSHL, MVT::v4i32, { 1, 1, 1, 1 } },
4240 {
ISD::FSHL, MVT::v32i16, { 1, 1, 1, 1 } },
4241 {
ISD::FSHL, MVT::v16i16, { 1, 1, 1, 1 } },
4242 {
ISD::FSHL, MVT::v8i16, { 1, 1, 1, 1 } },
4243 {
ISD::ROTL, MVT::v32i16, { 1, 1, 1, 1 } },
4244 {
ISD::ROTL, MVT::v16i16, { 1, 1, 1, 1 } },
4245 {
ISD::ROTL, MVT::v8i16, { 1, 1, 1, 1 } },
4246 {
ISD::ROTR, MVT::v32i16, { 1, 1, 1, 1 } },
4247 {
ISD::ROTR, MVT::v16i16, { 1, 1, 1, 1 } },
4248 {
ISD::ROTR, MVT::v8i16, { 1, 1, 1, 1 } },
4249 { X86ISD::VROTLI, MVT::v32i16, { 1, 1, 1, 1 } },
4250 { X86ISD::VROTLI, MVT::v16i16, { 1, 1, 1, 1 } },
4251 { X86ISD::VROTLI, MVT::v8i16, { 1, 1, 1, 1 } },
4270 {
ISD::CTLZ, MVT::v8i64, { 1, 5, 1, 1 } },
4271 {
ISD::CTLZ, MVT::v16i32, { 1, 5, 1, 1 } },
4272 {
ISD::CTLZ, MVT::v32i16, { 18, 27, 23, 27 } },
4273 {
ISD::CTLZ, MVT::v64i8, { 3, 16, 9, 11 } },
4274 {
ISD::CTLZ, MVT::v4i64, { 1, 5, 1, 1 } },
4275 {
ISD::CTLZ, MVT::v8i32, { 1, 5, 1, 1 } },
4276 {
ISD::CTLZ, MVT::v16i16, { 8, 19, 11, 13 } },
4277 {
ISD::CTLZ, MVT::v32i8, { 2, 11, 9, 10 } },
4278 {
ISD::CTLZ, MVT::v2i64, { 1, 5, 1, 1 } },
4279 {
ISD::CTLZ, MVT::v4i32, { 1, 5, 1, 1 } },
4280 {
ISD::CTLZ, MVT::v8i16, { 3, 15, 4, 6 } },
4281 {
ISD::CTLZ, MVT::v16i8, { 2, 10, 9, 10 } },
4283 {
ISD::CTTZ, MVT::v8i64, { 2, 8, 6, 7 } },
4284 {
ISD::CTTZ, MVT::v16i32, { 2, 8, 6, 7 } },
4285 {
ISD::CTTZ, MVT::v4i64, { 1, 8, 6, 6 } },
4286 {
ISD::CTTZ, MVT::v8i32, { 1, 8, 6, 6 } },
4287 {
ISD::CTTZ, MVT::v2i64, { 1, 8, 6, 6 } },
4288 {
ISD::CTTZ, MVT::v4i32, { 1, 8, 6, 6 } },
4291 {
ISD::ABS, MVT::v32i16, { 1, 1, 1, 1 } },
4292 {
ISD::ABS, MVT::v64i8, { 1, 1, 1, 1 } },
4314 {
ISD::CTLZ, MVT::v8i64, { 8, 22, 23, 23 } },
4315 {
ISD::CTLZ, MVT::v16i32, { 8, 23, 25, 25 } },
4316 {
ISD::CTLZ, MVT::v32i16, { 4, 15, 15, 16 } },
4317 {
ISD::CTLZ, MVT::v64i8, { 3, 12, 10, 9 } },
4318 {
ISD::CTPOP, MVT::v2i64, { 3, 7, 10, 10 } },
4319 {
ISD::CTPOP, MVT::v4i64, { 3, 7, 10, 10 } },
4320 {
ISD::CTPOP, MVT::v8i64, { 3, 8, 10, 12 } },
4321 {
ISD::CTPOP, MVT::v4i32, { 7, 11, 14, 14 } },
4322 {
ISD::CTPOP, MVT::v8i32, { 7, 11, 14, 14 } },
4323 {
ISD::CTPOP, MVT::v16i32, { 7, 12, 14, 16 } },
4324 {
ISD::CTPOP, MVT::v8i16, { 2, 7, 11, 11 } },
4325 {
ISD::CTPOP, MVT::v16i16, { 2, 7, 11, 11 } },
4326 {
ISD::CTPOP, MVT::v32i16, { 3, 7, 11, 13 } },
4330 {
ISD::CTTZ, MVT::v8i16, { 3, 9, 14, 14 } },
4331 {
ISD::CTTZ, MVT::v16i16, { 3, 9, 14, 14 } },
4332 {
ISD::CTTZ, MVT::v32i16, { 3, 10, 14, 16 } },
4333 {
ISD::CTTZ, MVT::v16i8, { 2, 6, 11, 11 } },
4334 {
ISD::CTTZ, MVT::v32i8, { 2, 6, 11, 11 } },
4335 {
ISD::CTTZ, MVT::v64i8, { 3, 7, 11, 13 } },
4338 {
ISD::ROTL, MVT::v32i16, { 2, 8, 6, 8 } },
4339 {
ISD::ROTL, MVT::v16i16, { 2, 8, 6, 7 } },
4340 {
ISD::ROTL, MVT::v8i16, { 2, 7, 6, 7 } },
4341 {
ISD::ROTL, MVT::v64i8, { 5, 6, 11, 12 } },
4342 {
ISD::ROTL, MVT::v32i8, { 5, 15, 7, 10 } },
4343 {
ISD::ROTL, MVT::v16i8, { 5, 15, 7, 10 } },
4344 {
ISD::ROTR, MVT::v32i16, { 2, 8, 6, 8 } },
4345 {
ISD::ROTR, MVT::v16i16, { 2, 8, 6, 7 } },
4346 {
ISD::ROTR, MVT::v8i16, { 2, 7, 6, 7 } },
4347 {
ISD::ROTR, MVT::v64i8, { 5, 6, 12, 14 } },
4348 {
ISD::ROTR, MVT::v32i8, { 5, 14, 6, 9 } },
4349 {
ISD::ROTR, MVT::v16i8, { 5, 14, 6, 9 } },
4350 { X86ISD::VROTLI, MVT::v32i16, { 2, 5, 3, 3 } },
4351 { X86ISD::VROTLI, MVT::v16i16, { 1, 5, 3, 3 } },
4352 { X86ISD::VROTLI, MVT::v8i16, { 1, 5, 3, 3 } },
4353 { X86ISD::VROTLI, MVT::v64i8, { 2, 9, 3, 4 } },
4354 { X86ISD::VROTLI, MVT::v32i8, { 1, 9, 3, 4 } },
4355 { X86ISD::VROTLI, MVT::v16i8, { 1, 8, 3, 4 } },
4358 {
ISD::SMAX, MVT::v32i16, { 1, 1, 1, 1 } },
4359 {
ISD::SMAX, MVT::v64i8, { 1, 1, 1, 1 } },
4360 {
ISD::SMIN, MVT::v32i16, { 1, 1, 1, 1 } },
4361 {
ISD::SMIN, MVT::v64i8, { 1, 1, 1, 1 } },
4363 {
ISD::SMULO, MVT::v64i8, { 8, 21, 17, 18 } },
4365 {
ISD::UMULO, MVT::v64i8, { 8, 15, 15, 16 } },
4370 {
ISD::UMAX, MVT::v32i16, { 1, 1, 1, 1 } },
4371 {
ISD::UMAX, MVT::v64i8, { 1, 1, 1, 1 } },
4372 {
ISD::UMIN, MVT::v32i16, { 1, 1, 1, 1 } },
4373 {
ISD::UMIN, MVT::v64i8, { 1, 1, 1, 1 } },
4378 {
ISD::ABS, MVT::v8i64, { 1, 1, 1, 1 } },
4379 {
ISD::ABS, MVT::v4i64, { 1, 1, 1, 1 } },
4380 {
ISD::ABS, MVT::v2i64, { 1, 1, 1, 1 } },
4381 {
ISD::ABS, MVT::v16i32, { 1, 1, 1, 1 } },
4382 {
ISD::ABS, MVT::v8i32, { 1, 1, 1, 1 } },
4383 {
ISD::ABS, MVT::v32i16, { 2, 7, 4, 4 } },
4384 {
ISD::ABS, MVT::v16i16, { 1, 1, 1, 1 } },
4385 {
ISD::ABS, MVT::v64i8, { 2, 7, 4, 4 } },
4386 {
ISD::ABS, MVT::v32i8, { 1, 1, 1, 1 } },
4394 {
ISD::CTLZ, MVT::v8i64, { 10, 28, 32, 32 } },
4395 {
ISD::CTLZ, MVT::v16i32, { 12, 30, 38, 38 } },
4396 {
ISD::CTLZ, MVT::v32i16, { 8, 15, 29, 29 } },
4397 {
ISD::CTLZ, MVT::v64i8, { 6, 11, 19, 19 } },
4398 {
ISD::CTPOP, MVT::v8i64, { 16, 16, 19, 19 } },
4399 {
ISD::CTPOP, MVT::v16i32, { 24, 19, 27, 27 } },
4400 {
ISD::CTPOP, MVT::v32i16, { 18, 15, 22, 22 } },
4401 {
ISD::CTPOP, MVT::v64i8, { 12, 11, 16, 16 } },
4402 {
ISD::CTTZ, MVT::v8i64, { 2, 8, 6, 7 } },
4403 {
ISD::CTTZ, MVT::v16i32, { 2, 8, 6, 7 } },
4404 {
ISD::CTTZ, MVT::v32i16, { 7, 17, 27, 27 } },
4405 {
ISD::CTTZ, MVT::v64i8, { 6, 13, 21, 21 } },
4406 {
ISD::MULHS, MVT::v16i32, { 3, 10, 6, 7 } },
4410 {
ISD::MULHU, MVT::v16i32, { 3, 10, 6, 7 } },
4414 {
ISD::ROTL, MVT::v8i64, { 1, 1, 1, 1 } },
4415 {
ISD::ROTL, MVT::v4i64, { 1, 1, 1, 1 } },
4416 {
ISD::ROTL, MVT::v2i64, { 1, 1, 1, 1 } },
4417 {
ISD::ROTL, MVT::v16i32, { 1, 1, 1, 1 } },
4418 {
ISD::ROTL, MVT::v8i32, { 1, 1, 1, 1 } },
4419 {
ISD::ROTL, MVT::v4i32, { 1, 1, 1, 1 } },
4420 {
ISD::ROTR, MVT::v8i64, { 1, 1, 1, 1 } },
4421 {
ISD::ROTR, MVT::v4i64, { 1, 1, 1, 1 } },
4422 {
ISD::ROTR, MVT::v2i64, { 1, 1, 1, 1 } },
4423 {
ISD::ROTR, MVT::v16i32, { 1, 1, 1, 1 } },
4424 {
ISD::ROTR, MVT::v8i32, { 1, 1, 1, 1 } },
4425 {
ISD::ROTR, MVT::v4i32, { 1, 1, 1, 1 } },
4426 { X86ISD::VROTLI, MVT::v8i64, { 1, 1, 1, 1 } },
4427 { X86ISD::VROTLI, MVT::v4i64, { 1, 1, 1, 1 } },
4428 { X86ISD::VROTLI, MVT::v2i64, { 1, 1, 1, 1 } },
4429 { X86ISD::VROTLI, MVT::v16i32, { 1, 1, 1, 1 } },
4430 { X86ISD::VROTLI, MVT::v8i32, { 1, 1, 1, 1 } },
4431 { X86ISD::VROTLI, MVT::v4i32, { 1, 1, 1, 1 } },
4440 {
ISD::SMAX, MVT::v8i64, { 1, 3, 1, 1 } },
4441 {
ISD::SMAX, MVT::v16i32, { 1, 1, 1, 1 } },
4442 {
ISD::SMAX, MVT::v32i16, { 3, 7, 5, 5 } },
4443 {
ISD::SMAX, MVT::v64i8, { 3, 7, 5, 5 } },
4444 {
ISD::SMAX, MVT::v4i64, { 1, 3, 1, 1 } },
4445 {
ISD::SMAX, MVT::v2i64, { 1, 3, 1, 1 } },
4446 {
ISD::SMIN, MVT::v8i64, { 1, 3, 1, 1 } },
4447 {
ISD::SMIN, MVT::v16i32, { 1, 1, 1, 1 } },
4448 {
ISD::SMIN, MVT::v32i16, { 3, 7, 5, 5 } },
4449 {
ISD::SMIN, MVT::v64i8, { 3, 7, 5, 5 } },
4450 {
ISD::SMIN, MVT::v4i64, { 1, 3, 1, 1 } },
4451 {
ISD::SMIN, MVT::v2i64, { 1, 3, 1, 1 } },
4452 {
ISD::SMULO, MVT::v8i64, { 44, 44, 81, 93 } },
4453 {
ISD::SMULO, MVT::v16i32, { 5, 12, 9, 11 } },
4454 {
ISD::SMULO, MVT::v32i16, { 6, 12, 17, 17 } },
4455 {
ISD::SMULO, MVT::v64i8, { 22, 28, 42, 42 } },
4464 {
ISD::UMAX, MVT::v8i64, { 1, 3, 1, 1 } },
4465 {
ISD::UMAX, MVT::v16i32, { 1, 1, 1, 1 } },
4466 {
ISD::UMAX, MVT::v32i16, { 3, 7, 5, 5 } },
4467 {
ISD::UMAX, MVT::v64i8, { 3, 7, 5, 5 } },
4468 {
ISD::UMAX, MVT::v4i64, { 1, 3, 1, 1 } },
4469 {
ISD::UMAX, MVT::v2i64, { 1, 3, 1, 1 } },
4470 {
ISD::UMIN, MVT::v8i64, { 1, 3, 1, 1 } },
4471 {
ISD::UMIN, MVT::v16i32, { 1, 1, 1, 1 } },
4472 {
ISD::UMIN, MVT::v32i16, { 3, 7, 5, 5 } },
4473 {
ISD::UMIN, MVT::v64i8, { 3, 7, 5, 5 } },
4474 {
ISD::UMIN, MVT::v4i64, { 1, 3, 1, 1 } },
4475 {
ISD::UMIN, MVT::v2i64, { 1, 3, 1, 1 } },
4476 {
ISD::UMULO, MVT::v8i64, { 52, 52, 95, 104} },
4477 {
ISD::UMULO, MVT::v16i32, { 5, 12, 8, 10 } },
4478 {
ISD::UMULO, MVT::v32i16, { 5, 13, 16, 16 } },
4479 {
ISD::UMULO, MVT::v64i8, { 18, 24, 30, 30 } },
4506 {
ISD::FSQRT, MVT::v16f32, { 12, 20, 1, 3 } },
4509 {
ISD::FSQRT, MVT::v4f64, { 12, 18, 1, 1 } },
4510 {
ISD::FSQRT, MVT::v8f64, { 24, 32, 1, 3 } },
4526 {
ISD::ROTL, MVT::v4i64, { 4, 7, 5, 6 } },
4527 {
ISD::ROTL, MVT::v8i32, { 4, 7, 5, 6 } },
4528 {
ISD::ROTL, MVT::v16i16, { 4, 7, 5, 6 } },
4529 {
ISD::ROTL, MVT::v32i8, { 4, 7, 5, 6 } },
4530 {
ISD::ROTL, MVT::v2i64, { 1, 3, 1, 1 } },
4531 {
ISD::ROTL, MVT::v4i32, { 1, 3, 1, 1 } },
4532 {
ISD::ROTL, MVT::v8i16, { 1, 3, 1, 1 } },
4533 {
ISD::ROTL, MVT::v16i8, { 1, 3, 1, 1 } },
4534 {
ISD::ROTR, MVT::v4i64, { 4, 7, 8, 9 } },
4535 {
ISD::ROTR, MVT::v8i32, { 4, 7, 8, 9 } },
4536 {
ISD::ROTR, MVT::v16i16, { 4, 7, 8, 9 } },
4537 {
ISD::ROTR, MVT::v32i8, { 4, 7, 8, 9 } },
4538 {
ISD::ROTR, MVT::v2i64, { 1, 3, 3, 3 } },
4539 {
ISD::ROTR, MVT::v4i32, { 1, 3, 3, 3 } },
4540 {
ISD::ROTR, MVT::v8i16, { 1, 3, 3, 3 } },
4541 {
ISD::ROTR, MVT::v16i8, { 1, 3, 3, 3 } },
4542 { X86ISD::VROTLI, MVT::v4i64, { 4, 7, 5, 6 } },
4543 { X86ISD::VROTLI, MVT::v8i32, { 4, 7, 5, 6 } },
4544 { X86ISD::VROTLI, MVT::v16i16, { 4, 7, 5, 6 } },
4545 { X86ISD::VROTLI, MVT::v32i8, { 4, 7, 5, 6 } },
4546 { X86ISD::VROTLI, MVT::v2i64, { 1, 3, 1, 1 } },
4547 { X86ISD::VROTLI, MVT::v4i32, { 1, 3, 1, 1 } },
4548 { X86ISD::VROTLI, MVT::v8i16, { 1, 3, 1, 1 } },
4549 { X86ISD::VROTLI, MVT::v16i8, { 1, 3, 1, 1 } },
4552 {
ISD::ABS, MVT::v2i64, { 2, 4, 3, 5 } },
4553 {
ISD::ABS, MVT::v4i64, { 2, 4, 3, 5 } },
4554 {
ISD::ABS, MVT::v4i32, { 1, 1, 1, 1 } },
4555 {
ISD::ABS, MVT::v8i32, { 1, 1, 1, 2 } },
4556 {
ISD::ABS, MVT::v8i16, { 1, 1, 1, 1 } },
4557 {
ISD::ABS, MVT::v16i16, { 1, 1, 1, 2 } },
4558 {
ISD::ABS, MVT::v16i8, { 1, 1, 1, 1 } },
4559 {
ISD::ABS, MVT::v32i8, { 1, 1, 1, 2 } },
4574 {
ISD::CTLZ, MVT::v2i64, { 7, 18, 24, 25 } },
4575 {
ISD::CTLZ, MVT::v4i64, { 14, 18, 24, 44 } },
4576 {
ISD::CTLZ, MVT::v4i32, { 5, 16, 19, 20 } },
4577 {
ISD::CTLZ, MVT::v8i32, { 10, 16, 19, 34 } },
4578 {
ISD::CTLZ, MVT::v8i16, { 4, 13, 14, 15 } },
4579 {
ISD::CTLZ, MVT::v16i16, { 6, 14, 14, 24 } },
4580 {
ISD::CTLZ, MVT::v16i8, { 3, 12, 9, 10 } },
4581 {
ISD::CTLZ, MVT::v32i8, { 4, 12, 9, 14 } },
4582 {
ISD::CTPOP, MVT::v2i64, { 3, 9, 10, 10 } },
4583 {
ISD::CTPOP, MVT::v4i64, { 4, 9, 10, 14 } },
4584 {
ISD::CTPOP, MVT::v4i32, { 7, 12, 14, 14 } },
4585 {
ISD::CTPOP, MVT::v8i32, { 7, 12, 14, 18 } },
4586 {
ISD::CTPOP, MVT::v8i16, { 3, 7, 11, 11 } },
4587 {
ISD::CTPOP, MVT::v16i16, { 6, 8, 11, 18 } },
4590 {
ISD::CTTZ, MVT::v2i64, { 4, 11, 13, 13 } },
4591 {
ISD::CTTZ, MVT::v4i64, { 5, 11, 13, 20 } },
4592 {
ISD::CTTZ, MVT::v4i32, { 7, 14, 17, 17 } },
4593 {
ISD::CTTZ, MVT::v8i32, { 7, 15, 17, 24 } },
4594 {
ISD::CTTZ, MVT::v8i16, { 4, 9, 14, 14 } },
4595 {
ISD::CTTZ, MVT::v16i16, { 6, 9, 14, 24 } },
4596 {
ISD::CTTZ, MVT::v16i8, { 3, 7, 11, 11 } },
4597 {
ISD::CTTZ, MVT::v32i8, { 5, 7, 11, 18 } },
4608 {
ISD::SMAX, MVT::v2i64, { 2, 7, 2, 3 } },
4609 {
ISD::SMAX, MVT::v4i64, { 2, 7, 2, 3 } },
4610 {
ISD::SMAX, MVT::v8i32, { 1, 1, 1, 2 } },
4611 {
ISD::SMAX, MVT::v16i16, { 1, 1, 1, 2 } },
4612 {
ISD::SMAX, MVT::v32i8, { 1, 1, 1, 2 } },
4613 {
ISD::SMIN, MVT::v2i64, { 2, 7, 2, 3 } },
4614 {
ISD::SMIN, MVT::v4i64, { 2, 7, 2, 3 } },
4615 {
ISD::SMIN, MVT::v8i32, { 1, 1, 1, 2 } },
4616 {
ISD::SMIN, MVT::v16i16, { 1, 1, 1, 2 } },
4617 {
ISD::SMIN, MVT::v32i8, { 1, 1, 1, 2 } },
4618 {
ISD::SMULO, MVT::v4i64, { 20, 20, 33, 37 } },
4619 {
ISD::SMULO, MVT::v2i64, { 8, 8, 13, 15 } },
4620 {
ISD::SMULO, MVT::v8i32, { 8, 20, 13, 24 } },
4621 {
ISD::SMULO, MVT::v4i32, { 5, 15, 11, 12 } },
4622 {
ISD::SMULO, MVT::v16i16, { 4, 14, 8, 14 } },
4624 {
ISD::SMULO, MVT::v32i8, { 9, 15, 18, 35 } },
4625 {
ISD::SMULO, MVT::v16i8, { 6, 22, 14, 21 } },
4637 {
ISD::UMAX, MVT::v2i64, { 2, 8, 5, 6 } },
4638 {
ISD::UMAX, MVT::v4i64, { 2, 8, 5, 8 } },
4639 {
ISD::UMAX, MVT::v8i32, { 1, 1, 1, 2 } },
4640 {
ISD::UMAX, MVT::v16i16, { 1, 1, 1, 2 } },
4641 {
ISD::UMAX, MVT::v32i8, { 1, 1, 1, 2 } },
4642 {
ISD::UMIN, MVT::v2i64, { 2, 8, 5, 6 } },
4643 {
ISD::UMIN, MVT::v4i64, { 2, 8, 5, 8 } },
4644 {
ISD::UMIN, MVT::v8i32, { 1, 1, 1, 2 } },
4645 {
ISD::UMIN, MVT::v16i16, { 1, 1, 1, 2 } },
4646 {
ISD::UMIN, MVT::v32i8, { 1, 1, 1, 2 } },
4647 {
ISD::UMULO, MVT::v4i64, { 24, 24, 39, 43 } },
4648 {
ISD::UMULO, MVT::v2i64, { 10, 10, 15, 19 } },
4649 {
ISD::UMULO, MVT::v8i32, { 8, 11, 13, 23 } },
4650 {
ISD::UMULO, MVT::v4i32, { 5, 12, 11, 12 } },
4651 {
ISD::UMULO, MVT::v16i16, { 4, 6, 8, 13 } },
4653 {
ISD::UMULO, MVT::v32i8, { 9, 13, 17, 33 } },
4654 {
ISD::UMULO, MVT::v16i8, { 6, 19, 13, 20 } },
4668 {
ISD::FSQRT, MVT::v8f32, { 14, 21, 1, 3 } },
4670 {
ISD::FSQRT, MVT::v2f64, { 14, 21, 1, 1 } },
4671 {
ISD::FSQRT, MVT::v4f64, { 28, 35, 1, 3 } },
4674 {
ISD::ABS, MVT::v4i64, { 6, 8, 6, 12 } },
4675 {
ISD::ABS, MVT::v8i32, { 3, 6, 4, 5 } },
4676 {
ISD::ABS, MVT::v16i16, { 3, 6, 4, 5 } },
4677 {
ISD::ABS, MVT::v32i8, { 3, 6, 4, 5 } },
4690 {
ISD::BSWAP, MVT::v16i16, { 5, 6, 5, 10 } },
4692 {
ISD::CTLZ, MVT::v4i64, { 29, 33, 49, 58 } },
4693 {
ISD::CTLZ, MVT::v2i64, { 14, 24, 24, 28 } },
4694 {
ISD::CTLZ, MVT::v8i32, { 24, 28, 39, 48 } },
4695 {
ISD::CTLZ, MVT::v4i32, { 12, 20, 19, 23 } },
4696 {
ISD::CTLZ, MVT::v16i16, { 19, 22, 29, 38 } },
4697 {
ISD::CTLZ, MVT::v8i16, { 9, 16, 14, 18 } },
4698 {
ISD::CTLZ, MVT::v32i8, { 14, 15, 19, 28 } },
4699 {
ISD::CTLZ, MVT::v16i8, { 7, 12, 9, 13 } },
4700 {
ISD::CTPOP, MVT::v4i64, { 14, 18, 19, 28 } },
4701 {
ISD::CTPOP, MVT::v2i64, { 7, 14, 10, 14 } },
4702 {
ISD::CTPOP, MVT::v8i32, { 18, 24, 27, 36 } },
4703 {
ISD::CTPOP, MVT::v4i32, { 9, 20, 14, 18 } },
4704 {
ISD::CTPOP, MVT::v16i16, { 16, 21, 22, 31 } },
4705 {
ISD::CTPOP, MVT::v8i16, { 8, 18, 11, 15 } },
4706 {
ISD::CTPOP, MVT::v32i8, { 13, 15, 16, 25 } },
4707 {
ISD::CTPOP, MVT::v16i8, { 6, 12, 8, 12 } },
4708 {
ISD::CTTZ, MVT::v4i64, { 17, 22, 24, 33 } },
4709 {
ISD::CTTZ, MVT::v2i64, { 9, 19, 13, 17 } },
4710 {
ISD::CTTZ, MVT::v8i32, { 21, 27, 32, 41 } },
4711 {
ISD::CTTZ, MVT::v4i32, { 11, 24, 17, 21 } },
4712 {
ISD::CTTZ, MVT::v16i16, { 18, 24, 27, 36 } },
4713 {
ISD::CTTZ, MVT::v8i16, { 9, 21, 14, 18 } },
4714 {
ISD::CTTZ, MVT::v32i8, { 15, 18, 21, 30 } },
4715 {
ISD::CTTZ, MVT::v16i8, { 8, 16, 11, 15 } },
4716 {
ISD::MULHS, MVT::v8i32, { 9, 11, 14, 18 } },
4718 {
ISD::MULHU, MVT::v8i32, { 9, 11, 14, 18 } },
4725 {
ISD::SMAX, MVT::v4i64, { 6, 9, 6, 12 } },
4726 {
ISD::SMAX, MVT::v2i64, { 3, 7, 2, 4 } },
4727 {
ISD::SMAX, MVT::v8i32, { 4, 6, 5, 6 } },
4728 {
ISD::SMAX, MVT::v16i16, { 4, 6, 5, 6 } },
4729 {
ISD::SMAX, MVT::v32i8, { 4, 6, 5, 6 } },
4730 {
ISD::SMIN, MVT::v4i64, { 6, 9, 6, 12 } },
4731 {
ISD::SMIN, MVT::v2i64, { 3, 7, 2, 3 } },
4732 {
ISD::SMIN, MVT::v8i32, { 4, 6, 5, 6 } },
4733 {
ISD::SMIN, MVT::v16i16, { 4, 6, 5, 6 } },
4734 {
ISD::SMIN, MVT::v32i8, { 4, 6, 5, 6 } },
4735 {
ISD::SMULO, MVT::v4i64, { 20, 20, 33, 37 } },
4736 {
ISD::SMULO, MVT::v2i64, { 9, 9, 13, 17 } },
4737 {
ISD::SMULO, MVT::v8i32, { 15, 20, 24, 29 } },
4738 {
ISD::SMULO, MVT::v4i32, { 7, 15, 11, 13 } },
4739 {
ISD::SMULO, MVT::v16i16, { 8, 14, 14, 15 } },
4741 {
ISD::SMULO, MVT::v32i8, { 20, 20, 37, 39 } },
4742 {
ISD::SMULO, MVT::v16i8, { 9, 22, 18, 21 } },
4753 {
ISD::UMAX, MVT::v4i64, { 9, 10, 11, 17 } },
4754 {
ISD::UMAX, MVT::v2i64, { 4, 8, 5, 7 } },
4755 {
ISD::UMAX, MVT::v8i32, { 4, 6, 5, 6 } },
4756 {
ISD::UMAX, MVT::v16i16, { 4, 6, 5, 6 } },
4757 {
ISD::UMAX, MVT::v32i8, { 4, 6, 5, 6 } },
4758 {
ISD::UMIN, MVT::v4i64, { 9, 10, 11, 17 } },
4759 {
ISD::UMIN, MVT::v2i64, { 4, 8, 5, 7 } },
4760 {
ISD::UMIN, MVT::v8i32, { 4, 6, 5, 6 } },
4761 {
ISD::UMIN, MVT::v16i16, { 4, 6, 5, 6 } },
4762 {
ISD::UMIN, MVT::v32i8, { 4, 6, 5, 6 } },
4763 {
ISD::UMULO, MVT::v4i64, { 24, 26, 39, 45 } },
4764 {
ISD::UMULO, MVT::v2i64, { 10, 12, 15, 20 } },
4765 {
ISD::UMULO, MVT::v8i32, { 14, 15, 23, 28 } },
4766 {
ISD::UMULO, MVT::v4i32, { 7, 12, 11, 13 } },
4767 {
ISD::UMULO, MVT::v16i16, { 7, 11, 13, 14 } },
4769 {
ISD::UMULO, MVT::v32i8, { 19, 19, 35, 37 } },
4770 {
ISD::UMULO, MVT::v16i8, { 9, 19, 17, 20 } },
4784 {
ISD::FSQRT, MVT::v4f32, { 21, 21, 1, 1 } },
4785 {
ISD::FSQRT, MVT::v8f32, { 42, 42, 1, 3 } },
4787 {
ISD::FSQRT, MVT::v2f64, { 27, 27, 1, 1 } },
4788 {
ISD::FSQRT, MVT::v4f64, { 54, 54, 1, 3 } },
4807 { X86ISD::VROTLI, MVT::v16i8, { 1, 6, 1, 2 } },
4808 { X86ISD::VROTLI, MVT::v32i8, { 1, 6, 1, 2 } },
4809 { X86ISD::VROTLI, MVT::v64i8, { 1, 6, 1, 2 } },
4813 {
ISD::FSQRT, MVT::v4f32, { 37, 41, 1, 5 } },
4815 {
ISD::FSQRT, MVT::v2f64, { 67, 71, 1, 5 } },
4822 {
ISD::FSQRT, MVT::v4f32, { 40, 41, 1, 5 } },
4824 {
ISD::FSQRT, MVT::v2f64, { 70, 71, 1, 5 } },
4832 {
ISD::FSQRT, MVT::v4f32, { 18, 18, 1, 1 } },
4835 {
ISD::ABS, MVT::v2i64, { 3, 4, 3, 5 } },
4842 {
ISD::SMAX, MVT::v2i64, { 3, 7, 2, 3 } },
4843 {
ISD::SMAX, MVT::v4i32, { 1, 1, 1, 1 } },
4844 {
ISD::SMAX, MVT::v16i8, { 1, 1, 1, 1 } },
4845 {
ISD::SMIN, MVT::v2i64, { 3, 7, 2, 3 } },
4846 {
ISD::SMIN, MVT::v4i32, { 1, 1, 1, 1 } },
4847 {
ISD::SMIN, MVT::v16i8, { 1, 1, 1, 1 } },
4848 {
ISD::SMULO, MVT::v2i64, { 9, 11, 13, 17 } },
4849 {
ISD::SMULO, MVT::v4i32, { 20, 24, 13, 19 } },
4851 {
ISD::SMULO, MVT::v16i8, { 13, 22, 24, 25 } },
4856 {
ISD::UMAX, MVT::v2i64, { 2, 11, 6, 7 } },
4857 {
ISD::UMAX, MVT::v4i32, { 1, 1, 1, 1 } },
4858 {
ISD::UMAX, MVT::v8i16, { 1, 1, 1, 1 } },
4859 {
ISD::UMIN, MVT::v2i64, { 2, 11, 6, 7 } },
4860 {
ISD::UMIN, MVT::v4i32, { 1, 1, 1, 1 } },
4861 {
ISD::UMIN, MVT::v8i16, { 1, 1, 1, 1 } },
4862 {
ISD::UMULO, MVT::v2i64, { 14, 20, 15, 20 } },
4863 {
ISD::UMULO, MVT::v4i32, { 19, 22, 12, 18 } },
4865 {
ISD::UMULO, MVT::v16i8, { 13, 19, 18, 20 } },
4868 {
ISD::ABS, MVT::v4i32, { 1, 2, 1, 1 } },
4869 {
ISD::ABS, MVT::v8i16, { 1, 2, 1, 1 } },
4870 {
ISD::ABS, MVT::v16i8, { 1, 2, 1, 1 } },
4878 {
ISD::CTLZ, MVT::v2i64, { 18, 28, 28, 35 } },
4879 {
ISD::CTLZ, MVT::v4i32, { 15, 20, 22, 28 } },
4880 {
ISD::CTLZ, MVT::v8i16, { 13, 17, 16, 22 } },
4881 {
ISD::CTLZ, MVT::v16i8, { 11, 15, 10, 16 } },
4882 {
ISD::CTPOP, MVT::v2i64, { 13, 19, 12, 18 } },
4883 {
ISD::CTPOP, MVT::v4i32, { 18, 24, 16, 22 } },
4884 {
ISD::CTPOP, MVT::v8i16, { 13, 18, 14, 20 } },
4885 {
ISD::CTPOP, MVT::v16i8, { 11, 12, 10, 16 } },
4886 {
ISD::CTTZ, MVT::v2i64, { 13, 25, 15, 22 } },
4887 {
ISD::CTTZ, MVT::v4i32, { 18, 26, 19, 25 } },
4888 {
ISD::CTTZ, MVT::v8i16, { 13, 20, 17, 23 } },
4889 {
ISD::CTTZ, MVT::v16i8, { 11, 16, 13, 19 } }
4892 {
ISD::ABS, MVT::v2i64, { 3, 6, 5, 5 } },
4893 {
ISD::ABS, MVT::v4i32, { 1, 4, 4, 4 } },
4894 {
ISD::ABS, MVT::v8i16, { 1, 2, 3, 3 } },
4895 {
ISD::ABS, MVT::v16i8, { 1, 2, 3, 3 } },
4900 {
ISD::BSWAP, MVT::v2i64, { 5, 6, 11, 11 } },
4903 {
ISD::CTLZ, MVT::v2i64, { 10, 45, 36, 38 } },
4904 {
ISD::CTLZ, MVT::v4i32, { 10, 45, 38, 40 } },
4905 {
ISD::CTLZ, MVT::v8i16, { 9, 38, 32, 34 } },
4906 {
ISD::CTLZ, MVT::v16i8, { 8, 39, 29, 32 } },
4907 {
ISD::CTPOP, MVT::v2i64, { 12, 26, 16, 18 } },
4908 {
ISD::CTPOP, MVT::v4i32, { 15, 29, 21, 23 } },
4909 {
ISD::CTPOP, MVT::v8i16, { 13, 25, 18, 20 } },
4910 {
ISD::CTPOP, MVT::v16i8, { 10, 21, 14, 16 } },
4911 {
ISD::CTTZ, MVT::v2i64, { 14, 28, 19, 21 } },
4912 {
ISD::CTTZ, MVT::v4i32, { 18, 31, 24, 26 } },
4913 {
ISD::CTTZ, MVT::v8i16, { 16, 27, 21, 23 } },
4914 {
ISD::CTTZ, MVT::v16i8, { 13, 23, 17, 19 } },
4915 {
ISD::MULHS, MVT::v4i32, { 5, 11, 15, 15 } },
4923 {
ISD::SMAX, MVT::v2i64, { 4, 8, 15, 15 } },
4924 {
ISD::SMAX, MVT::v4i32, { 2, 4, 5, 5 } },
4925 {
ISD::SMAX, MVT::v8i16, { 1, 1, 1, 1 } },
4926 {
ISD::SMAX, MVT::v16i8, { 2, 4, 5, 5 } },
4927 {
ISD::SMIN, MVT::v2i64, { 4, 8, 15, 15 } },
4928 {
ISD::SMIN, MVT::v4i32, { 2, 4, 5, 5 } },
4929 {
ISD::SMIN, MVT::v8i16, { 1, 1, 1, 1 } },
4930 {
ISD::SMIN, MVT::v16i8, { 2, 4, 5, 5 } },
4931 {
ISD::SMULO, MVT::v2i64, { 30, 33, 13, 23 } },
4932 {
ISD::SMULO, MVT::v4i32, { 20, 24, 23, 23 } },
4934 {
ISD::SMULO, MVT::v16i8, { 13, 23, 24, 25 } },
4943 {
ISD::UMAX, MVT::v2i64, { 4, 8, 15, 15 } },
4944 {
ISD::UMAX, MVT::v4i32, { 2, 5, 8, 8 } },
4945 {
ISD::UMAX, MVT::v8i16, { 1, 3, 3, 3 } },
4946 {
ISD::UMAX, MVT::v16i8, { 1, 1, 1, 1 } },
4947 {
ISD::UMIN, MVT::v2i64, { 4, 8, 15, 15 } },
4948 {
ISD::UMIN, MVT::v4i32, { 2, 5, 8, 8 } },
4949 {
ISD::UMIN, MVT::v8i16, { 1, 3, 3, 3 } },
4950 {
ISD::UMIN, MVT::v16i8, { 1, 1, 1, 1 } },
4951 {
ISD::UMULO, MVT::v2i64, { 30, 33, 15, 29 } },
4952 {
ISD::UMULO, MVT::v4i32, { 19, 22, 14, 18 } },
4954 {
ISD::UMULO, MVT::v16i8, { 13, 19, 20, 20 } },
4962 {
ISD::FSQRT, MVT::v2f64, { 32, 32, 1, 1 } },
4968 {
ISD::FSQRT, MVT::v4f32, { 56, 56, 1, 2 } },
4971 {
ISD::CTTZ, MVT::i64, { 1, 1, 1, 1 } },
4974 {
ISD::CTTZ, MVT::i32, { 1, 1, 1, 1 } },
4975 {
ISD::CTTZ, MVT::i16, { 2, 1, 1, 1 } },
4979 {
ISD::CTLZ, MVT::i64, { 1, 1, 1, 1 } },
4982 {
ISD::CTLZ, MVT::i32, { 1, 1, 1, 1 } },
4983 {
ISD::CTLZ, MVT::i16, { 2, 1, 1, 1 } },
4996 {
ISD::CLMUL, MVT::v4i32, { 8, 18, 12, 16 } },
5003 {
ISD::ABS, MVT::i64, { 1, 2, 3, 3 } },
5006 {
ISD::CTLZ, MVT::i64, { 1, 2, 3, 3 } },
5007 {
ISD::CTLZ, MVT::i32, { 1, 2, 3, 3 } },
5008 {
ISD::CTLZ, MVT::i16, { 2, 2, 3, 3 } },
5011 {
ISD::CTTZ, MVT::i64, { 1, 2, 2, 2 } },
5012 {
ISD::CTTZ, MVT::i32, { 1, 2, 2, 2 } },
5013 {
ISD::CTTZ, MVT::i16, { 2, 2, 2, 2 } },
5017 {
ISD::ROTL, MVT::i64, { 2, 3, 1, 3 } },
5018 {
ISD::ROTR, MVT::i64, { 2, 3, 1, 3 } },
5019 { X86ISD::VROTLI, MVT::i64, { 1, 1, 1, 1 } },
5020 {
ISD::FSHL, MVT::i64, { 4, 4, 1, 4 } },
5025 {
ISD::SMAX, MVT::i64, { 1, 3, 2, 3 } },
5026 {
ISD::SMIN, MVT::i64, { 1, 3, 2, 3 } },
5027 {
ISD::UMAX, MVT::i64, { 1, 3, 2, 3 } },
5028 {
ISD::UMIN, MVT::i64, { 1, 3, 2, 3 } },
5035 {
ISD::ABS, MVT::i32, { 1, 2, 3, 3 } },
5036 {
ISD::ABS, MVT::i16, { 2, 2, 3, 3 } },
5037 {
ISD::ABS, MVT::i8, { 2, 4, 4, 3 } },
5043 {
ISD::CTLZ, MVT::i32, { 2, 2, 4, 5 } },
5044 {
ISD::CTLZ, MVT::i16, { 2, 2, 4, 5 } },
5049 {
ISD::CTTZ, MVT::i32, { 2, 2, 3, 3 } },
5050 {
ISD::CTTZ, MVT::i16, { 2, 2, 2, 3 } },
5058 {
ISD::ROTL, MVT::i32, { 2, 3, 1, 3 } },
5059 {
ISD::ROTL, MVT::i16, { 2, 3, 1, 3 } },
5061 {
ISD::ROTR, MVT::i32, { 2, 3, 1, 3 } },
5062 {
ISD::ROTR, MVT::i16, { 2, 3, 1, 3 } },
5064 { X86ISD::VROTLI, MVT::i32, { 1, 1, 1, 1 } },
5065 { X86ISD::VROTLI, MVT::i16, { 1, 1, 1, 1 } },
5066 { X86ISD::VROTLI, MVT::i8, { 1, 1, 1, 1 } },
5067 {
ISD::FSHL, MVT::i32, { 4, 4, 1, 4 } },
5068 {
ISD::FSHL, MVT::i16, { 4, 4, 2, 5 } },
5082 {
ISD::SMAX, MVT::i32, { 1, 2, 2, 3 } },
5083 {
ISD::SMAX, MVT::i16, { 1, 4, 2, 4 } },
5085 {
ISD::SMIN, MVT::i32, { 1, 2, 2, 3 } },
5086 {
ISD::SMIN, MVT::i16, { 1, 4, 2, 4 } },
5088 {
ISD::UMAX, MVT::i32, { 1, 2, 2, 3 } },
5089 {
ISD::UMAX, MVT::i16, { 1, 4, 2, 4 } },
5091 {
ISD::UMIN, MVT::i32, { 1, 2, 2, 3 } },
5092 {
ISD::UMIN, MVT::i16, { 1, 4, 2, 4 } },
5115 case Intrinsic::abs:
5118 case Intrinsic::bitreverse:
5121 case Intrinsic::bswap:
5124 case Intrinsic::ctlz:
5127 case Intrinsic::ctpop:
5130 case Intrinsic::cttz:
5133 case Intrinsic::fshl:
5137 if (Args[0] == Args[1]) {
5144 ISD = X86ISD::VROTLI;
5148 case Intrinsic::fshr:
5153 if (Args[0] == Args[1]) {
5160 ISD = X86ISD::VROTLI;
5164 case Intrinsic::lrint:
5165 case Intrinsic::llrint: {
5172 case Intrinsic::maxnum:
5173 case Intrinsic::minnum:
5177 case Intrinsic::sadd_sat:
5180 case Intrinsic::smax:
5183 case Intrinsic::smin:
5186 case Intrinsic::smulh:
5189 case Intrinsic::ssub_sat:
5192 case Intrinsic::uadd_sat:
5195 case Intrinsic::umax:
5198 case Intrinsic::umin:
5201 case Intrinsic::usub_sat:
5204 case Intrinsic::umulh:
5207 case Intrinsic::sqrt:
5215 case Intrinsic::sadd_with_overflow:
5216 case Intrinsic::ssub_with_overflow:
5221 case Intrinsic::uadd_with_overflow:
5222 case Intrinsic::usub_with_overflow:
5227 case Intrinsic::smul_with_overflow:
5231 case Intrinsic::umul_with_overflow:
5235 case Intrinsic::clmul:
5241 auto adjustTableCost = [&](
int ISD,
unsigned Cost,
5242 std::pair<InstructionCost, MVT> LT,
5245 MVT MTy = LT.second;
5252 return LegalizationCost * 1;
5257 if (
ISD ==
ISD::BSWAP && ST->hasMOVBE() && ST->hasFastMOVBE()) {
5262 if (LI->hasOneUse())
5269 return LegalizationCost * (int)
Cost;
5274 MVT MTy = LT.second;
5282 if (Cst->isAllOnesValue())
5291 if (ST->useGLMDivSqrtCosts())
5293 if (
auto KindCost = Entry->Cost[CostKind])
5294 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5296 if (ST->useSLMArithCosts())
5298 if (
auto KindCost = Entry->Cost[CostKind])
5299 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5303 if (
auto KindCost = Entry->Cost[CostKind])
5304 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5306 if (ST->hasBITALG())
5308 if (
auto KindCost = Entry->Cost[CostKind])
5309 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5311 if (ST->hasVPOPCNTDQ())
5313 if (
auto KindCost = Entry->Cost[CostKind])
5314 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5318 if (
auto KindCost = Entry->Cost[CostKind])
5319 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5323 if (
auto KindCost = Entry->Cost[CostKind])
5324 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5328 if (
auto KindCost = Entry->Cost[CostKind])
5329 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5331 if (ST->hasAVX512())
5333 if (
auto KindCost = Entry->Cost[CostKind])
5334 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5338 if (
auto KindCost = Entry->Cost[CostKind])
5339 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5343 if (
auto KindCost = Entry->Cost[CostKind])
5344 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5348 if (
auto KindCost = Entry->Cost[CostKind])
5349 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5353 if (
auto KindCost = Entry->Cost[CostKind])
5354 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5358 if (
auto KindCost = Entry->Cost[CostKind])
5359 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5363 if (
auto KindCost = Entry->Cost[CostKind])
5364 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5368 if (
auto KindCost = Entry->Cost[CostKind])
5369 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5373 if (
auto KindCost = Entry->Cost[CostKind])
5374 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5379 if (
auto KindCost = Entry->Cost[CostKind])
5380 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5383 if (
auto KindCost = Entry->Cost[CostKind])
5384 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5387 if (ST->hasLZCNT()) {
5390 if (
auto KindCost = Entry->Cost[CostKind])
5391 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5394 if (
auto KindCost = Entry->Cost[CostKind])
5395 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5398 if (ST->hasPOPCNT()) {
5401 if (
auto KindCost = Entry->Cost[CostKind])
5402 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5405 if (
auto KindCost = Entry->Cost[CostKind])
5406 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5410 if (ST->hasPCLMUL())
5412 if (
auto KindCost = Entry->Cost[CostKind])
5413 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5417 if (
auto KindCost = Entry->Cost[CostKind])
5418 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5421 if (
auto KindCost = Entry->Cost[CostKind])
5422 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
5427 (IID == Intrinsic::fshl || IID == Intrinsic::fshr)) {