262 if (Opcode == Instruction::Mul && Ty->isVectorTy() &&
263 Ty->getPrimitiveSizeInBits() <= 64 && Ty->getScalarSizeInBits() == 8) {
278 int ISD = TLI->InstructionOpcodeToISD(Opcode);
281 if (
ISD ==
ISD::MUL && Args.size() == 2 && LT.second.isVector() &&
282 (LT.second.getScalarType() == MVT::i32 ||
283 LT.second.getScalarType() == MVT::i64)) {
285 bool Op1Signed =
false, Op2Signed =
false;
288 unsigned OpMinSize = std::max(Op1MinSize, Op2MinSize);
289 bool SignedMode = Op1Signed || Op2Signed;
294 if (OpMinSize <= 15 && !ST->isPMADDWDSlow() &&
295 LT.second.getScalarType() == MVT::i32) {
301 (Op1MinSize == 15 || (Op1MinSize < 15 && !ST->hasSSE41()));
303 (Op2MinSize == 15 || (Op2MinSize < 15 && !ST->hasSSE41()));
305 bool IsZeroExtended = !Op1Signed || !Op2Signed;
306 bool IsConstant = Op1Constant || Op2Constant;
307 bool IsSext = Op1Sext || Op2Sext;
308 if (IsConstant || IsZeroExtended || IsSext)
316 if (ST->useSLMArithCosts() && LT.second == MVT::v4i32) {
319 if (!SignedMode && OpMinSize <= 8)
323 if (!SignedMode && OpMinSize <= 16)
330 if (!SignedMode && OpMinSize <= 32 && LT.second.getScalarType() == MVT::i64)
331 ISD = X86ISD::PMULUDQ;
394 return LT.first *
Cost;
398 {
ISD::SHL, MVT::v16i8, { 1, 6, 1, 2 } },
399 {
ISD::SRL, MVT::v16i8, { 1, 6, 1, 2 } },
400 {
ISD::SRA, MVT::v16i8, { 1, 6, 1, 2 } },
401 {
ISD::SHL, MVT::v32i8, { 1, 6, 1, 2 } },
402 {
ISD::SRL, MVT::v32i8, { 1, 6, 1, 2 } },
403 {
ISD::SRA, MVT::v32i8, { 1, 6, 1, 2 } },
404 {
ISD::SHL, MVT::v64i8, { 1, 6, 1, 2 } },
405 {
ISD::SRL, MVT::v64i8, { 1, 6, 1, 2 } },
406 {
ISD::SRA, MVT::v64i8, { 1, 6, 1, 2 } },
410 if (
const auto *Entry =
412 if (
auto KindCost = Entry->Cost[
CostKind])
413 return LT.first * *KindCost;
416 {
ISD::SHL, MVT::v16i8, { 1, 7, 2, 3 } },
417 {
ISD::SRL, MVT::v16i8, { 1, 7, 2, 3 } },
418 {
ISD::SRA, MVT::v16i8, { 1, 8, 4, 5 } },
419 {
ISD::SHL, MVT::v32i8, { 1, 8, 2, 3 } },
420 {
ISD::SRL, MVT::v32i8, { 1, 8, 2, 3 } },
421 {
ISD::SRA, MVT::v32i8, { 1, 9, 4, 5 } },
422 {
ISD::SHL, MVT::v64i8, { 1, 8, 2, 3 } },
423 {
ISD::SRL, MVT::v64i8, { 1, 8, 2, 3 } },
424 {
ISD::SRA, MVT::v64i8, { 1, 9, 4, 6 } },
426 {
ISD::SHL, MVT::v16i16, { 1, 1, 1, 1 } },
427 {
ISD::SRL, MVT::v16i16, { 1, 1, 1, 1 } },
428 {
ISD::SRA, MVT::v16i16, { 1, 1, 1, 1 } },
429 {
ISD::SHL, MVT::v32i16, { 1, 1, 1, 1 } },
430 {
ISD::SRL, MVT::v32i16, { 1, 1, 1, 1 } },
431 {
ISD::SRA, MVT::v32i16, { 1, 1, 1, 1 } },
435 if (
const auto *Entry =
437 if (
auto KindCost = Entry->Cost[
CostKind])
438 return LT.first * *KindCost;
453 if (
const auto *Entry =
455 if (
auto KindCost = Entry->Cost[
CostKind])
456 return LT.first * *KindCost;
459 {
ISD::SHL, MVT::v64i8, { 2, 12, 5, 6 } },
460 {
ISD::SRL, MVT::v64i8, { 2, 12, 5, 6 } },
461 {
ISD::SRA, MVT::v64i8, { 3, 10, 12, 12 } },
463 {
ISD::SHL, MVT::v16i16, { 2, 7, 4, 4 } },
464 {
ISD::SRL, MVT::v16i16, { 2, 7, 4, 4 } },
465 {
ISD::SRA, MVT::v16i16, { 2, 7, 4, 4 } },
467 {
ISD::SHL, MVT::v8i32, { 1, 1, 1, 1 } },
468 {
ISD::SRL, MVT::v8i32, { 1, 1, 1, 1 } },
469 {
ISD::SRA, MVT::v8i32, { 1, 1, 1, 1 } },
470 {
ISD::SHL, MVT::v16i32, { 1, 1, 1, 1 } },
471 {
ISD::SRL, MVT::v16i32, { 1, 1, 1, 1 } },
472 {
ISD::SRA, MVT::v16i32, { 1, 1, 1, 1 } },
474 {
ISD::SRA, MVT::v2i64, { 1, 1, 1, 1 } },
475 {
ISD::SHL, MVT::v4i64, { 1, 1, 1, 1 } },
476 {
ISD::SRL, MVT::v4i64, { 1, 1, 1, 1 } },
477 {
ISD::SRA, MVT::v4i64, { 1, 1, 1, 1 } },
478 {
ISD::SHL, MVT::v8i64, { 1, 1, 1, 1 } },
479 {
ISD::SRL, MVT::v8i64, { 1, 1, 1, 1 } },
480 {
ISD::SRA, MVT::v8i64, { 1, 1, 1, 1 } },
492 if (
const auto *Entry =
494 if (
auto KindCost = Entry->Cost[
CostKind])
495 return LT.first * *KindCost;
498 {
ISD::SHL, MVT::v16i8, { 1, 8, 2, 3 } },
499 {
ISD::SRL, MVT::v16i8, { 1, 8, 2, 3 } },
500 {
ISD::SRA, MVT::v16i8, { 2, 10, 5, 6 } },
501 {
ISD::SHL, MVT::v32i8, { 2, 8, 2, 4 } },
502 {
ISD::SRL, MVT::v32i8, { 2, 8, 2, 4 } },
503 {
ISD::SRA, MVT::v32i8, { 3, 10, 5, 9 } },
505 {
ISD::SHL, MVT::v8i16, { 1, 1, 1, 1 } },
506 {
ISD::SRL, MVT::v8i16, { 1, 1, 1, 1 } },
507 {
ISD::SRA, MVT::v8i16, { 1, 1, 1, 1 } },
508 {
ISD::SHL, MVT::v16i16,{ 2, 2, 1, 2 } },
509 {
ISD::SRL, MVT::v16i16,{ 2, 2, 1, 2 } },
510 {
ISD::SRA, MVT::v16i16,{ 2, 2, 1, 2 } },
512 {
ISD::SHL, MVT::v4i32, { 1, 1, 1, 1 } },
513 {
ISD::SRL, MVT::v4i32, { 1, 1, 1, 1 } },
514 {
ISD::SRA, MVT::v4i32, { 1, 1, 1, 1 } },
515 {
ISD::SHL, MVT::v8i32, { 2, 2, 1, 2 } },
516 {
ISD::SRL, MVT::v8i32, { 2, 2, 1, 2 } },
517 {
ISD::SRA, MVT::v8i32, { 2, 2, 1, 2 } },
519 {
ISD::SHL, MVT::v2i64, { 1, 1, 1, 1 } },
520 {
ISD::SRL, MVT::v2i64, { 1, 1, 1, 1 } },
521 {
ISD::SRA, MVT::v2i64, { 2, 3, 3, 3 } },
522 {
ISD::SHL, MVT::v4i64, { 2, 2, 1, 2 } },
523 {
ISD::SRL, MVT::v4i64, { 2, 2, 1, 2 } },
524 {
ISD::SRA, MVT::v4i64, { 4, 4, 3, 6 } },
536 if (
const auto *Entry =
538 if (
auto KindCost = Entry->Cost[
CostKind])
539 return LT.first * *KindCost;
542 {
ISD::SHL, MVT::v16i8, { 2, 7, 2, 3 } },
543 {
ISD::SRL, MVT::v16i8, { 2, 7, 2, 3 } },
544 {
ISD::SRA, MVT::v16i8, { 3, 9, 5, 6 } },
545 {
ISD::SHL, MVT::v32i8, { 4, 7, 7, 8 } },
546 {
ISD::SRL, MVT::v32i8, { 4, 7, 7, 8 } },
547 {
ISD::SRA, MVT::v32i8, { 7, 7, 12, 13 } },
549 {
ISD::SHL, MVT::v8i16, { 1, 2, 1, 1 } },
550 {
ISD::SRL, MVT::v8i16, { 1, 2, 1, 1 } },
551 {
ISD::SRA, MVT::v8i16, { 1, 2, 1, 1 } },
552 {
ISD::SHL, MVT::v16i16,{ 3, 6, 4, 5 } },
553 {
ISD::SRL, MVT::v16i16,{ 3, 6, 4, 5 } },
554 {
ISD::SRA, MVT::v16i16,{ 3, 6, 4, 5 } },
556 {
ISD::SHL, MVT::v4i32, { 1, 2, 1, 1 } },
557 {
ISD::SRL, MVT::v4i32, { 1, 2, 1, 1 } },
558 {
ISD::SRA, MVT::v4i32, { 1, 2, 1, 1 } },
559 {
ISD::SHL, MVT::v8i32, { 3, 6, 4, 5 } },
560 {
ISD::SRL, MVT::v8i32, { 3, 6, 4, 5 } },
561 {
ISD::SRA, MVT::v8i32, { 3, 6, 4, 5 } },
563 {
ISD::SHL, MVT::v2i64, { 1, 2, 1, 1 } },
564 {
ISD::SRL, MVT::v2i64, { 1, 2, 1, 1 } },
565 {
ISD::SRA, MVT::v2i64, { 2, 3, 3, 3 } },
566 {
ISD::SHL, MVT::v4i64, { 3, 6, 4, 5 } },
567 {
ISD::SRL, MVT::v4i64, { 3, 6, 4, 5 } },
568 {
ISD::SRA, MVT::v4i64, { 5, 7, 8, 9 } },
578 (!ST->hasXOP() || LT.second.getScalarSizeInBits() != 8))
579 if (
const auto *Entry =
581 if (
auto KindCost = Entry->Cost[
CostKind])
582 return LT.first * *KindCost;
585 {
ISD::SHL, MVT::v16i8, { 1, 7, 2, 3 } },
586 {
ISD::SRL, MVT::v16i8, { 1, 7, 2, 3 } },
587 {
ISD::SRA, MVT::v16i8, { 3, 9, 5, 6 } },
589 {
ISD::SHL, MVT::v8i16, { 1, 1, 1, 1 } },
590 {
ISD::SRL, MVT::v8i16, { 1, 1, 1, 1 } },
591 {
ISD::SRA, MVT::v8i16, { 1, 1, 1, 1 } },
593 {
ISD::SHL, MVT::v4i32, { 1, 1, 1, 1 } },
594 {
ISD::SRL, MVT::v4i32, { 1, 1, 1, 1 } },
595 {
ISD::SRA, MVT::v4i32, { 1, 1, 1, 1 } },
597 {
ISD::SHL, MVT::v2i64, { 1, 1, 1, 1 } },
598 {
ISD::SRL, MVT::v2i64, { 1, 1, 1, 1 } },
599 {
ISD::SRA, MVT::v2i64, { 3, 5, 6, 6 } },
609 (!ST->hasXOP() || LT.second.getScalarSizeInBits() != 8))
610 if (
const auto *Entry =
612 if (
auto KindCost = Entry->Cost[
CostKind])
613 return LT.first * *KindCost;
628 if (
const auto *Entry =
630 if (
auto KindCost = Entry->Cost[
CostKind])
631 return LT.first * *KindCost;
645 if (
const auto *Entry =
647 if (
auto KindCost = Entry->Cost[
CostKind])
648 return LT.first * *KindCost;
671 if (
const auto *Entry =
673 if (
auto KindCost = Entry->Cost[
CostKind])
674 return LT.first * *KindCost;
698 if (
auto KindCost = Entry->Cost[
CostKind])
699 return LT.first * *KindCost;
720 if (
auto KindCost = Entry->Cost[
CostKind])
721 return LT.first * *KindCost;
729 if (
const auto *Entry =
731 if (
auto KindCost = Entry->Cost[
CostKind])
732 return LT.first * *KindCost;
753 if (
auto KindCost = Entry->Cost[
CostKind])
754 return LT.first * *KindCost;
757 {
ISD::SHL, MVT::v16i8, { 3, 5, 5, 7 } },
758 {
ISD::SRL, MVT::v16i8, { 3,10, 5, 8 } },
759 {
ISD::SRA, MVT::v16i8, { 4,12, 8,12 } },
760 {
ISD::SHL, MVT::v32i8, { 4, 7, 6, 8 } },
761 {
ISD::SRL, MVT::v32i8, { 4, 8, 7, 9 } },
762 {
ISD::SRA, MVT::v32i8, { 5,10,10,13 } },
763 {
ISD::SHL, MVT::v64i8, { 4, 7, 6, 8 } },
764 {
ISD::SRL, MVT::v64i8, { 4, 8, 7,10 } },
765 {
ISD::SRA, MVT::v64i8, { 5,10,10,15 } },
767 {
ISD::SHL, MVT::v32i16, { 2, 4, 2, 3 } },
768 {
ISD::SRL, MVT::v32i16, { 2, 4, 2, 3 } },
769 {
ISD::SRA, MVT::v32i16, { 2, 4, 2, 3 } },
773 if (
const auto *Entry =
775 if (
auto KindCost = Entry->Cost[
CostKind])
776 return LT.first * *KindCost;
779 {
ISD::SHL, MVT::v32i16, { 5,10, 5, 7 } },
780 {
ISD::SRL, MVT::v32i16, { 5,10, 5, 7 } },
781 {
ISD::SRA, MVT::v32i16, { 5,10, 5, 7 } },
783 {
ISD::SHL, MVT::v16i32, { 2, 4, 2, 3 } },
784 {
ISD::SRL, MVT::v16i32, { 2, 4, 2, 3 } },
785 {
ISD::SRA, MVT::v16i32, { 2, 4, 2, 3 } },
787 {
ISD::SRA, MVT::v2i64, { 1, 2, 1, 2 } },
788 {
ISD::SHL, MVT::v4i64, { 1, 4, 1, 2 } },
789 {
ISD::SRL, MVT::v4i64, { 1, 4, 1, 2 } },
790 {
ISD::SRA, MVT::v4i64, { 1, 4, 1, 2 } },
791 {
ISD::SHL, MVT::v8i64, { 1, 4, 1, 2 } },
792 {
ISD::SRL, MVT::v8i64, { 1, 4, 1, 2 } },
793 {
ISD::SRA, MVT::v8i64, { 1, 4, 1, 2 } },
796 if (ST->hasAVX512() && Op2Info.
isUniform())
797 if (
const auto *Entry =
799 if (
auto KindCost = Entry->Cost[
CostKind])
800 return LT.first * *KindCost;
804 {
ISD::SHL, MVT::v16i8, { 3, 5, 5, 7 } },
805 {
ISD::SRL, MVT::v16i8, { 3, 9, 5, 8 } },
806 {
ISD::SRA, MVT::v16i8, { 4, 5, 9,13 } },
807 {
ISD::SHL, MVT::v32i8, { 4, 7, 6, 8 } },
808 {
ISD::SRL, MVT::v32i8, { 4, 8, 7, 9 } },
809 {
ISD::SRA, MVT::v32i8, { 6, 9,11,16 } },
811 {
ISD::SHL, MVT::v8i16, { 1, 2, 1, 2 } },
812 {
ISD::SRL, MVT::v8i16, { 1, 2, 1, 2 } },
813 {
ISD::SRA, MVT::v8i16, { 1, 2, 1, 2 } },
814 {
ISD::SHL, MVT::v16i16, { 2, 4, 2, 3 } },
815 {
ISD::SRL, MVT::v16i16, { 2, 4, 2, 3 } },
816 {
ISD::SRA, MVT::v16i16, { 2, 4, 2, 3 } },
818 {
ISD::SHL, MVT::v4i32, { 1, 2, 1, 2 } },
819 {
ISD::SRL, MVT::v4i32, { 1, 2, 1, 2 } },
820 {
ISD::SRA, MVT::v4i32, { 1, 2, 1, 2 } },
821 {
ISD::SHL, MVT::v8i32, { 2, 4, 2, 3 } },
822 {
ISD::SRL, MVT::v8i32, { 2, 4, 2, 3 } },
823 {
ISD::SRA, MVT::v8i32, { 2, 4, 2, 3 } },
825 {
ISD::SHL, MVT::v2i64, { 1, 2, 1, 2 } },
826 {
ISD::SRL, MVT::v2i64, { 1, 2, 1, 2 } },
827 {
ISD::SRA, MVT::v2i64, { 2, 4, 5, 7 } },
828 {
ISD::SHL, MVT::v4i64, { 2, 4, 1, 2 } },
829 {
ISD::SRL, MVT::v4i64, { 2, 4, 1, 2 } },
830 {
ISD::SRA, MVT::v4i64, { 4, 6, 5, 9 } },
833 if (ST->hasAVX2() && Op2Info.
isUniform())
834 if (
const auto *Entry =
836 if (
auto KindCost = Entry->Cost[
CostKind])
837 return LT.first * *KindCost;
840 {
ISD::SHL, MVT::v16i8, { 4, 4, 6, 8 } },
841 {
ISD::SRL, MVT::v16i8, { 4, 8, 5, 8 } },
842 {
ISD::SRA, MVT::v16i8, { 6, 6, 9,13 } },
843 {
ISD::SHL, MVT::v32i8, { 7, 8,11,14 } },
844 {
ISD::SRL, MVT::v32i8, { 7, 9,10,14 } },
845 {
ISD::SRA, MVT::v32i8, { 10,11,16,21 } },
847 {
ISD::SHL, MVT::v8i16, { 1, 3, 1, 2 } },
848 {
ISD::SRL, MVT::v8i16, { 1, 3, 1, 2 } },
849 {
ISD::SRA, MVT::v8i16, { 1, 3, 1, 2 } },
850 {
ISD::SHL, MVT::v16i16, { 3, 7, 5, 7 } },
851 {
ISD::SRL, MVT::v16i16, { 3, 7, 5, 7 } },
852 {
ISD::SRA, MVT::v16i16, { 3, 7, 5, 7 } },
854 {
ISD::SHL, MVT::v4i32, { 1, 3, 1, 2 } },
855 {
ISD::SRL, MVT::v4i32, { 1, 3, 1, 2 } },
856 {
ISD::SRA, MVT::v4i32, { 1, 3, 1, 2 } },
857 {
ISD::SHL, MVT::v8i32, { 3, 7, 5, 7 } },
858 {
ISD::SRL, MVT::v8i32, { 3, 7, 5, 7 } },
859 {
ISD::SRA, MVT::v8i32, { 3, 7, 5, 7 } },
861 {
ISD::SHL, MVT::v2i64, { 1, 3, 1, 2 } },
862 {
ISD::SRL, MVT::v2i64, { 1, 3, 1, 2 } },
863 {
ISD::SRA, MVT::v2i64, { 3, 4, 5, 7 } },
864 {
ISD::SHL, MVT::v4i64, { 3, 7, 4, 6 } },
865 {
ISD::SRL, MVT::v4i64, { 3, 7, 4, 6 } },
866 {
ISD::SRA, MVT::v4i64, { 6, 7,10,13 } },
870 if (ST->hasAVX() && Op2Info.
isUniform() &&
871 (!ST->hasXOP() || LT.second.getScalarSizeInBits() != 8))
872 if (
const auto *Entry =
874 if (
auto KindCost = Entry->Cost[
CostKind])
875 return LT.first * *KindCost;
879 {
ISD::SHL, MVT::v16i8, { 9, 10, 6, 9 } },
880 {
ISD::SRL, MVT::v16i8, { 9, 13, 5, 9 } },
881 {
ISD::SRA, MVT::v16i8, { 11, 15, 9,13 } },
883 {
ISD::SHL, MVT::v8i16, { 2, 2, 1, 2 } },
884 {
ISD::SRL, MVT::v8i16, { 2, 2, 1, 2 } },
885 {
ISD::SRA, MVT::v8i16, { 2, 2, 1, 2 } },
887 {
ISD::SHL, MVT::v4i32, { 2, 2, 1, 2 } },
888 {
ISD::SRL, MVT::v4i32, { 2, 2, 1, 2 } },
889 {
ISD::SRA, MVT::v4i32, { 2, 2, 1, 2 } },
891 {
ISD::SHL, MVT::v2i64, { 2, 2, 1, 2 } },
892 {
ISD::SRL, MVT::v2i64, { 2, 2, 1, 2 } },
893 {
ISD::SRA, MVT::v2i64, { 5, 9, 5, 7 } },
896 if (ST->hasSSE2() && Op2Info.
isUniform() &&
897 (!ST->hasXOP() || LT.second.getScalarSizeInBits() != 8))
898 if (
const auto *Entry =
900 if (
auto KindCost = Entry->Cost[
CostKind])
901 return LT.first * *KindCost;
904 {
ISD::MUL, MVT::v2i64, { 2, 15, 1, 3 } },
905 {
ISD::MUL, MVT::v4i64, { 2, 15, 1, 3 } },
906 {
ISD::MUL, MVT::v8i64, { 3, 15, 1, 3 } }
912 if (
auto KindCost = Entry->Cost[
CostKind])
913 return LT.first * *KindCost;
916 {
ISD::SHL, MVT::v16i8, { 4, 8, 4, 5 } },
917 {
ISD::SRL, MVT::v16i8, { 4, 8, 4, 5 } },
918 {
ISD::SRA, MVT::v16i8, { 4, 8, 4, 5 } },
919 {
ISD::SHL, MVT::v32i8, { 4, 23,11,16 } },
920 {
ISD::SRL, MVT::v32i8, { 4, 30,12,18 } },
921 {
ISD::SRA, MVT::v32i8, { 6, 13,24,30 } },
922 {
ISD::SHL, MVT::v64i8, { 6, 19,13,15 } },
923 {
ISD::SRL, MVT::v64i8, { 7, 27,15,18 } },
924 {
ISD::SRA, MVT::v64i8, { 15, 15,30,30 } },
926 {
ISD::SHL, MVT::v8i16, { 1, 1, 1, 1 } },
927 {
ISD::SRL, MVT::v8i16, { 1, 1, 1, 1 } },
928 {
ISD::SRA, MVT::v8i16, { 1, 1, 1, 1 } },
929 {
ISD::SHL, MVT::v16i16, { 1, 1, 1, 1 } },
930 {
ISD::SRL, MVT::v16i16, { 1, 1, 1, 1 } },
931 {
ISD::SRA, MVT::v16i16, { 1, 1, 1, 1 } },
932 {
ISD::SHL, MVT::v32i16, { 1, 1, 1, 1 } },
933 {
ISD::SRL, MVT::v32i16, { 1, 1, 1, 1 } },
934 {
ISD::SRA, MVT::v32i16, { 1, 1, 1, 1 } },
936 {
ISD::ADD, MVT::v64i8, { 1, 1, 1, 1 } },
937 {
ISD::ADD, MVT::v32i16, { 1, 1, 1, 1 } },
939 {
ISD::ADD, MVT::v32i8, { 1, 1, 1, 1 } },
940 {
ISD::ADD, MVT::v16i16, { 1, 1, 1, 1 } },
941 {
ISD::ADD, MVT::v8i32, { 1, 1, 1, 1 } },
942 {
ISD::ADD, MVT::v4i64, { 1, 1, 1, 1 } },
944 {
ISD::SUB, MVT::v64i8, { 1, 1, 1, 1 } },
945 {
ISD::SUB, MVT::v32i16, { 1, 1, 1, 1 } },
947 {
ISD::MUL, MVT::v16i8, { 4, 12, 4, 5 } },
948 {
ISD::MUL, MVT::v32i8, { 3, 10, 7,10 } },
949 {
ISD::MUL, MVT::v64i8, { 3, 11, 7,10 } },
950 {
ISD::MUL, MVT::v32i16, { 1, 5, 1, 1 } },
952 {
ISD::SUB, MVT::v32i8, { 1, 1, 1, 1 } },
953 {
ISD::SUB, MVT::v16i16, { 1, 1, 1, 1 } },
954 {
ISD::SUB, MVT::v8i32, { 1, 1, 1, 1 } },
955 {
ISD::SUB, MVT::v4i64, { 1, 1, 1, 1 } },
961 if (
auto KindCost = Entry->Cost[
CostKind])
962 return LT.first * *KindCost;
965 {
ISD::SHL, MVT::v64i8, { 15, 19,27,33 } },
966 {
ISD::SRL, MVT::v64i8, { 15, 19,30,36 } },
967 {
ISD::SRA, MVT::v64i8, { 37, 37,51,63 } },
969 {
ISD::SHL, MVT::v32i16, { 11, 16,11,15 } },
970 {
ISD::SRL, MVT::v32i16, { 11, 16,11,15 } },
971 {
ISD::SRA, MVT::v32i16, { 11, 16,11,15 } },
973 {
ISD::SHL, MVT::v4i32, { 1, 1, 1, 1 } },
974 {
ISD::SRL, MVT::v4i32, { 1, 1, 1, 1 } },
975 {
ISD::SRA, MVT::v4i32, { 1, 1, 1, 1 } },
976 {
ISD::SHL, MVT::v8i32, { 1, 1, 1, 1 } },
977 {
ISD::SRL, MVT::v8i32, { 1, 1, 1, 1 } },
978 {
ISD::SRA, MVT::v8i32, { 1, 1, 1, 1 } },
979 {
ISD::SHL, MVT::v16i32, { 1, 1, 1, 1 } },
980 {
ISD::SRL, MVT::v16i32, { 1, 1, 1, 1 } },
981 {
ISD::SRA, MVT::v16i32, { 1, 1, 1, 1 } },
983 {
ISD::SHL, MVT::v2i64, { 1, 1, 1, 1 } },
984 {
ISD::SRL, MVT::v2i64, { 1, 1, 1, 1 } },
985 {
ISD::SRA, MVT::v2i64, { 1, 1, 1, 1 } },
986 {
ISD::SHL, MVT::v4i64, { 1, 1, 1, 1 } },
987 {
ISD::SRL, MVT::v4i64, { 1, 1, 1, 1 } },
988 {
ISD::SRA, MVT::v4i64, { 1, 1, 1, 1 } },
989 {
ISD::SHL, MVT::v8i64, { 1, 1, 1, 1 } },
990 {
ISD::SRL, MVT::v8i64, { 1, 1, 1, 1 } },
991 {
ISD::SRA, MVT::v8i64, { 1, 1, 1, 1 } },
993 {
ISD::ADD, MVT::v64i8, { 3, 7, 5, 5 } },
994 {
ISD::ADD, MVT::v32i16, { 3, 7, 5, 5 } },
996 {
ISD::SUB, MVT::v64i8, { 3, 7, 5, 5 } },
997 {
ISD::SUB, MVT::v32i16, { 3, 7, 5, 5 } },
999 {
ISD::AND, MVT::v32i8, { 1, 1, 1, 1 } },
1000 {
ISD::AND, MVT::v16i16, { 1, 1, 1, 1 } },
1001 {
ISD::AND, MVT::v8i32, { 1, 1, 1, 1 } },
1002 {
ISD::AND, MVT::v4i64, { 1, 1, 1, 1 } },
1004 {
ISD::OR, MVT::v32i8, { 1, 1, 1, 1 } },
1005 {
ISD::OR, MVT::v16i16, { 1, 1, 1, 1 } },
1006 {
ISD::OR, MVT::v8i32, { 1, 1, 1, 1 } },
1007 {
ISD::OR, MVT::v4i64, { 1, 1, 1, 1 } },
1009 {
ISD::XOR, MVT::v32i8, { 1, 1, 1, 1 } },
1010 {
ISD::XOR, MVT::v16i16, { 1, 1, 1, 1 } },
1011 {
ISD::XOR, MVT::v8i32, { 1, 1, 1, 1 } },
1012 {
ISD::XOR, MVT::v4i64, { 1, 1, 1, 1 } },
1014 {
ISD::MUL, MVT::v16i32, { 1, 10, 1, 2 } },
1015 {
ISD::MUL, MVT::v8i32, { 1, 10, 1, 2 } },
1016 {
ISD::MUL, MVT::v4i32, { 1, 10, 1, 2 } },
1017 {
ISD::MUL, MVT::v8i64, { 6, 9, 8, 8 } },
1020 { X86ISD::PMULUDQ, MVT::v8i64, { 1, 5, 1, 1 } },
1022 {
ISD::FNEG, MVT::v8f64, { 1, 1, 1, 2 } },
1023 {
ISD::FADD, MVT::v8f64, { 1, 4, 1, 1 } },
1024 {
ISD::FADD, MVT::v4f64, { 1, 4, 1, 1 } },
1025 {
ISD::FSUB, MVT::v8f64, { 1, 4, 1, 1 } },
1026 {
ISD::FSUB, MVT::v4f64, { 1, 4, 1, 1 } },
1027 {
ISD::FMUL, MVT::v8f64, { 1, 4, 1, 1 } },
1028 {
ISD::FMUL, MVT::v4f64, { 1, 4, 1, 1 } },
1029 {
ISD::FMUL, MVT::v2f64, { 1, 4, 1, 1 } },
1030 {
ISD::FMUL, MVT::f64, { 1, 4, 1, 1 } },
1032 {
ISD::FDIV, MVT::f64, { 4, 14, 1, 1 } },
1033 {
ISD::FDIV, MVT::v2f64, { 4, 14, 1, 1 } },
1034 {
ISD::FDIV, MVT::v4f64, { 8, 14, 1, 1 } },
1035 {
ISD::FDIV, MVT::v8f64, { 16, 23, 1, 3 } },
1037 {
ISD::FNEG, MVT::v16f32, { 1, 1, 1, 2 } },
1038 {
ISD::FADD, MVT::v16f32, { 1, 4, 1, 1 } },
1039 {
ISD::FADD, MVT::v8f32, { 1, 4, 1, 1 } },
1040 {
ISD::FSUB, MVT::v16f32, { 1, 4, 1, 1 } },
1041 {
ISD::FSUB, MVT::v8f32, { 1, 4, 1, 1 } },
1042 {
ISD::FMUL, MVT::v16f32, { 1, 4, 1, 1 } },
1043 {
ISD::FMUL, MVT::v8f32, { 1, 4, 1, 1 } },
1044 {
ISD::FMUL, MVT::v4f32, { 1, 4, 1, 1 } },
1045 {
ISD::FMUL, MVT::f32, { 1, 4, 1, 1 } },
1047 {
ISD::FDIV, MVT::f32, { 3, 11, 1, 1 } },
1048 {
ISD::FDIV, MVT::v4f32, { 3, 11, 1, 1 } },
1049 {
ISD::FDIV, MVT::v8f32, { 5, 11, 1, 1 } },
1050 {
ISD::FDIV, MVT::v16f32, { 10, 18, 1, 3 } },
1053 if (ST->hasAVX512())
1055 if (
auto KindCost = Entry->Cost[
CostKind])
1056 return LT.first * *KindCost;
1061 {
ISD::SHL, MVT::v4i32, { 2, 3, 1, 3 } },
1062 {
ISD::SRL, MVT::v4i32, { 2, 3, 1, 3 } },
1063 {
ISD::SRA, MVT::v4i32, { 2, 3, 1, 3 } },
1064 {
ISD::SHL, MVT::v8i32, { 4, 4, 1, 3 } },
1065 {
ISD::SRL, MVT::v8i32, { 4, 4, 1, 3 } },
1066 {
ISD::SRA, MVT::v8i32, { 4, 4, 1, 3 } },
1067 {
ISD::SHL, MVT::v2i64, { 2, 3, 1, 1 } },
1068 {
ISD::SRL, MVT::v2i64, { 2, 3, 1, 1 } },
1069 {
ISD::SHL, MVT::v4i64, { 4, 4, 1, 2 } },
1070 {
ISD::SRL, MVT::v4i64, { 4, 4, 1, 2 } },
1073 if (ST->hasAVX512()) {
1082 if (ST->hasAVX2() && !(ST->hasXOP() && LT.second == MVT::v4i32)) {
1083 if (
ISD ==
ISD::SHL && LT.second == MVT::v16i16 &&
1091 if (
auto KindCost = Entry->Cost[
CostKind])
1092 return LT.first * *KindCost;
1097 {
ISD::SHL, MVT::v16i8, { 1, 3, 1, 1 } },
1098 {
ISD::SRL, MVT::v16i8, { 2, 3, 1, 1 } },
1099 {
ISD::SRA, MVT::v16i8, { 2, 3, 1, 1 } },
1100 {
ISD::SHL, MVT::v8i16, { 1, 3, 1, 1 } },
1101 {
ISD::SRL, MVT::v8i16, { 2, 3, 1, 1 } },
1102 {
ISD::SRA, MVT::v8i16, { 2, 3, 1, 1 } },
1103 {
ISD::SHL, MVT::v4i32, { 1, 3, 1, 1 } },
1104 {
ISD::SRL, MVT::v4i32, { 2, 3, 1, 1 } },
1105 {
ISD::SRA, MVT::v4i32, { 2, 3, 1, 1 } },
1106 {
ISD::SHL, MVT::v2i64, { 1, 3, 1, 1 } },
1107 {
ISD::SRL, MVT::v2i64, { 2, 3, 1, 1 } },
1108 {
ISD::SRA, MVT::v2i64, { 2, 3, 1, 1 } },
1110 {
ISD::SHL, MVT::v32i8, { 4, 7, 5, 6 } },
1111 {
ISD::SRL, MVT::v32i8, { 6, 7, 5, 6 } },
1112 {
ISD::SRA, MVT::v32i8, { 6, 7, 5, 6 } },
1113 {
ISD::SHL, MVT::v16i16, { 4, 7, 5, 6 } },
1114 {
ISD::SRL, MVT::v16i16, { 6, 7, 5, 6 } },
1115 {
ISD::SRA, MVT::v16i16, { 6, 7, 5, 6 } },
1116 {
ISD::SHL, MVT::v8i32, { 4, 7, 5, 6 } },
1117 {
ISD::SRL, MVT::v8i32, { 6, 7, 5, 6 } },
1118 {
ISD::SRA, MVT::v8i32, { 6, 7, 5, 6 } },
1119 {
ISD::SHL, MVT::v4i64, { 4, 7, 5, 6 } },
1120 {
ISD::SRL, MVT::v4i64, { 6, 7, 5, 6 } },
1121 {
ISD::SRA, MVT::v4i64, { 6, 7, 5, 6 } },
1131 if (
const auto *Entry =
1133 if (
auto KindCost = Entry->Cost[
CostKind])
1134 return LT.first * *KindCost;
1141 if (((VT == MVT::v8i16 || VT == MVT::v4i32) && ST->hasSSE2()) ||
1142 ((VT == MVT::v16i16 || VT == MVT::v8i32) && ST->hasAVX()))
1147 {
ISD::FDIV, MVT::f32, { 18, 19, 1, 1 } },
1148 {
ISD::FDIV, MVT::v4f32, { 35, 36, 1, 1 } },
1149 {
ISD::FDIV, MVT::f64, { 33, 34, 1, 1 } },
1150 {
ISD::FDIV, MVT::v2f64, { 65, 66, 1, 1 } },
1153 if (ST->useGLMDivSqrtCosts())
1155 if (
auto KindCost = Entry->Cost[
CostKind])
1156 return LT.first * *KindCost;
1159 {
ISD::MUL, MVT::v4i32, { 11, 11, 1, 7 } },
1160 {
ISD::MUL, MVT::v8i16, { 2, 5, 1, 1 } },
1161 {
ISD::FMUL, MVT::f64, { 2, 5, 1, 1 } },
1162 {
ISD::FMUL, MVT::f32, { 1, 4, 1, 1 } },
1163 {
ISD::FMUL, MVT::v2f64, { 4, 7, 1, 1 } },
1164 {
ISD::FMUL, MVT::v4f32, { 2, 5, 1, 1 } },
1165 {
ISD::FDIV, MVT::f32, { 17, 19, 1, 1 } },
1166 {
ISD::FDIV, MVT::v4f32, { 39, 39, 1, 6 } },
1167 {
ISD::FDIV, MVT::f64, { 32, 34, 1, 1 } },
1168 {
ISD::FDIV, MVT::v2f64, { 69, 69, 1, 6 } },
1169 {
ISD::FADD, MVT::v2f64, { 2, 4, 1, 1 } },
1170 {
ISD::FSUB, MVT::v2f64, { 2, 4, 1, 1 } },
1176 {
ISD::MUL, MVT::v2i64, { 17, 22, 9, 9 } },
1178 {
ISD::ADD, MVT::v2i64, { 4, 2, 1, 2 } },
1179 {
ISD::SUB, MVT::v2i64, { 4, 2, 1, 2 } },
1182 if (ST->useSLMArithCosts())
1184 if (
auto KindCost = Entry->Cost[
CostKind])
1185 return LT.first * *KindCost;
1188 {
ISD::SHL, MVT::v16i8, { 6, 21,11,16 } },
1189 {
ISD::SHL, MVT::v32i8, { 6, 23,11,22 } },
1190 {
ISD::SHL, MVT::v8i16, { 5, 18, 5,10 } },
1191 {
ISD::SHL, MVT::v16i16, { 8, 10,10,14 } },
1193 {
ISD::SRL, MVT::v16i8, { 6, 27,12,18 } },
1194 {
ISD::SRL, MVT::v32i8, { 8, 30,12,24 } },
1195 {
ISD::SRL, MVT::v8i16, { 5, 11, 5,10 } },
1196 {
ISD::SRL, MVT::v16i16, { 8, 10,10,14 } },
1198 {
ISD::SRA, MVT::v16i8, { 17, 17,24,30 } },
1199 {
ISD::SRA, MVT::v32i8, { 18, 20,24,43 } },
1200 {
ISD::SRA, MVT::v8i16, { 5, 11, 5,10 } },
1201 {
ISD::SRA, MVT::v16i16, { 8, 10,10,14 } },
1202 {
ISD::SRA, MVT::v2i64, { 4, 5, 5, 5 } },
1203 {
ISD::SRA, MVT::v4i64, { 8, 8, 5, 9 } },
1205 {
ISD::SUB, MVT::v32i8, { 1, 1, 1, 2 } },
1206 {
ISD::ADD, MVT::v32i8, { 1, 1, 1, 2 } },
1207 {
ISD::SUB, MVT::v16i16, { 1, 1, 1, 2 } },
1208 {
ISD::ADD, MVT::v16i16, { 1, 1, 1, 2 } },
1209 {
ISD::SUB, MVT::v8i32, { 1, 1, 1, 2 } },
1210 {
ISD::ADD, MVT::v8i32, { 1, 1, 1, 2 } },
1211 {
ISD::SUB, MVT::v4i64, { 1, 1, 1, 2 } },
1212 {
ISD::ADD, MVT::v4i64, { 1, 1, 1, 2 } },
1214 {
ISD::MUL, MVT::v16i8, { 5, 18, 6,12 } },
1215 {
ISD::MUL, MVT::v32i8, { 4, 8, 8,16 } },
1216 {
ISD::MUL, MVT::v16i16, { 2, 5, 1, 2 } },
1217 {
ISD::MUL, MVT::v8i32, { 4, 10, 1, 2 } },
1218 {
ISD::MUL, MVT::v4i32, { 2, 10, 1, 2 } },
1219 {
ISD::MUL, MVT::v4i64, { 6, 10, 8,13 } },
1220 {
ISD::MUL, MVT::v2i64, { 6, 10, 8, 8 } },
1222 { X86ISD::PMULUDQ, MVT::v4i64, { 1, 5, 1, 1 } },
1224 {
ISD::FNEG, MVT::v4f64, { 1, 1, 1, 2 } },
1225 {
ISD::FNEG, MVT::v8f32, { 1, 1, 1, 2 } },
1227 {
ISD::FADD, MVT::f64, { 1, 4, 1, 1 } },
1228 {
ISD::FADD, MVT::f32, { 1, 4, 1, 1 } },
1229 {
ISD::FADD, MVT::v2f64, { 1, 4, 1, 1 } },
1230 {
ISD::FADD, MVT::v4f32, { 1, 4, 1, 1 } },
1231 {
ISD::FADD, MVT::v4f64, { 1, 4, 1, 2 } },
1232 {
ISD::FADD, MVT::v8f32, { 1, 4, 1, 2 } },
1234 {
ISD::FSUB, MVT::f64, { 1, 4, 1, 1 } },
1235 {
ISD::FSUB, MVT::f32, { 1, 4, 1, 1 } },
1236 {
ISD::FSUB, MVT::v2f64, { 1, 4, 1, 1 } },
1237 {
ISD::FSUB, MVT::v4f32, { 1, 4, 1, 1 } },
1238 {
ISD::FSUB, MVT::v4f64, { 1, 4, 1, 2 } },
1239 {
ISD::FSUB, MVT::v8f32, { 1, 4, 1, 2 } },
1241 {
ISD::FMUL, MVT::f64, { 1, 5, 1, 1 } },
1242 {
ISD::FMUL, MVT::f32, { 1, 5, 1, 1 } },
1243 {
ISD::FMUL, MVT::v2f64, { 1, 5, 1, 1 } },
1244 {
ISD::FMUL, MVT::v4f32, { 1, 5, 1, 1 } },
1245 {
ISD::FMUL, MVT::v4f64, { 1, 5, 1, 2 } },
1246 {
ISD::FMUL, MVT::v8f32, { 1, 5, 1, 2 } },
1248 {
ISD::FDIV, MVT::f32, { 7, 13, 1, 1 } },
1249 {
ISD::FDIV, MVT::v4f32, { 7, 13, 1, 1 } },
1250 {
ISD::FDIV, MVT::v8f32, { 14, 21, 1, 3 } },
1251 {
ISD::FDIV, MVT::f64, { 14, 20, 1, 1 } },
1252 {
ISD::FDIV, MVT::v2f64, { 14, 20, 1, 1 } },
1253 {
ISD::FDIV, MVT::v4f64, { 28, 35, 1, 3 } },
1259 if (
auto KindCost = Entry->Cost[
CostKind])
1260 return LT.first * *KindCost;
1266 {
ISD::MUL, MVT::v32i8, { 10, 11, 18, 19 } },
1267 {
ISD::MUL, MVT::v16i8, { 5, 6, 8, 12 } },
1268 {
ISD::MUL, MVT::v16i16, { 4, 8, 5, 6 } },
1269 {
ISD::MUL, MVT::v8i32, { 5, 8, 5, 10 } },
1270 {
ISD::MUL, MVT::v4i32, { 2, 5, 1, 3 } },
1271 {
ISD::MUL, MVT::v4i64, { 12, 15, 19, 20 } },
1273 { X86ISD::PMULUDQ, MVT::v4i64, { 3, 5, 5, 6 } },
1275 {
ISD::AND, MVT::v32i8, { 1, 1, 1, 2 } },
1276 {
ISD::AND, MVT::v16i16, { 1, 1, 1, 2 } },
1277 {
ISD::AND, MVT::v8i32, { 1, 1, 1, 2 } },
1278 {
ISD::AND, MVT::v4i64, { 1, 1, 1, 2 } },
1280 {
ISD::OR, MVT::v32i8, { 1, 1, 1, 2 } },
1281 {
ISD::OR, MVT::v16i16, { 1, 1, 1, 2 } },
1282 {
ISD::OR, MVT::v8i32, { 1, 1, 1, 2 } },
1283 {
ISD::OR, MVT::v4i64, { 1, 1, 1, 2 } },
1285 {
ISD::XOR, MVT::v32i8, { 1, 1, 1, 2 } },
1286 {
ISD::XOR, MVT::v16i16, { 1, 1, 1, 2 } },
1287 {
ISD::XOR, MVT::v8i32, { 1, 1, 1, 2 } },
1288 {
ISD::XOR, MVT::v4i64, { 1, 1, 1, 2 } },
1290 {
ISD::SUB, MVT::v32i8, { 4, 2, 5, 6 } },
1291 {
ISD::ADD, MVT::v32i8, { 4, 2, 5, 6 } },
1292 {
ISD::SUB, MVT::v16i16, { 4, 2, 5, 6 } },
1293 {
ISD::ADD, MVT::v16i16, { 4, 2, 5, 6 } },
1294 {
ISD::SUB, MVT::v8i32, { 4, 2, 5, 6 } },
1295 {
ISD::ADD, MVT::v8i32, { 4, 2, 5, 6 } },
1296 {
ISD::SUB, MVT::v4i64, { 4, 2, 5, 6 } },
1297 {
ISD::ADD, MVT::v4i64, { 4, 2, 5, 6 } },
1298 {
ISD::SUB, MVT::v2i64, { 1, 1, 1, 1 } },
1299 {
ISD::ADD, MVT::v2i64, { 1, 1, 1, 1 } },
1301 {
ISD::SHL, MVT::v16i8, { 10, 21,11,17 } },
1302 {
ISD::SHL, MVT::v32i8, { 22, 22,27,40 } },
1303 {
ISD::SHL, MVT::v8i16, { 6, 9,11,11 } },
1304 {
ISD::SHL, MVT::v16i16, { 13, 16,24,25 } },
1305 {
ISD::SHL, MVT::v4i32, { 3, 11, 4, 6 } },
1306 {
ISD::SHL, MVT::v8i32, { 9, 11,12,17 } },
1307 {
ISD::SHL, MVT::v2i64, { 2, 4, 4, 6 } },
1308 {
ISD::SHL, MVT::v4i64, { 6, 7,11,15 } },
1310 {
ISD::SRL, MVT::v16i8, { 11, 27,12,18 } },
1311 {
ISD::SRL, MVT::v32i8, { 23, 23,30,43 } },
1312 {
ISD::SRL, MVT::v8i16, { 13, 16,14,22 } },
1313 {
ISD::SRL, MVT::v16i16, { 28, 30,31,48 } },
1314 {
ISD::SRL, MVT::v4i32, { 6, 7,12,16 } },
1315 {
ISD::SRL, MVT::v8i32, { 14, 14,26,34 } },
1316 {
ISD::SRL, MVT::v2i64, { 2, 4, 4, 6 } },
1317 {
ISD::SRL, MVT::v4i64, { 6, 7,11,15 } },
1319 {
ISD::SRA, MVT::v16i8, { 21, 22,24,36 } },
1320 {
ISD::SRA, MVT::v32i8, { 44, 45,51,76 } },
1321 {
ISD::SRA, MVT::v8i16, { 13, 16,14,22 } },
1322 {
ISD::SRA, MVT::v16i16, { 28, 30,31,48 } },
1323 {
ISD::SRA, MVT::v4i32, { 6, 7,12,16 } },
1324 {
ISD::SRA, MVT::v8i32, { 14, 14,26,34 } },
1325 {
ISD::SRA, MVT::v2i64, { 5, 6,10,14 } },
1326 {
ISD::SRA, MVT::v4i64, { 12, 12,22,30 } },
1328 {
ISD::FNEG, MVT::v4f64, { 2, 2, 1, 2 } },
1329 {
ISD::FNEG, MVT::v8f32, { 2, 2, 1, 2 } },
1331 {
ISD::FADD, MVT::f64, { 1, 5, 1, 1 } },
1332 {
ISD::FADD, MVT::f32, { 1, 5, 1, 1 } },
1333 {
ISD::FADD, MVT::v2f64, { 1, 5, 1, 1 } },
1334 {
ISD::FADD, MVT::v4f32, { 1, 5, 1, 1 } },
1335 {
ISD::FADD, MVT::v4f64, { 2, 5, 1, 2 } },
1336 {
ISD::FADD, MVT::v8f32, { 2, 5, 1, 2 } },
1338 {
ISD::FSUB, MVT::f64, { 1, 5, 1, 1 } },
1339 {
ISD::FSUB, MVT::f32, { 1, 5, 1, 1 } },
1340 {
ISD::FSUB, MVT::v2f64, { 1, 5, 1, 1 } },
1341 {
ISD::FSUB, MVT::v4f32, { 1, 5, 1, 1 } },
1342 {
ISD::FSUB, MVT::v4f64, { 2, 5, 1, 2 } },
1343 {
ISD::FSUB, MVT::v8f32, { 2, 5, 1, 2 } },
1345 {
ISD::FMUL, MVT::f64, { 2, 5, 1, 1 } },
1346 {
ISD::FMUL, MVT::f32, { 1, 5, 1, 1 } },
1347 {
ISD::FMUL, MVT::v2f64, { 2, 5, 1, 1 } },
1348 {
ISD::FMUL, MVT::v4f32, { 1, 5, 1, 1 } },
1349 {
ISD::FMUL, MVT::v4f64, { 4, 5, 1, 2 } },
1350 {
ISD::FMUL, MVT::v8f32, { 2, 5, 1, 2 } },
1352 {
ISD::FDIV, MVT::f32, { 14, 14, 1, 1 } },
1353 {
ISD::FDIV, MVT::v4f32, { 14, 14, 1, 1 } },
1354 {
ISD::FDIV, MVT::v8f32, { 28, 29, 1, 3 } },
1355 {
ISD::FDIV, MVT::f64, { 22, 22, 1, 1 } },
1356 {
ISD::FDIV, MVT::v2f64, { 22, 22, 1, 1 } },
1357 {
ISD::FDIV, MVT::v4f64, { 44, 45, 1, 3 } },
1362 if (
auto KindCost = Entry->Cost[
CostKind])
1363 return LT.first * *KindCost;
1366 {
ISD::FADD, MVT::f64, { 1, 3, 1, 1 } },
1367 {
ISD::FADD, MVT::f32, { 1, 3, 1, 1 } },
1368 {
ISD::FADD, MVT::v2f64, { 1, 3, 1, 1 } },
1369 {
ISD::FADD, MVT::v4f32, { 1, 3, 1, 1 } },
1371 {
ISD::FSUB, MVT::f64, { 1, 3, 1, 1 } },
1372 {
ISD::FSUB, MVT::f32 , { 1, 3, 1, 1 } },
1373 {
ISD::FSUB, MVT::v2f64, { 1, 3, 1, 1 } },
1374 {
ISD::FSUB, MVT::v4f32, { 1, 3, 1, 1 } },
1376 {
ISD::FMUL, MVT::f64, { 1, 5, 1, 1 } },
1377 {
ISD::FMUL, MVT::f32, { 1, 5, 1, 1 } },
1378 {
ISD::FMUL, MVT::v2f64, { 1, 5, 1, 1 } },
1379 {
ISD::FMUL, MVT::v4f32, { 1, 5, 1, 1 } },
1381 {
ISD::FDIV, MVT::f32, { 14, 14, 1, 1 } },
1382 {
ISD::FDIV, MVT::v4f32, { 14, 14, 1, 1 } },
1383 {
ISD::FDIV, MVT::f64, { 22, 22, 1, 1 } },
1384 {
ISD::FDIV, MVT::v2f64, { 22, 22, 1, 1 } },
1386 {
ISD::MUL, MVT::v2i64, { 6, 10,10,10 } }
1391 if (
auto KindCost = Entry->Cost[
CostKind])
1392 return LT.first * *KindCost;
1395 {
ISD::SHL, MVT::v16i8, { 15, 24,17,22 } },
1396 {
ISD::SHL, MVT::v8i16, { 11, 14,11,11 } },
1397 {
ISD::SHL, MVT::v4i32, { 14, 20, 4,10 } },
1399 {
ISD::SRL, MVT::v16i8, { 16, 27,18,24 } },
1400 {
ISD::SRL, MVT::v8i16, { 22, 26,23,27 } },
1401 {
ISD::SRL, MVT::v4i32, { 16, 17,15,19 } },
1402 {
ISD::SRL, MVT::v2i64, { 4, 6, 5, 7 } },
1404 {
ISD::SRA, MVT::v16i8, { 38, 41,30,36 } },
1405 {
ISD::SRA, MVT::v8i16, { 22, 26,23,27 } },
1406 {
ISD::SRA, MVT::v4i32, { 16, 17,15,19 } },
1407 {
ISD::SRA, MVT::v2i64, { 8, 17, 5, 7 } },
1409 {
ISD::MUL, MVT::v4i32, { 2, 11, 1, 1 } }
1414 if (
auto KindCost = Entry->Cost[
CostKind])
1415 return LT.first * *KindCost;
1418 {
ISD::MUL, MVT::v16i8, { 5, 18,10,12 } },
1423 if (
auto KindCost = Entry->Cost[
CostKind])
1424 return LT.first * *KindCost;
1429 {
ISD::SHL, MVT::v16i8, { 13, 21,26,28 } },
1430 {
ISD::SHL, MVT::v8i16, { 24, 27,16,20 } },
1431 {
ISD::SHL, MVT::v4i32, { 17, 19,10,12 } },
1432 {
ISD::SHL, MVT::v2i64, { 4, 6, 5, 7 } },
1434 {
ISD::SRL, MVT::v16i8, { 14, 28,27,30 } },
1435 {
ISD::SRL, MVT::v8i16, { 16, 19,31,31 } },
1436 {
ISD::SRL, MVT::v4i32, { 12, 12,15,19 } },
1437 {
ISD::SRL, MVT::v2i64, { 4, 6, 5, 7 } },
1439 {
ISD::SRA, MVT::v16i8, { 27, 30,54,54 } },
1440 {
ISD::SRA, MVT::v8i16, { 16, 19,31,31 } },
1441 {
ISD::SRA, MVT::v4i32, { 12, 12,15,19 } },
1442 {
ISD::SRA, MVT::v2i64, { 8, 11,12,16 } },
1444 {
ISD::AND, MVT::v16i8, { 1, 1, 1, 1 } },
1445 {
ISD::AND, MVT::v8i16, { 1, 1, 1, 1 } },
1446 {
ISD::AND, MVT::v4i32, { 1, 1, 1, 1 } },
1447 {
ISD::AND, MVT::v2i64, { 1, 1, 1, 1 } },
1449 {
ISD::OR, MVT::v16i8, { 1, 1, 1, 1 } },
1450 {
ISD::OR, MVT::v8i16, { 1, 1, 1, 1 } },
1451 {
ISD::OR, MVT::v4i32, { 1, 1, 1, 1 } },
1452 {
ISD::OR, MVT::v2i64, { 1, 1, 1, 1 } },
1454 {
ISD::XOR, MVT::v16i8, { 1, 1, 1, 1 } },
1455 {
ISD::XOR, MVT::v8i16, { 1, 1, 1, 1 } },
1456 {
ISD::XOR, MVT::v4i32, { 1, 1, 1, 1 } },
1457 {
ISD::XOR, MVT::v2i64, { 1, 1, 1, 1 } },
1459 {
ISD::ADD, MVT::v2i64, { 1, 2, 1, 2 } },
1460 {
ISD::SUB, MVT::v2i64, { 1, 2, 1, 2 } },
1462 {
ISD::MUL, MVT::v16i8, { 6, 18,12,12 } },
1463 {
ISD::MUL, MVT::v8i16, { 1, 5, 1, 1 } },
1464 {
ISD::MUL, MVT::v4i32, { 6, 8, 7, 7 } },
1465 {
ISD::MUL, MVT::v2i64, { 7, 10,10,10 } },
1467 { X86ISD::PMULUDQ, MVT::v2i64, { 1, 5, 1, 1 } },
1469 {
ISD::FDIV, MVT::f32, { 23, 23, 1, 1 } },
1470 {
ISD::FDIV, MVT::v4f32, { 39, 39, 1, 1 } },
1471 {
ISD::FDIV, MVT::f64, { 38, 38, 1, 1 } },
1472 {
ISD::FDIV, MVT::v2f64, { 69, 69, 1, 1 } },
1474 {
ISD::FNEG, MVT::f32, { 1, 1, 1, 1 } },
1475 {
ISD::FNEG, MVT::f64, { 1, 1, 1, 1 } },
1476 {
ISD::FNEG, MVT::v4f32, { 1, 1, 1, 1 } },
1477 {
ISD::FNEG, MVT::v2f64, { 1, 1, 1, 1 } },
1479 {
ISD::FADD, MVT::f32, { 2, 3, 1, 1 } },
1480 {
ISD::FADD, MVT::f64, { 2, 3, 1, 1 } },
1481 {
ISD::FADD, MVT::v2f64, { 2, 3, 1, 1 } },
1483 {
ISD::FSUB, MVT::f32, { 2, 3, 1, 1 } },
1484 {
ISD::FSUB, MVT::f64, { 2, 3, 1, 1 } },
1485 {
ISD::FSUB, MVT::v2f64, { 2, 3, 1, 1 } },
1487 {
ISD::FMUL, MVT::f64, { 2, 5, 1, 1 } },
1488 {
ISD::FMUL, MVT::v2f64, { 2, 5, 1, 1 } },
1493 if (
auto KindCost = Entry->Cost[
CostKind])
1494 return LT.first * *KindCost;
1497 {
ISD::FDIV, MVT::f32, { 17, 18, 1, 1 } },
1498 {
ISD::FDIV, MVT::v4f32, { 34, 48, 1, 1 } },
1500 {
ISD::FNEG, MVT::f32, { 2, 2, 1, 2 } },
1501 {
ISD::FNEG, MVT::v4f32, { 2, 2, 1, 2 } },
1503 {
ISD::FADD, MVT::f32, { 1, 3, 1, 1 } },
1504 {
ISD::FADD, MVT::v4f32, { 2, 3, 1, 1 } },
1506 {
ISD::FSUB, MVT::f32, { 1, 3, 1, 1 } },
1507 {
ISD::FSUB, MVT::v4f32, { 2, 3, 1, 1 } },
1509 {
ISD::FMUL, MVT::f32, { 2, 5, 1, 1 } },
1510 {
ISD::FMUL, MVT::v4f32, { 2, 5, 1, 1 } },
1515 if (
auto KindCost = Entry->Cost[
CostKind])
1516 return LT.first * *KindCost;
1521 {
ISD::MUL, MVT::i64, { 2, 6, 1, 2 } },
1526 if (
auto KindCost = Entry->Cost[
CostKind])
1527 return LT.first * *KindCost;
1538 {
ISD::MUL, MVT::i8, { 3, 4, 1, 1 } },
1539 {
ISD::MUL, MVT::i16, { 2, 4, 1, 1 } },
1540 {
ISD::MUL, MVT::i32, { 1, 4, 1, 1 } },
1542 {
ISD::FNEG, MVT::f64, { 2, 2, 1, 3 } },
1543 {
ISD::FADD, MVT::f64, { 2, 3, 1, 1 } },
1544 {
ISD::FSUB, MVT::f64, { 2, 3, 1, 1 } },
1545 {
ISD::FMUL, MVT::f64, { 2, 5, 1, 1 } },
1546 {
ISD::FDIV, MVT::f64, { 38, 38, 1, 1 } },
1550 if (
auto KindCost = Entry->Cost[
CostKind])
1551 return LT.first * *KindCost;
1565 return 20 * LT.first * LT.second.getVectorNumElements() * ScalarCost;
1607 "Expected the Mask to match the return size if given");
1609 "Expected the same scalar types");
1618 if (!Args.empty() &&
1624 Mask.size() == (2 * SrcTy->getElementCount().getKnownMinValue()) &&
1633 if (LT.second != MVT::v4f64 && LT.second != MVT::v4i64)
1647 auto IsBroadcastLoadFoldUser = [&](
const User *U) {
1650 if (U->getType()->isVectorTy())
1655 if (
I->isTerminator() ||
1660 return CB->doesNotAccessMemory() && !CB->mayHaveSideEffects();
1663 auto IsFoldableSLPBroadcastLoad = [&]() {
1671 if (Args[0]->getNumUses() != FVT->getNumElements())
1673 return all_of(Args[0]->
users(), IsBroadcastLoadFoldUser);
1675 if (!Args.empty() &&
1677 IsFoldableSLPBroadcastLoad()) &&
1679 (ST->hasAVX() && LT.second.getScalarSizeInBits() >= 32)))
1686 bool IsInLaneShuffle =
false;
1687 bool IsSingleElementMask =
false;
1688 if (SrcTy->getPrimitiveSizeInBits() > 0 &&
1689 (SrcTy->getPrimitiveSizeInBits() % 128) == 0 &&
1690 SrcTy->getScalarSizeInBits() == LT.second.getScalarSizeInBits() &&
1691 Mask.size() == SrcTy->getElementCount().getKnownMinValue()) {
1692 unsigned NumLanes = SrcTy->getPrimitiveSizeInBits() / 128;
1693 unsigned NumEltsPerLane = Mask.size() / NumLanes;
1694 if ((Mask.size() % NumLanes) == 0) {
1697 ((
P.value() % Mask.size()) / NumEltsPerLane) ==
1698 (
P.index() / NumEltsPerLane);
1700 IsSingleElementMask =
1701 (Mask.size() - 1) ==
static_cast<unsigned>(
count_if(Mask, [](
int M) {
1708 if (LT.second.isVectorOf(MVT::bf16))
1709 LT.second = LT.second.changeVectorElementType(MVT::f16);
1714 int NumElts = LT.second.getVectorNumElements();
1715 if ((Index % NumElts) == 0)
1718 if (SubLT.second.isVector()) {
1719 int NumSubElts = SubLT.second.getVectorNumElements();
1720 if ((Index % NumSubElts) == 0 && (NumElts % NumSubElts) == 0)
1729 if (NumSubElts > OrigSubElts && (Index % OrigSubElts) == 0 &&
1730 (NumSubElts % OrigSubElts) == 0 &&
1731 LT.second.getVectorElementType() ==
1732 SubLT.second.getVectorElementType() &&
1733 LT.second.getVectorElementType().getSizeInBits() ==
1734 SrcTy->getElementType()->getPrimitiveSizeInBits()) {
1735 assert(NumElts >= NumSubElts && NumElts > OrigSubElts &&
1736 "Unexpected number of elements!");
1738 LT.second.getVectorNumElements());
1740 SubLT.second.getVectorNumElements());
1741 int ExtractIndex =
alignDown((Index % NumElts), NumSubElts);
1744 ExtractIndex, SubTy);
1749 return ExtractCost + 1;
1752 "Unexpected vector size");
1754 return ExtractCost + 2;
1768 int NumElts = DstLT.second.getVectorNumElements();
1770 if (SubLT.second.isVector()) {
1771 int NumSubElts = SubLT.second.getVectorNumElements();
1772 bool MatchingTypes =
1773 NumElts == NumSubElts &&
1775 if ((Index % NumSubElts) == 0 && (NumElts % NumSubElts) == 0)
1782 if (LT.first == 1 && LT.second == MVT::v4f32 && SubLT.first == 1 &&
1783 SubLT.second == MVT::f32 && (Index == 0 || ST->hasSSE41()))
1794 EVT VT = TLI->getValueType(
DL, SrcTy);
1828 if (
const auto *Entry =
1830 if (
auto KindCost = Entry->Cost[
CostKind])
1831 return LT.first * *KindCost;
1837 if (LT.first != 1) {
1838 MVT LegalVT = LT.second;
1841 SrcTy->getElementType()->getPrimitiveSizeInBits() &&
1844 unsigned VecTySize =
DL.getTypeStoreSize(SrcTy);
1847 unsigned NumOfSrcs = (VecTySize + LegalVTSize - 1) / LegalVTSize;
1854 if (!Mask.empty() && NumOfDests.
isValid()) {
1872 unsigned E = NumOfDests.
getValue();
1873 unsigned NormalizedVF =
1879 unsigned PrevSrcReg = 0;
1883 NormalizedMask, NumOfSrcRegs, NumOfDestRegs, NumOfDestRegs, []() {},
1884 [
this, SingleOpTy,
CostKind, &PrevSrcReg, &PrevRegMask,
1889 if (PrevRegMask.
empty() || PrevSrcReg != SrcReg ||
1890 PrevRegMask != RegMask)
1893 SingleOpTy, RegMask,
CostKind, 0,
nullptr);
1899 if (SrcReg != DestReg &&
1904 PrevSrcReg = SrcReg;
1905 PrevRegMask = RegMask;
1911 SingleOpTy, RegMask,
CostKind, 0,
nullptr);
1928 if (LT.first == 1 && IsInLaneShuffle && IsSingleElementMask)
1942 if (
const auto *Entry =
1944 if (
auto KindCost = Entry->Cost[
CostKind])
1945 return LT.first * *KindCost;
1979 if (
const auto *Entry =
1981 if (
auto KindCost = Entry->Cost[
CostKind])
1982 return LT.first * *KindCost;
1995 if (IsInLaneShuffle && ST->hasAVX512())
1996 if (
const auto *Entry =
1998 if (
auto KindCost = Entry->Cost[
CostKind])
1999 return LT.first * *KindCost;
2082 if (ST->hasAVX512())
2083 if (
const auto *Entry =
CostTableLookup(AVX512ShuffleTbl, Kind, LT.second))
2084 if (
auto KindCost = Entry->Cost[
CostKind])
2085 return LT.first * *KindCost;
2104 if (IsInLaneShuffle && ST->hasAVX2())
2105 if (
const auto *Entry =
2107 if (
auto KindCost = Entry->Cost[
CostKind])
2108 return LT.first * *KindCost;
2158 if (
const auto *Entry =
CostTableLookup(AVX2ShuffleTbl, Kind, LT.second))
2159 if (
auto KindCost = Entry->Cost[
CostKind])
2160 return LT.first * *KindCost;
2182 if (
const auto *Entry =
CostTableLookup(XOPShuffleTbl, Kind, LT.second))
2183 if (
auto KindCost = Entry->Cost[
CostKind])
2184 return LT.first * *KindCost;
2214 if (IsInLaneShuffle && ST->hasAVX())
2215 if (
const auto *Entry =
2217 if (
auto KindCost = Entry->Cost[
CostKind])
2218 return LT.first * *KindCost;
2280 if (
const auto *Entry =
CostTableLookup(AVX1ShuffleTbl, Kind, LT.second))
2281 if (
auto KindCost = Entry->Cost[
CostKind])
2282 return LT.first * *KindCost;
2295 if (
const auto *Entry =
CostTableLookup(SSE41ShuffleTbl, Kind, LT.second))
2296 if (
auto KindCost = Entry->Cost[
CostKind])
2297 return LT.first * *KindCost;
2324 if (
const auto *Entry =
CostTableLookup(SSSE3ShuffleTbl, Kind, LT.second))
2325 if (
auto KindCost = Entry->Cost[
CostKind])
2326 return LT.first * *KindCost;
2380 if (ST->hasSSE2()) {
2383 if (ST->hasSSE3() && IsLoad)
2384 if (
const auto *Entry =
2387 LT.second.getVectorElementCount()) &&
2388 "Table entry missing from isLegalBroadcastLoad()");
2389 return LT.first * Entry->Cost;
2392 if (
const auto *Entry =
CostTableLookup(SSE2ShuffleTbl, Kind, LT.second))
2393 if (
auto KindCost = Entry->Cost[
CostKind])
2394 return LT.first * *KindCost;
2406 if (ST->hasSSE1()) {
2407 if (LT.first == 1 && LT.second == MVT::v4f32 && Mask.size() == 4) {
2409 auto MatchSHUFPS = [](
int X,
int Y) {
2410 return X < 0 ||
Y < 0 || ((
X & 4) == (
Y & 4));
2412 if (MatchSHUFPS(Mask[0], Mask[1]) && MatchSHUFPS(Mask[2], Mask[3]))
2415 if (
const auto *Entry =
CostTableLookup(SSE1ShuffleTbl, Kind, LT.second))
2416 if (
auto KindCost = Entry->Cost[
CostKind])
2417 return LT.first * *KindCost;
2429 int ISD = TLI->InstructionOpcodeToISD(Opcode);
2557 {
ISD::FP_ROUND, MVT::v16f16, MVT::v16f32, { 1, 1, 1, 1 } },
2579 {
ISD::TRUNCATE, MVT::v16i16, MVT::v16i32, { 2, 1, 1, 1 } },
2580 {
ISD::TRUNCATE, MVT::v32i16, MVT::v16i32, { 2, 1, 1, 1 } },
2927 {
ISD::TRUNCATE, MVT::v16i16, MVT::v16i32, { 4, 1, 1, 1 } },
3004 {
ISD::TRUNCATE, MVT::v16i16, MVT::v16i32, { 6, 1, 1, 1 } },
3228 {
ISD::TRUNCATE, MVT::v16i16, MVT::v16i32, {10, 1, 1, 1 } },
3246 EVT SrcTy = TLI->getValueType(
DL, Src);
3247 EVT DstTy = TLI->getValueType(
DL, Dst);
3253 if (
I && Opcode == Instruction::CastOps::SExt &&
3254 SrcTy.isFixedLengthVectorOf(MVT::i1)) {
3256 Type *CmpTy = CmpI->getOperand(0)->getType();
3264 if (SrcTy.isSimple() && DstTy.
isSimple()) {
3265 MVT SimpleSrcTy = SrcTy.getSimpleVT();
3268 if (ST->useAVX512Regs()) {
3271 AVX512BWConversionTbl,
ISD, SimpleDstTy, SimpleSrcTy))
3272 if (
auto KindCost = Entry->Cost[
CostKind])
3277 AVX512DQConversionTbl,
ISD, SimpleDstTy, SimpleSrcTy))
3278 if (
auto KindCost = Entry->Cost[
CostKind])
3281 if (ST->hasAVX512())
3283 AVX512FConversionTbl,
ISD, SimpleDstTy, SimpleSrcTy))
3284 if (
auto KindCost = Entry->Cost[
CostKind])
3290 AVX512BWVLConversionTbl,
ISD, SimpleDstTy, SimpleSrcTy))
3291 if (
auto KindCost = Entry->Cost[
CostKind])
3296 AVX512DQVLConversionTbl,
ISD, SimpleDstTy, SimpleSrcTy))
3297 if (
auto KindCost = Entry->Cost[
CostKind])
3300 if (ST->hasAVX512())
3302 SimpleDstTy, SimpleSrcTy))
3303 if (
auto KindCost = Entry->Cost[
CostKind])
3306 if (ST->hasAVX2()) {
3308 SimpleDstTy, SimpleSrcTy))
3309 if (
auto KindCost = Entry->Cost[
CostKind])
3315 SimpleDstTy, SimpleSrcTy))
3316 if (
auto KindCost = Entry->Cost[
CostKind])
3320 if (ST->hasF16C()) {
3322 SimpleDstTy, SimpleSrcTy))
3323 if (
auto KindCost = Entry->Cost[
CostKind])
3327 if (ST->hasSSE41()) {
3329 SimpleDstTy, SimpleSrcTy))
3330 if (
auto KindCost = Entry->Cost[
CostKind])
3334 if (ST->hasSSE2()) {
3336 SimpleDstTy, SimpleSrcTy))
3337 if (
auto KindCost = Entry->Cost[
CostKind])
3357 if (ST->useAVX512Regs()) {
3360 AVX512BWConversionTbl,
ISD, LTDest.second, LTSrc.second))
3361 if (
auto KindCost = Entry->Cost[
CostKind])
3362 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3366 AVX512DQConversionTbl,
ISD, LTDest.second, LTSrc.second))
3367 if (
auto KindCost = Entry->Cost[
CostKind])
3368 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3370 if (ST->hasAVX512())
3372 AVX512FConversionTbl,
ISD, LTDest.second, LTSrc.second))
3373 if (
auto KindCost = Entry->Cost[
CostKind])
3374 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3379 LTDest.second, LTSrc.second))
3380 if (
auto KindCost = Entry->Cost[
CostKind])
3381 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3385 LTDest.second, LTSrc.second))
3386 if (
auto KindCost = Entry->Cost[
CostKind])
3387 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3389 if (ST->hasAVX512())
3391 LTDest.second, LTSrc.second))
3392 if (
auto KindCost = Entry->Cost[
CostKind])
3393 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3397 LTDest.second, LTSrc.second))
3398 if (
auto KindCost = Entry->Cost[
CostKind])
3399 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3403 LTDest.second, LTSrc.second))
3404 if (
auto KindCost = Entry->Cost[
CostKind])
3405 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3407 if (ST->hasF16C()) {
3409 LTDest.second, LTSrc.second))
3410 if (
auto KindCost = Entry->Cost[
CostKind])
3411 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3416 LTDest.second, LTSrc.second))
3417 if (
auto KindCost = Entry->Cost[
CostKind])
3418 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3422 LTDest.second, LTSrc.second))
3423 if (
auto KindCost = Entry->Cost[
CostKind])
3424 return std::max(LTSrc.first, LTDest.first) * *KindCost;
3429 1 < Src->getScalarSizeInBits() && Src->getScalarSizeInBits() < 32) {
3446 1 < Dst->getScalarSizeInBits() && Dst->getScalarSizeInBits() < 32) {
3457 return Cost == 0 ? 0 :
N;
3778 {
ISD::FSHL, MVT::v8i64, { 1, 1, 1, 1 } },
3779 {
ISD::FSHL, MVT::v4i64, { 1, 1, 1, 1 } },
3780 {
ISD::FSHL, MVT::v2i64, { 1, 1, 1, 1 } },
3781 {
ISD::FSHL, MVT::v16i32, { 1, 1, 1, 1 } },
3782 {
ISD::FSHL, MVT::v8i32, { 1, 1, 1, 1 } },
3783 {
ISD::FSHL, MVT::v4i32, { 1, 1, 1, 1 } },
3784 {
ISD::FSHL, MVT::v32i16, { 1, 1, 1, 1 } },
3785 {
ISD::FSHL, MVT::v16i16, { 1, 1, 1, 1 } },
3786 {
ISD::FSHL, MVT::v8i16, { 1, 1, 1, 1 } },
3787 {
ISD::ROTL, MVT::v32i16, { 1, 1, 1, 1 } },
3788 {
ISD::ROTL, MVT::v16i16, { 1, 1, 1, 1 } },
3789 {
ISD::ROTL, MVT::v8i16, { 1, 1, 1, 1 } },
3790 {
ISD::ROTR, MVT::v32i16, { 1, 1, 1, 1 } },
3791 {
ISD::ROTR, MVT::v16i16, { 1, 1, 1, 1 } },
3792 {
ISD::ROTR, MVT::v8i16, { 1, 1, 1, 1 } },
3793 { X86ISD::VROTLI, MVT::v32i16, { 1, 1, 1, 1 } },
3794 { X86ISD::VROTLI, MVT::v16i16, { 1, 1, 1, 1 } },
3795 { X86ISD::VROTLI, MVT::v8i16, { 1, 1, 1, 1 } },
3814 {
ISD::CTLZ, MVT::v8i64, { 1, 5, 1, 1 } },
3815 {
ISD::CTLZ, MVT::v16i32, { 1, 5, 1, 1 } },
3816 {
ISD::CTLZ, MVT::v32i16, { 18, 27, 23, 27 } },
3817 {
ISD::CTLZ, MVT::v64i8, { 3, 16, 9, 11 } },
3818 {
ISD::CTLZ, MVT::v4i64, { 1, 5, 1, 1 } },
3819 {
ISD::CTLZ, MVT::v8i32, { 1, 5, 1, 1 } },
3820 {
ISD::CTLZ, MVT::v16i16, { 8, 19, 11, 13 } },
3821 {
ISD::CTLZ, MVT::v32i8, { 2, 11, 9, 10 } },
3822 {
ISD::CTLZ, MVT::v2i64, { 1, 5, 1, 1 } },
3823 {
ISD::CTLZ, MVT::v4i32, { 1, 5, 1, 1 } },
3824 {
ISD::CTLZ, MVT::v8i16, { 3, 15, 4, 6 } },
3825 {
ISD::CTLZ, MVT::v16i8, { 2, 10, 9, 10 } },
3827 {
ISD::CTTZ, MVT::v8i64, { 2, 8, 6, 7 } },
3828 {
ISD::CTTZ, MVT::v16i32, { 2, 8, 6, 7 } },
3829 {
ISD::CTTZ, MVT::v4i64, { 1, 8, 6, 6 } },
3830 {
ISD::CTTZ, MVT::v8i32, { 1, 8, 6, 6 } },
3831 {
ISD::CTTZ, MVT::v2i64, { 1, 8, 6, 6 } },
3832 {
ISD::CTTZ, MVT::v4i32, { 1, 8, 6, 6 } },
3835 {
ISD::ABS, MVT::v32i16, { 1, 1, 1, 1 } },
3836 {
ISD::ABS, MVT::v64i8, { 1, 1, 1, 1 } },
3858 {
ISD::CTLZ, MVT::v8i64, { 8, 22, 23, 23 } },
3859 {
ISD::CTLZ, MVT::v16i32, { 8, 23, 25, 25 } },
3860 {
ISD::CTLZ, MVT::v32i16, { 4, 15, 15, 16 } },
3861 {
ISD::CTLZ, MVT::v64i8, { 3, 12, 10, 9 } },
3862 {
ISD::CTPOP, MVT::v2i64, { 3, 7, 10, 10 } },
3863 {
ISD::CTPOP, MVT::v4i64, { 3, 7, 10, 10 } },
3864 {
ISD::CTPOP, MVT::v8i64, { 3, 8, 10, 12 } },
3865 {
ISD::CTPOP, MVT::v4i32, { 7, 11, 14, 14 } },
3866 {
ISD::CTPOP, MVT::v8i32, { 7, 11, 14, 14 } },
3867 {
ISD::CTPOP, MVT::v16i32, { 7, 12, 14, 16 } },
3868 {
ISD::CTPOP, MVT::v8i16, { 2, 7, 11, 11 } },
3869 {
ISD::CTPOP, MVT::v16i16, { 2, 7, 11, 11 } },
3870 {
ISD::CTPOP, MVT::v32i16, { 3, 7, 11, 13 } },
3874 {
ISD::CTTZ, MVT::v8i16, { 3, 9, 14, 14 } },
3875 {
ISD::CTTZ, MVT::v16i16, { 3, 9, 14, 14 } },
3876 {
ISD::CTTZ, MVT::v32i16, { 3, 10, 14, 16 } },
3877 {
ISD::CTTZ, MVT::v16i8, { 2, 6, 11, 11 } },
3878 {
ISD::CTTZ, MVT::v32i8, { 2, 6, 11, 11 } },
3879 {
ISD::CTTZ, MVT::v64i8, { 3, 7, 11, 13 } },
3880 {
ISD::ROTL, MVT::v32i16, { 2, 8, 6, 8 } },
3881 {
ISD::ROTL, MVT::v16i16, { 2, 8, 6, 7 } },
3882 {
ISD::ROTL, MVT::v8i16, { 2, 7, 6, 7 } },
3883 {
ISD::ROTL, MVT::v64i8, { 5, 6, 11, 12 } },
3884 {
ISD::ROTL, MVT::v32i8, { 5, 15, 7, 10 } },
3885 {
ISD::ROTL, MVT::v16i8, { 5, 15, 7, 10 } },
3886 {
ISD::ROTR, MVT::v32i16, { 2, 8, 6, 8 } },
3887 {
ISD::ROTR, MVT::v16i16, { 2, 8, 6, 7 } },
3888 {
ISD::ROTR, MVT::v8i16, { 2, 7, 6, 7 } },
3889 {
ISD::ROTR, MVT::v64i8, { 5, 6, 12, 14 } },
3890 {
ISD::ROTR, MVT::v32i8, { 5, 14, 6, 9 } },
3891 {
ISD::ROTR, MVT::v16i8, { 5, 14, 6, 9 } },
3892 { X86ISD::VROTLI, MVT::v32i16, { 2, 5, 3, 3 } },
3893 { X86ISD::VROTLI, MVT::v16i16, { 1, 5, 3, 3 } },
3894 { X86ISD::VROTLI, MVT::v8i16, { 1, 5, 3, 3 } },
3895 { X86ISD::VROTLI, MVT::v64i8, { 2, 9, 3, 4 } },
3896 { X86ISD::VROTLI, MVT::v32i8, { 1, 9, 3, 4 } },
3897 { X86ISD::VROTLI, MVT::v16i8, { 1, 8, 3, 4 } },
3900 {
ISD::SMAX, MVT::v32i16, { 1, 1, 1, 1 } },
3901 {
ISD::SMAX, MVT::v64i8, { 1, 1, 1, 1 } },
3902 {
ISD::SMIN, MVT::v32i16, { 1, 1, 1, 1 } },
3903 {
ISD::SMIN, MVT::v64i8, { 1, 1, 1, 1 } },
3905 {
ISD::SMULO, MVT::v64i8, { 8, 21, 17, 18 } },
3907 {
ISD::UMULO, MVT::v64i8, { 8, 15, 15, 16 } },
3912 {
ISD::UMAX, MVT::v32i16, { 1, 1, 1, 1 } },
3913 {
ISD::UMAX, MVT::v64i8, { 1, 1, 1, 1 } },
3914 {
ISD::UMIN, MVT::v32i16, { 1, 1, 1, 1 } },
3915 {
ISD::UMIN, MVT::v64i8, { 1, 1, 1, 1 } },
3920 {
ISD::ABS, MVT::v8i64, { 1, 1, 1, 1 } },
3921 {
ISD::ABS, MVT::v4i64, { 1, 1, 1, 1 } },
3922 {
ISD::ABS, MVT::v2i64, { 1, 1, 1, 1 } },
3923 {
ISD::ABS, MVT::v16i32, { 1, 1, 1, 1 } },
3924 {
ISD::ABS, MVT::v8i32, { 1, 1, 1, 1 } },
3925 {
ISD::ABS, MVT::v32i16, { 2, 7, 4, 4 } },
3926 {
ISD::ABS, MVT::v16i16, { 1, 1, 1, 1 } },
3927 {
ISD::ABS, MVT::v64i8, { 2, 7, 4, 4 } },
3928 {
ISD::ABS, MVT::v32i8, { 1, 1, 1, 1 } },
3936 {
ISD::CTLZ, MVT::v8i64, { 10, 28, 32, 32 } },
3937 {
ISD::CTLZ, MVT::v16i32, { 12, 30, 38, 38 } },
3938 {
ISD::CTLZ, MVT::v32i16, { 8, 15, 29, 29 } },
3939 {
ISD::CTLZ, MVT::v64i8, { 6, 11, 19, 19 } },
3940 {
ISD::CTPOP, MVT::v8i64, { 16, 16, 19, 19 } },
3941 {
ISD::CTPOP, MVT::v16i32, { 24, 19, 27, 27 } },
3942 {
ISD::CTPOP, MVT::v32i16, { 18, 15, 22, 22 } },
3943 {
ISD::CTPOP, MVT::v64i8, { 12, 11, 16, 16 } },
3944 {
ISD::CTTZ, MVT::v8i64, { 2, 8, 6, 7 } },
3945 {
ISD::CTTZ, MVT::v16i32, { 2, 8, 6, 7 } },
3946 {
ISD::CTTZ, MVT::v32i16, { 7, 17, 27, 27 } },
3947 {
ISD::CTTZ, MVT::v64i8, { 6, 13, 21, 21 } },
3948 {
ISD::ROTL, MVT::v8i64, { 1, 1, 1, 1 } },
3949 {
ISD::ROTL, MVT::v4i64, { 1, 1, 1, 1 } },
3950 {
ISD::ROTL, MVT::v2i64, { 1, 1, 1, 1 } },
3951 {
ISD::ROTL, MVT::v16i32, { 1, 1, 1, 1 } },
3952 {
ISD::ROTL, MVT::v8i32, { 1, 1, 1, 1 } },
3953 {
ISD::ROTL, MVT::v4i32, { 1, 1, 1, 1 } },
3954 {
ISD::ROTR, MVT::v8i64, { 1, 1, 1, 1 } },
3955 {
ISD::ROTR, MVT::v4i64, { 1, 1, 1, 1 } },
3956 {
ISD::ROTR, MVT::v2i64, { 1, 1, 1, 1 } },
3957 {
ISD::ROTR, MVT::v16i32, { 1, 1, 1, 1 } },
3958 {
ISD::ROTR, MVT::v8i32, { 1, 1, 1, 1 } },
3959 {
ISD::ROTR, MVT::v4i32, { 1, 1, 1, 1 } },
3960 { X86ISD::VROTLI, MVT::v8i64, { 1, 1, 1, 1 } },
3961 { X86ISD::VROTLI, MVT::v4i64, { 1, 1, 1, 1 } },
3962 { X86ISD::VROTLI, MVT::v2i64, { 1, 1, 1, 1 } },
3963 { X86ISD::VROTLI, MVT::v16i32, { 1, 1, 1, 1 } },
3964 { X86ISD::VROTLI, MVT::v8i32, { 1, 1, 1, 1 } },
3965 { X86ISD::VROTLI, MVT::v4i32, { 1, 1, 1, 1 } },
3974 {
ISD::SMAX, MVT::v8i64, { 1, 3, 1, 1 } },
3975 {
ISD::SMAX, MVT::v16i32, { 1, 1, 1, 1 } },
3976 {
ISD::SMAX, MVT::v32i16, { 3, 7, 5, 5 } },
3977 {
ISD::SMAX, MVT::v64i8, { 3, 7, 5, 5 } },
3978 {
ISD::SMAX, MVT::v4i64, { 1, 3, 1, 1 } },
3979 {
ISD::SMAX, MVT::v2i64, { 1, 3, 1, 1 } },
3980 {
ISD::SMIN, MVT::v8i64, { 1, 3, 1, 1 } },
3981 {
ISD::SMIN, MVT::v16i32, { 1, 1, 1, 1 } },
3982 {
ISD::SMIN, MVT::v32i16, { 3, 7, 5, 5 } },
3983 {
ISD::SMIN, MVT::v64i8, { 3, 7, 5, 5 } },
3984 {
ISD::SMIN, MVT::v4i64, { 1, 3, 1, 1 } },
3985 {
ISD::SMIN, MVT::v2i64, { 1, 3, 1, 1 } },
3986 {
ISD::SMULO, MVT::v8i64, { 44, 44, 81, 93 } },
3987 {
ISD::SMULO, MVT::v16i32, { 5, 12, 9, 11 } },
3988 {
ISD::SMULO, MVT::v32i16, { 6, 12, 17, 17 } },
3989 {
ISD::SMULO, MVT::v64i8, { 22, 28, 42, 42 } },
3998 {
ISD::UMAX, MVT::v8i64, { 1, 3, 1, 1 } },
3999 {
ISD::UMAX, MVT::v16i32, { 1, 1, 1, 1 } },
4000 {
ISD::UMAX, MVT::v32i16, { 3, 7, 5, 5 } },
4001 {
ISD::UMAX, MVT::v64i8, { 3, 7, 5, 5 } },
4002 {
ISD::UMAX, MVT::v4i64, { 1, 3, 1, 1 } },
4003 {
ISD::UMAX, MVT::v2i64, { 1, 3, 1, 1 } },
4004 {
ISD::UMIN, MVT::v8i64, { 1, 3, 1, 1 } },
4005 {
ISD::UMIN, MVT::v16i32, { 1, 1, 1, 1 } },
4006 {
ISD::UMIN, MVT::v32i16, { 3, 7, 5, 5 } },
4007 {
ISD::UMIN, MVT::v64i8, { 3, 7, 5, 5 } },
4008 {
ISD::UMIN, MVT::v4i64, { 1, 3, 1, 1 } },
4009 {
ISD::UMIN, MVT::v2i64, { 1, 3, 1, 1 } },
4010 {
ISD::UMULO, MVT::v8i64, { 52, 52, 95, 104} },
4011 {
ISD::UMULO, MVT::v16i32, { 5, 12, 8, 10 } },
4012 {
ISD::UMULO, MVT::v32i16, { 5, 13, 16, 16 } },
4013 {
ISD::UMULO, MVT::v64i8, { 18, 24, 30, 30 } },
4040 {
ISD::FSQRT, MVT::v16f32, { 12, 20, 1, 3 } },
4043 {
ISD::FSQRT, MVT::v4f64, { 12, 18, 1, 1 } },
4044 {
ISD::FSQRT, MVT::v8f64, { 24, 32, 1, 3 } },
4060 {
ISD::ROTL, MVT::v4i64, { 4, 7, 5, 6 } },
4061 {
ISD::ROTL, MVT::v8i32, { 4, 7, 5, 6 } },
4062 {
ISD::ROTL, MVT::v16i16, { 4, 7, 5, 6 } },
4063 {
ISD::ROTL, MVT::v32i8, { 4, 7, 5, 6 } },
4064 {
ISD::ROTL, MVT::v2i64, { 1, 3, 1, 1 } },
4065 {
ISD::ROTL, MVT::v4i32, { 1, 3, 1, 1 } },
4066 {
ISD::ROTL, MVT::v8i16, { 1, 3, 1, 1 } },
4067 {
ISD::ROTL, MVT::v16i8, { 1, 3, 1, 1 } },
4068 {
ISD::ROTR, MVT::v4i64, { 4, 7, 8, 9 } },
4069 {
ISD::ROTR, MVT::v8i32, { 4, 7, 8, 9 } },
4070 {
ISD::ROTR, MVT::v16i16, { 4, 7, 8, 9 } },
4071 {
ISD::ROTR, MVT::v32i8, { 4, 7, 8, 9 } },
4072 {
ISD::ROTR, MVT::v2i64, { 1, 3, 3, 3 } },
4073 {
ISD::ROTR, MVT::v4i32, { 1, 3, 3, 3 } },
4074 {
ISD::ROTR, MVT::v8i16, { 1, 3, 3, 3 } },
4075 {
ISD::ROTR, MVT::v16i8, { 1, 3, 3, 3 } },
4076 { X86ISD::VROTLI, MVT::v4i64, { 4, 7, 5, 6 } },
4077 { X86ISD::VROTLI, MVT::v8i32, { 4, 7, 5, 6 } },
4078 { X86ISD::VROTLI, MVT::v16i16, { 4, 7, 5, 6 } },
4079 { X86ISD::VROTLI, MVT::v32i8, { 4, 7, 5, 6 } },
4080 { X86ISD::VROTLI, MVT::v2i64, { 1, 3, 1, 1 } },
4081 { X86ISD::VROTLI, MVT::v4i32, { 1, 3, 1, 1 } },
4082 { X86ISD::VROTLI, MVT::v8i16, { 1, 3, 1, 1 } },
4083 { X86ISD::VROTLI, MVT::v16i8, { 1, 3, 1, 1 } },
4086 {
ISD::ABS, MVT::v2i64, { 2, 4, 3, 5 } },
4087 {
ISD::ABS, MVT::v4i64, { 2, 4, 3, 5 } },
4088 {
ISD::ABS, MVT::v4i32, { 1, 1, 1, 1 } },
4089 {
ISD::ABS, MVT::v8i32, { 1, 1, 1, 2 } },
4090 {
ISD::ABS, MVT::v8i16, { 1, 1, 1, 1 } },
4091 {
ISD::ABS, MVT::v16i16, { 1, 1, 1, 2 } },
4092 {
ISD::ABS, MVT::v16i8, { 1, 1, 1, 1 } },
4093 {
ISD::ABS, MVT::v32i8, { 1, 1, 1, 2 } },
4108 {
ISD::CTLZ, MVT::v2i64, { 7, 18, 24, 25 } },
4109 {
ISD::CTLZ, MVT::v4i64, { 14, 18, 24, 44 } },
4110 {
ISD::CTLZ, MVT::v4i32, { 5, 16, 19, 20 } },
4111 {
ISD::CTLZ, MVT::v8i32, { 10, 16, 19, 34 } },
4112 {
ISD::CTLZ, MVT::v8i16, { 4, 13, 14, 15 } },
4113 {
ISD::CTLZ, MVT::v16i16, { 6, 14, 14, 24 } },
4114 {
ISD::CTLZ, MVT::v16i8, { 3, 12, 9, 10 } },
4115 {
ISD::CTLZ, MVT::v32i8, { 4, 12, 9, 14 } },
4116 {
ISD::CTPOP, MVT::v2i64, { 3, 9, 10, 10 } },
4117 {
ISD::CTPOP, MVT::v4i64, { 4, 9, 10, 14 } },
4118 {
ISD::CTPOP, MVT::v4i32, { 7, 12, 14, 14 } },
4119 {
ISD::CTPOP, MVT::v8i32, { 7, 12, 14, 18 } },
4120 {
ISD::CTPOP, MVT::v8i16, { 3, 7, 11, 11 } },
4121 {
ISD::CTPOP, MVT::v16i16, { 6, 8, 11, 18 } },
4124 {
ISD::CTTZ, MVT::v2i64, { 4, 11, 13, 13 } },
4125 {
ISD::CTTZ, MVT::v4i64, { 5, 11, 13, 20 } },
4126 {
ISD::CTTZ, MVT::v4i32, { 7, 14, 17, 17 } },
4127 {
ISD::CTTZ, MVT::v8i32, { 7, 15, 17, 24 } },
4128 {
ISD::CTTZ, MVT::v8i16, { 4, 9, 14, 14 } },
4129 {
ISD::CTTZ, MVT::v16i16, { 6, 9, 14, 24 } },
4130 {
ISD::CTTZ, MVT::v16i8, { 3, 7, 11, 11 } },
4131 {
ISD::CTTZ, MVT::v32i8, { 5, 7, 11, 18 } },
4138 {
ISD::SMAX, MVT::v2i64, { 2, 7, 2, 3 } },
4139 {
ISD::SMAX, MVT::v4i64, { 2, 7, 2, 3 } },
4140 {
ISD::SMAX, MVT::v8i32, { 1, 1, 1, 2 } },
4141 {
ISD::SMAX, MVT::v16i16, { 1, 1, 1, 2 } },
4142 {
ISD::SMAX, MVT::v32i8, { 1, 1, 1, 2 } },
4143 {
ISD::SMIN, MVT::v2i64, { 2, 7, 2, 3 } },
4144 {
ISD::SMIN, MVT::v4i64, { 2, 7, 2, 3 } },
4145 {
ISD::SMIN, MVT::v8i32, { 1, 1, 1, 2 } },
4146 {
ISD::SMIN, MVT::v16i16, { 1, 1, 1, 2 } },
4147 {
ISD::SMIN, MVT::v32i8, { 1, 1, 1, 2 } },
4148 {
ISD::SMULO, MVT::v4i64, { 20, 20, 33, 37 } },
4149 {
ISD::SMULO, MVT::v2i64, { 8, 8, 13, 15 } },
4150 {
ISD::SMULO, MVT::v8i32, { 8, 20, 13, 24 } },
4151 {
ISD::SMULO, MVT::v4i32, { 5, 15, 11, 12 } },
4152 {
ISD::SMULO, MVT::v16i16, { 4, 14, 8, 14 } },
4154 {
ISD::SMULO, MVT::v32i8, { 9, 15, 18, 35 } },
4155 {
ISD::SMULO, MVT::v16i8, { 6, 22, 14, 21 } },
4167 {
ISD::UMAX, MVT::v2i64, { 2, 8, 5, 6 } },
4168 {
ISD::UMAX, MVT::v4i64, { 2, 8, 5, 8 } },
4169 {
ISD::UMAX, MVT::v8i32, { 1, 1, 1, 2 } },
4170 {
ISD::UMAX, MVT::v16i16, { 1, 1, 1, 2 } },
4171 {
ISD::UMAX, MVT::v32i8, { 1, 1, 1, 2 } },
4172 {
ISD::UMIN, MVT::v2i64, { 2, 8, 5, 6 } },
4173 {
ISD::UMIN, MVT::v4i64, { 2, 8, 5, 8 } },
4174 {
ISD::UMIN, MVT::v8i32, { 1, 1, 1, 2 } },
4175 {
ISD::UMIN, MVT::v16i16, { 1, 1, 1, 2 } },
4176 {
ISD::UMIN, MVT::v32i8, { 1, 1, 1, 2 } },
4177 {
ISD::UMULO, MVT::v4i64, { 24, 24, 39, 43 } },
4178 {
ISD::UMULO, MVT::v2i64, { 10, 10, 15, 19 } },
4179 {
ISD::UMULO, MVT::v8i32, { 8, 11, 13, 23 } },
4180 {
ISD::UMULO, MVT::v4i32, { 5, 12, 11, 12 } },
4181 {
ISD::UMULO, MVT::v16i16, { 4, 6, 8, 13 } },
4183 {
ISD::UMULO, MVT::v32i8, { 9, 13, 17, 33 } },
4184 {
ISD::UMULO, MVT::v16i8, { 6, 19, 13, 20 } },
4198 {
ISD::FSQRT, MVT::v8f32, { 14, 21, 1, 3 } },
4200 {
ISD::FSQRT, MVT::v2f64, { 14, 21, 1, 1 } },
4201 {
ISD::FSQRT, MVT::v4f64, { 28, 35, 1, 3 } },
4204 {
ISD::ABS, MVT::v4i64, { 6, 8, 6, 12 } },
4205 {
ISD::ABS, MVT::v8i32, { 3, 6, 4, 5 } },
4206 {
ISD::ABS, MVT::v16i16, { 3, 6, 4, 5 } },
4207 {
ISD::ABS, MVT::v32i8, { 3, 6, 4, 5 } },
4220 {
ISD::BSWAP, MVT::v16i16, { 5, 6, 5, 10 } },
4222 {
ISD::CTLZ, MVT::v4i64, { 29, 33, 49, 58 } },
4223 {
ISD::CTLZ, MVT::v2i64, { 14, 24, 24, 28 } },
4224 {
ISD::CTLZ, MVT::v8i32, { 24, 28, 39, 48 } },
4225 {
ISD::CTLZ, MVT::v4i32, { 12, 20, 19, 23 } },
4226 {
ISD::CTLZ, MVT::v16i16, { 19, 22, 29, 38 } },
4227 {
ISD::CTLZ, MVT::v8i16, { 9, 16, 14, 18 } },
4228 {
ISD::CTLZ, MVT::v32i8, { 14, 15, 19, 28 } },
4229 {
ISD::CTLZ, MVT::v16i8, { 7, 12, 9, 13 } },
4230 {
ISD::CTPOP, MVT::v4i64, { 14, 18, 19, 28 } },
4231 {
ISD::CTPOP, MVT::v2i64, { 7, 14, 10, 14 } },
4232 {
ISD::CTPOP, MVT::v8i32, { 18, 24, 27, 36 } },
4233 {
ISD::CTPOP, MVT::v4i32, { 9, 20, 14, 18 } },
4234 {
ISD::CTPOP, MVT::v16i16, { 16, 21, 22, 31 } },
4235 {
ISD::CTPOP, MVT::v8i16, { 8, 18, 11, 15 } },
4236 {
ISD::CTPOP, MVT::v32i8, { 13, 15, 16, 25 } },
4237 {
ISD::CTPOP, MVT::v16i8, { 6, 12, 8, 12 } },
4238 {
ISD::CTTZ, MVT::v4i64, { 17, 22, 24, 33 } },
4239 {
ISD::CTTZ, MVT::v2i64, { 9, 19, 13, 17 } },
4240 {
ISD::CTTZ, MVT::v8i32, { 21, 27, 32, 41 } },
4241 {
ISD::CTTZ, MVT::v4i32, { 11, 24, 17, 21 } },
4242 {
ISD::CTTZ, MVT::v16i16, { 18, 24, 27, 36 } },
4243 {
ISD::CTTZ, MVT::v8i16, { 9, 21, 14, 18 } },
4244 {
ISD::CTTZ, MVT::v32i8, { 15, 18, 21, 30 } },
4245 {
ISD::CTTZ, MVT::v16i8, { 8, 16, 11, 15 } },
4251 {
ISD::SMAX, MVT::v4i64, { 6, 9, 6, 12 } },
4252 {
ISD::SMAX, MVT::v2i64, { 3, 7, 2, 4 } },
4253 {
ISD::SMAX, MVT::v8i32, { 4, 6, 5, 6 } },
4254 {
ISD::SMAX, MVT::v16i16, { 4, 6, 5, 6 } },
4255 {
ISD::SMAX, MVT::v32i8, { 4, 6, 5, 6 } },
4256 {
ISD::SMIN, MVT::v4i64, { 6, 9, 6, 12 } },
4257 {
ISD::SMIN, MVT::v2i64, { 3, 7, 2, 3 } },
4258 {
ISD::SMIN, MVT::v8i32, { 4, 6, 5, 6 } },
4259 {
ISD::SMIN, MVT::v16i16, { 4, 6, 5, 6 } },
4260 {
ISD::SMIN, MVT::v32i8, { 4, 6, 5, 6 } },
4261 {
ISD::SMULO, MVT::v4i64, { 20, 20, 33, 37 } },
4262 {
ISD::SMULO, MVT::v2i64, { 9, 9, 13, 17 } },
4263 {
ISD::SMULO, MVT::v8i32, { 15, 20, 24, 29 } },
4264 {
ISD::SMULO, MVT::v4i32, { 7, 15, 11, 13 } },
4265 {
ISD::SMULO, MVT::v16i16, { 8, 14, 14, 15 } },
4267 {
ISD::SMULO, MVT::v32i8, { 20, 20, 37, 39 } },
4268 {
ISD::SMULO, MVT::v16i8, { 9, 22, 18, 21 } },
4279 {
ISD::UMAX, MVT::v4i64, { 9, 10, 11, 17 } },
4280 {
ISD::UMAX, MVT::v2i64, { 4, 8, 5, 7 } },
4281 {
ISD::UMAX, MVT::v8i32, { 4, 6, 5, 6 } },
4282 {
ISD::UMAX, MVT::v16i16, { 4, 6, 5, 6 } },
4283 {
ISD::UMAX, MVT::v32i8, { 4, 6, 5, 6 } },
4284 {
ISD::UMIN, MVT::v4i64, { 9, 10, 11, 17 } },
4285 {
ISD::UMIN, MVT::v2i64, { 4, 8, 5, 7 } },
4286 {
ISD::UMIN, MVT::v8i32, { 4, 6, 5, 6 } },
4287 {
ISD::UMIN, MVT::v16i16, { 4, 6, 5, 6 } },
4288 {
ISD::UMIN, MVT::v32i8, { 4, 6, 5, 6 } },
4289 {
ISD::UMULO, MVT::v4i64, { 24, 26, 39, 45 } },
4290 {
ISD::UMULO, MVT::v2i64, { 10, 12, 15, 20 } },
4291 {
ISD::UMULO, MVT::v8i32, { 14, 15, 23, 28 } },
4292 {
ISD::UMULO, MVT::v4i32, { 7, 12, 11, 13 } },
4293 {
ISD::UMULO, MVT::v16i16, { 7, 11, 13, 14 } },
4295 {
ISD::UMULO, MVT::v32i8, { 19, 19, 35, 37 } },
4296 {
ISD::UMULO, MVT::v16i8, { 9, 19, 17, 20 } },
4310 {
ISD::FSQRT, MVT::v4f32, { 21, 21, 1, 1 } },
4311 {
ISD::FSQRT, MVT::v8f32, { 42, 42, 1, 3 } },
4313 {
ISD::FSQRT, MVT::v2f64, { 27, 27, 1, 1 } },
4314 {
ISD::FSQRT, MVT::v4f64, { 54, 54, 1, 3 } },
4333 { X86ISD::VROTLI, MVT::v16i8, { 1, 6, 1, 2 } },
4334 { X86ISD::VROTLI, MVT::v32i8, { 1, 6, 1, 2 } },
4335 { X86ISD::VROTLI, MVT::v64i8, { 1, 6, 1, 2 } },
4339 {
ISD::FSQRT, MVT::v4f32, { 37, 41, 1, 5 } },
4341 {
ISD::FSQRT, MVT::v2f64, { 67, 71, 1, 5 } },
4348 {
ISD::FSQRT, MVT::v4f32, { 40, 41, 1, 5 } },
4350 {
ISD::FSQRT, MVT::v2f64, { 70, 71, 1, 5 } },
4358 {
ISD::FSQRT, MVT::v4f32, { 18, 18, 1, 1 } },
4361 {
ISD::ABS, MVT::v2i64, { 3, 4, 3, 5 } },
4366 {
ISD::SMAX, MVT::v2i64, { 3, 7, 2, 3 } },
4367 {
ISD::SMAX, MVT::v4i32, { 1, 1, 1, 1 } },
4368 {
ISD::SMAX, MVT::v16i8, { 1, 1, 1, 1 } },
4369 {
ISD::SMIN, MVT::v2i64, { 3, 7, 2, 3 } },
4370 {
ISD::SMIN, MVT::v4i32, { 1, 1, 1, 1 } },
4371 {
ISD::SMIN, MVT::v16i8, { 1, 1, 1, 1 } },
4372 {
ISD::SMULO, MVT::v2i64, { 9, 11, 13, 17 } },
4373 {
ISD::SMULO, MVT::v4i32, { 20, 24, 13, 19 } },
4375 {
ISD::SMULO, MVT::v16i8, { 13, 22, 24, 25 } },
4380 {
ISD::UMAX, MVT::v2i64, { 2, 11, 6, 7 } },
4381 {
ISD::UMAX, MVT::v4i32, { 1, 1, 1, 1 } },
4382 {
ISD::UMAX, MVT::v8i16, { 1, 1, 1, 1 } },
4383 {
ISD::UMIN, MVT::v2i64, { 2, 11, 6, 7 } },
4384 {
ISD::UMIN, MVT::v4i32, { 1, 1, 1, 1 } },
4385 {
ISD::UMIN, MVT::v8i16, { 1, 1, 1, 1 } },
4386 {
ISD::UMULO, MVT::v2i64, { 14, 20, 15, 20 } },
4387 {
ISD::UMULO, MVT::v4i32, { 19, 22, 12, 18 } },
4389 {
ISD::UMULO, MVT::v16i8, { 13, 19, 18, 20 } },
4392 {
ISD::ABS, MVT::v4i32, { 1, 2, 1, 1 } },
4393 {
ISD::ABS, MVT::v8i16, { 1, 2, 1, 1 } },
4394 {
ISD::ABS, MVT::v16i8, { 1, 2, 1, 1 } },
4402 {
ISD::CTLZ, MVT::v2i64, { 18, 28, 28, 35 } },
4403 {
ISD::CTLZ, MVT::v4i32, { 15, 20, 22, 28 } },
4404 {
ISD::CTLZ, MVT::v8i16, { 13, 17, 16, 22 } },
4405 {
ISD::CTLZ, MVT::v16i8, { 11, 15, 10, 16 } },
4406 {
ISD::CTPOP, MVT::v2i64, { 13, 19, 12, 18 } },
4407 {
ISD::CTPOP, MVT::v4i32, { 18, 24, 16, 22 } },
4408 {
ISD::CTPOP, MVT::v8i16, { 13, 18, 14, 20 } },
4409 {
ISD::CTPOP, MVT::v16i8, { 11, 12, 10, 16 } },
4410 {
ISD::CTTZ, MVT::v2i64, { 13, 25, 15, 22 } },
4411 {
ISD::CTTZ, MVT::v4i32, { 18, 26, 19, 25 } },
4412 {
ISD::CTTZ, MVT::v8i16, { 13, 20, 17, 23 } },
4413 {
ISD::CTTZ, MVT::v16i8, { 11, 16, 13, 19 } }
4416 {
ISD::ABS, MVT::v2i64, { 3, 6, 5, 5 } },
4417 {
ISD::ABS, MVT::v4i32, { 1, 4, 4, 4 } },
4418 {
ISD::ABS, MVT::v8i16, { 1, 2, 3, 3 } },
4419 {
ISD::ABS, MVT::v16i8, { 1, 2, 3, 3 } },
4424 {
ISD::BSWAP, MVT::v2i64, { 5, 6, 11, 11 } },
4427 {
ISD::CTLZ, MVT::v2i64, { 10, 45, 36, 38 } },
4428 {
ISD::CTLZ, MVT::v4i32, { 10, 45, 38, 40 } },
4429 {
ISD::CTLZ, MVT::v8i16, { 9, 38, 32, 34 } },
4430 {
ISD::CTLZ, MVT::v16i8, { 8, 39, 29, 32 } },
4431 {
ISD::CTPOP, MVT::v2i64, { 12, 26, 16, 18 } },
4432 {
ISD::CTPOP, MVT::v4i32, { 15, 29, 21, 23 } },
4433 {
ISD::CTPOP, MVT::v8i16, { 13, 25, 18, 20 } },
4434 {
ISD::CTPOP, MVT::v16i8, { 10, 21, 14, 16 } },
4435 {
ISD::CTTZ, MVT::v2i64, { 14, 28, 19, 21 } },
4436 {
ISD::CTTZ, MVT::v4i32, { 18, 31, 24, 26 } },
4437 {
ISD::CTTZ, MVT::v8i16, { 16, 27, 21, 23 } },
4438 {
ISD::CTTZ, MVT::v16i8, { 13, 23, 17, 19 } },
4443 {
ISD::SMAX, MVT::v2i64, { 4, 8, 15, 15 } },
4444 {
ISD::SMAX, MVT::v4i32, { 2, 4, 5, 5 } },
4445 {
ISD::SMAX, MVT::v8i16, { 1, 1, 1, 1 } },
4446 {
ISD::SMAX, MVT::v16i8, { 2, 4, 5, 5 } },
4447 {
ISD::SMIN, MVT::v2i64, { 4, 8, 15, 15 } },
4448 {
ISD::SMIN, MVT::v4i32, { 2, 4, 5, 5 } },
4449 {
ISD::SMIN, MVT::v8i16, { 1, 1, 1, 1 } },
4450 {
ISD::SMIN, MVT::v16i8, { 2, 4, 5, 5 } },
4451 {
ISD::SMULO, MVT::v2i64, { 30, 33, 13, 23 } },
4452 {
ISD::SMULO, MVT::v4i32, { 20, 24, 23, 23 } },
4454 {
ISD::SMULO, MVT::v16i8, { 13, 23, 24, 25 } },
4463 {
ISD::UMAX, MVT::v2i64, { 4, 8, 15, 15 } },
4464 {
ISD::UMAX, MVT::v4i32, { 2, 5, 8, 8 } },
4465 {
ISD::UMAX, MVT::v8i16, { 1, 3, 3, 3 } },
4466 {
ISD::UMAX, MVT::v16i8, { 1, 1, 1, 1 } },
4467 {
ISD::UMIN, MVT::v2i64, { 4, 8, 15, 15 } },
4468 {
ISD::UMIN, MVT::v4i32, { 2, 5, 8, 8 } },
4469 {
ISD::UMIN, MVT::v8i16, { 1, 3, 3, 3 } },
4470 {
ISD::UMIN, MVT::v16i8, { 1, 1, 1, 1 } },
4471 {
ISD::UMULO, MVT::v2i64, { 30, 33, 15, 29 } },
4472 {
ISD::UMULO, MVT::v4i32, { 19, 22, 14, 18 } },
4474 {
ISD::UMULO, MVT::v16i8, { 13, 19, 20, 20 } },
4482 {
ISD::FSQRT, MVT::v2f64, { 32, 32, 1, 1 } },
4488 {
ISD::FSQRT, MVT::v4f32, { 56, 56, 1, 2 } },
4491 {
ISD::CTTZ, MVT::i64, { 1, 1, 1, 1 } },
4494 {
ISD::CTTZ, MVT::i32, { 1, 1, 1, 1 } },
4495 {
ISD::CTTZ, MVT::i16, { 2, 1, 1, 1 } },
4499 {
ISD::CTLZ, MVT::i64, { 1, 1, 1, 1 } },
4502 {
ISD::CTLZ, MVT::i32, { 1, 1, 1, 1 } },
4503 {
ISD::CTLZ, MVT::i16, { 2, 1, 1, 1 } },
4516 {
ISD::CLMUL, MVT::v4i32, { 8, 18, 12, 16 } },
4523 {
ISD::ABS, MVT::i64, { 1, 2, 3, 3 } },
4526 {
ISD::CTLZ, MVT::i64, { 1, 2, 3, 3 } },
4527 {
ISD::CTLZ, MVT::i32, { 1, 2, 3, 3 } },
4528 {
ISD::CTLZ, MVT::i16, { 2, 2, 3, 3 } },
4531 {
ISD::CTTZ, MVT::i64, { 1, 2, 2, 2 } },
4532 {
ISD::CTTZ, MVT::i32, { 1, 2, 2, 2 } },
4533 {
ISD::CTTZ, MVT::i16, { 2, 2, 2, 2 } },
4537 {
ISD::ROTL, MVT::i64, { 2, 3, 1, 3 } },
4538 {
ISD::ROTR, MVT::i64, { 2, 3, 1, 3 } },
4539 { X86ISD::VROTLI, MVT::i64, { 1, 1, 1, 1 } },
4540 {
ISD::FSHL, MVT::i64, { 4, 4, 1, 4 } },
4545 {
ISD::SMAX, MVT::i64, { 1, 3, 2, 3 } },
4546 {
ISD::SMIN, MVT::i64, { 1, 3, 2, 3 } },
4547 {
ISD::UMAX, MVT::i64, { 1, 3, 2, 3 } },
4548 {
ISD::UMIN, MVT::i64, { 1, 3, 2, 3 } },
4555 {
ISD::ABS, MVT::i32, { 1, 2, 3, 3 } },
4556 {
ISD::ABS, MVT::i16, { 2, 2, 3, 3 } },
4557 {
ISD::ABS, MVT::i8, { 2, 4, 4, 3 } },
4563 {
ISD::CTLZ, MVT::i32, { 2, 2, 4, 5 } },
4564 {
ISD::CTLZ, MVT::i16, { 2, 2, 4, 5 } },
4569 {
ISD::CTTZ, MVT::i32, { 2, 2, 3, 3 } },
4570 {
ISD::CTTZ, MVT::i16, { 2, 2, 2, 3 } },
4578 {
ISD::ROTL, MVT::i32, { 2, 3, 1, 3 } },
4579 {
ISD::ROTL, MVT::i16, { 2, 3, 1, 3 } },
4581 {
ISD::ROTR, MVT::i32, { 2, 3, 1, 3 } },
4582 {
ISD::ROTR, MVT::i16, { 2, 3, 1, 3 } },
4584 { X86ISD::VROTLI, MVT::i32, { 1, 1, 1, 1 } },
4585 { X86ISD::VROTLI, MVT::i16, { 1, 1, 1, 1 } },
4586 { X86ISD::VROTLI, MVT::i8, { 1, 1, 1, 1 } },
4587 {
ISD::FSHL, MVT::i32, { 4, 4, 1, 4 } },
4588 {
ISD::FSHL, MVT::i16, { 4, 4, 2, 5 } },
4602 {
ISD::SMAX, MVT::i32, { 1, 2, 2, 3 } },
4603 {
ISD::SMAX, MVT::i16, { 1, 4, 2, 4 } },
4605 {
ISD::SMIN, MVT::i32, { 1, 2, 2, 3 } },
4606 {
ISD::SMIN, MVT::i16, { 1, 4, 2, 4 } },
4608 {
ISD::UMAX, MVT::i32, { 1, 2, 2, 3 } },
4609 {
ISD::UMAX, MVT::i16, { 1, 4, 2, 4 } },
4611 {
ISD::UMIN, MVT::i32, { 1, 2, 2, 3 } },
4612 {
ISD::UMIN, MVT::i16, { 1, 4, 2, 4 } },
4635 case Intrinsic::abs:
4638 case Intrinsic::bitreverse:
4641 case Intrinsic::bswap:
4644 case Intrinsic::ctlz:
4647 case Intrinsic::ctpop:
4650 case Intrinsic::cttz:
4653 case Intrinsic::fshl:
4657 if (Args[0] == Args[1]) {
4664 ISD = X86ISD::VROTLI;
4668 case Intrinsic::fshr:
4673 if (Args[0] == Args[1]) {
4680 ISD = X86ISD::VROTLI;
4684 case Intrinsic::lrint:
4685 case Intrinsic::llrint: {
4692 case Intrinsic::maxnum:
4693 case Intrinsic::minnum:
4697 case Intrinsic::sadd_sat:
4700 case Intrinsic::smax:
4703 case Intrinsic::smin:
4706 case Intrinsic::ssub_sat:
4709 case Intrinsic::uadd_sat:
4712 case Intrinsic::umax:
4715 case Intrinsic::umin:
4718 case Intrinsic::usub_sat:
4721 case Intrinsic::sqrt:
4724 case Intrinsic::sadd_with_overflow:
4725 case Intrinsic::ssub_with_overflow:
4730 case Intrinsic::uadd_with_overflow:
4731 case Intrinsic::usub_with_overflow:
4736 case Intrinsic::smul_with_overflow:
4740 case Intrinsic::umul_with_overflow:
4744 case Intrinsic::clmul:
4750 auto adjustTableCost = [&](
int ISD,
unsigned Cost,
4751 std::pair<InstructionCost, MVT> LT,
4754 MVT MTy = LT.second;
4761 return LegalizationCost * 1;
4766 if (
ISD ==
ISD::BSWAP && ST->hasMOVBE() && ST->hasFastMOVBE()) {
4771 if (LI->hasOneUse())
4778 return LegalizationCost * (int)
Cost;
4783 MVT MTy = LT.second;
4791 if (Cst->isAllOnesValue())
4800 if (ST->useGLMDivSqrtCosts())
4802 if (
auto KindCost = Entry->Cost[
CostKind])
4803 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4805 if (ST->useSLMArithCosts())
4807 if (
auto KindCost = Entry->Cost[
CostKind])
4808 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4812 if (
auto KindCost = Entry->Cost[
CostKind])
4813 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4815 if (ST->hasBITALG())
4817 if (
auto KindCost = Entry->Cost[
CostKind])
4818 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4820 if (ST->hasVPOPCNTDQ())
4822 if (
auto KindCost = Entry->Cost[
CostKind])
4823 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4827 if (
auto KindCost = Entry->Cost[
CostKind])
4828 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4832 if (
auto KindCost = Entry->Cost[
CostKind])
4833 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4837 if (
auto KindCost = Entry->Cost[
CostKind])
4838 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4840 if (ST->hasAVX512())
4842 if (
auto KindCost = Entry->Cost[
CostKind])
4843 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4847 if (
auto KindCost = Entry->Cost[
CostKind])
4848 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4852 if (
auto KindCost = Entry->Cost[
CostKind])
4853 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4857 if (
auto KindCost = Entry->Cost[
CostKind])
4858 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4862 if (
auto KindCost = Entry->Cost[
CostKind])
4863 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4867 if (
auto KindCost = Entry->Cost[
CostKind])
4868 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4872 if (
auto KindCost = Entry->Cost[
CostKind])
4873 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4877 if (
auto KindCost = Entry->Cost[
CostKind])
4878 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4882 if (
auto KindCost = Entry->Cost[
CostKind])
4883 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4888 if (
auto KindCost = Entry->Cost[
CostKind])
4889 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4892 if (
auto KindCost = Entry->Cost[
CostKind])
4893 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4896 if (ST->hasLZCNT()) {
4899 if (
auto KindCost = Entry->Cost[
CostKind])
4900 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4903 if (
auto KindCost = Entry->Cost[
CostKind])
4904 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4907 if (ST->hasPOPCNT()) {
4910 if (
auto KindCost = Entry->Cost[
CostKind])
4911 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4914 if (
auto KindCost = Entry->Cost[
CostKind])
4915 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4919 if (ST->hasPCLMUL())
4921 if (
auto KindCost = Entry->Cost[
CostKind])
4922 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4926 if (
auto KindCost = Entry->Cost[
CostKind])
4927 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4930 if (
auto KindCost = Entry->Cost[
CostKind])
4931 return adjustTableCost(Entry->ISD, *KindCost, LT, ICA.
getFlags());
4936 (IID == Intrinsic::fshl || IID == Intrinsic::fshr)) {