brintos

brintos / llvm-project-archived public Read only

0
0
Text · 46.6 KiB · 4c6680a Raw
769 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLBW6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2 | FileCheck %s --check-prefixes=AVX512,AVX512VBMI27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLVBMI28 9declare <8 x i64> @llvm.fshl.v8i64(<8 x i64>, <8 x i64>, <8 x i64>)10declare <16 x i32> @llvm.fshl.v16i32(<16 x i32>, <16 x i32>, <16 x i32>)11declare <32 x i16> @llvm.fshl.v32i16(<32 x i16>, <32 x i16>, <32 x i16>)12declare <64 x i8> @llvm.fshl.v64i8(<64 x i8>, <64 x i8>, <64 x i8>)13 14;15; Variable Shifts16;17 18define <8 x i64> @var_funnnel_v8i64(<8 x i64> %x, <8 x i64> %amt) nounwind {19; AVX512-LABEL: var_funnnel_v8i64:20; AVX512:       # %bb.0:21; AVX512-NEXT:    vprolvq %zmm1, %zmm0, %zmm022; AVX512-NEXT:    retq23  %res = call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %x, <8 x i64> %x, <8 x i64> %amt)24  ret <8 x i64> %res25}26 27define <16 x i32> @var_funnnel_v16i32(<16 x i32> %x, <16 x i32> %amt) nounwind {28; AVX512-LABEL: var_funnnel_v16i32:29; AVX512:       # %bb.0:30; AVX512-NEXT:    vprolvd %zmm1, %zmm0, %zmm031; AVX512-NEXT:    retq32  %res = call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %x, <16 x i32> %x, <16 x i32> %amt)33  ret <16 x i32> %res34}35 36define <32 x i16> @var_funnnel_v32i16(<32 x i16> %x, <32 x i16> %amt) nounwind {37; AVX512F-LABEL: var_funnnel_v32i16:38; AVX512F:       # %bb.0:39; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm240; AVX512F-NEXT:    vpbroadcastw {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]41; AVX512F-NEXT:    vpand %ymm3, %ymm2, %ymm242; AVX512F-NEXT:    vpxor %xmm4, %xmm4, %xmm443; AVX512F-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm4[4],ymm2[5],ymm4[5],ymm2[6],ymm4[6],ymm2[7],ymm4[7],ymm2[12],ymm4[12],ymm2[13],ymm4[13],ymm2[14],ymm4[14],ymm2[15],ymm4[15]44; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm645; AVX512F-NEXT:    vpunpckhwd {{.*#+}} ymm7 = ymm6[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]46; AVX512F-NEXT:    vpsllvd %ymm5, %ymm7, %ymm547; AVX512F-NEXT:    vpsrld $16, %ymm5, %ymm548; AVX512F-NEXT:    vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[8],ymm4[8],ymm2[9],ymm4[9],ymm2[10],ymm4[10],ymm2[11],ymm4[11]49; AVX512F-NEXT:    vpunpcklwd {{.*#+}} ymm6 = ymm6[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]50; AVX512F-NEXT:    vpsllvd %ymm2, %ymm6, %ymm251; AVX512F-NEXT:    vpsrld $16, %ymm2, %ymm252; AVX512F-NEXT:    vpackusdw %ymm5, %ymm2, %ymm253; AVX512F-NEXT:    vpand %ymm3, %ymm1, %ymm154; AVX512F-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm4[4],ymm1[5],ymm4[5],ymm1[6],ymm4[6],ymm1[7],ymm4[7],ymm1[12],ymm4[12],ymm1[13],ymm4[13],ymm1[14],ymm4[14],ymm1[15],ymm4[15]55; AVX512F-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]56; AVX512F-NEXT:    vpsllvd %ymm3, %ymm5, %ymm357; AVX512F-NEXT:    vpsrld $16, %ymm3, %ymm358; AVX512F-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm4[0],ymm1[1],ymm4[1],ymm1[2],ymm4[2],ymm1[3],ymm4[3],ymm1[8],ymm4[8],ymm1[9],ymm4[9],ymm1[10],ymm4[10],ymm1[11],ymm4[11]59; AVX512F-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]60; AVX512F-NEXT:    vpsllvd %ymm1, %ymm0, %ymm061; AVX512F-NEXT:    vpsrld $16, %ymm0, %ymm062; AVX512F-NEXT:    vpackusdw %ymm3, %ymm0, %ymm063; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm064; AVX512F-NEXT:    retq65;66; AVX512VL-LABEL: var_funnnel_v32i16:67; AVX512VL:       # %bb.0:68; AVX512VL-NEXT:    vextracti64x4 $1, %zmm1, %ymm269; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]70; AVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm271; AVX512VL-NEXT:    vpxor %xmm4, %xmm4, %xmm472; AVX512VL-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm4[4],ymm2[5],ymm4[5],ymm2[6],ymm4[6],ymm2[7],ymm4[7],ymm2[12],ymm4[12],ymm2[13],ymm4[13],ymm2[14],ymm4[14],ymm2[15],ymm4[15]73; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm674; AVX512VL-NEXT:    vpunpckhwd {{.*#+}} ymm7 = ymm6[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]75; AVX512VL-NEXT:    vpsllvd %ymm5, %ymm7, %ymm576; AVX512VL-NEXT:    vpsrld $16, %ymm5, %ymm577; AVX512VL-NEXT:    vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[8],ymm4[8],ymm2[9],ymm4[9],ymm2[10],ymm4[10],ymm2[11],ymm4[11]78; AVX512VL-NEXT:    vpunpcklwd {{.*#+}} ymm6 = ymm6[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]79; AVX512VL-NEXT:    vpsllvd %ymm2, %ymm6, %ymm280; AVX512VL-NEXT:    vpsrld $16, %ymm2, %ymm281; AVX512VL-NEXT:    vpackusdw %ymm5, %ymm2, %ymm282; AVX512VL-NEXT:    vpand %ymm3, %ymm1, %ymm183; AVX512VL-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm4[4],ymm1[5],ymm4[5],ymm1[6],ymm4[6],ymm1[7],ymm4[7],ymm1[12],ymm4[12],ymm1[13],ymm4[13],ymm1[14],ymm4[14],ymm1[15],ymm4[15]84; AVX512VL-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]85; AVX512VL-NEXT:    vpsllvd %ymm3, %ymm5, %ymm386; AVX512VL-NEXT:    vpsrld $16, %ymm3, %ymm387; AVX512VL-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm4[0],ymm1[1],ymm4[1],ymm1[2],ymm4[2],ymm1[3],ymm4[3],ymm1[8],ymm4[8],ymm1[9],ymm4[9],ymm1[10],ymm4[10],ymm1[11],ymm4[11]88; AVX512VL-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]89; AVX512VL-NEXT:    vpsllvd %ymm1, %ymm0, %ymm090; AVX512VL-NEXT:    vpsrld $16, %ymm0, %ymm091; AVX512VL-NEXT:    vpackusdw %ymm3, %ymm0, %ymm092; AVX512VL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm093; AVX512VL-NEXT:    retq94;95; AVX512BW-LABEL: var_funnnel_v32i16:96; AVX512BW:       # %bb.0:97; AVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm198; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm299; AVX512BW-NEXT:    vpbroadcastw {{.*#+}} zmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]100; AVX512BW-NEXT:    vpsubw %zmm1, %zmm3, %zmm1101; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0102; AVX512BW-NEXT:    vporq %zmm0, %zmm2, %zmm0103; AVX512BW-NEXT:    retq104;105; AVX512VLBW-LABEL: var_funnnel_v32i16:106; AVX512VLBW:       # %bb.0:107; AVX512VLBW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm1108; AVX512VLBW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm2109; AVX512VLBW-NEXT:    vpbroadcastw {{.*#+}} zmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]110; AVX512VLBW-NEXT:    vpsubw %zmm1, %zmm3, %zmm1111; AVX512VLBW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0112; AVX512VLBW-NEXT:    vporq %zmm0, %zmm2, %zmm0113; AVX512VLBW-NEXT:    retq114;115; AVX512VBMI2-LABEL: var_funnnel_v32i16:116; AVX512VBMI2:       # %bb.0:117; AVX512VBMI2-NEXT:    vpshldvw %zmm1, %zmm0, %zmm0118; AVX512VBMI2-NEXT:    retq119;120; AVX512VLVBMI2-LABEL: var_funnnel_v32i16:121; AVX512VLVBMI2:       # %bb.0:122; AVX512VLVBMI2-NEXT:    vpshldvw %zmm1, %zmm0, %zmm0123; AVX512VLVBMI2-NEXT:    retq124  %res = call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %x, <32 x i16> %x, <32 x i16> %amt)125  ret <32 x i16> %res126}127 128define <64 x i8> @var_funnnel_v64i8(<64 x i8> %x, <64 x i8> %amt) nounwind {129; AVX512F-LABEL: var_funnnel_v64i8:130; AVX512F:       # %bb.0:131; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm2132; AVX512F-NEXT:    vpsrlw $4, %ymm2, %ymm3133; AVX512F-NEXT:    vpsllw $4, %ymm2, %ymm4134; AVX512F-NEXT:    vpbroadcastd {{.*#+}} zmm5 = [4042322160,4042322160,4042322160,4042322160,4042322160,4042322160,4042322160,4042322160,4042322160,4042322160,4042322160,4042322160,4042322160,4042322160,4042322160,4042322160]135; AVX512F-NEXT:    vpternlogd {{.*#+}} zmm4 = zmm3 ^ (zmm5 & (zmm4 ^ zmm3))136; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm3137; AVX512F-NEXT:    vpsllw $5, %ymm3, %ymm3138; AVX512F-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2139; AVX512F-NEXT:    vpsrlw $6, %ymm2, %ymm4140; AVX512F-NEXT:    vpsllw $2, %ymm2, %ymm6141; AVX512F-NEXT:    vpbroadcastd {{.*#+}} zmm7 = [4244438268,4244438268,4244438268,4244438268,4244438268,4244438268,4244438268,4244438268,4244438268,4244438268,4244438268,4244438268,4244438268,4244438268,4244438268,4244438268]142; AVX512F-NEXT:    vpternlogd {{.*#+}} zmm6 = zmm4 ^ (zmm7 & (zmm6 ^ zmm4))143; AVX512F-NEXT:    vpaddb %ymm3, %ymm3, %ymm3144; AVX512F-NEXT:    vpblendvb %ymm3, %ymm6, %ymm2, %ymm2145; AVX512F-NEXT:    vpsrlw $7, %ymm2, %ymm4146; AVX512F-NEXT:    vpbroadcastb {{.*#+}} ymm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]147; AVX512F-NEXT:    vpand %ymm6, %ymm4, %ymm4148; AVX512F-NEXT:    vpaddb %ymm2, %ymm2, %ymm8149; AVX512F-NEXT:    vpor %ymm4, %ymm8, %ymm4150; AVX512F-NEXT:    vpaddb %ymm3, %ymm3, %ymm3151; AVX512F-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2152; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm3153; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm4154; AVX512F-NEXT:    vpternlogd {{.*#+}} zmm4 = zmm3 ^ (zmm5 & (zmm4 ^ zmm3))155; AVX512F-NEXT:    vpsllw $5, %ymm1, %ymm1156; AVX512F-NEXT:    vpblendvb %ymm1, %ymm4, %ymm0, %ymm0157; AVX512F-NEXT:    vpsrlw $6, %ymm0, %ymm3158; AVX512F-NEXT:    vpsllw $2, %ymm0, %ymm4159; AVX512F-NEXT:    vpternlogd {{.*#+}} zmm4 = zmm3 ^ (zmm7 & (zmm4 ^ zmm3))160; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm1161; AVX512F-NEXT:    vpblendvb %ymm1, %ymm4, %ymm0, %ymm0162; AVX512F-NEXT:    vpsrlw $7, %ymm0, %ymm3163; AVX512F-NEXT:    vpand %ymm6, %ymm3, %ymm3164; AVX512F-NEXT:    vpaddb %ymm0, %ymm0, %ymm4165; AVX512F-NEXT:    vpor %ymm3, %ymm4, %ymm3166; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm1167; AVX512F-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0168; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0169; AVX512F-NEXT:    retq170;171; AVX512VL-LABEL: var_funnnel_v64i8:172; AVX512VL:       # %bb.0:173; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2174; AVX512VL-NEXT:    vpsrlw $4, %ymm2, %ymm3175; AVX512VL-NEXT:    vpsllw $4, %ymm2, %ymm4176; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm5 = [4042322160,4042322160,4042322160,4042322160,4042322160,4042322160,4042322160,4042322160]177; AVX512VL-NEXT:    vpternlogd {{.*#+}} ymm4 = ymm3 ^ (ymm5 & (ymm4 ^ ymm3))178; AVX512VL-NEXT:    vextracti64x4 $1, %zmm1, %ymm3179; AVX512VL-NEXT:    vpsllw $5, %ymm3, %ymm3180; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2181; AVX512VL-NEXT:    vpsrlw $6, %ymm2, %ymm4182; AVX512VL-NEXT:    vpsllw $2, %ymm2, %ymm6183; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm7 = [4244438268,4244438268,4244438268,4244438268,4244438268,4244438268,4244438268,4244438268]184; AVX512VL-NEXT:    vpternlogd {{.*#+}} ymm6 = ymm4 ^ (ymm7 & (ymm6 ^ ymm4))185; AVX512VL-NEXT:    vpaddb %ymm3, %ymm3, %ymm3186; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm6, %ymm2, %ymm2187; AVX512VL-NEXT:    vpsrlw $7, %ymm2, %ymm4188; AVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm6189; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm8 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]190; AVX512VL-NEXT:    vpternlogq {{.*#+}} ymm6 = ymm6 | (ymm4 & ymm8)191; AVX512VL-NEXT:    vpaddb %ymm3, %ymm3, %ymm3192; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm6, %ymm2, %ymm2193; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm3194; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm4195; AVX512VL-NEXT:    vpternlogd {{.*#+}} ymm4 = ymm3 ^ (ymm5 & (ymm4 ^ ymm3))196; AVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1197; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm4, %ymm0, %ymm0198; AVX512VL-NEXT:    vpsrlw $6, %ymm0, %ymm3199; AVX512VL-NEXT:    vpsllw $2, %ymm0, %ymm4200; AVX512VL-NEXT:    vpternlogd {{.*#+}} ymm4 = ymm3 ^ (ymm7 & (ymm4 ^ ymm3))201; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1202; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm4, %ymm0, %ymm0203; AVX512VL-NEXT:    vpsrlw $7, %ymm0, %ymm3204; AVX512VL-NEXT:    vpaddb %ymm0, %ymm0, %ymm4205; AVX512VL-NEXT:    vpternlogq {{.*#+}} ymm4 = ymm4 | (ymm3 & ymm8)206; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1207; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm4, %ymm0, %ymm0208; AVX512VL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0209; AVX512VL-NEXT:    retq210;211; AVX512BW-LABEL: var_funnnel_v64i8:212; AVX512BW:       # %bb.0:213; AVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm1214; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2215; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm1[8],zmm2[8],zmm1[9],zmm2[9],zmm1[10],zmm2[10],zmm1[11],zmm2[11],zmm1[12],zmm2[12],zmm1[13],zmm2[13],zmm1[14],zmm2[14],zmm1[15],zmm2[15],zmm1[24],zmm2[24],zmm1[25],zmm2[25],zmm1[26],zmm2[26],zmm1[27],zmm2[27],zmm1[28],zmm2[28],zmm1[29],zmm2[29],zmm1[30],zmm2[30],zmm1[31],zmm2[31],zmm1[40],zmm2[40],zmm1[41],zmm2[41],zmm1[42],zmm2[42],zmm1[43],zmm2[43],zmm1[44],zmm2[44],zmm1[45],zmm2[45],zmm1[46],zmm2[46],zmm1[47],zmm2[47],zmm1[56],zmm2[56],zmm1[57],zmm2[57],zmm1[58],zmm2[58],zmm1[59],zmm2[59],zmm1[60],zmm2[60],zmm1[61],zmm2[61],zmm1[62],zmm2[62],zmm1[63],zmm2[63]216; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm4 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]217; AVX512BW-NEXT:    vpsllvw %zmm3, %zmm4, %zmm3218; AVX512BW-NEXT:    vpsrlw $8, %zmm3, %zmm3219; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm2[0],zmm1[1],zmm2[1],zmm1[2],zmm2[2],zmm1[3],zmm2[3],zmm1[4],zmm2[4],zmm1[5],zmm2[5],zmm1[6],zmm2[6],zmm1[7],zmm2[7],zmm1[16],zmm2[16],zmm1[17],zmm2[17],zmm1[18],zmm2[18],zmm1[19],zmm2[19],zmm1[20],zmm2[20],zmm1[21],zmm2[21],zmm1[22],zmm2[22],zmm1[23],zmm2[23],zmm1[32],zmm2[32],zmm1[33],zmm2[33],zmm1[34],zmm2[34],zmm1[35],zmm2[35],zmm1[36],zmm2[36],zmm1[37],zmm2[37],zmm1[38],zmm2[38],zmm1[39],zmm2[39],zmm1[48],zmm2[48],zmm1[49],zmm2[49],zmm1[50],zmm2[50],zmm1[51],zmm2[51],zmm1[52],zmm2[52],zmm1[53],zmm2[53],zmm1[54],zmm2[54],zmm1[55],zmm2[55]220; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]221; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0222; AVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0223; AVX512BW-NEXT:    vpackuswb %zmm3, %zmm0, %zmm0224; AVX512BW-NEXT:    retq225;226; AVX512VLBW-LABEL: var_funnnel_v64i8:227; AVX512VLBW:       # %bb.0:228; AVX512VLBW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm1229; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2230; AVX512VLBW-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm1[8],zmm2[8],zmm1[9],zmm2[9],zmm1[10],zmm2[10],zmm1[11],zmm2[11],zmm1[12],zmm2[12],zmm1[13],zmm2[13],zmm1[14],zmm2[14],zmm1[15],zmm2[15],zmm1[24],zmm2[24],zmm1[25],zmm2[25],zmm1[26],zmm2[26],zmm1[27],zmm2[27],zmm1[28],zmm2[28],zmm1[29],zmm2[29],zmm1[30],zmm2[30],zmm1[31],zmm2[31],zmm1[40],zmm2[40],zmm1[41],zmm2[41],zmm1[42],zmm2[42],zmm1[43],zmm2[43],zmm1[44],zmm2[44],zmm1[45],zmm2[45],zmm1[46],zmm2[46],zmm1[47],zmm2[47],zmm1[56],zmm2[56],zmm1[57],zmm2[57],zmm1[58],zmm2[58],zmm1[59],zmm2[59],zmm1[60],zmm2[60],zmm1[61],zmm2[61],zmm1[62],zmm2[62],zmm1[63],zmm2[63]231; AVX512VLBW-NEXT:    vpunpckhbw {{.*#+}} zmm4 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]232; AVX512VLBW-NEXT:    vpsllvw %zmm3, %zmm4, %zmm3233; AVX512VLBW-NEXT:    vpsrlw $8, %zmm3, %zmm3234; AVX512VLBW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm2[0],zmm1[1],zmm2[1],zmm1[2],zmm2[2],zmm1[3],zmm2[3],zmm1[4],zmm2[4],zmm1[5],zmm2[5],zmm1[6],zmm2[6],zmm1[7],zmm2[7],zmm1[16],zmm2[16],zmm1[17],zmm2[17],zmm1[18],zmm2[18],zmm1[19],zmm2[19],zmm1[20],zmm2[20],zmm1[21],zmm2[21],zmm1[22],zmm2[22],zmm1[23],zmm2[23],zmm1[32],zmm2[32],zmm1[33],zmm2[33],zmm1[34],zmm2[34],zmm1[35],zmm2[35],zmm1[36],zmm2[36],zmm1[37],zmm2[37],zmm1[38],zmm2[38],zmm1[39],zmm2[39],zmm1[48],zmm2[48],zmm1[49],zmm2[49],zmm1[50],zmm2[50],zmm1[51],zmm2[51],zmm1[52],zmm2[52],zmm1[53],zmm2[53],zmm1[54],zmm2[54],zmm1[55],zmm2[55]235; AVX512VLBW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]236; AVX512VLBW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0237; AVX512VLBW-NEXT:    vpsrlw $8, %zmm0, %zmm0238; AVX512VLBW-NEXT:    vpackuswb %zmm3, %zmm0, %zmm0239; AVX512VLBW-NEXT:    retq240;241; AVX512VBMI2-LABEL: var_funnnel_v64i8:242; AVX512VBMI2:       # %bb.0:243; AVX512VBMI2-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm1244; AVX512VBMI2-NEXT:    vpxor %xmm2, %xmm2, %xmm2245; AVX512VBMI2-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm1[8],zmm2[8],zmm1[9],zmm2[9],zmm1[10],zmm2[10],zmm1[11],zmm2[11],zmm1[12],zmm2[12],zmm1[13],zmm2[13],zmm1[14],zmm2[14],zmm1[15],zmm2[15],zmm1[24],zmm2[24],zmm1[25],zmm2[25],zmm1[26],zmm2[26],zmm1[27],zmm2[27],zmm1[28],zmm2[28],zmm1[29],zmm2[29],zmm1[30],zmm2[30],zmm1[31],zmm2[31],zmm1[40],zmm2[40],zmm1[41],zmm2[41],zmm1[42],zmm2[42],zmm1[43],zmm2[43],zmm1[44],zmm2[44],zmm1[45],zmm2[45],zmm1[46],zmm2[46],zmm1[47],zmm2[47],zmm1[56],zmm2[56],zmm1[57],zmm2[57],zmm1[58],zmm2[58],zmm1[59],zmm2[59],zmm1[60],zmm2[60],zmm1[61],zmm2[61],zmm1[62],zmm2[62],zmm1[63],zmm2[63]246; AVX512VBMI2-NEXT:    vpunpckhbw {{.*#+}} zmm4 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]247; AVX512VBMI2-NEXT:    vpsllvw %zmm3, %zmm4, %zmm3248; AVX512VBMI2-NEXT:    vpsrlw $8, %zmm3, %zmm3249; AVX512VBMI2-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm2[0],zmm1[1],zmm2[1],zmm1[2],zmm2[2],zmm1[3],zmm2[3],zmm1[4],zmm2[4],zmm1[5],zmm2[5],zmm1[6],zmm2[6],zmm1[7],zmm2[7],zmm1[16],zmm2[16],zmm1[17],zmm2[17],zmm1[18],zmm2[18],zmm1[19],zmm2[19],zmm1[20],zmm2[20],zmm1[21],zmm2[21],zmm1[22],zmm2[22],zmm1[23],zmm2[23],zmm1[32],zmm2[32],zmm1[33],zmm2[33],zmm1[34],zmm2[34],zmm1[35],zmm2[35],zmm1[36],zmm2[36],zmm1[37],zmm2[37],zmm1[38],zmm2[38],zmm1[39],zmm2[39],zmm1[48],zmm2[48],zmm1[49],zmm2[49],zmm1[50],zmm2[50],zmm1[51],zmm2[51],zmm1[52],zmm2[52],zmm1[53],zmm2[53],zmm1[54],zmm2[54],zmm1[55],zmm2[55]250; AVX512VBMI2-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]251; AVX512VBMI2-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0252; AVX512VBMI2-NEXT:    vpsrlw $8, %zmm0, %zmm0253; AVX512VBMI2-NEXT:    vpackuswb %zmm3, %zmm0, %zmm0254; AVX512VBMI2-NEXT:    retq255;256; AVX512VLVBMI2-LABEL: var_funnnel_v64i8:257; AVX512VLVBMI2:       # %bb.0:258; AVX512VLVBMI2-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm1259; AVX512VLVBMI2-NEXT:    vpxor %xmm2, %xmm2, %xmm2260; AVX512VLVBMI2-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm1[8],zmm2[8],zmm1[9],zmm2[9],zmm1[10],zmm2[10],zmm1[11],zmm2[11],zmm1[12],zmm2[12],zmm1[13],zmm2[13],zmm1[14],zmm2[14],zmm1[15],zmm2[15],zmm1[24],zmm2[24],zmm1[25],zmm2[25],zmm1[26],zmm2[26],zmm1[27],zmm2[27],zmm1[28],zmm2[28],zmm1[29],zmm2[29],zmm1[30],zmm2[30],zmm1[31],zmm2[31],zmm1[40],zmm2[40],zmm1[41],zmm2[41],zmm1[42],zmm2[42],zmm1[43],zmm2[43],zmm1[44],zmm2[44],zmm1[45],zmm2[45],zmm1[46],zmm2[46],zmm1[47],zmm2[47],zmm1[56],zmm2[56],zmm1[57],zmm2[57],zmm1[58],zmm2[58],zmm1[59],zmm2[59],zmm1[60],zmm2[60],zmm1[61],zmm2[61],zmm1[62],zmm2[62],zmm1[63],zmm2[63]261; AVX512VLVBMI2-NEXT:    vpunpckhbw {{.*#+}} zmm4 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]262; AVX512VLVBMI2-NEXT:    vpsllvw %zmm3, %zmm4, %zmm3263; AVX512VLVBMI2-NEXT:    vpsrlw $8, %zmm3, %zmm3264; AVX512VLVBMI2-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm2[0],zmm1[1],zmm2[1],zmm1[2],zmm2[2],zmm1[3],zmm2[3],zmm1[4],zmm2[4],zmm1[5],zmm2[5],zmm1[6],zmm2[6],zmm1[7],zmm2[7],zmm1[16],zmm2[16],zmm1[17],zmm2[17],zmm1[18],zmm2[18],zmm1[19],zmm2[19],zmm1[20],zmm2[20],zmm1[21],zmm2[21],zmm1[22],zmm2[22],zmm1[23],zmm2[23],zmm1[32],zmm2[32],zmm1[33],zmm2[33],zmm1[34],zmm2[34],zmm1[35],zmm2[35],zmm1[36],zmm2[36],zmm1[37],zmm2[37],zmm1[38],zmm2[38],zmm1[39],zmm2[39],zmm1[48],zmm2[48],zmm1[49],zmm2[49],zmm1[50],zmm2[50],zmm1[51],zmm2[51],zmm1[52],zmm2[52],zmm1[53],zmm2[53],zmm1[54],zmm2[54],zmm1[55],zmm2[55]265; AVX512VLVBMI2-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]266; AVX512VLVBMI2-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0267; AVX512VLVBMI2-NEXT:    vpsrlw $8, %zmm0, %zmm0268; AVX512VLVBMI2-NEXT:    vpackuswb %zmm3, %zmm0, %zmm0269; AVX512VLVBMI2-NEXT:    retq270  %res = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %x, <64 x i8> %x, <64 x i8> %amt)271  ret <64 x i8> %res272}273 274;275; Uniform Variable Shifts276;277 278define <8 x i64> @splatvar_funnnel_v8i64(<8 x i64> %x, <8 x i64> %amt) nounwind {279; AVX512-LABEL: splatvar_funnnel_v8i64:280; AVX512:       # %bb.0:281; AVX512-NEXT:    vpbroadcastq %xmm1, %zmm1282; AVX512-NEXT:    vprolvq %zmm1, %zmm0, %zmm0283; AVX512-NEXT:    retq284  %splat = shufflevector <8 x i64> %amt, <8 x i64> undef, <8 x i32> zeroinitializer285  %res = call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %x, <8 x i64> %x, <8 x i64> %splat)286  ret <8 x i64> %res287}288 289define <16 x i32> @splatvar_funnnel_v16i32(<16 x i32> %x, <16 x i32> %amt) nounwind {290; AVX512-LABEL: splatvar_funnnel_v16i32:291; AVX512:       # %bb.0:292; AVX512-NEXT:    vpbroadcastd %xmm1, %zmm1293; AVX512-NEXT:    vprolvd %zmm1, %zmm0, %zmm0294; AVX512-NEXT:    retq295  %splat = shufflevector <16 x i32> %amt, <16 x i32> undef, <16 x i32> zeroinitializer296  %res = call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %x, <16 x i32> %x, <16 x i32> %splat)297  ret <16 x i32> %res298}299 300define <32 x i16> @splatvar_funnnel_v32i16(<32 x i16> %x, <32 x i16> %amt) nounwind {301; AVX512F-LABEL: splatvar_funnnel_v32i16:302; AVX512F:       # %bb.0:303; AVX512F-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [15,0,0,0,15,0,0,0]304; AVX512F-NEXT:    vpandn %xmm2, %xmm1, %xmm3305; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm4306; AVX512F-NEXT:    vpsrlw $1, %ymm4, %ymm5307; AVX512F-NEXT:    vpsrlw %xmm3, %ymm5, %ymm5308; AVX512F-NEXT:    vpsrlw $1, %ymm0, %ymm6309; AVX512F-NEXT:    vpsrlw %xmm3, %ymm6, %ymm3310; AVX512F-NEXT:    vinserti64x4 $1, %ymm5, %zmm3, %zmm3311; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm1312; AVX512F-NEXT:    vpsllw %xmm1, %ymm4, %ymm2313; AVX512F-NEXT:    vpsllw %xmm1, %ymm0, %ymm0314; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0315; AVX512F-NEXT:    vporq %zmm3, %zmm0, %zmm0316; AVX512F-NEXT:    retq317;318; AVX512VL-LABEL: splatvar_funnnel_v32i16:319; AVX512VL:       # %bb.0:320; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [15,0,0,0,15,0,0,0]321; AVX512VL-NEXT:    vpandn %xmm2, %xmm1, %xmm3322; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm4323; AVX512VL-NEXT:    vpsrlw $1, %ymm4, %ymm5324; AVX512VL-NEXT:    vpsrlw %xmm3, %ymm5, %ymm5325; AVX512VL-NEXT:    vpsrlw $1, %ymm0, %ymm6326; AVX512VL-NEXT:    vpsrlw %xmm3, %ymm6, %ymm3327; AVX512VL-NEXT:    vinserti64x4 $1, %ymm5, %zmm3, %zmm3328; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm1329; AVX512VL-NEXT:    vpsllw %xmm1, %ymm4, %ymm2330; AVX512VL-NEXT:    vpsllw %xmm1, %ymm0, %ymm0331; AVX512VL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0332; AVX512VL-NEXT:    vporq %zmm3, %zmm0, %zmm0333; AVX512VL-NEXT:    retq334;335; AVX512BW-LABEL: splatvar_funnnel_v32i16:336; AVX512BW:       # %bb.0:337; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [15,0,0,0,15,0,0,0]338; AVX512BW-NEXT:    vpandn %xmm2, %xmm1, %xmm3339; AVX512BW-NEXT:    vpsrlw $1, %zmm0, %zmm4340; AVX512BW-NEXT:    vpsrlw %xmm3, %zmm4, %zmm3341; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm1342; AVX512BW-NEXT:    vpsllw %xmm1, %zmm0, %zmm0343; AVX512BW-NEXT:    vporq %zmm3, %zmm0, %zmm0344; AVX512BW-NEXT:    retq345;346; AVX512VLBW-LABEL: splatvar_funnnel_v32i16:347; AVX512VLBW:       # %bb.0:348; AVX512VLBW-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [15,0,0,0,15,0,0,0]349; AVX512VLBW-NEXT:    vpandn %xmm2, %xmm1, %xmm3350; AVX512VLBW-NEXT:    vpsrlw $1, %zmm0, %zmm4351; AVX512VLBW-NEXT:    vpsrlw %xmm3, %zmm4, %zmm3352; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm1353; AVX512VLBW-NEXT:    vpsllw %xmm1, %zmm0, %zmm0354; AVX512VLBW-NEXT:    vporq %zmm3, %zmm0, %zmm0355; AVX512VLBW-NEXT:    retq356;357; AVX512VBMI2-LABEL: splatvar_funnnel_v32i16:358; AVX512VBMI2:       # %bb.0:359; AVX512VBMI2-NEXT:    vpbroadcastw %xmm1, %zmm1360; AVX512VBMI2-NEXT:    vpshldvw %zmm1, %zmm0, %zmm0361; AVX512VBMI2-NEXT:    retq362;363; AVX512VLVBMI2-LABEL: splatvar_funnnel_v32i16:364; AVX512VLVBMI2:       # %bb.0:365; AVX512VLVBMI2-NEXT:    vpbroadcastw %xmm1, %zmm1366; AVX512VLVBMI2-NEXT:    vpshldvw %zmm1, %zmm0, %zmm0367; AVX512VLVBMI2-NEXT:    retq368  %splat = shufflevector <32 x i16> %amt, <32 x i16> undef, <32 x i32> zeroinitializer369  %res = call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %x, <32 x i16> %x, <32 x i16> %splat)370  ret <32 x i16> %res371}372 373define <64 x i8> @splatvar_funnnel_v64i8(<64 x i8> %x, <64 x i8> %amt) nounwind {374; AVX512F-LABEL: splatvar_funnnel_v64i8:375; AVX512F:       # %bb.0:376; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1377; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm2378; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm2[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]379; AVX512F-NEXT:    vpsllw %xmm1, %ymm3, %ymm3380; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3381; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[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]382; AVX512F-NEXT:    vpsllw %xmm1, %ymm2, %ymm2383; AVX512F-NEXT:    vpsrlw $8, %ymm2, %ymm2384; AVX512F-NEXT:    vpackuswb %ymm3, %ymm2, %ymm2385; AVX512F-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]386; AVX512F-NEXT:    vpsllw %xmm1, %ymm3, %ymm3387; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3388; AVX512F-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]389; AVX512F-NEXT:    vpsllw %xmm1, %ymm0, %ymm0390; AVX512F-NEXT:    vpsrlw $8, %ymm0, %ymm0391; AVX512F-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0392; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0393; AVX512F-NEXT:    retq394;395; AVX512VL-LABEL: splatvar_funnnel_v64i8:396; AVX512VL:       # %bb.0:397; AVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1398; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2399; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm2[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]400; AVX512VL-NEXT:    vpsllw %xmm1, %ymm3, %ymm3401; AVX512VL-NEXT:    vpsrlw $8, %ymm3, %ymm3402; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[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]403; AVX512VL-NEXT:    vpsllw %xmm1, %ymm2, %ymm2404; AVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2405; AVX512VL-NEXT:    vpackuswb %ymm3, %ymm2, %ymm2406; AVX512VL-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]407; AVX512VL-NEXT:    vpsllw %xmm1, %ymm3, %ymm3408; AVX512VL-NEXT:    vpsrlw $8, %ymm3, %ymm3409; AVX512VL-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]410; AVX512VL-NEXT:    vpsllw %xmm1, %ymm0, %ymm0411; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0412; AVX512VL-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0413; AVX512VL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0414; AVX512VL-NEXT:    retq415;416; AVX512BW-LABEL: splatvar_funnnel_v64i8:417; AVX512BW:       # %bb.0:418; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]419; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1420; AVX512BW-NEXT:    vpsllw %xmm1, %zmm2, %zmm2421; AVX512BW-NEXT:    vpsrlw $8, %zmm2, %zmm2422; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]423; AVX512BW-NEXT:    vpsllw %xmm1, %zmm0, %zmm0424; AVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0425; AVX512BW-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0426; AVX512BW-NEXT:    retq427;428; AVX512VLBW-LABEL: splatvar_funnnel_v64i8:429; AVX512VLBW:       # %bb.0:430; AVX512VLBW-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]431; AVX512VLBW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1432; AVX512VLBW-NEXT:    vpsllw %xmm1, %zmm2, %zmm2433; AVX512VLBW-NEXT:    vpsrlw $8, %zmm2, %zmm2434; AVX512VLBW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]435; AVX512VLBW-NEXT:    vpsllw %xmm1, %zmm0, %zmm0436; AVX512VLBW-NEXT:    vpsrlw $8, %zmm0, %zmm0437; AVX512VLBW-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0438; AVX512VLBW-NEXT:    retq439;440; AVX512VBMI2-LABEL: splatvar_funnnel_v64i8:441; AVX512VBMI2:       # %bb.0:442; AVX512VBMI2-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]443; AVX512VBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1444; AVX512VBMI2-NEXT:    vpsllw %xmm1, %zmm2, %zmm2445; AVX512VBMI2-NEXT:    vpsrlw $8, %zmm2, %zmm2446; AVX512VBMI2-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]447; AVX512VBMI2-NEXT:    vpsllw %xmm1, %zmm0, %zmm0448; AVX512VBMI2-NEXT:    vpsrlw $8, %zmm0, %zmm0449; AVX512VBMI2-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0450; AVX512VBMI2-NEXT:    retq451;452; AVX512VLVBMI2-LABEL: splatvar_funnnel_v64i8:453; AVX512VLVBMI2:       # %bb.0:454; AVX512VLVBMI2-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]455; AVX512VLVBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1456; AVX512VLVBMI2-NEXT:    vpsllw %xmm1, %zmm2, %zmm2457; AVX512VLVBMI2-NEXT:    vpsrlw $8, %zmm2, %zmm2458; AVX512VLVBMI2-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]459; AVX512VLVBMI2-NEXT:    vpsllw %xmm1, %zmm0, %zmm0460; AVX512VLVBMI2-NEXT:    vpsrlw $8, %zmm0, %zmm0461; AVX512VLVBMI2-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0462; AVX512VLVBMI2-NEXT:    retq463  %splat = shufflevector <64 x i8> %amt, <64 x i8> undef, <64 x i32> zeroinitializer464  %res = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %x, <64 x i8> %x, <64 x i8> %splat)465  ret <64 x i8> %res466}467 468;469; Constant Shifts470;471 472define <8 x i64> @constant_funnnel_v8i64(<8 x i64> %x) nounwind {473; AVX512-LABEL: constant_funnnel_v8i64:474; AVX512:       # %bb.0:475; AVX512-NEXT:    vprolvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0476; AVX512-NEXT:    retq477  %res = call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %x, <8 x i64> %x, <8 x i64> <i64 4, i64 14, i64 50, i64 60, i64 4, i64 14, i64 50, i64 60>)478  ret <8 x i64> %res479}480 481define <16 x i32> @constant_funnnel_v16i32(<16 x i32> %x) nounwind {482; AVX512-LABEL: constant_funnnel_v16i32:483; AVX512:       # %bb.0:484; AVX512-NEXT:    vprolvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0485; AVX512-NEXT:    retq486  %res = call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %x, <16 x i32> %x, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>)487  ret <16 x i32> %res488}489 490define <32 x i16> @constant_funnnel_v32i16(<32 x i16> %x) nounwind {491; AVX512F-LABEL: constant_funnnel_v32i16:492; AVX512F:       # %bb.0:493; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1494; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]495; AVX512F-NEXT:    vpmulhuw %ymm2, %ymm1, %ymm3496; AVX512F-NEXT:    vpmulhuw %ymm2, %ymm0, %ymm4497; AVX512F-NEXT:    vinserti64x4 $1, %ymm3, %zmm4, %zmm3498; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1499; AVX512F-NEXT:    vpmullw %ymm2, %ymm0, %ymm0500; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0501; AVX512F-NEXT:    vporq %zmm3, %zmm0, %zmm0502; AVX512F-NEXT:    retq503;504; AVX512VL-LABEL: constant_funnnel_v32i16:505; AVX512VL:       # %bb.0:506; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1507; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]508; AVX512VL-NEXT:    vpmulhuw %ymm2, %ymm1, %ymm3509; AVX512VL-NEXT:    vpmulhuw %ymm2, %ymm0, %ymm4510; AVX512VL-NEXT:    vinserti64x4 $1, %ymm3, %zmm4, %zmm3511; AVX512VL-NEXT:    vpmullw %ymm2, %ymm1, %ymm1512; AVX512VL-NEXT:    vpmullw %ymm2, %ymm0, %ymm0513; AVX512VL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0514; AVX512VL-NEXT:    vporq %zmm3, %zmm0, %zmm0515; AVX512VL-NEXT:    retq516;517; AVX512BW-LABEL: constant_funnnel_v32i16:518; AVX512BW:       # %bb.0:519; AVX512BW-NEXT:    vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm1520; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0521; AVX512BW-NEXT:    vporq %zmm1, %zmm0, %zmm0522; AVX512BW-NEXT:    retq523;524; AVX512VLBW-LABEL: constant_funnnel_v32i16:525; AVX512VLBW:       # %bb.0:526; AVX512VLBW-NEXT:    vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm1527; AVX512VLBW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0528; AVX512VLBW-NEXT:    vporq %zmm1, %zmm0, %zmm0529; AVX512VLBW-NEXT:    retq530;531; AVX512VBMI2-LABEL: constant_funnnel_v32i16:532; AVX512VBMI2:       # %bb.0:533; AVX512VBMI2-NEXT:    vpshldvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0534; AVX512VBMI2-NEXT:    retq535;536; AVX512VLVBMI2-LABEL: constant_funnnel_v32i16:537; AVX512VLVBMI2:       # %bb.0:538; AVX512VLVBMI2-NEXT:    vpshldvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0539; AVX512VLVBMI2-NEXT:    retq540  %res = call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %x, <32 x i16> %x, <32 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15, i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>)541  ret <32 x i16> %res542}543 544define <64 x i8> @constant_funnnel_v64i8(<64 x i8> %x) nounwind {545; AVX512F-LABEL: constant_funnnel_v64i8:546; AVX512F:       # %bb.0:547; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1548; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[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]549; AVX512F-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]550; AVX512F-NEXT:    # ymm3 = mem[0,1,0,1]551; AVX512F-NEXT:    vpmullw %ymm3, %ymm2, %ymm2552; AVX512F-NEXT:    vpsrlw $8, %ymm2, %ymm2553; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[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]554; AVX512F-NEXT:    vbroadcasti128 {{.*#+}} ymm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]555; AVX512F-NEXT:    # ymm4 = mem[0,1,0,1]556; AVX512F-NEXT:    vpmullw %ymm4, %ymm1, %ymm1557; AVX512F-NEXT:    vpsrlw $8, %ymm1, %ymm1558; AVX512F-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1559; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm2 = 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]560; AVX512F-NEXT:    vpmullw %ymm3, %ymm2, %ymm2561; AVX512F-NEXT:    vpsrlw $8, %ymm2, %ymm2562; AVX512F-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]563; AVX512F-NEXT:    vpmullw %ymm4, %ymm0, %ymm0564; AVX512F-NEXT:    vpsrlw $8, %ymm0, %ymm0565; AVX512F-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0566; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0567; AVX512F-NEXT:    retq568;569; AVX512VL-LABEL: constant_funnnel_v64i8:570; AVX512VL:       # %bb.0:571; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1572; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[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]573; AVX512VL-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]574; AVX512VL-NEXT:    # ymm3 = mem[0,1,0,1]575; AVX512VL-NEXT:    vpmullw %ymm3, %ymm2, %ymm2576; AVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2577; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[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]578; AVX512VL-NEXT:    vbroadcasti128 {{.*#+}} ymm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]579; AVX512VL-NEXT:    # ymm4 = mem[0,1,0,1]580; AVX512VL-NEXT:    vpmullw %ymm4, %ymm1, %ymm1581; AVX512VL-NEXT:    vpsrlw $8, %ymm1, %ymm1582; AVX512VL-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1583; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = 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]584; AVX512VL-NEXT:    vpmullw %ymm3, %ymm2, %ymm2585; AVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2586; AVX512VL-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]587; AVX512VL-NEXT:    vpmullw %ymm4, %ymm0, %ymm0588; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0589; AVX512VL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0590; AVX512VL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0591; AVX512VL-NEXT:    retq592;593; AVX512BW-LABEL: constant_funnnel_v64i8:594; AVX512BW:       # %bb.0:595; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm1 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]596; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1597; AVX512BW-NEXT:    vpsrlw $8, %zmm1, %zmm1598; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]599; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0600; AVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0601; AVX512BW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0602; AVX512BW-NEXT:    retq603;604; AVX512VLBW-LABEL: constant_funnnel_v64i8:605; AVX512VLBW:       # %bb.0:606; AVX512VLBW-NEXT:    vpunpckhbw {{.*#+}} zmm1 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]607; AVX512VLBW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1608; AVX512VLBW-NEXT:    vpsrlw $8, %zmm1, %zmm1609; AVX512VLBW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]610; AVX512VLBW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0611; AVX512VLBW-NEXT:    vpsrlw $8, %zmm0, %zmm0612; AVX512VLBW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0613; AVX512VLBW-NEXT:    retq614;615; AVX512VBMI2-LABEL: constant_funnnel_v64i8:616; AVX512VBMI2:       # %bb.0:617; AVX512VBMI2-NEXT:    vpunpckhbw {{.*#+}} zmm1 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]618; AVX512VBMI2-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1619; AVX512VBMI2-NEXT:    vpsrlw $8, %zmm1, %zmm1620; AVX512VBMI2-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]621; AVX512VBMI2-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0622; AVX512VBMI2-NEXT:    vpsrlw $8, %zmm0, %zmm0623; AVX512VBMI2-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0624; AVX512VBMI2-NEXT:    retq625;626; AVX512VLVBMI2-LABEL: constant_funnnel_v64i8:627; AVX512VLVBMI2:       # %bb.0:628; AVX512VLVBMI2-NEXT:    vpunpckhbw {{.*#+}} zmm1 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]629; AVX512VLVBMI2-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1630; AVX512VLVBMI2-NEXT:    vpsrlw $8, %zmm1, %zmm1631; AVX512VLVBMI2-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]632; AVX512VLVBMI2-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0633; AVX512VLVBMI2-NEXT:    vpsrlw $8, %zmm0, %zmm0634; AVX512VLVBMI2-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0635; AVX512VLVBMI2-NEXT:    retq636  %res = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %x, <64 x i8> %x, <64 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>)637  ret <64 x i8> %res638}639 640;641; Uniform Constant Shifts642;643 644define <8 x i64> @splatconstant_funnnel_v8i64(<8 x i64> %x) nounwind {645; AVX512-LABEL: splatconstant_funnnel_v8i64:646; AVX512:       # %bb.0:647; AVX512-NEXT:    vprolq $14, %zmm0, %zmm0648; AVX512-NEXT:    retq649  %res = call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %x, <8 x i64> %x, <8 x i64> <i64 14, i64 14, i64 14, i64 14, i64 14, i64 14, i64 14, i64 14>)650  ret <8 x i64> %res651}652 653define <16 x i32> @splatconstant_funnnel_v16i32(<16 x i32> %x) nounwind {654; AVX512-LABEL: splatconstant_funnnel_v16i32:655; AVX512:       # %bb.0:656; AVX512-NEXT:    vprold $4, %zmm0, %zmm0657; AVX512-NEXT:    retq658  %res = call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %x, <16 x i32> %x, <16 x i32> <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>)659  ret <16 x i32> %res660}661 662define <32 x i16> @splatconstant_funnnel_v32i16(<32 x i16> %x) nounwind {663; AVX512F-LABEL: splatconstant_funnnel_v32i16:664; AVX512F:       # %bb.0:665; AVX512F-NEXT:    vpsrlw $9, %ymm0, %ymm1666; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm2667; AVX512F-NEXT:    vpsrlw $9, %ymm2, %ymm3668; AVX512F-NEXT:    vinserti64x4 $1, %ymm3, %zmm1, %zmm1669; AVX512F-NEXT:    vpsllw $7, %ymm0, %ymm0670; AVX512F-NEXT:    vpsllw $7, %ymm2, %ymm2671; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0672; AVX512F-NEXT:    vporq %zmm1, %zmm0, %zmm0673; AVX512F-NEXT:    retq674;675; AVX512VL-LABEL: splatconstant_funnnel_v32i16:676; AVX512VL:       # %bb.0:677; AVX512VL-NEXT:    vpsrlw $9, %ymm0, %ymm1678; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2679; AVX512VL-NEXT:    vpsrlw $9, %ymm2, %ymm3680; AVX512VL-NEXT:    vinserti64x4 $1, %ymm3, %zmm1, %zmm1681; AVX512VL-NEXT:    vpsllw $7, %ymm0, %ymm0682; AVX512VL-NEXT:    vpsllw $7, %ymm2, %ymm2683; AVX512VL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0684; AVX512VL-NEXT:    vporq %zmm1, %zmm0, %zmm0685; AVX512VL-NEXT:    retq686;687; AVX512BW-LABEL: splatconstant_funnnel_v32i16:688; AVX512BW:       # %bb.0:689; AVX512BW-NEXT:    vpsrlw $9, %zmm0, %zmm1690; AVX512BW-NEXT:    vpsllw $7, %zmm0, %zmm0691; AVX512BW-NEXT:    vporq %zmm1, %zmm0, %zmm0692; AVX512BW-NEXT:    retq693;694; AVX512VLBW-LABEL: splatconstant_funnnel_v32i16:695; AVX512VLBW:       # %bb.0:696; AVX512VLBW-NEXT:    vpsrlw $9, %zmm0, %zmm1697; AVX512VLBW-NEXT:    vpsllw $7, %zmm0, %zmm0698; AVX512VLBW-NEXT:    vporq %zmm1, %zmm0, %zmm0699; AVX512VLBW-NEXT:    retq700;701; AVX512VBMI2-LABEL: splatconstant_funnnel_v32i16:702; AVX512VBMI2:       # %bb.0:703; AVX512VBMI2-NEXT:    vpshldw $7, %zmm0, %zmm0, %zmm0704; AVX512VBMI2-NEXT:    retq705;706; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v32i16:707; AVX512VLVBMI2:       # %bb.0:708; AVX512VLVBMI2-NEXT:    vpshldw $7, %zmm0, %zmm0, %zmm0709; AVX512VLVBMI2-NEXT:    retq710  %res = call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %x, <32 x i16> %x, <32 x i16> <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>)711  ret <32 x i16> %res712}713 714define <64 x i8> @splatconstant_funnnel_v64i8(<64 x i8> %x) nounwind {715; AVX512F-LABEL: splatconstant_funnnel_v64i8:716; AVX512F:       # %bb.0:717; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm1718; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm2719; AVX512F-NEXT:    vpsllw $4, %ymm2, %ymm3720; AVX512F-NEXT:    vinserti64x4 $1, %ymm3, %zmm1, %zmm1721; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm0722; AVX512F-NEXT:    vpsrlw $4, %ymm2, %ymm2723; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0724; AVX512F-NEXT:    vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))725; AVX512F-NEXT:    retq726;727; AVX512VL-LABEL: splatconstant_funnnel_v64i8:728; AVX512VL:       # %bb.0:729; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm1730; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2731; AVX512VL-NEXT:    vpsllw $4, %ymm2, %ymm3732; AVX512VL-NEXT:    vinserti64x4 $1, %ymm3, %zmm1, %zmm1733; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm0734; AVX512VL-NEXT:    vpsrlw $4, %ymm2, %ymm2735; AVX512VL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0736; AVX512VL-NEXT:    vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))737; AVX512VL-NEXT:    retq738;739; AVX512BW-LABEL: splatconstant_funnnel_v64i8:740; AVX512BW:       # %bb.0:741; AVX512BW-NEXT:    vpsllw $4, %zmm0, %zmm1742; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0743; AVX512BW-NEXT:    vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))744; AVX512BW-NEXT:    retq745;746; AVX512VLBW-LABEL: splatconstant_funnnel_v64i8:747; AVX512VLBW:       # %bb.0:748; AVX512VLBW-NEXT:    vpsllw $4, %zmm0, %zmm1749; AVX512VLBW-NEXT:    vpsrlw $4, %zmm0, %zmm0750; AVX512VLBW-NEXT:    vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))751; AVX512VLBW-NEXT:    retq752;753; AVX512VBMI2-LABEL: splatconstant_funnnel_v64i8:754; AVX512VBMI2:       # %bb.0:755; AVX512VBMI2-NEXT:    vpsllw $4, %zmm0, %zmm1756; AVX512VBMI2-NEXT:    vpsrlw $4, %zmm0, %zmm0757; AVX512VBMI2-NEXT:    vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))758; AVX512VBMI2-NEXT:    retq759;760; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v64i8:761; AVX512VLVBMI2:       # %bb.0:762; AVX512VLVBMI2-NEXT:    vpsllw $4, %zmm0, %zmm1763; AVX512VLVBMI2-NEXT:    vpsrlw $4, %zmm0, %zmm0764; AVX512VLVBMI2-NEXT:    vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))765; AVX512VLVBMI2-NEXT:    retq766  %res = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %x, <64 x i8> %x, <64 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, 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>)767  ret <64 x i8> %res768}769