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