brintos

brintos / llvm-project-archived public Read only

0
0
Text · 72.0 KiB · 0bf2006 Raw
1832 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX17; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX28; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX512DQ9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512BW10 11; Shifts of uniform vXi8 constant values can be performed by a PSHUFB LUT12 13define <16 x i8> @uniform_shl_v16i8(<16 x i8> %a) nounwind {14; SSE2-LABEL: uniform_shl_v16i8:15; SSE2:       # %bb.0:16; SSE2-NEXT:    movdqa %xmm0, %xmm117; SSE2-NEXT:    psllw $5, %xmm118; SSE2-NEXT:    pxor %xmm2, %xmm219; SSE2-NEXT:    pxor %xmm3, %xmm320; SSE2-NEXT:    pcmpgtb %xmm1, %xmm321; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]22; SSE2-NEXT:    pand %xmm3, %xmm023; SSE2-NEXT:    paddb %xmm3, %xmm024; SSE2-NEXT:    pcmpeqd %xmm3, %xmm325; SSE2-NEXT:    psubb %xmm3, %xmm026; SSE2-NEXT:    paddb %xmm1, %xmm127; SSE2-NEXT:    pxor %xmm3, %xmm328; SSE2-NEXT:    pcmpgtb %xmm1, %xmm329; SSE2-NEXT:    movdqa %xmm3, %xmm430; SSE2-NEXT:    pandn %xmm0, %xmm431; SSE2-NEXT:    psllw $2, %xmm032; SSE2-NEXT:    pand %xmm3, %xmm033; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm034; SSE2-NEXT:    por %xmm4, %xmm035; SSE2-NEXT:    paddb %xmm1, %xmm136; SSE2-NEXT:    pcmpgtb %xmm1, %xmm237; SSE2-NEXT:    movdqa %xmm2, %xmm138; SSE2-NEXT:    pandn %xmm0, %xmm139; SSE2-NEXT:    paddb %xmm0, %xmm040; SSE2-NEXT:    pand %xmm2, %xmm041; SSE2-NEXT:    por %xmm1, %xmm042; SSE2-NEXT:    retq43;44; SSE41-LABEL: uniform_shl_v16i8:45; SSE41:       # %bb.0:46; SSE41-NEXT:    movq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]47; SSE41-NEXT:    pshufb %xmm0, %xmm148; SSE41-NEXT:    movdqa %xmm1, %xmm049; SSE41-NEXT:    retq50;51; AVX-LABEL: uniform_shl_v16i8:52; AVX:       # %bb.0:53; AVX-NEXT:    vmovq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]54; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm055; AVX-NEXT:    retq56;57; XOP-LABEL: uniform_shl_v16i8:58; XOP:       # %bb.0:59; XOP-NEXT:    vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm060; XOP-NEXT:    retq61;62; AVX512DQ-LABEL: uniform_shl_v16i8:63; AVX512DQ:       # %bb.0:64; AVX512DQ-NEXT:    vmovq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]65; AVX512DQ-NEXT:    vpshufb %xmm0, %xmm1, %xmm066; AVX512DQ-NEXT:    retq67;68; AVX512BW-LABEL: uniform_shl_v16i8:69; AVX512BW:       # %bb.0:70; AVX512BW-NEXT:    vmovq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]71; AVX512BW-NEXT:    vpshufb %xmm0, %xmm1, %xmm072; AVX512BW-NEXT:    retq73  %shift = shl <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, %a74  ret <16 x i8> %shift75}76 77define <16 x i8> @uniform_lshr_v16i8(<16 x i8> %a) nounwind {78; SSE2-LABEL: uniform_lshr_v16i8:79; SSE2:       # %bb.0:80; SSE2-NEXT:    psllw $5, %xmm081; SSE2-NEXT:    pxor %xmm1, %xmm182; SSE2-NEXT:    pcmpgtb %xmm0, %xmm183; SSE2-NEXT:    movdqa %xmm0, %xmm284; SSE2-NEXT:    paddb %xmm0, %xmm285; SSE2-NEXT:    pxor %xmm3, %xmm386; SSE2-NEXT:    pxor %xmm0, %xmm087; SSE2-NEXT:    pcmpgtb %xmm2, %xmm088; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm189; SSE2-NEXT:    pandn %xmm1, %xmm090; SSE2-NEXT:    paddb %xmm2, %xmm291; SSE2-NEXT:    pcmpgtb %xmm2, %xmm392; SSE2-NEXT:    movdqa %xmm3, %xmm193; SSE2-NEXT:    pandn %xmm0, %xmm194; SSE2-NEXT:    psrlw $1, %xmm095; SSE2-NEXT:    pand %xmm3, %xmm096; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm097; SSE2-NEXT:    por %xmm1, %xmm098; SSE2-NEXT:    retq99;100; SSE41-LABEL: uniform_lshr_v16i8:101; SSE41:       # %bb.0:102; SSE41-NEXT:    movd {{.*#+}} xmm1 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]103; SSE41-NEXT:    pshufb %xmm0, %xmm1104; SSE41-NEXT:    movdqa %xmm1, %xmm0105; SSE41-NEXT:    retq106;107; AVX-LABEL: uniform_lshr_v16i8:108; AVX:       # %bb.0:109; AVX-NEXT:    vmovd {{.*#+}} xmm1 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]110; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm0111; AVX-NEXT:    retq112;113; XOP-LABEL: uniform_lshr_v16i8:114; XOP:       # %bb.0:115; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1116; XOP-NEXT:    vpsubb %xmm0, %xmm1, %xmm0117; XOP-NEXT:    vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0118; XOP-NEXT:    retq119;120; AVX512DQ-LABEL: uniform_lshr_v16i8:121; AVX512DQ:       # %bb.0:122; AVX512DQ-NEXT:    vmovd {{.*#+}} xmm1 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]123; AVX512DQ-NEXT:    vpshufb %xmm0, %xmm1, %xmm0124; AVX512DQ-NEXT:    retq125;126; AVX512BW-LABEL: uniform_lshr_v16i8:127; AVX512BW:       # %bb.0:128; AVX512BW-NEXT:    vmovd {{.*#+}} xmm1 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]129; AVX512BW-NEXT:    vpshufb %xmm0, %xmm1, %xmm0130; AVX512BW-NEXT:    retq131  %shift = lshr <16 x i8> <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>, %a132  ret <16 x i8> %shift133}134 135define <16 x i8> @uniform_ashr_v16i8(<16 x i8> %a) nounwind {136; SSE2-LABEL: uniform_ashr_v16i8:137; SSE2:       # %bb.0:138; SSE2-NEXT:    psllw $5, %xmm0139; SSE2-NEXT:    pxor %xmm1, %xmm1140; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1141; SSE2-NEXT:    movdqa %xmm0, %xmm2142; SSE2-NEXT:    paddb %xmm0, %xmm2143; SSE2-NEXT:    pxor %xmm3, %xmm3144; SSE2-NEXT:    pxor %xmm0, %xmm0145; SSE2-NEXT:    pcmpgtb %xmm2, %xmm0146; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1147; SSE2-NEXT:    pandn %xmm1, %xmm0148; SSE2-NEXT:    paddb %xmm2, %xmm2149; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3150; SSE2-NEXT:    movdqa %xmm3, %xmm1151; SSE2-NEXT:    pandn %xmm0, %xmm1152; SSE2-NEXT:    psrlw $1, %xmm0153; SSE2-NEXT:    pand %xmm3, %xmm0154; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0155; SSE2-NEXT:    por %xmm1, %xmm0156; SSE2-NEXT:    retq157;158; SSE41-LABEL: uniform_ashr_v16i8:159; SSE41:       # %bb.0:160; SSE41-NEXT:    movd {{.*#+}} xmm1 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]161; SSE41-NEXT:    pshufb %xmm0, %xmm1162; SSE41-NEXT:    movdqa %xmm1, %xmm0163; SSE41-NEXT:    retq164;165; AVX-LABEL: uniform_ashr_v16i8:166; AVX:       # %bb.0:167; AVX-NEXT:    vmovd {{.*#+}} xmm1 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]168; AVX-NEXT:    vpshufb %xmm0, %xmm1, %xmm0169; AVX-NEXT:    retq170;171; XOP-LABEL: uniform_ashr_v16i8:172; XOP:       # %bb.0:173; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1174; XOP-NEXT:    vpsubb %xmm0, %xmm1, %xmm0175; XOP-NEXT:    vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0176; XOP-NEXT:    retq177;178; AVX512DQ-LABEL: uniform_ashr_v16i8:179; AVX512DQ:       # %bb.0:180; AVX512DQ-NEXT:    vmovd {{.*#+}} xmm1 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]181; AVX512DQ-NEXT:    vpshufb %xmm0, %xmm1, %xmm0182; AVX512DQ-NEXT:    retq183;184; AVX512BW-LABEL: uniform_ashr_v16i8:185; AVX512BW:       # %bb.0:186; AVX512BW-NEXT:    vmovd {{.*#+}} xmm1 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]187; AVX512BW-NEXT:    vpshufb %xmm0, %xmm1, %xmm0188; AVX512BW-NEXT:    retq189  %shift = ashr <16 x i8> <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>, %a190  ret <16 x i8> %shift191}192 193define <32 x i8> @uniform_shl_v32i8(<32 x i8> %a) nounwind {194; SSE2-LABEL: uniform_shl_v32i8:195; SSE2:       # %bb.0:196; SSE2-NEXT:    movdqa %xmm0, %xmm2197; SSE2-NEXT:    psllw $5, %xmm2198; SSE2-NEXT:    pxor %xmm3, %xmm3199; SSE2-NEXT:    pxor %xmm7, %xmm7200; SSE2-NEXT:    pcmpgtb %xmm2, %xmm7201; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]202; SSE2-NEXT:    movdqa %xmm7, %xmm0203; SSE2-NEXT:    pandn %xmm4, %xmm0204; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]205; SSE2-NEXT:    pand %xmm5, %xmm7206; SSE2-NEXT:    por %xmm0, %xmm7207; SSE2-NEXT:    paddb %xmm2, %xmm2208; SSE2-NEXT:    pxor %xmm0, %xmm0209; SSE2-NEXT:    pcmpgtb %xmm2, %xmm0210; SSE2-NEXT:    movdqa %xmm0, %xmm8211; SSE2-NEXT:    pandn %xmm7, %xmm8212; SSE2-NEXT:    psllw $2, %xmm7213; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]214; SSE2-NEXT:    pand %xmm6, %xmm0215; SSE2-NEXT:    pand %xmm7, %xmm0216; SSE2-NEXT:    por %xmm8, %xmm0217; SSE2-NEXT:    paddb %xmm2, %xmm2218; SSE2-NEXT:    pxor %xmm7, %xmm7219; SSE2-NEXT:    pcmpgtb %xmm2, %xmm7220; SSE2-NEXT:    movdqa %xmm7, %xmm2221; SSE2-NEXT:    pandn %xmm0, %xmm2222; SSE2-NEXT:    paddb %xmm0, %xmm0223; SSE2-NEXT:    pand %xmm7, %xmm0224; SSE2-NEXT:    por %xmm2, %xmm0225; SSE2-NEXT:    psllw $5, %xmm1226; SSE2-NEXT:    pxor %xmm7, %xmm7227; SSE2-NEXT:    pcmpgtb %xmm1, %xmm7228; SSE2-NEXT:    movdqa %xmm7, %xmm2229; SSE2-NEXT:    pandn %xmm4, %xmm2230; SSE2-NEXT:    pand %xmm5, %xmm7231; SSE2-NEXT:    por %xmm2, %xmm7232; SSE2-NEXT:    paddb %xmm1, %xmm1233; SSE2-NEXT:    pxor %xmm2, %xmm2234; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2235; SSE2-NEXT:    movdqa %xmm2, %xmm4236; SSE2-NEXT:    pandn %xmm7, %xmm4237; SSE2-NEXT:    psllw $2, %xmm7238; SSE2-NEXT:    pand %xmm6, %xmm2239; SSE2-NEXT:    pand %xmm7, %xmm2240; SSE2-NEXT:    por %xmm4, %xmm2241; SSE2-NEXT:    paddb %xmm1, %xmm1242; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3243; SSE2-NEXT:    movdqa %xmm3, %xmm1244; SSE2-NEXT:    pandn %xmm2, %xmm1245; SSE2-NEXT:    paddb %xmm2, %xmm2246; SSE2-NEXT:    pand %xmm3, %xmm2247; SSE2-NEXT:    por %xmm1, %xmm2248; SSE2-NEXT:    movdqa %xmm2, %xmm1249; SSE2-NEXT:    retq250;251; SSE41-LABEL: uniform_shl_v32i8:252; SSE41:       # %bb.0:253; SSE41-NEXT:    movq {{.*#+}} xmm2 = [4,8,16,32,64,128,0,0,0,0,0,0,0,0,0,0]254; SSE41-NEXT:    movdqa %xmm2, %xmm3255; SSE41-NEXT:    pshufb %xmm0, %xmm3256; SSE41-NEXT:    pshufb %xmm1, %xmm2257; SSE41-NEXT:    movdqa %xmm3, %xmm0258; SSE41-NEXT:    movdqa %xmm2, %xmm1259; SSE41-NEXT:    retq260;261; AVX1-LABEL: uniform_shl_v32i8:262; AVX1:       # %bb.0:263; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1264; AVX1-NEXT:    vmovq {{.*#+}} xmm2 = [4,8,16,32,64,128,0,0,0,0,0,0,0,0,0,0]265; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm1266; AVX1-NEXT:    vpshufb %xmm0, %xmm2, %xmm0267; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0268; AVX1-NEXT:    retq269;270; AVX2-LABEL: uniform_shl_v32i8:271; AVX2:       # %bb.0:272; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0]273; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0274; AVX2-NEXT:    retq275;276; XOPAVX1-LABEL: uniform_shl_v32i8:277; XOPAVX1:       # %bb.0:278; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1279; XOPAVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]280; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm2, %xmm1281; XOPAVX1-NEXT:    vpshlb %xmm0, %xmm2, %xmm0282; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0283; XOPAVX1-NEXT:    retq284;285; XOPAVX2-LABEL: uniform_shl_v32i8:286; XOPAVX2:       # %bb.0:287; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0]288; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0289; XOPAVX2-NEXT:    retq290;291; AVX512DQ-LABEL: uniform_shl_v32i8:292; AVX512DQ:       # %bb.0:293; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0]294; AVX512DQ-NEXT:    vpshufb %ymm0, %ymm1, %ymm0295; AVX512DQ-NEXT:    retq296;297; AVX512BW-LABEL: uniform_shl_v32i8:298; AVX512BW:       # %bb.0:299; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0]300; AVX512BW-NEXT:    vpshufb %ymm0, %ymm1, %ymm0301; AVX512BW-NEXT:    retq302  %shift = shl <32 x i8> <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>, %a303  ret <32 x i8> %shift304}305 306define <32 x i8> @uniform_lshr_v32i8(<32 x i8> %a) nounwind {307; SSE2-LABEL: uniform_lshr_v32i8:308; SSE2:       # %bb.0:309; SSE2-NEXT:    movdqa %xmm1, %xmm2310; SSE2-NEXT:    movdqa %xmm0, %xmm3311; SSE2-NEXT:    psllw $5, %xmm3312; SSE2-NEXT:    pxor %xmm1, %xmm1313; SSE2-NEXT:    pxor %xmm0, %xmm0314; SSE2-NEXT:    pcmpgtb %xmm3, %xmm0315; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5]316; SSE2-NEXT:    pandn %xmm4, %xmm0317; SSE2-NEXT:    paddb %xmm3, %xmm3318; SSE2-NEXT:    pxor %xmm6, %xmm6319; SSE2-NEXT:    pcmpgtb %xmm3, %xmm6320; SSE2-NEXT:    movdqa %xmm6, %xmm7321; SSE2-NEXT:    pandn %xmm0, %xmm7322; SSE2-NEXT:    psrlw $2, %xmm0323; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]324; SSE2-NEXT:    pand %xmm5, %xmm6325; SSE2-NEXT:    pand %xmm0, %xmm6326; SSE2-NEXT:    por %xmm7, %xmm6327; SSE2-NEXT:    paddb %xmm3, %xmm3328; SSE2-NEXT:    pxor %xmm0, %xmm0329; SSE2-NEXT:    pcmpgtb %xmm3, %xmm0330; SSE2-NEXT:    movdqa %xmm0, %xmm7331; SSE2-NEXT:    pandn %xmm6, %xmm7332; SSE2-NEXT:    psrlw $1, %xmm6333; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]334; SSE2-NEXT:    pand %xmm3, %xmm0335; SSE2-NEXT:    pand %xmm6, %xmm0336; SSE2-NEXT:    por %xmm7, %xmm0337; SSE2-NEXT:    psllw $5, %xmm2338; SSE2-NEXT:    pxor %xmm6, %xmm6339; SSE2-NEXT:    pcmpgtb %xmm2, %xmm6340; SSE2-NEXT:    pandn %xmm4, %xmm6341; SSE2-NEXT:    paddb %xmm2, %xmm2342; SSE2-NEXT:    pxor %xmm4, %xmm4343; SSE2-NEXT:    pcmpgtb %xmm2, %xmm4344; SSE2-NEXT:    movdqa %xmm4, %xmm7345; SSE2-NEXT:    pandn %xmm6, %xmm7346; SSE2-NEXT:    psrlw $2, %xmm6347; SSE2-NEXT:    pand %xmm5, %xmm4348; SSE2-NEXT:    pand %xmm6, %xmm4349; SSE2-NEXT:    por %xmm7, %xmm4350; SSE2-NEXT:    paddb %xmm2, %xmm2351; SSE2-NEXT:    pcmpgtb %xmm2, %xmm1352; SSE2-NEXT:    movdqa %xmm1, %xmm2353; SSE2-NEXT:    pandn %xmm4, %xmm2354; SSE2-NEXT:    psrlw $1, %xmm4355; SSE2-NEXT:    pand %xmm3, %xmm1356; SSE2-NEXT:    pand %xmm4, %xmm1357; SSE2-NEXT:    por %xmm2, %xmm1358; SSE2-NEXT:    retq359;360; SSE41-LABEL: uniform_lshr_v32i8:361; SSE41:       # %bb.0:362; SSE41-NEXT:    movd {{.*#+}} xmm2 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]363; SSE41-NEXT:    movdqa %xmm2, %xmm3364; SSE41-NEXT:    pshufb %xmm0, %xmm3365; SSE41-NEXT:    pshufb %xmm1, %xmm2366; SSE41-NEXT:    movdqa %xmm3, %xmm0367; SSE41-NEXT:    movdqa %xmm2, %xmm1368; SSE41-NEXT:    retq369;370; AVX1-LABEL: uniform_lshr_v32i8:371; AVX1:       # %bb.0:372; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1373; AVX1-NEXT:    vmovd {{.*#+}} xmm2 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]374; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm1375; AVX1-NEXT:    vpshufb %xmm0, %xmm2, %xmm0376; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0377; AVX1-NEXT:    retq378;379; AVX2-LABEL: uniform_lshr_v32i8:380; AVX2:       # %bb.0:381; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0]382; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0383; AVX2-NEXT:    retq384;385; XOPAVX1-LABEL: uniform_lshr_v32i8:386; XOPAVX1:       # %bb.0:387; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1388; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2389; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm1390; XOPAVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5]391; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm3, %xmm1392; XOPAVX1-NEXT:    vpsubb %xmm0, %xmm2, %xmm0393; XOPAVX1-NEXT:    vpshlb %xmm0, %xmm3, %xmm0394; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0395; XOPAVX1-NEXT:    retq396;397; XOPAVX2-LABEL: uniform_lshr_v32i8:398; XOPAVX2:       # %bb.0:399; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0]400; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0401; XOPAVX2-NEXT:    retq402;403; AVX512DQ-LABEL: uniform_lshr_v32i8:404; AVX512DQ:       # %bb.0:405; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0]406; AVX512DQ-NEXT:    vpshufb %ymm0, %ymm1, %ymm0407; AVX512DQ-NEXT:    retq408;409; AVX512BW-LABEL: uniform_lshr_v32i8:410; AVX512BW:       # %bb.0:411; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0]412; AVX512BW-NEXT:    vpshufb %ymm0, %ymm1, %ymm0413; AVX512BW-NEXT:    retq414  %shift = lshr <32 x i8> <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5>, %a415  ret <32 x i8> %shift416}417 418define <32 x i8> @uniform_ashr_v32i8(<32 x i8> %a) nounwind {419; SSE2-LABEL: uniform_ashr_v32i8:420; SSE2:       # %bb.0:421; SSE2-NEXT:    movdqa %xmm1, %xmm2422; SSE2-NEXT:    movdqa %xmm0, %xmm3423; SSE2-NEXT:    psllw $5, %xmm3424; SSE2-NEXT:    pxor %xmm1, %xmm1425; SSE2-NEXT:    pxor %xmm0, %xmm0426; SSE2-NEXT:    pcmpgtb %xmm3, %xmm0427; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6]428; SSE2-NEXT:    pandn %xmm4, %xmm0429; SSE2-NEXT:    paddb %xmm3, %xmm3430; SSE2-NEXT:    pxor %xmm6, %xmm6431; SSE2-NEXT:    pcmpgtb %xmm3, %xmm6432; SSE2-NEXT:    movdqa %xmm6, %xmm7433; SSE2-NEXT:    pandn %xmm0, %xmm7434; SSE2-NEXT:    psrlw $2, %xmm0435; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]436; SSE2-NEXT:    pand %xmm5, %xmm6437; SSE2-NEXT:    pand %xmm0, %xmm6438; SSE2-NEXT:    por %xmm7, %xmm6439; SSE2-NEXT:    paddb %xmm3, %xmm3440; SSE2-NEXT:    pxor %xmm0, %xmm0441; SSE2-NEXT:    pcmpgtb %xmm3, %xmm0442; SSE2-NEXT:    movdqa %xmm0, %xmm7443; SSE2-NEXT:    pandn %xmm6, %xmm7444; SSE2-NEXT:    psrlw $1, %xmm6445; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]446; SSE2-NEXT:    pand %xmm3, %xmm0447; SSE2-NEXT:    pand %xmm6, %xmm0448; SSE2-NEXT:    por %xmm7, %xmm0449; SSE2-NEXT:    psllw $5, %xmm2450; SSE2-NEXT:    pxor %xmm6, %xmm6451; SSE2-NEXT:    pcmpgtb %xmm2, %xmm6452; SSE2-NEXT:    pandn %xmm4, %xmm6453; SSE2-NEXT:    paddb %xmm2, %xmm2454; SSE2-NEXT:    pxor %xmm4, %xmm4455; SSE2-NEXT:    pcmpgtb %xmm2, %xmm4456; SSE2-NEXT:    movdqa %xmm4, %xmm7457; SSE2-NEXT:    pandn %xmm6, %xmm7458; SSE2-NEXT:    psrlw $2, %xmm6459; SSE2-NEXT:    pand %xmm5, %xmm4460; SSE2-NEXT:    pand %xmm6, %xmm4461; SSE2-NEXT:    por %xmm7, %xmm4462; SSE2-NEXT:    paddb %xmm2, %xmm2463; SSE2-NEXT:    pcmpgtb %xmm2, %xmm1464; SSE2-NEXT:    movdqa %xmm1, %xmm2465; SSE2-NEXT:    pandn %xmm4, %xmm2466; SSE2-NEXT:    psrlw $1, %xmm4467; SSE2-NEXT:    pand %xmm3, %xmm1468; SSE2-NEXT:    pand %xmm4, %xmm1469; SSE2-NEXT:    por %xmm2, %xmm1470; SSE2-NEXT:    retq471;472; SSE41-LABEL: uniform_ashr_v32i8:473; SSE41:       # %bb.0:474; SSE41-NEXT:    movd {{.*#+}} xmm2 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0]475; SSE41-NEXT:    movdqa %xmm2, %xmm3476; SSE41-NEXT:    pshufb %xmm0, %xmm3477; SSE41-NEXT:    pshufb %xmm1, %xmm2478; SSE41-NEXT:    movdqa %xmm3, %xmm0479; SSE41-NEXT:    movdqa %xmm2, %xmm1480; SSE41-NEXT:    retq481;482; AVX1-LABEL: uniform_ashr_v32i8:483; AVX1:       # %bb.0:484; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1485; AVX1-NEXT:    vmovd {{.*#+}} xmm2 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0]486; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm1487; AVX1-NEXT:    vpshufb %xmm0, %xmm2, %xmm0488; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0489; AVX1-NEXT:    retq490;491; AVX2-LABEL: uniform_ashr_v32i8:492; AVX2:       # %bb.0:493; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0]494; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0495; AVX2-NEXT:    retq496;497; XOPAVX1-LABEL: uniform_ashr_v32i8:498; XOPAVX1:       # %bb.0:499; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1500; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2501; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm1502; XOPAVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6]503; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm3, %xmm1504; XOPAVX1-NEXT:    vpsubb %xmm0, %xmm2, %xmm0505; XOPAVX1-NEXT:    vpshlb %xmm0, %xmm3, %xmm0506; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0507; XOPAVX1-NEXT:    retq508;509; XOPAVX2-LABEL: uniform_ashr_v32i8:510; XOPAVX2:       # %bb.0:511; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0]512; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0513; XOPAVX2-NEXT:    retq514;515; AVX512DQ-LABEL: uniform_ashr_v32i8:516; AVX512DQ:       # %bb.0:517; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0]518; AVX512DQ-NEXT:    vpshufb %ymm0, %ymm1, %ymm0519; AVX512DQ-NEXT:    retq520;521; AVX512BW-LABEL: uniform_ashr_v32i8:522; AVX512BW:       # %bb.0:523; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0]524; AVX512BW-NEXT:    vpshufb %ymm0, %ymm1, %ymm0525; AVX512BW-NEXT:    retq526  %shift = ashr <32 x i8> <i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>, %a527  ret <32 x i8> %shift528}529 530define <64 x i8> @uniform_shl_v64i8(<64 x i8> %a) nounwind {531; SSE2-LABEL: uniform_shl_v64i8:532; SSE2:       # %bb.0:533; SSE2-NEXT:    movdqa %xmm1, %xmm4534; SSE2-NEXT:    movdqa %xmm0, %xmm1535; SSE2-NEXT:    psllw $5, %xmm1536; SSE2-NEXT:    pxor %xmm6, %xmm6537; SSE2-NEXT:    pxor %xmm9, %xmm9538; SSE2-NEXT:    pcmpgtb %xmm1, %xmm9539; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]540; SSE2-NEXT:    movdqa %xmm9, %xmm0541; SSE2-NEXT:    pandn %xmm5, %xmm0542; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112]543; SSE2-NEXT:    pand %xmm7, %xmm9544; SSE2-NEXT:    por %xmm0, %xmm9545; SSE2-NEXT:    paddb %xmm1, %xmm1546; SSE2-NEXT:    pxor %xmm0, %xmm0547; SSE2-NEXT:    pcmpgtb %xmm1, %xmm0548; SSE2-NEXT:    movdqa %xmm0, %xmm10549; SSE2-NEXT:    pandn %xmm9, %xmm10550; SSE2-NEXT:    psllw $2, %xmm9551; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]552; SSE2-NEXT:    pand %xmm8, %xmm0553; SSE2-NEXT:    pand %xmm9, %xmm0554; SSE2-NEXT:    por %xmm10, %xmm0555; SSE2-NEXT:    paddb %xmm1, %xmm1556; SSE2-NEXT:    pxor %xmm9, %xmm9557; SSE2-NEXT:    pcmpgtb %xmm1, %xmm9558; SSE2-NEXT:    movdqa %xmm9, %xmm1559; SSE2-NEXT:    pandn %xmm0, %xmm1560; SSE2-NEXT:    paddb %xmm0, %xmm0561; SSE2-NEXT:    pand %xmm9, %xmm0562; SSE2-NEXT:    por %xmm1, %xmm0563; SSE2-NEXT:    psllw $5, %xmm4564; SSE2-NEXT:    pxor %xmm9, %xmm9565; SSE2-NEXT:    pcmpgtb %xmm4, %xmm9566; SSE2-NEXT:    movdqa %xmm9, %xmm1567; SSE2-NEXT:    pandn %xmm5, %xmm1568; SSE2-NEXT:    pand %xmm7, %xmm9569; SSE2-NEXT:    por %xmm1, %xmm9570; SSE2-NEXT:    paddb %xmm4, %xmm4571; SSE2-NEXT:    pxor %xmm1, %xmm1572; SSE2-NEXT:    pcmpgtb %xmm4, %xmm1573; SSE2-NEXT:    movdqa %xmm1, %xmm10574; SSE2-NEXT:    pandn %xmm9, %xmm10575; SSE2-NEXT:    psllw $2, %xmm9576; SSE2-NEXT:    pand %xmm8, %xmm1577; SSE2-NEXT:    pand %xmm9, %xmm1578; SSE2-NEXT:    por %xmm10, %xmm1579; SSE2-NEXT:    paddb %xmm4, %xmm4580; SSE2-NEXT:    pxor %xmm9, %xmm9581; SSE2-NEXT:    pcmpgtb %xmm4, %xmm9582; SSE2-NEXT:    movdqa %xmm9, %xmm4583; SSE2-NEXT:    pandn %xmm1, %xmm4584; SSE2-NEXT:    paddb %xmm1, %xmm1585; SSE2-NEXT:    pand %xmm9, %xmm1586; SSE2-NEXT:    por %xmm4, %xmm1587; SSE2-NEXT:    psllw $5, %xmm2588; SSE2-NEXT:    pxor %xmm9, %xmm9589; SSE2-NEXT:    pcmpgtb %xmm2, %xmm9590; SSE2-NEXT:    movdqa %xmm9, %xmm4591; SSE2-NEXT:    pandn %xmm5, %xmm4592; SSE2-NEXT:    pand %xmm7, %xmm9593; SSE2-NEXT:    por %xmm4, %xmm9594; SSE2-NEXT:    paddb %xmm2, %xmm2595; SSE2-NEXT:    pxor %xmm4, %xmm4596; SSE2-NEXT:    pcmpgtb %xmm2, %xmm4597; SSE2-NEXT:    movdqa %xmm4, %xmm10598; SSE2-NEXT:    pandn %xmm9, %xmm10599; SSE2-NEXT:    psllw $2, %xmm9600; SSE2-NEXT:    pand %xmm8, %xmm4601; SSE2-NEXT:    pand %xmm9, %xmm4602; SSE2-NEXT:    por %xmm10, %xmm4603; SSE2-NEXT:    paddb %xmm2, %xmm2604; SSE2-NEXT:    pxor %xmm9, %xmm9605; SSE2-NEXT:    pcmpgtb %xmm2, %xmm9606; SSE2-NEXT:    movdqa %xmm9, %xmm2607; SSE2-NEXT:    pandn %xmm4, %xmm2608; SSE2-NEXT:    paddb %xmm4, %xmm4609; SSE2-NEXT:    pand %xmm9, %xmm4610; SSE2-NEXT:    por %xmm2, %xmm4611; SSE2-NEXT:    psllw $5, %xmm3612; SSE2-NEXT:    pxor %xmm2, %xmm2613; SSE2-NEXT:    pcmpgtb %xmm3, %xmm2614; SSE2-NEXT:    movdqa %xmm2, %xmm9615; SSE2-NEXT:    pandn %xmm5, %xmm9616; SSE2-NEXT:    pand %xmm7, %xmm2617; SSE2-NEXT:    por %xmm9, %xmm2618; SSE2-NEXT:    paddb %xmm3, %xmm3619; SSE2-NEXT:    pxor %xmm5, %xmm5620; SSE2-NEXT:    pcmpgtb %xmm3, %xmm5621; SSE2-NEXT:    movdqa %xmm5, %xmm7622; SSE2-NEXT:    pandn %xmm2, %xmm7623; SSE2-NEXT:    psllw $2, %xmm2624; SSE2-NEXT:    pand %xmm8, %xmm5625; SSE2-NEXT:    pand %xmm2, %xmm5626; SSE2-NEXT:    por %xmm7, %xmm5627; SSE2-NEXT:    paddb %xmm3, %xmm3628; SSE2-NEXT:    pcmpgtb %xmm3, %xmm6629; SSE2-NEXT:    movdqa %xmm6, %xmm2630; SSE2-NEXT:    pandn %xmm5, %xmm2631; SSE2-NEXT:    paddb %xmm5, %xmm5632; SSE2-NEXT:    pand %xmm6, %xmm5633; SSE2-NEXT:    por %xmm2, %xmm5634; SSE2-NEXT:    movdqa %xmm4, %xmm2635; SSE2-NEXT:    movdqa %xmm5, %xmm3636; SSE2-NEXT:    retq637;638; SSE41-LABEL: uniform_shl_v64i8:639; SSE41:       # %bb.0:640; SSE41-NEXT:    movq {{.*#+}} xmm4 = [7,14,28,56,112,224,192,128,0,0,0,0,0,0,0,0]641; SSE41-NEXT:    movdqa %xmm4, %xmm5642; SSE41-NEXT:    pshufb %xmm0, %xmm5643; SSE41-NEXT:    movdqa %xmm4, %xmm6644; SSE41-NEXT:    pshufb %xmm1, %xmm6645; SSE41-NEXT:    movdqa %xmm4, %xmm7646; SSE41-NEXT:    pshufb %xmm2, %xmm7647; SSE41-NEXT:    pshufb %xmm3, %xmm4648; SSE41-NEXT:    movdqa %xmm5, %xmm0649; SSE41-NEXT:    movdqa %xmm6, %xmm1650; SSE41-NEXT:    movdqa %xmm7, %xmm2651; SSE41-NEXT:    movdqa %xmm4, %xmm3652; SSE41-NEXT:    retq653;654; AVX1-LABEL: uniform_shl_v64i8:655; AVX1:       # %bb.0:656; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2657; AVX1-NEXT:    vmovq {{.*#+}} xmm3 = [7,14,28,56,112,224,192,128,0,0,0,0,0,0,0,0]658; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm2659; AVX1-NEXT:    vpshufb %xmm0, %xmm3, %xmm0660; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0661; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2662; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm2663; AVX1-NEXT:    vpshufb %xmm1, %xmm3, %xmm1664; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1665; AVX1-NEXT:    retq666;667; AVX2-LABEL: uniform_shl_v64i8:668; AVX2:       # %bb.0:669; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128]670; AVX2-NEXT:    vpshufb %ymm0, %ymm2, %ymm0671; AVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm1672; AVX2-NEXT:    retq673;674; XOPAVX1-LABEL: uniform_shl_v64i8:675; XOPAVX1:       # %bb.0:676; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2677; XOPAVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]678; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm3, %xmm2679; XOPAVX1-NEXT:    vpshlb %xmm0, %xmm3, %xmm0680; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0681; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2682; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm3, %xmm2683; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm3, %xmm1684; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1685; XOPAVX1-NEXT:    retq686;687; XOPAVX2-LABEL: uniform_shl_v64i8:688; XOPAVX2:       # %bb.0:689; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128]690; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm2, %ymm0691; XOPAVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm1692; XOPAVX2-NEXT:    retq693;694; AVX512DQ-LABEL: uniform_shl_v64i8:695; AVX512DQ:       # %bb.0:696; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1697; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128]698; AVX512DQ-NEXT:    vpshufb %ymm1, %ymm2, %ymm1699; AVX512DQ-NEXT:    vpshufb %ymm0, %ymm2, %ymm0700; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0701; AVX512DQ-NEXT:    retq702;703; AVX512BW-LABEL: uniform_shl_v64i8:704; AVX512BW:       # %bb.0:705; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} zmm1 = [7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128]706; AVX512BW-NEXT:    vpshufb %zmm0, %zmm1, %zmm0707; AVX512BW-NEXT:    retq708  %shift = shl <64 x i8> <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>, %a709  ret <64 x i8> %shift710}711 712define <64 x i8> @uniform_lshr_v64i8(<64 x i8> %a) nounwind {713; SSE2-LABEL: uniform_lshr_v64i8:714; SSE2:       # %bb.0:715; SSE2-NEXT:    movdqa %xmm3, %xmm4716; SSE2-NEXT:    movdqa %xmm1, %xmm5717; SSE2-NEXT:    movdqa %xmm0, %xmm1718; SSE2-NEXT:    psllw $5, %xmm1719; SSE2-NEXT:    pxor %xmm3, %xmm3720; SSE2-NEXT:    pxor %xmm0, %xmm0721; SSE2-NEXT:    pcmpgtb %xmm1, %xmm0722; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]723; SSE2-NEXT:    pandn %xmm6, %xmm0724; SSE2-NEXT:    paddb %xmm1, %xmm1725; SSE2-NEXT:    pxor %xmm8, %xmm8726; SSE2-NEXT:    pcmpgtb %xmm1, %xmm8727; SSE2-NEXT:    pandn %xmm0, %xmm8728; SSE2-NEXT:    paddb %xmm1, %xmm1729; SSE2-NEXT:    pxor %xmm0, %xmm0730; SSE2-NEXT:    pcmpgtb %xmm1, %xmm0731; SSE2-NEXT:    movdqa %xmm0, %xmm1732; SSE2-NEXT:    pandn %xmm8, %xmm1733; SSE2-NEXT:    psrlw $1, %xmm8734; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]735; SSE2-NEXT:    pand %xmm7, %xmm0736; SSE2-NEXT:    pand %xmm8, %xmm0737; SSE2-NEXT:    por %xmm1, %xmm0738; SSE2-NEXT:    psllw $5, %xmm5739; SSE2-NEXT:    pxor %xmm1, %xmm1740; SSE2-NEXT:    pcmpgtb %xmm5, %xmm1741; SSE2-NEXT:    pandn %xmm6, %xmm1742; SSE2-NEXT:    paddb %xmm5, %xmm5743; SSE2-NEXT:    pxor %xmm8, %xmm8744; SSE2-NEXT:    pcmpgtb %xmm5, %xmm8745; SSE2-NEXT:    pandn %xmm1, %xmm8746; SSE2-NEXT:    paddb %xmm5, %xmm5747; SSE2-NEXT:    pxor %xmm1, %xmm1748; SSE2-NEXT:    pcmpgtb %xmm5, %xmm1749; SSE2-NEXT:    movdqa %xmm1, %xmm5750; SSE2-NEXT:    pandn %xmm8, %xmm5751; SSE2-NEXT:    psrlw $1, %xmm8752; SSE2-NEXT:    pand %xmm7, %xmm1753; SSE2-NEXT:    pand %xmm8, %xmm1754; SSE2-NEXT:    por %xmm5, %xmm1755; SSE2-NEXT:    psllw $5, %xmm2756; SSE2-NEXT:    pxor %xmm5, %xmm5757; SSE2-NEXT:    pcmpgtb %xmm2, %xmm5758; SSE2-NEXT:    pandn %xmm6, %xmm5759; SSE2-NEXT:    paddb %xmm2, %xmm2760; SSE2-NEXT:    pxor %xmm8, %xmm8761; SSE2-NEXT:    pcmpgtb %xmm2, %xmm8762; SSE2-NEXT:    pandn %xmm5, %xmm8763; SSE2-NEXT:    paddb %xmm2, %xmm2764; SSE2-NEXT:    pxor %xmm5, %xmm5765; SSE2-NEXT:    pcmpgtb %xmm2, %xmm5766; SSE2-NEXT:    movdqa %xmm5, %xmm2767; SSE2-NEXT:    pandn %xmm8, %xmm2768; SSE2-NEXT:    psrlw $1, %xmm8769; SSE2-NEXT:    pand %xmm7, %xmm5770; SSE2-NEXT:    pand %xmm8, %xmm5771; SSE2-NEXT:    por %xmm2, %xmm5772; SSE2-NEXT:    psllw $5, %xmm4773; SSE2-NEXT:    pxor %xmm2, %xmm2774; SSE2-NEXT:    pcmpgtb %xmm4, %xmm2775; SSE2-NEXT:    pandn %xmm6, %xmm2776; SSE2-NEXT:    paddb %xmm4, %xmm4777; SSE2-NEXT:    pxor %xmm6, %xmm6778; SSE2-NEXT:    pcmpgtb %xmm4, %xmm6779; SSE2-NEXT:    pandn %xmm2, %xmm6780; SSE2-NEXT:    paddb %xmm4, %xmm4781; SSE2-NEXT:    pcmpgtb %xmm4, %xmm3782; SSE2-NEXT:    movdqa %xmm3, %xmm2783; SSE2-NEXT:    pandn %xmm6, %xmm2784; SSE2-NEXT:    psrlw $1, %xmm6785; SSE2-NEXT:    pand %xmm7, %xmm3786; SSE2-NEXT:    pand %xmm6, %xmm3787; SSE2-NEXT:    por %xmm2, %xmm3788; SSE2-NEXT:    movdqa %xmm5, %xmm2789; SSE2-NEXT:    retq790;791; SSE41-LABEL: uniform_lshr_v64i8:792; SSE41:       # %bb.0:793; SSE41-NEXT:    pmovsxbq {{.*#+}} xmm4 = [1,0]794; SSE41-NEXT:    movdqa %xmm4, %xmm5795; SSE41-NEXT:    pshufb %xmm0, %xmm5796; SSE41-NEXT:    movdqa %xmm4, %xmm6797; SSE41-NEXT:    pshufb %xmm1, %xmm6798; SSE41-NEXT:    movdqa %xmm4, %xmm7799; SSE41-NEXT:    pshufb %xmm2, %xmm7800; SSE41-NEXT:    pshufb %xmm3, %xmm4801; SSE41-NEXT:    movdqa %xmm5, %xmm0802; SSE41-NEXT:    movdqa %xmm6, %xmm1803; SSE41-NEXT:    movdqa %xmm7, %xmm2804; SSE41-NEXT:    movdqa %xmm4, %xmm3805; SSE41-NEXT:    retq806;807; AVX1-LABEL: uniform_lshr_v64i8:808; AVX1:       # %bb.0:809; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2810; AVX1-NEXT:    vpmovsxbq {{.*#+}} xmm3 = [1,0]811; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm2812; AVX1-NEXT:    vpshufb %xmm0, %xmm3, %xmm0813; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0814; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2815; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm2816; AVX1-NEXT:    vpshufb %xmm1, %xmm3, %xmm1817; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1818; AVX1-NEXT:    retq819;820; AVX2-LABEL: uniform_lshr_v64i8:821; AVX2:       # %bb.0:822; AVX2-NEXT:    vpmovsxbq {{.*#+}} ymm2 = [1,0,1,0]823; AVX2-NEXT:    vpshufb %ymm0, %ymm2, %ymm0824; AVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm1825; AVX2-NEXT:    retq826;827; XOPAVX1-LABEL: uniform_lshr_v64i8:828; XOPAVX1:       # %bb.0:829; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2830; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3831; XOPAVX1-NEXT:    vpsubb %xmm2, %xmm3, %xmm2832; XOPAVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]833; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm4, %xmm2834; XOPAVX1-NEXT:    vpsubb %xmm0, %xmm3, %xmm0835; XOPAVX1-NEXT:    vpshlb %xmm0, %xmm4, %xmm0836; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0837; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2838; XOPAVX1-NEXT:    vpsubb %xmm2, %xmm3, %xmm2839; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm4, %xmm2840; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm3, %xmm1841; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm4, %xmm1842; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1843; XOPAVX1-NEXT:    retq844;845; XOPAVX2-LABEL: uniform_lshr_v64i8:846; XOPAVX2:       # %bb.0:847; XOPAVX2-NEXT:    vpmovsxbq {{.*#+}} ymm2 = [1,0,1,0]848; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm2, %ymm0849; XOPAVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm1850; XOPAVX2-NEXT:    retq851;852; AVX512DQ-LABEL: uniform_lshr_v64i8:853; AVX512DQ:       # %bb.0:854; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1855; AVX512DQ-NEXT:    vpmovsxbq {{.*#+}} ymm2 = [1,0,1,0]856; AVX512DQ-NEXT:    vpshufb %ymm1, %ymm2, %ymm1857; AVX512DQ-NEXT:    vpshufb %ymm0, %ymm2, %ymm0858; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0859; AVX512DQ-NEXT:    retq860;861; AVX512BW-LABEL: uniform_lshr_v64i8:862; AVX512BW:       # %bb.0:863; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} zmm1 = [1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]864; AVX512BW-NEXT:    vpshufb %zmm0, %zmm1, %zmm0865; AVX512BW-NEXT:    retq866  %shift = lshr <64 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, %a867  ret <64 x i8> %shift868}869 870define <64 x i8> @uniform_ashr_v64i8(<64 x i8> %a) nounwind {871; SSE2-LABEL: uniform_ashr_v64i8:872; SSE2:       # %bb.0:873; SSE2-NEXT:    movdqa %xmm3, %xmm4874; SSE2-NEXT:    movdqa %xmm1, %xmm5875; SSE2-NEXT:    movdqa %xmm0, %xmm1876; SSE2-NEXT:    psllw $5, %xmm1877; SSE2-NEXT:    pxor %xmm3, %xmm3878; SSE2-NEXT:    pxor %xmm0, %xmm0879; SSE2-NEXT:    pcmpgtb %xmm1, %xmm0880; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]881; SSE2-NEXT:    pandn %xmm6, %xmm0882; SSE2-NEXT:    paddb %xmm1, %xmm1883; SSE2-NEXT:    pxor %xmm8, %xmm8884; SSE2-NEXT:    pcmpgtb %xmm1, %xmm8885; SSE2-NEXT:    pandn %xmm0, %xmm8886; SSE2-NEXT:    paddb %xmm1, %xmm1887; SSE2-NEXT:    pxor %xmm0, %xmm0888; SSE2-NEXT:    pcmpgtb %xmm1, %xmm0889; SSE2-NEXT:    movdqa %xmm0, %xmm1890; SSE2-NEXT:    pandn %xmm8, %xmm1891; SSE2-NEXT:    psrlw $1, %xmm8892; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]893; SSE2-NEXT:    pand %xmm7, %xmm0894; SSE2-NEXT:    pand %xmm8, %xmm0895; SSE2-NEXT:    por %xmm1, %xmm0896; SSE2-NEXT:    psllw $5, %xmm5897; SSE2-NEXT:    pxor %xmm1, %xmm1898; SSE2-NEXT:    pcmpgtb %xmm5, %xmm1899; SSE2-NEXT:    pandn %xmm6, %xmm1900; SSE2-NEXT:    paddb %xmm5, %xmm5901; SSE2-NEXT:    pxor %xmm8, %xmm8902; SSE2-NEXT:    pcmpgtb %xmm5, %xmm8903; SSE2-NEXT:    pandn %xmm1, %xmm8904; SSE2-NEXT:    paddb %xmm5, %xmm5905; SSE2-NEXT:    pxor %xmm1, %xmm1906; SSE2-NEXT:    pcmpgtb %xmm5, %xmm1907; SSE2-NEXT:    movdqa %xmm1, %xmm5908; SSE2-NEXT:    pandn %xmm8, %xmm5909; SSE2-NEXT:    psrlw $1, %xmm8910; SSE2-NEXT:    pand %xmm7, %xmm1911; SSE2-NEXT:    pand %xmm8, %xmm1912; SSE2-NEXT:    por %xmm5, %xmm1913; SSE2-NEXT:    psllw $5, %xmm2914; SSE2-NEXT:    pxor %xmm5, %xmm5915; SSE2-NEXT:    pcmpgtb %xmm2, %xmm5916; SSE2-NEXT:    pandn %xmm6, %xmm5917; SSE2-NEXT:    paddb %xmm2, %xmm2918; SSE2-NEXT:    pxor %xmm8, %xmm8919; SSE2-NEXT:    pcmpgtb %xmm2, %xmm8920; SSE2-NEXT:    pandn %xmm5, %xmm8921; SSE2-NEXT:    paddb %xmm2, %xmm2922; SSE2-NEXT:    pxor %xmm5, %xmm5923; SSE2-NEXT:    pcmpgtb %xmm2, %xmm5924; SSE2-NEXT:    movdqa %xmm5, %xmm2925; SSE2-NEXT:    pandn %xmm8, %xmm2926; SSE2-NEXT:    psrlw $1, %xmm8927; SSE2-NEXT:    pand %xmm7, %xmm5928; SSE2-NEXT:    pand %xmm8, %xmm5929; SSE2-NEXT:    por %xmm2, %xmm5930; SSE2-NEXT:    psllw $5, %xmm4931; SSE2-NEXT:    pxor %xmm2, %xmm2932; SSE2-NEXT:    pcmpgtb %xmm4, %xmm2933; SSE2-NEXT:    pandn %xmm6, %xmm2934; SSE2-NEXT:    paddb %xmm4, %xmm4935; SSE2-NEXT:    pxor %xmm6, %xmm6936; SSE2-NEXT:    pcmpgtb %xmm4, %xmm6937; SSE2-NEXT:    pandn %xmm2, %xmm6938; SSE2-NEXT:    paddb %xmm4, %xmm4939; SSE2-NEXT:    pcmpgtb %xmm4, %xmm3940; SSE2-NEXT:    movdqa %xmm3, %xmm2941; SSE2-NEXT:    pandn %xmm6, %xmm2942; SSE2-NEXT:    psrlw $1, %xmm6943; SSE2-NEXT:    pand %xmm7, %xmm3944; SSE2-NEXT:    pand %xmm6, %xmm3945; SSE2-NEXT:    por %xmm2, %xmm3946; SSE2-NEXT:    movdqa %xmm5, %xmm2947; SSE2-NEXT:    retq948;949; SSE41-LABEL: uniform_ashr_v64i8:950; SSE41:       # %bb.0:951; SSE41-NEXT:    movd {{.*#+}} xmm4 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]952; SSE41-NEXT:    movdqa %xmm4, %xmm5953; SSE41-NEXT:    pshufb %xmm0, %xmm5954; SSE41-NEXT:    movdqa %xmm4, %xmm6955; SSE41-NEXT:    pshufb %xmm1, %xmm6956; SSE41-NEXT:    movdqa %xmm4, %xmm7957; SSE41-NEXT:    pshufb %xmm2, %xmm7958; SSE41-NEXT:    pshufb %xmm3, %xmm4959; SSE41-NEXT:    movdqa %xmm5, %xmm0960; SSE41-NEXT:    movdqa %xmm6, %xmm1961; SSE41-NEXT:    movdqa %xmm7, %xmm2962; SSE41-NEXT:    movdqa %xmm4, %xmm3963; SSE41-NEXT:    retq964;965; AVX1-LABEL: uniform_ashr_v64i8:966; AVX1:       # %bb.0:967; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2968; AVX1-NEXT:    vmovd {{.*#+}} xmm3 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]969; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm2970; AVX1-NEXT:    vpshufb %xmm0, %xmm3, %xmm0971; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0972; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2973; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm2974; AVX1-NEXT:    vpshufb %xmm1, %xmm3, %xmm1975; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1976; AVX1-NEXT:    retq977;978; AVX2-LABEL: uniform_ashr_v64i8:979; AVX2:       # %bb.0:980; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0]981; AVX2-NEXT:    vpshufb %ymm0, %ymm2, %ymm0982; AVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm1983; AVX2-NEXT:    retq984;985; XOPAVX1-LABEL: uniform_ashr_v64i8:986; XOPAVX1:       # %bb.0:987; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2988; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3989; XOPAVX1-NEXT:    vpsubb %xmm2, %xmm3, %xmm2990; XOPAVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]991; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm4, %xmm2992; XOPAVX1-NEXT:    vpsubb %xmm0, %xmm3, %xmm0993; XOPAVX1-NEXT:    vpshlb %xmm0, %xmm4, %xmm0994; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0995; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2996; XOPAVX1-NEXT:    vpsubb %xmm2, %xmm3, %xmm2997; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm4, %xmm2998; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm3, %xmm1999; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm4, %xmm11000; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm11001; XOPAVX1-NEXT:    retq1002;1003; XOPAVX2-LABEL: uniform_ashr_v64i8:1004; XOPAVX2:       # %bb.0:1005; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0]1006; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm2, %ymm01007; XOPAVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm11008; XOPAVX2-NEXT:    retq1009;1010; AVX512DQ-LABEL: uniform_ashr_v64i8:1011; AVX512DQ:       # %bb.0:1012; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm11013; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0]1014; AVX512DQ-NEXT:    vpshufb %ymm1, %ymm2, %ymm11015; AVX512DQ-NEXT:    vpshufb %ymm0, %ymm2, %ymm01016; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm01017; AVX512DQ-NEXT:    retq1018;1019; AVX512BW-LABEL: uniform_ashr_v64i8:1020; AVX512BW:       # %bb.0:1021; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} zmm1 = [2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0]1022; AVX512BW-NEXT:    vpshufb %zmm0, %zmm1, %zmm01023; AVX512BW-NEXT:    retq1024  %shift = ashr <64 x i8> <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>, %a1025  ret <64 x i8> %shift1026}1027 1028; Test where each 128-bit lane has a different value1029 1030define <32 x i8> @perlane_shl_v32i8(<32 x i8> %a) nounwind {1031; SSE2-LABEL: perlane_shl_v32i8:1032; SSE2:       # %bb.0:1033; SSE2-NEXT:    movdqa %xmm1, %xmm21034; SSE2-NEXT:    psllw $5, %xmm21035; SSE2-NEXT:    pxor %xmm3, %xmm31036; SSE2-NEXT:    pxor %xmm5, %xmm51037; SSE2-NEXT:    pcmpgtb %xmm2, %xmm51038; SSE2-NEXT:    movdqa %xmm5, %xmm11039; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11040; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm51041; SSE2-NEXT:    por %xmm1, %xmm51042; SSE2-NEXT:    paddb %xmm2, %xmm21043; SSE2-NEXT:    pxor %xmm1, %xmm11044; SSE2-NEXT:    pcmpgtb %xmm2, %xmm11045; SSE2-NEXT:    movdqa %xmm1, %xmm61046; SSE2-NEXT:    pandn %xmm5, %xmm61047; SSE2-NEXT:    psllw $2, %xmm51048; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]1049; SSE2-NEXT:    pand %xmm4, %xmm11050; SSE2-NEXT:    pand %xmm5, %xmm11051; SSE2-NEXT:    por %xmm6, %xmm11052; SSE2-NEXT:    paddb %xmm2, %xmm21053; SSE2-NEXT:    pxor %xmm5, %xmm51054; SSE2-NEXT:    pcmpgtb %xmm2, %xmm51055; SSE2-NEXT:    movdqa %xmm5, %xmm21056; SSE2-NEXT:    pandn %xmm1, %xmm21057; SSE2-NEXT:    paddb %xmm1, %xmm11058; SSE2-NEXT:    pand %xmm5, %xmm11059; SSE2-NEXT:    por %xmm2, %xmm11060; SSE2-NEXT:    psllw $5, %xmm01061; SSE2-NEXT:    pxor %xmm2, %xmm21062; SSE2-NEXT:    pcmpgtb %xmm0, %xmm21063; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]1064; SSE2-NEXT:    pand %xmm2, %xmm51065; SSE2-NEXT:    paddb %xmm2, %xmm51066; SSE2-NEXT:    pcmpeqd %xmm2, %xmm21067; SSE2-NEXT:    psubb %xmm2, %xmm51068; SSE2-NEXT:    paddb %xmm0, %xmm01069; SSE2-NEXT:    pxor %xmm2, %xmm21070; SSE2-NEXT:    pcmpgtb %xmm0, %xmm21071; SSE2-NEXT:    movdqa %xmm2, %xmm61072; SSE2-NEXT:    pandn %xmm5, %xmm61073; SSE2-NEXT:    psllw $2, %xmm51074; SSE2-NEXT:    pand %xmm4, %xmm21075; SSE2-NEXT:    pand %xmm5, %xmm21076; SSE2-NEXT:    por %xmm6, %xmm21077; SSE2-NEXT:    paddb %xmm0, %xmm01078; SSE2-NEXT:    pcmpgtb %xmm0, %xmm31079; SSE2-NEXT:    movdqa %xmm3, %xmm01080; SSE2-NEXT:    pandn %xmm2, %xmm01081; SSE2-NEXT:    paddb %xmm2, %xmm21082; SSE2-NEXT:    pand %xmm3, %xmm21083; SSE2-NEXT:    por %xmm0, %xmm21084; SSE2-NEXT:    movdqa %xmm2, %xmm01085; SSE2-NEXT:    retq1086;1087; SSE41-LABEL: perlane_shl_v32i8:1088; SSE41:       # %bb.0:1089; SSE41-NEXT:    movq {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]1090; SSE41-NEXT:    pshufb %xmm0, %xmm21091; SSE41-NEXT:    movq {{.*#+}} xmm3 = [2,4,8,16,32,64,128,0,0,0,0,0,0,0,0,0]1092; SSE41-NEXT:    pshufb %xmm1, %xmm31093; SSE41-NEXT:    movdqa %xmm2, %xmm01094; SSE41-NEXT:    movdqa %xmm3, %xmm11095; SSE41-NEXT:    retq1096;1097; AVX1-LABEL: perlane_shl_v32i8:1098; AVX1:       # %bb.0:1099; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11100; AVX1-NEXT:    vmovq {{.*#+}} xmm2 = [2,4,8,16,32,64,128,0,0,0,0,0,0,0,0,0]1101; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm11102; AVX1-NEXT:    vmovq {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]1103; AVX1-NEXT:    vpshufb %xmm0, %xmm2, %xmm01104; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01105; AVX1-NEXT:    retq1106;1107; AVX2-LABEL: perlane_shl_v32i8:1108; AVX2:       # %bb.0:1109; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]1110; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm01111; AVX2-NEXT:    retq1112;1113; XOPAVX1-LABEL: perlane_shl_v32i8:1114; XOPAVX1:       # %bb.0:1115; XOPAVX1-NEXT:    vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11116; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01117; XOPAVX1-NEXT:    vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01118; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01119; XOPAVX1-NEXT:    retq1120;1121; XOPAVX2-LABEL: perlane_shl_v32i8:1122; XOPAVX2:       # %bb.0:1123; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]1124; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm01125; XOPAVX2-NEXT:    retq1126;1127; AVX512DQ-LABEL: perlane_shl_v32i8:1128; AVX512DQ:       # %bb.0:1129; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]1130; AVX512DQ-NEXT:    vpshufb %ymm0, %ymm1, %ymm01131; AVX512DQ-NEXT:    retq1132;1133; AVX512BW-LABEL: perlane_shl_v32i8:1134; AVX512BW:       # %bb.0:1135; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]1136; AVX512BW-NEXT:    vpshufb %ymm0, %ymm1, %ymm01137; AVX512BW-NEXT:    retq1138  %shift = shl <32 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>, %a1139  ret <32 x i8> %shift1140}1141 1142define <32 x i8> @perlane_lshr_v32i8(<32 x i8> %a) nounwind {1143; SSE2-LABEL: perlane_lshr_v32i8:1144; SSE2:       # %bb.0:1145; SSE2-NEXT:    psllw $5, %xmm11146; SSE2-NEXT:    pxor %xmm3, %xmm31147; SSE2-NEXT:    pcmpgtb %xmm1, %xmm31148; SSE2-NEXT:    movdqa %xmm1, %xmm41149; SSE2-NEXT:    paddb %xmm1, %xmm41150; SSE2-NEXT:    pxor %xmm2, %xmm21151; SSE2-NEXT:    pxor %xmm1, %xmm11152; SSE2-NEXT:    pcmpgtb %xmm4, %xmm11153; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31154; SSE2-NEXT:    movdqa %xmm1, %xmm51155; SSE2-NEXT:    pandn %xmm3, %xmm51156; SSE2-NEXT:    psrlw $2, %xmm31157; SSE2-NEXT:    pand %xmm1, %xmm31158; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31159; SSE2-NEXT:    por %xmm5, %xmm31160; SSE2-NEXT:    paddb %xmm4, %xmm41161; SSE2-NEXT:    pxor %xmm1, %xmm11162; SSE2-NEXT:    pcmpgtb %xmm4, %xmm11163; SSE2-NEXT:    movdqa %xmm1, %xmm41164; SSE2-NEXT:    pandn %xmm3, %xmm41165; SSE2-NEXT:    psrlw $1, %xmm31166; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]1167; SSE2-NEXT:    pand %xmm5, %xmm11168; SSE2-NEXT:    pand %xmm3, %xmm11169; SSE2-NEXT:    por %xmm4, %xmm11170; SSE2-NEXT:    psllw $5, %xmm01171; SSE2-NEXT:    pxor %xmm3, %xmm31172; SSE2-NEXT:    pcmpgtb %xmm0, %xmm31173; SSE2-NEXT:    paddb %xmm0, %xmm01174; SSE2-NEXT:    pxor %xmm4, %xmm41175; SSE2-NEXT:    pcmpgtb %xmm0, %xmm41176; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31177; SSE2-NEXT:    pandn %xmm3, %xmm41178; SSE2-NEXT:    paddb %xmm0, %xmm01179; SSE2-NEXT:    pcmpgtb %xmm0, %xmm21180; SSE2-NEXT:    movdqa %xmm2, %xmm01181; SSE2-NEXT:    pandn %xmm4, %xmm01182; SSE2-NEXT:    psrlw $1, %xmm41183; SSE2-NEXT:    pand %xmm5, %xmm21184; SSE2-NEXT:    pand %xmm4, %xmm21185; SSE2-NEXT:    por %xmm0, %xmm21186; SSE2-NEXT:    movdqa %xmm2, %xmm01187; SSE2-NEXT:    retq1188;1189; SSE41-LABEL: perlane_lshr_v32i8:1190; SSE41:       # %bb.0:1191; SSE41-NEXT:    movd {{.*#+}} xmm2 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]1192; SSE41-NEXT:    pshufb %xmm0, %xmm21193; SSE41-NEXT:    movd {{.*#+}} xmm3 = [4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]1194; SSE41-NEXT:    pshufb %xmm1, %xmm31195; SSE41-NEXT:    movdqa %xmm2, %xmm01196; SSE41-NEXT:    movdqa %xmm3, %xmm11197; SSE41-NEXT:    retq1198;1199; AVX1-LABEL: perlane_lshr_v32i8:1200; AVX1:       # %bb.0:1201; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11202; AVX1-NEXT:    vmovd {{.*#+}} xmm2 = [4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]1203; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm11204; AVX1-NEXT:    vmovd {{.*#+}} xmm2 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]1205; AVX1-NEXT:    vpshufb %xmm0, %xmm2, %xmm01206; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01207; AVX1-NEXT:    retq1208;1209; AVX2-LABEL: perlane_lshr_v32i8:1210; AVX2:       # %bb.0:1211; AVX2-NEXT:    vpmovsxdq {{.*#+}} ymm1 = [259,0,66052,0]1212; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm01213; AVX2-NEXT:    retq1214;1215; XOPAVX1-LABEL: perlane_lshr_v32i8:1216; XOPAVX1:       # %bb.0:1217; XOPAVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm11218; XOPAVX1-NEXT:    vpsubb %xmm0, %xmm1, %xmm21219; XOPAVX1-NEXT:    vpshlb %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21220; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01221; XOPAVX1-NEXT:    vpsubb %xmm0, %xmm1, %xmm01222; XOPAVX1-NEXT:    vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01223; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm01224; XOPAVX1-NEXT:    retq1225;1226; XOPAVX2-LABEL: perlane_lshr_v32i8:1227; XOPAVX2:       # %bb.0:1228; XOPAVX2-NEXT:    vpmovsxdq {{.*#+}} ymm1 = [259,0,66052,0]1229; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm01230; XOPAVX2-NEXT:    retq1231;1232; AVX512DQ-LABEL: perlane_lshr_v32i8:1233; AVX512DQ:       # %bb.0:1234; AVX512DQ-NEXT:    vpmovsxdq {{.*#+}} ymm1 = [259,0,66052,0]1235; AVX512DQ-NEXT:    vpshufb %ymm0, %ymm1, %ymm01236; AVX512DQ-NEXT:    retq1237;1238; AVX512BW-LABEL: perlane_lshr_v32i8:1239; AVX512BW:       # %bb.0:1240; AVX512BW-NEXT:    vpmovsxdq {{.*#+}} ymm1 = [259,0,66052,0]1241; AVX512BW-NEXT:    vpshufb %ymm0, %ymm1, %ymm01242; AVX512BW-NEXT:    retq1243  %shift = lshr <32 x i8> <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>, %a1244  ret <32 x i8> %shift1245}1246 1247define <32 x i8> @perlane_ashr_v32i8(<32 x i8> %a) nounwind {1248; SSE2-LABEL: perlane_ashr_v32i8:1249; SSE2:       # %bb.0:1250; SSE2-NEXT:    psllw $5, %xmm01251; SSE2-NEXT:    pxor %xmm4, %xmm41252; SSE2-NEXT:    pcmpgtb %xmm0, %xmm41253; SSE2-NEXT:    movdqa %xmm0, %xmm51254; SSE2-NEXT:    paddb %xmm0, %xmm51255; SSE2-NEXT:    pxor %xmm2, %xmm21256; SSE2-NEXT:    pxor %xmm6, %xmm61257; SSE2-NEXT:    pcmpgtb %xmm5, %xmm61258; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm41259; SSE2-NEXT:    movdqa %xmm6, %xmm01260; SSE2-NEXT:    pandn %xmm4, %xmm01261; SSE2-NEXT:    psrlw $2, %xmm41262; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]1263; SSE2-NEXT:    pand %xmm3, %xmm61264; SSE2-NEXT:    pand %xmm4, %xmm61265; SSE2-NEXT:    por %xmm0, %xmm61266; SSE2-NEXT:    paddb %xmm5, %xmm51267; SSE2-NEXT:    pxor %xmm0, %xmm01268; SSE2-NEXT:    pcmpgtb %xmm5, %xmm01269; SSE2-NEXT:    movdqa %xmm0, %xmm51270; SSE2-NEXT:    pandn %xmm6, %xmm51271; SSE2-NEXT:    psrlw $1, %xmm61272; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]1273; SSE2-NEXT:    pand %xmm4, %xmm01274; SSE2-NEXT:    pand %xmm6, %xmm01275; SSE2-NEXT:    por %xmm5, %xmm01276; SSE2-NEXT:    psllw $5, %xmm11277; SSE2-NEXT:    pxor %xmm5, %xmm51278; SSE2-NEXT:    pcmpgtb %xmm1, %xmm51279; SSE2-NEXT:    paddb %xmm1, %xmm11280; SSE2-NEXT:    pxor %xmm6, %xmm61281; SSE2-NEXT:    pcmpgtb %xmm1, %xmm61282; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm51283; SSE2-NEXT:    movdqa %xmm6, %xmm71284; SSE2-NEXT:    pandn %xmm5, %xmm71285; SSE2-NEXT:    psrlw $2, %xmm51286; SSE2-NEXT:    pand %xmm3, %xmm61287; SSE2-NEXT:    pand %xmm5, %xmm61288; SSE2-NEXT:    por %xmm7, %xmm61289; SSE2-NEXT:    paddb %xmm1, %xmm11290; SSE2-NEXT:    pcmpgtb %xmm1, %xmm21291; SSE2-NEXT:    movdqa %xmm2, %xmm11292; SSE2-NEXT:    pandn %xmm6, %xmm11293; SSE2-NEXT:    psrlw $1, %xmm61294; SSE2-NEXT:    pand %xmm4, %xmm21295; SSE2-NEXT:    pand %xmm6, %xmm21296; SSE2-NEXT:    por %xmm1, %xmm21297; SSE2-NEXT:    movdqa %xmm2, %xmm11298; SSE2-NEXT:    retq1299;1300; SSE41-LABEL: perlane_ashr_v32i8:1301; SSE41:       # %bb.0:1302; SSE41-NEXT:    movd {{.*#+}} xmm2 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]1303; SSE41-NEXT:    pshufb %xmm0, %xmm21304; SSE41-NEXT:    movd {{.*#+}} xmm3 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0]1305; SSE41-NEXT:    pshufb %xmm1, %xmm31306; SSE41-NEXT:    movdqa %xmm2, %xmm01307; SSE41-NEXT:    movdqa %xmm3, %xmm11308; SSE41-NEXT:    retq1309;1310; AVX1-LABEL: perlane_ashr_v32i8:1311; AVX1:       # %bb.0:1312; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11313; AVX1-NEXT:    vmovd {{.*#+}} xmm2 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0]1314; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm11315; AVX1-NEXT:    vmovd {{.*#+}} xmm2 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]1316; AVX1-NEXT:    vpshufb %xmm0, %xmm2, %xmm01317; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01318; AVX1-NEXT:    retq1319;1320; AVX2-LABEL: perlane_ashr_v32i8:1321; AVX2:       # %bb.0:1322; AVX2-NEXT:    vpmovsxdq {{.*#+}} ymm1 = [66053,0,66310,0]1323; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm01324; AVX2-NEXT:    retq1325;1326; XOPAVX1-LABEL: perlane_ashr_v32i8:1327; XOPAVX1:       # %bb.0:1328; XOPAVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm11329; XOPAVX1-NEXT:    vpsubb %xmm0, %xmm1, %xmm21330; XOPAVX1-NEXT:    vpshlb %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21331; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01332; XOPAVX1-NEXT:    vpsubb %xmm0, %xmm1, %xmm01333; XOPAVX1-NEXT:    vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01334; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm01335; XOPAVX1-NEXT:    retq1336;1337; XOPAVX2-LABEL: perlane_ashr_v32i8:1338; XOPAVX2:       # %bb.0:1339; XOPAVX2-NEXT:    vpmovsxdq {{.*#+}} ymm1 = [66053,0,66310,0]1340; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm01341; XOPAVX2-NEXT:    retq1342;1343; AVX512DQ-LABEL: perlane_ashr_v32i8:1344; AVX512DQ:       # %bb.0:1345; AVX512DQ-NEXT:    vpmovsxdq {{.*#+}} ymm1 = [66053,0,66310,0]1346; AVX512DQ-NEXT:    vpshufb %ymm0, %ymm1, %ymm01347; AVX512DQ-NEXT:    retq1348;1349; AVX512BW-LABEL: perlane_ashr_v32i8:1350; AVX512BW:       # %bb.0:1351; AVX512BW-NEXT:    vpmovsxdq {{.*#+}} ymm1 = [66053,0,66310,0]1352; AVX512BW-NEXT:    vpshufb %ymm0, %ymm1, %ymm01353; AVX512BW-NEXT:    retq1354  %shift = ashr <32 x i8> <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>, %a1355  ret <32 x i8> %shift1356}1357 1358define <64 x i8> @perlane_shl_v64i8(<64 x i8> %a) nounwind {1359; SSE2-LABEL: perlane_shl_v64i8:1360; SSE2:       # %bb.0:1361; SSE2-NEXT:    movdqa %xmm0, %xmm11362; SSE2-NEXT:    psllw $5, %xmm11363; SSE2-NEXT:    pxor %xmm5, %xmm51364; SSE2-NEXT:    pxor %xmm4, %xmm41365; SSE2-NEXT:    pcmpgtb %xmm1, %xmm41366; SSE2-NEXT:    movdqa %xmm4, %xmm01367; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01368; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm41369; SSE2-NEXT:    por %xmm0, %xmm41370; SSE2-NEXT:    paddb %xmm1, %xmm11371; SSE2-NEXT:    pxor %xmm0, %xmm01372; SSE2-NEXT:    pcmpgtb %xmm1, %xmm01373; SSE2-NEXT:    movdqa %xmm0, %xmm71374; SSE2-NEXT:    pandn %xmm4, %xmm71375; SSE2-NEXT:    psllw $2, %xmm41376; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]1377; SSE2-NEXT:    pand %xmm6, %xmm01378; SSE2-NEXT:    pand %xmm4, %xmm01379; SSE2-NEXT:    por %xmm7, %xmm01380; SSE2-NEXT:    paddb %xmm1, %xmm11381; SSE2-NEXT:    pxor %xmm4, %xmm41382; SSE2-NEXT:    pcmpgtb %xmm1, %xmm41383; SSE2-NEXT:    movdqa %xmm4, %xmm11384; SSE2-NEXT:    pandn %xmm0, %xmm11385; SSE2-NEXT:    paddb %xmm0, %xmm01386; SSE2-NEXT:    pand %xmm4, %xmm01387; SSE2-NEXT:    por %xmm1, %xmm01388; SSE2-NEXT:    psllw $5, %xmm31389; SSE2-NEXT:    pxor %xmm1, %xmm11390; SSE2-NEXT:    pcmpgtb %xmm3, %xmm11391; SSE2-NEXT:    movdqa %xmm1, %xmm41392; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm41393; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11394; SSE2-NEXT:    por %xmm4, %xmm11395; SSE2-NEXT:    paddb %xmm3, %xmm31396; SSE2-NEXT:    pxor %xmm4, %xmm41397; SSE2-NEXT:    pcmpgtb %xmm3, %xmm41398; SSE2-NEXT:    movdqa %xmm4, %xmm71399; SSE2-NEXT:    pandn %xmm1, %xmm71400; SSE2-NEXT:    psllw $2, %xmm11401; SSE2-NEXT:    pand %xmm6, %xmm41402; SSE2-NEXT:    pand %xmm1, %xmm41403; SSE2-NEXT:    por %xmm7, %xmm41404; SSE2-NEXT:    paddb %xmm3, %xmm31405; SSE2-NEXT:    pxor %xmm1, %xmm11406; SSE2-NEXT:    pcmpgtb %xmm3, %xmm11407; SSE2-NEXT:    movdqa %xmm1, %xmm31408; SSE2-NEXT:    pandn %xmm4, %xmm31409; SSE2-NEXT:    paddb %xmm4, %xmm41410; SSE2-NEXT:    pand %xmm1, %xmm41411; SSE2-NEXT:    por %xmm3, %xmm41412; SSE2-NEXT:    psllw $5, %xmm21413; SSE2-NEXT:    pxor %xmm1, %xmm11414; SSE2-NEXT:    pcmpgtb %xmm2, %xmm11415; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]1416; SSE2-NEXT:    pand %xmm1, %xmm71417; SSE2-NEXT:    paddb %xmm1, %xmm71418; SSE2-NEXT:    pcmpeqd %xmm1, %xmm11419; SSE2-NEXT:    psubb %xmm1, %xmm71420; SSE2-NEXT:    paddb %xmm2, %xmm21421; SSE2-NEXT:    pxor %xmm3, %xmm31422; SSE2-NEXT:    pcmpgtb %xmm2, %xmm31423; SSE2-NEXT:    movdqa %xmm3, %xmm11424; SSE2-NEXT:    pandn %xmm7, %xmm11425; SSE2-NEXT:    psllw $2, %xmm71426; SSE2-NEXT:    pand %xmm6, %xmm31427; SSE2-NEXT:    pand %xmm7, %xmm31428; SSE2-NEXT:    por %xmm1, %xmm31429; SSE2-NEXT:    paddb %xmm2, %xmm21430; SSE2-NEXT:    pcmpgtb %xmm2, %xmm51431; SSE2-NEXT:    movdqa %xmm5, %xmm11432; SSE2-NEXT:    pandn %xmm3, %xmm11433; SSE2-NEXT:    paddb %xmm3, %xmm31434; SSE2-NEXT:    pand %xmm5, %xmm31435; SSE2-NEXT:    por %xmm1, %xmm31436; SSE2-NEXT:    pxor %xmm1, %xmm11437; SSE2-NEXT:    movdqa %xmm3, %xmm21438; SSE2-NEXT:    movdqa %xmm4, %xmm31439; SSE2-NEXT:    retq1440;1441; SSE41-LABEL: perlane_shl_v64i8:1442; SSE41:       # %bb.0:1443; SSE41-NEXT:    movq {{.*#+}} xmm4 = [7,14,28,56,112,224,192,128,0,0,0,0,0,0,0,0]1444; SSE41-NEXT:    pshufb %xmm0, %xmm41445; SSE41-NEXT:    movq {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]1446; SSE41-NEXT:    pshufb %xmm2, %xmm51447; SSE41-NEXT:    movq {{.*#+}} xmm6 = [2,4,8,16,32,64,128,0,0,0,0,0,0,0,0,0]1448; SSE41-NEXT:    pshufb %xmm3, %xmm61449; SSE41-NEXT:    xorps %xmm1, %xmm11450; SSE41-NEXT:    movdqa %xmm4, %xmm01451; SSE41-NEXT:    movdqa %xmm5, %xmm21452; SSE41-NEXT:    movdqa %xmm6, %xmm31453; SSE41-NEXT:    retq1454;1455; AVX1-LABEL: perlane_shl_v64i8:1456; AVX1:       # %bb.0:1457; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm21458; AVX1-NEXT:    vmovq {{.*#+}} xmm3 = [2,4,8,16,32,64,128,0,0,0,0,0,0,0,0,0]1459; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm21460; AVX1-NEXT:    vmovq {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]1461; AVX1-NEXT:    vpshufb %xmm1, %xmm3, %xmm11462; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm11463; AVX1-NEXT:    vmovq {{.*#+}} xmm2 = [7,14,28,56,112,224,192,128,0,0,0,0,0,0,0,0]1464; AVX1-NEXT:    vpshufb %xmm0, %xmm2, %xmm01465; AVX1-NEXT:    retq1466;1467; AVX2-LABEL: perlane_shl_v64i8:1468; AVX2:       # %bb.0:1469; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,u,u,u,u,u,u,u,u,0,0,0,0,0,0,0,0,u,u,u,u,u,u,u,u]1470; AVX2-NEXT:    vpshufb %ymm0, %ymm2, %ymm01471; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]1472; AVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm11473; AVX2-NEXT:    retq1474;1475; XOPAVX1-LABEL: perlane_shl_v64i8:1476; XOPAVX1:       # %bb.0:1477; XOPAVX1-NEXT:    vpshlb %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21478; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm11479; XOPAVX1-NEXT:    vpshlb %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11480; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm11481; XOPAVX1-NEXT:    vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01482; XOPAVX1-NEXT:    retq1483;1484; XOPAVX2-LABEL: perlane_shl_v64i8:1485; XOPAVX2:       # %bb.0:1486; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,u,u,u,u,u,u,u,u,0,0,0,0,0,0,0,0,u,u,u,u,u,u,u,u]1487; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm2, %ymm01488; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]1489; XOPAVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm11490; XOPAVX2-NEXT:    retq1491;1492; AVX512DQ-LABEL: perlane_shl_v64i8:1493; AVX512DQ:       # %bb.0:1494; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm11495; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]1496; AVX512DQ-NEXT:    vpshufb %ymm1, %ymm2, %ymm11497; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,u,u,u,u,u,u,u,u,0,0,0,0,0,0,0,0,u,u,u,u,u,u,u,u]1498; AVX512DQ-NEXT:    vpshufb %ymm0, %ymm2, %ymm01499; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm01500; AVX512DQ-NEXT:    retq1501;1502; AVX512BW-LABEL: perlane_shl_v64i8:1503; AVX512BW:       # %bb.0:1504; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [7,14,28,56,112,224,192,128,u,u,u,u,u,u,u,u,0,0,0,0,0,0,0,0,u,u,u,u,u,u,u,u,1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]1505; AVX512BW-NEXT:    vpshufb %zmm0, %zmm1, %zmm01506; AVX512BW-NEXT:    retq1507  %shift = shl <64 x i8> <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>, %a1508  ret <64 x i8> %shift1509}1510 1511define <64 x i8> @perlane_lshr_v64i8(<64 x i8> %a) nounwind {1512; SSE2-LABEL: perlane_lshr_v64i8:1513; SSE2:       # %bb.0:1514; SSE2-NEXT:    movdqa %xmm2, %xmm51515; SSE2-NEXT:    psllw $5, %xmm11516; SSE2-NEXT:    pxor %xmm2, %xmm21517; SSE2-NEXT:    pcmpgtb %xmm1, %xmm21518; SSE2-NEXT:    movdqa %xmm1, %xmm61519; SSE2-NEXT:    paddb %xmm1, %xmm61520; SSE2-NEXT:    pxor %xmm4, %xmm41521; SSE2-NEXT:    pxor %xmm8, %xmm81522; SSE2-NEXT:    pcmpgtb %xmm6, %xmm81523; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21524; SSE2-NEXT:    movdqa %xmm8, %xmm11525; SSE2-NEXT:    pandn %xmm2, %xmm11526; SSE2-NEXT:    psrlw $2, %xmm21527; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]1528; SSE2-NEXT:    pand %xmm7, %xmm81529; SSE2-NEXT:    pand %xmm2, %xmm81530; SSE2-NEXT:    por %xmm1, %xmm81531; SSE2-NEXT:    paddb %xmm6, %xmm61532; SSE2-NEXT:    pxor %xmm1, %xmm11533; SSE2-NEXT:    pcmpgtb %xmm6, %xmm11534; SSE2-NEXT:    movdqa %xmm1, %xmm21535; SSE2-NEXT:    pandn %xmm8, %xmm21536; SSE2-NEXT:    psrlw $1, %xmm81537; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]1538; SSE2-NEXT:    pand %xmm6, %xmm11539; SSE2-NEXT:    pand %xmm8, %xmm11540; SSE2-NEXT:    por %xmm2, %xmm11541; SSE2-NEXT:    psllw $5, %xmm51542; SSE2-NEXT:    pxor %xmm2, %xmm21543; SSE2-NEXT:    pcmpgtb %xmm5, %xmm21544; SSE2-NEXT:    paddb %xmm5, %xmm51545; SSE2-NEXT:    pxor %xmm8, %xmm81546; SSE2-NEXT:    pcmpgtb %xmm5, %xmm81547; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21548; SSE2-NEXT:    movdqa %xmm8, %xmm91549; SSE2-NEXT:    pandn %xmm2, %xmm91550; SSE2-NEXT:    psrlw $2, %xmm21551; SSE2-NEXT:    pand %xmm7, %xmm81552; SSE2-NEXT:    pand %xmm2, %xmm81553; SSE2-NEXT:    por %xmm9, %xmm81554; SSE2-NEXT:    paddb %xmm5, %xmm51555; SSE2-NEXT:    pxor %xmm2, %xmm21556; SSE2-NEXT:    pcmpgtb %xmm5, %xmm21557; SSE2-NEXT:    movdqa %xmm2, %xmm51558; SSE2-NEXT:    pandn %xmm8, %xmm51559; SSE2-NEXT:    psrlw $1, %xmm81560; SSE2-NEXT:    pand %xmm6, %xmm21561; SSE2-NEXT:    pand %xmm8, %xmm21562; SSE2-NEXT:    por %xmm5, %xmm21563; SSE2-NEXT:    psllw $5, %xmm31564; SSE2-NEXT:    pxor %xmm5, %xmm51565; SSE2-NEXT:    pcmpgtb %xmm3, %xmm51566; SSE2-NEXT:    paddb %xmm3, %xmm31567; SSE2-NEXT:    pxor %xmm8, %xmm81568; SSE2-NEXT:    pcmpgtb %xmm3, %xmm81569; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm51570; SSE2-NEXT:    movdqa %xmm8, %xmm91571; SSE2-NEXT:    pandn %xmm5, %xmm91572; SSE2-NEXT:    psrlw $2, %xmm51573; SSE2-NEXT:    pand %xmm7, %xmm81574; SSE2-NEXT:    pand %xmm5, %xmm81575; SSE2-NEXT:    por %xmm9, %xmm81576; SSE2-NEXT:    paddb %xmm3, %xmm31577; SSE2-NEXT:    pxor %xmm5, %xmm51578; SSE2-NEXT:    pcmpgtb %xmm3, %xmm51579; SSE2-NEXT:    movdqa %xmm5, %xmm31580; SSE2-NEXT:    pandn %xmm8, %xmm31581; SSE2-NEXT:    psrlw $1, %xmm81582; SSE2-NEXT:    pand %xmm6, %xmm51583; SSE2-NEXT:    pand %xmm8, %xmm51584; SSE2-NEXT:    por %xmm3, %xmm51585; SSE2-NEXT:    psllw $5, %xmm01586; SSE2-NEXT:    pxor %xmm3, %xmm31587; SSE2-NEXT:    pcmpgtb %xmm0, %xmm31588; SSE2-NEXT:    paddb %xmm0, %xmm01589; SSE2-NEXT:    pxor %xmm7, %xmm71590; SSE2-NEXT:    pcmpgtb %xmm0, %xmm71591; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31592; SSE2-NEXT:    pandn %xmm3, %xmm71593; SSE2-NEXT:    paddb %xmm0, %xmm01594; SSE2-NEXT:    pcmpgtb %xmm0, %xmm41595; SSE2-NEXT:    movdqa %xmm4, %xmm01596; SSE2-NEXT:    pandn %xmm7, %xmm01597; SSE2-NEXT:    psrlw $1, %xmm71598; SSE2-NEXT:    pand %xmm6, %xmm41599; SSE2-NEXT:    pand %xmm7, %xmm41600; SSE2-NEXT:    por %xmm0, %xmm41601; SSE2-NEXT:    movdqa %xmm4, %xmm01602; SSE2-NEXT:    movdqa %xmm5, %xmm31603; SSE2-NEXT:    retq1604;1605; SSE41-LABEL: perlane_lshr_v64i8:1606; SSE41:       # %bb.0:1607; SSE41-NEXT:    movd {{.*#+}} xmm4 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]1608; SSE41-NEXT:    pshufb %xmm0, %xmm41609; SSE41-NEXT:    movd {{.*#+}} xmm5 = [4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]1610; SSE41-NEXT:    pshufb %xmm1, %xmm51611; SSE41-NEXT:    movd {{.*#+}} xmm6 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]1612; SSE41-NEXT:    pshufb %xmm2, %xmm61613; SSE41-NEXT:    movd {{.*#+}} xmm7 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0]1614; SSE41-NEXT:    pshufb %xmm3, %xmm71615; SSE41-NEXT:    movdqa %xmm4, %xmm01616; SSE41-NEXT:    movdqa %xmm5, %xmm11617; SSE41-NEXT:    movdqa %xmm6, %xmm21618; SSE41-NEXT:    movdqa %xmm7, %xmm31619; SSE41-NEXT:    retq1620;1621; AVX1-LABEL: perlane_lshr_v64i8:1622; AVX1:       # %bb.0:1623; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21624; AVX1-NEXT:    vmovd {{.*#+}} xmm3 = [4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]1625; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm21626; AVX1-NEXT:    vmovd {{.*#+}} xmm3 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]1627; AVX1-NEXT:    vpshufb %xmm0, %xmm3, %xmm01628; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01629; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm21630; AVX1-NEXT:    vmovd {{.*#+}} xmm3 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0]1631; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm21632; AVX1-NEXT:    vmovd {{.*#+}} xmm3 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]1633; AVX1-NEXT:    vpshufb %xmm1, %xmm3, %xmm11634; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm11635; AVX1-NEXT:    retq1636;1637; AVX2-LABEL: perlane_lshr_v64i8:1638; AVX2:       # %bb.0:1639; AVX2-NEXT:    vpmovsxdq {{.*#+}} ymm2 = [259,0,66052,0]1640; AVX2-NEXT:    vpshufb %ymm0, %ymm2, %ymm01641; AVX2-NEXT:    vpmovsxdq {{.*#+}} ymm2 = [66053,0,66310,0]1642; AVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm11643; AVX2-NEXT:    retq1644;1645; XOPAVX1-LABEL: perlane_lshr_v64i8:1646; XOPAVX1:       # %bb.0:1647; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm21648; XOPAVX1-NEXT:    vpsubb %xmm0, %xmm2, %xmm31649; XOPAVX1-NEXT:    vpshlb %xmm3, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31650; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01651; XOPAVX1-NEXT:    vpsubb %xmm0, %xmm2, %xmm01652; XOPAVX1-NEXT:    vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01653; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm3, %ymm01654; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm31655; XOPAVX1-NEXT:    vpshlb %xmm3, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31656; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm11657; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm11658; XOPAVX1-NEXT:    vpshlb %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11659; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm3, %ymm11660; XOPAVX1-NEXT:    retq1661;1662; XOPAVX2-LABEL: perlane_lshr_v64i8:1663; XOPAVX2:       # %bb.0:1664; XOPAVX2-NEXT:    vpmovsxdq {{.*#+}} ymm2 = [259,0,66052,0]1665; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm2, %ymm01666; XOPAVX2-NEXT:    vpmovsxdq {{.*#+}} ymm2 = [66053,0,66310,0]1667; XOPAVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm11668; XOPAVX2-NEXT:    retq1669;1670; AVX512DQ-LABEL: perlane_lshr_v64i8:1671; AVX512DQ:       # %bb.0:1672; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm11673; AVX512DQ-NEXT:    vpmovsxdq {{.*#+}} ymm2 = [66053,0,66310,0]1674; AVX512DQ-NEXT:    vpshufb %ymm1, %ymm2, %ymm11675; AVX512DQ-NEXT:    vpmovsxdq {{.*#+}} ymm2 = [259,0,66052,0]1676; AVX512DQ-NEXT:    vpshufb %ymm0, %ymm2, %ymm01677; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm01678; AVX512DQ-NEXT:    retq1679;1680; AVX512BW-LABEL: perlane_lshr_v64i8:1681; AVX512BW:       # %bb.0:1682; AVX512BW-NEXT:    vpmovsxdq {{.*#+}} zmm1 = [259,0,66052,0,66053,0,66310,0]1683; AVX512BW-NEXT:    vpshufb %zmm0, %zmm1, %zmm01684; AVX512BW-NEXT:    retq1685  %shift = lshr <64 x i8> <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>, %a1686  ret <64 x i8> %shift1687}1688 1689define <64 x i8> @perlane_ashr_v64i8(<64 x i8> %a) nounwind {1690; SSE2-LABEL: perlane_ashr_v64i8:1691; SSE2:       # %bb.0:1692; SSE2-NEXT:    psllw $5, %xmm11693; SSE2-NEXT:    pxor %xmm0, %xmm01694; SSE2-NEXT:    pcmpgtb %xmm1, %xmm01695; SSE2-NEXT:    movdqa %xmm1, %xmm51696; SSE2-NEXT:    paddb %xmm1, %xmm51697; SSE2-NEXT:    pxor %xmm4, %xmm41698; SSE2-NEXT:    pxor %xmm6, %xmm61699; SSE2-NEXT:    pcmpgtb %xmm5, %xmm61700; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01701; SSE2-NEXT:    pandn %xmm0, %xmm61702; SSE2-NEXT:    paddb %xmm5, %xmm51703; SSE2-NEXT:    pxor %xmm1, %xmm11704; SSE2-NEXT:    pcmpgtb %xmm5, %xmm11705; SSE2-NEXT:    movdqa %xmm1, %xmm51706; SSE2-NEXT:    pandn %xmm6, %xmm51707; SSE2-NEXT:    psrlw $1, %xmm61708; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]1709; SSE2-NEXT:    pand %xmm0, %xmm11710; SSE2-NEXT:    pand %xmm6, %xmm11711; SSE2-NEXT:    por %xmm5, %xmm11712; SSE2-NEXT:    psllw $5, %xmm21713; SSE2-NEXT:    pxor %xmm5, %xmm51714; SSE2-NEXT:    pcmpgtb %xmm2, %xmm51715; SSE2-NEXT:    paddb %xmm2, %xmm21716; SSE2-NEXT:    pxor %xmm6, %xmm61717; SSE2-NEXT:    pcmpgtb %xmm2, %xmm61718; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm51719; SSE2-NEXT:    pandn %xmm5, %xmm61720; SSE2-NEXT:    paddb %xmm2, %xmm21721; SSE2-NEXT:    pxor %xmm5, %xmm51722; SSE2-NEXT:    pcmpgtb %xmm2, %xmm51723; SSE2-NEXT:    movdqa %xmm5, %xmm21724; SSE2-NEXT:    pandn %xmm6, %xmm21725; SSE2-NEXT:    psrlw $1, %xmm61726; SSE2-NEXT:    pand %xmm0, %xmm51727; SSE2-NEXT:    pand %xmm6, %xmm51728; SSE2-NEXT:    por %xmm2, %xmm51729; SSE2-NEXT:    psllw $5, %xmm31730; SSE2-NEXT:    pxor %xmm2, %xmm21731; SSE2-NEXT:    pcmpgtb %xmm3, %xmm21732; SSE2-NEXT:    paddb %xmm3, %xmm31733; SSE2-NEXT:    pxor %xmm6, %xmm61734; SSE2-NEXT:    pcmpgtb %xmm3, %xmm61735; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21736; SSE2-NEXT:    pandn %xmm2, %xmm61737; SSE2-NEXT:    paddb %xmm3, %xmm31738; SSE2-NEXT:    pcmpgtb %xmm3, %xmm41739; SSE2-NEXT:    movdqa %xmm4, %xmm21740; SSE2-NEXT:    pandn %xmm6, %xmm21741; SSE2-NEXT:    psrlw $1, %xmm61742; SSE2-NEXT:    pand %xmm0, %xmm41743; SSE2-NEXT:    pand %xmm6, %xmm41744; SSE2-NEXT:    por %xmm2, %xmm41745; SSE2-NEXT:    pxor %xmm0, %xmm01746; SSE2-NEXT:    movdqa %xmm5, %xmm21747; SSE2-NEXT:    movdqa %xmm4, %xmm31748; SSE2-NEXT:    retq1749;1750; SSE41-LABEL: perlane_ashr_v64i8:1751; SSE41:       # %bb.0:1752; SSE41-NEXT:    pmovsxbq {{.*#+}} xmm4 = [1,0]1753; SSE41-NEXT:    pshufb %xmm1, %xmm41754; SSE41-NEXT:    movd {{.*#+}} xmm5 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]1755; SSE41-NEXT:    pshufb %xmm2, %xmm51756; SSE41-NEXT:    movd {{.*#+}} xmm6 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]1757; SSE41-NEXT:    pshufb %xmm3, %xmm61758; SSE41-NEXT:    xorps %xmm0, %xmm01759; SSE41-NEXT:    movdqa %xmm4, %xmm11760; SSE41-NEXT:    movdqa %xmm5, %xmm21761; SSE41-NEXT:    movdqa %xmm6, %xmm31762; SSE41-NEXT:    retq1763;1764; AVX1-LABEL: perlane_ashr_v64i8:1765; AVX1:       # %bb.0:1766; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm21767; AVX1-NEXT:    vmovd {{.*#+}} xmm3 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]1768; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm21769; AVX1-NEXT:    vmovd {{.*#+}} xmm3 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]1770; AVX1-NEXT:    vpshufb %xmm1, %xmm3, %xmm11771; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm11772; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01773; AVX1-NEXT:    vpmovsxbq {{.*#+}} xmm2 = [1,0]1774; AVX1-NEXT:    vpshufb %xmm0, %xmm2, %xmm01775; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm21776; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm01777; AVX1-NEXT:    retq1778;1779; AVX2-LABEL: perlane_ashr_v64i8:1780; AVX2:       # %bb.0:1781; AVX2-NEXT:    vpmovsxbq {{.*#+}} ymm2 = [0,0,1,0]1782; AVX2-NEXT:    vpshufb %ymm0, %ymm2, %ymm01783; AVX2-NEXT:    vpmovsxwq {{.*#+}} ymm2 = [258,0,259,0]1784; AVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm11785; AVX2-NEXT:    retq1786;1787; XOPAVX1-LABEL: perlane_ashr_v64i8:1788; XOPAVX1:       # %bb.0:1789; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm21790; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm31791; XOPAVX1-NEXT:    vpshlb %xmm3, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31792; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm11793; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm11794; XOPAVX1-NEXT:    vpshlb %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11795; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm3, %ymm11796; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01797; XOPAVX1-NEXT:    vpsubb %xmm0, %xmm2, %xmm01798; XOPAVX1-NEXT:    vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01799; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm21800; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm01801; XOPAVX1-NEXT:    retq1802;1803; XOPAVX2-LABEL: perlane_ashr_v64i8:1804; XOPAVX2:       # %bb.0:1805; XOPAVX2-NEXT:    vpmovsxbq {{.*#+}} ymm2 = [0,0,1,0]1806; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm2, %ymm01807; XOPAVX2-NEXT:    vpmovsxwq {{.*#+}} ymm2 = [258,0,259,0]1808; XOPAVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm11809; XOPAVX2-NEXT:    retq1810;1811; AVX512DQ-LABEL: perlane_ashr_v64i8:1812; AVX512DQ:       # %bb.0:1813; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm11814; AVX512DQ-NEXT:    vpmovsxwq {{.*#+}} ymm2 = [258,0,259,0]1815; AVX512DQ-NEXT:    vpshufb %ymm1, %ymm2, %ymm11816; AVX512DQ-NEXT:    vpmovsxbq {{.*#+}} ymm2 = [0,0,1,0]1817; AVX512DQ-NEXT:    vpshufb %ymm0, %ymm2, %ymm01818; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm01819; AVX512DQ-NEXT:    retq1820;1821; AVX512BW-LABEL: perlane_ashr_v64i8:1822; AVX512BW:       # %bb.0:1823; AVX512BW-NEXT:    vpmovsxwq {{.*#+}} zmm1 = [0,0,1,0,258,0,259,0]1824; AVX512BW-NEXT:    vpshufb %zmm0, %zmm1, %zmm01825; AVX512BW-NEXT:    retq1826  %shift = ashr <64 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>, %a1827  ret <64 x i8> %shift1828}1829 1830;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:1831; SSE: {{.*}}1832