brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.9 KiB · 2e85a4e Raw
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