llvm.org GIT mirror llvm / 8da142d
[X86][XOP] createVariablePermute - use VPPERM for v32i8 variable permutes git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327213 91177308-0d34-0410-b5e6-96231b3b80d8 Simon Pilgrim 2 years ago
2 changed file(s) with 17 addition(s) and 238 deletion(s). Raw diff Collapse all Expand all
79717971 case MVT::v32i8:
79727972 if (Subtarget.hasVLX() && Subtarget.hasVBMI())
79737973 Opcode = X86ISD::VPERMV;
7974 else if (Subtarget.hasXOP()) {
7975 SDValue LoSrc = extract128BitVector(SrcVec, 0, DAG, DL);
7976 SDValue HiSrc = extract128BitVector(SrcVec, 16, DAG, DL);
7977 SDValue LoIdx = extract128BitVector(IndicesVec, 0, DAG, DL);
7978 SDValue HiIdx = extract128BitVector(IndicesVec, 16, DAG, DL);
7979 return DAG.getNode(
7980 ISD::CONCAT_VECTORS, DL, VT,
7981 DAG.getNode(X86ISD::VPPERM, DL, MVT::v16i8, LoSrc, HiSrc, LoIdx),
7982 DAG.getNode(X86ISD::VPPERM, DL, MVT::v16i8, LoSrc, HiSrc, HiIdx));
7983 }
79747984 break;
79757985 case MVT::v16i16:
79767986 if (Subtarget.hasVLX() && Subtarget.hasBWI())
672672 define <32 x i8> @var_shuffle_v32i8(<32 x i8> %v, <32 x i8> %indices) nounwind {
673673 ; XOP-LABEL: var_shuffle_v32i8:
674674 ; XOP: # %bb.0:
675 ; XOP-NEXT: pushq %rbp
676 ; XOP-NEXT: movq %rsp, %rbp
677 ; XOP-NEXT: andq $-32, %rsp
678 ; XOP-NEXT: subq $64, %rsp
679675 ; XOP-NEXT: vextractf128 $1, %ymm1, %xmm2
680 ; XOP-NEXT: vpextrb $0, %xmm2, %eax
681 ; XOP-NEXT: vmovaps %ymm0, (%rsp)
682 ; XOP-NEXT: andl $31, %eax
683 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
684 ; XOP-NEXT: vmovd %eax, %xmm0
685 ; XOP-NEXT: vpextrb $1, %xmm2, %eax
686 ; XOP-NEXT: andl $31, %eax
687 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
688 ; XOP-NEXT: vpinsrb $1, %eax, %xmm0, %xmm0
689 ; XOP-NEXT: vpextrb $2, %xmm2, %eax
690 ; XOP-NEXT: andl $31, %eax
691 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
692 ; XOP-NEXT: vpinsrb $2, %eax, %xmm0, %xmm0
693 ; XOP-NEXT: vpextrb $3, %xmm2, %eax
694 ; XOP-NEXT: andl $31, %eax
695 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
696 ; XOP-NEXT: vpinsrb $3, %eax, %xmm0, %xmm0
697 ; XOP-NEXT: vpextrb $4, %xmm2, %eax
698 ; XOP-NEXT: andl $31, %eax
699 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
700 ; XOP-NEXT: vpinsrb $4, %eax, %xmm0, %xmm0
701 ; XOP-NEXT: vpextrb $5, %xmm2, %eax
702 ; XOP-NEXT: andl $31, %eax
703 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
704 ; XOP-NEXT: vpinsrb $5, %eax, %xmm0, %xmm0
705 ; XOP-NEXT: vpextrb $6, %xmm2, %eax
706 ; XOP-NEXT: andl $31, %eax
707 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
708 ; XOP-NEXT: vpinsrb $6, %eax, %xmm0, %xmm0
709 ; XOP-NEXT: vpextrb $7, %xmm2, %eax
710 ; XOP-NEXT: andl $31, %eax
711 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
712 ; XOP-NEXT: vpinsrb $7, %eax, %xmm0, %xmm0
713 ; XOP-NEXT: vpextrb $8, %xmm2, %eax
714 ; XOP-NEXT: andl $31, %eax
715 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
716 ; XOP-NEXT: vpinsrb $8, %eax, %xmm0, %xmm0
717 ; XOP-NEXT: vpextrb $9, %xmm2, %eax
718 ; XOP-NEXT: andl $31, %eax
719 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
720 ; XOP-NEXT: vpinsrb $9, %eax, %xmm0, %xmm0
721 ; XOP-NEXT: vpextrb $10, %xmm2, %eax
722 ; XOP-NEXT: andl $31, %eax
723 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
724 ; XOP-NEXT: vpinsrb $10, %eax, %xmm0, %xmm0
725 ; XOP-NEXT: vpextrb $11, %xmm2, %eax
726 ; XOP-NEXT: andl $31, %eax
727 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
728 ; XOP-NEXT: vpinsrb $11, %eax, %xmm0, %xmm0
729 ; XOP-NEXT: vpextrb $12, %xmm2, %eax
730 ; XOP-NEXT: andl $31, %eax
731 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
732 ; XOP-NEXT: vpinsrb $12, %eax, %xmm0, %xmm0
733 ; XOP-NEXT: vpextrb $13, %xmm2, %eax
734 ; XOP-NEXT: andl $31, %eax
735 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
736 ; XOP-NEXT: vpinsrb $13, %eax, %xmm0, %xmm0
737 ; XOP-NEXT: vpextrb $14, %xmm2, %eax
738 ; XOP-NEXT: andl $31, %eax
739 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
740 ; XOP-NEXT: vpinsrb $14, %eax, %xmm0, %xmm0
741 ; XOP-NEXT: vpextrb $15, %xmm2, %eax
742 ; XOP-NEXT: andl $31, %eax
743 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
744 ; XOP-NEXT: vpinsrb $15, %eax, %xmm0, %xmm0
745 ; XOP-NEXT: vpextrb $0, %xmm1, %eax
746 ; XOP-NEXT: andl $31, %eax
747 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
748 ; XOP-NEXT: vmovd %eax, %xmm2
749 ; XOP-NEXT: vpextrb $1, %xmm1, %eax
750 ; XOP-NEXT: andl $31, %eax
751 ; XOP-NEXT: vpinsrb $1, (%rsp,%rax), %xmm2, %xmm2
752 ; XOP-NEXT: vpextrb $2, %xmm1, %eax
753 ; XOP-NEXT: andl $31, %eax
754 ; XOP-NEXT: vpinsrb $2, (%rsp,%rax), %xmm2, %xmm2
755 ; XOP-NEXT: vpextrb $3, %xmm1, %eax
756 ; XOP-NEXT: andl $31, %eax
757 ; XOP-NEXT: vpinsrb $3, (%rsp,%rax), %xmm2, %xmm2
758 ; XOP-NEXT: vpextrb $4, %xmm1, %eax
759 ; XOP-NEXT: andl $31, %eax
760 ; XOP-NEXT: vpinsrb $4, (%rsp,%rax), %xmm2, %xmm2
761 ; XOP-NEXT: vpextrb $5, %xmm1, %eax
762 ; XOP-NEXT: andl $31, %eax
763 ; XOP-NEXT: vpinsrb $5, (%rsp,%rax), %xmm2, %xmm2
764 ; XOP-NEXT: vpextrb $6, %xmm1, %eax
765 ; XOP-NEXT: andl $31, %eax
766 ; XOP-NEXT: vpinsrb $6, (%rsp,%rax), %xmm2, %xmm2
767 ; XOP-NEXT: vpextrb $7, %xmm1, %eax
768 ; XOP-NEXT: andl $31, %eax
769 ; XOP-NEXT: vpinsrb $7, (%rsp,%rax), %xmm2, %xmm2
770 ; XOP-NEXT: vpextrb $8, %xmm1, %eax
771 ; XOP-NEXT: andl $31, %eax
772 ; XOP-NEXT: vpinsrb $8, (%rsp,%rax), %xmm2, %xmm2
773 ; XOP-NEXT: vpextrb $9, %xmm1, %eax
774 ; XOP-NEXT: andl $31, %eax
775 ; XOP-NEXT: vpinsrb $9, (%rsp,%rax), %xmm2, %xmm2
776 ; XOP-NEXT: vpextrb $10, %xmm1, %eax
777 ; XOP-NEXT: andl $31, %eax
778 ; XOP-NEXT: vpinsrb $10, (%rsp,%rax), %xmm2, %xmm2
779 ; XOP-NEXT: vpextrb $11, %xmm1, %eax
780 ; XOP-NEXT: andl $31, %eax
781 ; XOP-NEXT: vpinsrb $11, (%rsp,%rax), %xmm2, %xmm2
782 ; XOP-NEXT: vpextrb $12, %xmm1, %eax
783 ; XOP-NEXT: andl $31, %eax
784 ; XOP-NEXT: vpinsrb $12, (%rsp,%rax), %xmm2, %xmm2
785 ; XOP-NEXT: vpextrb $13, %xmm1, %eax
786 ; XOP-NEXT: andl $31, %eax
787 ; XOP-NEXT: vpinsrb $13, (%rsp,%rax), %xmm2, %xmm2
788 ; XOP-NEXT: vpextrb $14, %xmm1, %eax
789 ; XOP-NEXT: andl $31, %eax
790 ; XOP-NEXT: vpinsrb $14, (%rsp,%rax), %xmm2, %xmm2
791 ; XOP-NEXT: vpextrb $15, %xmm1, %eax
792 ; XOP-NEXT: andl $31, %eax
793 ; XOP-NEXT: movzbl (%rsp,%rax), %eax
794 ; XOP-NEXT: vpinsrb $15, %eax, %xmm2, %xmm1
795 ; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
796 ; XOP-NEXT: movq %rbp, %rsp
797 ; XOP-NEXT: popq %rbp
676 ; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3
677 ; XOP-NEXT: vpperm %xmm2, %xmm3, %xmm0, %xmm2
678 ; XOP-NEXT: vpperm %xmm1, %xmm3, %xmm0, %xmm0
679 ; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
798680 ; XOP-NEXT: retq
799681 ;
800682 ; AVX1-LABEL: var_shuffle_v32i8:
23752257 ; XOP-LABEL: var_shuffle_v32i8_from_v16i8:
23762258 ; XOP: # %bb.0:
23772259 ; XOP-NEXT: vextractf128 $1, %ymm1, %xmm2
2378 ; XOP-NEXT: vpextrb $0, %xmm2, %eax
2379 ; XOP-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)
2380 ; XOP-NEXT: andl $15, %eax
2381 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2382 ; XOP-NEXT: vmovd %eax, %xmm0
2383 ; XOP-NEXT: vpextrb $1, %xmm2, %eax
2384 ; XOP-NEXT: andl $15, %eax
2385 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2386 ; XOP-NEXT: vpinsrb $1, %eax, %xmm0, %xmm0
2387 ; XOP-NEXT: vpextrb $2, %xmm2, %eax
2388 ; XOP-NEXT: andl $15, %eax
2389 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2390 ; XOP-NEXT: vpinsrb $2, %eax, %xmm0, %xmm0
2391 ; XOP-NEXT: vpextrb $3, %xmm2, %eax
2392 ; XOP-NEXT: andl $15, %eax
2393 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2394 ; XOP-NEXT: vpinsrb $3, %eax, %xmm0, %xmm0
2395 ; XOP-NEXT: vpextrb $4, %xmm2, %eax
2396 ; XOP-NEXT: andl $15, %eax
2397 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2398 ; XOP-NEXT: vpinsrb $4, %eax, %xmm0, %xmm0
2399 ; XOP-NEXT: vpextrb $5, %xmm2, %eax
2400 ; XOP-NEXT: andl $15, %eax
2401 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2402 ; XOP-NEXT: vpinsrb $5, %eax, %xmm0, %xmm0
2403 ; XOP-NEXT: vpextrb $6, %xmm2, %eax
2404 ; XOP-NEXT: andl $15, %eax
2405 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2406 ; XOP-NEXT: vpinsrb $6, %eax, %xmm0, %xmm0
2407 ; XOP-NEXT: vpextrb $7, %xmm2, %eax
2408 ; XOP-NEXT: andl $15, %eax
2409 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2410 ; XOP-NEXT: vpinsrb $7, %eax, %xmm0, %xmm0
2411 ; XOP-NEXT: vpextrb $8, %xmm2, %eax
2412 ; XOP-NEXT: andl $15, %eax
2413 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2414 ; XOP-NEXT: vpinsrb $8, %eax, %xmm0, %xmm0
2415 ; XOP-NEXT: vpextrb $9, %xmm2, %eax
2416 ; XOP-NEXT: andl $15, %eax
2417 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2418 ; XOP-NEXT: vpinsrb $9, %eax, %xmm0, %xmm0
2419 ; XOP-NEXT: vpextrb $10, %xmm2, %eax
2420 ; XOP-NEXT: andl $15, %eax
2421 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2422 ; XOP-NEXT: vpinsrb $10, %eax, %xmm0, %xmm0
2423 ; XOP-NEXT: vpextrb $11, %xmm2, %eax
2424 ; XOP-NEXT: andl $15, %eax
2425 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2426 ; XOP-NEXT: vpinsrb $11, %eax, %xmm0, %xmm0
2427 ; XOP-NEXT: vpextrb $12, %xmm2, %eax
2428 ; XOP-NEXT: andl $15, %eax
2429 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2430 ; XOP-NEXT: vpinsrb $12, %eax, %xmm0, %xmm0
2431 ; XOP-NEXT: vpextrb $13, %xmm2, %eax
2432 ; XOP-NEXT: andl $15, %eax
2433 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2434 ; XOP-NEXT: vpinsrb $13, %eax, %xmm0, %xmm0
2435 ; XOP-NEXT: vpextrb $14, %xmm2, %eax
2436 ; XOP-NEXT: andl $15, %eax
2437 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2438 ; XOP-NEXT: vpinsrb $14, %eax, %xmm0, %xmm0
2439 ; XOP-NEXT: vpextrb $15, %xmm2, %eax
2440 ; XOP-NEXT: andl $15, %eax
2441 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2442 ; XOP-NEXT: vpinsrb $15, %eax, %xmm0, %xmm0
2443 ; XOP-NEXT: vpextrb $0, %xmm1, %eax
2444 ; XOP-NEXT: andl $15, %eax
2445 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2446 ; XOP-NEXT: vmovd %eax, %xmm2
2447 ; XOP-NEXT: vpextrb $1, %xmm1, %eax
2448 ; XOP-NEXT: andl $15, %eax
2449 ; XOP-NEXT: vpinsrb $1, -24(%rsp,%rax), %xmm2, %xmm2
2450 ; XOP-NEXT: vpextrb $2, %xmm1, %eax
2451 ; XOP-NEXT: andl $15, %eax
2452 ; XOP-NEXT: vpinsrb $2, -24(%rsp,%rax), %xmm2, %xmm2
2453 ; XOP-NEXT: vpextrb $3, %xmm1, %eax
2454 ; XOP-NEXT: andl $15, %eax
2455 ; XOP-NEXT: vpinsrb $3, -24(%rsp,%rax), %xmm2, %xmm2
2456 ; XOP-NEXT: vpextrb $4, %xmm1, %eax
2457 ; XOP-NEXT: andl $15, %eax
2458 ; XOP-NEXT: vpinsrb $4, -24(%rsp,%rax), %xmm2, %xmm2
2459 ; XOP-NEXT: vpextrb $5, %xmm1, %eax
2460 ; XOP-NEXT: andl $15, %eax
2461 ; XOP-NEXT: vpinsrb $5, -24(%rsp,%rax), %xmm2, %xmm2
2462 ; XOP-NEXT: vpextrb $6, %xmm1, %eax
2463 ; XOP-NEXT: andl $15, %eax
2464 ; XOP-NEXT: vpinsrb $6, -24(%rsp,%rax), %xmm2, %xmm2
2465 ; XOP-NEXT: vpextrb $7, %xmm1, %eax
2466 ; XOP-NEXT: andl $15, %eax
2467 ; XOP-NEXT: vpinsrb $7, -24(%rsp,%rax), %xmm2, %xmm2
2468 ; XOP-NEXT: vpextrb $8, %xmm1, %eax
2469 ; XOP-NEXT: andl $15, %eax
2470 ; XOP-NEXT: vpinsrb $8, -24(%rsp,%rax), %xmm2, %xmm2
2471 ; XOP-NEXT: vpextrb $9, %xmm1, %eax
2472 ; XOP-NEXT: andl $15, %eax
2473 ; XOP-NEXT: vpinsrb $9, -24(%rsp,%rax), %xmm2, %xmm2
2474 ; XOP-NEXT: vpextrb $10, %xmm1, %eax
2475 ; XOP-NEXT: andl $15, %eax
2476 ; XOP-NEXT: vpinsrb $10, -24(%rsp,%rax), %xmm2, %xmm2
2477 ; XOP-NEXT: vpextrb $11, %xmm1, %eax
2478 ; XOP-NEXT: andl $15, %eax
2479 ; XOP-NEXT: vpinsrb $11, -24(%rsp,%rax), %xmm2, %xmm2
2480 ; XOP-NEXT: vpextrb $12, %xmm1, %eax
2481 ; XOP-NEXT: andl $15, %eax
2482 ; XOP-NEXT: vpinsrb $12, -24(%rsp,%rax), %xmm2, %xmm2
2483 ; XOP-NEXT: vpextrb $13, %xmm1, %eax
2484 ; XOP-NEXT: andl $15, %eax
2485 ; XOP-NEXT: vpinsrb $13, -24(%rsp,%rax), %xmm2, %xmm2
2486 ; XOP-NEXT: vpextrb $14, %xmm1, %eax
2487 ; XOP-NEXT: andl $15, %eax
2488 ; XOP-NEXT: vpinsrb $14, -24(%rsp,%rax), %xmm2, %xmm2
2489 ; XOP-NEXT: vpextrb $15, %xmm1, %eax
2490 ; XOP-NEXT: andl $15, %eax
2491 ; XOP-NEXT: movzbl -24(%rsp,%rax), %eax
2492 ; XOP-NEXT: vpinsrb $15, %eax, %xmm2, %xmm1
2493 ; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
2260 ; XOP-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm2
2261 ; XOP-NEXT: vpperm %xmm1, %xmm0, %xmm0, %xmm0
2262 ; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
24942263 ; XOP-NEXT: retq
24952264 ;
24962265 ; AVX1-LABEL: var_shuffle_v32i8_from_v16i8: