1923 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512F7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefix=AVX512VL8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=AVX512BW9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=AVX512VLBW10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2 | FileCheck %s --check-prefix=AVX512VBMI211; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2,+avx512vl | FileCheck %s --check-prefix=AVX512VLVBMI212; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX113; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX214 15; Just one 32-bit run to make sure we do reasonable things for i64 cases.16; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X86-SSE217 18declare <2 x i64> @llvm.fshl.v2i64(<2 x i64>, <2 x i64>, <2 x i64>)19declare <4 x i32> @llvm.fshl.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)20declare <8 x i16> @llvm.fshl.v8i16(<8 x i16>, <8 x i16>, <8 x i16>)21declare <16 x i8> @llvm.fshl.v16i8(<16 x i8>, <16 x i8>, <16 x i8>)22 23;24; Variable Shifts25;26 27define <2 x i64> @var_funnnel_v2i64(<2 x i64> %x, <2 x i64> %amt) nounwind {28; SSE2-LABEL: var_funnnel_v2i64:29; SSE2: # %bb.0:30; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [63,63]31; SSE2-NEXT: pxor %xmm3, %xmm332; SSE2-NEXT: psubq %xmm1, %xmm333; SSE2-NEXT: pand %xmm2, %xmm134; SSE2-NEXT: movdqa %xmm0, %xmm435; SSE2-NEXT: psllq %xmm1, %xmm436; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]37; SSE2-NEXT: movdqa %xmm0, %xmm538; SSE2-NEXT: psllq %xmm1, %xmm539; SSE2-NEXT: movsd {{.*#+}} xmm5 = xmm4[0],xmm5[1]40; SSE2-NEXT: pand %xmm2, %xmm341; SSE2-NEXT: movdqa %xmm0, %xmm142; SSE2-NEXT: psrlq %xmm3, %xmm143; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]44; SSE2-NEXT: psrlq %xmm2, %xmm045; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]46; SSE2-NEXT: orpd %xmm5, %xmm047; SSE2-NEXT: retq48;49; SSE41-LABEL: var_funnnel_v2i64:50; SSE41: # %bb.0:51; SSE41-NEXT: pmovsxbq {{.*#+}} xmm2 = [63,63]52; SSE41-NEXT: pxor %xmm3, %xmm353; SSE41-NEXT: psubq %xmm1, %xmm354; SSE41-NEXT: pand %xmm2, %xmm155; SSE41-NEXT: movdqa %xmm0, %xmm456; SSE41-NEXT: psllq %xmm1, %xmm457; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]58; SSE41-NEXT: movdqa %xmm0, %xmm559; SSE41-NEXT: psllq %xmm1, %xmm560; SSE41-NEXT: pblendw {{.*#+}} xmm5 = xmm4[0,1,2,3],xmm5[4,5,6,7]61; SSE41-NEXT: pand %xmm2, %xmm362; SSE41-NEXT: movdqa %xmm0, %xmm163; SSE41-NEXT: psrlq %xmm3, %xmm164; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]65; SSE41-NEXT: psrlq %xmm2, %xmm066; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]67; SSE41-NEXT: por %xmm5, %xmm068; SSE41-NEXT: retq69;70; AVX1-LABEL: var_funnnel_v2i64:71; AVX1: # %bb.0:72; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm2 = [63,63]73; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm374; AVX1-NEXT: vpsllq %xmm3, %xmm0, %xmm475; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]76; AVX1-NEXT: vpsllq %xmm3, %xmm0, %xmm377; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]78; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm479; AVX1-NEXT: vpsubq %xmm1, %xmm4, %xmm180; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm181; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm282; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]83; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm084; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]85; AVX1-NEXT: vpor %xmm0, %xmm3, %xmm086; AVX1-NEXT: retq87;88; AVX2-LABEL: var_funnnel_v2i64:89; AVX2: # %bb.0:90; AVX2-NEXT: vpmovsxbq {{.*#+}} xmm2 = [63,63]91; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm392; AVX2-NEXT: vpsllvq %xmm3, %xmm0, %xmm393; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm494; AVX2-NEXT: vpsubq %xmm1, %xmm4, %xmm195; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm196; AVX2-NEXT: vpsrlvq %xmm1, %xmm0, %xmm097; AVX2-NEXT: vpor %xmm0, %xmm3, %xmm098; AVX2-NEXT: retq99;100; AVX512F-LABEL: var_funnnel_v2i64:101; AVX512F: # %bb.0:102; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1103; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0104; AVX512F-NEXT: vprolvq %zmm1, %zmm0, %zmm0105; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0106; AVX512F-NEXT: vzeroupper107; AVX512F-NEXT: retq108;109; AVX512VL-LABEL: var_funnnel_v2i64:110; AVX512VL: # %bb.0:111; AVX512VL-NEXT: vprolvq %xmm1, %xmm0, %xmm0112; AVX512VL-NEXT: retq113;114; AVX512BW-LABEL: var_funnnel_v2i64:115; AVX512BW: # %bb.0:116; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1117; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0118; AVX512BW-NEXT: vprolvq %zmm1, %zmm0, %zmm0119; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0120; AVX512BW-NEXT: vzeroupper121; AVX512BW-NEXT: retq122;123; AVX512VLBW-LABEL: var_funnnel_v2i64:124; AVX512VLBW: # %bb.0:125; AVX512VLBW-NEXT: vprolvq %xmm1, %xmm0, %xmm0126; AVX512VLBW-NEXT: retq127;128; AVX512VBMI2-LABEL: var_funnnel_v2i64:129; AVX512VBMI2: # %bb.0:130; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1131; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0132; AVX512VBMI2-NEXT: vprolvq %zmm1, %zmm0, %zmm0133; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0134; AVX512VBMI2-NEXT: vzeroupper135; AVX512VBMI2-NEXT: retq136;137; AVX512VLVBMI2-LABEL: var_funnnel_v2i64:138; AVX512VLVBMI2: # %bb.0:139; AVX512VLVBMI2-NEXT: vprolvq %xmm1, %xmm0, %xmm0140; AVX512VLVBMI2-NEXT: retq141;142; XOP-LABEL: var_funnnel_v2i64:143; XOP: # %bb.0:144; XOP-NEXT: vprotq %xmm1, %xmm0, %xmm0145; XOP-NEXT: retq146;147; X86-SSE2-LABEL: var_funnnel_v2i64:148; X86-SSE2: # %bb.0:149; X86-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [63,0,63,0]150; X86-SSE2-NEXT: pxor %xmm3, %xmm3151; X86-SSE2-NEXT: psubq %xmm1, %xmm3152; X86-SSE2-NEXT: pand %xmm2, %xmm1153; X86-SSE2-NEXT: movdqa %xmm0, %xmm4154; X86-SSE2-NEXT: psllq %xmm1, %xmm4155; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]156; X86-SSE2-NEXT: movdqa %xmm0, %xmm5157; X86-SSE2-NEXT: psllq %xmm1, %xmm5158; X86-SSE2-NEXT: movsd {{.*#+}} xmm5 = xmm4[0],xmm5[1]159; X86-SSE2-NEXT: pand %xmm2, %xmm3160; X86-SSE2-NEXT: movdqa %xmm0, %xmm1161; X86-SSE2-NEXT: psrlq %xmm3, %xmm1162; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]163; X86-SSE2-NEXT: psrlq %xmm2, %xmm0164; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]165; X86-SSE2-NEXT: orpd %xmm5, %xmm0166; X86-SSE2-NEXT: retl167 %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> %amt)168 ret <2 x i64> %res169}170 171define <4 x i32> @var_funnnel_v4i32(<4 x i32> %x, <4 x i32> %amt) nounwind {172; SSE2-LABEL: var_funnnel_v4i32:173; SSE2: # %bb.0:174; SSE2-NEXT: pslld $23, %xmm1175; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1176; SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1177; SSE2-NEXT: cvttps2dq %xmm1, %xmm1178; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]179; SSE2-NEXT: pmuludq %xmm1, %xmm0180; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]181; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]182; SSE2-NEXT: pmuludq %xmm2, %xmm1183; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]184; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]185; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]186; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]187; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]188; SSE2-NEXT: por %xmm3, %xmm0189; SSE2-NEXT: retq190;191; SSE41-LABEL: var_funnnel_v4i32:192; SSE41: # %bb.0:193; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]194; SSE41-NEXT: pslld $23, %xmm1195; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1196; SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1197; SSE41-NEXT: cvttps2dq %xmm1, %xmm1198; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]199; SSE41-NEXT: pmuludq %xmm2, %xmm3200; SSE41-NEXT: pmuludq %xmm1, %xmm0201; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]202; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]203; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]204; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]205; SSE41-NEXT: por %xmm1, %xmm0206; SSE41-NEXT: retq207;208; AVX1-LABEL: var_funnnel_v4i32:209; AVX1: # %bb.0:210; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]211; AVX1-NEXT: vpslld $23, %xmm1, %xmm1212; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1213; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1214; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1215; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]216; AVX1-NEXT: vpmuludq %xmm3, %xmm2, %xmm2217; AVX1-NEXT: vpmuludq %xmm1, %xmm0, %xmm0218; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]219; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]220; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,2,2]221; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]222; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0223; AVX1-NEXT: retq224;225; AVX2-LABEL: var_funnnel_v4i32:226; AVX2: # %bb.0:227; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [31,31,31,31]228; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1229; AVX2-NEXT: vpsllvd %xmm1, %xmm0, %xmm2230; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]231; AVX2-NEXT: vpsubd %xmm1, %xmm3, %xmm1232; AVX2-NEXT: vpsrlvd %xmm1, %xmm0, %xmm0233; AVX2-NEXT: vpor %xmm0, %xmm2, %xmm0234; AVX2-NEXT: retq235;236; AVX512F-LABEL: var_funnnel_v4i32:237; AVX512F: # %bb.0:238; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1239; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0240; AVX512F-NEXT: vprolvd %zmm1, %zmm0, %zmm0241; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0242; AVX512F-NEXT: vzeroupper243; AVX512F-NEXT: retq244;245; AVX512VL-LABEL: var_funnnel_v4i32:246; AVX512VL: # %bb.0:247; AVX512VL-NEXT: vprolvd %xmm1, %xmm0, %xmm0248; AVX512VL-NEXT: retq249;250; AVX512BW-LABEL: var_funnnel_v4i32:251; AVX512BW: # %bb.0:252; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1253; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0254; AVX512BW-NEXT: vprolvd %zmm1, %zmm0, %zmm0255; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0256; AVX512BW-NEXT: vzeroupper257; AVX512BW-NEXT: retq258;259; AVX512VLBW-LABEL: var_funnnel_v4i32:260; AVX512VLBW: # %bb.0:261; AVX512VLBW-NEXT: vprolvd %xmm1, %xmm0, %xmm0262; AVX512VLBW-NEXT: retq263;264; AVX512VBMI2-LABEL: var_funnnel_v4i32:265; AVX512VBMI2: # %bb.0:266; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1267; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0268; AVX512VBMI2-NEXT: vprolvd %zmm1, %zmm0, %zmm0269; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0270; AVX512VBMI2-NEXT: vzeroupper271; AVX512VBMI2-NEXT: retq272;273; AVX512VLVBMI2-LABEL: var_funnnel_v4i32:274; AVX512VLVBMI2: # %bb.0:275; AVX512VLVBMI2-NEXT: vprolvd %xmm1, %xmm0, %xmm0276; AVX512VLVBMI2-NEXT: retq277;278; XOP-LABEL: var_funnnel_v4i32:279; XOP: # %bb.0:280; XOP-NEXT: vprotd %xmm1, %xmm0, %xmm0281; XOP-NEXT: retq282;283; X86-SSE2-LABEL: var_funnnel_v4i32:284; X86-SSE2: # %bb.0:285; X86-SSE2-NEXT: pslld $23, %xmm1286; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1287; X86-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1288; X86-SSE2-NEXT: cvttps2dq %xmm1, %xmm1289; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]290; X86-SSE2-NEXT: pmuludq %xmm1, %xmm0291; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]292; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]293; X86-SSE2-NEXT: pmuludq %xmm2, %xmm1294; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]295; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]296; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]297; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]298; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]299; X86-SSE2-NEXT: por %xmm3, %xmm0300; X86-SSE2-NEXT: retl301 %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> %amt)302 ret <4 x i32> %res303}304 305define <8 x i16> @var_funnnel_v8i16(<8 x i16> %x, <8 x i16> %amt) nounwind {306; SSE2-LABEL: var_funnnel_v8i16:307; SSE2: # %bb.0:308; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1309; SSE2-NEXT: movdqa %xmm1, %xmm2310; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]311; SSE2-NEXT: pslld $23, %xmm2312; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]313; SSE2-NEXT: paddd %xmm3, %xmm2314; SSE2-NEXT: cvttps2dq %xmm2, %xmm2315; SSE2-NEXT: pslld $16, %xmm2316; SSE2-NEXT: psrad $16, %xmm2317; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]318; SSE2-NEXT: pslld $23, %xmm1319; SSE2-NEXT: paddd %xmm3, %xmm1320; SSE2-NEXT: cvttps2dq %xmm1, %xmm1321; SSE2-NEXT: pslld $16, %xmm1322; SSE2-NEXT: psrad $16, %xmm1323; SSE2-NEXT: packssdw %xmm2, %xmm1324; SSE2-NEXT: movdqa %xmm0, %xmm2325; SSE2-NEXT: pmulhuw %xmm1, %xmm2326; SSE2-NEXT: pmullw %xmm1, %xmm0327; SSE2-NEXT: por %xmm2, %xmm0328; SSE2-NEXT: retq329;330; SSE41-LABEL: var_funnnel_v8i16:331; SSE41: # %bb.0:332; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1333; SSE41-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero334; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]335; SSE41-NEXT: pslld $23, %xmm1336; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]337; SSE41-NEXT: paddd %xmm3, %xmm1338; SSE41-NEXT: cvttps2dq %xmm1, %xmm1339; SSE41-NEXT: pslld $23, %xmm2340; SSE41-NEXT: paddd %xmm3, %xmm2341; SSE41-NEXT: cvttps2dq %xmm2, %xmm2342; SSE41-NEXT: packusdw %xmm1, %xmm2343; SSE41-NEXT: movdqa %xmm0, %xmm1344; SSE41-NEXT: pmulhuw %xmm2, %xmm1345; SSE41-NEXT: pmullw %xmm2, %xmm0346; SSE41-NEXT: por %xmm1, %xmm0347; SSE41-NEXT: retq348;349; AVX1-LABEL: var_funnnel_v8i16:350; AVX1: # %bb.0:351; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1352; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm1[4,4,5,5,6,6,7,7]353; AVX1-NEXT: vpslld $23, %xmm2, %xmm2354; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]355; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2356; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2357; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero358; AVX1-NEXT: vpslld $23, %xmm1, %xmm1359; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1360; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1361; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1362; AVX1-NEXT: vpmulhuw %xmm1, %xmm0, %xmm2363; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0364; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0365; AVX1-NEXT: retq366;367; AVX2-LABEL: var_funnnel_v8i16:368; AVX2: # %bb.0:369; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1370; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2371; AVX2-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]372; AVX2-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm0[4,4,5,5,6,6,7,7]373; AVX2-NEXT: vpsllvd %xmm2, %xmm3, %xmm2374; AVX2-NEXT: vpsrld $16, %xmm2, %xmm2375; AVX2-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]376; AVX2-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero377; AVX2-NEXT: vpsllvd %xmm1, %xmm0, %xmm0378; AVX2-NEXT: vpsrld $16, %xmm0, %xmm0379; AVX2-NEXT: vpackusdw %xmm2, %xmm0, %xmm0380; AVX2-NEXT: retq381;382; AVX512F-LABEL: var_funnnel_v8i16:383; AVX512F: # %bb.0:384; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1385; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2386; AVX512F-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]387; AVX512F-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm0[4,4,5,5,6,6,7,7]388; AVX512F-NEXT: vpsllvd %xmm2, %xmm3, %xmm2389; AVX512F-NEXT: vpsrld $16, %xmm2, %xmm2390; AVX512F-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]391; AVX512F-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero392; AVX512F-NEXT: vpsllvd %xmm1, %xmm0, %xmm0393; AVX512F-NEXT: vpsrld $16, %xmm0, %xmm0394; AVX512F-NEXT: vpackusdw %xmm2, %xmm0, %xmm0395; AVX512F-NEXT: retq396;397; AVX512VL-LABEL: var_funnnel_v8i16:398; AVX512VL: # %bb.0:399; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1400; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm2401; AVX512VL-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]402; AVX512VL-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm0[4,4,5,5,6,6,7,7]403; AVX512VL-NEXT: vpsllvd %xmm2, %xmm3, %xmm2404; AVX512VL-NEXT: vpsrld $16, %xmm2, %xmm2405; AVX512VL-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]406; AVX512VL-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero407; AVX512VL-NEXT: vpsllvd %xmm1, %xmm0, %xmm0408; AVX512VL-NEXT: vpsrld $16, %xmm0, %xmm0409; AVX512VL-NEXT: vpackusdw %xmm2, %xmm0, %xmm0410; AVX512VL-NEXT: retq411;412; AVX512BW-LABEL: var_funnnel_v8i16:413; AVX512BW: # %bb.0:414; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0415; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1416; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm2417; AVX512BW-NEXT: vpbroadcastw {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]418; AVX512BW-NEXT: vpsubw %xmm1, %xmm3, %xmm1419; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0420; AVX512BW-NEXT: vpor %xmm0, %xmm2, %xmm0421; AVX512BW-NEXT: vzeroupper422; AVX512BW-NEXT: retq423;424; AVX512VLBW-LABEL: var_funnnel_v8i16:425; AVX512VLBW: # %bb.0:426; AVX512VLBW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1427; AVX512VLBW-NEXT: vpsllvw %xmm1, %xmm0, %xmm2428; AVX512VLBW-NEXT: vpbroadcastw {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]429; AVX512VLBW-NEXT: vpsubw %xmm1, %xmm3, %xmm1430; AVX512VLBW-NEXT: vpsrlvw %xmm1, %xmm0, %xmm0431; AVX512VLBW-NEXT: vpor %xmm0, %xmm2, %xmm0432; AVX512VLBW-NEXT: retq433;434; AVX512VBMI2-LABEL: var_funnnel_v8i16:435; AVX512VBMI2: # %bb.0:436; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1437; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0438; AVX512VBMI2-NEXT: vpshldvw %zmm1, %zmm0, %zmm0439; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0440; AVX512VBMI2-NEXT: vzeroupper441; AVX512VBMI2-NEXT: retq442;443; AVX512VLVBMI2-LABEL: var_funnnel_v8i16:444; AVX512VLVBMI2: # %bb.0:445; AVX512VLVBMI2-NEXT: vpshldvw %xmm1, %xmm0, %xmm0446; AVX512VLVBMI2-NEXT: retq447;448; XOP-LABEL: var_funnnel_v8i16:449; XOP: # %bb.0:450; XOP-NEXT: vprotw %xmm1, %xmm0, %xmm0451; XOP-NEXT: retq452;453; X86-SSE2-LABEL: var_funnnel_v8i16:454; X86-SSE2: # %bb.0:455; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1456; X86-SSE2-NEXT: movdqa %xmm1, %xmm2457; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]458; X86-SSE2-NEXT: pslld $23, %xmm2459; X86-SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]460; X86-SSE2-NEXT: paddd %xmm3, %xmm2461; X86-SSE2-NEXT: cvttps2dq %xmm2, %xmm2462; X86-SSE2-NEXT: pslld $16, %xmm2463; X86-SSE2-NEXT: psrad $16, %xmm2464; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]465; X86-SSE2-NEXT: pslld $23, %xmm1466; X86-SSE2-NEXT: paddd %xmm3, %xmm1467; X86-SSE2-NEXT: cvttps2dq %xmm1, %xmm1468; X86-SSE2-NEXT: pslld $16, %xmm1469; X86-SSE2-NEXT: psrad $16, %xmm1470; X86-SSE2-NEXT: packssdw %xmm2, %xmm1471; X86-SSE2-NEXT: movdqa %xmm0, %xmm2472; X86-SSE2-NEXT: pmulhuw %xmm1, %xmm2473; X86-SSE2-NEXT: pmullw %xmm1, %xmm0474; X86-SSE2-NEXT: por %xmm2, %xmm0475; X86-SSE2-NEXT: retl476 %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %x, <8 x i16> %amt)477 ret <8 x i16> %res478}479 480define <16 x i8> @var_funnnel_v16i8(<16 x i8> %x, <16 x i8> %amt) nounwind {481; SSE2-LABEL: var_funnnel_v16i8:482; SSE2: # %bb.0:483; SSE2-NEXT: movdqa %xmm0, %xmm2484; SSE2-NEXT: psllw $5, %xmm1485; SSE2-NEXT: pxor %xmm0, %xmm0486; SSE2-NEXT: pxor %xmm3, %xmm3487; SSE2-NEXT: pcmpgtb %xmm1, %xmm3488; SSE2-NEXT: movdqa %xmm2, %xmm4489; SSE2-NEXT: psrlw $4, %xmm4490; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4491; SSE2-NEXT: movdqa %xmm2, %xmm5492; SSE2-NEXT: psllw $4, %xmm5493; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5494; SSE2-NEXT: por %xmm4, %xmm5495; SSE2-NEXT: pand %xmm3, %xmm5496; SSE2-NEXT: pandn %xmm2, %xmm3497; SSE2-NEXT: por %xmm5, %xmm3498; SSE2-NEXT: movdqa %xmm3, %xmm2499; SSE2-NEXT: psrlw $6, %xmm2500; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2501; SSE2-NEXT: movdqa %xmm3, %xmm4502; SSE2-NEXT: psllw $2, %xmm4503; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4504; SSE2-NEXT: por %xmm2, %xmm4505; SSE2-NEXT: paddb %xmm1, %xmm1506; SSE2-NEXT: pxor %xmm2, %xmm2507; SSE2-NEXT: pcmpgtb %xmm1, %xmm2508; SSE2-NEXT: pand %xmm2, %xmm4509; SSE2-NEXT: pandn %xmm3, %xmm2510; SSE2-NEXT: por %xmm4, %xmm2511; SSE2-NEXT: movdqa %xmm2, %xmm3512; SSE2-NEXT: paddb %xmm2, %xmm3513; SSE2-NEXT: movdqa %xmm2, %xmm4514; SSE2-NEXT: psrlw $7, %xmm4515; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4516; SSE2-NEXT: por %xmm3, %xmm4517; SSE2-NEXT: paddb %xmm1, %xmm1518; SSE2-NEXT: pcmpgtb %xmm1, %xmm0519; SSE2-NEXT: pand %xmm0, %xmm4520; SSE2-NEXT: pandn %xmm2, %xmm0521; SSE2-NEXT: por %xmm4, %xmm0522; SSE2-NEXT: retq523;524; SSE41-LABEL: var_funnnel_v16i8:525; SSE41: # %bb.0:526; SSE41-NEXT: movdqa %xmm1, %xmm2527; SSE41-NEXT: movdqa %xmm0, %xmm1528; SSE41-NEXT: psrlw $4, %xmm0529; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0530; SSE41-NEXT: movdqa %xmm1, %xmm3531; SSE41-NEXT: psllw $4, %xmm3532; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3533; SSE41-NEXT: por %xmm0, %xmm3534; SSE41-NEXT: psllw $5, %xmm2535; SSE41-NEXT: movdqa %xmm2, %xmm0536; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm1537; SSE41-NEXT: movdqa %xmm1, %xmm0538; SSE41-NEXT: psrlw $6, %xmm0539; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0540; SSE41-NEXT: movdqa %xmm1, %xmm3541; SSE41-NEXT: psllw $2, %xmm3542; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3543; SSE41-NEXT: por %xmm0, %xmm3544; SSE41-NEXT: paddb %xmm2, %xmm2545; SSE41-NEXT: movdqa %xmm2, %xmm0546; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm1547; SSE41-NEXT: movdqa %xmm1, %xmm0548; SSE41-NEXT: paddb %xmm1, %xmm0549; SSE41-NEXT: movdqa %xmm1, %xmm3550; SSE41-NEXT: psrlw $7, %xmm3551; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3552; SSE41-NEXT: por %xmm0, %xmm3553; SSE41-NEXT: paddb %xmm2, %xmm2554; SSE41-NEXT: movdqa %xmm2, %xmm0555; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm1556; SSE41-NEXT: movdqa %xmm1, %xmm0557; SSE41-NEXT: retq558;559; AVX-LABEL: var_funnnel_v16i8:560; AVX: # %bb.0:561; AVX-NEXT: vpsrlw $4, %xmm0, %xmm2562; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2563; AVX-NEXT: vpsllw $4, %xmm0, %xmm3564; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3565; AVX-NEXT: vpor %xmm2, %xmm3, %xmm2566; AVX-NEXT: vpsllw $5, %xmm1, %xmm1567; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0568; AVX-NEXT: vpsrlw $6, %xmm0, %xmm2569; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2570; AVX-NEXT: vpsllw $2, %xmm0, %xmm3571; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3572; AVX-NEXT: vpor %xmm2, %xmm3, %xmm2573; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1574; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0575; AVX-NEXT: vpaddb %xmm0, %xmm0, %xmm2576; AVX-NEXT: vpsrlw $7, %xmm0, %xmm3577; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3578; AVX-NEXT: vpor %xmm3, %xmm2, %xmm2579; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1580; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0581; AVX-NEXT: retq582;583; AVX512F-LABEL: var_funnnel_v16i8:584; AVX512F: # %bb.0:585; AVX512F-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero586; AVX512F-NEXT: vpslld $8, %zmm0, %zmm2587; AVX512F-NEXT: vpord %zmm2, %zmm0, %zmm0588; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1589; AVX512F-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero590; AVX512F-NEXT: vpsllvd %zmm1, %zmm0, %zmm0591; AVX512F-NEXT: vpsrld $8, %zmm0, %zmm0592; AVX512F-NEXT: vpmovdb %zmm0, %xmm0593; AVX512F-NEXT: vzeroupper594; AVX512F-NEXT: retq595;596; AVX512VL-LABEL: var_funnnel_v16i8:597; AVX512VL: # %bb.0:598; AVX512VL-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero599; AVX512VL-NEXT: vpslld $8, %zmm0, %zmm2600; AVX512VL-NEXT: vpord %zmm2, %zmm0, %zmm0601; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1602; AVX512VL-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero603; AVX512VL-NEXT: vpsllvd %zmm1, %zmm0, %zmm0604; AVX512VL-NEXT: vpsrld $8, %zmm0, %zmm0605; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0606; AVX512VL-NEXT: vzeroupper607; AVX512VL-NEXT: retq608;609; AVX512BW-LABEL: var_funnnel_v16i8:610; AVX512BW: # %bb.0:611; AVX512BW-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]612; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1613; AVX512BW-NEXT: vpxor %xmm3, %xmm3, %xmm3614; AVX512BW-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm3[8],xmm1[9],xmm3[9],xmm1[10],xmm3[10],xmm1[11],xmm3[11],xmm1[12],xmm3[12],xmm1[13],xmm3[13],xmm1[14],xmm3[14],xmm1[15],xmm3[15]615; AVX512BW-NEXT: vpsllvw %zmm3, %zmm2, %zmm2616; AVX512BW-NEXT: vpsrlw $8, %xmm2, %xmm2617; AVX512BW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]618; AVX512BW-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero619; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0620; AVX512BW-NEXT: vpsrlw $8, %xmm0, %xmm0621; AVX512BW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0622; AVX512BW-NEXT: vzeroupper623; AVX512BW-NEXT: retq624;625; AVX512VLBW-LABEL: var_funnnel_v16i8:626; AVX512VLBW: # %bb.0:627; AVX512VLBW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1628; AVX512VLBW-NEXT: vpxor %xmm2, %xmm2, %xmm2629; AVX512VLBW-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]630; AVX512VLBW-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]631; AVX512VLBW-NEXT: vpsllvw %xmm2, %xmm3, %xmm2632; AVX512VLBW-NEXT: vpsrlw $8, %xmm2, %xmm2633; AVX512VLBW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]634; AVX512VLBW-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero635; AVX512VLBW-NEXT: vpsllvw %xmm1, %xmm0, %xmm0636; AVX512VLBW-NEXT: vpsrlw $8, %xmm0, %xmm0637; AVX512VLBW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0638; AVX512VLBW-NEXT: retq639;640; AVX512VBMI2-LABEL: var_funnnel_v16i8:641; AVX512VBMI2: # %bb.0:642; AVX512VBMI2-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]643; AVX512VBMI2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1644; AVX512VBMI2-NEXT: vpxor %xmm3, %xmm3, %xmm3645; AVX512VBMI2-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm3[8],xmm1[9],xmm3[9],xmm1[10],xmm3[10],xmm1[11],xmm3[11],xmm1[12],xmm3[12],xmm1[13],xmm3[13],xmm1[14],xmm3[14],xmm1[15],xmm3[15]646; AVX512VBMI2-NEXT: vpsllvw %zmm3, %zmm2, %zmm2647; AVX512VBMI2-NEXT: vpsrlw $8, %xmm2, %xmm2648; AVX512VBMI2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]649; AVX512VBMI2-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero650; AVX512VBMI2-NEXT: vpsllvw %zmm1, %zmm0, %zmm0651; AVX512VBMI2-NEXT: vpsrlw $8, %xmm0, %xmm0652; AVX512VBMI2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0653; AVX512VBMI2-NEXT: vzeroupper654; AVX512VBMI2-NEXT: retq655;656; AVX512VLVBMI2-LABEL: var_funnnel_v16i8:657; AVX512VLVBMI2: # %bb.0:658; AVX512VLVBMI2-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1659; AVX512VLVBMI2-NEXT: vpxor %xmm2, %xmm2, %xmm2660; AVX512VLVBMI2-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]661; AVX512VLVBMI2-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]662; AVX512VLVBMI2-NEXT: vpsllvw %xmm2, %xmm3, %xmm2663; AVX512VLVBMI2-NEXT: vpsrlw $8, %xmm2, %xmm2664; AVX512VLVBMI2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]665; AVX512VLVBMI2-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero666; AVX512VLVBMI2-NEXT: vpsllvw %xmm1, %xmm0, %xmm0667; AVX512VLVBMI2-NEXT: vpsrlw $8, %xmm0, %xmm0668; AVX512VLVBMI2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0669; AVX512VLVBMI2-NEXT: retq670;671; XOP-LABEL: var_funnnel_v16i8:672; XOP: # %bb.0:673; XOP-NEXT: vprotb %xmm1, %xmm0, %xmm0674; XOP-NEXT: retq675;676; X86-SSE2-LABEL: var_funnnel_v16i8:677; X86-SSE2: # %bb.0:678; X86-SSE2-NEXT: movdqa %xmm0, %xmm2679; X86-SSE2-NEXT: psllw $5, %xmm1680; X86-SSE2-NEXT: pxor %xmm0, %xmm0681; X86-SSE2-NEXT: pxor %xmm3, %xmm3682; X86-SSE2-NEXT: pcmpgtb %xmm1, %xmm3683; X86-SSE2-NEXT: movdqa %xmm2, %xmm4684; X86-SSE2-NEXT: psrlw $4, %xmm4685; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm4686; X86-SSE2-NEXT: movdqa %xmm2, %xmm5687; X86-SSE2-NEXT: psllw $4, %xmm5688; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm5689; X86-SSE2-NEXT: por %xmm4, %xmm5690; X86-SSE2-NEXT: pand %xmm3, %xmm5691; X86-SSE2-NEXT: pandn %xmm2, %xmm3692; X86-SSE2-NEXT: por %xmm5, %xmm3693; X86-SSE2-NEXT: movdqa %xmm3, %xmm2694; X86-SSE2-NEXT: psrlw $6, %xmm2695; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2696; X86-SSE2-NEXT: movdqa %xmm3, %xmm4697; X86-SSE2-NEXT: psllw $2, %xmm4698; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm4699; X86-SSE2-NEXT: por %xmm2, %xmm4700; X86-SSE2-NEXT: paddb %xmm1, %xmm1701; X86-SSE2-NEXT: pxor %xmm2, %xmm2702; X86-SSE2-NEXT: pcmpgtb %xmm1, %xmm2703; X86-SSE2-NEXT: pand %xmm2, %xmm4704; X86-SSE2-NEXT: pandn %xmm3, %xmm2705; X86-SSE2-NEXT: por %xmm4, %xmm2706; X86-SSE2-NEXT: movdqa %xmm2, %xmm3707; X86-SSE2-NEXT: paddb %xmm2, %xmm3708; X86-SSE2-NEXT: movdqa %xmm2, %xmm4709; X86-SSE2-NEXT: psrlw $7, %xmm4710; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm4711; X86-SSE2-NEXT: por %xmm3, %xmm4712; X86-SSE2-NEXT: paddb %xmm1, %xmm1713; X86-SSE2-NEXT: pcmpgtb %xmm1, %xmm0714; X86-SSE2-NEXT: pand %xmm0, %xmm4715; X86-SSE2-NEXT: pandn %xmm2, %xmm0716; X86-SSE2-NEXT: por %xmm4, %xmm0717; X86-SSE2-NEXT: retl718 %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %x, <16 x i8> %amt)719 ret <16 x i8> %res720}721 722;723; Uniform Variable Shifts724;725 726define <2 x i64> @splatvar_funnnel_v2i64(<2 x i64> %x, <2 x i64> %amt) nounwind {727; SSE2-LABEL: splatvar_funnnel_v2i64:728; SSE2: # %bb.0:729; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [63,63]730; SSE2-NEXT: pxor %xmm3, %xmm3731; SSE2-NEXT: psubq %xmm1, %xmm3732; SSE2-NEXT: pand %xmm2, %xmm1733; SSE2-NEXT: movdqa %xmm0, %xmm4734; SSE2-NEXT: psllq %xmm1, %xmm4735; SSE2-NEXT: pand %xmm2, %xmm3736; SSE2-NEXT: psrlq %xmm3, %xmm0737; SSE2-NEXT: por %xmm4, %xmm0738; SSE2-NEXT: retq739;740; SSE41-LABEL: splatvar_funnnel_v2i64:741; SSE41: # %bb.0:742; SSE41-NEXT: pmovsxbq {{.*#+}} xmm2 = [63,63]743; SSE41-NEXT: pxor %xmm3, %xmm3744; SSE41-NEXT: psubq %xmm1, %xmm3745; SSE41-NEXT: pand %xmm2, %xmm1746; SSE41-NEXT: movdqa %xmm0, %xmm4747; SSE41-NEXT: psllq %xmm1, %xmm4748; SSE41-NEXT: pand %xmm2, %xmm3749; SSE41-NEXT: psrlq %xmm3, %xmm0750; SSE41-NEXT: por %xmm4, %xmm0751; SSE41-NEXT: retq752;753; AVX-LABEL: splatvar_funnnel_v2i64:754; AVX: # %bb.0:755; AVX-NEXT: vpmovsxbq {{.*#+}} xmm2 = [63,63]756; AVX-NEXT: vpand %xmm2, %xmm1, %xmm3757; AVX-NEXT: vpsllq %xmm3, %xmm0, %xmm3758; AVX-NEXT: vpxor %xmm4, %xmm4, %xmm4759; AVX-NEXT: vpsubq %xmm1, %xmm4, %xmm1760; AVX-NEXT: vpand %xmm2, %xmm1, %xmm1761; AVX-NEXT: vpsrlq %xmm1, %xmm0, %xmm0762; AVX-NEXT: vpor %xmm0, %xmm3, %xmm0763; AVX-NEXT: retq764;765; AVX512F-LABEL: splatvar_funnnel_v2i64:766; AVX512F: # %bb.0:767; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0768; AVX512F-NEXT: vpbroadcastq %xmm1, %xmm1769; AVX512F-NEXT: vprolvq %zmm1, %zmm0, %zmm0770; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0771; AVX512F-NEXT: vzeroupper772; AVX512F-NEXT: retq773;774; AVX512VL-LABEL: splatvar_funnnel_v2i64:775; AVX512VL: # %bb.0:776; AVX512VL-NEXT: vpbroadcastq %xmm1, %xmm1777; AVX512VL-NEXT: vprolvq %xmm1, %xmm0, %xmm0778; AVX512VL-NEXT: retq779;780; AVX512BW-LABEL: splatvar_funnnel_v2i64:781; AVX512BW: # %bb.0:782; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0783; AVX512BW-NEXT: vpbroadcastq %xmm1, %xmm1784; AVX512BW-NEXT: vprolvq %zmm1, %zmm0, %zmm0785; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0786; AVX512BW-NEXT: vzeroupper787; AVX512BW-NEXT: retq788;789; AVX512VLBW-LABEL: splatvar_funnnel_v2i64:790; AVX512VLBW: # %bb.0:791; AVX512VLBW-NEXT: vpbroadcastq %xmm1, %xmm1792; AVX512VLBW-NEXT: vprolvq %xmm1, %xmm0, %xmm0793; AVX512VLBW-NEXT: retq794;795; AVX512VBMI2-LABEL: splatvar_funnnel_v2i64:796; AVX512VBMI2: # %bb.0:797; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0798; AVX512VBMI2-NEXT: vpbroadcastq %xmm1, %xmm1799; AVX512VBMI2-NEXT: vprolvq %zmm1, %zmm0, %zmm0800; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0801; AVX512VBMI2-NEXT: vzeroupper802; AVX512VBMI2-NEXT: retq803;804; AVX512VLVBMI2-LABEL: splatvar_funnnel_v2i64:805; AVX512VLVBMI2: # %bb.0:806; AVX512VLVBMI2-NEXT: vpbroadcastq %xmm1, %xmm1807; AVX512VLVBMI2-NEXT: vprolvq %xmm1, %xmm0, %xmm0808; AVX512VLVBMI2-NEXT: retq809;810; XOPAVX1-LABEL: splatvar_funnnel_v2i64:811; XOPAVX1: # %bb.0:812; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]813; XOPAVX1-NEXT: vprotq %xmm1, %xmm0, %xmm0814; XOPAVX1-NEXT: retq815;816; XOPAVX2-LABEL: splatvar_funnnel_v2i64:817; XOPAVX2: # %bb.0:818; XOPAVX2-NEXT: vpbroadcastq %xmm1, %xmm1819; XOPAVX2-NEXT: vprotq %xmm1, %xmm0, %xmm0820; XOPAVX2-NEXT: retq821;822; X86-SSE2-LABEL: splatvar_funnnel_v2i64:823; X86-SSE2: # %bb.0:824; X86-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [63,0,63,0]825; X86-SSE2-NEXT: pxor %xmm3, %xmm3826; X86-SSE2-NEXT: psubq %xmm1, %xmm3827; X86-SSE2-NEXT: pand %xmm2, %xmm1828; X86-SSE2-NEXT: movdqa %xmm0, %xmm4829; X86-SSE2-NEXT: psllq %xmm1, %xmm4830; X86-SSE2-NEXT: pand %xmm2, %xmm3831; X86-SSE2-NEXT: psrlq %xmm3, %xmm0832; X86-SSE2-NEXT: por %xmm4, %xmm0833; X86-SSE2-NEXT: retl834 %splat = shufflevector <2 x i64> %amt, <2 x i64> undef, <2 x i32> zeroinitializer835 %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> %splat)836 ret <2 x i64> %res837}838 839define <4 x i32> @splatvar_funnnel_v4i32(<4 x i32> %x, <4 x i32> %amt) nounwind {840; SSE-LABEL: splatvar_funnnel_v4i32:841; SSE: # %bb.0:842; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1843; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]844; SSE-NEXT: psllq %xmm1, %xmm2845; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]846; SSE-NEXT: psllq %xmm1, %xmm0847; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm2[1,3]848; SSE-NEXT: retq849;850; AVX-LABEL: splatvar_funnnel_v4i32:851; AVX: # %bb.0:852; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1853; AVX-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]854; AVX-NEXT: vpsllq %xmm1, %xmm2, %xmm2855; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]856; AVX-NEXT: vpsllq %xmm1, %xmm0, %xmm0857; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm2[1,3]858; AVX-NEXT: retq859;860; AVX512F-LABEL: splatvar_funnnel_v4i32:861; AVX512F: # %bb.0:862; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0863; AVX512F-NEXT: vpbroadcastd %xmm1, %xmm1864; AVX512F-NEXT: vprolvd %zmm1, %zmm0, %zmm0865; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0866; AVX512F-NEXT: vzeroupper867; AVX512F-NEXT: retq868;869; AVX512VL-LABEL: splatvar_funnnel_v4i32:870; AVX512VL: # %bb.0:871; AVX512VL-NEXT: vpbroadcastd %xmm1, %xmm1872; AVX512VL-NEXT: vprolvd %xmm1, %xmm0, %xmm0873; AVX512VL-NEXT: retq874;875; AVX512BW-LABEL: splatvar_funnnel_v4i32:876; AVX512BW: # %bb.0:877; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0878; AVX512BW-NEXT: vpbroadcastd %xmm1, %xmm1879; AVX512BW-NEXT: vprolvd %zmm1, %zmm0, %zmm0880; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0881; AVX512BW-NEXT: vzeroupper882; AVX512BW-NEXT: retq883;884; AVX512VLBW-LABEL: splatvar_funnnel_v4i32:885; AVX512VLBW: # %bb.0:886; AVX512VLBW-NEXT: vpbroadcastd %xmm1, %xmm1887; AVX512VLBW-NEXT: vprolvd %xmm1, %xmm0, %xmm0888; AVX512VLBW-NEXT: retq889;890; AVX512VBMI2-LABEL: splatvar_funnnel_v4i32:891; AVX512VBMI2: # %bb.0:892; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0893; AVX512VBMI2-NEXT: vpbroadcastd %xmm1, %xmm1894; AVX512VBMI2-NEXT: vprolvd %zmm1, %zmm0, %zmm0895; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0896; AVX512VBMI2-NEXT: vzeroupper897; AVX512VBMI2-NEXT: retq898;899; AVX512VLVBMI2-LABEL: splatvar_funnnel_v4i32:900; AVX512VLVBMI2: # %bb.0:901; AVX512VLVBMI2-NEXT: vpbroadcastd %xmm1, %xmm1902; AVX512VLVBMI2-NEXT: vprolvd %xmm1, %xmm0, %xmm0903; AVX512VLVBMI2-NEXT: retq904;905; XOPAVX1-LABEL: splatvar_funnnel_v4i32:906; XOPAVX1: # %bb.0:907; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]908; XOPAVX1-NEXT: vprotd %xmm1, %xmm0, %xmm0909; XOPAVX1-NEXT: retq910;911; XOPAVX2-LABEL: splatvar_funnnel_v4i32:912; XOPAVX2: # %bb.0:913; XOPAVX2-NEXT: vpbroadcastd %xmm1, %xmm1914; XOPAVX2-NEXT: vprotd %xmm1, %xmm0, %xmm0915; XOPAVX2-NEXT: retq916;917; X86-SSE2-LABEL: splatvar_funnnel_v4i32:918; X86-SSE2: # %bb.0:919; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1920; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]921; X86-SSE2-NEXT: psllq %xmm1, %xmm2922; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]923; X86-SSE2-NEXT: psllq %xmm1, %xmm0924; X86-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm2[1,3]925; X86-SSE2-NEXT: retl926 %splat = shufflevector <4 x i32> %amt, <4 x i32> undef, <4 x i32> zeroinitializer927 %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> %splat)928 ret <4 x i32> %res929}930 931define <8 x i16> @splatvar_funnnel_v8i16(<8 x i16> %x, <8 x i16> %amt) nounwind {932; SSE2-LABEL: splatvar_funnnel_v8i16:933; SSE2: # %bb.0:934; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1935; SSE2-NEXT: movdqa %xmm0, %xmm2936; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]937; SSE2-NEXT: pslld %xmm1, %xmm2938; SSE2-NEXT: psrad $16, %xmm2939; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]940; SSE2-NEXT: pslld %xmm1, %xmm0941; SSE2-NEXT: psrad $16, %xmm0942; SSE2-NEXT: packssdw %xmm2, %xmm0943; SSE2-NEXT: retq944;945; SSE41-LABEL: splatvar_funnnel_v8i16:946; SSE41: # %bb.0:947; SSE41-NEXT: pmovsxbq {{.*#+}} xmm2 = [15,0]948; SSE41-NEXT: movdqa %xmm1, %xmm3949; SSE41-NEXT: pandn %xmm2, %xmm3950; SSE41-NEXT: movdqa %xmm0, %xmm4951; SSE41-NEXT: psrlw $1, %xmm4952; SSE41-NEXT: psrlw %xmm3, %xmm4953; SSE41-NEXT: pand %xmm2, %xmm1954; SSE41-NEXT: psllw %xmm1, %xmm0955; SSE41-NEXT: por %xmm4, %xmm0956; SSE41-NEXT: retq957;958; AVX-LABEL: splatvar_funnnel_v8i16:959; AVX: # %bb.0:960; AVX-NEXT: vpmovsxbq {{.*#+}} xmm2 = [15,0]961; AVX-NEXT: vpandn %xmm2, %xmm1, %xmm3962; AVX-NEXT: vpsrlw $1, %xmm0, %xmm4963; AVX-NEXT: vpsrlw %xmm3, %xmm4, %xmm3964; AVX-NEXT: vpand %xmm2, %xmm1, %xmm1965; AVX-NEXT: vpsllw %xmm1, %xmm0, %xmm0966; AVX-NEXT: vpor %xmm3, %xmm0, %xmm0967; AVX-NEXT: retq968;969; AVX512F-LABEL: splatvar_funnnel_v8i16:970; AVX512F: # %bb.0:971; AVX512F-NEXT: vpmovsxbq {{.*#+}} xmm2 = [15,0]972; AVX512F-NEXT: vpandn %xmm2, %xmm1, %xmm3973; AVX512F-NEXT: vpsrlw $1, %xmm0, %xmm4974; AVX512F-NEXT: vpsrlw %xmm3, %xmm4, %xmm3975; AVX512F-NEXT: vpand %xmm2, %xmm1, %xmm1976; AVX512F-NEXT: vpsllw %xmm1, %xmm0, %xmm0977; AVX512F-NEXT: vpor %xmm3, %xmm0, %xmm0978; AVX512F-NEXT: retq979;980; AVX512VL-LABEL: splatvar_funnnel_v8i16:981; AVX512VL: # %bb.0:982; AVX512VL-NEXT: vpmovsxbq {{.*#+}} xmm2 = [15,0]983; AVX512VL-NEXT: vpandn %xmm2, %xmm1, %xmm3984; AVX512VL-NEXT: vpsrlw $1, %xmm0, %xmm4985; AVX512VL-NEXT: vpsrlw %xmm3, %xmm4, %xmm3986; AVX512VL-NEXT: vpand %xmm2, %xmm1, %xmm1987; AVX512VL-NEXT: vpsllw %xmm1, %xmm0, %xmm0988; AVX512VL-NEXT: vpor %xmm3, %xmm0, %xmm0989; AVX512VL-NEXT: retq990;991; AVX512BW-LABEL: splatvar_funnnel_v8i16:992; AVX512BW: # %bb.0:993; AVX512BW-NEXT: vpmovsxbq {{.*#+}} xmm2 = [15,0]994; AVX512BW-NEXT: vpandn %xmm2, %xmm1, %xmm3995; AVX512BW-NEXT: vpsrlw $1, %xmm0, %xmm4996; AVX512BW-NEXT: vpsrlw %xmm3, %xmm4, %xmm3997; AVX512BW-NEXT: vpand %xmm2, %xmm1, %xmm1998; AVX512BW-NEXT: vpsllw %xmm1, %xmm0, %xmm0999; AVX512BW-NEXT: vpor %xmm3, %xmm0, %xmm01000; AVX512BW-NEXT: retq1001;1002; AVX512VLBW-LABEL: splatvar_funnnel_v8i16:1003; AVX512VLBW: # %bb.0:1004; AVX512VLBW-NEXT: vpmovsxbq {{.*#+}} xmm2 = [15,0]1005; AVX512VLBW-NEXT: vpandn %xmm2, %xmm1, %xmm31006; AVX512VLBW-NEXT: vpsrlw $1, %xmm0, %xmm41007; AVX512VLBW-NEXT: vpsrlw %xmm3, %xmm4, %xmm31008; AVX512VLBW-NEXT: vpand %xmm2, %xmm1, %xmm11009; AVX512VLBW-NEXT: vpsllw %xmm1, %xmm0, %xmm01010; AVX512VLBW-NEXT: vpor %xmm3, %xmm0, %xmm01011; AVX512VLBW-NEXT: retq1012;1013; AVX512VBMI2-LABEL: splatvar_funnnel_v8i16:1014; AVX512VBMI2: # %bb.0:1015; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01016; AVX512VBMI2-NEXT: vpbroadcastw %xmm1, %xmm11017; AVX512VBMI2-NEXT: vpshldvw %zmm1, %zmm0, %zmm01018; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01019; AVX512VBMI2-NEXT: vzeroupper1020; AVX512VBMI2-NEXT: retq1021;1022; AVX512VLVBMI2-LABEL: splatvar_funnnel_v8i16:1023; AVX512VLVBMI2: # %bb.0:1024; AVX512VLVBMI2-NEXT: vpbroadcastw %xmm1, %xmm11025; AVX512VLVBMI2-NEXT: vpshldvw %xmm1, %xmm0, %xmm01026; AVX512VLVBMI2-NEXT: retq1027;1028; XOPAVX1-LABEL: splatvar_funnnel_v8i16:1029; XOPAVX1: # %bb.0:1030; XOPAVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]1031; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]1032; XOPAVX1-NEXT: vprotw %xmm1, %xmm0, %xmm01033; XOPAVX1-NEXT: retq1034;1035; XOPAVX2-LABEL: splatvar_funnnel_v8i16:1036; XOPAVX2: # %bb.0:1037; XOPAVX2-NEXT: vpbroadcastw %xmm1, %xmm11038; XOPAVX2-NEXT: vprotw %xmm1, %xmm0, %xmm01039; XOPAVX2-NEXT: retq1040;1041; X86-SSE2-LABEL: splatvar_funnnel_v8i16:1042; X86-SSE2: # %bb.0:1043; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11044; X86-SSE2-NEXT: movdqa %xmm0, %xmm21045; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]1046; X86-SSE2-NEXT: pslld %xmm1, %xmm21047; X86-SSE2-NEXT: psrad $16, %xmm21048; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1049; X86-SSE2-NEXT: pslld %xmm1, %xmm01050; X86-SSE2-NEXT: psrad $16, %xmm01051; X86-SSE2-NEXT: packssdw %xmm2, %xmm01052; X86-SSE2-NEXT: retl1053 %splat = shufflevector <8 x i16> %amt, <8 x i16> undef, <8 x i32> zeroinitializer1054 %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %x, <8 x i16> %splat)1055 ret <8 x i16> %res1056}1057 1058define <16 x i8> @splatvar_funnnel_v16i8(<16 x i8> %x, <16 x i8> %amt) nounwind {1059; SSE-LABEL: splatvar_funnnel_v16i8:1060; SSE: # %bb.0:1061; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11062; SSE-NEXT: movdqa %xmm0, %xmm21063; SSE-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]1064; SSE-NEXT: psllw %xmm1, %xmm21065; SSE-NEXT: psrlw $8, %xmm21066; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1067; SSE-NEXT: psllw %xmm1, %xmm01068; SSE-NEXT: psrlw $8, %xmm01069; SSE-NEXT: packuswb %xmm2, %xmm01070; SSE-NEXT: retq1071;1072; AVX-LABEL: splatvar_funnnel_v16i8:1073; AVX: # %bb.0:1074; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11075; AVX-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1076; AVX-NEXT: vpsllw %xmm1, %xmm2, %xmm21077; AVX-NEXT: vpsrlw $8, %xmm2, %xmm21078; AVX-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1079; AVX-NEXT: vpsllw %xmm1, %xmm0, %xmm01080; AVX-NEXT: vpsrlw $8, %xmm0, %xmm01081; AVX-NEXT: vpackuswb %xmm2, %xmm0, %xmm01082; AVX-NEXT: retq1083;1084; AVX512F-LABEL: splatvar_funnnel_v16i8:1085; AVX512F: # %bb.0:1086; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11087; AVX512F-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1088; AVX512F-NEXT: vpsllw %xmm1, %xmm2, %xmm21089; AVX512F-NEXT: vpsrlw $8, %xmm2, %xmm21090; AVX512F-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1091; AVX512F-NEXT: vpsllw %xmm1, %xmm0, %xmm01092; AVX512F-NEXT: vpsrlw $8, %xmm0, %xmm01093; AVX512F-NEXT: vpackuswb %xmm2, %xmm0, %xmm01094; AVX512F-NEXT: retq1095;1096; AVX512VL-LABEL: splatvar_funnnel_v16i8:1097; AVX512VL: # %bb.0:1098; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11099; AVX512VL-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1100; AVX512VL-NEXT: vpsllw %xmm1, %xmm2, %xmm21101; AVX512VL-NEXT: vpsrlw $8, %xmm2, %xmm21102; AVX512VL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1103; AVX512VL-NEXT: vpsllw %xmm1, %xmm0, %xmm01104; AVX512VL-NEXT: vpsrlw $8, %xmm0, %xmm01105; AVX512VL-NEXT: vpackuswb %xmm2, %xmm0, %xmm01106; AVX512VL-NEXT: retq1107;1108; AVX512BW-LABEL: splatvar_funnnel_v16i8:1109; AVX512BW: # %bb.0:1110; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11111; AVX512BW-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1112; AVX512BW-NEXT: vpsllw %xmm1, %xmm2, %xmm21113; AVX512BW-NEXT: vpsrlw $8, %xmm2, %xmm21114; AVX512BW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1115; AVX512BW-NEXT: vpsllw %xmm1, %xmm0, %xmm01116; AVX512BW-NEXT: vpsrlw $8, %xmm0, %xmm01117; AVX512BW-NEXT: vpackuswb %xmm2, %xmm0, %xmm01118; AVX512BW-NEXT: retq1119;1120; AVX512VLBW-LABEL: splatvar_funnnel_v16i8:1121; AVX512VLBW: # %bb.0:1122; AVX512VLBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11123; AVX512VLBW-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1124; AVX512VLBW-NEXT: vpsllw %xmm1, %xmm2, %xmm21125; AVX512VLBW-NEXT: vpsrlw $8, %xmm2, %xmm21126; AVX512VLBW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1127; AVX512VLBW-NEXT: vpsllw %xmm1, %xmm0, %xmm01128; AVX512VLBW-NEXT: vpsrlw $8, %xmm0, %xmm01129; AVX512VLBW-NEXT: vpackuswb %xmm2, %xmm0, %xmm01130; AVX512VLBW-NEXT: retq1131;1132; AVX512VBMI2-LABEL: splatvar_funnnel_v16i8:1133; AVX512VBMI2: # %bb.0:1134; AVX512VBMI2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11135; AVX512VBMI2-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1136; AVX512VBMI2-NEXT: vpsllw %xmm1, %xmm2, %xmm21137; AVX512VBMI2-NEXT: vpsrlw $8, %xmm2, %xmm21138; AVX512VBMI2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1139; AVX512VBMI2-NEXT: vpsllw %xmm1, %xmm0, %xmm01140; AVX512VBMI2-NEXT: vpsrlw $8, %xmm0, %xmm01141; AVX512VBMI2-NEXT: vpackuswb %xmm2, %xmm0, %xmm01142; AVX512VBMI2-NEXT: retq1143;1144; AVX512VLVBMI2-LABEL: splatvar_funnnel_v16i8:1145; AVX512VLVBMI2: # %bb.0:1146; AVX512VLVBMI2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11147; AVX512VLVBMI2-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1148; AVX512VLVBMI2-NEXT: vpsllw %xmm1, %xmm2, %xmm21149; AVX512VLVBMI2-NEXT: vpsrlw $8, %xmm2, %xmm21150; AVX512VLVBMI2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1151; AVX512VLVBMI2-NEXT: vpsllw %xmm1, %xmm0, %xmm01152; AVX512VLVBMI2-NEXT: vpsrlw $8, %xmm0, %xmm01153; AVX512VLVBMI2-NEXT: vpackuswb %xmm2, %xmm0, %xmm01154; AVX512VLVBMI2-NEXT: retq1155;1156; XOPAVX1-LABEL: splatvar_funnnel_v16i8:1157; XOPAVX1: # %bb.0:1158; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21159; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm11160; XOPAVX1-NEXT: vprotb %xmm1, %xmm0, %xmm01161; XOPAVX1-NEXT: retq1162;1163; XOPAVX2-LABEL: splatvar_funnnel_v16i8:1164; XOPAVX2: # %bb.0:1165; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm11166; XOPAVX2-NEXT: vprotb %xmm1, %xmm0, %xmm01167; XOPAVX2-NEXT: retq1168;1169; X86-SSE2-LABEL: splatvar_funnnel_v16i8:1170; X86-SSE2: # %bb.0:1171; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11172; X86-SSE2-NEXT: movdqa %xmm0, %xmm21173; X86-SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]1174; X86-SSE2-NEXT: psllw %xmm1, %xmm21175; X86-SSE2-NEXT: psrlw $8, %xmm21176; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1177; X86-SSE2-NEXT: psllw %xmm1, %xmm01178; X86-SSE2-NEXT: psrlw $8, %xmm01179; X86-SSE2-NEXT: packuswb %xmm2, %xmm01180; X86-SSE2-NEXT: retl1181 %splat = shufflevector <16 x i8> %amt, <16 x i8> undef, <16 x i32> zeroinitializer1182 %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %x, <16 x i8> %splat)1183 ret <16 x i8> %res1184}1185 1186;1187; Constant Shifts1188;1189 1190define <2 x i64> @constant_funnnel_v2i64(<2 x i64> %x) nounwind {1191; SSE2-LABEL: constant_funnnel_v2i64:1192; SSE2: # %bb.0:1193; SSE2-NEXT: movdqa %xmm0, %xmm11194; SSE2-NEXT: psrlq $60, %xmm11195; SSE2-NEXT: movdqa %xmm0, %xmm21196; SSE2-NEXT: psrlq $50, %xmm21197; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]1198; SSE2-NEXT: movdqa %xmm0, %xmm11199; SSE2-NEXT: psllq $4, %xmm11200; SSE2-NEXT: psllq $14, %xmm01201; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]1202; SSE2-NEXT: orpd %xmm2, %xmm01203; SSE2-NEXT: retq1204;1205; SSE41-LABEL: constant_funnnel_v2i64:1206; SSE41: # %bb.0:1207; SSE41-NEXT: movdqa %xmm0, %xmm11208; SSE41-NEXT: psrlq $50, %xmm11209; SSE41-NEXT: movdqa %xmm0, %xmm21210; SSE41-NEXT: psrlq $60, %xmm21211; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]1212; SSE41-NEXT: movdqa %xmm0, %xmm11213; SSE41-NEXT: psllq $14, %xmm11214; SSE41-NEXT: psllq $4, %xmm01215; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]1216; SSE41-NEXT: por %xmm2, %xmm01217; SSE41-NEXT: retq1218;1219; AVX1-LABEL: constant_funnnel_v2i64:1220; AVX1: # %bb.0:1221; AVX1-NEXT: vpsrlq $50, %xmm0, %xmm11222; AVX1-NEXT: vpsrlq $60, %xmm0, %xmm21223; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]1224; AVX1-NEXT: vpsllq $14, %xmm0, %xmm21225; AVX1-NEXT: vpsllq $4, %xmm0, %xmm01226; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]1227; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm01228; AVX1-NEXT: retq1229;1230; AVX2-LABEL: constant_funnnel_v2i64:1231; AVX2: # %bb.0:1232; AVX2-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11233; AVX2-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01234; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01235; AVX2-NEXT: retq1236;1237; AVX512F-LABEL: constant_funnnel_v2i64:1238; AVX512F: # %bb.0:1239; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01240; AVX512F-NEXT: vpmovsxbq {{.*#+}} xmm1 = [4,14]1241; AVX512F-NEXT: vprolvq %zmm1, %zmm0, %zmm01242; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01243; AVX512F-NEXT: vzeroupper1244; AVX512F-NEXT: retq1245;1246; AVX512VL-LABEL: constant_funnnel_v2i64:1247; AVX512VL: # %bb.0:1248; AVX512VL-NEXT: vprolvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01249; AVX512VL-NEXT: retq1250;1251; AVX512BW-LABEL: constant_funnnel_v2i64:1252; AVX512BW: # %bb.0:1253; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01254; AVX512BW-NEXT: vpmovsxbq {{.*#+}} xmm1 = [4,14]1255; AVX512BW-NEXT: vprolvq %zmm1, %zmm0, %zmm01256; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01257; AVX512BW-NEXT: vzeroupper1258; AVX512BW-NEXT: retq1259;1260; AVX512VLBW-LABEL: constant_funnnel_v2i64:1261; AVX512VLBW: # %bb.0:1262; AVX512VLBW-NEXT: vprolvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01263; AVX512VLBW-NEXT: retq1264;1265; AVX512VBMI2-LABEL: constant_funnnel_v2i64:1266; AVX512VBMI2: # %bb.0:1267; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01268; AVX512VBMI2-NEXT: vpmovsxbq {{.*#+}} xmm1 = [4,14]1269; AVX512VBMI2-NEXT: vprolvq %zmm1, %zmm0, %zmm01270; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01271; AVX512VBMI2-NEXT: vzeroupper1272; AVX512VBMI2-NEXT: retq1273;1274; AVX512VLVBMI2-LABEL: constant_funnnel_v2i64:1275; AVX512VLVBMI2: # %bb.0:1276; AVX512VLVBMI2-NEXT: vprolvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01277; AVX512VLVBMI2-NEXT: retq1278;1279; XOP-LABEL: constant_funnnel_v2i64:1280; XOP: # %bb.0:1281; XOP-NEXT: vprotq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01282; XOP-NEXT: retq1283;1284; X86-SSE2-LABEL: constant_funnnel_v2i64:1285; X86-SSE2: # %bb.0:1286; X86-SSE2-NEXT: movdqa %xmm0, %xmm11287; X86-SSE2-NEXT: psrlq $60, %xmm11288; X86-SSE2-NEXT: movdqa %xmm0, %xmm21289; X86-SSE2-NEXT: psrlq $50, %xmm21290; X86-SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]1291; X86-SSE2-NEXT: movdqa %xmm0, %xmm11292; X86-SSE2-NEXT: psllq $4, %xmm11293; X86-SSE2-NEXT: psllq $14, %xmm01294; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]1295; X86-SSE2-NEXT: orpd %xmm2, %xmm01296; X86-SSE2-NEXT: retl1297 %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> <i64 4, i64 14>)1298 ret <2 x i64> %res1299}1300 1301define <4 x i32> @constant_funnnel_v4i32(<4 x i32> %x) nounwind {1302; SSE2-LABEL: constant_funnnel_v4i32:1303; SSE2: # %bb.0:1304; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1305; SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16,32,64,128]1306; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]1307; SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [32,u,128,u]1308; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]1309; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]1310; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1311; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1312; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1313; SSE2-NEXT: por %xmm2, %xmm01314; SSE2-NEXT: retq1315;1316; SSE41-LABEL: constant_funnnel_v4i32:1317; SSE41: # %bb.0:1318; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1319; SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [32,u,128,u]1320; SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16,32,64,128]1321; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1322; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1323; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1324; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1325; SSE41-NEXT: por %xmm2, %xmm01326; SSE41-NEXT: retq1327;1328; AVX1-LABEL: constant_funnnel_v4i32:1329; AVX1: # %bb.0:1330; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1331; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [32,u,128,u]1332; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [16,32,64,128]1333; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1334; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1335; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1336; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1337; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm01338; AVX1-NEXT: retq1339;1340; AVX2-LABEL: constant_funnnel_v4i32:1341; AVX2: # %bb.0:1342; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11343; AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01344; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01345; AVX2-NEXT: retq1346;1347; AVX512F-LABEL: constant_funnnel_v4i32:1348; AVX512F: # %bb.0:1349; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01350; AVX512F-NEXT: vpmovsxbd {{.*#+}} xmm1 = [4,5,6,7]1351; AVX512F-NEXT: vprolvd %zmm1, %zmm0, %zmm01352; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01353; AVX512F-NEXT: vzeroupper1354; AVX512F-NEXT: retq1355;1356; AVX512VL-LABEL: constant_funnnel_v4i32:1357; AVX512VL: # %bb.0:1358; AVX512VL-NEXT: vprolvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01359; AVX512VL-NEXT: retq1360;1361; AVX512BW-LABEL: constant_funnnel_v4i32:1362; AVX512BW: # %bb.0:1363; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01364; AVX512BW-NEXT: vpmovsxbd {{.*#+}} xmm1 = [4,5,6,7]1365; AVX512BW-NEXT: vprolvd %zmm1, %zmm0, %zmm01366; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01367; AVX512BW-NEXT: vzeroupper1368; AVX512BW-NEXT: retq1369;1370; AVX512VLBW-LABEL: constant_funnnel_v4i32:1371; AVX512VLBW: # %bb.0:1372; AVX512VLBW-NEXT: vprolvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01373; AVX512VLBW-NEXT: retq1374;1375; AVX512VBMI2-LABEL: constant_funnnel_v4i32:1376; AVX512VBMI2: # %bb.0:1377; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01378; AVX512VBMI2-NEXT: vpmovsxbd {{.*#+}} xmm1 = [4,5,6,7]1379; AVX512VBMI2-NEXT: vprolvd %zmm1, %zmm0, %zmm01380; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01381; AVX512VBMI2-NEXT: vzeroupper1382; AVX512VBMI2-NEXT: retq1383;1384; AVX512VLVBMI2-LABEL: constant_funnnel_v4i32:1385; AVX512VLVBMI2: # %bb.0:1386; AVX512VLVBMI2-NEXT: vprolvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01387; AVX512VLVBMI2-NEXT: retq1388;1389; XOP-LABEL: constant_funnnel_v4i32:1390; XOP: # %bb.0:1391; XOP-NEXT: vprotd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01392; XOP-NEXT: retq1393;1394; X86-SSE2-LABEL: constant_funnnel_v4i32:1395; X86-SSE2: # %bb.0:1396; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1397; X86-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [16,32,64,128]1398; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]1399; X86-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [32,u,128,u]1400; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]1401; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]1402; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1403; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1404; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1405; X86-SSE2-NEXT: por %xmm2, %xmm01406; X86-SSE2-NEXT: retl1407 %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> <i32 4, i32 5, i32 6, i32 7>)1408 ret <4 x i32> %res1409}1410 1411define <8 x i16> @constant_funnnel_v8i16(<8 x i16> %x) nounwind {1412; SSE2-LABEL: constant_funnnel_v8i16:1413; SSE2: # %bb.0:1414; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]1415; SSE2-NEXT: movdqa %xmm0, %xmm21416; SSE2-NEXT: pmulhuw %xmm1, %xmm21417; SSE2-NEXT: pmullw %xmm1, %xmm01418; SSE2-NEXT: por %xmm2, %xmm01419; SSE2-NEXT: retq1420;1421; SSE41-LABEL: constant_funnnel_v8i16:1422; SSE41: # %bb.0:1423; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]1424; SSE41-NEXT: movdqa %xmm0, %xmm21425; SSE41-NEXT: pmulhuw %xmm1, %xmm21426; SSE41-NEXT: pmullw %xmm1, %xmm01427; SSE41-NEXT: por %xmm2, %xmm01428; SSE41-NEXT: retq1429;1430; AVX-LABEL: constant_funnnel_v8i16:1431; AVX: # %bb.0:1432; AVX-NEXT: vpmovzxbw {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]1433; AVX-NEXT: vpmulhuw %xmm1, %xmm0, %xmm21434; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm01435; AVX-NEXT: vpor %xmm2, %xmm0, %xmm01436; AVX-NEXT: retq1437;1438; AVX512F-LABEL: constant_funnnel_v8i16:1439; AVX512F: # %bb.0:1440; AVX512F-NEXT: vpmovzxbw {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]1441; AVX512F-NEXT: vpmulhuw %xmm1, %xmm0, %xmm21442; AVX512F-NEXT: vpmullw %xmm1, %xmm0, %xmm01443; AVX512F-NEXT: vpor %xmm2, %xmm0, %xmm01444; AVX512F-NEXT: retq1445;1446; AVX512VL-LABEL: constant_funnnel_v8i16:1447; AVX512VL: # %bb.0:1448; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]1449; AVX512VL-NEXT: vpmulhuw %xmm1, %xmm0, %xmm21450; AVX512VL-NEXT: vpmullw %xmm1, %xmm0, %xmm01451; AVX512VL-NEXT: vpor %xmm2, %xmm0, %xmm01452; AVX512VL-NEXT: retq1453;1454; AVX512BW-LABEL: constant_funnnel_v8i16:1455; AVX512BW: # %bb.0:1456; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01457; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm1 = [16,15,14,13,12,11,10,9]1458; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm11459; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7]1460; AVX512BW-NEXT: vpsllvw %zmm2, %zmm0, %zmm01461; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm01462; AVX512BW-NEXT: vzeroupper1463; AVX512BW-NEXT: retq1464;1465; AVX512VLBW-LABEL: constant_funnnel_v8i16:1466; AVX512VLBW: # %bb.0:1467; AVX512VLBW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11468; AVX512VLBW-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01469; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm01470; AVX512VLBW-NEXT: retq1471;1472; AVX512VBMI2-LABEL: constant_funnnel_v8i16:1473; AVX512VBMI2: # %bb.0:1474; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01475; AVX512VBMI2-NEXT: vpmovsxbw {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]1476; AVX512VBMI2-NEXT: vpshldvw %zmm1, %zmm0, %zmm01477; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01478; AVX512VBMI2-NEXT: vzeroupper1479; AVX512VBMI2-NEXT: retq1480;1481; AVX512VLVBMI2-LABEL: constant_funnnel_v8i16:1482; AVX512VLVBMI2: # %bb.0:1483; AVX512VLVBMI2-NEXT: vpshldvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01484; AVX512VLVBMI2-NEXT: retq1485;1486; XOP-LABEL: constant_funnnel_v8i16:1487; XOP: # %bb.0:1488; XOP-NEXT: vprotw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01489; XOP-NEXT: retq1490;1491; X86-SSE2-LABEL: constant_funnnel_v8i16:1492; X86-SSE2: # %bb.0:1493; X86-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]1494; X86-SSE2-NEXT: movdqa %xmm0, %xmm21495; X86-SSE2-NEXT: pmulhuw %xmm1, %xmm21496; X86-SSE2-NEXT: pmullw %xmm1, %xmm01497; X86-SSE2-NEXT: por %xmm2, %xmm01498; X86-SSE2-NEXT: retl1499 %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %x, <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>)1500 ret <8 x i16> %res1501}1502 1503define <16 x i8> @constant_funnnel_v16i8(<16 x i8> %x) nounwind {1504; SSE-LABEL: constant_funnnel_v16i8:1505; SSE: # %bb.0:1506; SSE-NEXT: movdqa %xmm0, %xmm11507; SSE-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]1508; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [1,128,64,32,16,8,4,2]1509; SSE-NEXT: psrlw $8, %xmm11510; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1511; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,2,4,8,16,32,64,128]1512; SSE-NEXT: psrlw $8, %xmm01513; SSE-NEXT: packuswb %xmm1, %xmm01514; SSE-NEXT: retq1515;1516; AVX-LABEL: constant_funnnel_v16i8:1517; AVX: # %bb.0:1518; AVX-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1519; AVX-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,128,64,32,16,8,4,2]1520; AVX-NEXT: vpsrlw $8, %xmm1, %xmm11521; AVX-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1522; AVX-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]1523; AVX-NEXT: vpsrlw $8, %xmm0, %xmm01524; AVX-NEXT: vpackuswb %xmm1, %xmm0, %xmm01525; AVX-NEXT: retq1526;1527; AVX512F-LABEL: constant_funnnel_v16i8:1528; AVX512F: # %bb.0:1529; AVX512F-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1530; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,128,64,32,16,8,4,2]1531; AVX512F-NEXT: vpsrlw $8, %xmm1, %xmm11532; AVX512F-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1533; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]1534; AVX512F-NEXT: vpsrlw $8, %xmm0, %xmm01535; AVX512F-NEXT: vpackuswb %xmm1, %xmm0, %xmm01536; AVX512F-NEXT: retq1537;1538; AVX512VL-LABEL: constant_funnnel_v16i8:1539; AVX512VL: # %bb.0:1540; AVX512VL-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1541; AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,128,64,32,16,8,4,2]1542; AVX512VL-NEXT: vpsrlw $8, %xmm1, %xmm11543; AVX512VL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1544; AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]1545; AVX512VL-NEXT: vpsrlw $8, %xmm0, %xmm01546; AVX512VL-NEXT: vpackuswb %xmm1, %xmm0, %xmm01547; AVX512VL-NEXT: retq1548;1549; AVX512BW-LABEL: constant_funnnel_v16i8:1550; AVX512BW: # %bb.0:1551; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm1 = [0,7,6,5,4,3,2,1]1552; AVX512BW-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1553; AVX512BW-NEXT: vpsllvw %zmm1, %zmm2, %zmm11554; AVX512BW-NEXT: vpsrlw $8, %xmm1, %xmm11555; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7]1556; AVX512BW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1557; AVX512BW-NEXT: vpsllvw %zmm2, %zmm0, %zmm01558; AVX512BW-NEXT: vpsrlw $8, %xmm0, %xmm01559; AVX512BW-NEXT: vpackuswb %xmm1, %xmm0, %xmm01560; AVX512BW-NEXT: vzeroupper1561; AVX512BW-NEXT: retq1562;1563; AVX512VLBW-LABEL: constant_funnnel_v16i8:1564; AVX512VLBW: # %bb.0:1565; AVX512VLBW-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1566; AVX512VLBW-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11567; AVX512VLBW-NEXT: vpsrlw $8, %xmm1, %xmm11568; AVX512VLBW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1569; AVX512VLBW-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01570; AVX512VLBW-NEXT: vpsrlw $8, %xmm0, %xmm01571; AVX512VLBW-NEXT: vpackuswb %xmm1, %xmm0, %xmm01572; AVX512VLBW-NEXT: retq1573;1574; AVX512VBMI2-LABEL: constant_funnnel_v16i8:1575; AVX512VBMI2: # %bb.0:1576; AVX512VBMI2-NEXT: vpmovsxbw {{.*#+}} xmm1 = [0,7,6,5,4,3,2,1]1577; AVX512VBMI2-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1578; AVX512VBMI2-NEXT: vpsllvw %zmm1, %zmm2, %zmm11579; AVX512VBMI2-NEXT: vpsrlw $8, %xmm1, %xmm11580; AVX512VBMI2-NEXT: vpmovsxbw {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7]1581; AVX512VBMI2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1582; AVX512VBMI2-NEXT: vpsllvw %zmm2, %zmm0, %zmm01583; AVX512VBMI2-NEXT: vpsrlw $8, %xmm0, %xmm01584; AVX512VBMI2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01585; AVX512VBMI2-NEXT: vzeroupper1586; AVX512VBMI2-NEXT: retq1587;1588; AVX512VLVBMI2-LABEL: constant_funnnel_v16i8:1589; AVX512VLVBMI2: # %bb.0:1590; AVX512VLVBMI2-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1591; AVX512VLVBMI2-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11592; AVX512VLVBMI2-NEXT: vpsrlw $8, %xmm1, %xmm11593; AVX512VLVBMI2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1594; AVX512VLVBMI2-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01595; AVX512VLVBMI2-NEXT: vpsrlw $8, %xmm0, %xmm01596; AVX512VLVBMI2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01597; AVX512VLVBMI2-NEXT: retq1598;1599; XOP-LABEL: constant_funnnel_v16i8:1600; XOP: # %bb.0:1601; XOP-NEXT: vprotb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01602; XOP-NEXT: retq1603;1604; X86-SSE2-LABEL: constant_funnnel_v16i8:1605; X86-SSE2: # %bb.0:1606; X86-SSE2-NEXT: movdqa %xmm0, %xmm11607; X86-SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]1608; X86-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [1,128,64,32,16,8,4,2]1609; X86-SSE2-NEXT: psrlw $8, %xmm11610; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1611; X86-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [1,2,4,8,16,32,64,128]1612; X86-SSE2-NEXT: psrlw $8, %xmm01613; X86-SSE2-NEXT: packuswb %xmm1, %xmm01614; X86-SSE2-NEXT: retl1615 %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %x, <16 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>)1616 ret <16 x i8> %res1617}1618 1619;1620; Uniform Constant Shifts1621;1622 1623define <2 x i64> @splatconstant_funnnel_v2i64(<2 x i64> %x) nounwind {1624; SSE-LABEL: splatconstant_funnnel_v2i64:1625; SSE: # %bb.0:1626; SSE-NEXT: movdqa %xmm0, %xmm11627; SSE-NEXT: psrlq $50, %xmm11628; SSE-NEXT: psllq $14, %xmm01629; SSE-NEXT: por %xmm1, %xmm01630; SSE-NEXT: retq1631;1632; AVX-LABEL: splatconstant_funnnel_v2i64:1633; AVX: # %bb.0:1634; AVX-NEXT: vpsrlq $50, %xmm0, %xmm11635; AVX-NEXT: vpsllq $14, %xmm0, %xmm01636; AVX-NEXT: vpor %xmm1, %xmm0, %xmm01637; AVX-NEXT: retq1638;1639; AVX512F-LABEL: splatconstant_funnnel_v2i64:1640; AVX512F: # %bb.0:1641; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01642; AVX512F-NEXT: vprolq $14, %zmm0, %zmm01643; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01644; AVX512F-NEXT: vzeroupper1645; AVX512F-NEXT: retq1646;1647; AVX512VL-LABEL: splatconstant_funnnel_v2i64:1648; AVX512VL: # %bb.0:1649; AVX512VL-NEXT: vprolq $14, %xmm0, %xmm01650; AVX512VL-NEXT: retq1651;1652; AVX512BW-LABEL: splatconstant_funnnel_v2i64:1653; AVX512BW: # %bb.0:1654; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01655; AVX512BW-NEXT: vprolq $14, %zmm0, %zmm01656; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01657; AVX512BW-NEXT: vzeroupper1658; AVX512BW-NEXT: retq1659;1660; AVX512VLBW-LABEL: splatconstant_funnnel_v2i64:1661; AVX512VLBW: # %bb.0:1662; AVX512VLBW-NEXT: vprolq $14, %xmm0, %xmm01663; AVX512VLBW-NEXT: retq1664;1665; AVX512VBMI2-LABEL: splatconstant_funnnel_v2i64:1666; AVX512VBMI2: # %bb.0:1667; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01668; AVX512VBMI2-NEXT: vprolq $14, %zmm0, %zmm01669; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01670; AVX512VBMI2-NEXT: vzeroupper1671; AVX512VBMI2-NEXT: retq1672;1673; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v2i64:1674; AVX512VLVBMI2: # %bb.0:1675; AVX512VLVBMI2-NEXT: vprolq $14, %xmm0, %xmm01676; AVX512VLVBMI2-NEXT: retq1677;1678; XOP-LABEL: splatconstant_funnnel_v2i64:1679; XOP: # %bb.0:1680; XOP-NEXT: vprotq $14, %xmm0, %xmm01681; XOP-NEXT: retq1682;1683; X86-SSE2-LABEL: splatconstant_funnnel_v2i64:1684; X86-SSE2: # %bb.0:1685; X86-SSE2-NEXT: movdqa %xmm0, %xmm11686; X86-SSE2-NEXT: psrlq $50, %xmm11687; X86-SSE2-NEXT: psllq $14, %xmm01688; X86-SSE2-NEXT: por %xmm1, %xmm01689; X86-SSE2-NEXT: retl1690 %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> <i64 14, i64 14>)1691 ret <2 x i64> %res1692}1693 1694define <4 x i32> @splatconstant_funnnel_v4i32(<4 x i32> %x) nounwind {1695; SSE-LABEL: splatconstant_funnnel_v4i32:1696; SSE: # %bb.0:1697; SSE-NEXT: movdqa %xmm0, %xmm11698; SSE-NEXT: psrld $28, %xmm11699; SSE-NEXT: pslld $4, %xmm01700; SSE-NEXT: por %xmm1, %xmm01701; SSE-NEXT: retq1702;1703; AVX-LABEL: splatconstant_funnnel_v4i32:1704; AVX: # %bb.0:1705; AVX-NEXT: vpsrld $28, %xmm0, %xmm11706; AVX-NEXT: vpslld $4, %xmm0, %xmm01707; AVX-NEXT: vpor %xmm1, %xmm0, %xmm01708; AVX-NEXT: retq1709;1710; AVX512F-LABEL: splatconstant_funnnel_v4i32:1711; AVX512F: # %bb.0:1712; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01713; AVX512F-NEXT: vprold $4, %zmm0, %zmm01714; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01715; AVX512F-NEXT: vzeroupper1716; AVX512F-NEXT: retq1717;1718; AVX512VL-LABEL: splatconstant_funnnel_v4i32:1719; AVX512VL: # %bb.0:1720; AVX512VL-NEXT: vprold $4, %xmm0, %xmm01721; AVX512VL-NEXT: retq1722;1723; AVX512BW-LABEL: splatconstant_funnnel_v4i32:1724; AVX512BW: # %bb.0:1725; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01726; AVX512BW-NEXT: vprold $4, %zmm0, %zmm01727; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01728; AVX512BW-NEXT: vzeroupper1729; AVX512BW-NEXT: retq1730;1731; AVX512VLBW-LABEL: splatconstant_funnnel_v4i32:1732; AVX512VLBW: # %bb.0:1733; AVX512VLBW-NEXT: vprold $4, %xmm0, %xmm01734; AVX512VLBW-NEXT: retq1735;1736; AVX512VBMI2-LABEL: splatconstant_funnnel_v4i32:1737; AVX512VBMI2: # %bb.0:1738; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01739; AVX512VBMI2-NEXT: vprold $4, %zmm0, %zmm01740; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01741; AVX512VBMI2-NEXT: vzeroupper1742; AVX512VBMI2-NEXT: retq1743;1744; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v4i32:1745; AVX512VLVBMI2: # %bb.0:1746; AVX512VLVBMI2-NEXT: vprold $4, %xmm0, %xmm01747; AVX512VLVBMI2-NEXT: retq1748;1749; XOP-LABEL: splatconstant_funnnel_v4i32:1750; XOP: # %bb.0:1751; XOP-NEXT: vprotd $4, %xmm0, %xmm01752; XOP-NEXT: retq1753;1754; X86-SSE2-LABEL: splatconstant_funnnel_v4i32:1755; X86-SSE2: # %bb.0:1756; X86-SSE2-NEXT: movdqa %xmm0, %xmm11757; X86-SSE2-NEXT: psrld $28, %xmm11758; X86-SSE2-NEXT: pslld $4, %xmm01759; X86-SSE2-NEXT: por %xmm1, %xmm01760; X86-SSE2-NEXT: retl1761 %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> <i32 4, i32 4, i32 4, i32 4>)1762 ret <4 x i32> %res1763}1764 1765define <8 x i16> @splatconstant_funnnel_v8i16(<8 x i16> %x) nounwind {1766; SSE-LABEL: splatconstant_funnnel_v8i16:1767; SSE: # %bb.0:1768; SSE-NEXT: movdqa %xmm0, %xmm11769; SSE-NEXT: psrlw $9, %xmm11770; SSE-NEXT: psllw $7, %xmm01771; SSE-NEXT: por %xmm1, %xmm01772; SSE-NEXT: retq1773;1774; AVX-LABEL: splatconstant_funnnel_v8i16:1775; AVX: # %bb.0:1776; AVX-NEXT: vpsrlw $9, %xmm0, %xmm11777; AVX-NEXT: vpsllw $7, %xmm0, %xmm01778; AVX-NEXT: vpor %xmm1, %xmm0, %xmm01779; AVX-NEXT: retq1780;1781; AVX512F-LABEL: splatconstant_funnnel_v8i16:1782; AVX512F: # %bb.0:1783; AVX512F-NEXT: vpsrlw $9, %xmm0, %xmm11784; AVX512F-NEXT: vpsllw $7, %xmm0, %xmm01785; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm01786; AVX512F-NEXT: retq1787;1788; AVX512VL-LABEL: splatconstant_funnnel_v8i16:1789; AVX512VL: # %bb.0:1790; AVX512VL-NEXT: vpsrlw $9, %xmm0, %xmm11791; AVX512VL-NEXT: vpsllw $7, %xmm0, %xmm01792; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm01793; AVX512VL-NEXT: retq1794;1795; AVX512BW-LABEL: splatconstant_funnnel_v8i16:1796; AVX512BW: # %bb.0:1797; AVX512BW-NEXT: vpsrlw $9, %xmm0, %xmm11798; AVX512BW-NEXT: vpsllw $7, %xmm0, %xmm01799; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm01800; AVX512BW-NEXT: retq1801;1802; AVX512VLBW-LABEL: splatconstant_funnnel_v8i16:1803; AVX512VLBW: # %bb.0:1804; AVX512VLBW-NEXT: vpsrlw $9, %xmm0, %xmm11805; AVX512VLBW-NEXT: vpsllw $7, %xmm0, %xmm01806; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm01807; AVX512VLBW-NEXT: retq1808;1809; AVX512VBMI2-LABEL: splatconstant_funnnel_v8i16:1810; AVX512VBMI2: # %bb.0:1811; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01812; AVX512VBMI2-NEXT: vpshldw $7, %zmm0, %zmm0, %zmm01813; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01814; AVX512VBMI2-NEXT: vzeroupper1815; AVX512VBMI2-NEXT: retq1816;1817; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v8i16:1818; AVX512VLVBMI2: # %bb.0:1819; AVX512VLVBMI2-NEXT: vpshldw $7, %xmm0, %xmm0, %xmm01820; AVX512VLVBMI2-NEXT: retq1821;1822; XOP-LABEL: splatconstant_funnnel_v8i16:1823; XOP: # %bb.0:1824; XOP-NEXT: vprotw $7, %xmm0, %xmm01825; XOP-NEXT: retq1826;1827; X86-SSE2-LABEL: splatconstant_funnnel_v8i16:1828; X86-SSE2: # %bb.0:1829; X86-SSE2-NEXT: movdqa %xmm0, %xmm11830; X86-SSE2-NEXT: psrlw $9, %xmm11831; X86-SSE2-NEXT: psllw $7, %xmm01832; X86-SSE2-NEXT: por %xmm1, %xmm01833; X86-SSE2-NEXT: retl1834 %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %x, <8 x i16> <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>)1835 ret <8 x i16> %res1836}1837 1838define <16 x i8> @splatconstant_funnnel_v16i8(<16 x i8> %x) nounwind {1839; SSE-LABEL: splatconstant_funnnel_v16i8:1840; SSE: # %bb.0:1841; SSE-NEXT: movdqa %xmm0, %xmm11842; SSE-NEXT: psrlw $4, %xmm11843; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11844; SSE-NEXT: psllw $4, %xmm01845; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01846; SSE-NEXT: por %xmm1, %xmm01847; SSE-NEXT: retq1848;1849; AVX-LABEL: splatconstant_funnnel_v16i8:1850; AVX: # %bb.0:1851; AVX-NEXT: vpsrlw $4, %xmm0, %xmm11852; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11853; AVX-NEXT: vpsllw $4, %xmm0, %xmm01854; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01855; AVX-NEXT: vpor %xmm1, %xmm0, %xmm01856; AVX-NEXT: retq1857;1858; AVX512F-LABEL: splatconstant_funnnel_v16i8:1859; AVX512F: # %bb.0:1860; AVX512F-NEXT: vpsllw $4, %xmm0, %xmm11861; AVX512F-NEXT: vpsrlw $4, %xmm0, %xmm01862; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))1863; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01864; AVX512F-NEXT: vzeroupper1865; AVX512F-NEXT: retq1866;1867; AVX512VL-LABEL: splatconstant_funnnel_v16i8:1868; AVX512VL: # %bb.0:1869; AVX512VL-NEXT: vpsllw $4, %xmm0, %xmm11870; AVX512VL-NEXT: vpsrlw $4, %xmm0, %xmm01871; AVX512VL-NEXT: vpternlogd {{.*#+}} xmm0 = xmm0 ^ (m32bcst & (xmm0 ^ xmm1))1872; AVX512VL-NEXT: retq1873;1874; AVX512BW-LABEL: splatconstant_funnnel_v16i8:1875; AVX512BW: # %bb.0:1876; AVX512BW-NEXT: vpsllw $4, %xmm0, %xmm11877; AVX512BW-NEXT: vpsrlw $4, %xmm0, %xmm01878; AVX512BW-NEXT: vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))1879; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01880; AVX512BW-NEXT: vzeroupper1881; AVX512BW-NEXT: retq1882;1883; AVX512VLBW-LABEL: splatconstant_funnnel_v16i8:1884; AVX512VLBW: # %bb.0:1885; AVX512VLBW-NEXT: vpsllw $4, %xmm0, %xmm11886; AVX512VLBW-NEXT: vpsrlw $4, %xmm0, %xmm01887; AVX512VLBW-NEXT: vpternlogd {{.*#+}} xmm0 = xmm0 ^ (m32bcst & (xmm0 ^ xmm1))1888; AVX512VLBW-NEXT: retq1889;1890; AVX512VBMI2-LABEL: splatconstant_funnnel_v16i8:1891; AVX512VBMI2: # %bb.0:1892; AVX512VBMI2-NEXT: vpsllw $4, %xmm0, %xmm11893; AVX512VBMI2-NEXT: vpsrlw $4, %xmm0, %xmm01894; AVX512VBMI2-NEXT: vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))1895; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01896; AVX512VBMI2-NEXT: vzeroupper1897; AVX512VBMI2-NEXT: retq1898;1899; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v16i8:1900; AVX512VLVBMI2: # %bb.0:1901; AVX512VLVBMI2-NEXT: vpsllw $4, %xmm0, %xmm11902; AVX512VLVBMI2-NEXT: vpsrlw $4, %xmm0, %xmm01903; AVX512VLVBMI2-NEXT: vpternlogd {{.*#+}} xmm0 = xmm0 ^ (m32bcst & (xmm0 ^ xmm1))1904; AVX512VLVBMI2-NEXT: retq1905;1906; XOP-LABEL: splatconstant_funnnel_v16i8:1907; XOP: # %bb.0:1908; XOP-NEXT: vprotb $4, %xmm0, %xmm01909; XOP-NEXT: retq1910;1911; X86-SSE2-LABEL: splatconstant_funnnel_v16i8:1912; X86-SSE2: # %bb.0:1913; X86-SSE2-NEXT: movdqa %xmm0, %xmm11914; X86-SSE2-NEXT: psrlw $4, %xmm11915; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11916; X86-SSE2-NEXT: psllw $4, %xmm01917; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01918; X86-SSE2-NEXT: por %xmm1, %xmm01919; X86-SSE2-NEXT: retl1920 %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %x, <16 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>)1921 ret <16 x i8> %res1922}1923