517 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-prefix=SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512F7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefix=AVX512VL8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=AVX512BW9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=AVX512VLBW10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2 | FileCheck %s --check-prefix=AVX512VBMI211; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2,+avx512vl | FileCheck %s --check-prefix=AVX512VLVBMI212; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX113; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX214 15; Just one 32-bit run to make sure we do reasonable things for i64 cases.16; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X86-SSE217 18declare <2 x 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> %amt) nounwind {25; SSE2-LABEL: var_funnnel_v2i32:26; SSE2: # %bb.0:27; SSE2-NEXT: pslld $23, %xmm128; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm129; SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm130; SSE2-NEXT: cvttps2dq %xmm1, %xmm131; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]32; SSE2-NEXT: pmuludq %xmm1, %xmm033; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]34; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]35; SSE2-NEXT: pmuludq %xmm2, %xmm136; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]37; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]38; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]39; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]40; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]41; SSE2-NEXT: por %xmm3, %xmm042; SSE2-NEXT: retq43;44; SSE41-LABEL: var_funnnel_v2i32:45; SSE41: # %bb.0:46; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]47; SSE41-NEXT: pslld $23, %xmm148; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm149; SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm150; SSE41-NEXT: cvttps2dq %xmm1, %xmm151; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]52; SSE41-NEXT: pmuludq %xmm2, %xmm353; SSE41-NEXT: pmuludq %xmm1, %xmm054; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]55; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]56; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]57; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]58; SSE41-NEXT: por %xmm1, %xmm059; SSE41-NEXT: retq60;61; AVX1-LABEL: var_funnnel_v2i32:62; AVX1: # %bb.0:63; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]64; AVX1-NEXT: vpslld $23, %xmm1, %xmm165; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm166; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm167; AVX1-NEXT: vcvttps2dq %xmm1, %xmm168; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]69; AVX1-NEXT: vpmuludq %xmm3, %xmm2, %xmm270; AVX1-NEXT: vpmuludq %xmm1, %xmm0, %xmm071; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]72; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]73; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,2,2]74; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]75; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm076; AVX1-NEXT: retq77;78; AVX2-LABEL: var_funnnel_v2i32:79; AVX2: # %bb.0:80; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [31,31,31,31]81; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm182; AVX2-NEXT: vpsllvd %xmm1, %xmm0, %xmm283; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]84; AVX2-NEXT: vpsubd %xmm1, %xmm3, %xmm185; AVX2-NEXT: vpsrlvd %xmm1, %xmm0, %xmm086; AVX2-NEXT: vpor %xmm0, %xmm2, %xmm087; AVX2-NEXT: retq88;89; AVX512F-LABEL: var_funnnel_v2i32:90; AVX512F: # %bb.0:91; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm192; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm093; AVX512F-NEXT: vprolvd %zmm1, %zmm0, %zmm094; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm095; AVX512F-NEXT: vzeroupper96; AVX512F-NEXT: retq97;98; AVX512VL-LABEL: var_funnnel_v2i32:99; AVX512VL: # %bb.0:100; AVX512VL-NEXT: vprolvd %xmm1, %xmm0, %xmm0101; AVX512VL-NEXT: retq102;103; AVX512BW-LABEL: var_funnnel_v2i32:104; AVX512BW: # %bb.0:105; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1106; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0107; AVX512BW-NEXT: vprolvd %zmm1, %zmm0, %zmm0108; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0109; AVX512BW-NEXT: vzeroupper110; AVX512BW-NEXT: retq111;112; AVX512VLBW-LABEL: var_funnnel_v2i32:113; AVX512VLBW: # %bb.0:114; AVX512VLBW-NEXT: vprolvd %xmm1, %xmm0, %xmm0115; AVX512VLBW-NEXT: retq116;117; AVX512VBMI2-LABEL: var_funnnel_v2i32:118; AVX512VBMI2: # %bb.0:119; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1120; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0121; AVX512VBMI2-NEXT: vprolvd %zmm1, %zmm0, %zmm0122; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0123; AVX512VBMI2-NEXT: vzeroupper124; AVX512VBMI2-NEXT: retq125;126; AVX512VLVBMI2-LABEL: var_funnnel_v2i32:127; AVX512VLVBMI2: # %bb.0:128; AVX512VLVBMI2-NEXT: vprolvd %xmm1, %xmm0, %xmm0129; AVX512VLVBMI2-NEXT: retq130;131; XOP-LABEL: var_funnnel_v2i32:132; XOP: # %bb.0:133; XOP-NEXT: vprotd %xmm1, %xmm0, %xmm0134; XOP-NEXT: retq135;136; X86-SSE2-LABEL: var_funnnel_v2i32:137; X86-SSE2: # %bb.0:138; X86-SSE2-NEXT: pslld $23, %xmm1139; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1140; X86-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1141; X86-SSE2-NEXT: cvttps2dq %xmm1, %xmm1142; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]143; X86-SSE2-NEXT: pmuludq %xmm1, %xmm0144; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]145; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]146; X86-SSE2-NEXT: pmuludq %xmm2, %xmm1147; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]148; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]149; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]150; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]151; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]152; X86-SSE2-NEXT: por %xmm3, %xmm0153; X86-SSE2-NEXT: retl154 %res = call <2 x i32> @llvm.fshl.v2i32(<2 x i32> %x, <2 x i32> %x, <2 x i32> %amt)155 ret <2 x i32> %res156}157 158;159; Uniform Variable Shifts160;161 162define <2 x i32> @splatvar_funnnel_v2i32(<2 x i32> %x, <2 x i32> %amt) nounwind {163; SSE2-LABEL: splatvar_funnnel_v2i32:164; SSE2: # %bb.0:165; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]166; SSE2-NEXT: pslld $23, %xmm1167; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1168; SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1169; SSE2-NEXT: cvttps2dq %xmm1, %xmm1170; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]171; SSE2-NEXT: pmuludq %xmm1, %xmm0172; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]173; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]174; SSE2-NEXT: pmuludq %xmm2, %xmm1175; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]176; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]177; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]178; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]179; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]180; SSE2-NEXT: por %xmm3, %xmm0181; SSE2-NEXT: retq182;183; SSE41-LABEL: splatvar_funnnel_v2i32:184; SSE41: # %bb.0:185; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]186; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]187; SSE41-NEXT: pslld $23, %xmm1188; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1189; SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1190; SSE41-NEXT: cvttps2dq %xmm1, %xmm1191; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]192; SSE41-NEXT: pmuludq %xmm2, %xmm3193; SSE41-NEXT: pmuludq %xmm1, %xmm0194; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]195; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]196; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]197; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]198; SSE41-NEXT: por %xmm1, %xmm0199; SSE41-NEXT: retq200;201; AVX1-LABEL: splatvar_funnnel_v2i32:202; AVX1: # %bb.0:203; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]204; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]205; AVX1-NEXT: vpslld $23, %xmm1, %xmm1206; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1207; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1208; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1209; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]210; AVX1-NEXT: vpmuludq %xmm3, %xmm2, %xmm2211; AVX1-NEXT: vpmuludq %xmm1, %xmm0, %xmm0212; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]213; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]214; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,2,2]215; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]216; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0217; AVX1-NEXT: retq218;219; AVX2-LABEL: splatvar_funnnel_v2i32:220; AVX2: # %bb.0:221; AVX2-NEXT: vpbroadcastd %xmm1, %xmm1222; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [31,31,31,31]223; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1224; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero225; AVX2-NEXT: vpslld %xmm2, %xmm0, %xmm2226; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]227; AVX2-NEXT: vpsubd %xmm1, %xmm3, %xmm1228; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero229; AVX2-NEXT: vpsrld %xmm1, %xmm0, %xmm0230; AVX2-NEXT: vpor %xmm0, %xmm2, %xmm0231; AVX2-NEXT: retq232;233; AVX512F-LABEL: splatvar_funnnel_v2i32:234; AVX512F: # %bb.0:235; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0236; AVX512F-NEXT: vpbroadcastd %xmm1, %xmm1237; AVX512F-NEXT: vprolvd %zmm1, %zmm0, %zmm0238; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0239; AVX512F-NEXT: vzeroupper240; AVX512F-NEXT: retq241;242; AVX512VL-LABEL: splatvar_funnnel_v2i32:243; AVX512VL: # %bb.0:244; AVX512VL-NEXT: vpbroadcastd %xmm1, %xmm1245; AVX512VL-NEXT: vprolvd %xmm1, %xmm0, %xmm0246; AVX512VL-NEXT: retq247;248; AVX512BW-LABEL: splatvar_funnnel_v2i32:249; AVX512BW: # %bb.0:250; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0251; AVX512BW-NEXT: vpbroadcastd %xmm1, %xmm1252; AVX512BW-NEXT: vprolvd %zmm1, %zmm0, %zmm0253; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0254; AVX512BW-NEXT: vzeroupper255; AVX512BW-NEXT: retq256;257; AVX512VLBW-LABEL: splatvar_funnnel_v2i32:258; AVX512VLBW: # %bb.0:259; AVX512VLBW-NEXT: vpbroadcastd %xmm1, %xmm1260; AVX512VLBW-NEXT: vprolvd %xmm1, %xmm0, %xmm0261; AVX512VLBW-NEXT: retq262;263; AVX512VBMI2-LABEL: splatvar_funnnel_v2i32:264; AVX512VBMI2: # %bb.0:265; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0266; AVX512VBMI2-NEXT: vpbroadcastd %xmm1, %xmm1267; AVX512VBMI2-NEXT: vprolvd %zmm1, %zmm0, %zmm0268; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0269; AVX512VBMI2-NEXT: vzeroupper270; AVX512VBMI2-NEXT: retq271;272; AVX512VLVBMI2-LABEL: splatvar_funnnel_v2i32:273; AVX512VLVBMI2: # %bb.0:274; AVX512VLVBMI2-NEXT: vpbroadcastd %xmm1, %xmm1275; AVX512VLVBMI2-NEXT: vprolvd %xmm1, %xmm0, %xmm0276; AVX512VLVBMI2-NEXT: retq277;278; XOPAVX1-LABEL: splatvar_funnnel_v2i32:279; XOPAVX1: # %bb.0:280; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]281; XOPAVX1-NEXT: vprotd %xmm1, %xmm0, %xmm0282; XOPAVX1-NEXT: retq283;284; XOPAVX2-LABEL: splatvar_funnnel_v2i32:285; XOPAVX2: # %bb.0:286; XOPAVX2-NEXT: vpbroadcastd %xmm1, %xmm1287; XOPAVX2-NEXT: vprotd %xmm1, %xmm0, %xmm0288; XOPAVX2-NEXT: retq289;290; X86-SSE2-LABEL: splatvar_funnnel_v2i32:291; X86-SSE2: # %bb.0:292; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]293; X86-SSE2-NEXT: pslld $23, %xmm1294; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1295; X86-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1296; X86-SSE2-NEXT: cvttps2dq %xmm1, %xmm1297; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]298; X86-SSE2-NEXT: pmuludq %xmm1, %xmm0299; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]300; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]301; X86-SSE2-NEXT: pmuludq %xmm2, %xmm1302; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]303; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]304; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]305; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]306; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]307; X86-SSE2-NEXT: por %xmm3, %xmm0308; X86-SSE2-NEXT: retl309 %splat = shufflevector <2 x i32> %amt, <2 x i32> undef, <2 x i32> zeroinitializer310 %res = call <2 x i32> @llvm.fshl.v2i32(<2 x i32> %x, <2 x i32> %x, <2 x i32> %splat)311 ret <2 x i32> %res312}313 314;315; Constant Shifts316;317 318define <2 x i32> @constant_funnnel_v2i32(<2 x i32> %x) nounwind {319; SSE2-LABEL: constant_funnnel_v2i32:320; SSE2: # %bb.0:321; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]322; SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16,32,u,u]323; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]324; SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [32,32,u,u]325; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]326; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]327; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]328; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]329; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]330; SSE2-NEXT: por %xmm2, %xmm0331; SSE2-NEXT: retq332;333; SSE41-LABEL: constant_funnnel_v2i32:334; SSE41: # %bb.0:335; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]336; SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [32,32,u,u]337; SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16,32,u,u]338; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]339; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]340; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]341; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]342; SSE41-NEXT: por %xmm2, %xmm0343; SSE41-NEXT: retq344;345; AVX1-LABEL: constant_funnnel_v2i32:346; AVX1: # %bb.0:347; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]348; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [32,32,u,u]349; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [16,32,u,u]350; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]351; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]352; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]353; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]354; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0355; AVX1-NEXT: retq356;357; AVX2-LABEL: constant_funnnel_v2i32:358; AVX2: # %bb.0:359; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1360; AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0361; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0362; AVX2-NEXT: retq363;364; AVX512F-LABEL: constant_funnnel_v2i32:365; AVX512F: # %bb.0:366; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0367; AVX512F-NEXT: vpmovsxbd {{.*#+}} xmm1 = [4,5,0,0]368; AVX512F-NEXT: vprolvd %zmm1, %zmm0, %zmm0369; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0370; AVX512F-NEXT: vzeroupper371; AVX512F-NEXT: retq372;373; AVX512VL-LABEL: constant_funnnel_v2i32:374; AVX512VL: # %bb.0:375; AVX512VL-NEXT: vprolvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0376; AVX512VL-NEXT: retq377;378; AVX512BW-LABEL: constant_funnnel_v2i32:379; AVX512BW: # %bb.0:380; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0381; AVX512BW-NEXT: vpmovsxbd {{.*#+}} xmm1 = [4,5,0,0]382; AVX512BW-NEXT: vprolvd %zmm1, %zmm0, %zmm0383; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0384; AVX512BW-NEXT: vzeroupper385; AVX512BW-NEXT: retq386;387; AVX512VLBW-LABEL: constant_funnnel_v2i32:388; AVX512VLBW: # %bb.0:389; AVX512VLBW-NEXT: vprolvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0390; AVX512VLBW-NEXT: retq391;392; AVX512VBMI2-LABEL: constant_funnnel_v2i32:393; AVX512VBMI2: # %bb.0:394; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0395; AVX512VBMI2-NEXT: vpmovsxbd {{.*#+}} xmm1 = [4,5,0,0]396; AVX512VBMI2-NEXT: vprolvd %zmm1, %zmm0, %zmm0397; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0398; AVX512VBMI2-NEXT: vzeroupper399; AVX512VBMI2-NEXT: retq400;401; AVX512VLVBMI2-LABEL: constant_funnnel_v2i32:402; AVX512VLVBMI2: # %bb.0:403; AVX512VLVBMI2-NEXT: vprolvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0404; AVX512VLVBMI2-NEXT: retq405;406; XOP-LABEL: constant_funnnel_v2i32:407; XOP: # %bb.0:408; XOP-NEXT: vprotd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0409; XOP-NEXT: retq410;411; X86-SSE2-LABEL: constant_funnnel_v2i32:412; X86-SSE2: # %bb.0:413; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]414; X86-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [16,32,u,u]415; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]416; X86-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [32,32,u,u]417; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]418; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]419; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]420; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]421; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]422; X86-SSE2-NEXT: por %xmm2, %xmm0423; X86-SSE2-NEXT: retl424 %res = call <2 x i32> @llvm.fshl.v2i32(<2 x i32> %x, <2 x i32> %x, <2 x i32> <i32 4, i32 5>)425 ret <2 x i32> %res426}427 428;429; Uniform Constant Shifts430;431 432define <2 x i32> @splatconstant_funnnel_v2i32(<2 x i32> %x) nounwind {433; SSE2-LABEL: splatconstant_funnnel_v2i32:434; SSE2: # %bb.0:435; SSE2-NEXT: movdqa %xmm0, %xmm1436; SSE2-NEXT: psrld $28, %xmm1437; SSE2-NEXT: pslld $4, %xmm0438; SSE2-NEXT: por %xmm1, %xmm0439; SSE2-NEXT: retq440;441; SSE41-LABEL: splatconstant_funnnel_v2i32:442; SSE41: # %bb.0:443; SSE41-NEXT: movdqa %xmm0, %xmm1444; SSE41-NEXT: psrld $28, %xmm1445; SSE41-NEXT: pslld $4, %xmm0446; SSE41-NEXT: por %xmm1, %xmm0447; SSE41-NEXT: retq448;449; AVX1-LABEL: splatconstant_funnnel_v2i32:450; AVX1: # %bb.0:451; AVX1-NEXT: vpsrld $28, %xmm0, %xmm1452; AVX1-NEXT: vpslld $4, %xmm0, %xmm0453; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0454; AVX1-NEXT: retq455;456; AVX2-LABEL: splatconstant_funnnel_v2i32:457; AVX2: # %bb.0:458; AVX2-NEXT: vpsrld $28, %xmm0, %xmm1459; AVX2-NEXT: vpslld $4, %xmm0, %xmm0460; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0461; AVX2-NEXT: retq462;463; AVX512F-LABEL: splatconstant_funnnel_v2i32:464; AVX512F: # %bb.0:465; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0466; AVX512F-NEXT: vprold $4, %zmm0, %zmm0467; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0468; AVX512F-NEXT: vzeroupper469; AVX512F-NEXT: retq470;471; AVX512VL-LABEL: splatconstant_funnnel_v2i32:472; AVX512VL: # %bb.0:473; AVX512VL-NEXT: vprold $4, %xmm0, %xmm0474; AVX512VL-NEXT: retq475;476; AVX512BW-LABEL: splatconstant_funnnel_v2i32:477; AVX512BW: # %bb.0:478; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0479; AVX512BW-NEXT: vprold $4, %zmm0, %zmm0480; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0481; AVX512BW-NEXT: vzeroupper482; AVX512BW-NEXT: retq483;484; AVX512VLBW-LABEL: splatconstant_funnnel_v2i32:485; AVX512VLBW: # %bb.0:486; AVX512VLBW-NEXT: vprold $4, %xmm0, %xmm0487; AVX512VLBW-NEXT: retq488;489; AVX512VBMI2-LABEL: splatconstant_funnnel_v2i32:490; AVX512VBMI2: # %bb.0:491; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0492; AVX512VBMI2-NEXT: vprold $4, %zmm0, %zmm0493; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0494; AVX512VBMI2-NEXT: vzeroupper495; AVX512VBMI2-NEXT: retq496;497; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v2i32:498; AVX512VLVBMI2: # %bb.0:499; AVX512VLVBMI2-NEXT: vprold $4, %xmm0, %xmm0500; AVX512VLVBMI2-NEXT: retq501;502; XOP-LABEL: splatconstant_funnnel_v2i32:503; XOP: # %bb.0:504; XOP-NEXT: vprotd $4, %xmm0, %xmm0505; XOP-NEXT: retq506;507; X86-SSE2-LABEL: splatconstant_funnnel_v2i32:508; X86-SSE2: # %bb.0:509; X86-SSE2-NEXT: movdqa %xmm0, %xmm1510; X86-SSE2-NEXT: psrld $28, %xmm1511; X86-SSE2-NEXT: pslld $4, %xmm0512; X86-SSE2-NEXT: por %xmm1, %xmm0513; X86-SSE2-NEXT: retl514 %res = call <2 x i32> @llvm.fshl.v2i32(<2 x i32> %x, <2 x i32> %x, <2 x i32> <i32 4, i32 4>)515 ret <2 x i32> %res516}517