662 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=AVX,AVX512F7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512VL8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512BW9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512VLBW10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2 | FileCheck %s --check-prefixes=AVX512VBMI211; 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=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX113; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX214 15; Just one 32-bit run to make sure we do reasonable things for i64 cases.16; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X86-SSE217 18declare <2 x i32> @llvm.fshl.v2i32(<2 x i32>, <2 x i32>, <2 x i32>)19 20;21; Variable Shifts22;23 24define <2 x i32> @var_funnnel_v2i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> %amt) nounwind {25; SSE2-LABEL: var_funnnel_v2i32:26; SSE2: # %bb.0:27; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [31,31,31,31]28; SSE2-NEXT: movdqa %xmm2, %xmm529; SSE2-NEXT: pandn %xmm4, %xmm530; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[2,3,3,3,4,5,6,7]31; SSE2-NEXT: psrld $1, %xmm132; SSE2-NEXT: movdqa %xmm1, %xmm633; SSE2-NEXT: psrld %xmm3, %xmm634; SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm5[0,1,1,1,4,5,6,7]35; SSE2-NEXT: movdqa %xmm1, %xmm336; SSE2-NEXT: psrld %xmm7, %xmm337; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm6[0]38; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]39; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]40; SSE2-NEXT: movdqa %xmm1, %xmm741; SSE2-NEXT: psrld %xmm6, %xmm742; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]43; SSE2-NEXT: psrld %xmm5, %xmm144; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm7[1]45; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,3],xmm1[0,3]46; SSE2-NEXT: pand %xmm4, %xmm247; SSE2-NEXT: pslld $23, %xmm248; SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm249; SSE2-NEXT: cvttps2dq %xmm2, %xmm150; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]51; SSE2-NEXT: pmuludq %xmm1, %xmm052; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]53; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]54; SSE2-NEXT: pmuludq %xmm2, %xmm155; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]56; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]57; SSE2-NEXT: por %xmm3, %xmm058; SSE2-NEXT: retq59;60; SSE41-LABEL: var_funnnel_v2i32:61; SSE41: # %bb.0:62; SSE41-NEXT: pmovsxbd {{.*#+}} xmm3 = [31,31,31,31]63; SSE41-NEXT: movdqa %xmm2, %xmm464; SSE41-NEXT: pandn %xmm3, %xmm465; SSE41-NEXT: pshuflw {{.*#+}} xmm5 = xmm4[2,3,3,3,4,5,6,7]66; SSE41-NEXT: psrld $1, %xmm167; SSE41-NEXT: movdqa %xmm1, %xmm668; SSE41-NEXT: psrld %xmm5, %xmm669; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[2,3,2,3]70; SSE41-NEXT: pshuflw {{.*#+}} xmm7 = xmm5[2,3,3,3,4,5,6,7]71; SSE41-NEXT: movdqa %xmm1, %xmm872; SSE41-NEXT: psrld %xmm7, %xmm873; SSE41-NEXT: pblendw {{.*#+}} xmm8 = xmm6[0,1,2,3],xmm8[4,5,6,7]74; SSE41-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,1,1,1,4,5,6,7]75; SSE41-NEXT: movdqa %xmm1, %xmm676; SSE41-NEXT: psrld %xmm4, %xmm677; SSE41-NEXT: pshuflw {{.*#+}} xmm4 = xmm5[0,1,1,1,4,5,6,7]78; SSE41-NEXT: psrld %xmm4, %xmm179; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm1[4,5,6,7]80; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1],xmm8[2,3],xmm6[4,5],xmm8[6,7]81; SSE41-NEXT: pand %xmm3, %xmm282; SSE41-NEXT: pslld $23, %xmm283; SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm284; SSE41-NEXT: cvttps2dq %xmm2, %xmm185; SSE41-NEXT: pmulld %xmm1, %xmm086; SSE41-NEXT: por %xmm6, %xmm087; SSE41-NEXT: retq88;89; AVX1-LABEL: var_funnnel_v2i32:90; AVX1: # %bb.0:91; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]92; AVX1-NEXT: vpandn %xmm3, %xmm2, %xmm493; AVX1-NEXT: vpsrldq {{.*#+}} xmm5 = xmm4[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero94; AVX1-NEXT: vpsrld $1, %xmm1, %xmm195; AVX1-NEXT: vpsrld %xmm5, %xmm1, %xmm596; AVX1-NEXT: vpsrlq $32, %xmm4, %xmm697; AVX1-NEXT: vpsrld %xmm6, %xmm1, %xmm698; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1,2,3],xmm5[4,5,6,7]99; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm6100; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm4[2],xmm6[2],xmm4[3],xmm6[3]101; AVX1-NEXT: vpsrld %xmm6, %xmm1, %xmm6102; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero103; AVX1-NEXT: vpsrld %xmm4, %xmm1, %xmm1104; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm6[4,5,6,7]105; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,3],xmm1[4,5],xmm5[6,7]106; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2107; AVX1-NEXT: vpslld $23, %xmm2, %xmm2108; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2109; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2110; AVX1-NEXT: vpmulld %xmm2, %xmm0, %xmm0111; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0112; AVX1-NEXT: retq113;114; AVX2-LABEL: var_funnnel_v2i32:115; AVX2: # %bb.0:116; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]117; AVX2-NEXT: vpandn %xmm3, %xmm2, %xmm4118; AVX2-NEXT: vpsrld $1, %xmm1, %xmm1119; AVX2-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1120; AVX2-NEXT: vpand %xmm3, %xmm2, %xmm2121; AVX2-NEXT: vpsllvd %xmm2, %xmm0, %xmm0122; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0123; AVX2-NEXT: retq124;125; AVX512F-LABEL: var_funnnel_v2i32:126; AVX512F: # %bb.0:127; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]128; AVX512F-NEXT: vpandn %xmm3, %xmm2, %xmm4129; AVX512F-NEXT: vpsrld $1, %xmm1, %xmm1130; AVX512F-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1131; AVX512F-NEXT: vpand %xmm3, %xmm2, %xmm2132; AVX512F-NEXT: vpsllvd %xmm2, %xmm0, %xmm0133; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm0134; AVX512F-NEXT: retq135;136; AVX512VL-LABEL: var_funnnel_v2i32:137; AVX512VL: # %bb.0:138; AVX512VL-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]139; AVX512VL-NEXT: vpandn %xmm3, %xmm2, %xmm4140; AVX512VL-NEXT: vpsrld $1, %xmm1, %xmm1141; AVX512VL-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1142; AVX512VL-NEXT: vpand %xmm3, %xmm2, %xmm2143; AVX512VL-NEXT: vpsllvd %xmm2, %xmm0, %xmm0144; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm0145; AVX512VL-NEXT: retq146;147; AVX512BW-LABEL: var_funnnel_v2i32:148; AVX512BW: # %bb.0:149; AVX512BW-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]150; AVX512BW-NEXT: vpandn %xmm3, %xmm2, %xmm4151; AVX512BW-NEXT: vpsrld $1, %xmm1, %xmm1152; AVX512BW-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1153; AVX512BW-NEXT: vpand %xmm3, %xmm2, %xmm2154; AVX512BW-NEXT: vpsllvd %xmm2, %xmm0, %xmm0155; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm0156; AVX512BW-NEXT: retq157;158; AVX512VLBW-LABEL: var_funnnel_v2i32:159; AVX512VLBW: # %bb.0:160; AVX512VLBW-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]161; AVX512VLBW-NEXT: vpandn %xmm3, %xmm2, %xmm4162; AVX512VLBW-NEXT: vpsrld $1, %xmm1, %xmm1163; AVX512VLBW-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1164; AVX512VLBW-NEXT: vpand %xmm3, %xmm2, %xmm2165; AVX512VLBW-NEXT: vpsllvd %xmm2, %xmm0, %xmm0166; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm0167; AVX512VLBW-NEXT: retq168;169; AVX512VBMI2-LABEL: var_funnnel_v2i32:170; AVX512VBMI2: # %bb.0:171; AVX512VBMI2-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2172; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1173; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0174; AVX512VBMI2-NEXT: vpshldvd %zmm2, %zmm1, %zmm0175; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0176; AVX512VBMI2-NEXT: vzeroupper177; AVX512VBMI2-NEXT: retq178;179; AVX512VLVBMI2-LABEL: var_funnnel_v2i32:180; AVX512VLVBMI2: # %bb.0:181; AVX512VLVBMI2-NEXT: vpshldvd %xmm2, %xmm1, %xmm0182; AVX512VLVBMI2-NEXT: retq183;184; XOPAVX1-LABEL: var_funnnel_v2i32:185; XOPAVX1: # %bb.0:186; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]187; XOPAVX1-NEXT: vpand %xmm3, %xmm2, %xmm4188; XOPAVX1-NEXT: vpshld %xmm4, %xmm0, %xmm0189; XOPAVX1-NEXT: vpandn %xmm3, %xmm2, %xmm2190; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3191; XOPAVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2192; XOPAVX1-NEXT: vpsrld $1, %xmm1, %xmm1193; XOPAVX1-NEXT: vpshld %xmm2, %xmm1, %xmm1194; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0195; XOPAVX1-NEXT: retq196;197; XOPAVX2-LABEL: var_funnnel_v2i32:198; XOPAVX2: # %bb.0:199; XOPAVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]200; XOPAVX2-NEXT: vpandn %xmm3, %xmm2, %xmm4201; XOPAVX2-NEXT: vpsrld $1, %xmm1, %xmm1202; XOPAVX2-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1203; XOPAVX2-NEXT: vpand %xmm3, %xmm2, %xmm2204; XOPAVX2-NEXT: vpsllvd %xmm2, %xmm0, %xmm0205; XOPAVX2-NEXT: vpor %xmm1, %xmm0, %xmm0206; XOPAVX2-NEXT: retq207;208; X86-SSE2-LABEL: var_funnnel_v2i32:209; X86-SSE2: # %bb.0:210; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [31,31,31,31]211; X86-SSE2-NEXT: movdqa %xmm2, %xmm5212; X86-SSE2-NEXT: pandn %xmm4, %xmm5213; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[2,3,3,3,4,5,6,7]214; X86-SSE2-NEXT: psrld $1, %xmm1215; X86-SSE2-NEXT: movdqa %xmm1, %xmm6216; X86-SSE2-NEXT: psrld %xmm3, %xmm6217; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm5[0,1,1,1,4,5,6,7]218; X86-SSE2-NEXT: movdqa %xmm1, %xmm3219; X86-SSE2-NEXT: psrld %xmm7, %xmm3220; X86-SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm6[0]221; X86-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]222; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]223; X86-SSE2-NEXT: movdqa %xmm1, %xmm7224; X86-SSE2-NEXT: psrld %xmm6, %xmm7225; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]226; X86-SSE2-NEXT: psrld %xmm5, %xmm1227; X86-SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm7[1]228; X86-SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,3],xmm1[0,3]229; X86-SSE2-NEXT: pand %xmm4, %xmm2230; X86-SSE2-NEXT: pslld $23, %xmm2231; X86-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2232; X86-SSE2-NEXT: cvttps2dq %xmm2, %xmm1233; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]234; X86-SSE2-NEXT: pmuludq %xmm1, %xmm0235; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]236; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]237; X86-SSE2-NEXT: pmuludq %xmm2, %xmm1238; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]239; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]240; X86-SSE2-NEXT: por %xmm3, %xmm0241; X86-SSE2-NEXT: retl242 %res = call <2 x i32> @llvm.fshl.v2i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> %amt)243 ret <2 x i32> %res244}245 246;247; Uniform Variable Shifts248;249 250define <2 x i32> @splatvar_funnnel_v2i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> %amt) nounwind {251; SSE2-LABEL: splatvar_funnnel_v2i32:252; SSE2: # %bb.0:253; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,0,0]254; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [31,31,31,31]255; SSE2-NEXT: movdqa %xmm3, %xmm5256; SSE2-NEXT: pandn %xmm4, %xmm5257; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm5[2,3,3,3,4,5,6,7]258; SSE2-NEXT: psrld $1, %xmm1259; SSE2-NEXT: movdqa %xmm1, %xmm6260; SSE2-NEXT: psrld %xmm2, %xmm6261; SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm5[0,1,1,1,4,5,6,7]262; SSE2-NEXT: movdqa %xmm1, %xmm2263; SSE2-NEXT: psrld %xmm7, %xmm2264; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm6[0]265; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]266; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]267; SSE2-NEXT: movdqa %xmm1, %xmm7268; SSE2-NEXT: psrld %xmm6, %xmm7269; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]270; SSE2-NEXT: psrld %xmm5, %xmm1271; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm7[1]272; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm1[0,3]273; SSE2-NEXT: pand %xmm4, %xmm3274; SSE2-NEXT: pslld $23, %xmm3275; SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3276; SSE2-NEXT: cvttps2dq %xmm3, %xmm1277; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]278; SSE2-NEXT: pmuludq %xmm1, %xmm0279; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]280; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]281; SSE2-NEXT: pmuludq %xmm3, %xmm1282; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]283; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]284; SSE2-NEXT: por %xmm2, %xmm0285; SSE2-NEXT: retq286;287; SSE41-LABEL: splatvar_funnnel_v2i32:288; SSE41: # %bb.0:289; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]290; SSE41-NEXT: pmovsxbd {{.*#+}} xmm3 = [31,31,31,31]291; SSE41-NEXT: movdqa %xmm2, %xmm4292; SSE41-NEXT: pandn %xmm3, %xmm4293; SSE41-NEXT: pshuflw {{.*#+}} xmm5 = xmm4[2,3,3,3,4,5,6,7]294; SSE41-NEXT: psrld $1, %xmm1295; SSE41-NEXT: movdqa %xmm1, %xmm6296; SSE41-NEXT: psrld %xmm5, %xmm6297; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[2,3,2,3]298; SSE41-NEXT: pshuflw {{.*#+}} xmm7 = xmm5[2,3,3,3,4,5,6,7]299; SSE41-NEXT: movdqa %xmm1, %xmm8300; SSE41-NEXT: psrld %xmm7, %xmm8301; SSE41-NEXT: pblendw {{.*#+}} xmm8 = xmm6[0,1,2,3],xmm8[4,5,6,7]302; SSE41-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,1,1,1,4,5,6,7]303; SSE41-NEXT: movdqa %xmm1, %xmm6304; SSE41-NEXT: psrld %xmm4, %xmm6305; SSE41-NEXT: pshuflw {{.*#+}} xmm4 = xmm5[0,1,1,1,4,5,6,7]306; SSE41-NEXT: psrld %xmm4, %xmm1307; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm1[4,5,6,7]308; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1],xmm8[2,3],xmm6[4,5],xmm8[6,7]309; SSE41-NEXT: pand %xmm3, %xmm2310; SSE41-NEXT: pslld $23, %xmm2311; SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2312; SSE41-NEXT: cvttps2dq %xmm2, %xmm1313; SSE41-NEXT: pmulld %xmm1, %xmm0314; SSE41-NEXT: por %xmm6, %xmm0315; SSE41-NEXT: retq316;317; AVX1-LABEL: splatvar_funnnel_v2i32:318; AVX1: # %bb.0:319; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]320; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]321; AVX1-NEXT: vpandn %xmm3, %xmm2, %xmm4322; AVX1-NEXT: vpsrldq {{.*#+}} xmm5 = xmm4[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero323; AVX1-NEXT: vpsrld $1, %xmm1, %xmm1324; AVX1-NEXT: vpsrld %xmm5, %xmm1, %xmm5325; AVX1-NEXT: vpsrlq $32, %xmm4, %xmm6326; AVX1-NEXT: vpsrld %xmm6, %xmm1, %xmm6327; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1,2,3],xmm5[4,5,6,7]328; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm6329; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm4[2],xmm6[2],xmm4[3],xmm6[3]330; AVX1-NEXT: vpsrld %xmm6, %xmm1, %xmm6331; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero332; AVX1-NEXT: vpsrld %xmm4, %xmm1, %xmm1333; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm6[4,5,6,7]334; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,3],xmm1[4,5],xmm5[6,7]335; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2336; AVX1-NEXT: vpslld $23, %xmm2, %xmm2337; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2338; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2339; AVX1-NEXT: vpmulld %xmm2, %xmm0, %xmm0340; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0341; AVX1-NEXT: retq342;343; AVX2-LABEL: splatvar_funnnel_v2i32:344; AVX2: # %bb.0:345; AVX2-NEXT: vpbroadcastd %xmm2, %xmm3346; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm4 = [31,31,31,31]347; AVX2-NEXT: vpandn %xmm4, %xmm3, %xmm3348; AVX2-NEXT: vpsrld $1, %xmm1, %xmm1349; AVX2-NEXT: vpsrlvd %xmm3, %xmm1, %xmm1350; AVX2-NEXT: vpand %xmm4, %xmm2, %xmm2351; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero352; AVX2-NEXT: vpslld %xmm2, %xmm0, %xmm0353; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0354; AVX2-NEXT: retq355;356; AVX512F-LABEL: splatvar_funnnel_v2i32:357; AVX512F: # %bb.0:358; AVX512F-NEXT: vpbroadcastd %xmm2, %xmm3359; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm4 = [31,31,31,31]360; AVX512F-NEXT: vpandn %xmm4, %xmm3, %xmm3361; AVX512F-NEXT: vpsrld $1, %xmm1, %xmm1362; AVX512F-NEXT: vpsrlvd %xmm3, %xmm1, %xmm1363; AVX512F-NEXT: vpand %xmm4, %xmm2, %xmm2364; AVX512F-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero365; AVX512F-NEXT: vpslld %xmm2, %xmm0, %xmm0366; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm0367; AVX512F-NEXT: retq368;369; AVX512VL-LABEL: splatvar_funnnel_v2i32:370; AVX512VL: # %bb.0:371; AVX512VL-NEXT: vpbroadcastd %xmm2, %xmm3372; AVX512VL-NEXT: vpbroadcastd {{.*#+}} xmm4 = [31,31,31,31]373; AVX512VL-NEXT: vpandn %xmm4, %xmm3, %xmm3374; AVX512VL-NEXT: vpsrld $1, %xmm1, %xmm1375; AVX512VL-NEXT: vpsrlvd %xmm3, %xmm1, %xmm1376; AVX512VL-NEXT: vpand %xmm4, %xmm2, %xmm2377; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero378; AVX512VL-NEXT: vpslld %xmm2, %xmm0, %xmm0379; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm0380; AVX512VL-NEXT: retq381;382; AVX512BW-LABEL: splatvar_funnnel_v2i32:383; AVX512BW: # %bb.0:384; AVX512BW-NEXT: vpbroadcastd %xmm2, %xmm3385; AVX512BW-NEXT: vpbroadcastd {{.*#+}} xmm4 = [31,31,31,31]386; AVX512BW-NEXT: vpandn %xmm4, %xmm3, %xmm3387; AVX512BW-NEXT: vpsrld $1, %xmm1, %xmm1388; AVX512BW-NEXT: vpsrlvd %xmm3, %xmm1, %xmm1389; AVX512BW-NEXT: vpand %xmm4, %xmm2, %xmm2390; AVX512BW-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero391; AVX512BW-NEXT: vpslld %xmm2, %xmm0, %xmm0392; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm0393; AVX512BW-NEXT: retq394;395; AVX512VLBW-LABEL: splatvar_funnnel_v2i32:396; AVX512VLBW: # %bb.0:397; AVX512VLBW-NEXT: vpbroadcastd %xmm2, %xmm3398; AVX512VLBW-NEXT: vpbroadcastd {{.*#+}} xmm4 = [31,31,31,31]399; AVX512VLBW-NEXT: vpandn %xmm4, %xmm3, %xmm3400; AVX512VLBW-NEXT: vpsrld $1, %xmm1, %xmm1401; AVX512VLBW-NEXT: vpsrlvd %xmm3, %xmm1, %xmm1402; AVX512VLBW-NEXT: vpand %xmm4, %xmm2, %xmm2403; AVX512VLBW-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero404; AVX512VLBW-NEXT: vpslld %xmm2, %xmm0, %xmm0405; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm0406; AVX512VLBW-NEXT: retq407;408; AVX512VBMI2-LABEL: splatvar_funnnel_v2i32:409; AVX512VBMI2: # %bb.0:410; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1411; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0412; AVX512VBMI2-NEXT: vpbroadcastd %xmm2, %xmm2413; AVX512VBMI2-NEXT: vpshldvd %zmm2, %zmm1, %zmm0414; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0415; AVX512VBMI2-NEXT: vzeroupper416; AVX512VBMI2-NEXT: retq417;418; AVX512VLVBMI2-LABEL: splatvar_funnnel_v2i32:419; AVX512VLVBMI2: # %bb.0:420; AVX512VLVBMI2-NEXT: vpbroadcastd %xmm2, %xmm2421; AVX512VLVBMI2-NEXT: vpshldvd %xmm2, %xmm1, %xmm0422; AVX512VLVBMI2-NEXT: retq423;424; XOPAVX1-LABEL: splatvar_funnnel_v2i32:425; XOPAVX1: # %bb.0:426; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]427; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]428; XOPAVX1-NEXT: vpand %xmm3, %xmm2, %xmm4429; XOPAVX1-NEXT: vpshld %xmm4, %xmm0, %xmm0430; XOPAVX1-NEXT: vpandn %xmm3, %xmm2, %xmm2431; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3432; XOPAVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2433; XOPAVX1-NEXT: vpsrld $1, %xmm1, %xmm1434; XOPAVX1-NEXT: vpshld %xmm2, %xmm1, %xmm1435; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0436; XOPAVX1-NEXT: retq437;438; XOPAVX2-LABEL: splatvar_funnnel_v2i32:439; XOPAVX2: # %bb.0:440; XOPAVX2-NEXT: vpbroadcastd %xmm2, %xmm3441; XOPAVX2-NEXT: vpbroadcastd {{.*#+}} xmm4 = [31,31,31,31]442; XOPAVX2-NEXT: vpandn %xmm4, %xmm3, %xmm3443; XOPAVX2-NEXT: vpsrld $1, %xmm1, %xmm1444; XOPAVX2-NEXT: vpsrlvd %xmm3, %xmm1, %xmm1445; XOPAVX2-NEXT: vpand %xmm4, %xmm2, %xmm2446; XOPAVX2-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero447; XOPAVX2-NEXT: vpslld %xmm2, %xmm0, %xmm0448; XOPAVX2-NEXT: vpor %xmm1, %xmm0, %xmm0449; XOPAVX2-NEXT: retq450;451; X86-SSE2-LABEL: splatvar_funnnel_v2i32:452; X86-SSE2: # %bb.0:453; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,0,0]454; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [31,31,31,31]455; X86-SSE2-NEXT: movdqa %xmm3, %xmm5456; X86-SSE2-NEXT: pandn %xmm4, %xmm5457; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm5[2,3,3,3,4,5,6,7]458; X86-SSE2-NEXT: psrld $1, %xmm1459; X86-SSE2-NEXT: movdqa %xmm1, %xmm6460; X86-SSE2-NEXT: psrld %xmm2, %xmm6461; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm5[0,1,1,1,4,5,6,7]462; X86-SSE2-NEXT: movdqa %xmm1, %xmm2463; X86-SSE2-NEXT: psrld %xmm7, %xmm2464; X86-SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm6[0]465; X86-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]466; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]467; X86-SSE2-NEXT: movdqa %xmm1, %xmm7468; X86-SSE2-NEXT: psrld %xmm6, %xmm7469; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]470; X86-SSE2-NEXT: psrld %xmm5, %xmm1471; X86-SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm7[1]472; X86-SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm1[0,3]473; X86-SSE2-NEXT: pand %xmm4, %xmm3474; X86-SSE2-NEXT: pslld $23, %xmm3475; X86-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3476; X86-SSE2-NEXT: cvttps2dq %xmm3, %xmm1477; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]478; X86-SSE2-NEXT: pmuludq %xmm1, %xmm0479; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]480; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]481; X86-SSE2-NEXT: pmuludq %xmm3, %xmm1482; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]483; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]484; X86-SSE2-NEXT: por %xmm2, %xmm0485; X86-SSE2-NEXT: retl486 %splat = shufflevector <2 x i32> %amt, <2 x i32> undef, <2 x i32> zeroinitializer487 %res = call <2 x i32> @llvm.fshl.v2i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> %splat)488 ret <2 x i32> %res489}490 491;492; Constant Shifts493;494 495define <2 x i32> @constant_funnnel_v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {496; SSE2-LABEL: constant_funnnel_v2i32:497; SSE2: # %bb.0:498; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]499; SSE2-NEXT: psrld $28, %xmm1500; SSE2-NEXT: psrld $27, %xmm2501; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]502; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]503; SSE2-NEXT: pslld $4, %xmm0504; SSE2-NEXT: pslld $5, %xmm2505; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]506; SSE2-NEXT: por %xmm1, %xmm0507; SSE2-NEXT: retq508;509; SSE41-LABEL: constant_funnnel_v2i32:510; SSE41: # %bb.0:511; SSE41-NEXT: movdqa %xmm1, %xmm2512; SSE41-NEXT: psrld $27, %xmm2513; SSE41-NEXT: psrld $28, %xmm1514; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5,6,7]515; SSE41-NEXT: movdqa %xmm0, %xmm1516; SSE41-NEXT: pslld $5, %xmm1517; SSE41-NEXT: pslld $4, %xmm0518; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]519; SSE41-NEXT: por %xmm2, %xmm0520; SSE41-NEXT: retq521;522; AVX1-LABEL: constant_funnnel_v2i32:523; AVX1: # %bb.0:524; AVX1-NEXT: vpsrld $27, %xmm1, %xmm2525; AVX1-NEXT: vpsrld $28, %xmm1, %xmm1526; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5,6,7]527; AVX1-NEXT: vpslld $5, %xmm0, %xmm2528; AVX1-NEXT: vpslld $4, %xmm0, %xmm0529; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5,6,7]530; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0531; AVX1-NEXT: retq532;533; AVX2-LABEL: constant_funnnel_v2i32:534; AVX2: # %bb.0:535; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1536; AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0537; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0538; AVX2-NEXT: retq539;540; AVX512F-LABEL: constant_funnnel_v2i32:541; AVX512F: # %bb.0:542; AVX512F-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1543; AVX512F-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0544; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm0545; AVX512F-NEXT: retq546;547; AVX512VL-LABEL: constant_funnnel_v2i32:548; AVX512VL: # %bb.0:549; AVX512VL-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1550; AVX512VL-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0551; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm0552; AVX512VL-NEXT: retq553;554; AVX512BW-LABEL: constant_funnnel_v2i32:555; AVX512BW: # %bb.0:556; AVX512BW-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1557; AVX512BW-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0558; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm0559; AVX512BW-NEXT: retq560;561; AVX512VLBW-LABEL: constant_funnnel_v2i32:562; AVX512VLBW: # %bb.0:563; AVX512VLBW-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1564; AVX512VLBW-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0565; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm0566; AVX512VLBW-NEXT: retq567;568; AVX512VBMI2-LABEL: constant_funnnel_v2i32:569; AVX512VBMI2: # %bb.0:570; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1571; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0572; AVX512VBMI2-NEXT: vpmovsxbd {{.*#+}} xmm2 = [4,5,0,0]573; AVX512VBMI2-NEXT: vpshldvd %zmm2, %zmm1, %zmm0574; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0575; AVX512VBMI2-NEXT: vzeroupper576; AVX512VBMI2-NEXT: retq577;578; AVX512VLVBMI2-LABEL: constant_funnnel_v2i32:579; AVX512VLVBMI2: # %bb.0:580; AVX512VLVBMI2-NEXT: vpshldvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0581; AVX512VLVBMI2-NEXT: retq582;583; XOPAVX1-LABEL: constant_funnnel_v2i32:584; XOPAVX1: # %bb.0:585; XOPAVX1-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1586; XOPAVX1-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0587; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0588; XOPAVX1-NEXT: retq589;590; XOPAVX2-LABEL: constant_funnnel_v2i32:591; XOPAVX2: # %bb.0:592; XOPAVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1593; XOPAVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0594; XOPAVX2-NEXT: vpor %xmm1, %xmm0, %xmm0595; XOPAVX2-NEXT: retq596;597; X86-SSE2-LABEL: constant_funnnel_v2i32:598; X86-SSE2: # %bb.0:599; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]600; X86-SSE2-NEXT: psrld $28, %xmm1601; X86-SSE2-NEXT: psrld $27, %xmm2602; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]603; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]604; X86-SSE2-NEXT: pslld $4, %xmm0605; X86-SSE2-NEXT: pslld $5, %xmm2606; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]607; X86-SSE2-NEXT: por %xmm1, %xmm0608; X86-SSE2-NEXT: retl609 %res = call <2 x i32> @llvm.fshl.v2i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 4, i32 5>)610 ret <2 x i32> %res611}612 613;614; Uniform Constant Shifts615;616 617define <2 x i32> @splatconstant_funnnel_v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {618; SSE-LABEL: splatconstant_funnnel_v2i32:619; SSE: # %bb.0:620; SSE-NEXT: psrld $28, %xmm1621; SSE-NEXT: pslld $4, %xmm0622; SSE-NEXT: por %xmm1, %xmm0623; SSE-NEXT: retq624;625; AVX-LABEL: splatconstant_funnnel_v2i32:626; AVX: # %bb.0:627; AVX-NEXT: vpsrld $28, %xmm1, %xmm1628; AVX-NEXT: vpslld $4, %xmm0, %xmm0629; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0630; AVX-NEXT: retq631;632; AVX512VBMI2-LABEL: splatconstant_funnnel_v2i32:633; AVX512VBMI2: # %bb.0:634; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1635; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0636; AVX512VBMI2-NEXT: vpshldd $4, %zmm1, %zmm0, %zmm0637; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0638; AVX512VBMI2-NEXT: vzeroupper639; AVX512VBMI2-NEXT: retq640;641; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v2i32:642; AVX512VLVBMI2: # %bb.0:643; AVX512VLVBMI2-NEXT: vpshldd $4, %xmm1, %xmm0, %xmm0644; AVX512VLVBMI2-NEXT: retq645;646; XOP-LABEL: splatconstant_funnnel_v2i32:647; XOP: # %bb.0:648; XOP-NEXT: vpsrld $28, %xmm1, %xmm1649; XOP-NEXT: vpslld $4, %xmm0, %xmm0650; XOP-NEXT: vpor %xmm1, %xmm0, %xmm0651; XOP-NEXT: retq652;653; X86-SSE2-LABEL: splatconstant_funnnel_v2i32:654; X86-SSE2: # %bb.0:655; X86-SSE2-NEXT: psrld $28, %xmm1656; X86-SSE2-NEXT: pslld $4, %xmm0657; X86-SSE2-NEXT: por %xmm1, %xmm0658; X86-SSE2-NEXT: retl659 %res = call <2 x i32> @llvm.fshl.v2i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 4, i32 4>)660 ret <2 x i32> %res661}662