2471 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-prefixes=AVX512F7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512VL8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512BW9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2 | FileCheck %s --check-prefixes=AVX512VBMI210; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512VLBW11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2,+avx512vl | FileCheck %s --check-prefixes=AVX512VLVBMI212; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx10.1 | FileCheck %s --check-prefixes=AVX512VLVBMI213; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX114; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX215 16; Just one 32-bit run to make sure we do reasonable things for i64 cases.17; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X86-SSE218 19declare <2 x i64> @llvm.fshl.v2i64(<2 x i64>, <2 x i64>, <2 x i64>)20declare <4 x i32> @llvm.fshl.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)21declare <8 x i16> @llvm.fshl.v8i16(<8 x i16>, <8 x i16>, <8 x i16>)22declare <16 x i8> @llvm.fshl.v16i8(<16 x i8>, <16 x i8>, <16 x i8>)23 24;25; Variable Shifts26;27 28define <2 x i64> @var_funnnel_v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %amt) nounwind {29; SSE2-LABEL: var_funnnel_v2i64:30; SSE2: # %bb.0:31; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [63,63]32; SSE2-NEXT: movdqa %xmm2, %xmm433; SSE2-NEXT: pandn %xmm3, %xmm434; SSE2-NEXT: psrlq $1, %xmm135; SSE2-NEXT: movdqa %xmm1, %xmm536; SSE2-NEXT: psrlq %xmm4, %xmm537; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]38; SSE2-NEXT: psrlq %xmm4, %xmm139; SSE2-NEXT: shufpd {{.*#+}} xmm5 = xmm5[0],xmm1[1]40; SSE2-NEXT: pand %xmm3, %xmm241; SSE2-NEXT: movdqa %xmm0, %xmm142; SSE2-NEXT: psllq %xmm2, %xmm143; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[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 {{.*#+}} xmm3 = [63,63]52; SSE41-NEXT: movdqa %xmm2, %xmm453; SSE41-NEXT: pandn %xmm3, %xmm454; SSE41-NEXT: psrlq $1, %xmm155; SSE41-NEXT: movdqa %xmm1, %xmm556; SSE41-NEXT: psrlq %xmm4, %xmm557; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]58; SSE41-NEXT: psrlq %xmm4, %xmm159; SSE41-NEXT: pblendw {{.*#+}} xmm5 = xmm5[0,1,2,3],xmm1[4,5,6,7]60; SSE41-NEXT: pand %xmm3, %xmm261; SSE41-NEXT: movdqa %xmm0, %xmm162; SSE41-NEXT: psllq %xmm2, %xmm163; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]64; SSE41-NEXT: psllq %xmm2, %xmm065; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]66; SSE41-NEXT: por %xmm5, %xmm067; SSE41-NEXT: retq68;69; AVX1-LABEL: var_funnnel_v2i64:70; AVX1: # %bb.0:71; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm3 = [63,63]72; AVX1-NEXT: vpandn %xmm3, %xmm2, %xmm473; AVX1-NEXT: vpsrlq $1, %xmm1, %xmm174; AVX1-NEXT: vpsrlq %xmm4, %xmm1, %xmm575; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]76; AVX1-NEXT: vpsrlq %xmm4, %xmm1, %xmm177; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm5[0,1,2,3],xmm1[4,5,6,7]78; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm279; AVX1-NEXT: vpsllq %xmm2, %xmm0, %xmm380; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]81; AVX1-NEXT: vpsllq %xmm2, %xmm0, %xmm082; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]83; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm084; AVX1-NEXT: retq85;86; AVX2-LABEL: var_funnnel_v2i64:87; AVX2: # %bb.0:88; AVX2-NEXT: vpmovsxbq {{.*#+}} xmm3 = [63,63]89; AVX2-NEXT: vpandn %xmm3, %xmm2, %xmm490; AVX2-NEXT: vpsrlq $1, %xmm1, %xmm191; AVX2-NEXT: vpsrlvq %xmm4, %xmm1, %xmm192; AVX2-NEXT: vpand %xmm3, %xmm2, %xmm293; AVX2-NEXT: vpsllvq %xmm2, %xmm0, %xmm094; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm095; AVX2-NEXT: retq96;97; AVX512F-LABEL: var_funnnel_v2i64:98; AVX512F: # %bb.0:99; AVX512F-NEXT: vpmovsxbq {{.*#+}} xmm3 = [63,63]100; AVX512F-NEXT: vpandn %xmm3, %xmm2, %xmm4101; AVX512F-NEXT: vpsrlq $1, %xmm1, %xmm1102; AVX512F-NEXT: vpsrlvq %xmm4, %xmm1, %xmm1103; AVX512F-NEXT: vpand %xmm3, %xmm2, %xmm2104; AVX512F-NEXT: vpsllvq %xmm2, %xmm0, %xmm0105; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm0106; AVX512F-NEXT: retq107;108; AVX512VL-LABEL: var_funnnel_v2i64:109; AVX512VL: # %bb.0:110; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm3 = [63,63]111; AVX512VL-NEXT: vpandn %xmm3, %xmm2, %xmm4112; AVX512VL-NEXT: vpsrlq $1, %xmm1, %xmm1113; AVX512VL-NEXT: vpsrlvq %xmm4, %xmm1, %xmm1114; AVX512VL-NEXT: vpand %xmm3, %xmm2, %xmm2115; AVX512VL-NEXT: vpsllvq %xmm2, %xmm0, %xmm0116; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm0117; AVX512VL-NEXT: retq118;119; AVX512BW-LABEL: var_funnnel_v2i64:120; AVX512BW: # %bb.0:121; AVX512BW-NEXT: vpmovsxbq {{.*#+}} xmm3 = [63,63]122; AVX512BW-NEXT: vpandn %xmm3, %xmm2, %xmm4123; AVX512BW-NEXT: vpsrlq $1, %xmm1, %xmm1124; AVX512BW-NEXT: vpsrlvq %xmm4, %xmm1, %xmm1125; AVX512BW-NEXT: vpand %xmm3, %xmm2, %xmm2126; AVX512BW-NEXT: vpsllvq %xmm2, %xmm0, %xmm0127; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm0128; AVX512BW-NEXT: retq129;130; AVX512VBMI2-LABEL: var_funnnel_v2i64:131; AVX512VBMI2: # %bb.0:132; AVX512VBMI2-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2133; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1134; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0135; AVX512VBMI2-NEXT: vpshldvq %zmm2, %zmm1, %zmm0136; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0137; AVX512VBMI2-NEXT: vzeroupper138; AVX512VBMI2-NEXT: retq139;140; AVX512VLBW-LABEL: var_funnnel_v2i64:141; AVX512VLBW: # %bb.0:142; AVX512VLBW-NEXT: vpbroadcastq {{.*#+}} xmm3 = [63,63]143; AVX512VLBW-NEXT: vpandn %xmm3, %xmm2, %xmm4144; AVX512VLBW-NEXT: vpsrlq $1, %xmm1, %xmm1145; AVX512VLBW-NEXT: vpsrlvq %xmm4, %xmm1, %xmm1146; AVX512VLBW-NEXT: vpand %xmm3, %xmm2, %xmm2147; AVX512VLBW-NEXT: vpsllvq %xmm2, %xmm0, %xmm0148; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm0149; AVX512VLBW-NEXT: retq150;151; AVX512VLVBMI2-LABEL: var_funnnel_v2i64:152; AVX512VLVBMI2: # %bb.0:153; AVX512VLVBMI2-NEXT: vpshldvq %xmm2, %xmm1, %xmm0154; AVX512VLVBMI2-NEXT: retq155;156; XOPAVX1-LABEL: var_funnnel_v2i64:157; XOPAVX1: # %bb.0:158; XOPAVX1-NEXT: vpmovsxbq {{.*#+}} xmm3 = [63,63]159; XOPAVX1-NEXT: vpand %xmm3, %xmm2, %xmm4160; XOPAVX1-NEXT: vpshlq %xmm4, %xmm0, %xmm0161; XOPAVX1-NEXT: vpandn %xmm3, %xmm2, %xmm2162; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3163; XOPAVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm2164; XOPAVX1-NEXT: vpsrlq $1, %xmm1, %xmm1165; XOPAVX1-NEXT: vpshlq %xmm2, %xmm1, %xmm1166; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0167; XOPAVX1-NEXT: retq168;169; XOPAVX2-LABEL: var_funnnel_v2i64:170; XOPAVX2: # %bb.0:171; XOPAVX2-NEXT: vpmovsxbq {{.*#+}} xmm3 = [63,63]172; XOPAVX2-NEXT: vpandn %xmm3, %xmm2, %xmm4173; XOPAVX2-NEXT: vpsrlq $1, %xmm1, %xmm1174; XOPAVX2-NEXT: vpsrlvq %xmm4, %xmm1, %xmm1175; XOPAVX2-NEXT: vpand %xmm3, %xmm2, %xmm2176; XOPAVX2-NEXT: vpsllvq %xmm2, %xmm0, %xmm0177; XOPAVX2-NEXT: vpor %xmm1, %xmm0, %xmm0178; XOPAVX2-NEXT: retq179;180; X86-SSE2-LABEL: var_funnnel_v2i64:181; X86-SSE2: # %bb.0:182; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [63,0,63,0]183; X86-SSE2-NEXT: movdqa %xmm2, %xmm5184; X86-SSE2-NEXT: pandn %xmm4, %xmm5185; X86-SSE2-NEXT: psrlq $1, %xmm1186; X86-SSE2-NEXT: movdqa %xmm1, %xmm3187; X86-SSE2-NEXT: psrlq %xmm5, %xmm3188; X86-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]189; X86-SSE2-NEXT: psrlq %xmm5, %xmm1190; X86-SSE2-NEXT: shufpd {{.*#+}} xmm3 = xmm3[0],xmm1[1]191; X86-SSE2-NEXT: pand %xmm4, %xmm2192; X86-SSE2-NEXT: movdqa %xmm0, %xmm1193; X86-SSE2-NEXT: psllq %xmm2, %xmm1194; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]195; X86-SSE2-NEXT: psllq %xmm2, %xmm0196; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]197; X86-SSE2-NEXT: orpd %xmm3, %xmm0198; X86-SSE2-NEXT: retl199 %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %amt)200 ret <2 x i64> %res201}202 203define <4 x i32> @var_funnnel_v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> %amt) nounwind {204; SSE2-LABEL: var_funnnel_v4i32:205; SSE2: # %bb.0:206; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [31,31,31,31]207; SSE2-NEXT: movdqa %xmm2, %xmm5208; SSE2-NEXT: pandn %xmm4, %xmm5209; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[2,3,3,3,4,5,6,7]210; SSE2-NEXT: psrld $1, %xmm1211; SSE2-NEXT: movdqa %xmm1, %xmm6212; SSE2-NEXT: psrld %xmm3, %xmm6213; SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm5[0,1,1,1,4,5,6,7]214; SSE2-NEXT: movdqa %xmm1, %xmm3215; SSE2-NEXT: psrld %xmm7, %xmm3216; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm6[0]217; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]218; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]219; SSE2-NEXT: movdqa %xmm1, %xmm7220; SSE2-NEXT: psrld %xmm6, %xmm7221; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]222; SSE2-NEXT: psrld %xmm5, %xmm1223; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm7[1]224; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,3],xmm1[0,3]225; SSE2-NEXT: pand %xmm4, %xmm2226; SSE2-NEXT: pslld $23, %xmm2227; SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2228; SSE2-NEXT: cvttps2dq %xmm2, %xmm1229; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]230; SSE2-NEXT: pmuludq %xmm1, %xmm0231; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]232; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]233; SSE2-NEXT: pmuludq %xmm2, %xmm1234; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]235; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]236; SSE2-NEXT: por %xmm3, %xmm0237; SSE2-NEXT: retq238;239; SSE41-LABEL: var_funnnel_v4i32:240; SSE41: # %bb.0:241; SSE41-NEXT: pmovsxbd {{.*#+}} xmm3 = [31,31,31,31]242; SSE41-NEXT: movdqa %xmm2, %xmm4243; SSE41-NEXT: pandn %xmm3, %xmm4244; SSE41-NEXT: pshuflw {{.*#+}} xmm5 = xmm4[2,3,3,3,4,5,6,7]245; SSE41-NEXT: psrld $1, %xmm1246; SSE41-NEXT: movdqa %xmm1, %xmm6247; SSE41-NEXT: psrld %xmm5, %xmm6248; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[2,3,2,3]249; SSE41-NEXT: pshuflw {{.*#+}} xmm7 = xmm5[2,3,3,3,4,5,6,7]250; SSE41-NEXT: movdqa %xmm1, %xmm8251; SSE41-NEXT: psrld %xmm7, %xmm8252; SSE41-NEXT: pblendw {{.*#+}} xmm8 = xmm6[0,1,2,3],xmm8[4,5,6,7]253; SSE41-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,1,1,1,4,5,6,7]254; SSE41-NEXT: movdqa %xmm1, %xmm6255; SSE41-NEXT: psrld %xmm4, %xmm6256; SSE41-NEXT: pshuflw {{.*#+}} xmm4 = xmm5[0,1,1,1,4,5,6,7]257; SSE41-NEXT: psrld %xmm4, %xmm1258; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm1[4,5,6,7]259; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1],xmm8[2,3],xmm6[4,5],xmm8[6,7]260; SSE41-NEXT: pand %xmm3, %xmm2261; SSE41-NEXT: pslld $23, %xmm2262; SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2263; SSE41-NEXT: cvttps2dq %xmm2, %xmm1264; SSE41-NEXT: pmulld %xmm1, %xmm0265; SSE41-NEXT: por %xmm6, %xmm0266; SSE41-NEXT: retq267;268; AVX1-LABEL: var_funnnel_v4i32:269; AVX1: # %bb.0:270; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]271; AVX1-NEXT: vpandn %xmm3, %xmm2, %xmm4272; AVX1-NEXT: vpsrldq {{.*#+}} xmm5 = xmm4[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero273; AVX1-NEXT: vpsrld $1, %xmm1, %xmm1274; AVX1-NEXT: vpsrld %xmm5, %xmm1, %xmm5275; AVX1-NEXT: vpsrlq $32, %xmm4, %xmm6276; AVX1-NEXT: vpsrld %xmm6, %xmm1, %xmm6277; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1,2,3],xmm5[4,5,6,7]278; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm6279; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm4[2],xmm6[2],xmm4[3],xmm6[3]280; AVX1-NEXT: vpsrld %xmm6, %xmm1, %xmm6281; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero282; AVX1-NEXT: vpsrld %xmm4, %xmm1, %xmm1283; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm6[4,5,6,7]284; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,3],xmm1[4,5],xmm5[6,7]285; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2286; AVX1-NEXT: vpslld $23, %xmm2, %xmm2287; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2288; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2289; AVX1-NEXT: vpmulld %xmm2, %xmm0, %xmm0290; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0291; AVX1-NEXT: retq292;293; AVX2-LABEL: var_funnnel_v4i32:294; AVX2: # %bb.0:295; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]296; AVX2-NEXT: vpandn %xmm3, %xmm2, %xmm4297; AVX2-NEXT: vpsrld $1, %xmm1, %xmm1298; AVX2-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1299; AVX2-NEXT: vpand %xmm3, %xmm2, %xmm2300; AVX2-NEXT: vpsllvd %xmm2, %xmm0, %xmm0301; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0302; AVX2-NEXT: retq303;304; AVX512F-LABEL: var_funnnel_v4i32:305; AVX512F: # %bb.0:306; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]307; AVX512F-NEXT: vpandn %xmm3, %xmm2, %xmm4308; AVX512F-NEXT: vpsrld $1, %xmm1, %xmm1309; AVX512F-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1310; AVX512F-NEXT: vpand %xmm3, %xmm2, %xmm2311; AVX512F-NEXT: vpsllvd %xmm2, %xmm0, %xmm0312; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm0313; AVX512F-NEXT: retq314;315; AVX512VL-LABEL: var_funnnel_v4i32:316; AVX512VL: # %bb.0:317; AVX512VL-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]318; AVX512VL-NEXT: vpandn %xmm3, %xmm2, %xmm4319; AVX512VL-NEXT: vpsrld $1, %xmm1, %xmm1320; AVX512VL-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1321; AVX512VL-NEXT: vpand %xmm3, %xmm2, %xmm2322; AVX512VL-NEXT: vpsllvd %xmm2, %xmm0, %xmm0323; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm0324; AVX512VL-NEXT: retq325;326; AVX512BW-LABEL: var_funnnel_v4i32:327; AVX512BW: # %bb.0:328; AVX512BW-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]329; AVX512BW-NEXT: vpandn %xmm3, %xmm2, %xmm4330; AVX512BW-NEXT: vpsrld $1, %xmm1, %xmm1331; AVX512BW-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1332; AVX512BW-NEXT: vpand %xmm3, %xmm2, %xmm2333; AVX512BW-NEXT: vpsllvd %xmm2, %xmm0, %xmm0334; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm0335; AVX512BW-NEXT: retq336;337; AVX512VBMI2-LABEL: var_funnnel_v4i32:338; AVX512VBMI2: # %bb.0:339; AVX512VBMI2-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2340; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1341; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0342; AVX512VBMI2-NEXT: vpshldvd %zmm2, %zmm1, %zmm0343; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0344; AVX512VBMI2-NEXT: vzeroupper345; AVX512VBMI2-NEXT: retq346;347; AVX512VLBW-LABEL: var_funnnel_v4i32:348; AVX512VLBW: # %bb.0:349; AVX512VLBW-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]350; AVX512VLBW-NEXT: vpandn %xmm3, %xmm2, %xmm4351; AVX512VLBW-NEXT: vpsrld $1, %xmm1, %xmm1352; AVX512VLBW-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1353; AVX512VLBW-NEXT: vpand %xmm3, %xmm2, %xmm2354; AVX512VLBW-NEXT: vpsllvd %xmm2, %xmm0, %xmm0355; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm0356; AVX512VLBW-NEXT: retq357;358; AVX512VLVBMI2-LABEL: var_funnnel_v4i32:359; AVX512VLVBMI2: # %bb.0:360; AVX512VLVBMI2-NEXT: vpshldvd %xmm2, %xmm1, %xmm0361; AVX512VLVBMI2-NEXT: retq362;363; XOPAVX1-LABEL: var_funnnel_v4i32:364; XOPAVX1: # %bb.0:365; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]366; XOPAVX1-NEXT: vpand %xmm3, %xmm2, %xmm4367; XOPAVX1-NEXT: vpshld %xmm4, %xmm0, %xmm0368; XOPAVX1-NEXT: vpandn %xmm3, %xmm2, %xmm2369; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3370; XOPAVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2371; XOPAVX1-NEXT: vpsrld $1, %xmm1, %xmm1372; XOPAVX1-NEXT: vpshld %xmm2, %xmm1, %xmm1373; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0374; XOPAVX1-NEXT: retq375;376; XOPAVX2-LABEL: var_funnnel_v4i32:377; XOPAVX2: # %bb.0:378; XOPAVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]379; XOPAVX2-NEXT: vpandn %xmm3, %xmm2, %xmm4380; XOPAVX2-NEXT: vpsrld $1, %xmm1, %xmm1381; XOPAVX2-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1382; XOPAVX2-NEXT: vpand %xmm3, %xmm2, %xmm2383; XOPAVX2-NEXT: vpsllvd %xmm2, %xmm0, %xmm0384; XOPAVX2-NEXT: vpor %xmm1, %xmm0, %xmm0385; XOPAVX2-NEXT: retq386;387; X86-SSE2-LABEL: var_funnnel_v4i32:388; X86-SSE2: # %bb.0:389; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [31,31,31,31]390; X86-SSE2-NEXT: movdqa %xmm2, %xmm5391; X86-SSE2-NEXT: pandn %xmm4, %xmm5392; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[2,3,3,3,4,5,6,7]393; X86-SSE2-NEXT: psrld $1, %xmm1394; X86-SSE2-NEXT: movdqa %xmm1, %xmm6395; X86-SSE2-NEXT: psrld %xmm3, %xmm6396; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm5[0,1,1,1,4,5,6,7]397; X86-SSE2-NEXT: movdqa %xmm1, %xmm3398; X86-SSE2-NEXT: psrld %xmm7, %xmm3399; X86-SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm6[0]400; X86-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]401; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]402; X86-SSE2-NEXT: movdqa %xmm1, %xmm7403; X86-SSE2-NEXT: psrld %xmm6, %xmm7404; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]405; X86-SSE2-NEXT: psrld %xmm5, %xmm1406; X86-SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm7[1]407; X86-SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,3],xmm1[0,3]408; X86-SSE2-NEXT: pand %xmm4, %xmm2409; X86-SSE2-NEXT: pslld $23, %xmm2410; X86-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2411; X86-SSE2-NEXT: cvttps2dq %xmm2, %xmm1412; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]413; X86-SSE2-NEXT: pmuludq %xmm1, %xmm0414; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]415; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]416; X86-SSE2-NEXT: pmuludq %xmm2, %xmm1417; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]418; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]419; X86-SSE2-NEXT: por %xmm3, %xmm0420; X86-SSE2-NEXT: retl421 %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> %amt)422 ret <4 x i32> %res423}424 425define <8 x i16> @var_funnnel_v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %amt) nounwind {426; SSE2-LABEL: var_funnnel_v8i16:427; SSE2: # %bb.0:428; SSE2-NEXT: movdqa %xmm1, %xmm3429; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]430; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2431; SSE2-NEXT: movdqa %xmm2, %xmm4432; SSE2-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]433; SSE2-NEXT: pslld $23, %xmm4434; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]435; SSE2-NEXT: paddd %xmm5, %xmm4436; SSE2-NEXT: cvttps2dq %xmm4, %xmm4437; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[1,1,3,3]438; SSE2-NEXT: pmuludq %xmm4, %xmm3439; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]440; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]441; SSE2-NEXT: pmuludq %xmm6, %xmm4442; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]443; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]444; SSE2-NEXT: psrad $16, %xmm3445; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]446; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]447; SSE2-NEXT: pslld $23, %xmm2448; SSE2-NEXT: paddd %xmm5, %xmm2449; SSE2-NEXT: cvttps2dq %xmm2, %xmm2450; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]451; SSE2-NEXT: pmuludq %xmm2, %xmm1452; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]453; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]454; SSE2-NEXT: pmuludq %xmm4, %xmm1455; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]456; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]457; SSE2-NEXT: psrad $16, %xmm0458; SSE2-NEXT: packssdw %xmm3, %xmm0459; SSE2-NEXT: retq460;461; SSE41-LABEL: var_funnnel_v8i16:462; SSE41: # %bb.0:463; SSE41-NEXT: movdqa %xmm1, %xmm3464; SSE41-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]465; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2466; SSE41-NEXT: pmovzxwd {{.*#+}} xmm4 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero467; SSE41-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]468; SSE41-NEXT: pslld $23, %xmm2469; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]470; SSE41-NEXT: paddd %xmm5, %xmm2471; SSE41-NEXT: cvttps2dq %xmm2, %xmm2472; SSE41-NEXT: pmulld %xmm3, %xmm2473; SSE41-NEXT: psrld $16, %xmm2474; SSE41-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]475; SSE41-NEXT: pslld $23, %xmm4476; SSE41-NEXT: paddd %xmm5, %xmm4477; SSE41-NEXT: cvttps2dq %xmm4, %xmm0478; SSE41-NEXT: pmulld %xmm1, %xmm0479; SSE41-NEXT: psrld $16, %xmm0480; SSE41-NEXT: packusdw %xmm2, %xmm0481; SSE41-NEXT: retq482;483; AVX1-LABEL: var_funnnel_v8i16:484; AVX1: # %bb.0:485; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]486; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2487; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm4 = xmm2[4,4,5,5,6,6,7,7]488; AVX1-NEXT: vpslld $23, %xmm4, %xmm4489; AVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]490; AVX1-NEXT: vpaddd %xmm5, %xmm4, %xmm4491; AVX1-NEXT: vcvttps2dq %xmm4, %xmm4492; AVX1-NEXT: vpmulld %xmm4, %xmm3, %xmm3493; AVX1-NEXT: vpsrld $16, %xmm3, %xmm3494; AVX1-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]495; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero496; AVX1-NEXT: vpslld $23, %xmm1, %xmm1497; AVX1-NEXT: vpaddd %xmm5, %xmm1, %xmm1498; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1499; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0500; AVX1-NEXT: vpsrld $16, %xmm0, %xmm0501; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0502; AVX1-NEXT: retq503;504; AVX2-LABEL: var_funnnel_v8i16:505; AVX2: # %bb.0:506; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero507; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero508; AVX2-NEXT: vpslld $16, %ymm0, %ymm0509; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7],ymm1[8],ymm0[9],ymm1[10],ymm0[11],ymm1[12],ymm0[13],ymm1[14],ymm0[15]510; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm1511; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero512; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0513; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0514; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1515; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0516; AVX2-NEXT: vzeroupper517; AVX2-NEXT: retq518;519; AVX512F-LABEL: var_funnnel_v8i16:520; AVX512F: # %bb.0:521; AVX512F-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero522; AVX512F-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero523; AVX512F-NEXT: vpslld $16, %ymm0, %ymm0524; AVX512F-NEXT: vpblendw {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7],ymm1[8],ymm0[9],ymm1[10],ymm0[11],ymm1[12],ymm0[13],ymm1[14],ymm0[15]525; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm1526; AVX512F-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero527; AVX512F-NEXT: vpsllvd %ymm1, %ymm0, %ymm0528; AVX512F-NEXT: vpsrld $16, %ymm0, %ymm0529; AVX512F-NEXT: vpmovdw %zmm0, %ymm0530; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0531; AVX512F-NEXT: vzeroupper532; AVX512F-NEXT: retq533;534; AVX512VL-LABEL: var_funnnel_v8i16:535; AVX512VL: # %bb.0:536; AVX512VL-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero537; AVX512VL-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero538; AVX512VL-NEXT: vpslld $16, %ymm0, %ymm0539; AVX512VL-NEXT: vpblendw {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7],ymm1[8],ymm0[9],ymm1[10],ymm0[11],ymm1[12],ymm0[13],ymm1[14],ymm0[15]540; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm2, %xmm1541; AVX512VL-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero542; AVX512VL-NEXT: vpsllvd %ymm1, %ymm0, %ymm0543; AVX512VL-NEXT: vpsrld $16, %ymm0, %ymm0544; AVX512VL-NEXT: vpmovdw %ymm0, %xmm0545; AVX512VL-NEXT: vzeroupper546; AVX512VL-NEXT: retq547;548; AVX512BW-LABEL: var_funnnel_v8i16:549; AVX512BW: # %bb.0:550; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0551; AVX512BW-NEXT: vpbroadcastw {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]552; AVX512BW-NEXT: vpandn %xmm3, %xmm2, %xmm4553; AVX512BW-NEXT: vpsrlw $1, %xmm1, %xmm1554; AVX512BW-NEXT: vpsrlvw %zmm4, %zmm1, %zmm1555; AVX512BW-NEXT: vpand %xmm3, %xmm2, %xmm2556; AVX512BW-NEXT: vpsllvw %zmm2, %zmm0, %zmm0557; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm0558; AVX512BW-NEXT: vzeroupper559; AVX512BW-NEXT: retq560;561; AVX512VBMI2-LABEL: var_funnnel_v8i16:562; AVX512VBMI2: # %bb.0:563; AVX512VBMI2-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2564; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1565; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0566; AVX512VBMI2-NEXT: vpshldvw %zmm2, %zmm1, %zmm0567; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0568; AVX512VBMI2-NEXT: vzeroupper569; AVX512VBMI2-NEXT: retq570;571; AVX512VLBW-LABEL: var_funnnel_v8i16:572; AVX512VLBW: # %bb.0:573; AVX512VLBW-NEXT: vpbroadcastw {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]574; AVX512VLBW-NEXT: vpandn %xmm3, %xmm2, %xmm4575; AVX512VLBW-NEXT: vpsrlw $1, %xmm1, %xmm1576; AVX512VLBW-NEXT: vpsrlvw %xmm4, %xmm1, %xmm1577; AVX512VLBW-NEXT: vpand %xmm3, %xmm2, %xmm2578; AVX512VLBW-NEXT: vpsllvw %xmm2, %xmm0, %xmm0579; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm0580; AVX512VLBW-NEXT: retq581;582; AVX512VLVBMI2-LABEL: var_funnnel_v8i16:583; AVX512VLVBMI2: # %bb.0:584; AVX512VLVBMI2-NEXT: vpshldvw %xmm2, %xmm1, %xmm0585; AVX512VLVBMI2-NEXT: retq586;587; XOPAVX1-LABEL: var_funnnel_v8i16:588; XOPAVX1: # %bb.0:589; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]590; XOPAVX1-NEXT: vpand %xmm3, %xmm2, %xmm4591; XOPAVX1-NEXT: vpshlw %xmm4, %xmm0, %xmm0592; XOPAVX1-NEXT: vpandn %xmm3, %xmm2, %xmm2593; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3594; XOPAVX1-NEXT: vpsubw %xmm2, %xmm3, %xmm2595; XOPAVX1-NEXT: vpsrlw $1, %xmm1, %xmm1596; XOPAVX1-NEXT: vpshlw %xmm2, %xmm1, %xmm1597; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0598; XOPAVX1-NEXT: retq599;600; XOPAVX2-LABEL: var_funnnel_v8i16:601; XOPAVX2: # %bb.0:602; XOPAVX2-NEXT: vpbroadcastw {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]603; XOPAVX2-NEXT: vpand %xmm3, %xmm2, %xmm4604; XOPAVX2-NEXT: vpshlw %xmm4, %xmm0, %xmm0605; XOPAVX2-NEXT: vpandn %xmm3, %xmm2, %xmm2606; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3607; XOPAVX2-NEXT: vpsubw %xmm2, %xmm3, %xmm2608; XOPAVX2-NEXT: vpsrlw $1, %xmm1, %xmm1609; XOPAVX2-NEXT: vpshlw %xmm2, %xmm1, %xmm1610; XOPAVX2-NEXT: vpor %xmm1, %xmm0, %xmm0611; XOPAVX2-NEXT: retq612;613; X86-SSE2-LABEL: var_funnnel_v8i16:614; X86-SSE2: # %bb.0:615; X86-SSE2-NEXT: movdqa %xmm1, %xmm3616; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]617; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2618; X86-SSE2-NEXT: movdqa %xmm2, %xmm5619; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]620; X86-SSE2-NEXT: pslld $23, %xmm5621; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]622; X86-SSE2-NEXT: paddd %xmm4, %xmm5623; X86-SSE2-NEXT: cvttps2dq %xmm5, %xmm5624; X86-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[1,1,3,3]625; X86-SSE2-NEXT: pmuludq %xmm5, %xmm3626; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]627; X86-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]628; X86-SSE2-NEXT: pmuludq %xmm6, %xmm5629; X86-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]630; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1]631; X86-SSE2-NEXT: psrad $16, %xmm3632; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]633; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]634; X86-SSE2-NEXT: pslld $23, %xmm2635; X86-SSE2-NEXT: paddd %xmm4, %xmm2636; X86-SSE2-NEXT: cvttps2dq %xmm2, %xmm2637; X86-SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]638; X86-SSE2-NEXT: pmuludq %xmm2, %xmm1639; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]640; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]641; X86-SSE2-NEXT: pmuludq %xmm4, %xmm1642; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]643; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]644; X86-SSE2-NEXT: psrad $16, %xmm0645; X86-SSE2-NEXT: packssdw %xmm3, %xmm0646; X86-SSE2-NEXT: retl647 %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %amt)648 ret <8 x i16> %res649}650 651define <16 x i8> @var_funnnel_v16i8(<16 x i8> %x, <16 x i8> %y, <16 x i8> %amt) nounwind {652; SSE2-LABEL: var_funnnel_v16i8:653; SSE2: # %bb.0:654; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2655; SSE2-NEXT: pxor %xmm5, %xmm5656; SSE2-NEXT: movdqa %xmm2, %xmm4657; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm5[8],xmm4[9],xmm5[9],xmm4[10],xmm5[10],xmm4[11],xmm5[11],xmm4[12],xmm5[12],xmm4[13],xmm5[13],xmm4[14],xmm5[14],xmm4[15],xmm5[15]658; SSE2-NEXT: movdqa %xmm4, %xmm6659; SSE2-NEXT: punpckhwd {{.*#+}} xmm6 = xmm6[4,4,5,5,6,6,7,7]660; SSE2-NEXT: pslld $23, %xmm6661; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]662; SSE2-NEXT: paddd %xmm3, %xmm6663; SSE2-NEXT: cvttps2dq %xmm6, %xmm6664; SSE2-NEXT: pslld $16, %xmm6665; SSE2-NEXT: psrad $16, %xmm6666; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]667; SSE2-NEXT: pslld $23, %xmm4668; SSE2-NEXT: paddd %xmm3, %xmm4669; SSE2-NEXT: cvttps2dq %xmm4, %xmm7670; SSE2-NEXT: pslld $16, %xmm7671; SSE2-NEXT: psrad $16, %xmm7672; SSE2-NEXT: packssdw %xmm6, %xmm7673; SSE2-NEXT: movdqa %xmm1, %xmm4674; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]675; SSE2-NEXT: pmullw %xmm7, %xmm4676; SSE2-NEXT: psrlw $8, %xmm4677; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1],xmm2[2],xmm5[2],xmm2[3],xmm5[3],xmm2[4],xmm5[4],xmm2[5],xmm5[5],xmm2[6],xmm5[6],xmm2[7],xmm5[7]678; SSE2-NEXT: movdqa %xmm2, %xmm5679; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]680; SSE2-NEXT: pslld $23, %xmm5681; SSE2-NEXT: paddd %xmm3, %xmm5682; SSE2-NEXT: cvttps2dq %xmm5, %xmm5683; SSE2-NEXT: pslld $16, %xmm5684; SSE2-NEXT: psrad $16, %xmm5685; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]686; SSE2-NEXT: pslld $23, %xmm2687; SSE2-NEXT: paddd %xmm3, %xmm2688; SSE2-NEXT: cvttps2dq %xmm2, %xmm2689; SSE2-NEXT: pslld $16, %xmm2690; SSE2-NEXT: psrad $16, %xmm2691; SSE2-NEXT: packssdw %xmm5, %xmm2692; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]693; SSE2-NEXT: pmullw %xmm1, %xmm2694; SSE2-NEXT: psrlw $8, %xmm2695; SSE2-NEXT: packuswb %xmm4, %xmm2696; SSE2-NEXT: movdqa %xmm2, %xmm0697; SSE2-NEXT: retq698;699; SSE41-LABEL: var_funnnel_v16i8:700; SSE41: # %bb.0:701; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2702; SSE41-NEXT: pxor %xmm3, %xmm3703; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero704; SSE41-NEXT: pmovzxbw {{.*#+}} xmm5 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero705; SSE41-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15]706; SSE41-NEXT: pmovzxwd {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero707; SSE41-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]708; SSE41-NEXT: pslld $23, %xmm2709; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [1065353216,1065353216,1065353216,1065353216]710; SSE41-NEXT: paddd %xmm6, %xmm2711; SSE41-NEXT: cvttps2dq %xmm2, %xmm2712; SSE41-NEXT: pslld $23, %xmm3713; SSE41-NEXT: paddd %xmm6, %xmm3714; SSE41-NEXT: cvttps2dq %xmm3, %xmm3715; SSE41-NEXT: packusdw %xmm2, %xmm3716; SSE41-NEXT: movdqa %xmm1, %xmm7717; SSE41-NEXT: punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm0[8],xmm7[9],xmm0[9],xmm7[10],xmm0[10],xmm7[11],xmm0[11],xmm7[12],xmm0[12],xmm7[13],xmm0[13],xmm7[14],xmm0[14],xmm7[15],xmm0[15]718; SSE41-NEXT: pmullw %xmm3, %xmm7719; SSE41-NEXT: psrlw $8, %xmm7720; SSE41-NEXT: pslld $23, %xmm4721; SSE41-NEXT: paddd %xmm6, %xmm4722; SSE41-NEXT: cvttps2dq %xmm4, %xmm2723; SSE41-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]724; SSE41-NEXT: pslld $23, %xmm5725; SSE41-NEXT: paddd %xmm6, %xmm5726; SSE41-NEXT: cvttps2dq %xmm5, %xmm3727; SSE41-NEXT: packusdw %xmm3, %xmm2728; SSE41-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]729; SSE41-NEXT: pmullw %xmm1, %xmm2730; SSE41-NEXT: psrlw $8, %xmm2731; SSE41-NEXT: packuswb %xmm7, %xmm2732; SSE41-NEXT: movdqa %xmm2, %xmm0733; SSE41-NEXT: retq734;735; AVX1-LABEL: var_funnnel_v16i8:736; AVX1: # %bb.0:737; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2738; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3739; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15]740; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm4 = xmm3[4,4,5,5,6,6,7,7]741; AVX1-NEXT: vpslld $23, %xmm4, %xmm4742; AVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]743; AVX1-NEXT: vpaddd %xmm5, %xmm4, %xmm4744; AVX1-NEXT: vcvttps2dq %xmm4, %xmm4745; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero746; AVX1-NEXT: vpslld $23, %xmm3, %xmm3747; AVX1-NEXT: vpaddd %xmm5, %xmm3, %xmm3748; AVX1-NEXT: vcvttps2dq %xmm3, %xmm3749; AVX1-NEXT: vpackusdw %xmm4, %xmm3, %xmm3750; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = 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]751; AVX1-NEXT: vpmullw %xmm3, %xmm4, %xmm3752; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3753; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm4 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero754; AVX1-NEXT: vpslld $23, %xmm4, %xmm4755; AVX1-NEXT: vpaddd %xmm5, %xmm4, %xmm4756; AVX1-NEXT: vcvttps2dq %xmm4, %xmm4757; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero758; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]759; AVX1-NEXT: vpslld $23, %xmm2, %xmm2760; AVX1-NEXT: vpaddd %xmm5, %xmm2, %xmm2761; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2762; AVX1-NEXT: vpackusdw %xmm2, %xmm4, %xmm2763; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]764; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0765; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0766; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0767; AVX1-NEXT: retq768;769; AVX2-LABEL: var_funnnel_v16i8:770; AVX2: # %bb.0:771; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm3 = 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]772; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero773; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2774; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4775; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm4[8],xmm2[9],xmm4[9],xmm2[10],xmm4[10],xmm2[11],xmm4[11],xmm2[12],xmm4[12],xmm2[13],xmm4[13],xmm2[14],xmm4[14],xmm2[15],xmm4[15]776; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero777; AVX2-NEXT: vpsllvd %ymm4, %ymm3, %ymm3778; AVX2-NEXT: vmovdqa {{.*#+}} ymm4 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]779; AVX2-NEXT: vpshufb %ymm4, %ymm3, %ymm3780; AVX2-NEXT: vpermq {{.*#+}} ymm3 = ymm3[0,2,2,3]781; AVX2-NEXT: vpsrlw $8, %xmm3, %xmm3782; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]783; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero784; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm1 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero,xmm2[4],zero,zero,zero,xmm2[5],zero,zero,zero,xmm2[6],zero,zero,zero,xmm2[7],zero,zero,zero785; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0786; AVX2-NEXT: vpshufb %ymm4, %ymm0, %ymm0787; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]788; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm0789; AVX2-NEXT: vpackuswb %xmm3, %xmm0, %xmm0790; AVX2-NEXT: vzeroupper791; AVX2-NEXT: retq792;793; AVX512F-LABEL: var_funnnel_v16i8:794; AVX512F: # %bb.0:795; AVX512F-NEXT: vpbroadcastb {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]796; AVX512F-NEXT: vpand %xmm3, %xmm2, %xmm4797; AVX512F-NEXT: vpmovzxbd {{.*#+}} zmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero,xmm4[2],zero,zero,zero,xmm4[3],zero,zero,zero,xmm4[4],zero,zero,zero,xmm4[5],zero,zero,zero,xmm4[6],zero,zero,zero,xmm4[7],zero,zero,zero,xmm4[8],zero,zero,zero,xmm4[9],zero,zero,zero,xmm4[10],zero,zero,zero,xmm4[11],zero,zero,zero,xmm4[12],zero,zero,zero,xmm4[13],zero,zero,zero,xmm4[14],zero,zero,zero,xmm4[15],zero,zero,zero798; 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,zero799; AVX512F-NEXT: vpsllvd %zmm4, %zmm0, %zmm0800; AVX512F-NEXT: vpandn %xmm3, %xmm2, %xmm2801; AVX512F-NEXT: vpmovzxbd {{.*#+}} zmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero,xmm2[4],zero,zero,zero,xmm2[5],zero,zero,zero,xmm2[6],zero,zero,zero,xmm2[7],zero,zero,zero,xmm2[8],zero,zero,zero,xmm2[9],zero,zero,zero,xmm2[10],zero,zero,zero,xmm2[11],zero,zero,zero,xmm2[12],zero,zero,zero,xmm2[13],zero,zero,zero,xmm2[14],zero,zero,zero,xmm2[15],zero,zero,zero802; AVX512F-NEXT: vpsrlw $1, %xmm1, %xmm1803; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1804; 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,zero805; AVX512F-NEXT: vpsrlvd %zmm2, %zmm1, %zmm1806; AVX512F-NEXT: vpord %zmm1, %zmm0, %zmm0807; AVX512F-NEXT: vpmovdb %zmm0, %xmm0808; AVX512F-NEXT: vzeroupper809; AVX512F-NEXT: retq810;811; AVX512VL-LABEL: var_funnnel_v16i8:812; AVX512VL: # %bb.0:813; AVX512VL-NEXT: vpbroadcastd {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]814; AVX512VL-NEXT: vpand %xmm3, %xmm2, %xmm4815; AVX512VL-NEXT: vpmovzxbd {{.*#+}} zmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero,xmm4[2],zero,zero,zero,xmm4[3],zero,zero,zero,xmm4[4],zero,zero,zero,xmm4[5],zero,zero,zero,xmm4[6],zero,zero,zero,xmm4[7],zero,zero,zero,xmm4[8],zero,zero,zero,xmm4[9],zero,zero,zero,xmm4[10],zero,zero,zero,xmm4[11],zero,zero,zero,xmm4[12],zero,zero,zero,xmm4[13],zero,zero,zero,xmm4[14],zero,zero,zero,xmm4[15],zero,zero,zero816; 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,zero817; AVX512VL-NEXT: vpsllvd %zmm4, %zmm0, %zmm0818; AVX512VL-NEXT: vpandn %xmm3, %xmm2, %xmm2819; AVX512VL-NEXT: vpmovzxbd {{.*#+}} zmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero,xmm2[4],zero,zero,zero,xmm2[5],zero,zero,zero,xmm2[6],zero,zero,zero,xmm2[7],zero,zero,zero,xmm2[8],zero,zero,zero,xmm2[9],zero,zero,zero,xmm2[10],zero,zero,zero,xmm2[11],zero,zero,zero,xmm2[12],zero,zero,zero,xmm2[13],zero,zero,zero,xmm2[14],zero,zero,zero,xmm2[15],zero,zero,zero820; AVX512VL-NEXT: vpsrlw $1, %xmm1, %xmm1821; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1822; 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,zero823; AVX512VL-NEXT: vpsrlvd %zmm2, %zmm1, %zmm1824; AVX512VL-NEXT: vpord %zmm1, %zmm0, %zmm0825; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0826; AVX512VL-NEXT: vzeroupper827; AVX512VL-NEXT: retq828;829; AVX512BW-LABEL: var_funnnel_v16i8:830; AVX512BW: # %bb.0:831; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2832; AVX512BW-NEXT: vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero833; AVX512BW-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero834; AVX512BW-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero835; AVX512BW-NEXT: vpsllw $8, %ymm0, %ymm0836; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm0837; AVX512BW-NEXT: vpsllvw %zmm2, %zmm0, %zmm0838; AVX512BW-NEXT: vpsrlw $8, %ymm0, %ymm0839; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0840; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0841; AVX512BW-NEXT: vzeroupper842; AVX512BW-NEXT: retq843;844; AVX512VBMI2-LABEL: var_funnnel_v16i8:845; AVX512VBMI2: # %bb.0:846; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1847; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0848; AVX512VBMI2-NEXT: vmovdqa {{.*#+}} ymm3 = [0,64,1,65,2,66,3,67,4,68,5,69,6,70,7,71,8,72,9,73,10,74,11,75,12,76,13,77,14,78,15,79]849; AVX512VBMI2-NEXT: vpermt2b %zmm0, %zmm3, %zmm1850; AVX512VBMI2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0851; AVX512VBMI2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero852; AVX512VBMI2-NEXT: vpsllvw %zmm0, %zmm1, %zmm0853; AVX512VBMI2-NEXT: vpsrlw $8, %ymm0, %ymm0854; AVX512VBMI2-NEXT: vpmovwb %zmm0, %ymm0855; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0856; AVX512VBMI2-NEXT: vzeroupper857; AVX512VBMI2-NEXT: retq858;859; AVX512VLBW-LABEL: var_funnnel_v16i8:860; AVX512VLBW: # %bb.0:861; AVX512VLBW-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero862; AVX512VLBW-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero863; AVX512VLBW-NEXT: vpsllw $8, %ymm0, %ymm0864; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm0865; AVX512VLBW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm2, %xmm1866; AVX512VLBW-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero867; AVX512VLBW-NEXT: vpsllvw %ymm1, %ymm0, %ymm0868; AVX512VLBW-NEXT: vpsrlw $8, %ymm0, %ymm0869; AVX512VLBW-NEXT: vpmovwb %ymm0, %xmm0870; AVX512VLBW-NEXT: vzeroupper871; AVX512VLBW-NEXT: retq872;873; AVX512VLVBMI2-LABEL: var_funnnel_v16i8:874; AVX512VLVBMI2: # %bb.0:875; AVX512VLVBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1876; AVX512VLVBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0877; AVX512VLVBMI2-NEXT: vmovdqa {{.*#+}} ymm3 = [0,32,1,33,2,34,3,35,4,36,5,37,6,38,7,39,8,40,9,41,10,42,11,43,12,44,13,45,14,46,15,47]878; AVX512VLVBMI2-NEXT: vpermi2b %ymm0, %ymm1, %ymm3879; AVX512VLVBMI2-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm2, %xmm0880; AVX512VLVBMI2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero881; AVX512VLVBMI2-NEXT: vpsllvw %ymm0, %ymm3, %ymm0882; AVX512VLVBMI2-NEXT: vpsrlw $8, %ymm0, %ymm0883; AVX512VLVBMI2-NEXT: vpmovwb %ymm0, %xmm0884; AVX512VLVBMI2-NEXT: vzeroupper885; AVX512VLVBMI2-NEXT: retq886;887; XOPAVX1-LABEL: var_funnnel_v16i8:888; XOPAVX1: # %bb.0:889; XOPAVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3890; XOPAVX1-NEXT: vpshlb %xmm3, %xmm1, %xmm1891; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]892; XOPAVX1-NEXT: vpandn %xmm3, %xmm2, %xmm4893; XOPAVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5894; XOPAVX1-NEXT: vpsubb %xmm4, %xmm5, %xmm4895; XOPAVX1-NEXT: vpshlb %xmm4, %xmm1, %xmm1896; XOPAVX1-NEXT: vpand %xmm3, %xmm2, %xmm2897; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm0898; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0899; XOPAVX1-NEXT: retq900;901; XOPAVX2-LABEL: var_funnnel_v16i8:902; XOPAVX2: # %bb.0:903; XOPAVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3904; XOPAVX2-NEXT: vpshlb %xmm3, %xmm1, %xmm1905; XOPAVX2-NEXT: vpbroadcastb {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]906; XOPAVX2-NEXT: vpandn %xmm3, %xmm2, %xmm4907; XOPAVX2-NEXT: vpxor %xmm5, %xmm5, %xmm5908; XOPAVX2-NEXT: vpsubb %xmm4, %xmm5, %xmm4909; XOPAVX2-NEXT: vpshlb %xmm4, %xmm1, %xmm1910; XOPAVX2-NEXT: vpand %xmm3, %xmm2, %xmm2911; XOPAVX2-NEXT: vpshlb %xmm2, %xmm0, %xmm0912; XOPAVX2-NEXT: vpor %xmm1, %xmm0, %xmm0913; XOPAVX2-NEXT: retq914;915; X86-SSE2-LABEL: var_funnnel_v16i8:916; X86-SSE2: # %bb.0:917; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2918; X86-SSE2-NEXT: pxor %xmm5, %xmm5919; X86-SSE2-NEXT: movdqa %xmm2, %xmm4920; X86-SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm5[8],xmm4[9],xmm5[9],xmm4[10],xmm5[10],xmm4[11],xmm5[11],xmm4[12],xmm5[12],xmm4[13],xmm5[13],xmm4[14],xmm5[14],xmm4[15],xmm5[15]921; X86-SSE2-NEXT: movdqa %xmm4, %xmm6922; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm6 = xmm6[4,4,5,5,6,6,7,7]923; X86-SSE2-NEXT: pslld $23, %xmm6924; X86-SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]925; X86-SSE2-NEXT: paddd %xmm3, %xmm6926; X86-SSE2-NEXT: cvttps2dq %xmm6, %xmm6927; X86-SSE2-NEXT: pslld $16, %xmm6928; X86-SSE2-NEXT: psrad $16, %xmm6929; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]930; X86-SSE2-NEXT: pslld $23, %xmm4931; X86-SSE2-NEXT: paddd %xmm3, %xmm4932; X86-SSE2-NEXT: cvttps2dq %xmm4, %xmm7933; X86-SSE2-NEXT: pslld $16, %xmm7934; X86-SSE2-NEXT: psrad $16, %xmm7935; X86-SSE2-NEXT: packssdw %xmm6, %xmm7936; X86-SSE2-NEXT: movdqa %xmm1, %xmm4937; X86-SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]938; X86-SSE2-NEXT: pmullw %xmm7, %xmm4939; X86-SSE2-NEXT: psrlw $8, %xmm4940; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1],xmm2[2],xmm5[2],xmm2[3],xmm5[3],xmm2[4],xmm5[4],xmm2[5],xmm5[5],xmm2[6],xmm5[6],xmm2[7],xmm5[7]941; X86-SSE2-NEXT: movdqa %xmm2, %xmm5942; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]943; X86-SSE2-NEXT: pslld $23, %xmm5944; X86-SSE2-NEXT: paddd %xmm3, %xmm5945; X86-SSE2-NEXT: cvttps2dq %xmm5, %xmm5946; X86-SSE2-NEXT: pslld $16, %xmm5947; X86-SSE2-NEXT: psrad $16, %xmm5948; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]949; X86-SSE2-NEXT: pslld $23, %xmm2950; X86-SSE2-NEXT: paddd %xmm3, %xmm2951; X86-SSE2-NEXT: cvttps2dq %xmm2, %xmm2952; X86-SSE2-NEXT: pslld $16, %xmm2953; X86-SSE2-NEXT: psrad $16, %xmm2954; X86-SSE2-NEXT: packssdw %xmm5, %xmm2955; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]956; X86-SSE2-NEXT: pmullw %xmm1, %xmm2957; X86-SSE2-NEXT: psrlw $8, %xmm2958; X86-SSE2-NEXT: packuswb %xmm4, %xmm2959; X86-SSE2-NEXT: movdqa %xmm2, %xmm0960; X86-SSE2-NEXT: retl961 %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %y, <16 x i8> %amt)962 ret <16 x i8> %res963}964 965;966; Uniform Variable Shifts967;968 969define <2 x i64> @splatvar_funnnel_v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %amt) nounwind {970; SSE2-LABEL: splatvar_funnnel_v2i64:971; SSE2: # %bb.0:972; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [63,63]973; SSE2-NEXT: movdqa %xmm2, %xmm4974; SSE2-NEXT: pandn %xmm3, %xmm4975; SSE2-NEXT: psrlq $1, %xmm1976; SSE2-NEXT: psrlq %xmm4, %xmm1977; SSE2-NEXT: pand %xmm3, %xmm2978; SSE2-NEXT: psllq %xmm2, %xmm0979; SSE2-NEXT: por %xmm1, %xmm0980; SSE2-NEXT: retq981;982; SSE41-LABEL: splatvar_funnnel_v2i64:983; SSE41: # %bb.0:984; SSE41-NEXT: pmovsxbq {{.*#+}} xmm3 = [63,63]985; SSE41-NEXT: movdqa %xmm2, %xmm4986; SSE41-NEXT: pandn %xmm3, %xmm4987; SSE41-NEXT: psrlq $1, %xmm1988; SSE41-NEXT: psrlq %xmm4, %xmm1989; SSE41-NEXT: pand %xmm3, %xmm2990; SSE41-NEXT: psllq %xmm2, %xmm0991; SSE41-NEXT: por %xmm1, %xmm0992; SSE41-NEXT: retq993;994; AVX-LABEL: splatvar_funnnel_v2i64:995; AVX: # %bb.0:996; AVX-NEXT: vpmovsxbq {{.*#+}} xmm3 = [63,63]997; AVX-NEXT: vpandn %xmm3, %xmm2, %xmm4998; AVX-NEXT: vpsrlq $1, %xmm1, %xmm1999; AVX-NEXT: vpsrlq %xmm4, %xmm1, %xmm11000; AVX-NEXT: vpand %xmm3, %xmm2, %xmm21001; AVX-NEXT: vpsllq %xmm2, %xmm0, %xmm01002; AVX-NEXT: vpor %xmm1, %xmm0, %xmm01003; AVX-NEXT: retq1004;1005; AVX512F-LABEL: splatvar_funnnel_v2i64:1006; AVX512F: # %bb.0:1007; AVX512F-NEXT: vpmovsxbq {{.*#+}} xmm3 = [63,63]1008; AVX512F-NEXT: vpandn %xmm3, %xmm2, %xmm41009; AVX512F-NEXT: vpsrlq $1, %xmm1, %xmm11010; AVX512F-NEXT: vpsrlq %xmm4, %xmm1, %xmm11011; AVX512F-NEXT: vpand %xmm3, %xmm2, %xmm21012; AVX512F-NEXT: vpsllq %xmm2, %xmm0, %xmm01013; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm01014; AVX512F-NEXT: retq1015;1016; AVX512VL-LABEL: splatvar_funnnel_v2i64:1017; AVX512VL: # %bb.0:1018; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm3 = [63,63]1019; AVX512VL-NEXT: vpandn %xmm3, %xmm2, %xmm41020; AVX512VL-NEXT: vpsrlq $1, %xmm1, %xmm11021; AVX512VL-NEXT: vpsrlq %xmm4, %xmm1, %xmm11022; AVX512VL-NEXT: vpand %xmm3, %xmm2, %xmm21023; AVX512VL-NEXT: vpsllq %xmm2, %xmm0, %xmm01024; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm01025; AVX512VL-NEXT: retq1026;1027; AVX512BW-LABEL: splatvar_funnnel_v2i64:1028; AVX512BW: # %bb.0:1029; AVX512BW-NEXT: vpmovsxbq {{.*#+}} xmm3 = [63,63]1030; AVX512BW-NEXT: vpandn %xmm3, %xmm2, %xmm41031; AVX512BW-NEXT: vpsrlq $1, %xmm1, %xmm11032; AVX512BW-NEXT: vpsrlq %xmm4, %xmm1, %xmm11033; AVX512BW-NEXT: vpand %xmm3, %xmm2, %xmm21034; AVX512BW-NEXT: vpsllq %xmm2, %xmm0, %xmm01035; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm01036; AVX512BW-NEXT: retq1037;1038; AVX512VBMI2-LABEL: splatvar_funnnel_v2i64:1039; AVX512VBMI2: # %bb.0:1040; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm11041; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01042; AVX512VBMI2-NEXT: vpbroadcastq %xmm2, %xmm21043; AVX512VBMI2-NEXT: vpshldvq %zmm2, %zmm1, %zmm01044; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01045; AVX512VBMI2-NEXT: vzeroupper1046; AVX512VBMI2-NEXT: retq1047;1048; AVX512VLBW-LABEL: splatvar_funnnel_v2i64:1049; AVX512VLBW: # %bb.0:1050; AVX512VLBW-NEXT: vpbroadcastq {{.*#+}} xmm3 = [63,63]1051; AVX512VLBW-NEXT: vpandn %xmm3, %xmm2, %xmm41052; AVX512VLBW-NEXT: vpsrlq $1, %xmm1, %xmm11053; AVX512VLBW-NEXT: vpsrlq %xmm4, %xmm1, %xmm11054; AVX512VLBW-NEXT: vpand %xmm3, %xmm2, %xmm21055; AVX512VLBW-NEXT: vpsllq %xmm2, %xmm0, %xmm01056; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm01057; AVX512VLBW-NEXT: retq1058;1059; AVX512VLVBMI2-LABEL: splatvar_funnnel_v2i64:1060; AVX512VLVBMI2: # %bb.0:1061; AVX512VLVBMI2-NEXT: vpbroadcastq %xmm2, %xmm21062; AVX512VLVBMI2-NEXT: vpshldvq %xmm2, %xmm1, %xmm01063; AVX512VLVBMI2-NEXT: retq1064;1065; XOP-LABEL: splatvar_funnnel_v2i64:1066; XOP: # %bb.0:1067; XOP-NEXT: vpmovsxbq {{.*#+}} xmm3 = [63,63]1068; XOP-NEXT: vpandn %xmm3, %xmm2, %xmm41069; XOP-NEXT: vpsrlq $1, %xmm1, %xmm11070; XOP-NEXT: vpsrlq %xmm4, %xmm1, %xmm11071; XOP-NEXT: vpand %xmm3, %xmm2, %xmm21072; XOP-NEXT: vpsllq %xmm2, %xmm0, %xmm01073; XOP-NEXT: vpor %xmm1, %xmm0, %xmm01074; XOP-NEXT: retq1075;1076; X86-SSE2-LABEL: splatvar_funnnel_v2i64:1077; X86-SSE2: # %bb.0:1078; X86-SSE2-NEXT: movdqa {{.*#+}} xmm3 = [63,0,63,0]1079; X86-SSE2-NEXT: movdqa %xmm2, %xmm41080; X86-SSE2-NEXT: pandn %xmm3, %xmm41081; X86-SSE2-NEXT: psrlq $1, %xmm11082; X86-SSE2-NEXT: psrlq %xmm4, %xmm11083; X86-SSE2-NEXT: pand %xmm3, %xmm21084; X86-SSE2-NEXT: psllq %xmm2, %xmm01085; X86-SSE2-NEXT: por %xmm1, %xmm01086; X86-SSE2-NEXT: retl1087 %splat = shufflevector <2 x i64> %amt, <2 x i64> undef, <2 x i32> zeroinitializer1088 %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %splat)1089 ret <2 x i64> %res1090}1091 1092define <4 x i32> @splatvar_funnnel_v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> %amt) nounwind {1093; SSE-LABEL: splatvar_funnnel_v4i32:1094; SSE: # %bb.0:1095; SSE-NEXT: movdqa %xmm1, %xmm31096; SSE-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm0[2],xmm3[3],xmm0[3]1097; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21098; SSE-NEXT: psllq %xmm2, %xmm31099; SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1100; SSE-NEXT: psllq %xmm2, %xmm11101; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm3[1,3]1102; SSE-NEXT: movaps %xmm1, %xmm01103; SSE-NEXT: retq1104;1105; AVX-LABEL: splatvar_funnnel_v4i32:1106; AVX: # %bb.0:1107; AVX-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm0[2],xmm1[3],xmm0[3]1108; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21109; AVX-NEXT: vpsllq %xmm2, %xmm3, %xmm31110; AVX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1111; AVX-NEXT: vpsllq %xmm2, %xmm0, %xmm01112; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm3[1,3]1113; AVX-NEXT: retq1114;1115; AVX512F-LABEL: splatvar_funnnel_v4i32:1116; AVX512F: # %bb.0:1117; AVX512F-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm0[2],xmm1[3],xmm0[3]1118; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21119; AVX512F-NEXT: vpsllq %xmm2, %xmm3, %xmm31120; AVX512F-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1121; AVX512F-NEXT: vpsllq %xmm2, %xmm0, %xmm01122; AVX512F-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm3[1,3]1123; AVX512F-NEXT: retq1124;1125; AVX512VL-LABEL: splatvar_funnnel_v4i32:1126; AVX512VL: # %bb.0:1127; AVX512VL-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm0[2],xmm1[3],xmm0[3]1128; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21129; AVX512VL-NEXT: vpsllq %xmm2, %xmm3, %xmm31130; AVX512VL-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1131; AVX512VL-NEXT: vpsllq %xmm2, %xmm0, %xmm01132; AVX512VL-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm3[1,3]1133; AVX512VL-NEXT: retq1134;1135; AVX512BW-LABEL: splatvar_funnnel_v4i32:1136; AVX512BW: # %bb.0:1137; AVX512BW-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm0[2],xmm1[3],xmm0[3]1138; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21139; AVX512BW-NEXT: vpsllq %xmm2, %xmm3, %xmm31140; AVX512BW-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1141; AVX512BW-NEXT: vpsllq %xmm2, %xmm0, %xmm01142; AVX512BW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm3[1,3]1143; AVX512BW-NEXT: retq1144;1145; AVX512VBMI2-LABEL: splatvar_funnnel_v4i32:1146; AVX512VBMI2: # %bb.0:1147; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm11148; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01149; AVX512VBMI2-NEXT: vpbroadcastd %xmm2, %xmm21150; AVX512VBMI2-NEXT: vpshldvd %zmm2, %zmm1, %zmm01151; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01152; AVX512VBMI2-NEXT: vzeroupper1153; AVX512VBMI2-NEXT: retq1154;1155; AVX512VLBW-LABEL: splatvar_funnnel_v4i32:1156; AVX512VLBW: # %bb.0:1157; AVX512VLBW-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm0[2],xmm1[3],xmm0[3]1158; AVX512VLBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21159; AVX512VLBW-NEXT: vpsllq %xmm2, %xmm3, %xmm31160; AVX512VLBW-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1161; AVX512VLBW-NEXT: vpsllq %xmm2, %xmm0, %xmm01162; AVX512VLBW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm3[1,3]1163; AVX512VLBW-NEXT: retq1164;1165; AVX512VLVBMI2-LABEL: splatvar_funnnel_v4i32:1166; AVX512VLVBMI2: # %bb.0:1167; AVX512VLVBMI2-NEXT: vpbroadcastd %xmm2, %xmm21168; AVX512VLVBMI2-NEXT: vpshldvd %xmm2, %xmm1, %xmm01169; AVX512VLVBMI2-NEXT: retq1170;1171; XOP-LABEL: splatvar_funnnel_v4i32:1172; XOP: # %bb.0:1173; XOP-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm0[2],xmm1[3],xmm0[3]1174; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21175; XOP-NEXT: vpsllq %xmm2, %xmm3, %xmm31176; XOP-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1177; XOP-NEXT: vpsllq %xmm2, %xmm0, %xmm01178; XOP-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm3[1,3]1179; XOP-NEXT: retq1180;1181; X86-SSE2-LABEL: splatvar_funnnel_v4i32:1182; X86-SSE2: # %bb.0:1183; X86-SSE2-NEXT: movdqa %xmm1, %xmm31184; X86-SSE2-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm0[2],xmm3[3],xmm0[3]1185; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm21186; X86-SSE2-NEXT: psllq %xmm2, %xmm31187; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1188; X86-SSE2-NEXT: psllq %xmm2, %xmm11189; X86-SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm3[1,3]1190; X86-SSE2-NEXT: movaps %xmm1, %xmm01191; X86-SSE2-NEXT: retl1192 %splat = shufflevector <4 x i32> %amt, <4 x i32> undef, <4 x i32> zeroinitializer1193 %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> %splat)1194 ret <4 x i32> %res1195}1196 1197define <8 x i16> @splatvar_funnnel_v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %amt) nounwind {1198; SSE2-LABEL: splatvar_funnnel_v8i16:1199; SSE2: # %bb.0:1200; SSE2-NEXT: movd {{.*#+}} xmm3 = [15,0,0,0]1201; SSE2-NEXT: movdqa %xmm2, %xmm41202; SSE2-NEXT: pandn %xmm3, %xmm41203; SSE2-NEXT: psrlw $1, %xmm11204; SSE2-NEXT: psrlw %xmm4, %xmm11205; SSE2-NEXT: pand %xmm3, %xmm21206; SSE2-NEXT: psllw %xmm2, %xmm01207; SSE2-NEXT: por %xmm1, %xmm01208; SSE2-NEXT: retq1209;1210; SSE41-LABEL: splatvar_funnnel_v8i16:1211; SSE41: # %bb.0:1212; SSE41-NEXT: pmovsxbq {{.*#+}} xmm3 = [15,0]1213; SSE41-NEXT: movdqa %xmm2, %xmm41214; SSE41-NEXT: pandn %xmm3, %xmm41215; SSE41-NEXT: psrlw $1, %xmm11216; SSE41-NEXT: psrlw %xmm4, %xmm11217; SSE41-NEXT: pand %xmm3, %xmm21218; SSE41-NEXT: psllw %xmm2, %xmm01219; SSE41-NEXT: por %xmm1, %xmm01220; SSE41-NEXT: retq1221;1222; AVX-LABEL: splatvar_funnnel_v8i16:1223; AVX: # %bb.0:1224; AVX-NEXT: vpmovsxbq {{.*#+}} xmm3 = [15,0]1225; AVX-NEXT: vpandn %xmm3, %xmm2, %xmm41226; AVX-NEXT: vpsrlw $1, %xmm1, %xmm11227; AVX-NEXT: vpsrlw %xmm4, %xmm1, %xmm11228; AVX-NEXT: vpand %xmm3, %xmm2, %xmm21229; AVX-NEXT: vpsllw %xmm2, %xmm0, %xmm01230; AVX-NEXT: vpor %xmm1, %xmm0, %xmm01231; AVX-NEXT: retq1232;1233; AVX512F-LABEL: splatvar_funnnel_v8i16:1234; AVX512F: # %bb.0:1235; AVX512F-NEXT: vpmovsxbq {{.*#+}} xmm3 = [15,0]1236; AVX512F-NEXT: vpandn %xmm3, %xmm2, %xmm41237; AVX512F-NEXT: vpsrlw $1, %xmm1, %xmm11238; AVX512F-NEXT: vpsrlw %xmm4, %xmm1, %xmm11239; AVX512F-NEXT: vpand %xmm3, %xmm2, %xmm21240; AVX512F-NEXT: vpsllw %xmm2, %xmm0, %xmm01241; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm01242; AVX512F-NEXT: retq1243;1244; AVX512VL-LABEL: splatvar_funnnel_v8i16:1245; AVX512VL: # %bb.0:1246; AVX512VL-NEXT: vpmovsxbq {{.*#+}} xmm3 = [15,0]1247; AVX512VL-NEXT: vpandn %xmm3, %xmm2, %xmm41248; AVX512VL-NEXT: vpsrlw $1, %xmm1, %xmm11249; AVX512VL-NEXT: vpsrlw %xmm4, %xmm1, %xmm11250; AVX512VL-NEXT: vpand %xmm3, %xmm2, %xmm21251; AVX512VL-NEXT: vpsllw %xmm2, %xmm0, %xmm01252; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm01253; AVX512VL-NEXT: retq1254;1255; AVX512BW-LABEL: splatvar_funnnel_v8i16:1256; AVX512BW: # %bb.0:1257; AVX512BW-NEXT: vpmovsxbq {{.*#+}} xmm3 = [15,0]1258; AVX512BW-NEXT: vpandn %xmm3, %xmm2, %xmm41259; AVX512BW-NEXT: vpsrlw $1, %xmm1, %xmm11260; AVX512BW-NEXT: vpsrlw %xmm4, %xmm1, %xmm11261; AVX512BW-NEXT: vpand %xmm3, %xmm2, %xmm21262; AVX512BW-NEXT: vpsllw %xmm2, %xmm0, %xmm01263; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm01264; AVX512BW-NEXT: retq1265;1266; AVX512VBMI2-LABEL: splatvar_funnnel_v8i16:1267; AVX512VBMI2: # %bb.0:1268; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm11269; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01270; AVX512VBMI2-NEXT: vpbroadcastw %xmm2, %xmm21271; AVX512VBMI2-NEXT: vpshldvw %zmm2, %zmm1, %zmm01272; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01273; AVX512VBMI2-NEXT: vzeroupper1274; AVX512VBMI2-NEXT: retq1275;1276; AVX512VLBW-LABEL: splatvar_funnnel_v8i16:1277; AVX512VLBW: # %bb.0:1278; AVX512VLBW-NEXT: vpmovsxbq {{.*#+}} xmm3 = [15,0]1279; AVX512VLBW-NEXT: vpandn %xmm3, %xmm2, %xmm41280; AVX512VLBW-NEXT: vpsrlw $1, %xmm1, %xmm11281; AVX512VLBW-NEXT: vpsrlw %xmm4, %xmm1, %xmm11282; AVX512VLBW-NEXT: vpand %xmm3, %xmm2, %xmm21283; AVX512VLBW-NEXT: vpsllw %xmm2, %xmm0, %xmm01284; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm01285; AVX512VLBW-NEXT: retq1286;1287; AVX512VLVBMI2-LABEL: splatvar_funnnel_v8i16:1288; AVX512VLVBMI2: # %bb.0:1289; AVX512VLVBMI2-NEXT: vpbroadcastw %xmm2, %xmm21290; AVX512VLVBMI2-NEXT: vpshldvw %xmm2, %xmm1, %xmm01291; AVX512VLVBMI2-NEXT: retq1292;1293; XOP-LABEL: splatvar_funnnel_v8i16:1294; XOP: # %bb.0:1295; XOP-NEXT: vpmovsxbq {{.*#+}} xmm3 = [15,0]1296; XOP-NEXT: vpandn %xmm3, %xmm2, %xmm41297; XOP-NEXT: vpsrlw $1, %xmm1, %xmm11298; XOP-NEXT: vpsrlw %xmm4, %xmm1, %xmm11299; XOP-NEXT: vpand %xmm3, %xmm2, %xmm21300; XOP-NEXT: vpsllw %xmm2, %xmm0, %xmm01301; XOP-NEXT: vpor %xmm1, %xmm0, %xmm01302; XOP-NEXT: retq1303;1304; X86-SSE2-LABEL: splatvar_funnnel_v8i16:1305; X86-SSE2: # %bb.0:1306; X86-SSE2-NEXT: movd {{.*#+}} xmm3 = [15,0,0,0]1307; X86-SSE2-NEXT: movdqa %xmm2, %xmm41308; X86-SSE2-NEXT: pandn %xmm3, %xmm41309; X86-SSE2-NEXT: psrlw $1, %xmm11310; X86-SSE2-NEXT: psrlw %xmm4, %xmm11311; X86-SSE2-NEXT: pand %xmm3, %xmm21312; X86-SSE2-NEXT: psllw %xmm2, %xmm01313; X86-SSE2-NEXT: por %xmm1, %xmm01314; X86-SSE2-NEXT: retl1315 %splat = shufflevector <8 x i16> %amt, <8 x i16> undef, <8 x i32> zeroinitializer1316 %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %splat)1317 ret <8 x i16> %res1318}1319 1320define <16 x i8> @splatvar_funnnel_v16i8(<16 x i8> %x, <16 x i8> %y, <16 x i8> %amt) nounwind {1321; SSE-LABEL: splatvar_funnnel_v16i8:1322; SSE: # %bb.0:1323; SSE-NEXT: movdqa %xmm1, %xmm31324; SSE-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]1325; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21326; SSE-NEXT: psllw %xmm2, %xmm31327; SSE-NEXT: psrlw $8, %xmm31328; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1329; SSE-NEXT: psllw %xmm2, %xmm11330; SSE-NEXT: psrlw $8, %xmm11331; SSE-NEXT: packuswb %xmm3, %xmm11332; SSE-NEXT: movdqa %xmm1, %xmm01333; SSE-NEXT: retq1334;1335; AVX-LABEL: splatvar_funnnel_v16i8:1336; AVX: # %bb.0:1337; AVX-NEXT: vpunpckhbw {{.*#+}} xmm3 = 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]1338; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21339; AVX-NEXT: vpsllw %xmm2, %xmm3, %xmm31340; AVX-NEXT: vpsrlw $8, %xmm3, %xmm31341; AVX-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1342; AVX-NEXT: vpsllw %xmm2, %xmm0, %xmm01343; AVX-NEXT: vpsrlw $8, %xmm0, %xmm01344; AVX-NEXT: vpackuswb %xmm3, %xmm0, %xmm01345; AVX-NEXT: retq1346;1347; AVX512F-LABEL: splatvar_funnnel_v16i8:1348; AVX512F: # %bb.0:1349; AVX512F-NEXT: vpunpckhbw {{.*#+}} xmm3 = 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]1350; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21351; AVX512F-NEXT: vpsllw %xmm2, %xmm3, %xmm31352; AVX512F-NEXT: vpsrlw $8, %xmm3, %xmm31353; AVX512F-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1354; AVX512F-NEXT: vpsllw %xmm2, %xmm0, %xmm01355; AVX512F-NEXT: vpsrlw $8, %xmm0, %xmm01356; AVX512F-NEXT: vpackuswb %xmm3, %xmm0, %xmm01357; AVX512F-NEXT: retq1358;1359; AVX512VL-LABEL: splatvar_funnnel_v16i8:1360; AVX512VL: # %bb.0:1361; AVX512VL-NEXT: vpunpckhbw {{.*#+}} xmm3 = 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]1362; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21363; AVX512VL-NEXT: vpsllw %xmm2, %xmm3, %xmm31364; AVX512VL-NEXT: vpsrlw $8, %xmm3, %xmm31365; AVX512VL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1366; AVX512VL-NEXT: vpsllw %xmm2, %xmm0, %xmm01367; AVX512VL-NEXT: vpsrlw $8, %xmm0, %xmm01368; AVX512VL-NEXT: vpackuswb %xmm3, %xmm0, %xmm01369; AVX512VL-NEXT: retq1370;1371; AVX512BW-LABEL: splatvar_funnnel_v16i8:1372; AVX512BW: # %bb.0:1373; AVX512BW-NEXT: vpunpckhbw {{.*#+}} xmm3 = 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]1374; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21375; AVX512BW-NEXT: vpsllw %xmm2, %xmm3, %xmm31376; AVX512BW-NEXT: vpsrlw $8, %xmm3, %xmm31377; AVX512BW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1378; AVX512BW-NEXT: vpsllw %xmm2, %xmm0, %xmm01379; AVX512BW-NEXT: vpsrlw $8, %xmm0, %xmm01380; AVX512BW-NEXT: vpackuswb %xmm3, %xmm0, %xmm01381; AVX512BW-NEXT: retq1382;1383; AVX512VBMI2-LABEL: splatvar_funnnel_v16i8:1384; AVX512VBMI2: # %bb.0:1385; AVX512VBMI2-NEXT: vpunpckhbw {{.*#+}} xmm3 = 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]1386; AVX512VBMI2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21387; AVX512VBMI2-NEXT: vpsllw %xmm2, %xmm3, %xmm31388; AVX512VBMI2-NEXT: vpsrlw $8, %xmm3, %xmm31389; AVX512VBMI2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1390; AVX512VBMI2-NEXT: vpsllw %xmm2, %xmm0, %xmm01391; AVX512VBMI2-NEXT: vpsrlw $8, %xmm0, %xmm01392; AVX512VBMI2-NEXT: vpackuswb %xmm3, %xmm0, %xmm01393; AVX512VBMI2-NEXT: retq1394;1395; AVX512VLBW-LABEL: splatvar_funnnel_v16i8:1396; AVX512VLBW: # %bb.0:1397; AVX512VLBW-NEXT: vpunpckhbw {{.*#+}} xmm3 = 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]1398; AVX512VLBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21399; AVX512VLBW-NEXT: vpsllw %xmm2, %xmm3, %xmm31400; AVX512VLBW-NEXT: vpsrlw $8, %xmm3, %xmm31401; AVX512VLBW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1402; AVX512VLBW-NEXT: vpsllw %xmm2, %xmm0, %xmm01403; AVX512VLBW-NEXT: vpsrlw $8, %xmm0, %xmm01404; AVX512VLBW-NEXT: vpackuswb %xmm3, %xmm0, %xmm01405; AVX512VLBW-NEXT: retq1406;1407; AVX512VLVBMI2-LABEL: splatvar_funnnel_v16i8:1408; AVX512VLVBMI2: # %bb.0:1409; AVX512VLVBMI2-NEXT: vpunpckhbw {{.*#+}} xmm3 = 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]1410; AVX512VLVBMI2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21411; AVX512VLVBMI2-NEXT: vpsllw %xmm2, %xmm3, %xmm31412; AVX512VLVBMI2-NEXT: vpsrlw $8, %xmm3, %xmm31413; AVX512VLVBMI2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1414; AVX512VLVBMI2-NEXT: vpsllw %xmm2, %xmm0, %xmm01415; AVX512VLVBMI2-NEXT: vpsrlw $8, %xmm0, %xmm01416; AVX512VLVBMI2-NEXT: vpackuswb %xmm3, %xmm0, %xmm01417; AVX512VLVBMI2-NEXT: retq1418;1419; XOP-LABEL: splatvar_funnnel_v16i8:1420; XOP: # %bb.0:1421; XOP-NEXT: vpunpckhbw {{.*#+}} xmm3 = 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]1422; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21423; XOP-NEXT: vpsllw %xmm2, %xmm3, %xmm31424; XOP-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1425; XOP-NEXT: vpsllw %xmm2, %xmm0, %xmm01426; XOP-NEXT: vpperm {{.*#+}} xmm0 = xmm0[1,3,5,7,9,11,13,15],xmm3[1,3,5,7,9,11,13,15]1427; XOP-NEXT: retq1428;1429; X86-SSE2-LABEL: splatvar_funnnel_v16i8:1430; X86-SSE2: # %bb.0:1431; X86-SSE2-NEXT: movdqa %xmm1, %xmm31432; X86-SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]1433; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm21434; X86-SSE2-NEXT: psllw %xmm2, %xmm31435; X86-SSE2-NEXT: psrlw $8, %xmm31436; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1437; X86-SSE2-NEXT: psllw %xmm2, %xmm11438; X86-SSE2-NEXT: psrlw $8, %xmm11439; X86-SSE2-NEXT: packuswb %xmm3, %xmm11440; X86-SSE2-NEXT: movdqa %xmm1, %xmm01441; X86-SSE2-NEXT: retl1442 %splat = shufflevector <16 x i8> %amt, <16 x i8> undef, <16 x i32> zeroinitializer1443 %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %y, <16 x i8> %splat)1444 ret <16 x i8> %res1445}1446 1447; CGP should allow a cross-block splat shift amount to be seen in SDAG.1448; PR37426 - https://bugs.llvm.org/show_bug.cgi?id=374261449 1450define void @sink_splatvar(ptr %p, i32 %shift_amt) {1451; SSE-LABEL: sink_splatvar:1452; SSE: # %bb.0: # %entry1453; SSE-NEXT: movd %esi, %xmm01454; SSE-NEXT: movq $-1024, %rax # imm = 0xFC001455; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01456; SSE-NEXT: .p2align 41457; SSE-NEXT: .LBB8_1: # %loop1458; SSE-NEXT: # =>This Inner Loop Header: Depth=11459; SSE-NEXT: movdqu 1024(%rdi,%rax), %xmm11460; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]1461; SSE-NEXT: psllq %xmm0, %xmm21462; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]1463; SSE-NEXT: psllq %xmm0, %xmm11464; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm2[1,3]1465; SSE-NEXT: movups %xmm1, 1024(%rdi,%rax)1466; SSE-NEXT: addq $16, %rax1467; SSE-NEXT: jne .LBB8_11468; SSE-NEXT: # %bb.2: # %end1469; SSE-NEXT: retq1470;1471; AVX1-LABEL: sink_splatvar:1472; AVX1: # %bb.0: # %entry1473; AVX1-NEXT: vmovd %esi, %xmm01474; AVX1-NEXT: movq $-1024, %rax # imm = 0xFC001475; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01476; AVX1-NEXT: .p2align 41477; AVX1-NEXT: .LBB8_1: # %loop1478; AVX1-NEXT: # =>This Inner Loop Header: Depth=11479; AVX1-NEXT: vmovdqu 1024(%rdi,%rax), %xmm11480; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]1481; AVX1-NEXT: vpsllq %xmm0, %xmm2, %xmm21482; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]1483; AVX1-NEXT: vpsllq %xmm0, %xmm1, %xmm11484; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm1[1,3],xmm2[1,3]1485; AVX1-NEXT: vmovups %xmm1, 1024(%rdi,%rax)1486; AVX1-NEXT: addq $16, %rax1487; AVX1-NEXT: jne .LBB8_11488; AVX1-NEXT: # %bb.2: # %end1489; AVX1-NEXT: retq1490;1491; AVX2-LABEL: sink_splatvar:1492; AVX2: # %bb.0: # %entry1493; AVX2-NEXT: vmovd %esi, %xmm01494; AVX2-NEXT: vpbroadcastd %xmm0, %xmm01495; AVX2-NEXT: movq $-1024, %rax # imm = 0xFC001496; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [31,31,31,31]1497; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm01498; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [32,32,32,32]1499; AVX2-NEXT: vpsubd %xmm0, %xmm1, %xmm11500; AVX2-NEXT: .p2align 41501; AVX2-NEXT: .LBB8_1: # %loop1502; AVX2-NEXT: # =>This Inner Loop Header: Depth=11503; AVX2-NEXT: vmovdqu 1024(%rdi,%rax), %xmm21504; AVX2-NEXT: vpsllvd %xmm0, %xmm2, %xmm31505; AVX2-NEXT: vpsrlvd %xmm1, %xmm2, %xmm21506; AVX2-NEXT: vpor %xmm2, %xmm3, %xmm21507; AVX2-NEXT: vmovdqu %xmm2, 1024(%rdi,%rax)1508; AVX2-NEXT: addq $16, %rax1509; AVX2-NEXT: jne .LBB8_11510; AVX2-NEXT: # %bb.2: # %end1511; AVX2-NEXT: retq1512;1513; AVX512F-LABEL: sink_splatvar:1514; AVX512F: # %bb.0: # %entry1515; AVX512F-NEXT: vmovd %esi, %xmm01516; AVX512F-NEXT: vpbroadcastd %xmm0, %xmm01517; AVX512F-NEXT: movq $-1024, %rax # imm = 0xFC001518; AVX512F-NEXT: .p2align 41519; AVX512F-NEXT: .LBB8_1: # %loop1520; AVX512F-NEXT: # =>This Inner Loop Header: Depth=11521; AVX512F-NEXT: vmovdqu 1024(%rdi,%rax), %xmm11522; AVX512F-NEXT: vprolvd %zmm0, %zmm1, %zmm11523; AVX512F-NEXT: vmovdqu %xmm1, 1024(%rdi,%rax)1524; AVX512F-NEXT: addq $16, %rax1525; AVX512F-NEXT: jne .LBB8_11526; AVX512F-NEXT: # %bb.2: # %end1527; AVX512F-NEXT: vzeroupper1528; AVX512F-NEXT: retq1529;1530; AVX512VL-LABEL: sink_splatvar:1531; AVX512VL: # %bb.0: # %entry1532; AVX512VL-NEXT: vpbroadcastd %esi, %xmm01533; AVX512VL-NEXT: movq $-1024, %rax # imm = 0xFC001534; AVX512VL-NEXT: .p2align 41535; AVX512VL-NEXT: .LBB8_1: # %loop1536; AVX512VL-NEXT: # =>This Inner Loop Header: Depth=11537; AVX512VL-NEXT: vmovdqu 1024(%rdi,%rax), %xmm11538; AVX512VL-NEXT: vprolvd %xmm0, %xmm1, %xmm11539; AVX512VL-NEXT: vmovdqu %xmm1, 1024(%rdi,%rax)1540; AVX512VL-NEXT: addq $16, %rax1541; AVX512VL-NEXT: jne .LBB8_11542; AVX512VL-NEXT: # %bb.2: # %end1543; AVX512VL-NEXT: retq1544;1545; AVX512BW-LABEL: sink_splatvar:1546; AVX512BW: # %bb.0: # %entry1547; AVX512BW-NEXT: vmovd %esi, %xmm01548; AVX512BW-NEXT: vpbroadcastd %xmm0, %xmm01549; AVX512BW-NEXT: movq $-1024, %rax # imm = 0xFC001550; AVX512BW-NEXT: .p2align 41551; AVX512BW-NEXT: .LBB8_1: # %loop1552; AVX512BW-NEXT: # =>This Inner Loop Header: Depth=11553; AVX512BW-NEXT: vmovdqu 1024(%rdi,%rax), %xmm11554; AVX512BW-NEXT: vprolvd %zmm0, %zmm1, %zmm11555; AVX512BW-NEXT: vmovdqu %xmm1, 1024(%rdi,%rax)1556; AVX512BW-NEXT: addq $16, %rax1557; AVX512BW-NEXT: jne .LBB8_11558; AVX512BW-NEXT: # %bb.2: # %end1559; AVX512BW-NEXT: vzeroupper1560; AVX512BW-NEXT: retq1561;1562; AVX512VBMI2-LABEL: sink_splatvar:1563; AVX512VBMI2: # %bb.0: # %entry1564; AVX512VBMI2-NEXT: vmovd %esi, %xmm01565; AVX512VBMI2-NEXT: vpbroadcastd %xmm0, %xmm01566; AVX512VBMI2-NEXT: movq $-1024, %rax # imm = 0xFC001567; AVX512VBMI2-NEXT: .p2align 41568; AVX512VBMI2-NEXT: .LBB8_1: # %loop1569; AVX512VBMI2-NEXT: # =>This Inner Loop Header: Depth=11570; AVX512VBMI2-NEXT: vmovdqu 1024(%rdi,%rax), %xmm11571; AVX512VBMI2-NEXT: vprolvd %zmm0, %zmm1, %zmm11572; AVX512VBMI2-NEXT: vmovdqu %xmm1, 1024(%rdi,%rax)1573; AVX512VBMI2-NEXT: addq $16, %rax1574; AVX512VBMI2-NEXT: jne .LBB8_11575; AVX512VBMI2-NEXT: # %bb.2: # %end1576; AVX512VBMI2-NEXT: vzeroupper1577; AVX512VBMI2-NEXT: retq1578;1579; AVX512VLBW-LABEL: sink_splatvar:1580; AVX512VLBW: # %bb.0: # %entry1581; AVX512VLBW-NEXT: vpbroadcastd %esi, %xmm01582; AVX512VLBW-NEXT: movq $-1024, %rax # imm = 0xFC001583; AVX512VLBW-NEXT: .p2align 41584; AVX512VLBW-NEXT: .LBB8_1: # %loop1585; AVX512VLBW-NEXT: # =>This Inner Loop Header: Depth=11586; AVX512VLBW-NEXT: vmovdqu 1024(%rdi,%rax), %xmm11587; AVX512VLBW-NEXT: vprolvd %xmm0, %xmm1, %xmm11588; AVX512VLBW-NEXT: vmovdqu %xmm1, 1024(%rdi,%rax)1589; AVX512VLBW-NEXT: addq $16, %rax1590; AVX512VLBW-NEXT: jne .LBB8_11591; AVX512VLBW-NEXT: # %bb.2: # %end1592; AVX512VLBW-NEXT: retq1593;1594; AVX512VLVBMI2-LABEL: sink_splatvar:1595; AVX512VLVBMI2: # %bb.0: # %entry1596; AVX512VLVBMI2-NEXT: vpbroadcastd %esi, %xmm01597; AVX512VLVBMI2-NEXT: movq $-1024, %rax # imm = 0xFC001598; AVX512VLVBMI2-NEXT: .p2align 41599; AVX512VLVBMI2-NEXT: .LBB8_1: # %loop1600; AVX512VLVBMI2-NEXT: # =>This Inner Loop Header: Depth=11601; AVX512VLVBMI2-NEXT: vmovdqu 1024(%rdi,%rax), %xmm11602; AVX512VLVBMI2-NEXT: vprolvd %xmm0, %xmm1, %xmm11603; AVX512VLVBMI2-NEXT: vmovdqu %xmm1, 1024(%rdi,%rax)1604; AVX512VLVBMI2-NEXT: addq $16, %rax1605; AVX512VLVBMI2-NEXT: jne .LBB8_11606; AVX512VLVBMI2-NEXT: # %bb.2: # %end1607; AVX512VLVBMI2-NEXT: retq1608;1609; XOPAVX1-LABEL: sink_splatvar:1610; XOPAVX1: # %bb.0: # %entry1611; XOPAVX1-NEXT: vmovd %esi, %xmm01612; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]1613; XOPAVX1-NEXT: movq $-1024, %rax # imm = 0xFC001614; XOPAVX1-NEXT: .p2align 41615; XOPAVX1-NEXT: .LBB8_1: # %loop1616; XOPAVX1-NEXT: # =>This Inner Loop Header: Depth=11617; XOPAVX1-NEXT: vprotd %xmm0, 1024(%rdi,%rax), %xmm11618; XOPAVX1-NEXT: vmovdqu %xmm1, 1024(%rdi,%rax)1619; XOPAVX1-NEXT: addq $16, %rax1620; XOPAVX1-NEXT: jne .LBB8_11621; XOPAVX1-NEXT: # %bb.2: # %end1622; XOPAVX1-NEXT: retq1623;1624; XOPAVX2-LABEL: sink_splatvar:1625; XOPAVX2: # %bb.0: # %entry1626; XOPAVX2-NEXT: vmovd %esi, %xmm01627; XOPAVX2-NEXT: vpbroadcastd %xmm0, %xmm01628; XOPAVX2-NEXT: movq $-1024, %rax # imm = 0xFC001629; XOPAVX2-NEXT: .p2align 41630; XOPAVX2-NEXT: .LBB8_1: # %loop1631; XOPAVX2-NEXT: # =>This Inner Loop Header: Depth=11632; XOPAVX2-NEXT: vprotd %xmm0, 1024(%rdi,%rax), %xmm11633; XOPAVX2-NEXT: vmovdqu %xmm1, 1024(%rdi,%rax)1634; XOPAVX2-NEXT: addq $16, %rax1635; XOPAVX2-NEXT: jne .LBB8_11636; XOPAVX2-NEXT: # %bb.2: # %end1637; XOPAVX2-NEXT: retq1638;1639; X86-SSE2-LABEL: sink_splatvar:1640; X86-SSE2: # %bb.0: # %entry1641; X86-SSE2-NEXT: pushl %esi1642; X86-SSE2-NEXT: .cfi_def_cfa_offset 81643; X86-SSE2-NEXT: .cfi_offset %esi, -81644; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax1645; X86-SSE2-NEXT: xorl %ecx, %ecx1646; X86-SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1647; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01648; X86-SSE2-NEXT: xorl %edx, %edx1649; X86-SSE2-NEXT: .p2align 41650; X86-SSE2-NEXT: .LBB8_1: # %loop1651; X86-SSE2-NEXT: # =>This Inner Loop Header: Depth=11652; X86-SSE2-NEXT: movdqu (%eax,%ecx,4), %xmm11653; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]1654; X86-SSE2-NEXT: psllq %xmm0, %xmm21655; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]1656; X86-SSE2-NEXT: psllq %xmm0, %xmm11657; X86-SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm2[1,3]1658; X86-SSE2-NEXT: movups %xmm1, (%eax,%ecx,4)1659; X86-SSE2-NEXT: addl $4, %ecx1660; X86-SSE2-NEXT: adcl $0, %edx1661; X86-SSE2-NEXT: movl %ecx, %esi1662; X86-SSE2-NEXT: xorl $256, %esi # imm = 0x1001663; X86-SSE2-NEXT: orl %edx, %esi1664; X86-SSE2-NEXT: jne .LBB8_11665; X86-SSE2-NEXT: # %bb.2: # %end1666; X86-SSE2-NEXT: popl %esi1667; X86-SSE2-NEXT: .cfi_def_cfa_offset 41668; X86-SSE2-NEXT: retl1669entry:1670 %ins = insertelement <4 x i32> undef, i32 %shift_amt, i32 01671 %splat = shufflevector <4 x i32> %ins, <4 x i32> undef, <4 x i32> zeroinitializer1672 br label %loop1673 1674loop:1675 %index = phi i64 [ 0, %entry ], [ %inc, %loop ]1676 %addr = getelementptr inbounds i32, ptr %p, i64 %index1677 %x = load <4 x i32>, ptr %addr, align 41678 %fsh = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> %splat)1679 store <4 x i32> %fsh, ptr %addr, align 41680 %inc = add i64 %index, 41681 %iv = icmp eq i64 %inc, 2561682 br i1 %iv, label %end, label %loop1683 1684end:1685 ret void1686}1687 1688;1689; Constant Shifts1690;1691 1692define <2 x i64> @constant_funnnel_v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {1693; SSE2-LABEL: constant_funnnel_v2i64:1694; SSE2: # %bb.0:1695; SSE2-NEXT: movdqa %xmm1, %xmm21696; SSE2-NEXT: psrlq $60, %xmm21697; SSE2-NEXT: psrlq $50, %xmm11698; SSE2-NEXT: shufpd {{.*#+}} xmm2 = xmm2[0],xmm1[1]1699; SSE2-NEXT: movdqa %xmm0, %xmm11700; SSE2-NEXT: psllq $4, %xmm11701; SSE2-NEXT: psllq $14, %xmm01702; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]1703; SSE2-NEXT: orpd %xmm2, %xmm01704; SSE2-NEXT: retq1705;1706; SSE41-LABEL: constant_funnnel_v2i64:1707; SSE41: # %bb.0:1708; SSE41-NEXT: movdqa %xmm1, %xmm21709; SSE41-NEXT: psrlq $50, %xmm21710; SSE41-NEXT: psrlq $60, %xmm11711; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1,2,3],xmm2[4,5,6,7]1712; SSE41-NEXT: movdqa %xmm0, %xmm11713; SSE41-NEXT: psllq $14, %xmm11714; SSE41-NEXT: psllq $4, %xmm01715; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]1716; SSE41-NEXT: por %xmm2, %xmm01717; SSE41-NEXT: retq1718;1719; AVX1-LABEL: constant_funnnel_v2i64:1720; AVX1: # %bb.0:1721; AVX1-NEXT: vpsrlq $50, %xmm1, %xmm21722; AVX1-NEXT: vpsrlq $60, %xmm1, %xmm11723; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]1724; AVX1-NEXT: vpsllq $14, %xmm0, %xmm21725; AVX1-NEXT: vpsllq $4, %xmm0, %xmm01726; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]1727; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm01728; AVX1-NEXT: retq1729;1730; AVX2-LABEL: constant_funnnel_v2i64:1731; AVX2: # %bb.0:1732; AVX2-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11733; AVX2-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01734; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01735; AVX2-NEXT: retq1736;1737; AVX512F-LABEL: constant_funnnel_v2i64:1738; AVX512F: # %bb.0:1739; AVX512F-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11740; AVX512F-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01741; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm01742; AVX512F-NEXT: retq1743;1744; AVX512VL-LABEL: constant_funnnel_v2i64:1745; AVX512VL: # %bb.0:1746; AVX512VL-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11747; AVX512VL-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01748; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm01749; AVX512VL-NEXT: retq1750;1751; AVX512BW-LABEL: constant_funnnel_v2i64:1752; AVX512BW: # %bb.0:1753; AVX512BW-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11754; AVX512BW-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01755; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm01756; AVX512BW-NEXT: retq1757;1758; AVX512VBMI2-LABEL: constant_funnnel_v2i64:1759; AVX512VBMI2: # %bb.0:1760; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm11761; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01762; AVX512VBMI2-NEXT: vpmovsxbq {{.*#+}} xmm2 = [4,14]1763; AVX512VBMI2-NEXT: vpshldvq %zmm2, %zmm1, %zmm01764; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01765; AVX512VBMI2-NEXT: vzeroupper1766; AVX512VBMI2-NEXT: retq1767;1768; AVX512VLBW-LABEL: constant_funnnel_v2i64:1769; AVX512VLBW: # %bb.0:1770; AVX512VLBW-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11771; AVX512VLBW-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01772; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm01773; AVX512VLBW-NEXT: retq1774;1775; AVX512VLVBMI2-LABEL: constant_funnnel_v2i64:1776; AVX512VLVBMI2: # %bb.0:1777; AVX512VLVBMI2-NEXT: vpshldvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm01778; AVX512VLVBMI2-NEXT: retq1779;1780; XOPAVX1-LABEL: constant_funnnel_v2i64:1781; XOPAVX1: # %bb.0:1782; XOPAVX1-NEXT: vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11783; XOPAVX1-NEXT: vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01784; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm01785; XOPAVX1-NEXT: retq1786;1787; XOPAVX2-LABEL: constant_funnnel_v2i64:1788; XOPAVX2: # %bb.0:1789; XOPAVX2-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11790; XOPAVX2-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01791; XOPAVX2-NEXT: vpor %xmm1, %xmm0, %xmm01792; XOPAVX2-NEXT: retq1793;1794; X86-SSE2-LABEL: constant_funnnel_v2i64:1795; X86-SSE2: # %bb.0:1796; X86-SSE2-NEXT: movdqa %xmm1, %xmm21797; X86-SSE2-NEXT: psrlq $60, %xmm21798; X86-SSE2-NEXT: psrlq $50, %xmm11799; X86-SSE2-NEXT: shufpd {{.*#+}} xmm2 = xmm2[0],xmm1[1]1800; X86-SSE2-NEXT: movdqa %xmm0, %xmm11801; X86-SSE2-NEXT: psllq $4, %xmm11802; X86-SSE2-NEXT: psllq $14, %xmm01803; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]1804; X86-SSE2-NEXT: orpd %xmm2, %xmm01805; X86-SSE2-NEXT: retl1806 %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> <i64 4, i64 14>)1807 ret <2 x i64> %res1808}1809 1810define <4 x i32> @constant_funnnel_v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {1811; SSE2-LABEL: constant_funnnel_v4i32:1812; SSE2: # %bb.0:1813; SSE2-NEXT: movdqa %xmm1, %xmm21814; SSE2-NEXT: psrld $25, %xmm21815; SSE2-NEXT: movdqa %xmm1, %xmm31816; SSE2-NEXT: psrld $26, %xmm31817; SSE2-NEXT: punpckhqdq {{.*#+}} xmm3 = xmm3[1],xmm2[1]1818; SSE2-NEXT: movdqa %xmm1, %xmm21819; SSE2-NEXT: psrld $27, %xmm21820; SSE2-NEXT: psrld $28, %xmm11821; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]1822; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,3],xmm3[0,3]1823; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1824; SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16,32,64,128]1825; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1826; SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [32,u,128,u]1827; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]1828; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]1829; SSE2-NEXT: por %xmm1, %xmm01830; SSE2-NEXT: retq1831;1832; SSE41-LABEL: constant_funnnel_v4i32:1833; SSE41: # %bb.0:1834; SSE41-NEXT: movdqa %xmm1, %xmm21835; SSE41-NEXT: psrld $25, %xmm21836; SSE41-NEXT: movdqa %xmm1, %xmm31837; SSE41-NEXT: psrld $27, %xmm31838; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm2[4,5,6,7]1839; SSE41-NEXT: movdqa %xmm1, %xmm21840; SSE41-NEXT: psrld $26, %xmm21841; SSE41-NEXT: psrld $28, %xmm11842; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1,2,3],xmm2[4,5,6,7]1843; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]1844; SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16,32,64,128]1845; SSE41-NEXT: por %xmm2, %xmm01846; SSE41-NEXT: retq1847;1848; AVX1-LABEL: constant_funnnel_v4i32:1849; AVX1: # %bb.0:1850; AVX1-NEXT: vpsrld $25, %xmm1, %xmm21851; AVX1-NEXT: vpsrld $27, %xmm1, %xmm31852; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]1853; AVX1-NEXT: vpsrld $26, %xmm1, %xmm31854; AVX1-NEXT: vpsrld $28, %xmm1, %xmm11855; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]1856; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]1857; AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [16,32,64,128]1858; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm01859; AVX1-NEXT: retq1860;1861; AVX2-LABEL: constant_funnnel_v4i32:1862; AVX2: # %bb.0:1863; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11864; AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01865; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01866; AVX2-NEXT: retq1867;1868; AVX512F-LABEL: constant_funnnel_v4i32:1869; AVX512F: # %bb.0:1870; AVX512F-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11871; AVX512F-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01872; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm01873; AVX512F-NEXT: retq1874;1875; AVX512VL-LABEL: constant_funnnel_v4i32:1876; AVX512VL: # %bb.0:1877; AVX512VL-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11878; AVX512VL-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01879; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm01880; AVX512VL-NEXT: retq1881;1882; AVX512BW-LABEL: constant_funnnel_v4i32:1883; AVX512BW: # %bb.0:1884; AVX512BW-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11885; AVX512BW-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01886; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm01887; AVX512BW-NEXT: retq1888;1889; AVX512VBMI2-LABEL: constant_funnnel_v4i32:1890; AVX512VBMI2: # %bb.0:1891; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm11892; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01893; AVX512VBMI2-NEXT: vpmovsxbd {{.*#+}} xmm2 = [4,5,6,7]1894; AVX512VBMI2-NEXT: vpshldvd %zmm2, %zmm1, %zmm01895; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01896; AVX512VBMI2-NEXT: vzeroupper1897; AVX512VBMI2-NEXT: retq1898;1899; AVX512VLBW-LABEL: constant_funnnel_v4i32:1900; AVX512VLBW: # %bb.0:1901; AVX512VLBW-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11902; AVX512VLBW-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01903; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm01904; AVX512VLBW-NEXT: retq1905;1906; AVX512VLVBMI2-LABEL: constant_funnnel_v4i32:1907; AVX512VLVBMI2: # %bb.0:1908; AVX512VLVBMI2-NEXT: vpshldvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm01909; AVX512VLVBMI2-NEXT: retq1910;1911; XOPAVX1-LABEL: constant_funnnel_v4i32:1912; XOPAVX1: # %bb.0:1913; XOPAVX1-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11914; XOPAVX1-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01915; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm01916; XOPAVX1-NEXT: retq1917;1918; XOPAVX2-LABEL: constant_funnnel_v4i32:1919; XOPAVX2: # %bb.0:1920; XOPAVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11921; XOPAVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01922; XOPAVX2-NEXT: vpor %xmm1, %xmm0, %xmm01923; XOPAVX2-NEXT: retq1924;1925; X86-SSE2-LABEL: constant_funnnel_v4i32:1926; X86-SSE2: # %bb.0:1927; X86-SSE2-NEXT: movdqa %xmm1, %xmm21928; X86-SSE2-NEXT: psrld $25, %xmm21929; X86-SSE2-NEXT: movdqa %xmm1, %xmm31930; X86-SSE2-NEXT: psrld $26, %xmm31931; X86-SSE2-NEXT: punpckhqdq {{.*#+}} xmm3 = xmm3[1],xmm2[1]1932; X86-SSE2-NEXT: movdqa %xmm1, %xmm21933; X86-SSE2-NEXT: psrld $27, %xmm21934; X86-SSE2-NEXT: psrld $28, %xmm11935; X86-SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]1936; X86-SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,3],xmm3[0,3]1937; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1938; X86-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [16,32,64,128]1939; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1940; X86-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2 # [32,u,128,u]1941; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]1942; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]1943; X86-SSE2-NEXT: por %xmm1, %xmm01944; X86-SSE2-NEXT: retl1945 %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> <i32 4, i32 5, i32 6, i32 7>)1946 ret <4 x i32> %res1947}1948 1949define <8 x i16> @constant_funnnel_v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {1950; SSE-LABEL: constant_funnnel_v8i16:1951; SSE: # %bb.0:1952; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,2,4,8,16,32,64,128]1953; SSE-NEXT: psrlw $1, %xmm11954; SSE-NEXT: pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2,4,8,16,32,64,128,256]1955; SSE-NEXT: por %xmm1, %xmm01956; SSE-NEXT: retq1957;1958; AVX-LABEL: constant_funnnel_v8i16:1959; AVX: # %bb.0:1960; AVX-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]1961; AVX-NEXT: vpsrlw $1, %xmm1, %xmm11962; AVX-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [2,4,8,16,32,64,128,256]1963; AVX-NEXT: vpor %xmm1, %xmm0, %xmm01964; AVX-NEXT: retq1965;1966; AVX512F-LABEL: constant_funnnel_v8i16:1967; AVX512F: # %bb.0:1968; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]1969; AVX512F-NEXT: vpsrlw $1, %xmm1, %xmm11970; AVX512F-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [2,4,8,16,32,64,128,256]1971; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm01972; AVX512F-NEXT: retq1973;1974; AVX512VL-LABEL: constant_funnnel_v8i16:1975; AVX512VL: # %bb.0:1976; AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]1977; AVX512VL-NEXT: vpsrlw $1, %xmm1, %xmm11978; AVX512VL-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [2,4,8,16,32,64,128,256]1979; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm01980; AVX512VL-NEXT: retq1981;1982; AVX512BW-LABEL: constant_funnnel_v8i16:1983; AVX512BW: # %bb.0:1984; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01985; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7]1986; AVX512BW-NEXT: vpsllvw %zmm2, %zmm0, %zmm01987; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm2 = [15,14,13,12,11,10,9,8]1988; AVX512BW-NEXT: vpsrlw $1, %xmm1, %xmm11989; AVX512BW-NEXT: vpsrlvw %zmm2, %zmm1, %zmm11990; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm01991; AVX512BW-NEXT: vzeroupper1992; AVX512BW-NEXT: retq1993;1994; AVX512VBMI2-LABEL: constant_funnnel_v8i16:1995; AVX512VBMI2: # %bb.0:1996; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm11997; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01998; AVX512VBMI2-NEXT: vpmovsxbw {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7]1999; AVX512VBMI2-NEXT: vpshldvw %zmm2, %zmm1, %zmm02000; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02001; AVX512VBMI2-NEXT: vzeroupper2002; AVX512VBMI2-NEXT: retq2003;2004; AVX512VLBW-LABEL: constant_funnnel_v8i16:2005; AVX512VLBW: # %bb.0:2006; AVX512VLBW-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02007; AVX512VLBW-NEXT: vpsrlw $1, %xmm1, %xmm12008; AVX512VLBW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12009; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm02010; AVX512VLBW-NEXT: retq2011;2012; AVX512VLVBMI2-LABEL: constant_funnnel_v8i16:2013; AVX512VLVBMI2: # %bb.0:2014; AVX512VLVBMI2-NEXT: vpshldvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm02015; AVX512VLVBMI2-NEXT: retq2016;2017; XOP-LABEL: constant_funnnel_v8i16:2018; XOP: # %bb.0:2019; XOP-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02020; XOP-NEXT: vpsrlw $1, %xmm1, %xmm12021; XOP-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12022; XOP-NEXT: vpor %xmm1, %xmm0, %xmm02023; XOP-NEXT: retq2024;2025; X86-SSE2-LABEL: constant_funnnel_v8i16:2026; X86-SSE2: # %bb.0:2027; X86-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [1,2,4,8,16,32,64,128]2028; X86-SSE2-NEXT: psrlw $1, %xmm12029; X86-SSE2-NEXT: pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [2,4,8,16,32,64,128,256]2030; X86-SSE2-NEXT: por %xmm1, %xmm02031; X86-SSE2-NEXT: retl2032 %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>)2033 ret <8 x i16> %res2034}2035 2036define <16 x i8> @constant_funnnel_v16i8(<16 x i8> %x, <16 x i8> %y) nounwind {2037; SSE-LABEL: constant_funnnel_v16i8:2038; SSE: # %bb.0:2039; SSE-NEXT: movdqa %xmm1, %xmm22040; 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]2041; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [1,128,64,32,16,8,4,2]2042; SSE-NEXT: psrlw $8, %xmm22043; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]2044; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [1,2,4,8,16,32,64,128]2045; SSE-NEXT: psrlw $8, %xmm12046; SSE-NEXT: packuswb %xmm2, %xmm12047; SSE-NEXT: movdqa %xmm1, %xmm02048; SSE-NEXT: retq2049;2050; AVX-LABEL: constant_funnnel_v16i8:2051; AVX: # %bb.0:2052; AVX-NEXT: vpunpckhbw {{.*#+}} xmm2 = 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]2053; AVX-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [1,128,64,32,16,8,4,2]2054; AVX-NEXT: vpsrlw $8, %xmm2, %xmm22055; AVX-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]2056; AVX-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]2057; AVX-NEXT: vpsrlw $8, %xmm0, %xmm02058; AVX-NEXT: vpackuswb %xmm2, %xmm0, %xmm02059; AVX-NEXT: retq2060;2061; AVX512F-LABEL: constant_funnnel_v16i8:2062; AVX512F: # %bb.0:2063; AVX512F-NEXT: vpunpckhbw {{.*#+}} xmm2 = 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]2064; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [1,128,64,32,16,8,4,2]2065; AVX512F-NEXT: vpsrlw $8, %xmm2, %xmm22066; AVX512F-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]2067; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]2068; AVX512F-NEXT: vpsrlw $8, %xmm0, %xmm02069; AVX512F-NEXT: vpackuswb %xmm2, %xmm0, %xmm02070; AVX512F-NEXT: retq2071;2072; AVX512VL-LABEL: constant_funnnel_v16i8:2073; AVX512VL: # %bb.0:2074; AVX512VL-NEXT: vpunpckhbw {{.*#+}} xmm2 = 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]2075; AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [1,128,64,32,16,8,4,2]2076; AVX512VL-NEXT: vpsrlw $8, %xmm2, %xmm22077; AVX512VL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]2078; AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]2079; AVX512VL-NEXT: vpsrlw $8, %xmm0, %xmm02080; AVX512VL-NEXT: vpackuswb %xmm2, %xmm0, %xmm02081; AVX512VL-NEXT: retq2082;2083; AVX512BW-LABEL: constant_funnnel_v16i8:2084; AVX512BW: # %bb.0:2085; AVX512BW-NEXT: vpmovsxbw {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]2086; AVX512BW-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero2087; AVX512BW-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero2088; AVX512BW-NEXT: vpsllw $8, %ymm0, %ymm02089; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm02090; AVX512BW-NEXT: vpsllvw %zmm2, %zmm0, %zmm02091; AVX512BW-NEXT: vpsrlw $8, %ymm0, %ymm02092; AVX512BW-NEXT: vpmovwb %zmm0, %ymm02093; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02094; AVX512BW-NEXT: vzeroupper2095; AVX512BW-NEXT: retq2096;2097; AVX512VBMI2-LABEL: constant_funnnel_v16i8:2098; AVX512VBMI2: # %bb.0:2099; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm12100; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02101; AVX512VBMI2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,64,1,65,2,66,3,67,4,68,5,69,6,70,7,71,8,72,9,73,10,74,11,75,12,76,13,77,14,78,15,79]2102; AVX512VBMI2-NEXT: vpermt2b %zmm0, %zmm2, %zmm12103; AVX512VBMI2-NEXT: vpmovsxbw {{.*#+}} ymm0 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]2104; AVX512VBMI2-NEXT: vpsllvw %zmm0, %zmm1, %zmm02105; AVX512VBMI2-NEXT: vpsrlw $8, %ymm0, %ymm02106; AVX512VBMI2-NEXT: vpmovwb %zmm0, %ymm02107; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02108; AVX512VBMI2-NEXT: vzeroupper2109; AVX512VBMI2-NEXT: retq2110;2111; AVX512VLBW-LABEL: constant_funnnel_v16i8:2112; AVX512VLBW: # %bb.0:2113; AVX512VLBW-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero2114; AVX512VLBW-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero2115; AVX512VLBW-NEXT: vpsllw $8, %ymm0, %ymm02116; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm02117; AVX512VLBW-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02118; AVX512VLBW-NEXT: vpsrlw $8, %ymm0, %ymm02119; AVX512VLBW-NEXT: vpmovwb %ymm0, %xmm02120; AVX512VLBW-NEXT: vzeroupper2121; AVX512VLBW-NEXT: retq2122;2123; AVX512VLVBMI2-LABEL: constant_funnnel_v16i8:2124; AVX512VLVBMI2: # %bb.0:2125; AVX512VLVBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm12126; AVX512VLVBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm02127; AVX512VLVBMI2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,32,1,33,2,34,3,35,4,36,5,37,6,38,7,39,8,40,9,41,10,42,11,43,12,44,13,45,14,46,15,47]2128; AVX512VLVBMI2-NEXT: vpermi2b %ymm0, %ymm1, %ymm22129; AVX512VLVBMI2-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm02130; AVX512VLVBMI2-NEXT: vpsrlw $8, %ymm0, %ymm02131; AVX512VLVBMI2-NEXT: vpmovwb %ymm0, %xmm02132; AVX512VLVBMI2-NEXT: vzeroupper2133; AVX512VLVBMI2-NEXT: retq2134;2135; XOP-LABEL: constant_funnnel_v16i8:2136; XOP: # %bb.0:2137; XOP-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm22138; XOP-NEXT: vpshlb %xmm2, %xmm1, %xmm12139; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12140; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02141; XOP-NEXT: vpor %xmm1, %xmm0, %xmm02142; XOP-NEXT: retq2143;2144; X86-SSE2-LABEL: constant_funnnel_v16i8:2145; X86-SSE2: # %bb.0:2146; X86-SSE2-NEXT: movdqa %xmm1, %xmm22147; 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]2148; X86-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2 # [1,128,64,32,16,8,4,2]2149; X86-SSE2-NEXT: psrlw $8, %xmm22150; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]2151; X86-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [1,2,4,8,16,32,64,128]2152; X86-SSE2-NEXT: psrlw $8, %xmm12153; X86-SSE2-NEXT: packuswb %xmm2, %xmm12154; X86-SSE2-NEXT: movdqa %xmm1, %xmm02155; X86-SSE2-NEXT: retl2156 %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %y, <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>)2157 ret <16 x i8> %res2158}2159 2160;2161; Uniform Constant Shifts2162;2163 2164define <2 x i64> @splatconstant_funnnel_v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {2165; SSE-LABEL: splatconstant_funnnel_v2i64:2166; SSE: # %bb.0:2167; SSE-NEXT: psrlq $50, %xmm12168; SSE-NEXT: psllq $14, %xmm02169; SSE-NEXT: por %xmm1, %xmm02170; SSE-NEXT: retq2171;2172; AVX-LABEL: splatconstant_funnnel_v2i64:2173; AVX: # %bb.0:2174; AVX-NEXT: vpsrlq $50, %xmm1, %xmm12175; AVX-NEXT: vpsllq $14, %xmm0, %xmm02176; AVX-NEXT: vpor %xmm1, %xmm0, %xmm02177; AVX-NEXT: retq2178;2179; AVX512F-LABEL: splatconstant_funnnel_v2i64:2180; AVX512F: # %bb.0:2181; AVX512F-NEXT: vpsrlq $50, %xmm1, %xmm12182; AVX512F-NEXT: vpsllq $14, %xmm0, %xmm02183; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm02184; AVX512F-NEXT: retq2185;2186; AVX512VL-LABEL: splatconstant_funnnel_v2i64:2187; AVX512VL: # %bb.0:2188; AVX512VL-NEXT: vpsrlq $50, %xmm1, %xmm12189; AVX512VL-NEXT: vpsllq $14, %xmm0, %xmm02190; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm02191; AVX512VL-NEXT: retq2192;2193; AVX512BW-LABEL: splatconstant_funnnel_v2i64:2194; AVX512BW: # %bb.0:2195; AVX512BW-NEXT: vpsrlq $50, %xmm1, %xmm12196; AVX512BW-NEXT: vpsllq $14, %xmm0, %xmm02197; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm02198; AVX512BW-NEXT: retq2199;2200; AVX512VBMI2-LABEL: splatconstant_funnnel_v2i64:2201; AVX512VBMI2: # %bb.0:2202; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm12203; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02204; AVX512VBMI2-NEXT: vpshldq $14, %zmm1, %zmm0, %zmm02205; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02206; AVX512VBMI2-NEXT: vzeroupper2207; AVX512VBMI2-NEXT: retq2208;2209; AVX512VLBW-LABEL: splatconstant_funnnel_v2i64:2210; AVX512VLBW: # %bb.0:2211; AVX512VLBW-NEXT: vpsrlq $50, %xmm1, %xmm12212; AVX512VLBW-NEXT: vpsllq $14, %xmm0, %xmm02213; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm02214; AVX512VLBW-NEXT: retq2215;2216; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v2i64:2217; AVX512VLVBMI2: # %bb.0:2218; AVX512VLVBMI2-NEXT: vpshldq $14, %xmm1, %xmm0, %xmm02219; AVX512VLVBMI2-NEXT: retq2220;2221; XOP-LABEL: splatconstant_funnnel_v2i64:2222; XOP: # %bb.0:2223; XOP-NEXT: vpsrlq $50, %xmm1, %xmm12224; XOP-NEXT: vpsllq $14, %xmm0, %xmm02225; XOP-NEXT: vpor %xmm1, %xmm0, %xmm02226; XOP-NEXT: retq2227;2228; X86-SSE2-LABEL: splatconstant_funnnel_v2i64:2229; X86-SSE2: # %bb.0:2230; X86-SSE2-NEXT: psrlq $50, %xmm12231; X86-SSE2-NEXT: psllq $14, %xmm02232; X86-SSE2-NEXT: por %xmm1, %xmm02233; X86-SSE2-NEXT: retl2234 %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> <i64 14, i64 14>)2235 ret <2 x i64> %res2236}2237 2238define <4 x i32> @splatconstant_funnnel_v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {2239; SSE-LABEL: splatconstant_funnnel_v4i32:2240; SSE: # %bb.0:2241; SSE-NEXT: psrld $28, %xmm12242; SSE-NEXT: pslld $4, %xmm02243; SSE-NEXT: por %xmm1, %xmm02244; SSE-NEXT: retq2245;2246; AVX-LABEL: splatconstant_funnnel_v4i32:2247; AVX: # %bb.0:2248; AVX-NEXT: vpsrld $28, %xmm1, %xmm12249; AVX-NEXT: vpslld $4, %xmm0, %xmm02250; AVX-NEXT: vpor %xmm1, %xmm0, %xmm02251; AVX-NEXT: retq2252;2253; AVX512F-LABEL: splatconstant_funnnel_v4i32:2254; AVX512F: # %bb.0:2255; AVX512F-NEXT: vpsrld $28, %xmm1, %xmm12256; AVX512F-NEXT: vpslld $4, %xmm0, %xmm02257; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm02258; AVX512F-NEXT: retq2259;2260; AVX512VL-LABEL: splatconstant_funnnel_v4i32:2261; AVX512VL: # %bb.0:2262; AVX512VL-NEXT: vpsrld $28, %xmm1, %xmm12263; AVX512VL-NEXT: vpslld $4, %xmm0, %xmm02264; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm02265; AVX512VL-NEXT: retq2266;2267; AVX512BW-LABEL: splatconstant_funnnel_v4i32:2268; AVX512BW: # %bb.0:2269; AVX512BW-NEXT: vpsrld $28, %xmm1, %xmm12270; AVX512BW-NEXT: vpslld $4, %xmm0, %xmm02271; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm02272; AVX512BW-NEXT: retq2273;2274; AVX512VBMI2-LABEL: splatconstant_funnnel_v4i32:2275; AVX512VBMI2: # %bb.0:2276; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm12277; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02278; AVX512VBMI2-NEXT: vpshldd $4, %zmm1, %zmm0, %zmm02279; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02280; AVX512VBMI2-NEXT: vzeroupper2281; AVX512VBMI2-NEXT: retq2282;2283; AVX512VLBW-LABEL: splatconstant_funnnel_v4i32:2284; AVX512VLBW: # %bb.0:2285; AVX512VLBW-NEXT: vpsrld $28, %xmm1, %xmm12286; AVX512VLBW-NEXT: vpslld $4, %xmm0, %xmm02287; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm02288; AVX512VLBW-NEXT: retq2289;2290; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v4i32:2291; AVX512VLVBMI2: # %bb.0:2292; AVX512VLVBMI2-NEXT: vpshldd $4, %xmm1, %xmm0, %xmm02293; AVX512VLVBMI2-NEXT: retq2294;2295; XOP-LABEL: splatconstant_funnnel_v4i32:2296; XOP: # %bb.0:2297; XOP-NEXT: vpsrld $28, %xmm1, %xmm12298; XOP-NEXT: vpslld $4, %xmm0, %xmm02299; XOP-NEXT: vpor %xmm1, %xmm0, %xmm02300; XOP-NEXT: retq2301;2302; X86-SSE2-LABEL: splatconstant_funnnel_v4i32:2303; X86-SSE2: # %bb.0:2304; X86-SSE2-NEXT: psrld $28, %xmm12305; X86-SSE2-NEXT: pslld $4, %xmm02306; X86-SSE2-NEXT: por %xmm1, %xmm02307; X86-SSE2-NEXT: retl2308 %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> <i32 4, i32 4, i32 4, i32 4>)2309 ret <4 x i32> %res2310}2311 2312define <8 x i16> @splatconstant_funnnel_v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {2313; SSE-LABEL: splatconstant_funnnel_v8i16:2314; SSE: # %bb.0:2315; SSE-NEXT: psrlw $9, %xmm12316; SSE-NEXT: psllw $7, %xmm02317; SSE-NEXT: por %xmm1, %xmm02318; SSE-NEXT: retq2319;2320; AVX-LABEL: splatconstant_funnnel_v8i16:2321; AVX: # %bb.0:2322; AVX-NEXT: vpsrlw $9, %xmm1, %xmm12323; AVX-NEXT: vpsllw $7, %xmm0, %xmm02324; AVX-NEXT: vpor %xmm1, %xmm0, %xmm02325; AVX-NEXT: retq2326;2327; AVX512F-LABEL: splatconstant_funnnel_v8i16:2328; AVX512F: # %bb.0:2329; AVX512F-NEXT: vpsrlw $9, %xmm1, %xmm12330; AVX512F-NEXT: vpsllw $7, %xmm0, %xmm02331; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm02332; AVX512F-NEXT: retq2333;2334; AVX512VL-LABEL: splatconstant_funnnel_v8i16:2335; AVX512VL: # %bb.0:2336; AVX512VL-NEXT: vpsrlw $9, %xmm1, %xmm12337; AVX512VL-NEXT: vpsllw $7, %xmm0, %xmm02338; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm02339; AVX512VL-NEXT: retq2340;2341; AVX512BW-LABEL: splatconstant_funnnel_v8i16:2342; AVX512BW: # %bb.0:2343; AVX512BW-NEXT: vpsrlw $9, %xmm1, %xmm12344; AVX512BW-NEXT: vpsllw $7, %xmm0, %xmm02345; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm02346; AVX512BW-NEXT: retq2347;2348; AVX512VBMI2-LABEL: splatconstant_funnnel_v8i16:2349; AVX512VBMI2: # %bb.0:2350; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm12351; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02352; AVX512VBMI2-NEXT: vpshldw $7, %zmm1, %zmm0, %zmm02353; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02354; AVX512VBMI2-NEXT: vzeroupper2355; AVX512VBMI2-NEXT: retq2356;2357; AVX512VLBW-LABEL: splatconstant_funnnel_v8i16:2358; AVX512VLBW: # %bb.0:2359; AVX512VLBW-NEXT: vpsrlw $9, %xmm1, %xmm12360; AVX512VLBW-NEXT: vpsllw $7, %xmm0, %xmm02361; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm02362; AVX512VLBW-NEXT: retq2363;2364; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v8i16:2365; AVX512VLVBMI2: # %bb.0:2366; AVX512VLVBMI2-NEXT: vpshldw $7, %xmm1, %xmm0, %xmm02367; AVX512VLVBMI2-NEXT: retq2368;2369; XOP-LABEL: splatconstant_funnnel_v8i16:2370; XOP: # %bb.0:2371; XOP-NEXT: vpsrlw $9, %xmm1, %xmm12372; XOP-NEXT: vpsllw $7, %xmm0, %xmm02373; XOP-NEXT: vpor %xmm1, %xmm0, %xmm02374; XOP-NEXT: retq2375;2376; X86-SSE2-LABEL: splatconstant_funnnel_v8i16:2377; X86-SSE2: # %bb.0:2378; X86-SSE2-NEXT: psrlw $9, %xmm12379; X86-SSE2-NEXT: psllw $7, %xmm02380; X86-SSE2-NEXT: por %xmm1, %xmm02381; X86-SSE2-NEXT: retl2382 %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>)2383 ret <8 x i16> %res2384}2385 2386define <16 x i8> @splatconstant_funnnel_v16i8(<16 x i8> %x, <16 x i8> %y) nounwind {2387; SSE-LABEL: splatconstant_funnnel_v16i8:2388; SSE: # %bb.0:2389; SSE-NEXT: psrlw $4, %xmm12390; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12391; SSE-NEXT: psllw $4, %xmm02392; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02393; SSE-NEXT: por %xmm1, %xmm02394; SSE-NEXT: retq2395;2396; AVX-LABEL: splatconstant_funnnel_v16i8:2397; AVX: # %bb.0:2398; AVX-NEXT: vpsrlw $4, %xmm1, %xmm12399; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12400; AVX-NEXT: vpsllw $4, %xmm0, %xmm02401; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02402; AVX-NEXT: vpor %xmm1, %xmm0, %xmm02403; AVX-NEXT: retq2404;2405; AVX512F-LABEL: splatconstant_funnnel_v16i8:2406; AVX512F: # %bb.0:2407; AVX512F-NEXT: vpsllw $4, %xmm0, %xmm22408; AVX512F-NEXT: vpsrlw $4, %xmm1, %xmm02409; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm2))2410; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02411; AVX512F-NEXT: vzeroupper2412; AVX512F-NEXT: retq2413;2414; AVX512VL-LABEL: splatconstant_funnnel_v16i8:2415; AVX512VL: # %bb.0:2416; AVX512VL-NEXT: vpsllw $4, %xmm0, %xmm22417; AVX512VL-NEXT: vpsrlw $4, %xmm1, %xmm02418; AVX512VL-NEXT: vpternlogd {{.*#+}} xmm0 = xmm0 ^ (m32bcst & (xmm0 ^ xmm2))2419; AVX512VL-NEXT: retq2420;2421; AVX512BW-LABEL: splatconstant_funnnel_v16i8:2422; AVX512BW: # %bb.0:2423; AVX512BW-NEXT: vpsllw $4, %xmm0, %xmm22424; AVX512BW-NEXT: vpsrlw $4, %xmm1, %xmm02425; AVX512BW-NEXT: vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm2))2426; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02427; AVX512BW-NEXT: vzeroupper2428; AVX512BW-NEXT: retq2429;2430; AVX512VBMI2-LABEL: splatconstant_funnnel_v16i8:2431; AVX512VBMI2: # %bb.0:2432; AVX512VBMI2-NEXT: vpsllw $4, %xmm0, %xmm22433; AVX512VBMI2-NEXT: vpsrlw $4, %xmm1, %xmm02434; AVX512VBMI2-NEXT: vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm2))2435; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02436; AVX512VBMI2-NEXT: vzeroupper2437; AVX512VBMI2-NEXT: retq2438;2439; AVX512VLBW-LABEL: splatconstant_funnnel_v16i8:2440; AVX512VLBW: # %bb.0:2441; AVX512VLBW-NEXT: vpsllw $4, %xmm0, %xmm22442; AVX512VLBW-NEXT: vpsrlw $4, %xmm1, %xmm02443; AVX512VLBW-NEXT: vpternlogd {{.*#+}} xmm0 = xmm0 ^ (m32bcst & (xmm0 ^ xmm2))2444; AVX512VLBW-NEXT: retq2445;2446; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v16i8:2447; AVX512VLVBMI2: # %bb.0:2448; AVX512VLVBMI2-NEXT: vpsllw $4, %xmm0, %xmm22449; AVX512VLVBMI2-NEXT: vpsrlw $4, %xmm1, %xmm02450; AVX512VLVBMI2-NEXT: vpternlogd {{.*#+}} xmm0 = xmm0 ^ (m32bcst & (xmm0 ^ xmm2))2451; AVX512VLVBMI2-NEXT: retq2452;2453; XOP-LABEL: splatconstant_funnnel_v16i8:2454; XOP: # %bb.0:2455; XOP-NEXT: vpsrlw $4, %xmm1, %xmm12456; XOP-NEXT: vpsllw $4, %xmm0, %xmm02457; XOP-NEXT: vpcmov {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0, %xmm02458; XOP-NEXT: retq2459;2460; X86-SSE2-LABEL: splatconstant_funnnel_v16i8:2461; X86-SSE2: # %bb.0:2462; X86-SSE2-NEXT: psrlw $4, %xmm12463; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm12464; X86-SSE2-NEXT: psllw $4, %xmm02465; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02466; X86-SSE2-NEXT: por %xmm1, %xmm02467; X86-SSE2-NEXT: retl2468 %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %y, <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>)2469 ret <16 x i8> %res2470}2471