brintos

brintos / llvm-project-archived public Read only

0
0
Text · 21.9 KiB · 17bbfa1 Raw
539 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.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> %amt) nounwind {25; SSE2-LABEL: var_funnnel_v2i32:26; SSE2:       # %bb.0:27; SSE2-NEXT:    pxor %xmm2, %xmm228; SSE2-NEXT:    psubd %xmm1, %xmm229; SSE2-NEXT:    pslld $23, %xmm230; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm231; SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm232; SSE2-NEXT:    cvttps2dq %xmm2, %xmm133; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]34; SSE2-NEXT:    pmuludq %xmm1, %xmm035; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]36; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]37; SSE2-NEXT:    pmuludq %xmm2, %xmm138; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]39; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]40; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]41; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]42; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]43; SSE2-NEXT:    por %xmm3, %xmm044; SSE2-NEXT:    retq45;46; SSE41-LABEL: var_funnnel_v2i32:47; SSE41:       # %bb.0:48; SSE41-NEXT:    pxor %xmm2, %xmm249; SSE41-NEXT:    psubd %xmm1, %xmm250; SSE41-NEXT:    pslld $23, %xmm251; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm252; SSE41-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm253; SSE41-NEXT:    cvttps2dq %xmm2, %xmm154; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]55; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]56; SSE41-NEXT:    pmuludq %xmm2, %xmm357; SSE41-NEXT:    pmuludq %xmm1, %xmm058; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]59; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]60; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]61; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]62; SSE41-NEXT:    por %xmm1, %xmm063; SSE41-NEXT:    retq64;65; AVX1-LABEL: var_funnnel_v2i32:66; AVX1:       # %bb.0:67; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm268; AVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm169; AVX1-NEXT:    vpslld $23, %xmm1, %xmm170; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm171; AVX1-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm172; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm173; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]74; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]75; AVX1-NEXT:    vpmuludq %xmm2, %xmm3, %xmm276; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm077; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]78; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]79; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,2,2]80; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]81; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm082; AVX1-NEXT:    retq83;84; AVX2-LABEL: var_funnnel_v2i32:85; AVX2:       # %bb.0:86; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [31,31,31,31]87; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm188; AVX2-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm289; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]90; AVX2-NEXT:    vpsubd %xmm1, %xmm3, %xmm191; AVX2-NEXT:    vpsllvd %xmm1, %xmm0, %xmm092; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm093; AVX2-NEXT:    retq94;95; AVX512F-LABEL: var_funnnel_v2i32:96; AVX512F:       # %bb.0:97; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm198; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm099; AVX512F-NEXT:    vprorvd %zmm1, %zmm0, %zmm0100; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0101; AVX512F-NEXT:    vzeroupper102; AVX512F-NEXT:    retq103;104; AVX512VL-LABEL: var_funnnel_v2i32:105; AVX512VL:       # %bb.0:106; AVX512VL-NEXT:    vprorvd %xmm1, %xmm0, %xmm0107; AVX512VL-NEXT:    retq108;109; AVX512BW-LABEL: var_funnnel_v2i32:110; AVX512BW:       # %bb.0:111; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1112; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0113; AVX512BW-NEXT:    vprorvd %zmm1, %zmm0, %zmm0114; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0115; AVX512BW-NEXT:    vzeroupper116; AVX512BW-NEXT:    retq117;118; AVX512VLBW-LABEL: var_funnnel_v2i32:119; AVX512VLBW:       # %bb.0:120; AVX512VLBW-NEXT:    vprorvd %xmm1, %xmm0, %xmm0121; AVX512VLBW-NEXT:    retq122;123; AVX512VBMI2-LABEL: var_funnnel_v2i32:124; AVX512VBMI2:       # %bb.0:125; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1126; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0127; AVX512VBMI2-NEXT:    vprorvd %zmm1, %zmm0, %zmm0128; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0129; AVX512VBMI2-NEXT:    vzeroupper130; AVX512VBMI2-NEXT:    retq131;132; AVX512VLVBMI2-LABEL: var_funnnel_v2i32:133; AVX512VLVBMI2:       # %bb.0:134; AVX512VLVBMI2-NEXT:    vprorvd %xmm1, %xmm0, %xmm0135; AVX512VLVBMI2-NEXT:    retq136;137; XOP-LABEL: var_funnnel_v2i32:138; XOP:       # %bb.0:139; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2140; XOP-NEXT:    vpsubd %xmm1, %xmm2, %xmm1141; XOP-NEXT:    vprotd %xmm1, %xmm0, %xmm0142; XOP-NEXT:    retq143;144; X86-SSE2-LABEL: var_funnnel_v2i32:145; X86-SSE2:       # %bb.0:146; X86-SSE2-NEXT:    pxor %xmm2, %xmm2147; X86-SSE2-NEXT:    psubd %xmm1, %xmm2148; X86-SSE2-NEXT:    pslld $23, %xmm2149; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2150; X86-SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2151; X86-SSE2-NEXT:    cvttps2dq %xmm2, %xmm1152; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]153; X86-SSE2-NEXT:    pmuludq %xmm1, %xmm0154; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]155; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]156; X86-SSE2-NEXT:    pmuludq %xmm2, %xmm1157; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]158; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]159; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]160; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]161; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]162; X86-SSE2-NEXT:    por %xmm3, %xmm0163; X86-SSE2-NEXT:    retl164  %res = call <2 x i32> @llvm.fshr.v2i32(<2 x i32> %x, <2 x i32> %x, <2 x i32> %amt)165  ret <2 x i32> %res166}167 168;169; Uniform Variable Shifts170;171 172define <2 x i32> @splatvar_funnnel_v2i32(<2 x i32> %x, <2 x i32> %amt) nounwind {173; SSE2-LABEL: splatvar_funnnel_v2i32:174; SSE2:       # %bb.0:175; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]176; SSE2-NEXT:    pxor %xmm2, %xmm2177; SSE2-NEXT:    psubd %xmm1, %xmm2178; SSE2-NEXT:    pslld $23, %xmm2179; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2180; SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2181; SSE2-NEXT:    cvttps2dq %xmm2, %xmm1182; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]183; SSE2-NEXT:    pmuludq %xmm1, %xmm0184; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]185; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]186; SSE2-NEXT:    pmuludq %xmm2, %xmm1187; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]188; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]189; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]190; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]191; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]192; SSE2-NEXT:    por %xmm3, %xmm0193; SSE2-NEXT:    retq194;195; SSE41-LABEL: splatvar_funnnel_v2i32:196; SSE41:       # %bb.0:197; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]198; SSE41-NEXT:    pxor %xmm2, %xmm2199; SSE41-NEXT:    psubd %xmm1, %xmm2200; SSE41-NEXT:    pslld $23, %xmm2201; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2202; SSE41-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2203; SSE41-NEXT:    cvttps2dq %xmm2, %xmm1204; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]205; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]206; SSE41-NEXT:    pmuludq %xmm2, %xmm3207; SSE41-NEXT:    pmuludq %xmm1, %xmm0208; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]209; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]210; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]211; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]212; SSE41-NEXT:    por %xmm1, %xmm0213; SSE41-NEXT:    retq214;215; AVX1-LABEL: splatvar_funnnel_v2i32:216; AVX1:       # %bb.0:217; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]218; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2219; AVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm1220; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1221; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1222; AVX1-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1223; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1224; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]225; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]226; AVX1-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2227; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0228; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]229; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]230; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,2,2]231; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]232; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0233; AVX1-NEXT:    retq234;235; AVX2-LABEL: splatvar_funnnel_v2i32:236; AVX2:       # %bb.0:237; AVX2-NEXT:    vpbroadcastd %xmm1, %xmm1238; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [31,31,31,31]239; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1240; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero241; AVX2-NEXT:    vpsrld %xmm2, %xmm0, %xmm2242; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]243; AVX2-NEXT:    vpsubd %xmm1, %xmm3, %xmm1244; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero245; AVX2-NEXT:    vpslld %xmm1, %xmm0, %xmm0246; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0247; AVX2-NEXT:    retq248;249; AVX512F-LABEL: splatvar_funnnel_v2i32:250; AVX512F:       # %bb.0:251; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0252; AVX512F-NEXT:    vpbroadcastd %xmm1, %xmm1253; AVX512F-NEXT:    vprorvd %zmm1, %zmm0, %zmm0254; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0255; AVX512F-NEXT:    vzeroupper256; AVX512F-NEXT:    retq257;258; AVX512VL-LABEL: splatvar_funnnel_v2i32:259; AVX512VL:       # %bb.0:260; AVX512VL-NEXT:    vpbroadcastd %xmm1, %xmm1261; AVX512VL-NEXT:    vprorvd %xmm1, %xmm0, %xmm0262; AVX512VL-NEXT:    retq263;264; AVX512BW-LABEL: splatvar_funnnel_v2i32:265; AVX512BW:       # %bb.0:266; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0267; AVX512BW-NEXT:    vpbroadcastd %xmm1, %xmm1268; AVX512BW-NEXT:    vprorvd %zmm1, %zmm0, %zmm0269; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0270; AVX512BW-NEXT:    vzeroupper271; AVX512BW-NEXT:    retq272;273; AVX512VLBW-LABEL: splatvar_funnnel_v2i32:274; AVX512VLBW:       # %bb.0:275; AVX512VLBW-NEXT:    vpbroadcastd %xmm1, %xmm1276; AVX512VLBW-NEXT:    vprorvd %xmm1, %xmm0, %xmm0277; AVX512VLBW-NEXT:    retq278;279; AVX512VBMI2-LABEL: splatvar_funnnel_v2i32:280; AVX512VBMI2:       # %bb.0:281; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0282; AVX512VBMI2-NEXT:    vpbroadcastd %xmm1, %xmm1283; AVX512VBMI2-NEXT:    vprorvd %zmm1, %zmm0, %zmm0284; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0285; AVX512VBMI2-NEXT:    vzeroupper286; AVX512VBMI2-NEXT:    retq287;288; AVX512VLVBMI2-LABEL: splatvar_funnnel_v2i32:289; AVX512VLVBMI2:       # %bb.0:290; AVX512VLVBMI2-NEXT:    vpbroadcastd %xmm1, %xmm1291; AVX512VLVBMI2-NEXT:    vprorvd %xmm1, %xmm0, %xmm0292; AVX512VLVBMI2-NEXT:    retq293;294; XOPAVX1-LABEL: splatvar_funnnel_v2i32:295; XOPAVX1:       # %bb.0:296; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]297; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2298; XOPAVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm1299; XOPAVX1-NEXT:    vprotd %xmm1, %xmm0, %xmm0300; XOPAVX1-NEXT:    retq301;302; XOPAVX2-LABEL: splatvar_funnnel_v2i32:303; XOPAVX2:       # %bb.0:304; XOPAVX2-NEXT:    vpbroadcastd %xmm1, %xmm1305; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2306; XOPAVX2-NEXT:    vpsubd %xmm1, %xmm2, %xmm1307; XOPAVX2-NEXT:    vprotd %xmm1, %xmm0, %xmm0308; XOPAVX2-NEXT:    retq309;310; X86-SSE2-LABEL: splatvar_funnnel_v2i32:311; X86-SSE2:       # %bb.0:312; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]313; X86-SSE2-NEXT:    pxor %xmm2, %xmm2314; X86-SSE2-NEXT:    psubd %xmm1, %xmm2315; X86-SSE2-NEXT:    pslld $23, %xmm2316; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2317; X86-SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2318; X86-SSE2-NEXT:    cvttps2dq %xmm2, %xmm1319; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]320; X86-SSE2-NEXT:    pmuludq %xmm1, %xmm0321; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]322; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]323; X86-SSE2-NEXT:    pmuludq %xmm2, %xmm1324; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]325; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]326; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]327; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]328; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]329; X86-SSE2-NEXT:    por %xmm3, %xmm0330; X86-SSE2-NEXT:    retl331  %splat = shufflevector <2 x i32> %amt, <2 x i32> undef, <2 x i32> zeroinitializer332  %res = call <2 x i32> @llvm.fshr.v2i32(<2 x i32> %x, <2 x i32> %x, <2 x i32> %splat)333  ret <2 x i32> %res334}335 336;337; Constant Shifts338;339 340define <2 x i32> @constant_funnnel_v2i32(<2 x i32> %x) nounwind {341; SSE2-LABEL: constant_funnnel_v2i32:342; SSE2:       # %bb.0:343; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]344; SSE2-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [268435456,134217728,u,u]345; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]346; SSE2-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [134217728,134217728,u,u]347; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]348; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]349; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]350; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]351; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]352; SSE2-NEXT:    por %xmm2, %xmm0353; SSE2-NEXT:    retq354;355; SSE41-LABEL: constant_funnnel_v2i32:356; SSE41:       # %bb.0:357; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]358; SSE41-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [134217728,134217728,u,u]359; SSE41-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [268435456,134217728,u,u]360; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]361; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]362; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]363; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]364; SSE41-NEXT:    por %xmm2, %xmm0365; SSE41-NEXT:    retq366;367; AVX1-LABEL: constant_funnnel_v2i32:368; AVX1:       # %bb.0:369; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]370; AVX1-NEXT:    vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [134217728,134217728,u,u]371; AVX1-NEXT:    vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [268435456,134217728,u,u]372; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]373; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]374; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]375; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]376; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0377; AVX1-NEXT:    retq378;379; AVX2-LABEL: constant_funnnel_v2i32:380; AVX2:       # %bb.0:381; AVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1382; AVX2-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0383; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0384; AVX2-NEXT:    retq385;386; AVX512F-LABEL: constant_funnnel_v2i32:387; AVX512F:       # %bb.0:388; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0389; AVX512F-NEXT:    vpmovsxbd {{.*#+}} xmm1 = [4,5,0,0]390; AVX512F-NEXT:    vprorvd %zmm1, %zmm0, %zmm0391; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0392; AVX512F-NEXT:    vzeroupper393; AVX512F-NEXT:    retq394;395; AVX512VL-LABEL: constant_funnnel_v2i32:396; AVX512VL:       # %bb.0:397; AVX512VL-NEXT:    vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0398; AVX512VL-NEXT:    retq399;400; AVX512BW-LABEL: constant_funnnel_v2i32:401; AVX512BW:       # %bb.0:402; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0403; AVX512BW-NEXT:    vpmovsxbd {{.*#+}} xmm1 = [4,5,0,0]404; AVX512BW-NEXT:    vprorvd %zmm1, %zmm0, %zmm0405; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0406; AVX512BW-NEXT:    vzeroupper407; AVX512BW-NEXT:    retq408;409; AVX512VLBW-LABEL: constant_funnnel_v2i32:410; AVX512VLBW:       # %bb.0:411; AVX512VLBW-NEXT:    vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0412; AVX512VLBW-NEXT:    retq413;414; AVX512VBMI2-LABEL: constant_funnnel_v2i32:415; AVX512VBMI2:       # %bb.0:416; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0417; AVX512VBMI2-NEXT:    vpmovsxbd {{.*#+}} xmm1 = [4,5,0,0]418; AVX512VBMI2-NEXT:    vprorvd %zmm1, %zmm0, %zmm0419; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0420; AVX512VBMI2-NEXT:    vzeroupper421; AVX512VBMI2-NEXT:    retq422;423; AVX512VLVBMI2-LABEL: constant_funnnel_v2i32:424; AVX512VLVBMI2:       # %bb.0:425; AVX512VLVBMI2-NEXT:    vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0426; AVX512VLVBMI2-NEXT:    retq427;428; XOP-LABEL: constant_funnnel_v2i32:429; XOP:       # %bb.0:430; XOP-NEXT:    vprotd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0431; XOP-NEXT:    retq432;433; X86-SSE2-LABEL: constant_funnnel_v2i32:434; X86-SSE2:       # %bb.0:435; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]436; X86-SSE2-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [268435456,134217728,u,u]437; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]438; X86-SSE2-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [134217728,134217728,u,u]439; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]440; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]441; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]442; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]443; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]444; X86-SSE2-NEXT:    por %xmm2, %xmm0445; X86-SSE2-NEXT:    retl446  %res = call <2 x i32> @llvm.fshr.v2i32(<2 x i32> %x, <2 x i32> %x, <2 x i32> <i32 4, i32 5>)447  ret <2 x i32> %res448}449 450;451; Uniform Constant Shifts452;453 454define <2 x i32> @splatconstant_funnnel_v2i32(<2 x i32> %x) nounwind {455; SSE2-LABEL: splatconstant_funnnel_v2i32:456; SSE2:       # %bb.0:457; SSE2-NEXT:    movdqa %xmm0, %xmm1458; SSE2-NEXT:    psrld $4, %xmm1459; SSE2-NEXT:    pslld $28, %xmm0460; SSE2-NEXT:    por %xmm1, %xmm0461; SSE2-NEXT:    retq462;463; SSE41-LABEL: splatconstant_funnnel_v2i32:464; SSE41:       # %bb.0:465; SSE41-NEXT:    movdqa %xmm0, %xmm1466; SSE41-NEXT:    psrld $4, %xmm1467; SSE41-NEXT:    pslld $28, %xmm0468; SSE41-NEXT:    por %xmm1, %xmm0469; SSE41-NEXT:    retq470;471; AVX1-LABEL: splatconstant_funnnel_v2i32:472; AVX1:       # %bb.0:473; AVX1-NEXT:    vpsrld $4, %xmm0, %xmm1474; AVX1-NEXT:    vpslld $28, %xmm0, %xmm0475; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0476; AVX1-NEXT:    retq477;478; AVX2-LABEL: splatconstant_funnnel_v2i32:479; AVX2:       # %bb.0:480; AVX2-NEXT:    vpsrld $4, %xmm0, %xmm1481; AVX2-NEXT:    vpslld $28, %xmm0, %xmm0482; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0483; AVX2-NEXT:    retq484;485; AVX512F-LABEL: splatconstant_funnnel_v2i32:486; AVX512F:       # %bb.0:487; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0488; AVX512F-NEXT:    vprord $4, %zmm0, %zmm0489; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0490; AVX512F-NEXT:    vzeroupper491; AVX512F-NEXT:    retq492;493; AVX512VL-LABEL: splatconstant_funnnel_v2i32:494; AVX512VL:       # %bb.0:495; AVX512VL-NEXT:    vprord $4, %xmm0, %xmm0496; AVX512VL-NEXT:    retq497;498; AVX512BW-LABEL: splatconstant_funnnel_v2i32:499; AVX512BW:       # %bb.0:500; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0501; AVX512BW-NEXT:    vprord $4, %zmm0, %zmm0502; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0503; AVX512BW-NEXT:    vzeroupper504; AVX512BW-NEXT:    retq505;506; AVX512VLBW-LABEL: splatconstant_funnnel_v2i32:507; AVX512VLBW:       # %bb.0:508; AVX512VLBW-NEXT:    vprord $4, %xmm0, %xmm0509; AVX512VLBW-NEXT:    retq510;511; AVX512VBMI2-LABEL: splatconstant_funnnel_v2i32:512; AVX512VBMI2:       # %bb.0:513; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0514; AVX512VBMI2-NEXT:    vprord $4, %zmm0, %zmm0515; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0516; AVX512VBMI2-NEXT:    vzeroupper517; AVX512VBMI2-NEXT:    retq518;519; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v2i32:520; AVX512VLVBMI2:       # %bb.0:521; AVX512VLVBMI2-NEXT:    vprord $4, %xmm0, %xmm0522; AVX512VLVBMI2-NEXT:    retq523;524; XOP-LABEL: splatconstant_funnnel_v2i32:525; XOP:       # %bb.0:526; XOP-NEXT:    vprotd $28, %xmm0, %xmm0527; XOP-NEXT:    retq528;529; X86-SSE2-LABEL: splatconstant_funnnel_v2i32:530; X86-SSE2:       # %bb.0:531; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1532; X86-SSE2-NEXT:    psrld $4, %xmm1533; X86-SSE2-NEXT:    pslld $28, %xmm0534; X86-SSE2-NEXT:    por %xmm1, %xmm0535; X86-SSE2-NEXT:    retl536  %res = call <2 x i32> @llvm.fshr.v2i32(<2 x i32> %x, <2 x i32> %x, <2 x i32> <i32 4, i32 4>)537  ret <2 x i32> %res538}539