1703 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX24; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512F5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefix=AVX512VL6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=AVX512BW7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=AVX512VLBW8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2 | FileCheck %s --check-prefix=AVX512VBMI29; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2,+avx512vl | FileCheck %s --check-prefix=AVX512VLVBMI210; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=XOPAVX111; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=XOPAVX212 13declare <4 x i64> @llvm.fshl.v4i64(<4 x i64>, <4 x i64>, <4 x i64>)14declare <8 x i32> @llvm.fshl.v8i32(<8 x i32>, <8 x i32>, <8 x i32>)15declare <16 x i16> @llvm.fshl.v16i16(<16 x i16>, <16 x i16>, <16 x i16>)16declare <32 x i8> @llvm.fshl.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)17 18;19; Variable Shifts20;21 22define <4 x i64> @var_funnnel_v4i64(<4 x i64> %x, <4 x i64> %amt) nounwind {23; AVX1-LABEL: var_funnnel_v4i64:24; AVX1: # %bb.0:25; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [63,63,63,63]26; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm327; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm428; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm529; AVX1-NEXT: vpsllq %xmm4, %xmm5, %xmm630; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]31; AVX1-NEXT: vpsllq %xmm4, %xmm5, %xmm432; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm6[0,1,2,3],xmm4[4,5,6,7]33; AVX1-NEXT: vpsllq %xmm3, %xmm0, %xmm634; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]35; AVX1-NEXT: vpsllq %xmm3, %xmm0, %xmm336; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm6[0,1,2,3],xmm3[4,5,6,7]37; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm338; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm439; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm640; AVX1-NEXT: vpsubq %xmm4, %xmm6, %xmm441; AVX1-NEXT: vpand %xmm2, %xmm4, %xmm442; AVX1-NEXT: vpsrlq %xmm4, %xmm5, %xmm743; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]44; AVX1-NEXT: vpsrlq %xmm4, %xmm5, %xmm445; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm7[0,1,2,3],xmm4[4,5,6,7]46; AVX1-NEXT: vpsubq %xmm1, %xmm6, %xmm147; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm148; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm249; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]50; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm051; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]52; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm053; AVX1-NEXT: vorps %ymm0, %ymm3, %ymm054; AVX1-NEXT: retq55;56; AVX2-LABEL: var_funnnel_v4i64:57; AVX2: # %bb.0:58; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [63,63,63,63]59; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm360; AVX2-NEXT: vpsllvq %ymm3, %ymm0, %ymm361; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm462; AVX2-NEXT: vpsubq %ymm1, %ymm4, %ymm163; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm164; AVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm065; AVX2-NEXT: vpor %ymm0, %ymm3, %ymm066; AVX2-NEXT: retq67;68; AVX512F-LABEL: var_funnnel_v4i64:69; AVX512F: # %bb.0:70; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm171; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm072; AVX512F-NEXT: vprolvq %zmm1, %zmm0, %zmm073; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm074; AVX512F-NEXT: retq75;76; AVX512VL-LABEL: var_funnnel_v4i64:77; AVX512VL: # %bb.0:78; AVX512VL-NEXT: vprolvq %ymm1, %ymm0, %ymm079; AVX512VL-NEXT: retq80;81; AVX512BW-LABEL: var_funnnel_v4i64:82; AVX512BW: # %bb.0:83; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm184; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm085; AVX512BW-NEXT: vprolvq %zmm1, %zmm0, %zmm086; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm087; AVX512BW-NEXT: retq88;89; AVX512VLBW-LABEL: var_funnnel_v4i64:90; AVX512VLBW: # %bb.0:91; AVX512VLBW-NEXT: vprolvq %ymm1, %ymm0, %ymm092; AVX512VLBW-NEXT: retq93;94; AVX512VBMI2-LABEL: var_funnnel_v4i64:95; AVX512VBMI2: # %bb.0:96; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm197; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm098; AVX512VBMI2-NEXT: vprolvq %zmm1, %zmm0, %zmm099; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0100; AVX512VBMI2-NEXT: retq101;102; AVX512VLVBMI2-LABEL: var_funnnel_v4i64:103; AVX512VLVBMI2: # %bb.0:104; AVX512VLVBMI2-NEXT: vprolvq %ymm1, %ymm0, %ymm0105; AVX512VLVBMI2-NEXT: retq106;107; XOPAVX1-LABEL: var_funnnel_v4i64:108; XOPAVX1: # %bb.0:109; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2110; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3111; XOPAVX1-NEXT: vprotq %xmm2, %xmm3, %xmm2112; XOPAVX1-NEXT: vprotq %xmm1, %xmm0, %xmm0113; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0114; XOPAVX1-NEXT: retq115;116; XOPAVX2-LABEL: var_funnnel_v4i64:117; XOPAVX2: # %bb.0:118; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2119; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3120; XOPAVX2-NEXT: vprotq %xmm2, %xmm3, %xmm2121; XOPAVX2-NEXT: vprotq %xmm1, %xmm0, %xmm0122; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0123; XOPAVX2-NEXT: retq124 %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %x, <4 x i64> %amt)125 ret <4 x i64> %res126}127 128define <8 x i32> @var_funnnel_v8i32(<8 x i32> %x, <8 x i32> %amt) nounwind {129; AVX1-LABEL: var_funnnel_v8i32:130; AVX1: # %bb.0:131; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2132; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]133; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2134; AVX1-NEXT: vpslld $23, %xmm2, %xmm2135; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]136; AVX1-NEXT: vpaddd %xmm4, %xmm2, %xmm2137; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2138; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]139; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6140; AVX1-NEXT: vpshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]141; AVX1-NEXT: vpmuludq %xmm5, %xmm7, %xmm5142; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1143; AVX1-NEXT: vpslld $23, %xmm1, %xmm1144; AVX1-NEXT: vpaddd %xmm4, %xmm1, %xmm1145; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1146; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]147; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]148; AVX1-NEXT: vpmuludq %xmm3, %xmm4, %xmm3149; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm3, %ymm3150; AVX1-NEXT: vpmuludq %xmm2, %xmm6, %xmm2151; AVX1-NEXT: vpmuludq %xmm1, %xmm0, %xmm0152; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0153; AVX1-NEXT: vmovshdup {{.*#+}} ymm1 = ymm0[1,1,3,3,5,5,7,7]154; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0],ymm3[1],ymm1[2],ymm3[3],ymm1[4],ymm3[5],ymm1[6],ymm3[7]155; AVX1-NEXT: vmovsldup {{.*#+}} ymm2 = ymm3[0,0,2,2,4,4,6,6]156; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm2[1],ymm0[2],ymm2[3],ymm0[4],ymm2[5],ymm0[6],ymm2[7]157; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0158; AVX1-NEXT: retq159;160; AVX2-LABEL: var_funnnel_v8i32:161; AVX2: # %bb.0:162; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [31,31,31,31,31,31,31,31]163; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1164; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm2165; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm3 = [32,32,32,32,32,32,32,32]166; AVX2-NEXT: vpsubd %ymm1, %ymm3, %ymm1167; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0168; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0169; AVX2-NEXT: retq170;171; AVX512F-LABEL: var_funnnel_v8i32:172; AVX512F: # %bb.0:173; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1174; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0175; AVX512F-NEXT: vprolvd %zmm1, %zmm0, %zmm0176; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0177; AVX512F-NEXT: retq178;179; AVX512VL-LABEL: var_funnnel_v8i32:180; AVX512VL: # %bb.0:181; AVX512VL-NEXT: vprolvd %ymm1, %ymm0, %ymm0182; AVX512VL-NEXT: retq183;184; AVX512BW-LABEL: var_funnnel_v8i32:185; AVX512BW: # %bb.0:186; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1187; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0188; AVX512BW-NEXT: vprolvd %zmm1, %zmm0, %zmm0189; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0190; AVX512BW-NEXT: retq191;192; AVX512VLBW-LABEL: var_funnnel_v8i32:193; AVX512VLBW: # %bb.0:194; AVX512VLBW-NEXT: vprolvd %ymm1, %ymm0, %ymm0195; AVX512VLBW-NEXT: retq196;197; AVX512VBMI2-LABEL: var_funnnel_v8i32:198; AVX512VBMI2: # %bb.0:199; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1200; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0201; AVX512VBMI2-NEXT: vprolvd %zmm1, %zmm0, %zmm0202; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0203; AVX512VBMI2-NEXT: retq204;205; AVX512VLVBMI2-LABEL: var_funnnel_v8i32:206; AVX512VLVBMI2: # %bb.0:207; AVX512VLVBMI2-NEXT: vprolvd %ymm1, %ymm0, %ymm0208; AVX512VLVBMI2-NEXT: retq209;210; XOPAVX1-LABEL: var_funnnel_v8i32:211; XOPAVX1: # %bb.0:212; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2213; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3214; XOPAVX1-NEXT: vprotd %xmm2, %xmm3, %xmm2215; XOPAVX1-NEXT: vprotd %xmm1, %xmm0, %xmm0216; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0217; XOPAVX1-NEXT: retq218;219; XOPAVX2-LABEL: var_funnnel_v8i32:220; XOPAVX2: # %bb.0:221; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2222; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3223; XOPAVX2-NEXT: vprotd %xmm2, %xmm3, %xmm2224; XOPAVX2-NEXT: vprotd %xmm1, %xmm0, %xmm0225; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0226; XOPAVX2-NEXT: retq227 %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %x, <8 x i32> %amt)228 ret <8 x i32> %res229}230 231define <16 x i16> @var_funnnel_v16i16(<16 x i16> %x, <16 x i16> %amt) nounwind {232; AVX1-LABEL: var_funnnel_v16i16:233; AVX1: # %bb.0:234; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2235; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]236; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2237; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm4 = xmm2[4,4,5,5,6,6,7,7]238; AVX1-NEXT: vpslld $23, %xmm4, %xmm4239; AVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]240; AVX1-NEXT: vpaddd %xmm5, %xmm4, %xmm4241; AVX1-NEXT: vcvttps2dq %xmm4, %xmm4242; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero243; AVX1-NEXT: vpslld $23, %xmm2, %xmm2244; AVX1-NEXT: vpaddd %xmm5, %xmm2, %xmm2245; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2246; AVX1-NEXT: vpackusdw %xmm4, %xmm2, %xmm2247; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4248; AVX1-NEXT: vpmulhuw %xmm2, %xmm4, %xmm6249; AVX1-NEXT: vpmullw %xmm2, %xmm4, %xmm2250; AVX1-NEXT: vpor %xmm6, %xmm2, %xmm2251; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1252; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm1[4,4,5,5,6,6,7,7]253; AVX1-NEXT: vpslld $23, %xmm3, %xmm3254; AVX1-NEXT: vpaddd %xmm5, %xmm3, %xmm3255; AVX1-NEXT: vcvttps2dq %xmm3, %xmm3256; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero257; AVX1-NEXT: vpslld $23, %xmm1, %xmm1258; AVX1-NEXT: vpaddd %xmm5, %xmm1, %xmm1259; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1260; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1261; AVX1-NEXT: vpmulhuw %xmm1, %xmm0, %xmm3262; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0263; AVX1-NEXT: vpor %xmm3, %xmm0, %xmm0264; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0265; AVX1-NEXT: retq266;267; AVX2-LABEL: var_funnnel_v16i16:268; AVX2: # %bb.0:269; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1270; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2271; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]272; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]273; AVX2-NEXT: vpsllvd %ymm3, %ymm4, %ymm3274; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3275; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]276; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]277; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0278; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0279; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0280; AVX2-NEXT: retq281;282; AVX512F-LABEL: var_funnnel_v16i16:283; AVX512F: # %bb.0:284; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1285; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2286; AVX512F-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]287; AVX512F-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]288; AVX512F-NEXT: vpsllvd %ymm3, %ymm4, %ymm3289; AVX512F-NEXT: vpsrld $16, %ymm3, %ymm3290; AVX512F-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]291; AVX512F-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]292; AVX512F-NEXT: vpsllvd %ymm1, %ymm0, %ymm0293; AVX512F-NEXT: vpsrld $16, %ymm0, %ymm0294; AVX512F-NEXT: vpackusdw %ymm3, %ymm0, %ymm0295; AVX512F-NEXT: retq296;297; AVX512VL-LABEL: var_funnnel_v16i16:298; AVX512VL: # %bb.0:299; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1300; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm2301; AVX512VL-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]302; AVX512VL-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]303; AVX512VL-NEXT: vpsllvd %ymm3, %ymm4, %ymm3304; AVX512VL-NEXT: vpsrld $16, %ymm3, %ymm3305; AVX512VL-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]306; AVX512VL-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]307; AVX512VL-NEXT: vpsllvd %ymm1, %ymm0, %ymm0308; AVX512VL-NEXT: vpsrld $16, %ymm0, %ymm0309; AVX512VL-NEXT: vpackusdw %ymm3, %ymm0, %ymm0310; AVX512VL-NEXT: retq311;312; AVX512BW-LABEL: var_funnnel_v16i16:313; AVX512BW: # %bb.0:314; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0315; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1316; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm2317; AVX512BW-NEXT: vpbroadcastw {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]318; AVX512BW-NEXT: vpsubw %ymm1, %ymm3, %ymm1319; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0320; AVX512BW-NEXT: vpor %ymm0, %ymm2, %ymm0321; AVX512BW-NEXT: retq322;323; AVX512VLBW-LABEL: var_funnnel_v16i16:324; AVX512VLBW: # %bb.0:325; AVX512VLBW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1326; AVX512VLBW-NEXT: vpsllvw %ymm1, %ymm0, %ymm2327; AVX512VLBW-NEXT: vpbroadcastw {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]328; AVX512VLBW-NEXT: vpsubw %ymm1, %ymm3, %ymm1329; AVX512VLBW-NEXT: vpsrlvw %ymm1, %ymm0, %ymm0330; AVX512VLBW-NEXT: vpor %ymm0, %ymm2, %ymm0331; AVX512VLBW-NEXT: retq332;333; AVX512VBMI2-LABEL: var_funnnel_v16i16:334; AVX512VBMI2: # %bb.0:335; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1336; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0337; AVX512VBMI2-NEXT: vpshldvw %zmm1, %zmm0, %zmm0338; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0339; AVX512VBMI2-NEXT: retq340;341; AVX512VLVBMI2-LABEL: var_funnnel_v16i16:342; AVX512VLVBMI2: # %bb.0:343; AVX512VLVBMI2-NEXT: vpshldvw %ymm1, %ymm0, %ymm0344; AVX512VLVBMI2-NEXT: retq345;346; XOPAVX1-LABEL: var_funnnel_v16i16:347; XOPAVX1: # %bb.0:348; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2349; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3350; XOPAVX1-NEXT: vprotw %xmm2, %xmm3, %xmm2351; XOPAVX1-NEXT: vprotw %xmm1, %xmm0, %xmm0352; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0353; XOPAVX1-NEXT: retq354;355; XOPAVX2-LABEL: var_funnnel_v16i16:356; XOPAVX2: # %bb.0:357; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2358; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3359; XOPAVX2-NEXT: vprotw %xmm2, %xmm3, %xmm2360; XOPAVX2-NEXT: vprotw %xmm1, %xmm0, %xmm0361; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0362; XOPAVX2-NEXT: retq363 %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %x, <16 x i16> %amt)364 ret <16 x i16> %res365}366 367define <32 x i8> @var_funnnel_v32i8(<32 x i8> %x, <32 x i8> %amt) nounwind {368; AVX1-LABEL: var_funnnel_v32i8:369; AVX1: # %bb.0:370; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2371; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm3372; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]373; AVX1-NEXT: vpandn %xmm3, %xmm4, %xmm3374; AVX1-NEXT: vpsllw $4, %xmm2, %xmm5375; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm5376; AVX1-NEXT: vpor %xmm3, %xmm5, %xmm3377; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5378; AVX1-NEXT: vpsllw $5, %xmm5, %xmm5379; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2380; AVX1-NEXT: vpsrlw $6, %xmm2, %xmm3381; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]382; AVX1-NEXT: vpandn %xmm3, %xmm6, %xmm3383; AVX1-NEXT: vpsllw $2, %xmm2, %xmm7384; AVX1-NEXT: vpand %xmm6, %xmm7, %xmm7385; AVX1-NEXT: vpor %xmm3, %xmm7, %xmm3386; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5387; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2388; AVX1-NEXT: vpsrlw $7, %xmm2, %xmm3389; AVX1-NEXT: vbroadcastss {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]390; AVX1-NEXT: vpand %xmm7, %xmm3, %xmm3391; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm8392; AVX1-NEXT: vpor %xmm3, %xmm8, %xmm3393; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5394; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2395; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm3396; AVX1-NEXT: vpandn %xmm3, %xmm4, %xmm3397; AVX1-NEXT: vpsllw $4, %xmm0, %xmm5398; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm4399; AVX1-NEXT: vpor %xmm3, %xmm4, %xmm3400; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1401; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0402; AVX1-NEXT: vpsrlw $6, %xmm0, %xmm3403; AVX1-NEXT: vpandn %xmm3, %xmm6, %xmm3404; AVX1-NEXT: vpsllw $2, %xmm0, %xmm4405; AVX1-NEXT: vpand %xmm6, %xmm4, %xmm4406; AVX1-NEXT: vpor %xmm3, %xmm4, %xmm3407; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1408; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0409; AVX1-NEXT: vpsrlw $7, %xmm0, %xmm3410; AVX1-NEXT: vpand %xmm7, %xmm3, %xmm3411; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm4412; AVX1-NEXT: vpor %xmm3, %xmm4, %xmm3413; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1414; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0415; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0416; AVX1-NEXT: retq417;418; AVX2-LABEL: var_funnnel_v32i8:419; AVX2: # %bb.0:420; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm2421; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2422; AVX2-NEXT: vpsllw $4, %ymm0, %ymm3423; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3424; AVX2-NEXT: vpor %ymm2, %ymm3, %ymm2425; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1426; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0427; AVX2-NEXT: vpsrlw $6, %ymm0, %ymm2428; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2429; AVX2-NEXT: vpsllw $2, %ymm0, %ymm3430; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3431; AVX2-NEXT: vpor %ymm2, %ymm3, %ymm2432; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1433; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0434; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2435; AVX2-NEXT: vpsrlw $7, %ymm0, %ymm3436; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3437; AVX2-NEXT: vpor %ymm3, %ymm2, %ymm2438; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1439; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0440; AVX2-NEXT: retq441;442; AVX512F-LABEL: var_funnnel_v32i8:443; AVX512F: # %bb.0:444; AVX512F-NEXT: vpsllw $4, %ymm0, %ymm2445; AVX512F-NEXT: vpsrlw $4, %ymm0, %ymm3446; AVX512F-NEXT: vpternlogd {{.*#+}} zmm3 = zmm3 ^ (m32bcst & (zmm3 ^ zmm2))447; AVX512F-NEXT: vpsllw $5, %ymm1, %ymm1448; AVX512F-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0449; AVX512F-NEXT: vpsllw $2, %ymm0, %ymm2450; AVX512F-NEXT: vpsrlw $6, %ymm0, %ymm3451; AVX512F-NEXT: vpternlogd {{.*#+}} zmm3 = zmm3 ^ (m32bcst & (zmm3 ^ zmm2))452; AVX512F-NEXT: vpaddb %ymm1, %ymm1, %ymm1453; AVX512F-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0454; AVX512F-NEXT: vpaddb %ymm0, %ymm0, %ymm2455; AVX512F-NEXT: vpsrlw $7, %ymm0, %ymm3456; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3457; AVX512F-NEXT: vpor %ymm3, %ymm2, %ymm2458; AVX512F-NEXT: vpaddb %ymm1, %ymm1, %ymm1459; AVX512F-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0460; AVX512F-NEXT: retq461;462; AVX512VL-LABEL: var_funnnel_v32i8:463; AVX512VL: # %bb.0:464; AVX512VL-NEXT: vpsllw $4, %ymm0, %ymm2465; AVX512VL-NEXT: vpsrlw $4, %ymm0, %ymm3466; AVX512VL-NEXT: vpternlogd {{.*#+}} ymm3 = ymm3 ^ (m32bcst & (ymm3 ^ ymm2))467; AVX512VL-NEXT: vpsllw $5, %ymm1, %ymm1468; AVX512VL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0469; AVX512VL-NEXT: vpsllw $2, %ymm0, %ymm2470; AVX512VL-NEXT: vpsrlw $6, %ymm0, %ymm3471; AVX512VL-NEXT: vpternlogd {{.*#+}} ymm3 = ymm3 ^ (m32bcst & (ymm3 ^ ymm2))472; AVX512VL-NEXT: vpaddb %ymm1, %ymm1, %ymm1473; AVX512VL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0474; AVX512VL-NEXT: vpsrlw $7, %ymm0, %ymm2475; AVX512VL-NEXT: vpaddb %ymm0, %ymm0, %ymm3476; AVX512VL-NEXT: vpternlogd {{.*#+}} ymm3 = ymm3 | (ymm2 & m32bcst)477; AVX512VL-NEXT: vpaddb %ymm1, %ymm1, %ymm1478; AVX512VL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0479; AVX512VL-NEXT: retq480;481; AVX512BW-LABEL: var_funnnel_v32i8:482; AVX512BW: # %bb.0:483; AVX512BW-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]484; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1485; AVX512BW-NEXT: vpxor %xmm3, %xmm3, %xmm3486; AVX512BW-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm3[8],ymm1[9],ymm3[9],ymm1[10],ymm3[10],ymm1[11],ymm3[11],ymm1[12],ymm3[12],ymm1[13],ymm3[13],ymm1[14],ymm3[14],ymm1[15],ymm3[15],ymm1[24],ymm3[24],ymm1[25],ymm3[25],ymm1[26],ymm3[26],ymm1[27],ymm3[27],ymm1[28],ymm3[28],ymm1[29],ymm3[29],ymm1[30],ymm3[30],ymm1[31],ymm3[31]487; AVX512BW-NEXT: vpsllvw %zmm4, %zmm2, %zmm2488; AVX512BW-NEXT: vpsrlw $8, %ymm2, %ymm2489; AVX512BW-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]490; AVX512BW-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm3[0],ymm1[1],ymm3[1],ymm1[2],ymm3[2],ymm1[3],ymm3[3],ymm1[4],ymm3[4],ymm1[5],ymm3[5],ymm1[6],ymm3[6],ymm1[7],ymm3[7],ymm1[16],ymm3[16],ymm1[17],ymm3[17],ymm1[18],ymm3[18],ymm1[19],ymm3[19],ymm1[20],ymm3[20],ymm1[21],ymm3[21],ymm1[22],ymm3[22],ymm1[23],ymm3[23]491; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0492; AVX512BW-NEXT: vpsrlw $8, %ymm0, %ymm0493; AVX512BW-NEXT: vpackuswb %ymm2, %ymm0, %ymm0494; AVX512BW-NEXT: retq495;496; AVX512VLBW-LABEL: var_funnnel_v32i8:497; AVX512VLBW: # %bb.0:498; AVX512VLBW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1499; AVX512VLBW-NEXT: vpxor %xmm2, %xmm2, %xmm2500; AVX512VLBW-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15],ymm1[24],ymm2[24],ymm1[25],ymm2[25],ymm1[26],ymm2[26],ymm1[27],ymm2[27],ymm1[28],ymm2[28],ymm1[29],ymm2[29],ymm1[30],ymm2[30],ymm1[31],ymm2[31]501; AVX512VLBW-NEXT: vpunpckhbw {{.*#+}} ymm4 = 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]502; AVX512VLBW-NEXT: vpsllvw %ymm3, %ymm4, %ymm3503; AVX512VLBW-NEXT: vpsrlw $8, %ymm3, %ymm3504; AVX512VLBW-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[16],ymm2[16],ymm1[17],ymm2[17],ymm1[18],ymm2[18],ymm1[19],ymm2[19],ymm1[20],ymm2[20],ymm1[21],ymm2[21],ymm1[22],ymm2[22],ymm1[23],ymm2[23]505; AVX512VLBW-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]506; AVX512VLBW-NEXT: vpsllvw %ymm1, %ymm0, %ymm0507; AVX512VLBW-NEXT: vpsrlw $8, %ymm0, %ymm0508; AVX512VLBW-NEXT: vpackuswb %ymm3, %ymm0, %ymm0509; AVX512VLBW-NEXT: retq510;511; AVX512VBMI2-LABEL: var_funnnel_v32i8:512; AVX512VBMI2: # %bb.0:513; AVX512VBMI2-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]514; AVX512VBMI2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1515; AVX512VBMI2-NEXT: vpxor %xmm3, %xmm3, %xmm3516; AVX512VBMI2-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm3[8],ymm1[9],ymm3[9],ymm1[10],ymm3[10],ymm1[11],ymm3[11],ymm1[12],ymm3[12],ymm1[13],ymm3[13],ymm1[14],ymm3[14],ymm1[15],ymm3[15],ymm1[24],ymm3[24],ymm1[25],ymm3[25],ymm1[26],ymm3[26],ymm1[27],ymm3[27],ymm1[28],ymm3[28],ymm1[29],ymm3[29],ymm1[30],ymm3[30],ymm1[31],ymm3[31]517; AVX512VBMI2-NEXT: vpsllvw %zmm4, %zmm2, %zmm2518; AVX512VBMI2-NEXT: vpsrlw $8, %ymm2, %ymm2519; AVX512VBMI2-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]520; AVX512VBMI2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm3[0],ymm1[1],ymm3[1],ymm1[2],ymm3[2],ymm1[3],ymm3[3],ymm1[4],ymm3[4],ymm1[5],ymm3[5],ymm1[6],ymm3[6],ymm1[7],ymm3[7],ymm1[16],ymm3[16],ymm1[17],ymm3[17],ymm1[18],ymm3[18],ymm1[19],ymm3[19],ymm1[20],ymm3[20],ymm1[21],ymm3[21],ymm1[22],ymm3[22],ymm1[23],ymm3[23]521; AVX512VBMI2-NEXT: vpsllvw %zmm1, %zmm0, %zmm0522; AVX512VBMI2-NEXT: vpsrlw $8, %ymm0, %ymm0523; AVX512VBMI2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0524; AVX512VBMI2-NEXT: retq525;526; AVX512VLVBMI2-LABEL: var_funnnel_v32i8:527; AVX512VLVBMI2: # %bb.0:528; AVX512VLVBMI2-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1529; AVX512VLVBMI2-NEXT: vpxor %xmm2, %xmm2, %xmm2530; AVX512VLVBMI2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15],ymm1[24],ymm2[24],ymm1[25],ymm2[25],ymm1[26],ymm2[26],ymm1[27],ymm2[27],ymm1[28],ymm2[28],ymm1[29],ymm2[29],ymm1[30],ymm2[30],ymm1[31],ymm2[31]531; AVX512VLVBMI2-NEXT: vpunpckhbw {{.*#+}} ymm4 = 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]532; AVX512VLVBMI2-NEXT: vpsllvw %ymm3, %ymm4, %ymm3533; AVX512VLVBMI2-NEXT: vpsrlw $8, %ymm3, %ymm3534; AVX512VLVBMI2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[16],ymm2[16],ymm1[17],ymm2[17],ymm1[18],ymm2[18],ymm1[19],ymm2[19],ymm1[20],ymm2[20],ymm1[21],ymm2[21],ymm1[22],ymm2[22],ymm1[23],ymm2[23]535; AVX512VLVBMI2-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]536; AVX512VLVBMI2-NEXT: vpsllvw %ymm1, %ymm0, %ymm0537; AVX512VLVBMI2-NEXT: vpsrlw $8, %ymm0, %ymm0538; AVX512VLVBMI2-NEXT: vpackuswb %ymm3, %ymm0, %ymm0539; AVX512VLVBMI2-NEXT: retq540;541; XOPAVX1-LABEL: var_funnnel_v32i8:542; XOPAVX1: # %bb.0:543; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2544; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3545; XOPAVX1-NEXT: vprotb %xmm2, %xmm3, %xmm2546; XOPAVX1-NEXT: vprotb %xmm1, %xmm0, %xmm0547; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0548; XOPAVX1-NEXT: retq549;550; XOPAVX2-LABEL: var_funnnel_v32i8:551; XOPAVX2: # %bb.0:552; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2553; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3554; XOPAVX2-NEXT: vprotb %xmm2, %xmm3, %xmm2555; XOPAVX2-NEXT: vprotb %xmm1, %xmm0, %xmm0556; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0557; XOPAVX2-NEXT: retq558 %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %x, <32 x i8> %amt)559 ret <32 x i8> %res560}561 562;563; Uniform Variable Shifts564;565 566define <4 x i64> @splatvar_funnnel_v4i64(<4 x i64> %x, <4 x i64> %amt) nounwind {567; AVX1-LABEL: splatvar_funnnel_v4i64:568; AVX1: # %bb.0:569; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm2 = [63,63]570; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm3571; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4572; AVX1-NEXT: vpsllq %xmm3, %xmm4, %xmm5573; AVX1-NEXT: vpsllq %xmm3, %xmm0, %xmm3574; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm3, %ymm3575; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5576; AVX1-NEXT: vpsubq %xmm1, %xmm5, %xmm1577; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1578; AVX1-NEXT: vpsrlq %xmm1, %xmm4, %xmm2579; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0580; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0581; AVX1-NEXT: vorps %ymm0, %ymm3, %ymm0582; AVX1-NEXT: retq583;584; AVX2-LABEL: splatvar_funnnel_v4i64:585; AVX2: # %bb.0:586; AVX2-NEXT: vpmovsxbq {{.*#+}} xmm2 = [63,63]587; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm3588; AVX2-NEXT: vpsllq %xmm3, %ymm0, %ymm3589; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4590; AVX2-NEXT: vpsubq %xmm1, %xmm4, %xmm1591; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1592; AVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0593; AVX2-NEXT: vpor %ymm0, %ymm3, %ymm0594; AVX2-NEXT: retq595;596; AVX512F-LABEL: splatvar_funnnel_v4i64:597; AVX512F: # %bb.0:598; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0599; AVX512F-NEXT: vpbroadcastq %xmm1, %ymm1600; AVX512F-NEXT: vprolvq %zmm1, %zmm0, %zmm0601; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0602; AVX512F-NEXT: retq603;604; AVX512VL-LABEL: splatvar_funnnel_v4i64:605; AVX512VL: # %bb.0:606; AVX512VL-NEXT: vpbroadcastq %xmm1, %ymm1607; AVX512VL-NEXT: vprolvq %ymm1, %ymm0, %ymm0608; AVX512VL-NEXT: retq609;610; AVX512BW-LABEL: splatvar_funnnel_v4i64:611; AVX512BW: # %bb.0:612; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0613; AVX512BW-NEXT: vpbroadcastq %xmm1, %ymm1614; AVX512BW-NEXT: vprolvq %zmm1, %zmm0, %zmm0615; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0616; AVX512BW-NEXT: retq617;618; AVX512VLBW-LABEL: splatvar_funnnel_v4i64:619; AVX512VLBW: # %bb.0:620; AVX512VLBW-NEXT: vpbroadcastq %xmm1, %ymm1621; AVX512VLBW-NEXT: vprolvq %ymm1, %ymm0, %ymm0622; AVX512VLBW-NEXT: retq623;624; AVX512VBMI2-LABEL: splatvar_funnnel_v4i64:625; AVX512VBMI2: # %bb.0:626; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0627; AVX512VBMI2-NEXT: vpbroadcastq %xmm1, %ymm1628; AVX512VBMI2-NEXT: vprolvq %zmm1, %zmm0, %zmm0629; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0630; AVX512VBMI2-NEXT: retq631;632; AVX512VLVBMI2-LABEL: splatvar_funnnel_v4i64:633; AVX512VLVBMI2: # %bb.0:634; AVX512VLVBMI2-NEXT: vpbroadcastq %xmm1, %ymm1635; AVX512VLVBMI2-NEXT: vprolvq %ymm1, %ymm0, %ymm0636; AVX512VLVBMI2-NEXT: retq637;638; XOPAVX1-LABEL: splatvar_funnnel_v4i64:639; XOPAVX1: # %bb.0:640; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2641; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]642; XOPAVX1-NEXT: vprotq %xmm1, %xmm2, %xmm2643; XOPAVX1-NEXT: vprotq %xmm1, %xmm0, %xmm0644; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0645; XOPAVX1-NEXT: retq646;647; XOPAVX2-LABEL: splatvar_funnnel_v4i64:648; XOPAVX2: # %bb.0:649; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2650; XOPAVX2-NEXT: vpbroadcastq %xmm1, %xmm1651; XOPAVX2-NEXT: vprotq %xmm1, %xmm2, %xmm2652; XOPAVX2-NEXT: vprotq %xmm1, %xmm0, %xmm0653; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0654; XOPAVX2-NEXT: retq655 %splat = shufflevector <4 x i64> %amt, <4 x i64> undef, <4 x i32> zeroinitializer656 %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %x, <4 x i64> %splat)657 ret <4 x i64> %res658}659 660define <8 x i32> @splatvar_funnnel_v8i32(<8 x i32> %x, <8 x i32> %amt) nounwind {661; AVX1-LABEL: splatvar_funnnel_v8i32:662; AVX1: # %bb.0:663; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1664; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2665; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm2[2,2,3,3]666; AVX1-NEXT: vpsllq %xmm1, %xmm3, %xmm3667; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,1,1]668; AVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2669; AVX1-NEXT: vshufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]670; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[2,2,3,3]671; AVX1-NEXT: vpsllq %xmm1, %xmm3, %xmm3672; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]673; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0674; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm3[1,3]675; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0676; AVX1-NEXT: retq677;678; AVX2-LABEL: splatvar_funnnel_v8i32:679; AVX2: # %bb.0:680; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm0[2,2,3,3,6,6,7,7]681; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1682; AVX2-NEXT: vpsllq %xmm1, %ymm2, %ymm2683; AVX2-NEXT: vpshufd {{.*#+}} ymm0 = ymm0[0,0,1,1,4,4,5,5]684; AVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0685; AVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm2[1,3],ymm0[5,7],ymm2[5,7]686; AVX2-NEXT: retq687;688; AVX512F-LABEL: splatvar_funnnel_v8i32:689; AVX512F: # %bb.0:690; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0691; AVX512F-NEXT: vpbroadcastd %xmm1, %ymm1692; AVX512F-NEXT: vprolvd %zmm1, %zmm0, %zmm0693; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0694; AVX512F-NEXT: retq695;696; AVX512VL-LABEL: splatvar_funnnel_v8i32:697; AVX512VL: # %bb.0:698; AVX512VL-NEXT: vpbroadcastd %xmm1, %ymm1699; AVX512VL-NEXT: vprolvd %ymm1, %ymm0, %ymm0700; AVX512VL-NEXT: retq701;702; AVX512BW-LABEL: splatvar_funnnel_v8i32:703; AVX512BW: # %bb.0:704; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0705; AVX512BW-NEXT: vpbroadcastd %xmm1, %ymm1706; AVX512BW-NEXT: vprolvd %zmm1, %zmm0, %zmm0707; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0708; AVX512BW-NEXT: retq709;710; AVX512VLBW-LABEL: splatvar_funnnel_v8i32:711; AVX512VLBW: # %bb.0:712; AVX512VLBW-NEXT: vpbroadcastd %xmm1, %ymm1713; AVX512VLBW-NEXT: vprolvd %ymm1, %ymm0, %ymm0714; AVX512VLBW-NEXT: retq715;716; AVX512VBMI2-LABEL: splatvar_funnnel_v8i32:717; AVX512VBMI2: # %bb.0:718; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0719; AVX512VBMI2-NEXT: vpbroadcastd %xmm1, %ymm1720; AVX512VBMI2-NEXT: vprolvd %zmm1, %zmm0, %zmm0721; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0722; AVX512VBMI2-NEXT: retq723;724; AVX512VLVBMI2-LABEL: splatvar_funnnel_v8i32:725; AVX512VLVBMI2: # %bb.0:726; AVX512VLVBMI2-NEXT: vpbroadcastd %xmm1, %ymm1727; AVX512VLVBMI2-NEXT: vprolvd %ymm1, %ymm0, %ymm0728; AVX512VLVBMI2-NEXT: retq729;730; XOPAVX1-LABEL: splatvar_funnnel_v8i32:731; XOPAVX1: # %bb.0:732; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2733; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]734; XOPAVX1-NEXT: vprotd %xmm1, %xmm2, %xmm2735; XOPAVX1-NEXT: vprotd %xmm1, %xmm0, %xmm0736; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0737; XOPAVX1-NEXT: retq738;739; XOPAVX2-LABEL: splatvar_funnnel_v8i32:740; XOPAVX2: # %bb.0:741; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2742; XOPAVX2-NEXT: vpbroadcastd %xmm1, %xmm1743; XOPAVX2-NEXT: vprotd %xmm1, %xmm2, %xmm2744; XOPAVX2-NEXT: vprotd %xmm1, %xmm0, %xmm0745; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0746; XOPAVX2-NEXT: retq747 %splat = shufflevector <8 x i32> %amt, <8 x i32> undef, <8 x i32> zeroinitializer748 %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %x, <8 x i32> %splat)749 ret <8 x i32> %res750}751 752define <16 x i16> @splatvar_funnnel_v16i16(<16 x i16> %x, <16 x i16> %amt) nounwind {753; AVX1-LABEL: splatvar_funnnel_v16i16:754; AVX1: # %bb.0:755; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm2 = [15,0]756; AVX1-NEXT: vpandn %xmm2, %xmm1, %xmm3757; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4758; AVX1-NEXT: vpsrlw $1, %xmm4, %xmm5759; AVX1-NEXT: vpsrlw %xmm3, %xmm5, %xmm5760; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1761; AVX1-NEXT: vpsllw %xmm1, %xmm4, %xmm2762; AVX1-NEXT: vpor %xmm5, %xmm2, %xmm2763; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm4764; AVX1-NEXT: vpsrlw %xmm3, %xmm4, %xmm3765; AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0766; AVX1-NEXT: vpor %xmm3, %xmm0, %xmm0767; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0768; AVX1-NEXT: retq769;770; AVX2-LABEL: splatvar_funnnel_v16i16:771; AVX2: # %bb.0:772; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [15,0,0,0,15,0,0,0]773; AVX2-NEXT: vpandn %xmm2, %xmm1, %xmm3774; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm4775; AVX2-NEXT: vpsrlw %xmm3, %ymm4, %ymm3776; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1777; AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0778; AVX2-NEXT: vpor %ymm3, %ymm0, %ymm0779; AVX2-NEXT: retq780;781; AVX512F-LABEL: splatvar_funnnel_v16i16:782; AVX512F: # %bb.0:783; AVX512F-NEXT: vpbroadcastq {{.*#+}} xmm2 = [15,0,0,0,15,0,0,0]784; AVX512F-NEXT: vpandn %xmm2, %xmm1, %xmm3785; AVX512F-NEXT: vpsrlw $1, %ymm0, %ymm4786; AVX512F-NEXT: vpsrlw %xmm3, %ymm4, %ymm3787; AVX512F-NEXT: vpand %xmm2, %xmm1, %xmm1788; AVX512F-NEXT: vpsllw %xmm1, %ymm0, %ymm0789; AVX512F-NEXT: vpor %ymm3, %ymm0, %ymm0790; AVX512F-NEXT: retq791;792; AVX512VL-LABEL: splatvar_funnnel_v16i16:793; AVX512VL: # %bb.0:794; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm2 = [15,0,0,0,15,0,0,0]795; AVX512VL-NEXT: vpandn %xmm2, %xmm1, %xmm3796; AVX512VL-NEXT: vpsrlw $1, %ymm0, %ymm4797; AVX512VL-NEXT: vpsrlw %xmm3, %ymm4, %ymm3798; AVX512VL-NEXT: vpand %xmm2, %xmm1, %xmm1799; AVX512VL-NEXT: vpsllw %xmm1, %ymm0, %ymm0800; AVX512VL-NEXT: vpor %ymm3, %ymm0, %ymm0801; AVX512VL-NEXT: retq802;803; AVX512BW-LABEL: splatvar_funnnel_v16i16:804; AVX512BW: # %bb.0:805; AVX512BW-NEXT: vpbroadcastq {{.*#+}} xmm2 = [15,0,0,0,15,0,0,0]806; AVX512BW-NEXT: vpandn %xmm2, %xmm1, %xmm3807; AVX512BW-NEXT: vpsrlw $1, %ymm0, %ymm4808; AVX512BW-NEXT: vpsrlw %xmm3, %ymm4, %ymm3809; AVX512BW-NEXT: vpand %xmm2, %xmm1, %xmm1810; AVX512BW-NEXT: vpsllw %xmm1, %ymm0, %ymm0811; AVX512BW-NEXT: vpor %ymm3, %ymm0, %ymm0812; AVX512BW-NEXT: retq813;814; AVX512VLBW-LABEL: splatvar_funnnel_v16i16:815; AVX512VLBW: # %bb.0:816; AVX512VLBW-NEXT: vpbroadcastq {{.*#+}} xmm2 = [15,0,0,0,15,0,0,0]817; AVX512VLBW-NEXT: vpandn %xmm2, %xmm1, %xmm3818; AVX512VLBW-NEXT: vpsrlw $1, %ymm0, %ymm4819; AVX512VLBW-NEXT: vpsrlw %xmm3, %ymm4, %ymm3820; AVX512VLBW-NEXT: vpand %xmm2, %xmm1, %xmm1821; AVX512VLBW-NEXT: vpsllw %xmm1, %ymm0, %ymm0822; AVX512VLBW-NEXT: vpor %ymm3, %ymm0, %ymm0823; AVX512VLBW-NEXT: retq824;825; AVX512VBMI2-LABEL: splatvar_funnnel_v16i16:826; AVX512VBMI2: # %bb.0:827; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0828; AVX512VBMI2-NEXT: vpbroadcastw %xmm1, %ymm1829; AVX512VBMI2-NEXT: vpshldvw %zmm1, %zmm0, %zmm0830; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0831; AVX512VBMI2-NEXT: retq832;833; AVX512VLVBMI2-LABEL: splatvar_funnnel_v16i16:834; AVX512VLVBMI2: # %bb.0:835; AVX512VLVBMI2-NEXT: vpbroadcastw %xmm1, %ymm1836; AVX512VLVBMI2-NEXT: vpshldvw %ymm1, %ymm0, %ymm0837; AVX512VLVBMI2-NEXT: retq838;839; XOPAVX1-LABEL: splatvar_funnnel_v16i16:840; XOPAVX1: # %bb.0:841; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2842; XOPAVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]843; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]844; XOPAVX1-NEXT: vprotw %xmm1, %xmm2, %xmm2845; XOPAVX1-NEXT: vprotw %xmm1, %xmm0, %xmm0846; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0847; XOPAVX1-NEXT: retq848;849; XOPAVX2-LABEL: splatvar_funnnel_v16i16:850; XOPAVX2: # %bb.0:851; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2852; XOPAVX2-NEXT: vpbroadcastw %xmm1, %xmm1853; XOPAVX2-NEXT: vprotw %xmm1, %xmm2, %xmm2854; XOPAVX2-NEXT: vprotw %xmm1, %xmm0, %xmm0855; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0856; XOPAVX2-NEXT: retq857 %splat = shufflevector <16 x i16> %amt, <16 x i16> undef, <16 x i32> zeroinitializer858 %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %x, <16 x i16> %splat)859 ret <16 x i16> %res860}861 862define <32 x i8> @splatvar_funnnel_v32i8(<32 x i8> %x, <32 x i8> %amt) nounwind {863; AVX1-LABEL: splatvar_funnnel_v32i8:864; AVX1: # %bb.0:865; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1866; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2867; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]868; AVX1-NEXT: vpsllw %xmm1, %xmm3, %xmm3869; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3870; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]871; AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2872; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2873; AVX1-NEXT: vpackuswb %xmm3, %xmm2, %xmm2874; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]875; AVX1-NEXT: vpsllw %xmm1, %xmm3, %xmm3876; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3877; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]878; AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0879; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0880; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0881; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0882; AVX1-NEXT: retq883;884; AVX2-LABEL: splatvar_funnnel_v32i8:885; AVX2: # %bb.0:886; AVX2-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]887; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1888; AVX2-NEXT: vpsllw %xmm1, %ymm2, %ymm2889; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2890; AVX2-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]891; AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0892; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0893; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0894; AVX2-NEXT: retq895;896; AVX512F-LABEL: splatvar_funnnel_v32i8:897; AVX512F: # %bb.0:898; 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]899; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1900; AVX512F-NEXT: vpsllw %xmm1, %ymm2, %ymm2901; AVX512F-NEXT: vpsrlw $8, %ymm2, %ymm2902; 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]903; AVX512F-NEXT: vpsllw %xmm1, %ymm0, %ymm0904; AVX512F-NEXT: vpsrlw $8, %ymm0, %ymm0905; AVX512F-NEXT: vpackuswb %ymm2, %ymm0, %ymm0906; AVX512F-NEXT: retq907;908; AVX512VL-LABEL: splatvar_funnnel_v32i8:909; AVX512VL: # %bb.0:910; 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]911; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1912; AVX512VL-NEXT: vpsllw %xmm1, %ymm2, %ymm2913; AVX512VL-NEXT: vpsrlw $8, %ymm2, %ymm2914; 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]915; AVX512VL-NEXT: vpsllw %xmm1, %ymm0, %ymm0916; AVX512VL-NEXT: vpsrlw $8, %ymm0, %ymm0917; AVX512VL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0918; AVX512VL-NEXT: retq919;920; AVX512BW-LABEL: splatvar_funnnel_v32i8:921; AVX512BW: # %bb.0:922; AVX512BW-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]923; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1924; AVX512BW-NEXT: vpsllw %xmm1, %ymm2, %ymm2925; AVX512BW-NEXT: vpsrlw $8, %ymm2, %ymm2926; AVX512BW-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]927; AVX512BW-NEXT: vpsllw %xmm1, %ymm0, %ymm0928; AVX512BW-NEXT: vpsrlw $8, %ymm0, %ymm0929; AVX512BW-NEXT: vpackuswb %ymm2, %ymm0, %ymm0930; AVX512BW-NEXT: retq931;932; AVX512VLBW-LABEL: splatvar_funnnel_v32i8:933; AVX512VLBW: # %bb.0:934; AVX512VLBW-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]935; AVX512VLBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1936; AVX512VLBW-NEXT: vpsllw %xmm1, %ymm2, %ymm2937; AVX512VLBW-NEXT: vpsrlw $8, %ymm2, %ymm2938; AVX512VLBW-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]939; AVX512VLBW-NEXT: vpsllw %xmm1, %ymm0, %ymm0940; AVX512VLBW-NEXT: vpsrlw $8, %ymm0, %ymm0941; AVX512VLBW-NEXT: vpackuswb %ymm2, %ymm0, %ymm0942; AVX512VLBW-NEXT: retq943;944; AVX512VBMI2-LABEL: splatvar_funnnel_v32i8:945; AVX512VBMI2: # %bb.0:946; AVX512VBMI2-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]947; AVX512VBMI2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1948; AVX512VBMI2-NEXT: vpsllw %xmm1, %ymm2, %ymm2949; AVX512VBMI2-NEXT: vpsrlw $8, %ymm2, %ymm2950; AVX512VBMI2-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]951; AVX512VBMI2-NEXT: vpsllw %xmm1, %ymm0, %ymm0952; AVX512VBMI2-NEXT: vpsrlw $8, %ymm0, %ymm0953; AVX512VBMI2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0954; AVX512VBMI2-NEXT: retq955;956; AVX512VLVBMI2-LABEL: splatvar_funnnel_v32i8:957; AVX512VLVBMI2: # %bb.0:958; AVX512VLVBMI2-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]959; AVX512VLVBMI2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1960; AVX512VLVBMI2-NEXT: vpsllw %xmm1, %ymm2, %ymm2961; AVX512VLVBMI2-NEXT: vpsrlw $8, %ymm2, %ymm2962; AVX512VLVBMI2-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]963; AVX512VLVBMI2-NEXT: vpsllw %xmm1, %ymm0, %ymm0964; AVX512VLVBMI2-NEXT: vpsrlw $8, %ymm0, %ymm0965; AVX512VLVBMI2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0966; AVX512VLVBMI2-NEXT: retq967;968; XOPAVX1-LABEL: splatvar_funnnel_v32i8:969; XOPAVX1: # %bb.0:970; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2971; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1972; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2973; XOPAVX1-NEXT: vprotb %xmm1, %xmm2, %xmm2974; XOPAVX1-NEXT: vprotb %xmm1, %xmm0, %xmm0975; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0976; XOPAVX1-NEXT: retq977;978; XOPAVX2-LABEL: splatvar_funnnel_v32i8:979; XOPAVX2: # %bb.0:980; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2981; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm1982; XOPAVX2-NEXT: vprotb %xmm1, %xmm2, %xmm2983; XOPAVX2-NEXT: vprotb %xmm1, %xmm0, %xmm0984; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0985; XOPAVX2-NEXT: retq986 %splat = shufflevector <32 x i8> %amt, <32 x i8> undef, <32 x i32> zeroinitializer987 %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %x, <32 x i8> %splat)988 ret <32 x i8> %res989}990 991;992; Constant Shifts993;994 995define <4 x i64> @constant_funnnel_v4i64(<4 x i64> %x) nounwind {996; AVX1-LABEL: constant_funnnel_v4i64:997; AVX1: # %bb.0:998; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1999; AVX1-NEXT: vpsrlq $4, %xmm1, %xmm21000; AVX1-NEXT: vpsrlq $14, %xmm1, %xmm31001; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]1002; AVX1-NEXT: vpsrlq $50, %xmm0, %xmm31003; AVX1-NEXT: vpsrlq $60, %xmm0, %xmm41004; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]1005; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm21006; AVX1-NEXT: vpsllq $60, %xmm1, %xmm31007; AVX1-NEXT: vpsllq $50, %xmm1, %xmm11008; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]1009; AVX1-NEXT: vpsllq $14, %xmm0, %xmm31010; AVX1-NEXT: vpsllq $4, %xmm0, %xmm01011; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]1012; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01013; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm01014; AVX1-NEXT: retq1015;1016; AVX2-LABEL: constant_funnnel_v4i64:1017; AVX2: # %bb.0:1018; AVX2-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm11019; AVX2-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01020; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01021; AVX2-NEXT: retq1022;1023; AVX512F-LABEL: constant_funnnel_v4i64:1024; AVX512F: # %bb.0:1025; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01026; AVX512F-NEXT: vpmovsxbq {{.*#+}} ymm1 = [4,14,50,60]1027; AVX512F-NEXT: vprolvq %zmm1, %zmm0, %zmm01028; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01029; AVX512F-NEXT: retq1030;1031; AVX512VL-LABEL: constant_funnnel_v4i64:1032; AVX512VL: # %bb.0:1033; AVX512VL-NEXT: vprolvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01034; AVX512VL-NEXT: retq1035;1036; AVX512BW-LABEL: constant_funnnel_v4i64:1037; AVX512BW: # %bb.0:1038; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01039; AVX512BW-NEXT: vpmovsxbq {{.*#+}} ymm1 = [4,14,50,60]1040; AVX512BW-NEXT: vprolvq %zmm1, %zmm0, %zmm01041; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01042; AVX512BW-NEXT: retq1043;1044; AVX512VLBW-LABEL: constant_funnnel_v4i64:1045; AVX512VLBW: # %bb.0:1046; AVX512VLBW-NEXT: vprolvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01047; AVX512VLBW-NEXT: retq1048;1049; AVX512VBMI2-LABEL: constant_funnnel_v4i64:1050; AVX512VBMI2: # %bb.0:1051; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01052; AVX512VBMI2-NEXT: vpmovsxbq {{.*#+}} ymm1 = [4,14,50,60]1053; AVX512VBMI2-NEXT: vprolvq %zmm1, %zmm0, %zmm01054; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01055; AVX512VBMI2-NEXT: retq1056;1057; AVX512VLVBMI2-LABEL: constant_funnnel_v4i64:1058; AVX512VLVBMI2: # %bb.0:1059; AVX512VLVBMI2-NEXT: vprolvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01060; AVX512VLVBMI2-NEXT: retq1061;1062; XOPAVX1-LABEL: constant_funnnel_v4i64:1063; XOPAVX1: # %bb.0:1064; XOPAVX1-NEXT: vprotq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11065; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01066; XOPAVX1-NEXT: vprotq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01067; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01068; XOPAVX1-NEXT: retq1069;1070; XOPAVX2-LABEL: constant_funnnel_v4i64:1071; XOPAVX2: # %bb.0:1072; XOPAVX2-NEXT: vprotq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11073; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm01074; XOPAVX2-NEXT: vprotq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01075; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm01076; XOPAVX2-NEXT: retq1077 %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %x, <4 x i64> <i64 4, i64 14, i64 50, i64 60>)1078 ret <4 x i64> %res1079}1080 1081define <8 x i32> @constant_funnnel_v8i32(<8 x i32> %x) nounwind {1082; AVX1-LABEL: constant_funnnel_v8i32:1083; AVX1: # %bb.0:1084; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1085; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [32,u,128,u]1086; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21087; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]1088; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [512,u,2048,u]1089; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm11090; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [16,32,64,128]1091; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [256,512,1024,2048]1092; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01093; AVX1-NEXT: vmovshdup {{.*#+}} ymm2 = ymm0[1,1,3,3,5,5,7,7]1094; AVX1-NEXT: vblendps {{.*#+}} ymm2 = ymm2[0],ymm1[1],ymm2[2],ymm1[3],ymm2[4],ymm1[5],ymm2[6],ymm1[7]1095; AVX1-NEXT: vmovsldup {{.*#+}} ymm1 = ymm1[0,0,2,2,4,4,6,6]1096; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]1097; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm01098; AVX1-NEXT: retq1099;1100; AVX2-LABEL: constant_funnnel_v8i32:1101; AVX2: # %bb.0:1102; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm11103; AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01104; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01105; AVX2-NEXT: retq1106;1107; AVX512F-LABEL: constant_funnnel_v8i32:1108; AVX512F: # %bb.0:1109; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01110; AVX512F-NEXT: vpmovsxbd {{.*#+}} ymm1 = [4,5,6,7,8,9,10,11]1111; AVX512F-NEXT: vprolvd %zmm1, %zmm0, %zmm01112; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01113; AVX512F-NEXT: retq1114;1115; AVX512VL-LABEL: constant_funnnel_v8i32:1116; AVX512VL: # %bb.0:1117; AVX512VL-NEXT: vprolvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01118; AVX512VL-NEXT: retq1119;1120; AVX512BW-LABEL: constant_funnnel_v8i32:1121; AVX512BW: # %bb.0:1122; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01123; AVX512BW-NEXT: vpmovsxbd {{.*#+}} ymm1 = [4,5,6,7,8,9,10,11]1124; AVX512BW-NEXT: vprolvd %zmm1, %zmm0, %zmm01125; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01126; AVX512BW-NEXT: retq1127;1128; AVX512VLBW-LABEL: constant_funnnel_v8i32:1129; AVX512VLBW: # %bb.0:1130; AVX512VLBW-NEXT: vprolvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01131; AVX512VLBW-NEXT: retq1132;1133; AVX512VBMI2-LABEL: constant_funnnel_v8i32:1134; AVX512VBMI2: # %bb.0:1135; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01136; AVX512VBMI2-NEXT: vpmovsxbd {{.*#+}} ymm1 = [4,5,6,7,8,9,10,11]1137; AVX512VBMI2-NEXT: vprolvd %zmm1, %zmm0, %zmm01138; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01139; AVX512VBMI2-NEXT: retq1140;1141; AVX512VLVBMI2-LABEL: constant_funnnel_v8i32:1142; AVX512VLVBMI2: # %bb.0:1143; AVX512VLVBMI2-NEXT: vprolvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01144; AVX512VLVBMI2-NEXT: retq1145;1146; XOPAVX1-LABEL: constant_funnnel_v8i32:1147; XOPAVX1: # %bb.0:1148; XOPAVX1-NEXT: vprotd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11149; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01150; XOPAVX1-NEXT: vprotd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01151; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01152; XOPAVX1-NEXT: retq1153;1154; XOPAVX2-LABEL: constant_funnnel_v8i32:1155; XOPAVX2: # %bb.0:1156; XOPAVX2-NEXT: vprotd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11157; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm01158; XOPAVX2-NEXT: vprotd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01159; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm01160; XOPAVX2-NEXT: retq1161 %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %x, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>)1162 ret <8 x i32> %res1163}1164 1165define <16 x i16> @constant_funnnel_v16i16(<16 x i16> %x) nounwind {1166; AVX1-LABEL: constant_funnnel_v16i16:1167; AVX1: # %bb.0:1168; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11169; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]1170; AVX1-NEXT: vpmulhuw %xmm2, %xmm1, %xmm31171; AVX1-NEXT: vpmullw %xmm2, %xmm1, %xmm11172; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm11173; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]1174; AVX1-NEXT: vpmulhuw %xmm2, %xmm0, %xmm31175; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm01176; AVX1-NEXT: vpor %xmm3, %xmm0, %xmm01177; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01178; AVX1-NEXT: retq1179;1180; AVX2-LABEL: constant_funnnel_v16i16:1181; AVX2: # %bb.0:1182; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]1183; AVX2-NEXT: vpmulhuw %ymm1, %ymm0, %ymm21184; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm01185; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm01186; AVX2-NEXT: retq1187;1188; AVX512F-LABEL: constant_funnnel_v16i16:1189; AVX512F: # %bb.0:1190; AVX512F-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]1191; AVX512F-NEXT: vpmulhuw %ymm1, %ymm0, %ymm21192; AVX512F-NEXT: vpmullw %ymm1, %ymm0, %ymm01193; AVX512F-NEXT: vpor %ymm2, %ymm0, %ymm01194; AVX512F-NEXT: retq1195;1196; AVX512VL-LABEL: constant_funnnel_v16i16:1197; AVX512VL: # %bb.0:1198; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]1199; AVX512VL-NEXT: vpmulhuw %ymm1, %ymm0, %ymm21200; AVX512VL-NEXT: vpmullw %ymm1, %ymm0, %ymm01201; AVX512VL-NEXT: vpor %ymm2, %ymm0, %ymm01202; AVX512VL-NEXT: retq1203;1204; AVX512BW-LABEL: constant_funnnel_v16i16:1205; AVX512BW: # %bb.0:1206; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01207; AVX512BW-NEXT: vpmovsxbw {{.*#+}} ymm1 = [16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]1208; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm11209; AVX512BW-NEXT: vpmovsxbw {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]1210; AVX512BW-NEXT: vpsllvw %zmm2, %zmm0, %zmm01211; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm01212; AVX512BW-NEXT: retq1213;1214; AVX512VLBW-LABEL: constant_funnnel_v16i16:1215; AVX512VLBW: # %bb.0:1216; AVX512VLBW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm11217; AVX512VLBW-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01218; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm01219; AVX512VLBW-NEXT: retq1220;1221; AVX512VBMI2-LABEL: constant_funnnel_v16i16:1222; AVX512VBMI2: # %bb.0:1223; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01224; AVX512VBMI2-NEXT: vpmovsxbw {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]1225; AVX512VBMI2-NEXT: vpshldvw %zmm1, %zmm0, %zmm01226; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01227; AVX512VBMI2-NEXT: retq1228;1229; AVX512VLVBMI2-LABEL: constant_funnnel_v16i16:1230; AVX512VLVBMI2: # %bb.0:1231; AVX512VLVBMI2-NEXT: vpshldvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01232; AVX512VLVBMI2-NEXT: retq1233;1234; XOPAVX1-LABEL: constant_funnnel_v16i16:1235; XOPAVX1: # %bb.0:1236; XOPAVX1-NEXT: vprotw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11237; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01238; XOPAVX1-NEXT: vprotw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01239; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01240; XOPAVX1-NEXT: retq1241;1242; XOPAVX2-LABEL: constant_funnnel_v16i16:1243; XOPAVX2: # %bb.0:1244; XOPAVX2-NEXT: vprotw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11245; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm01246; XOPAVX2-NEXT: vprotw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01247; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm01248; XOPAVX2-NEXT: retq1249 %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %x, <16 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>)1250 ret <16 x i16> %res1251}1252 1253define <32 x i8> @constant_funnnel_v32i8(<32 x i8> %x) nounwind {1254; AVX1-LABEL: constant_funnnel_v32i8:1255; AVX1: # %bb.0:1256; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11257; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1258; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm3 = [1,128,64,32,16,8,4,2]1259; AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm21260; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm21261; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1262; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]1263; AVX1-NEXT: vpmullw %xmm4, %xmm1, %xmm11264; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm11265; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm11266; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1267; AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm21268; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm21269; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1270; AVX1-NEXT: vpmullw %xmm4, %xmm0, %xmm01271; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm01272; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm01273; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01274; AVX1-NEXT: retq1275;1276; AVX2-LABEL: constant_funnnel_v32i8:1277; AVX2: # %bb.0:1278; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm1 = 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]1279; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]1280; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm11281; AVX2-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]1282; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1283; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm01284; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm01285; AVX2-NEXT: retq1286;1287; AVX512F-LABEL: constant_funnnel_v32i8:1288; AVX512F: # %bb.0:1289; AVX512F-NEXT: vpunpckhbw {{.*#+}} ymm1 = 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]1290; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]1291; AVX512F-NEXT: vpsrlw $8, %ymm1, %ymm11292; 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]1293; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1294; AVX512F-NEXT: vpsrlw $8, %ymm0, %ymm01295; AVX512F-NEXT: vpackuswb %ymm1, %ymm0, %ymm01296; AVX512F-NEXT: retq1297;1298; AVX512VL-LABEL: constant_funnnel_v32i8:1299; AVX512VL: # %bb.0:1300; AVX512VL-NEXT: vpunpckhbw {{.*#+}} ymm1 = 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]1301; AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]1302; AVX512VL-NEXT: vpsrlw $8, %ymm1, %ymm11303; 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]1304; AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1305; AVX512VL-NEXT: vpsrlw $8, %ymm0, %ymm01306; AVX512VL-NEXT: vpackuswb %ymm1, %ymm0, %ymm01307; AVX512VL-NEXT: retq1308;1309; AVX512BW-LABEL: constant_funnnel_v32i8:1310; AVX512BW: # %bb.0:1311; AVX512BW-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [0,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0,0,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0]1312; AVX512BW-NEXT: # ymm1 = mem[0,1,0,1]1313; AVX512BW-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]1314; AVX512BW-NEXT: vpsllvw %zmm1, %zmm2, %zmm11315; AVX512BW-NEXT: vpsrlw $8, %ymm1, %ymm11316; AVX512BW-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0]1317; AVX512BW-NEXT: # ymm2 = mem[0,1,0,1]1318; AVX512BW-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]1319; AVX512BW-NEXT: vpsllvw %zmm2, %zmm0, %zmm01320; AVX512BW-NEXT: vpsrlw $8, %ymm0, %ymm01321; AVX512BW-NEXT: vpackuswb %ymm1, %ymm0, %ymm01322; AVX512BW-NEXT: retq1323;1324; AVX512VLBW-LABEL: constant_funnnel_v32i8:1325; AVX512VLBW: # %bb.0:1326; AVX512VLBW-NEXT: vpunpckhbw {{.*#+}} ymm1 = 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]1327; AVX512VLBW-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11328; AVX512VLBW-NEXT: vpsrlw $8, %ymm1, %ymm11329; AVX512VLBW-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]1330; AVX512VLBW-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01331; AVX512VLBW-NEXT: vpsrlw $8, %ymm0, %ymm01332; AVX512VLBW-NEXT: vpackuswb %ymm1, %ymm0, %ymm01333; AVX512VLBW-NEXT: retq1334;1335; AVX512VBMI2-LABEL: constant_funnnel_v32i8:1336; AVX512VBMI2: # %bb.0:1337; AVX512VBMI2-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [0,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0,0,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0]1338; AVX512VBMI2-NEXT: # ymm1 = mem[0,1,0,1]1339; AVX512VBMI2-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]1340; AVX512VBMI2-NEXT: vpsllvw %zmm1, %zmm2, %zmm11341; AVX512VBMI2-NEXT: vpsrlw $8, %ymm1, %ymm11342; AVX512VBMI2-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0]1343; AVX512VBMI2-NEXT: # ymm2 = mem[0,1,0,1]1344; AVX512VBMI2-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]1345; AVX512VBMI2-NEXT: vpsllvw %zmm2, %zmm0, %zmm01346; AVX512VBMI2-NEXT: vpsrlw $8, %ymm0, %ymm01347; AVX512VBMI2-NEXT: vpackuswb %ymm1, %ymm0, %ymm01348; AVX512VBMI2-NEXT: retq1349;1350; AVX512VLVBMI2-LABEL: constant_funnnel_v32i8:1351; AVX512VLVBMI2: # %bb.0:1352; AVX512VLVBMI2-NEXT: vpunpckhbw {{.*#+}} ymm1 = 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]1353; AVX512VLVBMI2-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11354; AVX512VLVBMI2-NEXT: vpsrlw $8, %ymm1, %ymm11355; AVX512VLVBMI2-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]1356; AVX512VLVBMI2-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01357; AVX512VLVBMI2-NEXT: vpsrlw $8, %ymm0, %ymm01358; AVX512VLVBMI2-NEXT: vpackuswb %ymm1, %ymm0, %ymm01359; AVX512VLVBMI2-NEXT: retq1360;1361; XOPAVX1-LABEL: constant_funnnel_v32i8:1362; XOPAVX1: # %bb.0:1363; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm11364; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]1365; XOPAVX1-NEXT: vprotb %xmm2, %xmm1, %xmm11366; XOPAVX1-NEXT: vprotb %xmm2, %xmm0, %xmm01367; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01368; XOPAVX1-NEXT: retq1369;1370; XOPAVX2-LABEL: constant_funnnel_v32i8:1371; XOPAVX2: # %bb.0:1372; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm11373; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]1374; XOPAVX2-NEXT: vprotb %xmm2, %xmm1, %xmm11375; XOPAVX2-NEXT: vprotb %xmm2, %xmm0, %xmm01376; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01377; XOPAVX2-NEXT: retq1378 %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %x, <32 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>)1379 ret <32 x i8> %res1380}1381 1382;1383; Uniform Constant Shifts1384;1385 1386define <4 x i64> @splatconstant_funnnel_v4i64(<4 x i64> %x) nounwind {1387; AVX1-LABEL: splatconstant_funnnel_v4i64:1388; AVX1: # %bb.0:1389; AVX1-NEXT: vpsrlq $50, %xmm0, %xmm11390; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21391; AVX1-NEXT: vpsrlq $50, %xmm2, %xmm31392; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm11393; AVX1-NEXT: vpsllq $14, %xmm0, %xmm01394; AVX1-NEXT: vpsllq $14, %xmm2, %xmm21395; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01396; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm01397; AVX1-NEXT: retq1398;1399; AVX2-LABEL: splatconstant_funnnel_v4i64:1400; AVX2: # %bb.0:1401; AVX2-NEXT: vpsrlq $50, %ymm0, %ymm11402; AVX2-NEXT: vpsllq $14, %ymm0, %ymm01403; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01404; AVX2-NEXT: retq1405;1406; AVX512F-LABEL: splatconstant_funnnel_v4i64:1407; AVX512F: # %bb.0:1408; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01409; AVX512F-NEXT: vprolq $14, %zmm0, %zmm01410; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01411; AVX512F-NEXT: retq1412;1413; AVX512VL-LABEL: splatconstant_funnnel_v4i64:1414; AVX512VL: # %bb.0:1415; AVX512VL-NEXT: vprolq $14, %ymm0, %ymm01416; AVX512VL-NEXT: retq1417;1418; AVX512BW-LABEL: splatconstant_funnnel_v4i64:1419; AVX512BW: # %bb.0:1420; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01421; AVX512BW-NEXT: vprolq $14, %zmm0, %zmm01422; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01423; AVX512BW-NEXT: retq1424;1425; AVX512VLBW-LABEL: splatconstant_funnnel_v4i64:1426; AVX512VLBW: # %bb.0:1427; AVX512VLBW-NEXT: vprolq $14, %ymm0, %ymm01428; AVX512VLBW-NEXT: retq1429;1430; AVX512VBMI2-LABEL: splatconstant_funnnel_v4i64:1431; AVX512VBMI2: # %bb.0:1432; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01433; AVX512VBMI2-NEXT: vprolq $14, %zmm0, %zmm01434; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01435; AVX512VBMI2-NEXT: retq1436;1437; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v4i64:1438; AVX512VLVBMI2: # %bb.0:1439; AVX512VLVBMI2-NEXT: vprolq $14, %ymm0, %ymm01440; AVX512VLVBMI2-NEXT: retq1441;1442; XOPAVX1-LABEL: splatconstant_funnnel_v4i64:1443; XOPAVX1: # %bb.0:1444; XOPAVX1-NEXT: vprotq $14, %xmm0, %xmm11445; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01446; XOPAVX1-NEXT: vprotq $14, %xmm0, %xmm01447; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01448; XOPAVX1-NEXT: retq1449;1450; XOPAVX2-LABEL: splatconstant_funnnel_v4i64:1451; XOPAVX2: # %bb.0:1452; XOPAVX2-NEXT: vprotq $14, %xmm0, %xmm11453; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm01454; XOPAVX2-NEXT: vprotq $14, %xmm0, %xmm01455; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm01456; XOPAVX2-NEXT: retq1457 %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %x, <4 x i64> <i64 14, i64 14, i64 14, i64 14>)1458 ret <4 x i64> %res1459}1460 1461define <8 x i32> @splatconstant_funnnel_v8i32(<8 x i32> %x) nounwind {1462; AVX1-LABEL: splatconstant_funnnel_v8i32:1463; AVX1: # %bb.0:1464; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11465; AVX1-NEXT: vpsrld $28, %xmm1, %xmm21466; AVX1-NEXT: vpslld $4, %xmm1, %xmm11467; AVX1-NEXT: vpor %xmm2, %xmm1, %xmm11468; AVX1-NEXT: vpsrld $28, %xmm0, %xmm21469; AVX1-NEXT: vpslld $4, %xmm0, %xmm01470; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm01471; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01472; AVX1-NEXT: retq1473;1474; AVX2-LABEL: splatconstant_funnnel_v8i32:1475; AVX2: # %bb.0:1476; AVX2-NEXT: vpsrld $28, %ymm0, %ymm11477; AVX2-NEXT: vpslld $4, %ymm0, %ymm01478; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01479; AVX2-NEXT: retq1480;1481; AVX512F-LABEL: splatconstant_funnnel_v8i32:1482; AVX512F: # %bb.0:1483; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01484; AVX512F-NEXT: vprold $4, %zmm0, %zmm01485; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01486; AVX512F-NEXT: retq1487;1488; AVX512VL-LABEL: splatconstant_funnnel_v8i32:1489; AVX512VL: # %bb.0:1490; AVX512VL-NEXT: vprold $4, %ymm0, %ymm01491; AVX512VL-NEXT: retq1492;1493; AVX512BW-LABEL: splatconstant_funnnel_v8i32:1494; AVX512BW: # %bb.0:1495; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01496; AVX512BW-NEXT: vprold $4, %zmm0, %zmm01497; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01498; AVX512BW-NEXT: retq1499;1500; AVX512VLBW-LABEL: splatconstant_funnnel_v8i32:1501; AVX512VLBW: # %bb.0:1502; AVX512VLBW-NEXT: vprold $4, %ymm0, %ymm01503; AVX512VLBW-NEXT: retq1504;1505; AVX512VBMI2-LABEL: splatconstant_funnnel_v8i32:1506; AVX512VBMI2: # %bb.0:1507; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01508; AVX512VBMI2-NEXT: vprold $4, %zmm0, %zmm01509; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01510; AVX512VBMI2-NEXT: retq1511;1512; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v8i32:1513; AVX512VLVBMI2: # %bb.0:1514; AVX512VLVBMI2-NEXT: vprold $4, %ymm0, %ymm01515; AVX512VLVBMI2-NEXT: retq1516;1517; XOPAVX1-LABEL: splatconstant_funnnel_v8i32:1518; XOPAVX1: # %bb.0:1519; XOPAVX1-NEXT: vprotd $4, %xmm0, %xmm11520; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01521; XOPAVX1-NEXT: vprotd $4, %xmm0, %xmm01522; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01523; XOPAVX1-NEXT: retq1524;1525; XOPAVX2-LABEL: splatconstant_funnnel_v8i32:1526; XOPAVX2: # %bb.0:1527; XOPAVX2-NEXT: vprotd $4, %xmm0, %xmm11528; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm01529; XOPAVX2-NEXT: vprotd $4, %xmm0, %xmm01530; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm01531; XOPAVX2-NEXT: retq1532 %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %x, <8 x i32> <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>)1533 ret <8 x i32> %res1534}1535 1536define <16 x i16> @splatconstant_funnnel_v16i16(<16 x i16> %x) nounwind {1537; AVX1-LABEL: splatconstant_funnnel_v16i16:1538; AVX1: # %bb.0:1539; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11540; AVX1-NEXT: vpsrlw $9, %xmm1, %xmm21541; AVX1-NEXT: vpsllw $7, %xmm1, %xmm11542; AVX1-NEXT: vpor %xmm2, %xmm1, %xmm11543; AVX1-NEXT: vpsrlw $9, %xmm0, %xmm21544; AVX1-NEXT: vpsllw $7, %xmm0, %xmm01545; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm01546; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01547; AVX1-NEXT: retq1548;1549; AVX2-LABEL: splatconstant_funnnel_v16i16:1550; AVX2: # %bb.0:1551; AVX2-NEXT: vpsrlw $9, %ymm0, %ymm11552; AVX2-NEXT: vpsllw $7, %ymm0, %ymm01553; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01554; AVX2-NEXT: retq1555;1556; AVX512F-LABEL: splatconstant_funnnel_v16i16:1557; AVX512F: # %bb.0:1558; AVX512F-NEXT: vpsrlw $9, %ymm0, %ymm11559; AVX512F-NEXT: vpsllw $7, %ymm0, %ymm01560; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm01561; AVX512F-NEXT: retq1562;1563; AVX512VL-LABEL: splatconstant_funnnel_v16i16:1564; AVX512VL: # %bb.0:1565; AVX512VL-NEXT: vpsrlw $9, %ymm0, %ymm11566; AVX512VL-NEXT: vpsllw $7, %ymm0, %ymm01567; AVX512VL-NEXT: vpor %ymm1, %ymm0, %ymm01568; AVX512VL-NEXT: retq1569;1570; AVX512BW-LABEL: splatconstant_funnnel_v16i16:1571; AVX512BW: # %bb.0:1572; AVX512BW-NEXT: vpsrlw $9, %ymm0, %ymm11573; AVX512BW-NEXT: vpsllw $7, %ymm0, %ymm01574; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm01575; AVX512BW-NEXT: retq1576;1577; AVX512VLBW-LABEL: splatconstant_funnnel_v16i16:1578; AVX512VLBW: # %bb.0:1579; AVX512VLBW-NEXT: vpsrlw $9, %ymm0, %ymm11580; AVX512VLBW-NEXT: vpsllw $7, %ymm0, %ymm01581; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm01582; AVX512VLBW-NEXT: retq1583;1584; AVX512VBMI2-LABEL: splatconstant_funnnel_v16i16:1585; AVX512VBMI2: # %bb.0:1586; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01587; AVX512VBMI2-NEXT: vpshldw $7, %zmm0, %zmm0, %zmm01588; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01589; AVX512VBMI2-NEXT: retq1590;1591; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v16i16:1592; AVX512VLVBMI2: # %bb.0:1593; AVX512VLVBMI2-NEXT: vpshldw $7, %ymm0, %ymm0, %ymm01594; AVX512VLVBMI2-NEXT: retq1595;1596; XOPAVX1-LABEL: splatconstant_funnnel_v16i16:1597; XOPAVX1: # %bb.0:1598; XOPAVX1-NEXT: vprotw $7, %xmm0, %xmm11599; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01600; XOPAVX1-NEXT: vprotw $7, %xmm0, %xmm01601; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01602; XOPAVX1-NEXT: retq1603;1604; XOPAVX2-LABEL: splatconstant_funnnel_v16i16:1605; XOPAVX2: # %bb.0:1606; XOPAVX2-NEXT: vprotw $7, %xmm0, %xmm11607; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm01608; XOPAVX2-NEXT: vprotw $7, %xmm0, %xmm01609; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm01610; XOPAVX2-NEXT: retq1611 %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %x, <16 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>)1612 ret <16 x i16> %res1613}1614 1615define <32 x i8> @splatconstant_funnnel_v32i8(<32 x i8> %x) nounwind {1616; AVX1-LABEL: splatconstant_funnnel_v32i8:1617; AVX1: # %bb.0:1618; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm11619; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21620; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm31621; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm11622; AVX1-NEXT: vbroadcastss {{.*#+}} ymm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]1623; AVX1-NEXT: vandnps %ymm1, %ymm3, %ymm11624; AVX1-NEXT: vpsllw $4, %xmm0, %xmm01625; AVX1-NEXT: vpsllw $4, %xmm2, %xmm21626; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01627; AVX1-NEXT: vandps %ymm3, %ymm0, %ymm01628; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm01629; AVX1-NEXT: retq1630;1631; AVX2-LABEL: splatconstant_funnnel_v32i8:1632; AVX2: # %bb.0:1633; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm11634; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11635; AVX2-NEXT: vpsllw $4, %ymm0, %ymm01636; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01637; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01638; AVX2-NEXT: retq1639;1640; AVX512F-LABEL: splatconstant_funnnel_v32i8:1641; AVX512F: # %bb.0:1642; AVX512F-NEXT: vpsllw $4, %ymm0, %ymm11643; AVX512F-NEXT: vpsrlw $4, %ymm0, %ymm01644; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))1645; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01646; AVX512F-NEXT: retq1647;1648; AVX512VL-LABEL: splatconstant_funnnel_v32i8:1649; AVX512VL: # %bb.0:1650; AVX512VL-NEXT: vpsllw $4, %ymm0, %ymm11651; AVX512VL-NEXT: vpsrlw $4, %ymm0, %ymm01652; AVX512VL-NEXT: vpternlogd {{.*#+}} ymm0 = ymm0 ^ (m32bcst & (ymm0 ^ ymm1))1653; AVX512VL-NEXT: retq1654;1655; AVX512BW-LABEL: splatconstant_funnnel_v32i8:1656; AVX512BW: # %bb.0:1657; AVX512BW-NEXT: vpsllw $4, %ymm0, %ymm11658; AVX512BW-NEXT: vpsrlw $4, %ymm0, %ymm01659; AVX512BW-NEXT: vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))1660; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01661; AVX512BW-NEXT: retq1662;1663; AVX512VLBW-LABEL: splatconstant_funnnel_v32i8:1664; AVX512VLBW: # %bb.0:1665; AVX512VLBW-NEXT: vpsllw $4, %ymm0, %ymm11666; AVX512VLBW-NEXT: vpsrlw $4, %ymm0, %ymm01667; AVX512VLBW-NEXT: vpternlogd {{.*#+}} ymm0 = ymm0 ^ (m32bcst & (ymm0 ^ ymm1))1668; AVX512VLBW-NEXT: retq1669;1670; AVX512VBMI2-LABEL: splatconstant_funnnel_v32i8:1671; AVX512VBMI2: # %bb.0:1672; AVX512VBMI2-NEXT: vpsllw $4, %ymm0, %ymm11673; AVX512VBMI2-NEXT: vpsrlw $4, %ymm0, %ymm01674; AVX512VBMI2-NEXT: vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))1675; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01676; AVX512VBMI2-NEXT: retq1677;1678; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v32i8:1679; AVX512VLVBMI2: # %bb.0:1680; AVX512VLVBMI2-NEXT: vpsllw $4, %ymm0, %ymm11681; AVX512VLVBMI2-NEXT: vpsrlw $4, %ymm0, %ymm01682; AVX512VLVBMI2-NEXT: vpternlogd {{.*#+}} ymm0 = ymm0 ^ (m32bcst & (ymm0 ^ ymm1))1683; AVX512VLVBMI2-NEXT: retq1684;1685; XOPAVX1-LABEL: splatconstant_funnnel_v32i8:1686; XOPAVX1: # %bb.0:1687; XOPAVX1-NEXT: vprotb $4, %xmm0, %xmm11688; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01689; XOPAVX1-NEXT: vprotb $4, %xmm0, %xmm01690; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01691; XOPAVX1-NEXT: retq1692;1693; XOPAVX2-LABEL: splatconstant_funnnel_v32i8:1694; XOPAVX2: # %bb.0:1695; XOPAVX2-NEXT: vprotb $4, %xmm0, %xmm11696; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm01697; XOPAVX2-NEXT: vprotb $4, %xmm0, %xmm01698; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm01699; XOPAVX2-NEXT: retq1700 %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %x, <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>)1701 ret <32 x i8> %res1702}1703