665 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.fshr.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: pand %xmm4, %xmm530; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[2,3,3,3,4,5,6,7]31; SSE2-NEXT: movdqa %xmm1, %xmm632; SSE2-NEXT: psrld %xmm3, %xmm633; SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm5[0,1,1,1,4,5,6,7]34; SSE2-NEXT: movdqa %xmm1, %xmm335; SSE2-NEXT: psrld %xmm7, %xmm336; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm6[0]37; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]38; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]39; SSE2-NEXT: movdqa %xmm1, %xmm740; SSE2-NEXT: psrld %xmm6, %xmm741; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]42; SSE2-NEXT: psrld %xmm5, %xmm143; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm7[1]44; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,3],xmm1[0,3]45; SSE2-NEXT: pandn %xmm4, %xmm246; SSE2-NEXT: pslld $23, %xmm247; SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm248; SSE2-NEXT: cvttps2dq %xmm2, %xmm149; SSE2-NEXT: paddd %xmm0, %xmm050; 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: pand %xmm3, %xmm465; SSE41-NEXT: pshuflw {{.*#+}} xmm5 = xmm4[2,3,3,3,4,5,6,7]66; SSE41-NEXT: movdqa %xmm1, %xmm667; SSE41-NEXT: psrld %xmm5, %xmm668; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[2,3,2,3]69; SSE41-NEXT: pshuflw {{.*#+}} xmm7 = xmm5[2,3,3,3,4,5,6,7]70; SSE41-NEXT: movdqa %xmm1, %xmm871; SSE41-NEXT: psrld %xmm7, %xmm872; SSE41-NEXT: pblendw {{.*#+}} xmm8 = xmm6[0,1,2,3],xmm8[4,5,6,7]73; SSE41-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,1,1,1,4,5,6,7]74; SSE41-NEXT: movdqa %xmm1, %xmm675; SSE41-NEXT: psrld %xmm4, %xmm676; SSE41-NEXT: pshuflw {{.*#+}} xmm4 = xmm5[0,1,1,1,4,5,6,7]77; SSE41-NEXT: psrld %xmm4, %xmm178; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm1[4,5,6,7]79; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1],xmm8[2,3],xmm6[4,5],xmm8[6,7]80; SSE41-NEXT: pandn %xmm3, %xmm281; SSE41-NEXT: pslld $23, %xmm282; SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm283; SSE41-NEXT: cvttps2dq %xmm2, %xmm184; SSE41-NEXT: paddd %xmm0, %xmm085; 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: vpand %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 %xmm5, %xmm1, %xmm595; AVX1-NEXT: vpsrlq $32, %xmm4, %xmm696; AVX1-NEXT: vpsrld %xmm6, %xmm1, %xmm697; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1,2,3],xmm5[4,5,6,7]98; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm699; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm4[2],xmm6[2],xmm4[3],xmm6[3]100; AVX1-NEXT: vpsrld %xmm6, %xmm1, %xmm6101; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero102; AVX1-NEXT: vpsrld %xmm4, %xmm1, %xmm1103; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm6[4,5,6,7]104; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,3],xmm1[4,5],xmm5[6,7]105; AVX1-NEXT: vpandn %xmm3, %xmm2, %xmm2106; AVX1-NEXT: vpslld $23, %xmm2, %xmm2107; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2108; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2109; AVX1-NEXT: vpaddd %xmm0, %xmm0, %xmm0110; 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: vpand %xmm3, %xmm2, %xmm4118; AVX2-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1119; AVX2-NEXT: vpandn %xmm3, %xmm2, %xmm2120; AVX2-NEXT: vpaddd %xmm0, %xmm0, %xmm0121; 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: vpand %xmm3, %xmm2, %xmm4129; AVX512F-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1130; AVX512F-NEXT: vpandn %xmm3, %xmm2, %xmm2131; AVX512F-NEXT: vpaddd %xmm0, %xmm0, %xmm0132; 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: vpand %xmm3, %xmm2, %xmm4140; AVX512VL-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1141; AVX512VL-NEXT: vpandn %xmm3, %xmm2, %xmm2142; AVX512VL-NEXT: vpaddd %xmm0, %xmm0, %xmm0143; 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: vpand %xmm3, %xmm2, %xmm4151; AVX512BW-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1152; AVX512BW-NEXT: vpandn %xmm3, %xmm2, %xmm2153; AVX512BW-NEXT: vpaddd %xmm0, %xmm0, %xmm0154; 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: vpand %xmm3, %xmm2, %xmm4162; AVX512VLBW-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1163; AVX512VLBW-NEXT: vpandn %xmm3, %xmm2, %xmm2164; AVX512VLBW-NEXT: vpaddd %xmm0, %xmm0, %xmm0165; 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: vpshrdvd %zmm2, %zmm0, %zmm1175; AVX512VBMI2-NEXT: vmovdqa %xmm1, %xmm0176; AVX512VBMI2-NEXT: vzeroupper177; AVX512VBMI2-NEXT: retq178;179; AVX512VLVBMI2-LABEL: var_funnnel_v2i32:180; AVX512VLVBMI2: # %bb.0:181; AVX512VLVBMI2-NEXT: vpshrdvd %xmm2, %xmm0, %xmm1182; AVX512VLVBMI2-NEXT: vmovdqa %xmm1, %xmm0183; AVX512VLVBMI2-NEXT: retq184;185; XOPAVX1-LABEL: var_funnnel_v2i32:186; XOPAVX1: # %bb.0:187; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]188; XOPAVX1-NEXT: vpandn %xmm3, %xmm2, %xmm4189; XOPAVX1-NEXT: vpaddd %xmm0, %xmm0, %xmm0190; XOPAVX1-NEXT: vpshld %xmm4, %xmm0, %xmm0191; XOPAVX1-NEXT: vpand %xmm3, %xmm2, %xmm2192; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3193; XOPAVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2194; XOPAVX1-NEXT: vpshld %xmm2, %xmm1, %xmm1195; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0196; XOPAVX1-NEXT: retq197;198; XOPAVX2-LABEL: var_funnnel_v2i32:199; XOPAVX2: # %bb.0:200; XOPAVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]201; XOPAVX2-NEXT: vpand %xmm3, %xmm2, %xmm4202; XOPAVX2-NEXT: vpsrlvd %xmm4, %xmm1, %xmm1203; XOPAVX2-NEXT: vpandn %xmm3, %xmm2, %xmm2204; XOPAVX2-NEXT: vpaddd %xmm0, %xmm0, %xmm0205; XOPAVX2-NEXT: vpsllvd %xmm2, %xmm0, %xmm0206; XOPAVX2-NEXT: vpor %xmm1, %xmm0, %xmm0207; XOPAVX2-NEXT: retq208;209; X86-SSE2-LABEL: var_funnnel_v2i32:210; X86-SSE2: # %bb.0:211; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [31,31,31,31]212; X86-SSE2-NEXT: movdqa %xmm2, %xmm5213; X86-SSE2-NEXT: pand %xmm4, %xmm5214; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[2,3,3,3,4,5,6,7]215; 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: pandn %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: paddd %xmm0, %xmm0234; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]235; X86-SSE2-NEXT: pmuludq %xmm1, %xmm0236; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]237; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]238; X86-SSE2-NEXT: pmuludq %xmm2, %xmm1239; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]240; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]241; X86-SSE2-NEXT: por %xmm3, %xmm0242; X86-SSE2-NEXT: retl243 %res = call <2 x i32> @llvm.fshr.v2i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> %amt)244 ret <2 x i32> %res245}246 247;248; Uniform Variable Shifts249;250 251define <2 x i32> @splatvar_funnnel_v2i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> %amt) nounwind {252; SSE2-LABEL: splatvar_funnnel_v2i32:253; SSE2: # %bb.0:254; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,0,0]255; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [31,31,31,31]256; SSE2-NEXT: movdqa %xmm3, %xmm5257; SSE2-NEXT: pand %xmm4, %xmm5258; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm5[2,3,3,3,4,5,6,7]259; 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: pandn %xmm4, %xmm3274; SSE2-NEXT: pslld $23, %xmm3275; SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3276; SSE2-NEXT: cvttps2dq %xmm3, %xmm1277; SSE2-NEXT: paddd %xmm0, %xmm0278; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]279; SSE2-NEXT: pmuludq %xmm1, %xmm0280; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]281; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]282; SSE2-NEXT: pmuludq %xmm3, %xmm1283; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]284; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]285; SSE2-NEXT: por %xmm2, %xmm0286; SSE2-NEXT: retq287;288; SSE41-LABEL: splatvar_funnnel_v2i32:289; SSE41: # %bb.0:290; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]291; SSE41-NEXT: pmovsxbd {{.*#+}} xmm3 = [31,31,31,31]292; SSE41-NEXT: movdqa %xmm2, %xmm4293; SSE41-NEXT: pand %xmm3, %xmm4294; SSE41-NEXT: pshuflw {{.*#+}} xmm5 = xmm4[2,3,3,3,4,5,6,7]295; 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: pandn %xmm3, %xmm2310; SSE41-NEXT: pslld $23, %xmm2311; SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2312; SSE41-NEXT: cvttps2dq %xmm2, %xmm1313; SSE41-NEXT: paddd %xmm0, %xmm0314; SSE41-NEXT: pmulld %xmm1, %xmm0315; SSE41-NEXT: por %xmm6, %xmm0316; SSE41-NEXT: retq317;318; AVX1-LABEL: splatvar_funnnel_v2i32:319; AVX1: # %bb.0:320; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]321; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]322; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm4323; AVX1-NEXT: vpsrldq {{.*#+}} xmm5 = xmm4[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero324; 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: vpandn %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: vpaddd %xmm0, %xmm0, %xmm0340; AVX1-NEXT: vpmulld %xmm2, %xmm0, %xmm0341; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0342; AVX1-NEXT: retq343;344; AVX2-LABEL: splatvar_funnnel_v2i32:345; AVX2: # %bb.0:346; AVX2-NEXT: vpbroadcastd %xmm2, %xmm3347; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm4 = [31,31,31,31]348; AVX2-NEXT: vpand %xmm4, %xmm2, %xmm2349; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero350; AVX2-NEXT: vpsrld %xmm2, %xmm1, %xmm1351; AVX2-NEXT: vpandn %xmm4, %xmm3, %xmm2352; AVX2-NEXT: vpaddd %xmm0, %xmm0, %xmm0353; AVX2-NEXT: vpsllvd %xmm2, %xmm0, %xmm0354; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0355; AVX2-NEXT: retq356;357; AVX512F-LABEL: splatvar_funnnel_v2i32:358; AVX512F: # %bb.0:359; AVX512F-NEXT: vpbroadcastd %xmm2, %xmm3360; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm4 = [31,31,31,31]361; AVX512F-NEXT: vpand %xmm4, %xmm2, %xmm2362; AVX512F-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero363; AVX512F-NEXT: vpsrld %xmm2, %xmm1, %xmm1364; AVX512F-NEXT: vpandn %xmm4, %xmm3, %xmm2365; AVX512F-NEXT: vpaddd %xmm0, %xmm0, %xmm0366; AVX512F-NEXT: vpsllvd %xmm2, %xmm0, %xmm0367; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm0368; AVX512F-NEXT: retq369;370; AVX512VL-LABEL: splatvar_funnnel_v2i32:371; AVX512VL: # %bb.0:372; AVX512VL-NEXT: vpbroadcastd %xmm2, %xmm3373; AVX512VL-NEXT: vpbroadcastd {{.*#+}} xmm4 = [31,31,31,31]374; AVX512VL-NEXT: vpand %xmm4, %xmm2, %xmm2375; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero376; AVX512VL-NEXT: vpsrld %xmm2, %xmm1, %xmm1377; AVX512VL-NEXT: vpandn %xmm4, %xmm3, %xmm2378; AVX512VL-NEXT: vpaddd %xmm0, %xmm0, %xmm0379; AVX512VL-NEXT: vpsllvd %xmm2, %xmm0, %xmm0380; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm0381; AVX512VL-NEXT: retq382;383; AVX512BW-LABEL: splatvar_funnnel_v2i32:384; AVX512BW: # %bb.0:385; AVX512BW-NEXT: vpbroadcastd %xmm2, %xmm3386; AVX512BW-NEXT: vpbroadcastd {{.*#+}} xmm4 = [31,31,31,31]387; AVX512BW-NEXT: vpand %xmm4, %xmm2, %xmm2388; AVX512BW-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero389; AVX512BW-NEXT: vpsrld %xmm2, %xmm1, %xmm1390; AVX512BW-NEXT: vpandn %xmm4, %xmm3, %xmm2391; AVX512BW-NEXT: vpaddd %xmm0, %xmm0, %xmm0392; AVX512BW-NEXT: vpsllvd %xmm2, %xmm0, %xmm0393; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm0394; AVX512BW-NEXT: retq395;396; AVX512VLBW-LABEL: splatvar_funnnel_v2i32:397; AVX512VLBW: # %bb.0:398; AVX512VLBW-NEXT: vpbroadcastd %xmm2, %xmm3399; AVX512VLBW-NEXT: vpbroadcastd {{.*#+}} xmm4 = [31,31,31,31]400; AVX512VLBW-NEXT: vpand %xmm4, %xmm2, %xmm2401; AVX512VLBW-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero402; AVX512VLBW-NEXT: vpsrld %xmm2, %xmm1, %xmm1403; AVX512VLBW-NEXT: vpandn %xmm4, %xmm3, %xmm2404; AVX512VLBW-NEXT: vpaddd %xmm0, %xmm0, %xmm0405; AVX512VLBW-NEXT: vpsllvd %xmm2, %xmm0, %xmm0406; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm0407; AVX512VLBW-NEXT: retq408;409; AVX512VBMI2-LABEL: splatvar_funnnel_v2i32:410; AVX512VBMI2: # %bb.0:411; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1412; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0413; AVX512VBMI2-NEXT: vpbroadcastd %xmm2, %xmm2414; AVX512VBMI2-NEXT: vpshrdvd %zmm2, %zmm0, %zmm1415; AVX512VBMI2-NEXT: vmovdqa %xmm1, %xmm0416; AVX512VBMI2-NEXT: vzeroupper417; AVX512VBMI2-NEXT: retq418;419; AVX512VLVBMI2-LABEL: splatvar_funnnel_v2i32:420; AVX512VLVBMI2: # %bb.0:421; AVX512VLVBMI2-NEXT: vpbroadcastd %xmm2, %xmm2422; AVX512VLVBMI2-NEXT: vpshrdvd %xmm2, %xmm0, %xmm1423; AVX512VLVBMI2-NEXT: vmovdqa %xmm1, %xmm0424; AVX512VLVBMI2-NEXT: retq425;426; XOPAVX1-LABEL: splatvar_funnnel_v2i32:427; XOPAVX1: # %bb.0:428; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]429; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]430; XOPAVX1-NEXT: vpandn %xmm3, %xmm2, %xmm4431; XOPAVX1-NEXT: vpaddd %xmm0, %xmm0, %xmm0432; XOPAVX1-NEXT: vpshld %xmm4, %xmm0, %xmm0433; XOPAVX1-NEXT: vpand %xmm3, %xmm2, %xmm2434; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3435; XOPAVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2436; XOPAVX1-NEXT: vpshld %xmm2, %xmm1, %xmm1437; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0438; XOPAVX1-NEXT: retq439;440; XOPAVX2-LABEL: splatvar_funnnel_v2i32:441; XOPAVX2: # %bb.0:442; XOPAVX2-NEXT: vpbroadcastd %xmm2, %xmm3443; XOPAVX2-NEXT: vpbroadcastd {{.*#+}} xmm4 = [31,31,31,31]444; XOPAVX2-NEXT: vpand %xmm4, %xmm2, %xmm2445; XOPAVX2-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero446; XOPAVX2-NEXT: vpsrld %xmm2, %xmm1, %xmm1447; XOPAVX2-NEXT: vpandn %xmm4, %xmm3, %xmm2448; XOPAVX2-NEXT: vpaddd %xmm0, %xmm0, %xmm0449; XOPAVX2-NEXT: vpsllvd %xmm2, %xmm0, %xmm0450; XOPAVX2-NEXT: vpor %xmm1, %xmm0, %xmm0451; XOPAVX2-NEXT: retq452;453; X86-SSE2-LABEL: splatvar_funnnel_v2i32:454; X86-SSE2: # %bb.0:455; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,0,0]456; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [31,31,31,31]457; X86-SSE2-NEXT: movdqa %xmm3, %xmm5458; X86-SSE2-NEXT: pand %xmm4, %xmm5459; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm5[2,3,3,3,4,5,6,7]460; X86-SSE2-NEXT: movdqa %xmm1, %xmm6461; X86-SSE2-NEXT: psrld %xmm2, %xmm6462; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm5[0,1,1,1,4,5,6,7]463; X86-SSE2-NEXT: movdqa %xmm1, %xmm2464; X86-SSE2-NEXT: psrld %xmm7, %xmm2465; X86-SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm6[0]466; X86-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]467; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]468; X86-SSE2-NEXT: movdqa %xmm1, %xmm7469; X86-SSE2-NEXT: psrld %xmm6, %xmm7470; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]471; X86-SSE2-NEXT: psrld %xmm5, %xmm1472; X86-SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm7[1]473; X86-SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm1[0,3]474; X86-SSE2-NEXT: pandn %xmm4, %xmm3475; X86-SSE2-NEXT: pslld $23, %xmm3476; X86-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3477; X86-SSE2-NEXT: cvttps2dq %xmm3, %xmm1478; X86-SSE2-NEXT: paddd %xmm0, %xmm0479; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]480; X86-SSE2-NEXT: pmuludq %xmm1, %xmm0481; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]482; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]483; X86-SSE2-NEXT: pmuludq %xmm3, %xmm1484; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]485; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]486; X86-SSE2-NEXT: por %xmm2, %xmm0487; X86-SSE2-NEXT: retl488 %splat = shufflevector <2 x i32> %amt, <2 x i32> undef, <2 x i32> zeroinitializer489 %res = call <2 x i32> @llvm.fshr.v2i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> %splat)490 ret <2 x i32> %res491}492 493;494; Constant Shifts495;496 497define <2 x i32> @constant_funnnel_v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {498; SSE2-LABEL: constant_funnnel_v2i32:499; SSE2: # %bb.0:500; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]501; SSE2-NEXT: psrld $4, %xmm1502; SSE2-NEXT: psrld $5, %xmm2503; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]504; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]505; SSE2-NEXT: pslld $28, %xmm0506; SSE2-NEXT: pslld $27, %xmm2507; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]508; SSE2-NEXT: por %xmm1, %xmm0509; SSE2-NEXT: retq510;511; SSE41-LABEL: constant_funnnel_v2i32:512; SSE41: # %bb.0:513; SSE41-NEXT: movdqa %xmm1, %xmm2514; SSE41-NEXT: psrld $5, %xmm2515; SSE41-NEXT: psrld $4, %xmm1516; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5,6,7]517; SSE41-NEXT: movdqa %xmm0, %xmm1518; SSE41-NEXT: pslld $27, %xmm1519; SSE41-NEXT: pslld $28, %xmm0520; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]521; SSE41-NEXT: por %xmm2, %xmm0522; SSE41-NEXT: retq523;524; AVX1-LABEL: constant_funnnel_v2i32:525; AVX1: # %bb.0:526; AVX1-NEXT: vpsrld $5, %xmm1, %xmm2527; AVX1-NEXT: vpsrld $4, %xmm1, %xmm1528; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5,6,7]529; AVX1-NEXT: vpslld $27, %xmm0, %xmm2530; AVX1-NEXT: vpslld $28, %xmm0, %xmm0531; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5,6,7]532; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0533; AVX1-NEXT: retq534;535; AVX2-LABEL: constant_funnnel_v2i32:536; AVX2: # %bb.0:537; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1538; AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0539; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0540; AVX2-NEXT: retq541;542; AVX512F-LABEL: constant_funnnel_v2i32:543; AVX512F: # %bb.0:544; AVX512F-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1545; AVX512F-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0546; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm0547; AVX512F-NEXT: retq548;549; AVX512VL-LABEL: constant_funnnel_v2i32:550; AVX512VL: # %bb.0:551; AVX512VL-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1552; AVX512VL-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0553; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm0554; AVX512VL-NEXT: retq555;556; AVX512BW-LABEL: constant_funnnel_v2i32:557; AVX512BW: # %bb.0:558; AVX512BW-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1559; AVX512BW-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0560; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm0561; AVX512BW-NEXT: retq562;563; AVX512VLBW-LABEL: constant_funnnel_v2i32:564; AVX512VLBW: # %bb.0:565; AVX512VLBW-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1566; AVX512VLBW-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0567; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm0568; AVX512VLBW-NEXT: retq569;570; AVX512VBMI2-LABEL: constant_funnnel_v2i32:571; AVX512VBMI2: # %bb.0:572; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1573; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0574; AVX512VBMI2-NEXT: vpmovsxbd {{.*#+}} xmm2 = [4,5,0,0]575; AVX512VBMI2-NEXT: vpshrdvd %zmm2, %zmm0, %zmm1576; AVX512VBMI2-NEXT: vmovdqa %xmm1, %xmm0577; AVX512VBMI2-NEXT: vzeroupper578; AVX512VBMI2-NEXT: retq579;580; AVX512VLVBMI2-LABEL: constant_funnnel_v2i32:581; AVX512VLVBMI2: # %bb.0:582; AVX512VLVBMI2-NEXT: vpshrdvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1583; AVX512VLVBMI2-NEXT: vmovdqa %xmm1, %xmm0584; AVX512VLVBMI2-NEXT: retq585;586; XOPAVX1-LABEL: constant_funnnel_v2i32:587; XOPAVX1: # %bb.0:588; XOPAVX1-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1589; XOPAVX1-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0590; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0591; XOPAVX1-NEXT: retq592;593; XOPAVX2-LABEL: constant_funnnel_v2i32:594; XOPAVX2: # %bb.0:595; XOPAVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1596; XOPAVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0597; XOPAVX2-NEXT: vpor %xmm1, %xmm0, %xmm0598; XOPAVX2-NEXT: retq599;600; X86-SSE2-LABEL: constant_funnnel_v2i32:601; X86-SSE2: # %bb.0:602; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]603; X86-SSE2-NEXT: psrld $4, %xmm1604; X86-SSE2-NEXT: psrld $5, %xmm2605; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]606; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]607; X86-SSE2-NEXT: pslld $28, %xmm0608; X86-SSE2-NEXT: pslld $27, %xmm2609; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]610; X86-SSE2-NEXT: por %xmm1, %xmm0611; X86-SSE2-NEXT: retl612 %res = call <2 x i32> @llvm.fshr.v2i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 4, i32 5>)613 ret <2 x i32> %res614}615 616;617; Uniform Constant Shifts618;619 620define <2 x i32> @splatconstant_funnnel_v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {621; SSE-LABEL: splatconstant_funnnel_v2i32:622; SSE: # %bb.0:623; SSE-NEXT: psrld $4, %xmm1624; SSE-NEXT: pslld $28, %xmm0625; SSE-NEXT: por %xmm1, %xmm0626; SSE-NEXT: retq627;628; AVX-LABEL: splatconstant_funnnel_v2i32:629; AVX: # %bb.0:630; AVX-NEXT: vpsrld $4, %xmm1, %xmm1631; AVX-NEXT: vpslld $28, %xmm0, %xmm0632; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0633; AVX-NEXT: retq634;635; AVX512VBMI2-LABEL: splatconstant_funnnel_v2i32:636; AVX512VBMI2: # %bb.0:637; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1638; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0639; AVX512VBMI2-NEXT: vpshrdd $4, %zmm0, %zmm1, %zmm0640; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0641; AVX512VBMI2-NEXT: vzeroupper642; AVX512VBMI2-NEXT: retq643;644; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v2i32:645; AVX512VLVBMI2: # %bb.0:646; AVX512VLVBMI2-NEXT: vpshrdd $4, %xmm0, %xmm1, %xmm0647; AVX512VLVBMI2-NEXT: retq648;649; XOP-LABEL: splatconstant_funnnel_v2i32:650; XOP: # %bb.0:651; XOP-NEXT: vpsrld $4, %xmm1, %xmm1652; XOP-NEXT: vpslld $28, %xmm0, %xmm0653; XOP-NEXT: vpor %xmm1, %xmm0, %xmm0654; XOP-NEXT: retq655;656; X86-SSE2-LABEL: splatconstant_funnnel_v2i32:657; X86-SSE2: # %bb.0:658; X86-SSE2-NEXT: psrld $4, %xmm1659; X86-SSE2-NEXT: pslld $28, %xmm0660; X86-SSE2-NEXT: por %xmm1, %xmm0661; X86-SSE2-NEXT: retl662 %res = call <2 x i32> @llvm.fshr.v2i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 4, i32 4>)663 ret <2 x i32> %res664}665