brintos

brintos / llvm-project-archived public Read only

0
0
Text · 82.7 KiB · 5d01dfd Raw
1992 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.fshr.v2i64(<2 x i64>, <2 x i64>, <2 x i64>)19declare <4 x i32> @llvm.fshr.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)20declare <8 x i16> @llvm.fshr.v8i16(<8 x i16>, <8 x i16>, <8 x i16>)21declare <16 x i8> @llvm.fshr.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:    psrlq %xmm1, %xmm436; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]37; SSE2-NEXT:    movdqa %xmm0, %xmm538; SSE2-NEXT:    psrlq %xmm1, %xmm539; SSE2-NEXT:    movsd {{.*#+}} xmm5 = xmm4[0],xmm5[1]40; SSE2-NEXT:    pand %xmm2, %xmm341; SSE2-NEXT:    movdqa %xmm0, %xmm142; SSE2-NEXT:    psllq %xmm3, %xmm143; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]44; SSE2-NEXT:    psllq %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:    psrlq %xmm1, %xmm457; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]58; SSE41-NEXT:    movdqa %xmm0, %xmm559; SSE41-NEXT:    psrlq %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:    psllq %xmm3, %xmm164; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]65; SSE41-NEXT:    psllq %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:    vpsrlq %xmm3, %xmm0, %xmm475; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]76; AVX1-NEXT:    vpsrlq %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:    vpsllq %xmm1, %xmm0, %xmm282; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]83; AVX1-NEXT:    vpsllq %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:    vpsrlvq %xmm3, %xmm0, %xmm393; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm494; AVX2-NEXT:    vpsubq %xmm1, %xmm4, %xmm195; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm196; AVX2-NEXT:    vpsllvq %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:    vprorvq %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:    vprorvq %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:    vprorvq %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:    vprorvq %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:    vprorvq %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:    vprorvq %xmm1, %xmm0, %xmm0140; AVX512VLVBMI2-NEXT:    retq141;142; XOP-LABEL: var_funnnel_v2i64:143; XOP:       # %bb.0:144; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2145; XOP-NEXT:    vpsubq %xmm1, %xmm2, %xmm1146; XOP-NEXT:    vprotq %xmm1, %xmm0, %xmm0147; XOP-NEXT:    retq148;149; X86-SSE2-LABEL: var_funnnel_v2i64:150; X86-SSE2:       # %bb.0:151; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [63,0,63,0]152; X86-SSE2-NEXT:    pxor %xmm3, %xmm3153; X86-SSE2-NEXT:    psubq %xmm1, %xmm3154; X86-SSE2-NEXT:    pand %xmm2, %xmm1155; X86-SSE2-NEXT:    movdqa %xmm0, %xmm4156; X86-SSE2-NEXT:    psrlq %xmm1, %xmm4157; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]158; X86-SSE2-NEXT:    movdqa %xmm0, %xmm5159; X86-SSE2-NEXT:    psrlq %xmm1, %xmm5160; X86-SSE2-NEXT:    movsd {{.*#+}} xmm5 = xmm4[0],xmm5[1]161; X86-SSE2-NEXT:    pand %xmm2, %xmm3162; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1163; X86-SSE2-NEXT:    psllq %xmm3, %xmm1164; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]165; X86-SSE2-NEXT:    psllq %xmm2, %xmm0166; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]167; X86-SSE2-NEXT:    orpd %xmm5, %xmm0168; X86-SSE2-NEXT:    retl169  %res = call <2 x i64> @llvm.fshr.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> %amt)170  ret <2 x i64> %res171}172 173define <4 x i32> @var_funnnel_v4i32(<4 x i32> %x, <4 x i32> %amt) nounwind {174; SSE2-LABEL: var_funnnel_v4i32:175; SSE2:       # %bb.0:176; SSE2-NEXT:    pxor %xmm2, %xmm2177; SSE2-NEXT:    psubd %xmm1, %xmm2178; SSE2-NEXT:    pslld $23, %xmm2179; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2180; SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2181; SSE2-NEXT:    cvttps2dq %xmm2, %xmm1182; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]183; SSE2-NEXT:    pmuludq %xmm1, %xmm0184; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]185; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]186; SSE2-NEXT:    pmuludq %xmm2, %xmm1187; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]188; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]189; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]190; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]191; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]192; SSE2-NEXT:    por %xmm3, %xmm0193; SSE2-NEXT:    retq194;195; SSE41-LABEL: var_funnnel_v4i32:196; SSE41:       # %bb.0:197; SSE41-NEXT:    pxor %xmm2, %xmm2198; SSE41-NEXT:    psubd %xmm1, %xmm2199; SSE41-NEXT:    pslld $23, %xmm2200; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2201; SSE41-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2202; SSE41-NEXT:    cvttps2dq %xmm2, %xmm1203; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]204; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]205; SSE41-NEXT:    pmuludq %xmm2, %xmm3206; SSE41-NEXT:    pmuludq %xmm1, %xmm0207; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]208; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]209; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]210; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]211; SSE41-NEXT:    por %xmm1, %xmm0212; SSE41-NEXT:    retq213;214; AVX1-LABEL: var_funnnel_v4i32:215; AVX1:       # %bb.0:216; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2217; AVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm1218; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1219; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1220; AVX1-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1221; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1222; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]223; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]224; AVX1-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2225; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0226; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]227; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]228; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,2,2]229; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]230; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0231; AVX1-NEXT:    retq232;233; AVX2-LABEL: var_funnnel_v4i32:234; AVX2:       # %bb.0:235; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [31,31,31,31]236; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1237; AVX2-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm2238; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]239; AVX2-NEXT:    vpsubd %xmm1, %xmm3, %xmm1240; AVX2-NEXT:    vpsllvd %xmm1, %xmm0, %xmm0241; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0242; AVX2-NEXT:    retq243;244; AVX512F-LABEL: var_funnnel_v4i32:245; AVX512F:       # %bb.0:246; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1247; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0248; AVX512F-NEXT:    vprorvd %zmm1, %zmm0, %zmm0249; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0250; AVX512F-NEXT:    vzeroupper251; AVX512F-NEXT:    retq252;253; AVX512VL-LABEL: var_funnnel_v4i32:254; AVX512VL:       # %bb.0:255; AVX512VL-NEXT:    vprorvd %xmm1, %xmm0, %xmm0256; AVX512VL-NEXT:    retq257;258; AVX512BW-LABEL: var_funnnel_v4i32:259; AVX512BW:       # %bb.0:260; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1261; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0262; AVX512BW-NEXT:    vprorvd %zmm1, %zmm0, %zmm0263; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0264; AVX512BW-NEXT:    vzeroupper265; AVX512BW-NEXT:    retq266;267; AVX512VLBW-LABEL: var_funnnel_v4i32:268; AVX512VLBW:       # %bb.0:269; AVX512VLBW-NEXT:    vprorvd %xmm1, %xmm0, %xmm0270; AVX512VLBW-NEXT:    retq271;272; AVX512VBMI2-LABEL: var_funnnel_v4i32:273; AVX512VBMI2:       # %bb.0:274; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1275; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0276; AVX512VBMI2-NEXT:    vprorvd %zmm1, %zmm0, %zmm0277; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0278; AVX512VBMI2-NEXT:    vzeroupper279; AVX512VBMI2-NEXT:    retq280;281; AVX512VLVBMI2-LABEL: var_funnnel_v4i32:282; AVX512VLVBMI2:       # %bb.0:283; AVX512VLVBMI2-NEXT:    vprorvd %xmm1, %xmm0, %xmm0284; AVX512VLVBMI2-NEXT:    retq285;286; XOP-LABEL: var_funnnel_v4i32:287; XOP:       # %bb.0:288; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2289; XOP-NEXT:    vpsubd %xmm1, %xmm2, %xmm1290; XOP-NEXT:    vprotd %xmm1, %xmm0, %xmm0291; XOP-NEXT:    retq292;293; X86-SSE2-LABEL: var_funnnel_v4i32:294; X86-SSE2:       # %bb.0:295; X86-SSE2-NEXT:    pxor %xmm2, %xmm2296; X86-SSE2-NEXT:    psubd %xmm1, %xmm2297; X86-SSE2-NEXT:    pslld $23, %xmm2298; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2299; X86-SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2300; X86-SSE2-NEXT:    cvttps2dq %xmm2, %xmm1301; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]302; X86-SSE2-NEXT:    pmuludq %xmm1, %xmm0303; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]304; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]305; X86-SSE2-NEXT:    pmuludq %xmm2, %xmm1306; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]307; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]308; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]309; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]310; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]311; X86-SSE2-NEXT:    por %xmm3, %xmm0312; X86-SSE2-NEXT:    retl313  %res = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> %amt)314  ret <4 x i32> %res315}316 317define <8 x i16> @var_funnnel_v8i16(<8 x i16> %x, <8 x i16> %amt) nounwind {318; SSE2-LABEL: var_funnnel_v8i16:319; SSE2:       # %bb.0:320; SSE2-NEXT:    pxor %xmm2, %xmm2321; SSE2-NEXT:    psubw %xmm1, %xmm2322; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2323; SSE2-NEXT:    movdqa %xmm2, %xmm1324; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]325; SSE2-NEXT:    pslld $23, %xmm1326; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]327; SSE2-NEXT:    paddd %xmm3, %xmm1328; SSE2-NEXT:    cvttps2dq %xmm1, %xmm1329; SSE2-NEXT:    pslld $16, %xmm1330; SSE2-NEXT:    psrad $16, %xmm1331; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]332; SSE2-NEXT:    pslld $23, %xmm2333; SSE2-NEXT:    paddd %xmm3, %xmm2334; SSE2-NEXT:    cvttps2dq %xmm2, %xmm2335; SSE2-NEXT:    pslld $16, %xmm2336; SSE2-NEXT:    psrad $16, %xmm2337; SSE2-NEXT:    packssdw %xmm1, %xmm2338; SSE2-NEXT:    movdqa %xmm0, %xmm1339; SSE2-NEXT:    pmulhuw %xmm2, %xmm1340; SSE2-NEXT:    pmullw %xmm2, %xmm0341; SSE2-NEXT:    por %xmm1, %xmm0342; SSE2-NEXT:    retq343;344; SSE41-LABEL: var_funnnel_v8i16:345; SSE41:       # %bb.0:346; SSE41-NEXT:    pxor %xmm2, %xmm2347; SSE41-NEXT:    psubw %xmm1, %xmm2348; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2349; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero350; SSE41-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]351; SSE41-NEXT:    pslld $23, %xmm2352; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]353; SSE41-NEXT:    paddd %xmm3, %xmm2354; SSE41-NEXT:    cvttps2dq %xmm2, %xmm2355; SSE41-NEXT:    pslld $23, %xmm1356; SSE41-NEXT:    paddd %xmm3, %xmm1357; SSE41-NEXT:    cvttps2dq %xmm1, %xmm1358; SSE41-NEXT:    packusdw %xmm2, %xmm1359; SSE41-NEXT:    movdqa %xmm0, %xmm2360; SSE41-NEXT:    pmulhuw %xmm1, %xmm2361; SSE41-NEXT:    pmullw %xmm1, %xmm0362; SSE41-NEXT:    por %xmm2, %xmm0363; SSE41-NEXT:    retq364;365; AVX1-LABEL: var_funnnel_v8i16:366; AVX1:       # %bb.0:367; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2368; AVX1-NEXT:    vpsubw %xmm1, %xmm2, %xmm1369; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1370; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm2 = xmm1[4,4,5,5,6,6,7,7]371; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2372; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]373; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2374; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2375; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero376; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1377; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1378; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1379; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1380; AVX1-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm2381; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0382; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0383; AVX1-NEXT:    retq384;385; AVX2-LABEL: var_funnnel_v8i16:386; AVX2:       # %bb.0:387; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1388; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2389; AVX2-NEXT:    vpunpckhwd {{.*#+}} xmm3 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]390; AVX2-NEXT:    vpunpckhwd {{.*#+}} xmm4 = xmm0[4,4,5,5,6,6,7,7]391; AVX2-NEXT:    vpsrlvd %xmm3, %xmm4, %xmm3392; AVX2-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1],xmm3[2],xmm2[3],xmm3[4],xmm2[5],xmm3[6],xmm2[7]393; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]394; AVX2-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero395; AVX2-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0396; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]397; AVX2-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0398; AVX2-NEXT:    retq399;400; AVX512F-LABEL: var_funnnel_v8i16:401; AVX512F:       # %bb.0:402; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1403; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2404; AVX512F-NEXT:    vpunpckhwd {{.*#+}} xmm3 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]405; AVX512F-NEXT:    vpunpckhwd {{.*#+}} xmm4 = xmm0[4,4,5,5,6,6,7,7]406; AVX512F-NEXT:    vpsrlvd %xmm3, %xmm4, %xmm3407; AVX512F-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1],xmm3[2],xmm2[3],xmm3[4],xmm2[5],xmm3[6],xmm2[7]408; AVX512F-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]409; AVX512F-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero410; AVX512F-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0411; AVX512F-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]412; AVX512F-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0413; AVX512F-NEXT:    retq414;415; AVX512VL-LABEL: var_funnnel_v8i16:416; AVX512VL:       # %bb.0:417; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1418; AVX512VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2419; AVX512VL-NEXT:    vpunpckhwd {{.*#+}} xmm2 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]420; AVX512VL-NEXT:    vpunpckhwd {{.*#+}} xmm3 = xmm0[4,4,5,5,6,6,7,7]421; AVX512VL-NEXT:    vpsrlvd %xmm2, %xmm3, %xmm2422; AVX512VL-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]423; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero424; AVX512VL-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0425; AVX512VL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0426; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0427; AVX512VL-NEXT:    vzeroupper428; AVX512VL-NEXT:    retq429;430; AVX512BW-LABEL: var_funnnel_v8i16:431; AVX512BW:       # %bb.0:432; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0433; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1434; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm2435; AVX512BW-NEXT:    vpbroadcastw {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]436; AVX512BW-NEXT:    vpsubw %xmm1, %xmm3, %xmm1437; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0438; AVX512BW-NEXT:    vpor %xmm0, %xmm2, %xmm0439; AVX512BW-NEXT:    vzeroupper440; AVX512BW-NEXT:    retq441;442; AVX512VLBW-LABEL: var_funnnel_v8i16:443; AVX512VLBW:       # %bb.0:444; AVX512VLBW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1445; AVX512VLBW-NEXT:    vpsrlvw %xmm1, %xmm0, %xmm2446; AVX512VLBW-NEXT:    vpbroadcastw {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]447; AVX512VLBW-NEXT:    vpsubw %xmm1, %xmm3, %xmm1448; AVX512VLBW-NEXT:    vpsllvw %xmm1, %xmm0, %xmm0449; AVX512VLBW-NEXT:    vpor %xmm0, %xmm2, %xmm0450; AVX512VLBW-NEXT:    retq451;452; AVX512VBMI2-LABEL: var_funnnel_v8i16:453; AVX512VBMI2:       # %bb.0:454; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1455; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0456; AVX512VBMI2-NEXT:    vpshrdvw %zmm1, %zmm0, %zmm0457; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0458; AVX512VBMI2-NEXT:    vzeroupper459; AVX512VBMI2-NEXT:    retq460;461; AVX512VLVBMI2-LABEL: var_funnnel_v8i16:462; AVX512VLVBMI2:       # %bb.0:463; AVX512VLVBMI2-NEXT:    vpshrdvw %xmm1, %xmm0, %xmm0464; AVX512VLVBMI2-NEXT:    retq465;466; XOP-LABEL: var_funnnel_v8i16:467; XOP:       # %bb.0:468; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2469; XOP-NEXT:    vpsubw %xmm1, %xmm2, %xmm1470; XOP-NEXT:    vprotw %xmm1, %xmm0, %xmm0471; XOP-NEXT:    retq472;473; X86-SSE2-LABEL: var_funnnel_v8i16:474; X86-SSE2:       # %bb.0:475; X86-SSE2-NEXT:    pxor %xmm2, %xmm2476; X86-SSE2-NEXT:    psubw %xmm1, %xmm2477; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2478; X86-SSE2-NEXT:    movdqa %xmm2, %xmm1479; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]480; X86-SSE2-NEXT:    pslld $23, %xmm1481; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]482; X86-SSE2-NEXT:    paddd %xmm3, %xmm1483; X86-SSE2-NEXT:    cvttps2dq %xmm1, %xmm1484; X86-SSE2-NEXT:    pslld $16, %xmm1485; X86-SSE2-NEXT:    psrad $16, %xmm1486; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]487; X86-SSE2-NEXT:    pslld $23, %xmm2488; X86-SSE2-NEXT:    paddd %xmm3, %xmm2489; X86-SSE2-NEXT:    cvttps2dq %xmm2, %xmm2490; X86-SSE2-NEXT:    pslld $16, %xmm2491; X86-SSE2-NEXT:    psrad $16, %xmm2492; X86-SSE2-NEXT:    packssdw %xmm1, %xmm2493; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1494; X86-SSE2-NEXT:    pmulhuw %xmm2, %xmm1495; X86-SSE2-NEXT:    pmullw %xmm2, %xmm0496; X86-SSE2-NEXT:    por %xmm1, %xmm0497; X86-SSE2-NEXT:    retl498  %res = call <8 x i16> @llvm.fshr.v8i16(<8 x i16> %x, <8 x i16> %x, <8 x i16> %amt)499  ret <8 x i16> %res500}501 502define <16 x i8> @var_funnnel_v16i8(<16 x i8> %x, <16 x i8> %amt) nounwind {503; SSE2-LABEL: var_funnnel_v16i8:504; SSE2:       # %bb.0:505; SSE2-NEXT:    movdqa %xmm0, %xmm2506; SSE2-NEXT:    pxor %xmm0, %xmm0507; SSE2-NEXT:    pxor %xmm3, %xmm3508; SSE2-NEXT:    psubb %xmm1, %xmm3509; SSE2-NEXT:    psllw $5, %xmm3510; SSE2-NEXT:    pxor %xmm1, %xmm1511; SSE2-NEXT:    pcmpgtb %xmm3, %xmm1512; SSE2-NEXT:    movdqa %xmm2, %xmm4513; SSE2-NEXT:    psrlw $4, %xmm4514; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4515; SSE2-NEXT:    movdqa %xmm2, %xmm5516; SSE2-NEXT:    psllw $4, %xmm5517; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5518; SSE2-NEXT:    por %xmm4, %xmm5519; SSE2-NEXT:    pand %xmm1, %xmm5520; SSE2-NEXT:    pandn %xmm2, %xmm1521; SSE2-NEXT:    por %xmm5, %xmm1522; SSE2-NEXT:    movdqa %xmm1, %xmm2523; SSE2-NEXT:    psrlw $6, %xmm2524; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2525; SSE2-NEXT:    movdqa %xmm1, %xmm4526; SSE2-NEXT:    psllw $2, %xmm4527; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4528; SSE2-NEXT:    por %xmm2, %xmm4529; SSE2-NEXT:    paddb %xmm3, %xmm3530; SSE2-NEXT:    pxor %xmm2, %xmm2531; SSE2-NEXT:    pcmpgtb %xmm3, %xmm2532; SSE2-NEXT:    pand %xmm2, %xmm4533; SSE2-NEXT:    pandn %xmm1, %xmm2534; SSE2-NEXT:    por %xmm4, %xmm2535; SSE2-NEXT:    movdqa %xmm2, %xmm1536; SSE2-NEXT:    paddb %xmm2, %xmm1537; SSE2-NEXT:    movdqa %xmm2, %xmm4538; SSE2-NEXT:    psrlw $7, %xmm4539; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4540; SSE2-NEXT:    por %xmm1, %xmm4541; SSE2-NEXT:    paddb %xmm3, %xmm3542; SSE2-NEXT:    pcmpgtb %xmm3, %xmm0543; SSE2-NEXT:    pand %xmm0, %xmm4544; SSE2-NEXT:    pandn %xmm2, %xmm0545; SSE2-NEXT:    por %xmm4, %xmm0546; SSE2-NEXT:    retq547;548; SSE41-LABEL: var_funnnel_v16i8:549; SSE41:       # %bb.0:550; SSE41-NEXT:    movdqa %xmm0, %xmm2551; SSE41-NEXT:    psrlw $4, %xmm0552; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0553; SSE41-NEXT:    movdqa %xmm2, %xmm3554; SSE41-NEXT:    psllw $4, %xmm3555; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3556; SSE41-NEXT:    por %xmm0, %xmm3557; SSE41-NEXT:    pxor %xmm0, %xmm0558; SSE41-NEXT:    psubb %xmm1, %xmm0559; SSE41-NEXT:    psllw $5, %xmm0560; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2561; SSE41-NEXT:    movdqa %xmm2, %xmm1562; SSE41-NEXT:    psrlw $6, %xmm1563; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1564; SSE41-NEXT:    movdqa %xmm2, %xmm3565; SSE41-NEXT:    psllw $2, %xmm3566; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3567; SSE41-NEXT:    por %xmm1, %xmm3568; SSE41-NEXT:    paddb %xmm0, %xmm0569; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2570; SSE41-NEXT:    movdqa %xmm2, %xmm1571; SSE41-NEXT:    paddb %xmm2, %xmm1572; SSE41-NEXT:    movdqa %xmm2, %xmm3573; SSE41-NEXT:    psrlw $7, %xmm3574; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3575; SSE41-NEXT:    por %xmm1, %xmm3576; SSE41-NEXT:    paddb %xmm0, %xmm0577; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2578; SSE41-NEXT:    movdqa %xmm2, %xmm0579; SSE41-NEXT:    retq580;581; AVX-LABEL: var_funnnel_v16i8:582; AVX:       # %bb.0:583; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm2584; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2585; AVX-NEXT:    vpsllw $4, %xmm0, %xmm3586; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3587; AVX-NEXT:    vpor %xmm2, %xmm3, %xmm2588; AVX-NEXT:    vpxor %xmm3, %xmm3, %xmm3589; AVX-NEXT:    vpsubb %xmm1, %xmm3, %xmm1590; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1591; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0592; AVX-NEXT:    vpsrlw $6, %xmm0, %xmm2593; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2594; AVX-NEXT:    vpsllw $2, %xmm0, %xmm3595; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3596; AVX-NEXT:    vpor %xmm2, %xmm3, %xmm2597; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1598; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0599; AVX-NEXT:    vpaddb %xmm0, %xmm0, %xmm2600; AVX-NEXT:    vpsrlw $7, %xmm0, %xmm3601; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3602; AVX-NEXT:    vpor %xmm3, %xmm2, %xmm2603; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1604; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0605; AVX-NEXT:    retq606;607; AVX512F-LABEL: var_funnnel_v16i8:608; AVX512F:       # %bb.0:609; 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,zero610; AVX512F-NEXT:    vpslld $8, %zmm0, %zmm2611; AVX512F-NEXT:    vpord %zmm2, %zmm0, %zmm0612; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1613; 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,zero614; AVX512F-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0615; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0616; AVX512F-NEXT:    vzeroupper617; AVX512F-NEXT:    retq618;619; AVX512VL-LABEL: var_funnnel_v16i8:620; AVX512VL:       # %bb.0:621; 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,zero622; AVX512VL-NEXT:    vpslld $8, %zmm0, %zmm2623; AVX512VL-NEXT:    vpord %zmm2, %zmm0, %zmm0624; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1625; 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,zero626; AVX512VL-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0627; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0628; AVX512VL-NEXT:    vzeroupper629; AVX512VL-NEXT:    retq630;631; AVX512BW-LABEL: var_funnnel_v16i8:632; AVX512BW:       # %bb.0:633; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]634; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1635; AVX512BW-NEXT:    vpxor %xmm3, %xmm3, %xmm3636; 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]637; AVX512BW-NEXT:    vpsrlvw %zmm3, %zmm2, %zmm2638; AVX512BW-NEXT:    vpbroadcastw {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]639; AVX512BW-NEXT:    vpand %xmm3, %xmm2, %xmm2640; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]641; 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],zero642; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0643; AVX512BW-NEXT:    vpand %xmm3, %xmm0, %xmm0644; AVX512BW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0645; AVX512BW-NEXT:    vzeroupper646; AVX512BW-NEXT:    retq647;648; AVX512VLBW-LABEL: var_funnnel_v16i8:649; AVX512VLBW:       # %bb.0:650; AVX512VLBW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1651; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2652; 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]653; AVX512VLBW-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]654; AVX512VLBW-NEXT:    vpsrlvw %xmm2, %xmm3, %xmm2655; AVX512VLBW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]656; 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],zero657; AVX512VLBW-NEXT:    vpsrlvw %xmm1, %xmm0, %xmm0658; AVX512VLBW-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0659; AVX512VLBW-NEXT:    vpmovwb %ymm0, %xmm0660; AVX512VLBW-NEXT:    vzeroupper661; AVX512VLBW-NEXT:    retq662;663; AVX512VBMI2-LABEL: var_funnnel_v16i8:664; AVX512VBMI2:       # %bb.0:665; AVX512VBMI2-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]666; AVX512VBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1667; AVX512VBMI2-NEXT:    vpxor %xmm3, %xmm3, %xmm3668; 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]669; AVX512VBMI2-NEXT:    vpsrlvw %zmm3, %zmm2, %zmm2670; AVX512VBMI2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]671; 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],zero672; AVX512VBMI2-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm1673; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} xmm0 = [0,2,4,6,8,10,12,14,64,66,68,70,72,74,76,78]674; AVX512VBMI2-NEXT:    vpermi2b %zmm2, %zmm1, %zmm0675; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0676; AVX512VBMI2-NEXT:    vzeroupper677; AVX512VBMI2-NEXT:    retq678;679; AVX512VLVBMI2-LABEL: var_funnnel_v16i8:680; AVX512VLVBMI2:       # %bb.0:681; AVX512VLVBMI2-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1682; AVX512VLVBMI2-NEXT:    vpxor %xmm2, %xmm2, %xmm2683; 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]684; AVX512VLVBMI2-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]685; AVX512VLVBMI2-NEXT:    vpsrlvw %xmm2, %xmm3, %xmm2686; AVX512VLVBMI2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]687; 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],zero688; AVX512VLVBMI2-NEXT:    vpsrlvw %xmm1, %xmm0, %xmm0689; AVX512VLVBMI2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0690; AVX512VLVBMI2-NEXT:    vpmovwb %ymm0, %xmm0691; AVX512VLVBMI2-NEXT:    vzeroupper692; AVX512VLVBMI2-NEXT:    retq693;694; XOP-LABEL: var_funnnel_v16i8:695; XOP:       # %bb.0:696; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2697; XOP-NEXT:    vpsubb %xmm1, %xmm2, %xmm1698; XOP-NEXT:    vprotb %xmm1, %xmm0, %xmm0699; XOP-NEXT:    retq700;701; X86-SSE2-LABEL: var_funnnel_v16i8:702; X86-SSE2:       # %bb.0:703; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2704; X86-SSE2-NEXT:    pxor %xmm0, %xmm0705; X86-SSE2-NEXT:    pxor %xmm3, %xmm3706; X86-SSE2-NEXT:    psubb %xmm1, %xmm3707; X86-SSE2-NEXT:    psllw $5, %xmm3708; X86-SSE2-NEXT:    pxor %xmm1, %xmm1709; X86-SSE2-NEXT:    pcmpgtb %xmm3, %xmm1710; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4711; X86-SSE2-NEXT:    psrlw $4, %xmm4712; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm4713; X86-SSE2-NEXT:    movdqa %xmm2, %xmm5714; X86-SSE2-NEXT:    psllw $4, %xmm5715; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm5716; X86-SSE2-NEXT:    por %xmm4, %xmm5717; X86-SSE2-NEXT:    pand %xmm1, %xmm5718; X86-SSE2-NEXT:    pandn %xmm2, %xmm1719; X86-SSE2-NEXT:    por %xmm5, %xmm1720; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2721; X86-SSE2-NEXT:    psrlw $6, %xmm2722; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2723; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4724; X86-SSE2-NEXT:    psllw $2, %xmm4725; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm4726; X86-SSE2-NEXT:    por %xmm2, %xmm4727; X86-SSE2-NEXT:    paddb %xmm3, %xmm3728; X86-SSE2-NEXT:    pxor %xmm2, %xmm2729; X86-SSE2-NEXT:    pcmpgtb %xmm3, %xmm2730; X86-SSE2-NEXT:    pand %xmm2, %xmm4731; X86-SSE2-NEXT:    pandn %xmm1, %xmm2732; X86-SSE2-NEXT:    por %xmm4, %xmm2733; X86-SSE2-NEXT:    movdqa %xmm2, %xmm1734; X86-SSE2-NEXT:    paddb %xmm2, %xmm1735; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4736; X86-SSE2-NEXT:    psrlw $7, %xmm4737; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm4738; X86-SSE2-NEXT:    por %xmm1, %xmm4739; X86-SSE2-NEXT:    paddb %xmm3, %xmm3740; X86-SSE2-NEXT:    pcmpgtb %xmm3, %xmm0741; X86-SSE2-NEXT:    pand %xmm0, %xmm4742; X86-SSE2-NEXT:    pandn %xmm2, %xmm0743; X86-SSE2-NEXT:    por %xmm4, %xmm0744; X86-SSE2-NEXT:    retl745  %res = call <16 x i8> @llvm.fshr.v16i8(<16 x i8> %x, <16 x i8> %x, <16 x i8> %amt)746  ret <16 x i8> %res747}748 749;750; Uniform Variable Shifts751;752 753define <2 x i64> @splatvar_funnnel_v2i64(<2 x i64> %x, <2 x i64> %amt) nounwind {754; SSE2-LABEL: splatvar_funnnel_v2i64:755; SSE2:       # %bb.0:756; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [63,63]757; SSE2-NEXT:    pxor %xmm3, %xmm3758; SSE2-NEXT:    psubq %xmm1, %xmm3759; SSE2-NEXT:    pand %xmm2, %xmm1760; SSE2-NEXT:    movdqa %xmm0, %xmm4761; SSE2-NEXT:    psrlq %xmm1, %xmm4762; SSE2-NEXT:    pand %xmm2, %xmm3763; SSE2-NEXT:    psllq %xmm3, %xmm0764; SSE2-NEXT:    por %xmm4, %xmm0765; SSE2-NEXT:    retq766;767; SSE41-LABEL: splatvar_funnnel_v2i64:768; SSE41:       # %bb.0:769; SSE41-NEXT:    pmovsxbq {{.*#+}} xmm2 = [63,63]770; SSE41-NEXT:    pxor %xmm3, %xmm3771; SSE41-NEXT:    psubq %xmm1, %xmm3772; SSE41-NEXT:    pand %xmm2, %xmm1773; SSE41-NEXT:    movdqa %xmm0, %xmm4774; SSE41-NEXT:    psrlq %xmm1, %xmm4775; SSE41-NEXT:    pand %xmm2, %xmm3776; SSE41-NEXT:    psllq %xmm3, %xmm0777; SSE41-NEXT:    por %xmm4, %xmm0778; SSE41-NEXT:    retq779;780; AVX-LABEL: splatvar_funnnel_v2i64:781; AVX:       # %bb.0:782; AVX-NEXT:    vpmovsxbq {{.*#+}} xmm2 = [63,63]783; AVX-NEXT:    vpand %xmm2, %xmm1, %xmm3784; AVX-NEXT:    vpsrlq %xmm3, %xmm0, %xmm3785; AVX-NEXT:    vpxor %xmm4, %xmm4, %xmm4786; AVX-NEXT:    vpsubq %xmm1, %xmm4, %xmm1787; AVX-NEXT:    vpand %xmm2, %xmm1, %xmm1788; AVX-NEXT:    vpsllq %xmm1, %xmm0, %xmm0789; AVX-NEXT:    vpor %xmm0, %xmm3, %xmm0790; AVX-NEXT:    retq791;792; AVX512F-LABEL: splatvar_funnnel_v2i64:793; AVX512F:       # %bb.0:794; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0795; AVX512F-NEXT:    vpbroadcastq %xmm1, %xmm1796; AVX512F-NEXT:    vprorvq %zmm1, %zmm0, %zmm0797; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0798; AVX512F-NEXT:    vzeroupper799; AVX512F-NEXT:    retq800;801; AVX512VL-LABEL: splatvar_funnnel_v2i64:802; AVX512VL:       # %bb.0:803; AVX512VL-NEXT:    vpbroadcastq %xmm1, %xmm1804; AVX512VL-NEXT:    vprorvq %xmm1, %xmm0, %xmm0805; AVX512VL-NEXT:    retq806;807; AVX512BW-LABEL: splatvar_funnnel_v2i64:808; AVX512BW:       # %bb.0:809; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0810; AVX512BW-NEXT:    vpbroadcastq %xmm1, %xmm1811; AVX512BW-NEXT:    vprorvq %zmm1, %zmm0, %zmm0812; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0813; AVX512BW-NEXT:    vzeroupper814; AVX512BW-NEXT:    retq815;816; AVX512VLBW-LABEL: splatvar_funnnel_v2i64:817; AVX512VLBW:       # %bb.0:818; AVX512VLBW-NEXT:    vpbroadcastq %xmm1, %xmm1819; AVX512VLBW-NEXT:    vprorvq %xmm1, %xmm0, %xmm0820; AVX512VLBW-NEXT:    retq821;822; AVX512VBMI2-LABEL: splatvar_funnnel_v2i64:823; AVX512VBMI2:       # %bb.0:824; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0825; AVX512VBMI2-NEXT:    vpbroadcastq %xmm1, %xmm1826; AVX512VBMI2-NEXT:    vprorvq %zmm1, %zmm0, %zmm0827; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0828; AVX512VBMI2-NEXT:    vzeroupper829; AVX512VBMI2-NEXT:    retq830;831; AVX512VLVBMI2-LABEL: splatvar_funnnel_v2i64:832; AVX512VLVBMI2:       # %bb.0:833; AVX512VLVBMI2-NEXT:    vpbroadcastq %xmm1, %xmm1834; AVX512VLVBMI2-NEXT:    vprorvq %xmm1, %xmm0, %xmm0835; AVX512VLVBMI2-NEXT:    retq836;837; XOPAVX1-LABEL: splatvar_funnnel_v2i64:838; XOPAVX1:       # %bb.0:839; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2840; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm1841; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]842; XOPAVX1-NEXT:    vprotq %xmm1, %xmm0, %xmm0843; XOPAVX1-NEXT:    retq844;845; XOPAVX2-LABEL: splatvar_funnnel_v2i64:846; XOPAVX2:       # %bb.0:847; XOPAVX2-NEXT:    vpbroadcastq %xmm1, %xmm1848; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2849; XOPAVX2-NEXT:    vpsubq %xmm1, %xmm2, %xmm1850; XOPAVX2-NEXT:    vprotq %xmm1, %xmm0, %xmm0851; XOPAVX2-NEXT:    retq852;853; X86-SSE2-LABEL: splatvar_funnnel_v2i64:854; X86-SSE2:       # %bb.0:855; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [63,0,63,0]856; X86-SSE2-NEXT:    pxor %xmm3, %xmm3857; X86-SSE2-NEXT:    psubq %xmm1, %xmm3858; X86-SSE2-NEXT:    pand %xmm2, %xmm1859; X86-SSE2-NEXT:    movdqa %xmm0, %xmm4860; X86-SSE2-NEXT:    psrlq %xmm1, %xmm4861; X86-SSE2-NEXT:    pand %xmm2, %xmm3862; X86-SSE2-NEXT:    psllq %xmm3, %xmm0863; X86-SSE2-NEXT:    por %xmm4, %xmm0864; X86-SSE2-NEXT:    retl865  %splat = shufflevector <2 x i64> %amt, <2 x i64> undef, <2 x i32> zeroinitializer866  %res = call <2 x i64> @llvm.fshr.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> %splat)867  ret <2 x i64> %res868}869 870define <4 x i32> @splatvar_funnnel_v4i32(<4 x i32> %x, <4 x i32> %amt) nounwind {871; SSE-LABEL: splatvar_funnnel_v4i32:872; SSE:       # %bb.0:873; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1874; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]875; SSE-NEXT:    psrlq %xmm1, %xmm2876; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]877; SSE-NEXT:    psrlq %xmm1, %xmm0878; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]879; SSE-NEXT:    retq880;881; AVX-LABEL: splatvar_funnnel_v4i32:882; AVX:       # %bb.0:883; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1884; AVX-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]885; AVX-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2886; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]887; AVX-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0888; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]889; AVX-NEXT:    retq890;891; AVX512F-LABEL: splatvar_funnnel_v4i32:892; AVX512F:       # %bb.0:893; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0894; AVX512F-NEXT:    vpbroadcastd %xmm1, %xmm1895; AVX512F-NEXT:    vprorvd %zmm1, %zmm0, %zmm0896; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0897; AVX512F-NEXT:    vzeroupper898; AVX512F-NEXT:    retq899;900; AVX512VL-LABEL: splatvar_funnnel_v4i32:901; AVX512VL:       # %bb.0:902; AVX512VL-NEXT:    vpbroadcastd %xmm1, %xmm1903; AVX512VL-NEXT:    vprorvd %xmm1, %xmm0, %xmm0904; AVX512VL-NEXT:    retq905;906; AVX512BW-LABEL: splatvar_funnnel_v4i32:907; AVX512BW:       # %bb.0:908; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0909; AVX512BW-NEXT:    vpbroadcastd %xmm1, %xmm1910; AVX512BW-NEXT:    vprorvd %zmm1, %zmm0, %zmm0911; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0912; AVX512BW-NEXT:    vzeroupper913; AVX512BW-NEXT:    retq914;915; AVX512VLBW-LABEL: splatvar_funnnel_v4i32:916; AVX512VLBW:       # %bb.0:917; AVX512VLBW-NEXT:    vpbroadcastd %xmm1, %xmm1918; AVX512VLBW-NEXT:    vprorvd %xmm1, %xmm0, %xmm0919; AVX512VLBW-NEXT:    retq920;921; AVX512VBMI2-LABEL: splatvar_funnnel_v4i32:922; AVX512VBMI2:       # %bb.0:923; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0924; AVX512VBMI2-NEXT:    vpbroadcastd %xmm1, %xmm1925; AVX512VBMI2-NEXT:    vprorvd %zmm1, %zmm0, %zmm0926; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0927; AVX512VBMI2-NEXT:    vzeroupper928; AVX512VBMI2-NEXT:    retq929;930; AVX512VLVBMI2-LABEL: splatvar_funnnel_v4i32:931; AVX512VLVBMI2:       # %bb.0:932; AVX512VLVBMI2-NEXT:    vpbroadcastd %xmm1, %xmm1933; AVX512VLVBMI2-NEXT:    vprorvd %xmm1, %xmm0, %xmm0934; AVX512VLVBMI2-NEXT:    retq935;936; XOPAVX1-LABEL: splatvar_funnnel_v4i32:937; XOPAVX1:       # %bb.0:938; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]939; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2940; XOPAVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm1941; XOPAVX1-NEXT:    vprotd %xmm1, %xmm0, %xmm0942; XOPAVX1-NEXT:    retq943;944; XOPAVX2-LABEL: splatvar_funnnel_v4i32:945; XOPAVX2:       # %bb.0:946; XOPAVX2-NEXT:    vpbroadcastd %xmm1, %xmm1947; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2948; XOPAVX2-NEXT:    vpsubd %xmm1, %xmm2, %xmm1949; XOPAVX2-NEXT:    vprotd %xmm1, %xmm0, %xmm0950; XOPAVX2-NEXT:    retq951;952; X86-SSE2-LABEL: splatvar_funnnel_v4i32:953; X86-SSE2:       # %bb.0:954; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1955; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]956; X86-SSE2-NEXT:    psrlq %xmm1, %xmm2957; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]958; X86-SSE2-NEXT:    psrlq %xmm1, %xmm0959; X86-SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]960; X86-SSE2-NEXT:    retl961  %splat = shufflevector <4 x i32> %amt, <4 x i32> undef, <4 x i32> zeroinitializer962  %res = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> %splat)963  ret <4 x i32> %res964}965 966define <8 x i16> @splatvar_funnnel_v8i16(<8 x i16> %x, <8 x i16> %amt) nounwind {967; SSE2-LABEL: splatvar_funnnel_v8i16:968; SSE2:       # %bb.0:969; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1970; SSE2-NEXT:    movdqa %xmm0, %xmm2971; SSE2-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]972; SSE2-NEXT:    psrld %xmm1, %xmm2973; SSE2-NEXT:    pslld $16, %xmm2974; SSE2-NEXT:    psrad $16, %xmm2975; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]976; SSE2-NEXT:    psrld %xmm1, %xmm0977; SSE2-NEXT:    pslld $16, %xmm0978; SSE2-NEXT:    psrad $16, %xmm0979; SSE2-NEXT:    packssdw %xmm2, %xmm0980; SSE2-NEXT:    retq981;982; SSE41-LABEL: splatvar_funnnel_v8i16:983; SSE41:       # %bb.0:984; SSE41-NEXT:    pmovsxbq {{.*#+}} xmm2 = [15,0]985; SSE41-NEXT:    movdqa %xmm1, %xmm3986; SSE41-NEXT:    pand %xmm2, %xmm3987; SSE41-NEXT:    movdqa %xmm0, %xmm4988; SSE41-NEXT:    psrlw %xmm3, %xmm4989; SSE41-NEXT:    pandn %xmm2, %xmm1990; SSE41-NEXT:    paddw %xmm0, %xmm0991; SSE41-NEXT:    psllw %xmm1, %xmm0992; SSE41-NEXT:    por %xmm4, %xmm0993; SSE41-NEXT:    retq994;995; AVX-LABEL: splatvar_funnnel_v8i16:996; AVX:       # %bb.0:997; AVX-NEXT:    vpmovsxbq {{.*#+}} xmm2 = [15,0]998; AVX-NEXT:    vpand %xmm2, %xmm1, %xmm3999; AVX-NEXT:    vpsrlw %xmm3, %xmm0, %xmm31000; AVX-NEXT:    vpandn %xmm2, %xmm1, %xmm11001; AVX-NEXT:    vpaddw %xmm0, %xmm0, %xmm01002; AVX-NEXT:    vpsllw %xmm1, %xmm0, %xmm01003; AVX-NEXT:    vpor %xmm3, %xmm0, %xmm01004; AVX-NEXT:    retq1005;1006; AVX512F-LABEL: splatvar_funnnel_v8i16:1007; AVX512F:       # %bb.0:1008; AVX512F-NEXT:    vpmovsxbq {{.*#+}} xmm2 = [15,0]1009; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm31010; AVX512F-NEXT:    vpsrlw %xmm3, %xmm0, %xmm31011; AVX512F-NEXT:    vpandn %xmm2, %xmm1, %xmm11012; AVX512F-NEXT:    vpaddw %xmm0, %xmm0, %xmm01013; AVX512F-NEXT:    vpsllw %xmm1, %xmm0, %xmm01014; AVX512F-NEXT:    vpor %xmm3, %xmm0, %xmm01015; AVX512F-NEXT:    retq1016;1017; AVX512VL-LABEL: splatvar_funnnel_v8i16:1018; AVX512VL:       # %bb.0:1019; AVX512VL-NEXT:    vpmovsxbq {{.*#+}} xmm2 = [15,0]1020; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm31021; AVX512VL-NEXT:    vpsrlw %xmm3, %xmm0, %xmm31022; AVX512VL-NEXT:    vpandn %xmm2, %xmm1, %xmm11023; AVX512VL-NEXT:    vpaddw %xmm0, %xmm0, %xmm01024; AVX512VL-NEXT:    vpsllw %xmm1, %xmm0, %xmm01025; AVX512VL-NEXT:    vpor %xmm3, %xmm0, %xmm01026; AVX512VL-NEXT:    retq1027;1028; AVX512BW-LABEL: splatvar_funnnel_v8i16:1029; AVX512BW:       # %bb.0:1030; AVX512BW-NEXT:    vpmovsxbq {{.*#+}} xmm2 = [15,0]1031; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm31032; AVX512BW-NEXT:    vpsrlw %xmm3, %xmm0, %xmm31033; AVX512BW-NEXT:    vpandn %xmm2, %xmm1, %xmm11034; AVX512BW-NEXT:    vpaddw %xmm0, %xmm0, %xmm01035; AVX512BW-NEXT:    vpsllw %xmm1, %xmm0, %xmm01036; AVX512BW-NEXT:    vpor %xmm3, %xmm0, %xmm01037; AVX512BW-NEXT:    retq1038;1039; AVX512VLBW-LABEL: splatvar_funnnel_v8i16:1040; AVX512VLBW:       # %bb.0:1041; AVX512VLBW-NEXT:    vpmovsxbq {{.*#+}} xmm2 = [15,0]1042; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm31043; AVX512VLBW-NEXT:    vpsrlw %xmm3, %xmm0, %xmm31044; AVX512VLBW-NEXT:    vpandn %xmm2, %xmm1, %xmm11045; AVX512VLBW-NEXT:    vpaddw %xmm0, %xmm0, %xmm01046; AVX512VLBW-NEXT:    vpsllw %xmm1, %xmm0, %xmm01047; AVX512VLBW-NEXT:    vpor %xmm3, %xmm0, %xmm01048; AVX512VLBW-NEXT:    retq1049;1050; AVX512VBMI2-LABEL: splatvar_funnnel_v8i16:1051; AVX512VBMI2:       # %bb.0:1052; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01053; AVX512VBMI2-NEXT:    vpbroadcastw %xmm1, %xmm11054; AVX512VBMI2-NEXT:    vpshrdvw %zmm1, %zmm0, %zmm01055; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01056; AVX512VBMI2-NEXT:    vzeroupper1057; AVX512VBMI2-NEXT:    retq1058;1059; AVX512VLVBMI2-LABEL: splatvar_funnnel_v8i16:1060; AVX512VLVBMI2:       # %bb.0:1061; AVX512VLVBMI2-NEXT:    vpbroadcastw %xmm1, %xmm11062; AVX512VLVBMI2-NEXT:    vpshrdvw %xmm1, %xmm0, %xmm01063; AVX512VLVBMI2-NEXT:    retq1064;1065; XOPAVX1-LABEL: splatvar_funnnel_v8i16:1066; XOPAVX1:       # %bb.0:1067; XOPAVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]1068; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm21069; XOPAVX1-NEXT:    vpsubw %xmm1, %xmm2, %xmm11070; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]1071; XOPAVX1-NEXT:    vprotw %xmm1, %xmm0, %xmm01072; XOPAVX1-NEXT:    retq1073;1074; XOPAVX2-LABEL: splatvar_funnnel_v8i16:1075; XOPAVX2:       # %bb.0:1076; XOPAVX2-NEXT:    vpbroadcastw %xmm1, %xmm11077; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm21078; XOPAVX2-NEXT:    vpsubw %xmm1, %xmm2, %xmm11079; XOPAVX2-NEXT:    vprotw %xmm1, %xmm0, %xmm01080; XOPAVX2-NEXT:    retq1081;1082; X86-SSE2-LABEL: splatvar_funnnel_v8i16:1083; X86-SSE2:       # %bb.0:1084; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11085; X86-SSE2-NEXT:    movdqa %xmm0, %xmm21086; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]1087; X86-SSE2-NEXT:    psrld %xmm1, %xmm21088; X86-SSE2-NEXT:    pslld $16, %xmm21089; X86-SSE2-NEXT:    psrad $16, %xmm21090; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1091; X86-SSE2-NEXT:    psrld %xmm1, %xmm01092; X86-SSE2-NEXT:    pslld $16, %xmm01093; X86-SSE2-NEXT:    psrad $16, %xmm01094; X86-SSE2-NEXT:    packssdw %xmm2, %xmm01095; X86-SSE2-NEXT:    retl1096  %splat = shufflevector <8 x i16> %amt, <8 x i16> undef, <8 x i32> zeroinitializer1097  %res = call <8 x i16> @llvm.fshr.v8i16(<8 x i16> %x, <8 x i16> %x, <8 x i16> %splat)1098  ret <8 x i16> %res1099}1100 1101define <16 x i8> @splatvar_funnnel_v16i8(<16 x i8> %x, <16 x i8> %amt) nounwind {1102; SSE2-LABEL: splatvar_funnnel_v16i8:1103; SSE2:       # %bb.0:1104; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11105; SSE2-NEXT:    movdqa %xmm0, %xmm21106; 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]1107; SSE2-NEXT:    psrlw %xmm1, %xmm21108; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]1109; SSE2-NEXT:    pand %xmm3, %xmm21110; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1111; SSE2-NEXT:    psrlw %xmm1, %xmm01112; SSE2-NEXT:    pand %xmm3, %xmm01113; SSE2-NEXT:    packuswb %xmm2, %xmm01114; SSE2-NEXT:    retq1115;1116; SSE41-LABEL: splatvar_funnnel_v16i8:1117; SSE41:       # %bb.0:1118; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11119; SSE41-NEXT:    movdqa %xmm0, %xmm21120; SSE41-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]1121; SSE41-NEXT:    psrlw %xmm1, %xmm21122; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]1123; SSE41-NEXT:    pand %xmm3, %xmm21124; SSE41-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1125; SSE41-NEXT:    psrlw %xmm1, %xmm01126; SSE41-NEXT:    pand %xmm3, %xmm01127; SSE41-NEXT:    packuswb %xmm2, %xmm01128; SSE41-NEXT:    retq1129;1130; AVX1-LABEL: splatvar_funnnel_v16i8:1131; AVX1:       # %bb.0:1132; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11133; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1134; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21135; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]1136; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm21137; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1138; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm01139; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm01140; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm01141; AVX1-NEXT:    retq1142;1143; AVX2-LABEL: splatvar_funnnel_v16i8:1144; AVX2:       # %bb.0:1145; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11146; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1147; AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21148; AVX2-NEXT:    vpbroadcastw {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]1149; AVX2-NEXT:    vpand %xmm3, %xmm2, %xmm21150; AVX2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1151; AVX2-NEXT:    vpsrlw %xmm1, %xmm0, %xmm01152; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm01153; AVX2-NEXT:    vpackuswb %xmm2, %xmm0, %xmm01154; AVX2-NEXT:    retq1155;1156; AVX512F-LABEL: splatvar_funnnel_v16i8:1157; AVX512F:       # %bb.0:1158; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11159; AVX512F-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1160; AVX512F-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21161; AVX512F-NEXT:    vpbroadcastw {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]1162; AVX512F-NEXT:    vpand %xmm3, %xmm2, %xmm21163; AVX512F-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1164; AVX512F-NEXT:    vpsrlw %xmm1, %xmm0, %xmm01165; AVX512F-NEXT:    vpand %xmm3, %xmm0, %xmm01166; AVX512F-NEXT:    vpackuswb %xmm2, %xmm0, %xmm01167; AVX512F-NEXT:    retq1168;1169; AVX512VL-LABEL: splatvar_funnnel_v16i8:1170; AVX512VL:       # %bb.0:1171; AVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11172; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1173; AVX512VL-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21174; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]1175; AVX512VL-NEXT:    vpand %xmm3, %xmm2, %xmm21176; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1177; AVX512VL-NEXT:    vpsrlw %xmm1, %xmm0, %xmm01178; AVX512VL-NEXT:    vpand %xmm3, %xmm0, %xmm01179; AVX512VL-NEXT:    vpackuswb %xmm2, %xmm0, %xmm01180; AVX512VL-NEXT:    retq1181;1182; AVX512BW-LABEL: splatvar_funnnel_v16i8:1183; AVX512BW:       # %bb.0:1184; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11185; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1186; AVX512BW-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21187; AVX512BW-NEXT:    vpbroadcastw {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]1188; AVX512BW-NEXT:    vpand %xmm3, %xmm2, %xmm21189; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1190; AVX512BW-NEXT:    vpsrlw %xmm1, %xmm0, %xmm01191; AVX512BW-NEXT:    vpand %xmm3, %xmm0, %xmm01192; AVX512BW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm01193; AVX512BW-NEXT:    retq1194;1195; AVX512VLBW-LABEL: splatvar_funnnel_v16i8:1196; AVX512VLBW:       # %bb.0:1197; AVX512VLBW-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm01198; AVX512VLBW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1199; 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]1200; AVX512VLBW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11201; AVX512VLBW-NEXT:    vpsrlw %xmm1, %ymm0, %ymm01202; AVX512VLBW-NEXT:    vpmovwb %ymm0, %xmm01203; AVX512VLBW-NEXT:    vzeroupper1204; AVX512VLBW-NEXT:    retq1205;1206; AVX512VBMI2-LABEL: splatvar_funnnel_v16i8:1207; AVX512VBMI2:       # %bb.0:1208; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,2,4,6,8,10,12,14,64,66,68,70,72,74,76,78]1209; AVX512VBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11210; AVX512VBMI2-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1211; AVX512VBMI2-NEXT:    vpsrlw %xmm1, %xmm3, %xmm31212; AVX512VBMI2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1213; AVX512VBMI2-NEXT:    vpsrlw %xmm1, %xmm0, %xmm01214; AVX512VBMI2-NEXT:    vpermt2b %zmm3, %zmm2, %zmm01215; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01216; AVX512VBMI2-NEXT:    vzeroupper1217; AVX512VBMI2-NEXT:    retq1218;1219; AVX512VLVBMI2-LABEL: splatvar_funnnel_v16i8:1220; AVX512VLVBMI2:       # %bb.0:1221; AVX512VLVBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm01222; AVX512VLVBMI2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1223; 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]1224; AVX512VLVBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11225; AVX512VLVBMI2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm01226; AVX512VLVBMI2-NEXT:    vpmovwb %ymm0, %xmm01227; AVX512VLVBMI2-NEXT:    vzeroupper1228; AVX512VLVBMI2-NEXT:    retq1229;1230; XOPAVX1-LABEL: splatvar_funnnel_v16i8:1231; XOPAVX1:       # %bb.0:1232; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm21233; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm11234; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm11235; XOPAVX1-NEXT:    vprotb %xmm1, %xmm0, %xmm01236; XOPAVX1-NEXT:    retq1237;1238; XOPAVX2-LABEL: splatvar_funnnel_v16i8:1239; XOPAVX2:       # %bb.0:1240; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm11241; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm21242; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm2, %xmm11243; XOPAVX2-NEXT:    vprotb %xmm1, %xmm0, %xmm01244; XOPAVX2-NEXT:    retq1245;1246; X86-SSE2-LABEL: splatvar_funnnel_v16i8:1247; X86-SSE2:       # %bb.0:1248; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11249; X86-SSE2-NEXT:    movdqa %xmm0, %xmm21250; 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]1251; X86-SSE2-NEXT:    psrlw %xmm1, %xmm21252; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]1253; X86-SSE2-NEXT:    pand %xmm3, %xmm21254; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1255; X86-SSE2-NEXT:    psrlw %xmm1, %xmm01256; X86-SSE2-NEXT:    pand %xmm3, %xmm01257; X86-SSE2-NEXT:    packuswb %xmm2, %xmm01258; X86-SSE2-NEXT:    retl1259  %splat = shufflevector <16 x i8> %amt, <16 x i8> undef, <16 x i32> zeroinitializer1260  %res = call <16 x i8> @llvm.fshr.v16i8(<16 x i8> %x, <16 x i8> %x, <16 x i8> %splat)1261  ret <16 x i8> %res1262}1263 1264;1265; Constant Shifts1266;1267 1268define <2 x i64> @constant_funnnel_v2i64(<2 x i64> %x) nounwind {1269; SSE2-LABEL: constant_funnnel_v2i64:1270; SSE2:       # %bb.0:1271; SSE2-NEXT:    movdqa %xmm0, %xmm11272; SSE2-NEXT:    psllq $60, %xmm11273; SSE2-NEXT:    movdqa %xmm0, %xmm21274; SSE2-NEXT:    psllq $50, %xmm21275; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]1276; SSE2-NEXT:    movdqa %xmm0, %xmm11277; SSE2-NEXT:    psrlq $4, %xmm11278; SSE2-NEXT:    psrlq $14, %xmm01279; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]1280; SSE2-NEXT:    orpd %xmm2, %xmm01281; SSE2-NEXT:    retq1282;1283; SSE41-LABEL: constant_funnnel_v2i64:1284; SSE41:       # %bb.0:1285; SSE41-NEXT:    movdqa %xmm0, %xmm11286; SSE41-NEXT:    psllq $50, %xmm11287; SSE41-NEXT:    movdqa %xmm0, %xmm21288; SSE41-NEXT:    psllq $60, %xmm21289; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]1290; SSE41-NEXT:    movdqa %xmm0, %xmm11291; SSE41-NEXT:    psrlq $14, %xmm11292; SSE41-NEXT:    psrlq $4, %xmm01293; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]1294; SSE41-NEXT:    por %xmm2, %xmm01295; SSE41-NEXT:    retq1296;1297; AVX1-LABEL: constant_funnnel_v2i64:1298; AVX1:       # %bb.0:1299; AVX1-NEXT:    vpsllq $50, %xmm0, %xmm11300; AVX1-NEXT:    vpsllq $60, %xmm0, %xmm21301; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]1302; AVX1-NEXT:    vpsrlq $14, %xmm0, %xmm21303; AVX1-NEXT:    vpsrlq $4, %xmm0, %xmm01304; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]1305; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm01306; AVX1-NEXT:    retq1307;1308; AVX2-LABEL: constant_funnnel_v2i64:1309; AVX2:       # %bb.0:1310; AVX2-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11311; AVX2-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01312; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm01313; AVX2-NEXT:    retq1314;1315; AVX512F-LABEL: constant_funnnel_v2i64:1316; AVX512F:       # %bb.0:1317; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01318; AVX512F-NEXT:    vpmovsxbq {{.*#+}} xmm1 = [4,14]1319; AVX512F-NEXT:    vprorvq %zmm1, %zmm0, %zmm01320; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01321; AVX512F-NEXT:    vzeroupper1322; AVX512F-NEXT:    retq1323;1324; AVX512VL-LABEL: constant_funnnel_v2i64:1325; AVX512VL:       # %bb.0:1326; AVX512VL-NEXT:    vprorvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01327; AVX512VL-NEXT:    retq1328;1329; AVX512BW-LABEL: constant_funnnel_v2i64:1330; AVX512BW:       # %bb.0:1331; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01332; AVX512BW-NEXT:    vpmovsxbq {{.*#+}} xmm1 = [4,14]1333; AVX512BW-NEXT:    vprorvq %zmm1, %zmm0, %zmm01334; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01335; AVX512BW-NEXT:    vzeroupper1336; AVX512BW-NEXT:    retq1337;1338; AVX512VLBW-LABEL: constant_funnnel_v2i64:1339; AVX512VLBW:       # %bb.0:1340; AVX512VLBW-NEXT:    vprorvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01341; AVX512VLBW-NEXT:    retq1342;1343; AVX512VBMI2-LABEL: constant_funnnel_v2i64:1344; AVX512VBMI2:       # %bb.0:1345; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01346; AVX512VBMI2-NEXT:    vpmovsxbq {{.*#+}} xmm1 = [4,14]1347; AVX512VBMI2-NEXT:    vprorvq %zmm1, %zmm0, %zmm01348; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01349; AVX512VBMI2-NEXT:    vzeroupper1350; AVX512VBMI2-NEXT:    retq1351;1352; AVX512VLVBMI2-LABEL: constant_funnnel_v2i64:1353; AVX512VLVBMI2:       # %bb.0:1354; AVX512VLVBMI2-NEXT:    vprorvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01355; AVX512VLVBMI2-NEXT:    retq1356;1357; XOP-LABEL: constant_funnnel_v2i64:1358; XOP:       # %bb.0:1359; XOP-NEXT:    vprotq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01360; XOP-NEXT:    retq1361;1362; X86-SSE2-LABEL: constant_funnnel_v2i64:1363; X86-SSE2:       # %bb.0:1364; X86-SSE2-NEXT:    movdqa %xmm0, %xmm11365; X86-SSE2-NEXT:    psllq $60, %xmm11366; X86-SSE2-NEXT:    movdqa %xmm0, %xmm21367; X86-SSE2-NEXT:    psllq $50, %xmm21368; X86-SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]1369; X86-SSE2-NEXT:    movdqa %xmm0, %xmm11370; X86-SSE2-NEXT:    psrlq $4, %xmm11371; X86-SSE2-NEXT:    psrlq $14, %xmm01372; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]1373; X86-SSE2-NEXT:    orpd %xmm2, %xmm01374; X86-SSE2-NEXT:    retl1375  %res = call <2 x i64> @llvm.fshr.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> <i64 4, i64 14>)1376  ret <2 x i64> %res1377}1378 1379define <4 x i32> @constant_funnnel_v4i32(<4 x i32> %x) nounwind {1380; SSE2-LABEL: constant_funnnel_v4i32:1381; SSE2:       # %bb.0:1382; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1383; SSE2-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [268435456,134217728,67108864,33554432]1384; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]1385; SSE2-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [134217728,u,33554432,u]1386; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]1387; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]1388; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1389; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1390; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1391; SSE2-NEXT:    por %xmm2, %xmm01392; SSE2-NEXT:    retq1393;1394; SSE41-LABEL: constant_funnnel_v4i32:1395; SSE41:       # %bb.0:1396; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1397; SSE41-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [134217728,u,33554432,u]1398; SSE41-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [268435456,134217728,67108864,33554432]1399; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1400; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1401; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1402; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1403; SSE41-NEXT:    por %xmm2, %xmm01404; SSE41-NEXT:    retq1405;1406; AVX1-LABEL: constant_funnnel_v4i32:1407; AVX1:       # %bb.0:1408; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1409; AVX1-NEXT:    vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [134217728,u,33554432,u]1410; AVX1-NEXT:    vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [268435456,134217728,67108864,33554432]1411; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1412; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1413; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1414; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1415; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm01416; AVX1-NEXT:    retq1417;1418; AVX2-LABEL: constant_funnnel_v4i32:1419; AVX2:       # %bb.0:1420; AVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11421; AVX2-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01422; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm01423; AVX2-NEXT:    retq1424;1425; AVX512F-LABEL: constant_funnnel_v4i32:1426; AVX512F:       # %bb.0:1427; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01428; AVX512F-NEXT:    vpmovsxbd {{.*#+}} xmm1 = [4,5,6,7]1429; AVX512F-NEXT:    vprorvd %zmm1, %zmm0, %zmm01430; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01431; AVX512F-NEXT:    vzeroupper1432; AVX512F-NEXT:    retq1433;1434; AVX512VL-LABEL: constant_funnnel_v4i32:1435; AVX512VL:       # %bb.0:1436; AVX512VL-NEXT:    vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01437; AVX512VL-NEXT:    retq1438;1439; AVX512BW-LABEL: constant_funnnel_v4i32:1440; AVX512BW:       # %bb.0:1441; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01442; AVX512BW-NEXT:    vpmovsxbd {{.*#+}} xmm1 = [4,5,6,7]1443; AVX512BW-NEXT:    vprorvd %zmm1, %zmm0, %zmm01444; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01445; AVX512BW-NEXT:    vzeroupper1446; AVX512BW-NEXT:    retq1447;1448; AVX512VLBW-LABEL: constant_funnnel_v4i32:1449; AVX512VLBW:       # %bb.0:1450; AVX512VLBW-NEXT:    vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01451; AVX512VLBW-NEXT:    retq1452;1453; AVX512VBMI2-LABEL: constant_funnnel_v4i32:1454; AVX512VBMI2:       # %bb.0:1455; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01456; AVX512VBMI2-NEXT:    vpmovsxbd {{.*#+}} xmm1 = [4,5,6,7]1457; AVX512VBMI2-NEXT:    vprorvd %zmm1, %zmm0, %zmm01458; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01459; AVX512VBMI2-NEXT:    vzeroupper1460; AVX512VBMI2-NEXT:    retq1461;1462; AVX512VLVBMI2-LABEL: constant_funnnel_v4i32:1463; AVX512VLVBMI2:       # %bb.0:1464; AVX512VLVBMI2-NEXT:    vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01465; AVX512VLVBMI2-NEXT:    retq1466;1467; XOP-LABEL: constant_funnnel_v4i32:1468; XOP:       # %bb.0:1469; XOP-NEXT:    vprotd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01470; XOP-NEXT:    retq1471;1472; X86-SSE2-LABEL: constant_funnnel_v4i32:1473; X86-SSE2:       # %bb.0:1474; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1475; X86-SSE2-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [268435456,134217728,67108864,33554432]1476; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]1477; X86-SSE2-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [134217728,u,33554432,u]1478; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]1479; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]1480; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1481; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1482; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1483; X86-SSE2-NEXT:    por %xmm2, %xmm01484; X86-SSE2-NEXT:    retl1485  %res = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> <i32 4, i32 5, i32 6, i32 7>)1486  ret <4 x i32> %res1487}1488 1489define <8 x i16> @constant_funnnel_v8i16(<8 x i16> %x) nounwind {1490; SSE-LABEL: constant_funnnel_v8i16:1491; SSE:       # %bb.0:1492; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [1,32768,16384,8192,4096,2048,1024,512]1493; SSE-NEXT:    movdqa %xmm0, %xmm21494; SSE-NEXT:    pmulhuw %xmm1, %xmm21495; SSE-NEXT:    pmullw %xmm1, %xmm01496; SSE-NEXT:    por %xmm2, %xmm01497; SSE-NEXT:    retq1498;1499; AVX-LABEL: constant_funnnel_v8i16:1500; AVX:       # %bb.0:1501; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,32768,16384,8192,4096,2048,1024,512]1502; AVX-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm21503; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm01504; AVX-NEXT:    vpor %xmm2, %xmm0, %xmm01505; AVX-NEXT:    retq1506;1507; AVX512F-LABEL: constant_funnnel_v8i16:1508; AVX512F:       # %bb.0:1509; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,32768,16384,8192,4096,2048,1024,512]1510; AVX512F-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm21511; AVX512F-NEXT:    vpmullw %xmm1, %xmm0, %xmm01512; AVX512F-NEXT:    vpor %xmm2, %xmm0, %xmm01513; AVX512F-NEXT:    retq1514;1515; AVX512VL-LABEL: constant_funnnel_v8i16:1516; AVX512VL:       # %bb.0:1517; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,32768,16384,8192,4096,2048,1024,512]1518; AVX512VL-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm21519; AVX512VL-NEXT:    vpmullw %xmm1, %xmm0, %xmm01520; AVX512VL-NEXT:    vpor %xmm2, %xmm0, %xmm01521; AVX512VL-NEXT:    retq1522;1523; AVX512BW-LABEL: constant_funnnel_v8i16:1524; AVX512BW:       # %bb.0:1525; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01526; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} xmm1 = [16,1,2,3,4,5,6,7]1527; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm11528; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} xmm2 = [0,15,14,13,12,11,10,9]1529; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm01530; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm01531; AVX512BW-NEXT:    vzeroupper1532; AVX512BW-NEXT:    retq1533;1534; AVX512VLBW-LABEL: constant_funnnel_v8i16:1535; AVX512VLBW:       # %bb.0:1536; AVX512VLBW-NEXT:    vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11537; AVX512VLBW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01538; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm01539; AVX512VLBW-NEXT:    retq1540;1541; AVX512VBMI2-LABEL: constant_funnnel_v8i16:1542; AVX512VBMI2:       # %bb.0:1543; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01544; AVX512VBMI2-NEXT:    vpmovsxbw {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]1545; AVX512VBMI2-NEXT:    vpshrdvw %zmm1, %zmm0, %zmm01546; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01547; AVX512VBMI2-NEXT:    vzeroupper1548; AVX512VBMI2-NEXT:    retq1549;1550; AVX512VLVBMI2-LABEL: constant_funnnel_v8i16:1551; AVX512VLVBMI2:       # %bb.0:1552; AVX512VLVBMI2-NEXT:    vpshrdvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01553; AVX512VLVBMI2-NEXT:    retq1554;1555; XOP-LABEL: constant_funnnel_v8i16:1556; XOP:       # %bb.0:1557; XOP-NEXT:    vprotw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01558; XOP-NEXT:    retq1559;1560; X86-SSE2-LABEL: constant_funnnel_v8i16:1561; X86-SSE2:       # %bb.0:1562; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1,32768,16384,8192,4096,2048,1024,512]1563; X86-SSE2-NEXT:    movdqa %xmm0, %xmm21564; X86-SSE2-NEXT:    pmulhuw %xmm1, %xmm21565; X86-SSE2-NEXT:    pmullw %xmm1, %xmm01566; X86-SSE2-NEXT:    por %xmm2, %xmm01567; X86-SSE2-NEXT:    retl1568  %res = call <8 x i16> @llvm.fshr.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>)1569  ret <8 x i16> %res1570}1571 1572define <16 x i8> @constant_funnnel_v16i8(<16 x i8> %x) nounwind {1573; SSE-LABEL: constant_funnnel_v16i8:1574; SSE:       # %bb.0:1575; SSE-NEXT:    movdqa %xmm0, %xmm11576; 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]1577; SSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [1,2,4,8,16,32,64,128]1578; SSE-NEXT:    psrlw $8, %xmm11579; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1580; SSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,128,64,32,16,8,4,2]1581; SSE-NEXT:    psrlw $8, %xmm01582; SSE-NEXT:    packuswb %xmm1, %xmm01583; SSE-NEXT:    retq1584;1585; AVX-LABEL: constant_funnnel_v16i8:1586; AVX:       # %bb.0:1587; AVX-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1588; AVX-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,2,4,8,16,32,64,128]1589; AVX-NEXT:    vpsrlw $8, %xmm1, %xmm11590; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1591; AVX-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,128,64,32,16,8,4,2]1592; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm01593; AVX-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01594; AVX-NEXT:    retq1595;1596; AVX512F-LABEL: constant_funnnel_v16i8:1597; AVX512F:       # %bb.0:1598; AVX512F-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1599; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,2,4,8,16,32,64,128]1600; AVX512F-NEXT:    vpsrlw $8, %xmm1, %xmm11601; AVX512F-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1602; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,128,64,32,16,8,4,2]1603; AVX512F-NEXT:    vpsrlw $8, %xmm0, %xmm01604; AVX512F-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01605; AVX512F-NEXT:    retq1606;1607; AVX512VL-LABEL: constant_funnnel_v16i8:1608; AVX512VL:       # %bb.0:1609; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1610; AVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,2,4,8,16,32,64,128]1611; AVX512VL-NEXT:    vpsrlw $8, %xmm1, %xmm11612; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1613; AVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,128,64,32,16,8,4,2]1614; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm01615; AVX512VL-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01616; AVX512VL-NEXT:    retq1617;1618; AVX512BW-LABEL: constant_funnnel_v16i8:1619; AVX512BW:       # %bb.0:1620; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]1621; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1622; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm2, %zmm11623; AVX512BW-NEXT:    vpsrlw $8, %xmm1, %xmm11624; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} xmm2 = [0,7,6,5,4,3,2,1]1625; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1626; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm01627; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm01628; AVX512BW-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01629; AVX512BW-NEXT:    vzeroupper1630; AVX512BW-NEXT:    retq1631;1632; AVX512VLBW-LABEL: constant_funnnel_v16i8:1633; AVX512VLBW:       # %bb.0:1634; AVX512VLBW-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1635; AVX512VLBW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11636; AVX512VLBW-NEXT:    vpsrlw $8, %xmm1, %xmm11637; AVX512VLBW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1638; AVX512VLBW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01639; AVX512VLBW-NEXT:    vpsrlw $8, %xmm0, %xmm01640; AVX512VLBW-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01641; AVX512VLBW-NEXT:    retq1642;1643; AVX512VBMI2-LABEL: constant_funnnel_v16i8:1644; AVX512VBMI2:       # %bb.0:1645; AVX512VBMI2-NEXT:    vpmovsxbw {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]1646; AVX512VBMI2-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1647; AVX512VBMI2-NEXT:    vpsllvw %zmm1, %zmm2, %zmm11648; AVX512VBMI2-NEXT:    vpsrlw $8, %xmm1, %xmm11649; AVX512VBMI2-NEXT:    vpmovsxbw {{.*#+}} xmm2 = [0,7,6,5,4,3,2,1]1650; AVX512VBMI2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1651; AVX512VBMI2-NEXT:    vpsllvw %zmm2, %zmm0, %zmm01652; AVX512VBMI2-NEXT:    vpsrlw $8, %xmm0, %xmm01653; AVX512VBMI2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01654; AVX512VBMI2-NEXT:    vzeroupper1655; AVX512VBMI2-NEXT:    retq1656;1657; AVX512VLVBMI2-LABEL: constant_funnnel_v16i8:1658; AVX512VLVBMI2:       # %bb.0:1659; AVX512VLVBMI2-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1660; AVX512VLVBMI2-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11661; AVX512VLVBMI2-NEXT:    vpsrlw $8, %xmm1, %xmm11662; AVX512VLVBMI2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1663; AVX512VLVBMI2-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01664; AVX512VLVBMI2-NEXT:    vpsrlw $8, %xmm0, %xmm01665; AVX512VLVBMI2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01666; AVX512VLVBMI2-NEXT:    retq1667;1668; XOP-LABEL: constant_funnnel_v16i8:1669; XOP:       # %bb.0:1670; XOP-NEXT:    vprotb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01671; XOP-NEXT:    retq1672;1673; X86-SSE2-LABEL: constant_funnnel_v16i8:1674; X86-SSE2:       # %bb.0:1675; X86-SSE2-NEXT:    movdqa %xmm0, %xmm11676; 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]1677; X86-SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [1,2,4,8,16,32,64,128]1678; X86-SSE2-NEXT:    psrlw $8, %xmm11679; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1680; X86-SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [1,128,64,32,16,8,4,2]1681; X86-SSE2-NEXT:    psrlw $8, %xmm01682; X86-SSE2-NEXT:    packuswb %xmm1, %xmm01683; X86-SSE2-NEXT:    retl1684  %res = call <16 x i8> @llvm.fshr.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>)1685  ret <16 x i8> %res1686}1687 1688;1689; Uniform Constant Shifts1690;1691 1692define <2 x i64> @splatconstant_funnnel_v2i64(<2 x i64> %x) nounwind {1693; SSE-LABEL: splatconstant_funnnel_v2i64:1694; SSE:       # %bb.0:1695; SSE-NEXT:    movdqa %xmm0, %xmm11696; SSE-NEXT:    psllq $50, %xmm11697; SSE-NEXT:    psrlq $14, %xmm01698; SSE-NEXT:    por %xmm1, %xmm01699; SSE-NEXT:    retq1700;1701; AVX-LABEL: splatconstant_funnnel_v2i64:1702; AVX:       # %bb.0:1703; AVX-NEXT:    vpsllq $50, %xmm0, %xmm11704; AVX-NEXT:    vpsrlq $14, %xmm0, %xmm01705; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm01706; AVX-NEXT:    retq1707;1708; AVX512F-LABEL: splatconstant_funnnel_v2i64:1709; AVX512F:       # %bb.0:1710; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01711; AVX512F-NEXT:    vprorq $14, %zmm0, %zmm01712; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01713; AVX512F-NEXT:    vzeroupper1714; AVX512F-NEXT:    retq1715;1716; AVX512VL-LABEL: splatconstant_funnnel_v2i64:1717; AVX512VL:       # %bb.0:1718; AVX512VL-NEXT:    vprorq $14, %xmm0, %xmm01719; AVX512VL-NEXT:    retq1720;1721; AVX512BW-LABEL: splatconstant_funnnel_v2i64:1722; AVX512BW:       # %bb.0:1723; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01724; AVX512BW-NEXT:    vprorq $14, %zmm0, %zmm01725; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01726; AVX512BW-NEXT:    vzeroupper1727; AVX512BW-NEXT:    retq1728;1729; AVX512VLBW-LABEL: splatconstant_funnnel_v2i64:1730; AVX512VLBW:       # %bb.0:1731; AVX512VLBW-NEXT:    vprorq $14, %xmm0, %xmm01732; AVX512VLBW-NEXT:    retq1733;1734; AVX512VBMI2-LABEL: splatconstant_funnnel_v2i64:1735; AVX512VBMI2:       # %bb.0:1736; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01737; AVX512VBMI2-NEXT:    vprorq $14, %zmm0, %zmm01738; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01739; AVX512VBMI2-NEXT:    vzeroupper1740; AVX512VBMI2-NEXT:    retq1741;1742; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v2i64:1743; AVX512VLVBMI2:       # %bb.0:1744; AVX512VLVBMI2-NEXT:    vprorq $14, %xmm0, %xmm01745; AVX512VLVBMI2-NEXT:    retq1746;1747; XOP-LABEL: splatconstant_funnnel_v2i64:1748; XOP:       # %bb.0:1749; XOP-NEXT:    vprotq $50, %xmm0, %xmm01750; XOP-NEXT:    retq1751;1752; X86-SSE2-LABEL: splatconstant_funnnel_v2i64:1753; X86-SSE2:       # %bb.0:1754; X86-SSE2-NEXT:    movdqa %xmm0, %xmm11755; X86-SSE2-NEXT:    psllq $50, %xmm11756; X86-SSE2-NEXT:    psrlq $14, %xmm01757; X86-SSE2-NEXT:    por %xmm1, %xmm01758; X86-SSE2-NEXT:    retl1759  %res = call <2 x i64> @llvm.fshr.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> <i64 14, i64 14>)1760  ret <2 x i64> %res1761}1762 1763define <4 x i32> @splatconstant_funnnel_v4i32(<4 x i32> %x) nounwind {1764; SSE-LABEL: splatconstant_funnnel_v4i32:1765; SSE:       # %bb.0:1766; SSE-NEXT:    movdqa %xmm0, %xmm11767; SSE-NEXT:    psrld $4, %xmm11768; SSE-NEXT:    pslld $28, %xmm01769; SSE-NEXT:    por %xmm1, %xmm01770; SSE-NEXT:    retq1771;1772; AVX-LABEL: splatconstant_funnnel_v4i32:1773; AVX:       # %bb.0:1774; AVX-NEXT:    vpsrld $4, %xmm0, %xmm11775; AVX-NEXT:    vpslld $28, %xmm0, %xmm01776; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm01777; AVX-NEXT:    retq1778;1779; AVX512F-LABEL: splatconstant_funnnel_v4i32:1780; AVX512F:       # %bb.0:1781; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01782; AVX512F-NEXT:    vprord $4, %zmm0, %zmm01783; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01784; AVX512F-NEXT:    vzeroupper1785; AVX512F-NEXT:    retq1786;1787; AVX512VL-LABEL: splatconstant_funnnel_v4i32:1788; AVX512VL:       # %bb.0:1789; AVX512VL-NEXT:    vprord $4, %xmm0, %xmm01790; AVX512VL-NEXT:    retq1791;1792; AVX512BW-LABEL: splatconstant_funnnel_v4i32:1793; AVX512BW:       # %bb.0:1794; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01795; AVX512BW-NEXT:    vprord $4, %zmm0, %zmm01796; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01797; AVX512BW-NEXT:    vzeroupper1798; AVX512BW-NEXT:    retq1799;1800; AVX512VLBW-LABEL: splatconstant_funnnel_v4i32:1801; AVX512VLBW:       # %bb.0:1802; AVX512VLBW-NEXT:    vprord $4, %xmm0, %xmm01803; AVX512VLBW-NEXT:    retq1804;1805; AVX512VBMI2-LABEL: splatconstant_funnnel_v4i32:1806; AVX512VBMI2:       # %bb.0:1807; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01808; AVX512VBMI2-NEXT:    vprord $4, %zmm0, %zmm01809; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01810; AVX512VBMI2-NEXT:    vzeroupper1811; AVX512VBMI2-NEXT:    retq1812;1813; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v4i32:1814; AVX512VLVBMI2:       # %bb.0:1815; AVX512VLVBMI2-NEXT:    vprord $4, %xmm0, %xmm01816; AVX512VLVBMI2-NEXT:    retq1817;1818; XOP-LABEL: splatconstant_funnnel_v4i32:1819; XOP:       # %bb.0:1820; XOP-NEXT:    vprotd $28, %xmm0, %xmm01821; XOP-NEXT:    retq1822;1823; X86-SSE2-LABEL: splatconstant_funnnel_v4i32:1824; X86-SSE2:       # %bb.0:1825; X86-SSE2-NEXT:    movdqa %xmm0, %xmm11826; X86-SSE2-NEXT:    psrld $4, %xmm11827; X86-SSE2-NEXT:    pslld $28, %xmm01828; X86-SSE2-NEXT:    por %xmm1, %xmm01829; X86-SSE2-NEXT:    retl1830  %res = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> <i32 4, i32 4, i32 4, i32 4>)1831  ret <4 x i32> %res1832}1833 1834define <8 x i16> @splatconstant_funnnel_v8i16(<8 x i16> %x) nounwind {1835; SSE-LABEL: splatconstant_funnnel_v8i16:1836; SSE:       # %bb.0:1837; SSE-NEXT:    movdqa %xmm0, %xmm11838; SSE-NEXT:    psrlw $7, %xmm11839; SSE-NEXT:    psllw $9, %xmm01840; SSE-NEXT:    por %xmm1, %xmm01841; SSE-NEXT:    retq1842;1843; AVX-LABEL: splatconstant_funnnel_v8i16:1844; AVX:       # %bb.0:1845; AVX-NEXT:    vpsrlw $7, %xmm0, %xmm11846; AVX-NEXT:    vpsllw $9, %xmm0, %xmm01847; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm01848; AVX-NEXT:    retq1849;1850; AVX512F-LABEL: splatconstant_funnnel_v8i16:1851; AVX512F:       # %bb.0:1852; AVX512F-NEXT:    vpsrlw $7, %xmm0, %xmm11853; AVX512F-NEXT:    vpsllw $9, %xmm0, %xmm01854; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm01855; AVX512F-NEXT:    retq1856;1857; AVX512VL-LABEL: splatconstant_funnnel_v8i16:1858; AVX512VL:       # %bb.0:1859; AVX512VL-NEXT:    vpsrlw $7, %xmm0, %xmm11860; AVX512VL-NEXT:    vpsllw $9, %xmm0, %xmm01861; AVX512VL-NEXT:    vpor %xmm1, %xmm0, %xmm01862; AVX512VL-NEXT:    retq1863;1864; AVX512BW-LABEL: splatconstant_funnnel_v8i16:1865; AVX512BW:       # %bb.0:1866; AVX512BW-NEXT:    vpsrlw $7, %xmm0, %xmm11867; AVX512BW-NEXT:    vpsllw $9, %xmm0, %xmm01868; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm01869; AVX512BW-NEXT:    retq1870;1871; AVX512VLBW-LABEL: splatconstant_funnnel_v8i16:1872; AVX512VLBW:       # %bb.0:1873; AVX512VLBW-NEXT:    vpsrlw $7, %xmm0, %xmm11874; AVX512VLBW-NEXT:    vpsllw $9, %xmm0, %xmm01875; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm01876; AVX512VLBW-NEXT:    retq1877;1878; AVX512VBMI2-LABEL: splatconstant_funnnel_v8i16:1879; AVX512VBMI2:       # %bb.0:1880; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01881; AVX512VBMI2-NEXT:    vpshrdw $7, %zmm0, %zmm0, %zmm01882; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01883; AVX512VBMI2-NEXT:    vzeroupper1884; AVX512VBMI2-NEXT:    retq1885;1886; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v8i16:1887; AVX512VLVBMI2:       # %bb.0:1888; AVX512VLVBMI2-NEXT:    vpshrdw $7, %xmm0, %xmm0, %xmm01889; AVX512VLVBMI2-NEXT:    retq1890;1891; XOP-LABEL: splatconstant_funnnel_v8i16:1892; XOP:       # %bb.0:1893; XOP-NEXT:    vprotw $9, %xmm0, %xmm01894; XOP-NEXT:    retq1895;1896; X86-SSE2-LABEL: splatconstant_funnnel_v8i16:1897; X86-SSE2:       # %bb.0:1898; X86-SSE2-NEXT:    movdqa %xmm0, %xmm11899; X86-SSE2-NEXT:    psrlw $7, %xmm11900; X86-SSE2-NEXT:    psllw $9, %xmm01901; X86-SSE2-NEXT:    por %xmm1, %xmm01902; X86-SSE2-NEXT:    retl1903  %res = call <8 x i16> @llvm.fshr.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>)1904  ret <8 x i16> %res1905}1906 1907define <16 x i8> @splatconstant_funnnel_v16i8(<16 x i8> %x) nounwind {1908; SSE-LABEL: splatconstant_funnnel_v16i8:1909; SSE:       # %bb.0:1910; SSE-NEXT:    movdqa %xmm0, %xmm11911; SSE-NEXT:    psrlw $4, %xmm11912; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11913; SSE-NEXT:    psllw $4, %xmm01914; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01915; SSE-NEXT:    por %xmm1, %xmm01916; SSE-NEXT:    retq1917;1918; AVX-LABEL: splatconstant_funnnel_v16i8:1919; AVX:       # %bb.0:1920; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm11921; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11922; AVX-NEXT:    vpsllw $4, %xmm0, %xmm01923; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01924; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm01925; AVX-NEXT:    retq1926;1927; AVX512F-LABEL: splatconstant_funnnel_v16i8:1928; AVX512F:       # %bb.0:1929; AVX512F-NEXT:    vpsllw $4, %xmm0, %xmm11930; AVX512F-NEXT:    vpsrlw $4, %xmm0, %xmm01931; AVX512F-NEXT:    vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))1932; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01933; AVX512F-NEXT:    vzeroupper1934; AVX512F-NEXT:    retq1935;1936; AVX512VL-LABEL: splatconstant_funnnel_v16i8:1937; AVX512VL:       # %bb.0:1938; AVX512VL-NEXT:    vpsllw $4, %xmm0, %xmm11939; AVX512VL-NEXT:    vpsrlw $4, %xmm0, %xmm01940; AVX512VL-NEXT:    vpternlogd {{.*#+}} xmm0 = xmm0 ^ (m32bcst & (xmm0 ^ xmm1))1941; AVX512VL-NEXT:    retq1942;1943; AVX512BW-LABEL: splatconstant_funnnel_v16i8:1944; AVX512BW:       # %bb.0:1945; AVX512BW-NEXT:    vpsllw $4, %xmm0, %xmm11946; AVX512BW-NEXT:    vpsrlw $4, %xmm0, %xmm01947; AVX512BW-NEXT:    vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))1948; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01949; AVX512BW-NEXT:    vzeroupper1950; AVX512BW-NEXT:    retq1951;1952; AVX512VLBW-LABEL: splatconstant_funnnel_v16i8:1953; AVX512VLBW:       # %bb.0:1954; AVX512VLBW-NEXT:    vpsllw $4, %xmm0, %xmm11955; AVX512VLBW-NEXT:    vpsrlw $4, %xmm0, %xmm01956; AVX512VLBW-NEXT:    vpternlogd {{.*#+}} xmm0 = xmm0 ^ (m32bcst & (xmm0 ^ xmm1))1957; AVX512VLBW-NEXT:    retq1958;1959; AVX512VBMI2-LABEL: splatconstant_funnnel_v16i8:1960; AVX512VBMI2:       # %bb.0:1961; AVX512VBMI2-NEXT:    vpsllw $4, %xmm0, %xmm11962; AVX512VBMI2-NEXT:    vpsrlw $4, %xmm0, %xmm01963; AVX512VBMI2-NEXT:    vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))1964; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01965; AVX512VBMI2-NEXT:    vzeroupper1966; AVX512VBMI2-NEXT:    retq1967;1968; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v16i8:1969; AVX512VLVBMI2:       # %bb.0:1970; AVX512VLVBMI2-NEXT:    vpsllw $4, %xmm0, %xmm11971; AVX512VLVBMI2-NEXT:    vpsrlw $4, %xmm0, %xmm01972; AVX512VLVBMI2-NEXT:    vpternlogd {{.*#+}} xmm0 = xmm0 ^ (m32bcst & (xmm0 ^ xmm1))1973; AVX512VLVBMI2-NEXT:    retq1974;1975; XOP-LABEL: splatconstant_funnnel_v16i8:1976; XOP:       # %bb.0:1977; XOP-NEXT:    vprotb $4, %xmm0, %xmm01978; XOP-NEXT:    retq1979;1980; X86-SSE2-LABEL: splatconstant_funnnel_v16i8:1981; X86-SSE2:       # %bb.0:1982; X86-SSE2-NEXT:    movdqa %xmm0, %xmm11983; X86-SSE2-NEXT:    psrlw $4, %xmm11984; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11985; X86-SSE2-NEXT:    psllw $4, %xmm01986; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01987; X86-SSE2-NEXT:    por %xmm1, %xmm01988; X86-SSE2-NEXT:    retl1989  %res = call <16 x i8> @llvm.fshr.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>)1990  ret <16 x i8> %res1991}1992