llvm.org GIT mirror llvm / 9c61a35
[X86][AVX512] Enable v16i8/v32i8 vector shifts to use an extend+shift+truncate pattern. Use the existing AVX2 v8i16 vector shift lowering for v16i8 (extending to v16i32) on AVX512 targets and v32i8 (extending to v32i16) on AVX512BW targets. Cost model updates to follow. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291451 91177308-0d34-0410-b5e6-96231b3b80d8 Simon Pilgrim 3 years ago
7 changed file(s) with 296 addition(s) and 332 deletion(s). Raw diff Collapse all Expand all
2154421544 return DAG.getVectorShuffle(VT, dl, R02, R13, {0, 5, 2, 7});
2154521545 }
2154621546
21547 // It's worth extending once and using the vXi16/vXi32 shifts for smaller
21548 // types, but without AVX512 the extra overheads to get from vXi8 to vXi32
21549 // make the existing SSE solution better.
21550 if ((Subtarget.hasInt256() && VT == MVT::v8i16) ||
21551 (Subtarget.hasAVX512() && VT == MVT::v16i16) ||
21552 (Subtarget.hasAVX512() && VT == MVT::v16i8) ||
21553 (Subtarget.hasBWI() && VT == MVT::v32i8)) {
21554 MVT EvtSVT = (VT == MVT::v32i8 ? MVT::i16 : MVT::i32);
21555 MVT ExtVT = MVT::getVectorVT(EvtSVT, VT.getVectorNumElements());
21556 unsigned ExtOpc =
21557 Op.getOpcode() == ISD::SRA ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
21558 R = DAG.getNode(ExtOpc, dl, ExtVT, R);
21559 Amt = DAG.getNode(ISD::ANY_EXTEND, dl, ExtVT, Amt);
21560 return DAG.getNode(ISD::TRUNCATE, dl, VT,
21561 DAG.getNode(Op.getOpcode(), dl, ExtVT, R, Amt));
21562 }
21563
2154721564 if (VT == MVT::v16i8 ||
2154821565 (VT == MVT::v32i8 && Subtarget.hasInt256() && !Subtarget.hasXOP())) {
2154921566 MVT ExtVT = MVT::getVectorVT(MVT::i16, VT.getVectorNumElements() / 2);
2165021667 DAG.getNode(ISD::SRL, dl, ExtVT, RHi, DAG.getConstant(8, dl, ExtVT));
2165121668 return DAG.getNode(X86ISD::PACKUS, dl, VT, RLo, RHi);
2165221669 }
21653 }
21654
21655 // It's worth extending once and using the vXi32 shifts for 16-bit types, but
21656 // the extra overheads to get from v16i8 to v8i32 make the existing SSE
21657 // solution better.
21658 if ((Subtarget.hasInt256() && VT == MVT::v8i16) ||
21659 (Subtarget.hasAVX512() && VT == MVT::v16i16)) {
21660 MVT ExtVT = MVT::getVectorVT(MVT::i32, VT.getVectorNumElements());
21661 unsigned ExtOpc =
21662 Op.getOpcode() == ISD::SRA ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
21663 R = DAG.getNode(ExtOpc, dl, ExtVT, R);
21664 Amt = DAG.getNode(ISD::ANY_EXTEND, dl, ExtVT, Amt);
21665 return DAG.getNode(ISD::TRUNCATE, dl, VT,
21666 DAG.getNode(Op.getOpcode(), dl, ExtVT, R, Amt));
2166721670 }
2166821671
2166921672 if (Subtarget.hasInt256() && !Subtarget.hasXOP() && VT == MVT::v16i16) {
508508 ;
509509 ; AVX512-LABEL: var_shift_v16i8:
510510 ; AVX512: # BB#0:
511 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
512 ; AVX512-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
513 ; AVX512-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
514 ; AVX512-NEXT: vpsraw $4, %xmm3, %xmm4
515 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
516 ; AVX512-NEXT: vpsraw $2, %xmm3, %xmm4
517 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
518 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
519 ; AVX512-NEXT: vpsraw $1, %xmm3, %xmm4
520 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
521 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
522 ; AVX512-NEXT: vpsrlw $8, %xmm2, %xmm2
523 ; AVX512-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
524 ; AVX512-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
525 ; AVX512-NEXT: vpsraw $4, %xmm0, %xmm3
526 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
527 ; AVX512-NEXT: vpsraw $2, %xmm0, %xmm3
528 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
529 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
530 ; AVX512-NEXT: vpsraw $1, %xmm0, %xmm3
531 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
532 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
533 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm0
534 ; AVX512-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
511 ; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
512 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
513 ; AVX512-NEXT: vpsravd %zmm1, %zmm0, %zmm0
514 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0
535515 ; AVX512-NEXT: retq
536516 ;
537517 ; X32-SSE-LABEL: var_shift_v16i8:
920900 ; AVX512-LABEL: splatvar_shift_v16i8:
921901 ; AVX512: # BB#0:
922902 ; AVX512-NEXT: vpbroadcastb %xmm1, %xmm1
923 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
924 ; AVX512-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
925 ; AVX512-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
926 ; AVX512-NEXT: vpsraw $4, %xmm3, %xmm4
927 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
928 ; AVX512-NEXT: vpsraw $2, %xmm3, %xmm4
929 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
930 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
931 ; AVX512-NEXT: vpsraw $1, %xmm3, %xmm4
932 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
933 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
934 ; AVX512-NEXT: vpsrlw $8, %xmm2, %xmm2
935 ; AVX512-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
936 ; AVX512-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
937 ; AVX512-NEXT: vpsraw $4, %xmm0, %xmm3
938 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
939 ; AVX512-NEXT: vpsraw $2, %xmm0, %xmm3
940 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
941 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
942 ; AVX512-NEXT: vpsraw $1, %xmm0, %xmm3
943 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
944 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
945 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm0
946 ; AVX512-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
903 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
904 ; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
905 ; AVX512-NEXT: vpsravd %zmm1, %zmm0, %zmm0
906 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0
947907 ; AVX512-NEXT: retq
948908 ;
949909 ; X32-SSE-LABEL: splatvar_shift_v16i8:
14011361 ;
14021362 ; AVX512-LABEL: constant_shift_v16i8:
14031363 ; AVX512: # BB#0:
1404 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1405 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
1406 ; AVX512-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
1407 ; AVX512-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1408 ; AVX512-NEXT: vpsraw $4, %xmm3, %xmm4
1409 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
1410 ; AVX512-NEXT: vpsraw $2, %xmm3, %xmm4
1411 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
1412 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
1413 ; AVX512-NEXT: vpsraw $1, %xmm3, %xmm4
1414 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
1415 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
1416 ; AVX512-NEXT: vpsrlw $8, %xmm2, %xmm2
1417 ; AVX512-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1418 ; AVX512-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1419 ; AVX512-NEXT: vpsraw $4, %xmm0, %xmm3
1420 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1421 ; AVX512-NEXT: vpsraw $2, %xmm0, %xmm3
1422 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
1423 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1424 ; AVX512-NEXT: vpsraw $1, %xmm0, %xmm3
1425 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
1426 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1427 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm0
1428 ; AVX512-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
1364 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
1365 ; AVX512-NEXT: vpsravd {{.*}}(%rip), %zmm0, %zmm0
1366 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0
14291367 ; AVX512-NEXT: retq
14301368 ;
14311369 ; X32-SSE-LABEL: constant_shift_v16i8:
339339 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
340340 ; XOPAVX2-NEXT: retq
341341 ;
342 ; AVX512-LABEL: var_shift_v32i8:
343 ; AVX512: # BB#0:
344 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
345 ; AVX512-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
346 ; AVX512-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
347 ; AVX512-NEXT: vpsraw $4, %ymm3, %ymm4
348 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
349 ; AVX512-NEXT: vpsraw $2, %ymm3, %ymm4
350 ; AVX512-NEXT: vpaddw %ymm2, %ymm2, %ymm2
351 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
352 ; AVX512-NEXT: vpsraw $1, %ymm3, %ymm4
353 ; AVX512-NEXT: vpaddw %ymm2, %ymm2, %ymm2
354 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
355 ; AVX512-NEXT: vpsrlw $8, %ymm2, %ymm2
356 ; AVX512-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
357 ; AVX512-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
358 ; AVX512-NEXT: vpsraw $4, %ymm0, %ymm3
359 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
360 ; AVX512-NEXT: vpsraw $2, %ymm0, %ymm3
361 ; AVX512-NEXT: vpaddw %ymm1, %ymm1, %ymm1
362 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
363 ; AVX512-NEXT: vpsraw $1, %ymm0, %ymm3
364 ; AVX512-NEXT: vpaddw %ymm1, %ymm1, %ymm1
365 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
366 ; AVX512-NEXT: vpsrlw $8, %ymm0, %ymm0
367 ; AVX512-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
368 ; AVX512-NEXT: retq
342 ; AVX512DQ-LABEL: var_shift_v32i8:
343 ; AVX512DQ: # BB#0:
344 ; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1
345 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
346 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
347 ; AVX512DQ-NEXT: vpsraw $4, %ymm3, %ymm4
348 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
349 ; AVX512DQ-NEXT: vpsraw $2, %ymm3, %ymm4
350 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2
351 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
352 ; AVX512DQ-NEXT: vpsraw $1, %ymm3, %ymm4
353 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2
354 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
355 ; AVX512DQ-NEXT: vpsrlw $8, %ymm2, %ymm2
356 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
357 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
358 ; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm3
359 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
360 ; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm3
361 ; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1
362 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
363 ; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm3
364 ; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1
365 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
366 ; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0
367 ; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
368 ; AVX512DQ-NEXT: retq
369 ;
370 ; AVX512BW-LABEL: var_shift_v32i8:
371 ; AVX512BW: # BB#0:
372 ; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
373 ; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0
374 ; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0
375 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
376 ; AVX512BW-NEXT: retq
369377 %shift = ashr <32 x i8> %a, %b
370378 ret <32 x i8> %shift
371379 }
616624 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
617625 ; XOPAVX2-NEXT: retq
618626 ;
619 ; AVX512-LABEL: splatvar_shift_v32i8:
620 ; AVX512: # BB#0:
621 ; AVX512-NEXT: vpbroadcastb %xmm1, %ymm1
622 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
623 ; AVX512-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
624 ; AVX512-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
625 ; AVX512-NEXT: vpsraw $4, %ymm3, %ymm4
626 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
627 ; AVX512-NEXT: vpsraw $2, %ymm3, %ymm4
628 ; AVX512-NEXT: vpaddw %ymm2, %ymm2, %ymm2
629 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
630 ; AVX512-NEXT: vpsraw $1, %ymm3, %ymm4
631 ; AVX512-NEXT: vpaddw %ymm2, %ymm2, %ymm2
632 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
633 ; AVX512-NEXT: vpsrlw $8, %ymm2, %ymm2
634 ; AVX512-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
635 ; AVX512-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
636 ; AVX512-NEXT: vpsraw $4, %ymm0, %ymm3
637 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
638 ; AVX512-NEXT: vpsraw $2, %ymm0, %ymm3
639 ; AVX512-NEXT: vpaddw %ymm1, %ymm1, %ymm1
640 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
641 ; AVX512-NEXT: vpsraw $1, %ymm0, %ymm3
642 ; AVX512-NEXT: vpaddw %ymm1, %ymm1, %ymm1
643 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
644 ; AVX512-NEXT: vpsrlw $8, %ymm0, %ymm0
645 ; AVX512-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
646 ; AVX512-NEXT: retq
627 ; AVX512DQ-LABEL: splatvar_shift_v32i8:
628 ; AVX512DQ: # BB#0:
629 ; AVX512DQ-NEXT: vpbroadcastb %xmm1, %ymm1
630 ; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1
631 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
632 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
633 ; AVX512DQ-NEXT: vpsraw $4, %ymm3, %ymm4
634 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
635 ; AVX512DQ-NEXT: vpsraw $2, %ymm3, %ymm4
636 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2
637 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
638 ; AVX512DQ-NEXT: vpsraw $1, %ymm3, %ymm4
639 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2
640 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
641 ; AVX512DQ-NEXT: vpsrlw $8, %ymm2, %ymm2
642 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
643 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
644 ; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm3
645 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
646 ; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm3
647 ; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1
648 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
649 ; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm3
650 ; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1
651 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
652 ; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0
653 ; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
654 ; AVX512DQ-NEXT: retq
655 ;
656 ; AVX512BW-LABEL: splatvar_shift_v32i8:
657 ; AVX512BW: # BB#0:
658 ; AVX512BW-NEXT: vpbroadcastb %xmm1, %ymm1
659 ; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0
660 ; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
661 ; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0
662 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
663 ; AVX512BW-NEXT: retq
647664 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
648665 %shift = ashr <32 x i8> %a, %splat
649666 ret <32 x i8> %shift
928945 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
929946 ; XOPAVX2-NEXT: retq
930947 ;
931 ; AVX512-LABEL: constant_shift_v32i8:
932 ; AVX512: # BB#0:
933 ; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
934 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
935 ; AVX512-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
936 ; AVX512-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
937 ; AVX512-NEXT: vpsraw $4, %ymm3, %ymm4
938 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
939 ; AVX512-NEXT: vpsraw $2, %ymm3, %ymm4
940 ; AVX512-NEXT: vpaddw %ymm2, %ymm2, %ymm2
941 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
942 ; AVX512-NEXT: vpsraw $1, %ymm3, %ymm4
943 ; AVX512-NEXT: vpaddw %ymm2, %ymm2, %ymm2
944 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
945 ; AVX512-NEXT: vpsrlw $8, %ymm2, %ymm2
946 ; AVX512-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
947 ; AVX512-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
948 ; AVX512-NEXT: vpsraw $4, %ymm0, %ymm3
949 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
950 ; AVX512-NEXT: vpsraw $2, %ymm0, %ymm3
951 ; AVX512-NEXT: vpaddw %ymm1, %ymm1, %ymm1
952 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
953 ; AVX512-NEXT: vpsraw $1, %ymm0, %ymm3
954 ; AVX512-NEXT: vpaddw %ymm1, %ymm1, %ymm1
955 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
956 ; AVX512-NEXT: vpsrlw $8, %ymm0, %ymm0
957 ; AVX512-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
958 ; AVX512-NEXT: retq
948 ; AVX512DQ-LABEL: constant_shift_v32i8:
949 ; AVX512DQ: # BB#0:
950 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
951 ; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1
952 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
953 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
954 ; AVX512DQ-NEXT: vpsraw $4, %ymm3, %ymm4
955 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
956 ; AVX512DQ-NEXT: vpsraw $2, %ymm3, %ymm4
957 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2
958 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
959 ; AVX512DQ-NEXT: vpsraw $1, %ymm3, %ymm4
960 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2
961 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
962 ; AVX512DQ-NEXT: vpsrlw $8, %ymm2, %ymm2
963 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
964 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
965 ; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm3
966 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
967 ; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm3
968 ; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1
969 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
970 ; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm3
971 ; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1
972 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
973 ; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0
974 ; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
975 ; AVX512DQ-NEXT: retq
976 ;
977 ; AVX512BW-LABEL: constant_shift_v32i8:
978 ; AVX512BW: # BB#0:
979 ; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0
980 ; AVX512BW-NEXT: vpsravw {{.*}}(%rip), %zmm0, %zmm0
981 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
982 ; AVX512BW-NEXT: retq
959983 %shift = ashr <32 x i8> %a,
960984 ret <32 x i8> %shift
961985 }
426426 ;
427427 ; AVX512-LABEL: var_shift_v16i8:
428428 ; AVX512: # BB#0:
429 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
430 ; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm2
431 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
432 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
433 ; AVX512-NEXT: vpsrlw $2, %xmm0, %xmm2
434 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
435 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1
436 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
437 ; AVX512-NEXT: vpsrlw $1, %xmm0, %xmm2
438 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
439 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1
440 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
429 ; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
430 ; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
431 ; AVX512-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0
432 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0
441433 ; AVX512-NEXT: retq
442434 ;
443435 ; X32-SSE-LABEL: var_shift_v16i8:
710702 ; AVX512-LABEL: splatvar_shift_v16i8:
711703 ; AVX512: # BB#0:
712704 ; AVX512-NEXT: vpbroadcastb %xmm1, %xmm1
713 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
714 ; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm2
715 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
716 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
717 ; AVX512-NEXT: vpsrlw $2, %xmm0, %xmm2
718 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
719 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1
720 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
721 ; AVX512-NEXT: vpsrlw $1, %xmm0, %xmm2
722 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
723 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1
724 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
705 ; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
706 ; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
707 ; AVX512-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0
708 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0
725709 ; AVX512-NEXT: retq
726710 ;
727711 ; X32-SSE-LABEL: splatvar_shift_v16i8:
10811065 ;
10821066 ; AVX512-LABEL: constant_shift_v16i8:
10831067 ; AVX512: # BB#0:
1084 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1085 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
1086 ; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm2
1087 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
1088 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
1089 ; AVX512-NEXT: vpsrlw $2, %xmm0, %xmm2
1090 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
1091 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1
1092 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
1093 ; AVX512-NEXT: vpsrlw $1, %xmm0, %xmm2
1094 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
1095 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1
1096 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
1068 ; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
1069 ; AVX512-NEXT: vpsrlvd {{.*}}(%rip), %zmm0, %zmm0
1070 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0
10971071 ; AVX512-NEXT: retq
10981072 ;
10991073 ; X32-SSE-LABEL: constant_shift_v16i8:
283283 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
284284 ; XOPAVX2-NEXT: retq
285285 ;
286 ; AVX512-LABEL: var_shift_v32i8:
287 ; AVX512: # BB#0:
288 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
289 ; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm2
290 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
291 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
292 ; AVX512-NEXT: vpsrlw $2, %ymm0, %ymm2
293 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
294 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
295 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
296 ; AVX512-NEXT: vpsrlw $1, %ymm0, %ymm2
297 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
298 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
299 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
300 ; AVX512-NEXT: retq
286 ; AVX512DQ-LABEL: var_shift_v32i8:
287 ; AVX512DQ: # BB#0:
288 ; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1
289 ; AVX512DQ-NEXT: vpsrlw $4, %ymm0, %ymm2
290 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
291 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
292 ; AVX512DQ-NEXT: vpsrlw $2, %ymm0, %ymm2
293 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
294 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
295 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
296 ; AVX512DQ-NEXT: vpsrlw $1, %ymm0, %ymm2
297 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
298 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
299 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
300 ; AVX512DQ-NEXT: retq
301 ;
302 ; AVX512BW-LABEL: var_shift_v32i8:
303 ; AVX512BW: # BB#0:
304 ; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
305 ; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
306 ; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0
307 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
308 ; AVX512BW-NEXT: retq
301309 %shift = lshr <32 x i8> %a, %b
302310 ret <32 x i8> %shift
303311 }
498506 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
499507 ; XOPAVX2-NEXT: retq
500508 ;
501 ; AVX512-LABEL: splatvar_shift_v32i8:
502 ; AVX512: # BB#0:
503 ; AVX512-NEXT: vpbroadcastb %xmm1, %ymm1
504 ; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm2
505 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
506 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
507 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
508 ; AVX512-NEXT: vpsrlw $2, %ymm0, %ymm2
509 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
510 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
511 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
512 ; AVX512-NEXT: vpsrlw $1, %ymm0, %ymm2
513 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
514 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
515 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
516 ; AVX512-NEXT: retq
509 ; AVX512DQ-LABEL: splatvar_shift_v32i8:
510 ; AVX512DQ: # BB#0:
511 ; AVX512DQ-NEXT: vpbroadcastb %xmm1, %ymm1
512 ; AVX512DQ-NEXT: vpsrlw $4, %ymm0, %ymm2
513 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
514 ; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1
515 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
516 ; AVX512DQ-NEXT: vpsrlw $2, %ymm0, %ymm2
517 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
518 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
519 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
520 ; AVX512DQ-NEXT: vpsrlw $1, %ymm0, %ymm2
521 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
522 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
523 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
524 ; AVX512DQ-NEXT: retq
525 ;
526 ; AVX512BW-LABEL: splatvar_shift_v32i8:
527 ; AVX512BW: # BB#0:
528 ; AVX512BW-NEXT: vpbroadcastb %xmm1, %ymm1
529 ; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
530 ; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
531 ; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0
532 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
533 ; AVX512BW-NEXT: retq
517534 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
518535 %shift = lshr <32 x i8> %a, %splat
519536 ret <32 x i8> %shift
754771 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
755772 ; XOPAVX2-NEXT: retq
756773 ;
757 ; AVX512-LABEL: constant_shift_v32i8:
758 ; AVX512: # BB#0:
759 ; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
760 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
761 ; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm2
762 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
763 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
764 ; AVX512-NEXT: vpsrlw $2, %ymm0, %ymm2
765 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
766 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
767 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
768 ; AVX512-NEXT: vpsrlw $1, %ymm0, %ymm2
769 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
770 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
771 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
772 ; AVX512-NEXT: retq
774 ; AVX512DQ-LABEL: constant_shift_v32i8:
775 ; AVX512DQ: # BB#0:
776 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
777 ; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1
778 ; AVX512DQ-NEXT: vpsrlw $4, %ymm0, %ymm2
779 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
780 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
781 ; AVX512DQ-NEXT: vpsrlw $2, %ymm0, %ymm2
782 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
783 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
784 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
785 ; AVX512DQ-NEXT: vpsrlw $1, %ymm0, %ymm2
786 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
787 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
788 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
789 ; AVX512DQ-NEXT: retq
790 ;
791 ; AVX512BW-LABEL: constant_shift_v32i8:
792 ; AVX512BW: # BB#0:
793 ; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
794 ; AVX512BW-NEXT: vpsrlvw {{.*}}(%rip), %zmm0, %zmm0
795 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
796 ; AVX512BW-NEXT: retq
773797 %shift = lshr <32 x i8> %a,
774798 ret <32 x i8> %shift
775799 }
376376 ;
377377 ; AVX512-LABEL: var_shift_v16i8:
378378 ; AVX512: # BB#0:
379 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
380 ; AVX512-NEXT: vpsllw $4, %xmm0, %xmm2
381 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
382 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
383 ; AVX512-NEXT: vpsllw $2, %xmm0, %xmm2
384 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
385 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1
386 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
387 ; AVX512-NEXT: vpaddb %xmm0, %xmm0, %xmm2
388 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1
389 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
379 ; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
380 ; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
381 ; AVX512-NEXT: vpsllvd %zmm1, %zmm0, %zmm0
382 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0
390383 ; AVX512-NEXT: retq
391384 ;
392385 ; X32-SSE-LABEL: var_shift_v16i8:
651644 ; AVX512-LABEL: splatvar_shift_v16i8:
652645 ; AVX512: # BB#0:
653646 ; AVX512-NEXT: vpbroadcastb %xmm1, %xmm1
654 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
655 ; AVX512-NEXT: vpsllw $4, %xmm0, %xmm2
656 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
657 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
658 ; AVX512-NEXT: vpsllw $2, %xmm0, %xmm2
659 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
660 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1
661 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
662 ; AVX512-NEXT: vpaddb %xmm0, %xmm0, %xmm2
663 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1
664 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
647 ; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
648 ; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
649 ; AVX512-NEXT: vpsllvd %zmm1, %zmm0, %zmm0
650 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0
665651 ; AVX512-NEXT: retq
666652 ;
667653 ; X32-SSE-LABEL: splatvar_shift_v16i8:
933919 ;
934920 ; AVX512-LABEL: constant_shift_v16i8:
935921 ; AVX512: # BB#0:
936 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
937 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
938 ; AVX512-NEXT: vpsllw $4, %xmm0, %xmm2
939 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
940 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
941 ; AVX512-NEXT: vpsllw $2, %xmm0, %xmm2
942 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
943 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1
944 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
945 ; AVX512-NEXT: vpaddb %xmm0, %xmm0, %xmm2
946 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1
947 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
922 ; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
923 ; AVX512-NEXT: vpsllvd {{.*}}(%rip), %zmm0, %zmm0
924 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0
948925 ; AVX512-NEXT: retq
949926 ;
950927 ; X32-SSE-LABEL: constant_shift_v16i8:
248248 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
249249 ; XOPAVX2-NEXT: retq
250250 ;
251 ; AVX512-LABEL: var_shift_v32i8:
252 ; AVX512: # BB#0:
253 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
254 ; AVX512-NEXT: vpsllw $4, %ymm0, %ymm2
255 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
256 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
257 ; AVX512-NEXT: vpsllw $2, %ymm0, %ymm2
258 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
259 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
260 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
261 ; AVX512-NEXT: vpaddb %ymm0, %ymm0, %ymm2
262 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
263 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
264 ; AVX512-NEXT: retq
251 ; AVX512DQ-LABEL: var_shift_v32i8:
252 ; AVX512DQ: # BB#0:
253 ; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1
254 ; AVX512DQ-NEXT: vpsllw $4, %ymm0, %ymm2
255 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
256 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
257 ; AVX512DQ-NEXT: vpsllw $2, %ymm0, %ymm2
258 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
259 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
260 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
261 ; AVX512DQ-NEXT: vpaddb %ymm0, %ymm0, %ymm2
262 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
263 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
264 ; AVX512DQ-NEXT: retq
265 ;
266 ; AVX512BW-LABEL: var_shift_v32i8:
267 ; AVX512BW: # BB#0:
268 ; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
269 ; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
270 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
271 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
272 ; AVX512BW-NEXT: retq
265273 %shift = shl <32 x i8> %a, %b
266274 ret <32 x i8> %shift
267275 }
454462 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
455463 ; XOPAVX2-NEXT: retq
456464 ;
457 ; AVX512-LABEL: splatvar_shift_v32i8:
458 ; AVX512: # BB#0:
459 ; AVX512-NEXT: vpbroadcastb %xmm1, %ymm1
460 ; AVX512-NEXT: vpsllw $4, %ymm0, %ymm2
461 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
462 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
463 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
464 ; AVX512-NEXT: vpsllw $2, %ymm0, %ymm2
465 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
466 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
467 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
468 ; AVX512-NEXT: vpaddb %ymm0, %ymm0, %ymm2
469 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
470 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
471 ; AVX512-NEXT: retq
465 ; AVX512DQ-LABEL: splatvar_shift_v32i8:
466 ; AVX512DQ: # BB#0:
467 ; AVX512DQ-NEXT: vpbroadcastb %xmm1, %ymm1
468 ; AVX512DQ-NEXT: vpsllw $4, %ymm0, %ymm2
469 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
470 ; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1
471 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
472 ; AVX512DQ-NEXT: vpsllw $2, %ymm0, %ymm2
473 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
474 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
475 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
476 ; AVX512DQ-NEXT: vpaddb %ymm0, %ymm0, %ymm2
477 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
478 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
479 ; AVX512DQ-NEXT: retq
480 ;
481 ; AVX512BW-LABEL: splatvar_shift_v32i8:
482 ; AVX512BW: # BB#0:
483 ; AVX512BW-NEXT: vpbroadcastb %xmm1, %ymm1
484 ; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
485 ; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
486 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
487 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
488 ; AVX512BW-NEXT: retq
472489 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
473490 %shift = shl <32 x i8> %a, %splat
474491 ret <32 x i8> %shift
658675 ; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
659676 ; XOPAVX2-NEXT: retq
660677 ;
661 ; AVX512-LABEL: constant_shift_v32i8:
662 ; AVX512: # BB#0:
663 ; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
664 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
665 ; AVX512-NEXT: vpsllw $4, %ymm0, %ymm2
666 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
667 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
668 ; AVX512-NEXT: vpsllw $2, %ymm0, %ymm2
669 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
670 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
671 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
672 ; AVX512-NEXT: vpaddb %ymm0, %ymm0, %ymm2
673 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
674 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
675 ; AVX512-NEXT: retq
678 ; AVX512DQ-LABEL: constant_shift_v32i8:
679 ; AVX512DQ: # BB#0:
680 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
681 ; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1
682 ; AVX512DQ-NEXT: vpsllw $4, %ymm0, %ymm2
683 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
684 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
685 ; AVX512DQ-NEXT: vpsllw $2, %ymm0, %ymm2
686 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
687 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
688 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
689 ; AVX512DQ-NEXT: vpaddb %ymm0, %ymm0, %ymm2
690 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
691 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
692 ; AVX512DQ-NEXT: retq
693 ;
694 ; AVX512BW-LABEL: constant_shift_v32i8:
695 ; AVX512BW: # BB#0:
696 ; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
697 ; AVX512BW-NEXT: vpsllvw {{.*}}(%rip), %zmm0, %zmm0
698 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
699 ; AVX512BW-NEXT: retq
676700 %shift = shl <32 x i8> %a,
677701 ret <32 x i8> %shift
678702 }