2009 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=AVX512,AVX512NOVLX,AVX512F7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLX,AVX512VL8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512NOVLX,AVX512BW9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLX,AVX512VLBW10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2 | FileCheck %s --check-prefixes=AVX512,AVX512NOVLX,AVX512VBMI211; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLX,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 rotates.16; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X86-SSE217 18;19; Variable Rotates20;21 22define <2 x i64> @var_rotate_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {23; SSE2-LABEL: var_rotate_v2i64:24; SSE2: # %bb.0:25; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [64,64]26; SSE2-NEXT: psubq %xmm1, %xmm227; SSE2-NEXT: movdqa %xmm0, %xmm328; SSE2-NEXT: psllq %xmm1, %xmm329; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]30; SSE2-NEXT: movdqa %xmm0, %xmm431; SSE2-NEXT: psllq %xmm1, %xmm432; SSE2-NEXT: movsd {{.*#+}} xmm4 = xmm3[0],xmm4[1]33; SSE2-NEXT: movdqa %xmm0, %xmm134; SSE2-NEXT: psrlq %xmm2, %xmm135; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]36; SSE2-NEXT: psrlq %xmm2, %xmm037; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]38; SSE2-NEXT: orpd %xmm4, %xmm039; SSE2-NEXT: retq40;41; SSE41-LABEL: var_rotate_v2i64:42; SSE41: # %bb.0:43; SSE41-NEXT: pmovsxbq {{.*#+}} xmm2 = [64,64]44; SSE41-NEXT: psubq %xmm1, %xmm245; SSE41-NEXT: movdqa %xmm0, %xmm346; SSE41-NEXT: psllq %xmm1, %xmm347; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]48; SSE41-NEXT: movdqa %xmm0, %xmm449; SSE41-NEXT: psllq %xmm1, %xmm450; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm3[0,1,2,3],xmm4[4,5,6,7]51; SSE41-NEXT: movdqa %xmm0, %xmm152; SSE41-NEXT: psrlq %xmm2, %xmm153; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]54; SSE41-NEXT: psrlq %xmm2, %xmm055; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]56; SSE41-NEXT: por %xmm4, %xmm057; SSE41-NEXT: retq58;59; AVX1-LABEL: var_rotate_v2i64:60; AVX1: # %bb.0:61; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm2 = [64,64]62; AVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm263; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm364; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]65; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm166; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm3[0,1,2,3],xmm1[4,5,6,7]67; AVX1-NEXT: vpsrlq %xmm2, %xmm0, %xmm368; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]69; AVX1-NEXT: vpsrlq %xmm2, %xmm0, %xmm070; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]71; AVX1-NEXT: vpor %xmm0, %xmm1, %xmm072; AVX1-NEXT: retq73;74; AVX2-LABEL: var_rotate_v2i64:75; AVX2: # %bb.0:76; AVX2-NEXT: vpmovsxbq {{.*#+}} xmm2 = [64,64]77; AVX2-NEXT: vpsubq %xmm1, %xmm2, %xmm278; AVX2-NEXT: vpsllvq %xmm1, %xmm0, %xmm179; AVX2-NEXT: vpsrlvq %xmm2, %xmm0, %xmm080; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm081; AVX2-NEXT: retq82;83; AVX512NOVLX-LABEL: var_rotate_v2i64:84; AVX512NOVLX: # %bb.0:85; AVX512NOVLX-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm186; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm087; AVX512NOVLX-NEXT: vprolvq %zmm1, %zmm0, %zmm088; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm089; AVX512NOVLX-NEXT: vzeroupper90; AVX512NOVLX-NEXT: retq91;92; AVX512VLX-LABEL: var_rotate_v2i64:93; AVX512VLX: # %bb.0:94; AVX512VLX-NEXT: vprolvq %xmm1, %xmm0, %xmm095; AVX512VLX-NEXT: retq96;97; XOP-LABEL: var_rotate_v2i64:98; XOP: # %bb.0:99; XOP-NEXT: vprotq %xmm1, %xmm0, %xmm0100; XOP-NEXT: retq101;102; X86-SSE2-LABEL: var_rotate_v2i64:103; X86-SSE2: # %bb.0:104; X86-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [64,0,64,0]105; X86-SSE2-NEXT: psubq %xmm1, %xmm2106; X86-SSE2-NEXT: movdqa %xmm0, %xmm3107; X86-SSE2-NEXT: psllq %xmm1, %xmm3108; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]109; X86-SSE2-NEXT: movdqa %xmm0, %xmm4110; X86-SSE2-NEXT: psllq %xmm1, %xmm4111; X86-SSE2-NEXT: movsd {{.*#+}} xmm4 = xmm3[0],xmm4[1]112; X86-SSE2-NEXT: movdqa %xmm0, %xmm1113; X86-SSE2-NEXT: psrlq %xmm2, %xmm1114; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]115; X86-SSE2-NEXT: psrlq %xmm2, %xmm0116; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]117; X86-SSE2-NEXT: orpd %xmm4, %xmm0118; X86-SSE2-NEXT: retl119 %b64 = sub <2 x i64> <i64 64, i64 64>, %b120 %shl = shl <2 x i64> %a, %b121 %lshr = lshr <2 x i64> %a, %b64122 %or = or <2 x i64> %shl, %lshr123 ret <2 x i64> %or124}125 126define <4 x i32> @var_rotate_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {127; SSE2-LABEL: var_rotate_v4i32:128; SSE2: # %bb.0:129; SSE2-NEXT: pslld $23, %xmm1130; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1131; SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1132; SSE2-NEXT: cvttps2dq %xmm1, %xmm1133; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]134; SSE2-NEXT: pmuludq %xmm1, %xmm0135; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]136; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]137; SSE2-NEXT: pmuludq %xmm2, %xmm1138; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]139; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]140; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]141; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]142; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]143; SSE2-NEXT: por %xmm3, %xmm0144; SSE2-NEXT: retq145;146; SSE41-LABEL: var_rotate_v4i32:147; SSE41: # %bb.0:148; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]149; SSE41-NEXT: pslld $23, %xmm1150; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1151; SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1152; SSE41-NEXT: cvttps2dq %xmm1, %xmm1153; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]154; SSE41-NEXT: pmuludq %xmm2, %xmm3155; SSE41-NEXT: pmuludq %xmm1, %xmm0156; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]157; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]158; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]159; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]160; SSE41-NEXT: por %xmm1, %xmm0161; SSE41-NEXT: retq162;163; AVX1-LABEL: var_rotate_v4i32:164; AVX1: # %bb.0:165; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]166; AVX1-NEXT: vpslld $23, %xmm1, %xmm1167; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1168; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1169; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1170; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]171; AVX1-NEXT: vpmuludq %xmm3, %xmm2, %xmm2172; AVX1-NEXT: vpmuludq %xmm1, %xmm0, %xmm0173; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]174; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]175; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,2,2]176; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]177; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0178; AVX1-NEXT: retq179;180; AVX2-LABEL: var_rotate_v4i32:181; AVX2: # %bb.0:182; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [31,31,31,31]183; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1184; AVX2-NEXT: vpsllvd %xmm1, %xmm0, %xmm2185; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]186; AVX2-NEXT: vpsubd %xmm1, %xmm3, %xmm1187; AVX2-NEXT: vpsrlvd %xmm1, %xmm0, %xmm0188; AVX2-NEXT: vpor %xmm0, %xmm2, %xmm0189; AVX2-NEXT: retq190;191; AVX512NOVLX-LABEL: var_rotate_v4i32:192; AVX512NOVLX: # %bb.0:193; AVX512NOVLX-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1194; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0195; AVX512NOVLX-NEXT: vprolvd %zmm1, %zmm0, %zmm0196; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0197; AVX512NOVLX-NEXT: vzeroupper198; AVX512NOVLX-NEXT: retq199;200; AVX512VLX-LABEL: var_rotate_v4i32:201; AVX512VLX: # %bb.0:202; AVX512VLX-NEXT: vprolvd %xmm1, %xmm0, %xmm0203; AVX512VLX-NEXT: retq204;205; XOP-LABEL: var_rotate_v4i32:206; XOP: # %bb.0:207; XOP-NEXT: vprotd %xmm1, %xmm0, %xmm0208; XOP-NEXT: retq209;210; X86-SSE2-LABEL: var_rotate_v4i32:211; X86-SSE2: # %bb.0:212; X86-SSE2-NEXT: pslld $23, %xmm1213; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1214; X86-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1215; X86-SSE2-NEXT: cvttps2dq %xmm1, %xmm1216; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]217; X86-SSE2-NEXT: pmuludq %xmm1, %xmm0218; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]219; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]220; X86-SSE2-NEXT: pmuludq %xmm2, %xmm1221; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]222; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]223; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]224; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]225; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]226; X86-SSE2-NEXT: por %xmm3, %xmm0227; X86-SSE2-NEXT: retl228 %b32 = sub <4 x i32> <i32 32, i32 32, i32 32, i32 32>, %b229 %shl = shl <4 x i32> %a, %b230 %lshr = lshr <4 x i32> %a, %b32231 %or = or <4 x i32> %shl, %lshr232 ret <4 x i32> %or233}234 235define <8 x i16> @var_rotate_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {236; SSE2-LABEL: var_rotate_v8i16:237; SSE2: # %bb.0:238; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1239; SSE2-NEXT: movdqa %xmm1, %xmm2240; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]241; SSE2-NEXT: pslld $23, %xmm2242; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]243; SSE2-NEXT: paddd %xmm3, %xmm2244; SSE2-NEXT: cvttps2dq %xmm2, %xmm2245; SSE2-NEXT: pslld $16, %xmm2246; SSE2-NEXT: psrad $16, %xmm2247; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]248; SSE2-NEXT: pslld $23, %xmm1249; SSE2-NEXT: paddd %xmm3, %xmm1250; SSE2-NEXT: cvttps2dq %xmm1, %xmm1251; SSE2-NEXT: pslld $16, %xmm1252; SSE2-NEXT: psrad $16, %xmm1253; SSE2-NEXT: packssdw %xmm2, %xmm1254; SSE2-NEXT: movdqa %xmm0, %xmm2255; SSE2-NEXT: pmulhuw %xmm1, %xmm2256; SSE2-NEXT: pmullw %xmm1, %xmm0257; SSE2-NEXT: por %xmm2, %xmm0258; SSE2-NEXT: retq259;260; SSE41-LABEL: var_rotate_v8i16:261; SSE41: # %bb.0:262; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1263; SSE41-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero264; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]265; SSE41-NEXT: pslld $23, %xmm1266; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]267; SSE41-NEXT: paddd %xmm3, %xmm1268; SSE41-NEXT: cvttps2dq %xmm1, %xmm1269; SSE41-NEXT: pslld $23, %xmm2270; SSE41-NEXT: paddd %xmm3, %xmm2271; SSE41-NEXT: cvttps2dq %xmm2, %xmm2272; SSE41-NEXT: packusdw %xmm1, %xmm2273; SSE41-NEXT: movdqa %xmm0, %xmm1274; SSE41-NEXT: pmulhuw %xmm2, %xmm1275; SSE41-NEXT: pmullw %xmm2, %xmm0276; SSE41-NEXT: por %xmm1, %xmm0277; SSE41-NEXT: retq278;279; AVX1-LABEL: var_rotate_v8i16:280; AVX1: # %bb.0:281; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1282; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm1[4,4,5,5,6,6,7,7]283; AVX1-NEXT: vpslld $23, %xmm2, %xmm2284; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]285; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2286; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2287; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero288; AVX1-NEXT: vpslld $23, %xmm1, %xmm1289; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1290; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1291; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1292; AVX1-NEXT: vpmulhuw %xmm1, %xmm0, %xmm2293; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0294; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0295; AVX1-NEXT: retq296;297; AVX2-LABEL: var_rotate_v8i16:298; AVX2: # %bb.0:299; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1300; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2301; AVX2-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]302; AVX2-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm0[4,4,5,5,6,6,7,7]303; AVX2-NEXT: vpsllvd %xmm2, %xmm3, %xmm2304; AVX2-NEXT: vpsrld $16, %xmm2, %xmm2305; AVX2-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]306; AVX2-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero307; AVX2-NEXT: vpsllvd %xmm1, %xmm0, %xmm0308; AVX2-NEXT: vpsrld $16, %xmm0, %xmm0309; AVX2-NEXT: vpackusdw %xmm2, %xmm0, %xmm0310; AVX2-NEXT: retq311;312; AVX512F-LABEL: var_rotate_v8i16:313; AVX512F: # %bb.0:314; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1315; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2316; AVX512F-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]317; AVX512F-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm0[4,4,5,5,6,6,7,7]318; AVX512F-NEXT: vpsllvd %xmm2, %xmm3, %xmm2319; AVX512F-NEXT: vpsrld $16, %xmm2, %xmm2320; AVX512F-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]321; AVX512F-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero322; AVX512F-NEXT: vpsllvd %xmm1, %xmm0, %xmm0323; AVX512F-NEXT: vpsrld $16, %xmm0, %xmm0324; AVX512F-NEXT: vpackusdw %xmm2, %xmm0, %xmm0325; AVX512F-NEXT: retq326;327; AVX512VL-LABEL: var_rotate_v8i16:328; AVX512VL: # %bb.0:329; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1330; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm2331; AVX512VL-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]332; AVX512VL-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm0[4,4,5,5,6,6,7,7]333; AVX512VL-NEXT: vpsllvd %xmm2, %xmm3, %xmm2334; AVX512VL-NEXT: vpsrld $16, %xmm2, %xmm2335; AVX512VL-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]336; AVX512VL-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero337; AVX512VL-NEXT: vpsllvd %xmm1, %xmm0, %xmm0338; AVX512VL-NEXT: vpsrld $16, %xmm0, %xmm0339; AVX512VL-NEXT: vpackusdw %xmm2, %xmm0, %xmm0340; AVX512VL-NEXT: retq341;342; AVX512BW-LABEL: var_rotate_v8i16:343; AVX512BW: # %bb.0:344; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0345; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1346; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm2347; AVX512BW-NEXT: vpbroadcastw {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]348; AVX512BW-NEXT: vpsubw %xmm1, %xmm3, %xmm1349; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0350; AVX512BW-NEXT: vpor %xmm0, %xmm2, %xmm0351; AVX512BW-NEXT: vzeroupper352; AVX512BW-NEXT: retq353;354; AVX512VLBW-LABEL: var_rotate_v8i16:355; AVX512VLBW: # %bb.0:356; AVX512VLBW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1357; AVX512VLBW-NEXT: vpsllvw %xmm1, %xmm0, %xmm2358; AVX512VLBW-NEXT: vpbroadcastw {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]359; AVX512VLBW-NEXT: vpsubw %xmm1, %xmm3, %xmm1360; AVX512VLBW-NEXT: vpsrlvw %xmm1, %xmm0, %xmm0361; AVX512VLBW-NEXT: vpor %xmm0, %xmm2, %xmm0362; AVX512VLBW-NEXT: retq363;364; AVX512VBMI2-LABEL: var_rotate_v8i16:365; AVX512VBMI2: # %bb.0:366; AVX512VBMI2-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1367; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0368; AVX512VBMI2-NEXT: vpshldvw %zmm1, %zmm0, %zmm0369; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0370; AVX512VBMI2-NEXT: vzeroupper371; AVX512VBMI2-NEXT: retq372;373; AVX512VLVBMI2-LABEL: var_rotate_v8i16:374; AVX512VLVBMI2: # %bb.0:375; AVX512VLVBMI2-NEXT: vpshldvw %xmm1, %xmm0, %xmm0376; AVX512VLVBMI2-NEXT: retq377;378; XOP-LABEL: var_rotate_v8i16:379; XOP: # %bb.0:380; XOP-NEXT: vprotw %xmm1, %xmm0, %xmm0381; XOP-NEXT: retq382;383; X86-SSE2-LABEL: var_rotate_v8i16:384; X86-SSE2: # %bb.0:385; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1386; X86-SSE2-NEXT: movdqa %xmm1, %xmm2387; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]388; X86-SSE2-NEXT: pslld $23, %xmm2389; X86-SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]390; X86-SSE2-NEXT: paddd %xmm3, %xmm2391; X86-SSE2-NEXT: cvttps2dq %xmm2, %xmm2392; X86-SSE2-NEXT: pslld $16, %xmm2393; X86-SSE2-NEXT: psrad $16, %xmm2394; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]395; X86-SSE2-NEXT: pslld $23, %xmm1396; X86-SSE2-NEXT: paddd %xmm3, %xmm1397; X86-SSE2-NEXT: cvttps2dq %xmm1, %xmm1398; X86-SSE2-NEXT: pslld $16, %xmm1399; X86-SSE2-NEXT: psrad $16, %xmm1400; X86-SSE2-NEXT: packssdw %xmm2, %xmm1401; X86-SSE2-NEXT: movdqa %xmm0, %xmm2402; X86-SSE2-NEXT: pmulhuw %xmm1, %xmm2403; X86-SSE2-NEXT: pmullw %xmm1, %xmm0404; X86-SSE2-NEXT: por %xmm2, %xmm0405; X86-SSE2-NEXT: retl406 %b16 = sub <8 x i16> <i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16>, %b407 %shl = shl <8 x i16> %a, %b408 %lshr = lshr <8 x i16> %a, %b16409 %or = or <8 x i16> %shl, %lshr410 ret <8 x i16> %or411}412 413define <16 x i8> @var_rotate_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {414; SSE2-LABEL: var_rotate_v16i8:415; SSE2: # %bb.0:416; SSE2-NEXT: movdqa %xmm0, %xmm2417; SSE2-NEXT: psllw $5, %xmm1418; SSE2-NEXT: pxor %xmm0, %xmm0419; SSE2-NEXT: pxor %xmm3, %xmm3420; SSE2-NEXT: pcmpgtb %xmm1, %xmm3421; SSE2-NEXT: movdqa %xmm2, %xmm4422; SSE2-NEXT: psrlw $4, %xmm4423; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4424; SSE2-NEXT: movdqa %xmm2, %xmm5425; SSE2-NEXT: psllw $4, %xmm5426; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5427; SSE2-NEXT: por %xmm4, %xmm5428; SSE2-NEXT: pand %xmm3, %xmm5429; SSE2-NEXT: pandn %xmm2, %xmm3430; SSE2-NEXT: por %xmm5, %xmm3431; SSE2-NEXT: movdqa %xmm3, %xmm2432; SSE2-NEXT: psrlw $6, %xmm2433; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2434; SSE2-NEXT: movdqa %xmm3, %xmm4435; SSE2-NEXT: psllw $2, %xmm4436; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4437; SSE2-NEXT: por %xmm2, %xmm4438; SSE2-NEXT: paddb %xmm1, %xmm1439; SSE2-NEXT: pxor %xmm2, %xmm2440; SSE2-NEXT: pcmpgtb %xmm1, %xmm2441; SSE2-NEXT: pand %xmm2, %xmm4442; SSE2-NEXT: pandn %xmm3, %xmm2443; SSE2-NEXT: por %xmm4, %xmm2444; SSE2-NEXT: movdqa %xmm2, %xmm3445; SSE2-NEXT: paddb %xmm2, %xmm3446; SSE2-NEXT: movdqa %xmm2, %xmm4447; SSE2-NEXT: psrlw $7, %xmm4448; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4449; SSE2-NEXT: por %xmm3, %xmm4450; SSE2-NEXT: paddb %xmm1, %xmm1451; SSE2-NEXT: pcmpgtb %xmm1, %xmm0452; SSE2-NEXT: pand %xmm0, %xmm4453; SSE2-NEXT: pandn %xmm2, %xmm0454; SSE2-NEXT: por %xmm4, %xmm0455; SSE2-NEXT: retq456;457; SSE41-LABEL: var_rotate_v16i8:458; SSE41: # %bb.0:459; SSE41-NEXT: movdqa %xmm1, %xmm2460; SSE41-NEXT: movdqa %xmm0, %xmm1461; SSE41-NEXT: psrlw $4, %xmm0462; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0463; SSE41-NEXT: movdqa %xmm1, %xmm3464; SSE41-NEXT: psllw $4, %xmm3465; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3466; SSE41-NEXT: por %xmm0, %xmm3467; SSE41-NEXT: psllw $5, %xmm2468; SSE41-NEXT: movdqa %xmm2, %xmm0469; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm1470; SSE41-NEXT: movdqa %xmm1, %xmm0471; SSE41-NEXT: psrlw $6, %xmm0472; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0473; SSE41-NEXT: movdqa %xmm1, %xmm3474; SSE41-NEXT: psllw $2, %xmm3475; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3476; SSE41-NEXT: por %xmm0, %xmm3477; SSE41-NEXT: paddb %xmm2, %xmm2478; SSE41-NEXT: movdqa %xmm2, %xmm0479; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm1480; SSE41-NEXT: movdqa %xmm1, %xmm0481; SSE41-NEXT: paddb %xmm1, %xmm0482; SSE41-NEXT: movdqa %xmm1, %xmm3483; SSE41-NEXT: psrlw $7, %xmm3484; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3485; SSE41-NEXT: por %xmm0, %xmm3486; SSE41-NEXT: paddb %xmm2, %xmm2487; SSE41-NEXT: movdqa %xmm2, %xmm0488; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm1489; SSE41-NEXT: movdqa %xmm1, %xmm0490; SSE41-NEXT: retq491;492; AVX-LABEL: var_rotate_v16i8:493; AVX: # %bb.0:494; AVX-NEXT: vpsrlw $4, %xmm0, %xmm2495; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2496; AVX-NEXT: vpsllw $4, %xmm0, %xmm3497; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3498; AVX-NEXT: vpor %xmm2, %xmm3, %xmm2499; AVX-NEXT: vpsllw $5, %xmm1, %xmm1500; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0501; AVX-NEXT: vpsrlw $6, %xmm0, %xmm2502; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2503; AVX-NEXT: vpsllw $2, %xmm0, %xmm3504; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3505; AVX-NEXT: vpor %xmm2, %xmm3, %xmm2506; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1507; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0508; AVX-NEXT: vpaddb %xmm0, %xmm0, %xmm2509; AVX-NEXT: vpsrlw $7, %xmm0, %xmm3510; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3511; AVX-NEXT: vpor %xmm3, %xmm2, %xmm2512; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1513; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0514; AVX-NEXT: retq515;516; AVX512F-LABEL: var_rotate_v16i8:517; AVX512F: # %bb.0:518; AVX512F-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero519; AVX512F-NEXT: vpslld $8, %zmm0, %zmm2520; AVX512F-NEXT: vpord %zmm2, %zmm0, %zmm0521; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1522; AVX512F-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero523; AVX512F-NEXT: vpsllvd %zmm1, %zmm0, %zmm0524; AVX512F-NEXT: vpsrld $8, %zmm0, %zmm0525; AVX512F-NEXT: vpmovdb %zmm0, %xmm0526; AVX512F-NEXT: vzeroupper527; AVX512F-NEXT: retq528;529; AVX512VL-LABEL: var_rotate_v16i8:530; AVX512VL: # %bb.0:531; AVX512VL-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero532; AVX512VL-NEXT: vpslld $8, %zmm0, %zmm2533; AVX512VL-NEXT: vpord %zmm2, %zmm0, %zmm0534; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1535; AVX512VL-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero536; AVX512VL-NEXT: vpsllvd %zmm1, %zmm0, %zmm0537; AVX512VL-NEXT: vpsrld $8, %zmm0, %zmm0538; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0539; AVX512VL-NEXT: vzeroupper540; AVX512VL-NEXT: retq541;542; AVX512BW-LABEL: var_rotate_v16i8:543; AVX512BW: # %bb.0:544; AVX512BW-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]545; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1546; AVX512BW-NEXT: vpxor %xmm3, %xmm3, %xmm3547; AVX512BW-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm3[8],xmm1[9],xmm3[9],xmm1[10],xmm3[10],xmm1[11],xmm3[11],xmm1[12],xmm3[12],xmm1[13],xmm3[13],xmm1[14],xmm3[14],xmm1[15],xmm3[15]548; AVX512BW-NEXT: vpsllvw %zmm3, %zmm2, %zmm2549; AVX512BW-NEXT: vpsrlw $8, %xmm2, %xmm2550; AVX512BW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]551; AVX512BW-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero552; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0553; AVX512BW-NEXT: vpsrlw $8, %xmm0, %xmm0554; AVX512BW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0555; AVX512BW-NEXT: vzeroupper556; AVX512BW-NEXT: retq557;558; AVX512VLBW-LABEL: var_rotate_v16i8:559; AVX512VLBW: # %bb.0:560; AVX512VLBW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1561; AVX512VLBW-NEXT: vpxor %xmm2, %xmm2, %xmm2562; AVX512VLBW-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]563; AVX512VLBW-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]564; AVX512VLBW-NEXT: vpsllvw %xmm2, %xmm3, %xmm2565; AVX512VLBW-NEXT: vpsrlw $8, %xmm2, %xmm2566; AVX512VLBW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]567; AVX512VLBW-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero568; AVX512VLBW-NEXT: vpsllvw %xmm1, %xmm0, %xmm0569; AVX512VLBW-NEXT: vpsrlw $8, %xmm0, %xmm0570; AVX512VLBW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0571; AVX512VLBW-NEXT: retq572;573; AVX512VBMI2-LABEL: var_rotate_v16i8:574; AVX512VBMI2: # %bb.0:575; AVX512VBMI2-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]576; AVX512VBMI2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1577; AVX512VBMI2-NEXT: vpxor %xmm3, %xmm3, %xmm3578; AVX512VBMI2-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm3[8],xmm1[9],xmm3[9],xmm1[10],xmm3[10],xmm1[11],xmm3[11],xmm1[12],xmm3[12],xmm1[13],xmm3[13],xmm1[14],xmm3[14],xmm1[15],xmm3[15]579; AVX512VBMI2-NEXT: vpsllvw %zmm3, %zmm2, %zmm2580; AVX512VBMI2-NEXT: vpsrlw $8, %xmm2, %xmm2581; AVX512VBMI2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]582; AVX512VBMI2-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero583; AVX512VBMI2-NEXT: vpsllvw %zmm1, %zmm0, %zmm0584; AVX512VBMI2-NEXT: vpsrlw $8, %xmm0, %xmm0585; AVX512VBMI2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0586; AVX512VBMI2-NEXT: vzeroupper587; AVX512VBMI2-NEXT: retq588;589; AVX512VLVBMI2-LABEL: var_rotate_v16i8:590; AVX512VLVBMI2: # %bb.0:591; AVX512VLVBMI2-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1592; AVX512VLVBMI2-NEXT: vpxor %xmm2, %xmm2, %xmm2593; AVX512VLVBMI2-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]594; AVX512VLVBMI2-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]595; AVX512VLVBMI2-NEXT: vpsllvw %xmm2, %xmm3, %xmm2596; AVX512VLVBMI2-NEXT: vpsrlw $8, %xmm2, %xmm2597; AVX512VLVBMI2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]598; AVX512VLVBMI2-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero599; AVX512VLVBMI2-NEXT: vpsllvw %xmm1, %xmm0, %xmm0600; AVX512VLVBMI2-NEXT: vpsrlw $8, %xmm0, %xmm0601; AVX512VLVBMI2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0602; AVX512VLVBMI2-NEXT: retq603;604; XOP-LABEL: var_rotate_v16i8:605; XOP: # %bb.0:606; XOP-NEXT: vprotb %xmm1, %xmm0, %xmm0607; XOP-NEXT: retq608;609; X86-SSE2-LABEL: var_rotate_v16i8:610; X86-SSE2: # %bb.0:611; X86-SSE2-NEXT: movdqa %xmm0, %xmm2612; X86-SSE2-NEXT: psllw $5, %xmm1613; X86-SSE2-NEXT: pxor %xmm0, %xmm0614; X86-SSE2-NEXT: pxor %xmm3, %xmm3615; X86-SSE2-NEXT: pcmpgtb %xmm1, %xmm3616; X86-SSE2-NEXT: movdqa %xmm2, %xmm4617; X86-SSE2-NEXT: psrlw $4, %xmm4618; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm4619; X86-SSE2-NEXT: movdqa %xmm2, %xmm5620; X86-SSE2-NEXT: psllw $4, %xmm5621; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm5622; X86-SSE2-NEXT: por %xmm4, %xmm5623; X86-SSE2-NEXT: pand %xmm3, %xmm5624; X86-SSE2-NEXT: pandn %xmm2, %xmm3625; X86-SSE2-NEXT: por %xmm5, %xmm3626; X86-SSE2-NEXT: movdqa %xmm3, %xmm2627; X86-SSE2-NEXT: psrlw $6, %xmm2628; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2629; X86-SSE2-NEXT: movdqa %xmm3, %xmm4630; X86-SSE2-NEXT: psllw $2, %xmm4631; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm4632; X86-SSE2-NEXT: por %xmm2, %xmm4633; X86-SSE2-NEXT: paddb %xmm1, %xmm1634; X86-SSE2-NEXT: pxor %xmm2, %xmm2635; X86-SSE2-NEXT: pcmpgtb %xmm1, %xmm2636; X86-SSE2-NEXT: pand %xmm2, %xmm4637; X86-SSE2-NEXT: pandn %xmm3, %xmm2638; X86-SSE2-NEXT: por %xmm4, %xmm2639; X86-SSE2-NEXT: movdqa %xmm2, %xmm3640; X86-SSE2-NEXT: paddb %xmm2, %xmm3641; X86-SSE2-NEXT: movdqa %xmm2, %xmm4642; X86-SSE2-NEXT: psrlw $7, %xmm4643; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm4644; X86-SSE2-NEXT: por %xmm3, %xmm4645; X86-SSE2-NEXT: paddb %xmm1, %xmm1646; X86-SSE2-NEXT: pcmpgtb %xmm1, %xmm0647; X86-SSE2-NEXT: pand %xmm0, %xmm4648; X86-SSE2-NEXT: pandn %xmm2, %xmm0649; X86-SSE2-NEXT: por %xmm4, %xmm0650; X86-SSE2-NEXT: retl651 %b8 = sub <16 x i8> <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8>, %b652 %shl = shl <16 x i8> %a, %b653 %lshr = lshr <16 x i8> %a, %b8654 %or = or <16 x i8> %shl, %lshr655 ret <16 x i8> %or656}657 658;659; Uniform Variable Rotates660;661 662define <2 x i64> @splatvar_rotate_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {663; SSE2-LABEL: splatvar_rotate_v2i64:664; SSE2: # %bb.0:665; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [64,64]666; SSE2-NEXT: psubq %xmm1, %xmm2667; SSE2-NEXT: movdqa %xmm0, %xmm3668; SSE2-NEXT: psllq %xmm1, %xmm3669; SSE2-NEXT: psrlq %xmm2, %xmm0670; SSE2-NEXT: por %xmm3, %xmm0671; SSE2-NEXT: retq672;673; SSE41-LABEL: splatvar_rotate_v2i64:674; SSE41: # %bb.0:675; SSE41-NEXT: pmovsxbq {{.*#+}} xmm2 = [64,64]676; SSE41-NEXT: psubq %xmm1, %xmm2677; SSE41-NEXT: movdqa %xmm0, %xmm3678; SSE41-NEXT: psllq %xmm1, %xmm3679; SSE41-NEXT: psrlq %xmm2, %xmm0680; SSE41-NEXT: por %xmm3, %xmm0681; SSE41-NEXT: retq682;683; AVX-LABEL: splatvar_rotate_v2i64:684; AVX: # %bb.0:685; AVX-NEXT: vpmovsxbq {{.*#+}} xmm2 = [64,64]686; AVX-NEXT: vpsubq %xmm1, %xmm2, %xmm2687; AVX-NEXT: vpsllq %xmm1, %xmm0, %xmm1688; AVX-NEXT: vpsrlq %xmm2, %xmm0, %xmm0689; AVX-NEXT: vpor %xmm0, %xmm1, %xmm0690; AVX-NEXT: retq691;692; AVX512NOVLX-LABEL: splatvar_rotate_v2i64:693; AVX512NOVLX: # %bb.0:694; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0695; AVX512NOVLX-NEXT: vpbroadcastq %xmm1, %xmm1696; AVX512NOVLX-NEXT: vprolvq %zmm1, %zmm0, %zmm0697; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0698; AVX512NOVLX-NEXT: vzeroupper699; AVX512NOVLX-NEXT: retq700;701; AVX512VLX-LABEL: splatvar_rotate_v2i64:702; AVX512VLX: # %bb.0:703; AVX512VLX-NEXT: vpbroadcastq %xmm1, %xmm1704; AVX512VLX-NEXT: vprolvq %xmm1, %xmm0, %xmm0705; AVX512VLX-NEXT: retq706;707; XOPAVX1-LABEL: splatvar_rotate_v2i64:708; XOPAVX1: # %bb.0:709; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]710; XOPAVX1-NEXT: vprotq %xmm1, %xmm0, %xmm0711; XOPAVX1-NEXT: retq712;713; XOPAVX2-LABEL: splatvar_rotate_v2i64:714; XOPAVX2: # %bb.0:715; XOPAVX2-NEXT: vpbroadcastq %xmm1, %xmm1716; XOPAVX2-NEXT: vprotq %xmm1, %xmm0, %xmm0717; XOPAVX2-NEXT: retq718;719; X86-SSE2-LABEL: splatvar_rotate_v2i64:720; X86-SSE2: # %bb.0:721; X86-SSE2-NEXT: movd {{.*#+}} xmm2 = [64,0,0,0]722; X86-SSE2-NEXT: psubq %xmm1, %xmm2723; X86-SSE2-NEXT: movdqa %xmm0, %xmm3724; X86-SSE2-NEXT: psllq %xmm1, %xmm3725; X86-SSE2-NEXT: psrlq %xmm2, %xmm0726; X86-SSE2-NEXT: por %xmm3, %xmm0727; X86-SSE2-NEXT: retl728 %splat = shufflevector <2 x i64> %b, <2 x i64> undef, <2 x i32> zeroinitializer729 %splat64 = sub <2 x i64> <i64 64, i64 64>, %splat730 %shl = shl <2 x i64> %a, %splat731 %lshr = lshr <2 x i64> %a, %splat64732 %or = or <2 x i64> %shl, %lshr733 ret <2 x i64> %or734}735 736define <4 x i32> @splatvar_rotate_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {737; SSE-LABEL: splatvar_rotate_v4i32:738; SSE: # %bb.0:739; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1740; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]741; SSE-NEXT: psllq %xmm1, %xmm2742; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]743; SSE-NEXT: psllq %xmm1, %xmm0744; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm2[1,3]745; SSE-NEXT: retq746;747; AVX-LABEL: splatvar_rotate_v4i32:748; AVX: # %bb.0:749; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1750; AVX-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]751; AVX-NEXT: vpsllq %xmm1, %xmm2, %xmm2752; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]753; AVX-NEXT: vpsllq %xmm1, %xmm0, %xmm0754; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm2[1,3]755; AVX-NEXT: retq756;757; AVX512NOVLX-LABEL: splatvar_rotate_v4i32:758; AVX512NOVLX: # %bb.0:759; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0760; AVX512NOVLX-NEXT: vpbroadcastd %xmm1, %xmm1761; AVX512NOVLX-NEXT: vprolvd %zmm1, %zmm0, %zmm0762; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0763; AVX512NOVLX-NEXT: vzeroupper764; AVX512NOVLX-NEXT: retq765;766; AVX512VLX-LABEL: splatvar_rotate_v4i32:767; AVX512VLX: # %bb.0:768; AVX512VLX-NEXT: vpbroadcastd %xmm1, %xmm1769; AVX512VLX-NEXT: vprolvd %xmm1, %xmm0, %xmm0770; AVX512VLX-NEXT: retq771;772; XOPAVX1-LABEL: splatvar_rotate_v4i32:773; XOPAVX1: # %bb.0:774; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]775; XOPAVX1-NEXT: vprotd %xmm1, %xmm0, %xmm0776; XOPAVX1-NEXT: retq777;778; XOPAVX2-LABEL: splatvar_rotate_v4i32:779; XOPAVX2: # %bb.0:780; XOPAVX2-NEXT: vpbroadcastd %xmm1, %xmm1781; XOPAVX2-NEXT: vprotd %xmm1, %xmm0, %xmm0782; XOPAVX2-NEXT: retq783;784; X86-SSE2-LABEL: splatvar_rotate_v4i32:785; X86-SSE2: # %bb.0:786; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1787; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]788; X86-SSE2-NEXT: psllq %xmm1, %xmm2789; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]790; X86-SSE2-NEXT: psllq %xmm1, %xmm0791; X86-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm2[1,3]792; X86-SSE2-NEXT: retl793 %splat = shufflevector <4 x i32> %b, <4 x i32> undef, <4 x i32> zeroinitializer794 %splat32 = sub <4 x i32> <i32 32, i32 32, i32 32, i32 32>, %splat795 %shl = shl <4 x i32> %a, %splat796 %lshr = lshr <4 x i32> %a, %splat32797 %or = or <4 x i32> %shl, %lshr798 ret <4 x i32> %or799}800 801define <8 x i16> @splatvar_rotate_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {802; SSE2-LABEL: splatvar_rotate_v8i16:803; SSE2: # %bb.0:804; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1805; SSE2-NEXT: movdqa %xmm0, %xmm2806; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]807; SSE2-NEXT: pslld %xmm1, %xmm2808; SSE2-NEXT: psrad $16, %xmm2809; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]810; SSE2-NEXT: pslld %xmm1, %xmm0811; SSE2-NEXT: psrad $16, %xmm0812; SSE2-NEXT: packssdw %xmm2, %xmm0813; SSE2-NEXT: retq814;815; SSE41-LABEL: splatvar_rotate_v8i16:816; SSE41: # %bb.0:817; SSE41-NEXT: pmovsxbq {{.*#+}} xmm2 = [15,0]818; SSE41-NEXT: movdqa %xmm1, %xmm3819; SSE41-NEXT: pandn %xmm2, %xmm3820; SSE41-NEXT: movdqa %xmm0, %xmm4821; SSE41-NEXT: psrlw $1, %xmm4822; SSE41-NEXT: psrlw %xmm3, %xmm4823; SSE41-NEXT: pand %xmm2, %xmm1824; SSE41-NEXT: psllw %xmm1, %xmm0825; SSE41-NEXT: por %xmm4, %xmm0826; SSE41-NEXT: retq827;828; AVX-LABEL: splatvar_rotate_v8i16:829; AVX: # %bb.0:830; AVX-NEXT: vpmovsxbq {{.*#+}} xmm2 = [15,0]831; AVX-NEXT: vpandn %xmm2, %xmm1, %xmm3832; AVX-NEXT: vpsrlw $1, %xmm0, %xmm4833; AVX-NEXT: vpsrlw %xmm3, %xmm4, %xmm3834; AVX-NEXT: vpand %xmm2, %xmm1, %xmm1835; AVX-NEXT: vpsllw %xmm1, %xmm0, %xmm0836; AVX-NEXT: vpor %xmm3, %xmm0, %xmm0837; AVX-NEXT: retq838;839; AVX512F-LABEL: splatvar_rotate_v8i16:840; AVX512F: # %bb.0:841; AVX512F-NEXT: vpmovsxbq {{.*#+}} xmm2 = [15,0]842; AVX512F-NEXT: vpandn %xmm2, %xmm1, %xmm3843; AVX512F-NEXT: vpsrlw $1, %xmm0, %xmm4844; AVX512F-NEXT: vpsrlw %xmm3, %xmm4, %xmm3845; AVX512F-NEXT: vpand %xmm2, %xmm1, %xmm1846; AVX512F-NEXT: vpsllw %xmm1, %xmm0, %xmm0847; AVX512F-NEXT: vpor %xmm3, %xmm0, %xmm0848; AVX512F-NEXT: retq849;850; AVX512VL-LABEL: splatvar_rotate_v8i16:851; AVX512VL: # %bb.0:852; AVX512VL-NEXT: vpmovsxbq {{.*#+}} xmm2 = [15,0]853; AVX512VL-NEXT: vpandn %xmm2, %xmm1, %xmm3854; AVX512VL-NEXT: vpsrlw $1, %xmm0, %xmm4855; AVX512VL-NEXT: vpsrlw %xmm3, %xmm4, %xmm3856; AVX512VL-NEXT: vpand %xmm2, %xmm1, %xmm1857; AVX512VL-NEXT: vpsllw %xmm1, %xmm0, %xmm0858; AVX512VL-NEXT: vpor %xmm3, %xmm0, %xmm0859; AVX512VL-NEXT: retq860;861; AVX512BW-LABEL: splatvar_rotate_v8i16:862; AVX512BW: # %bb.0:863; AVX512BW-NEXT: vpmovsxbq {{.*#+}} xmm2 = [15,0]864; AVX512BW-NEXT: vpandn %xmm2, %xmm1, %xmm3865; AVX512BW-NEXT: vpsrlw $1, %xmm0, %xmm4866; AVX512BW-NEXT: vpsrlw %xmm3, %xmm4, %xmm3867; AVX512BW-NEXT: vpand %xmm2, %xmm1, %xmm1868; AVX512BW-NEXT: vpsllw %xmm1, %xmm0, %xmm0869; AVX512BW-NEXT: vpor %xmm3, %xmm0, %xmm0870; AVX512BW-NEXT: retq871;872; AVX512VLBW-LABEL: splatvar_rotate_v8i16:873; AVX512VLBW: # %bb.0:874; AVX512VLBW-NEXT: vpmovsxbq {{.*#+}} xmm2 = [15,0]875; AVX512VLBW-NEXT: vpandn %xmm2, %xmm1, %xmm3876; AVX512VLBW-NEXT: vpsrlw $1, %xmm0, %xmm4877; AVX512VLBW-NEXT: vpsrlw %xmm3, %xmm4, %xmm3878; AVX512VLBW-NEXT: vpand %xmm2, %xmm1, %xmm1879; AVX512VLBW-NEXT: vpsllw %xmm1, %xmm0, %xmm0880; AVX512VLBW-NEXT: vpor %xmm3, %xmm0, %xmm0881; AVX512VLBW-NEXT: retq882;883; AVX512VBMI2-LABEL: splatvar_rotate_v8i16:884; AVX512VBMI2: # %bb.0:885; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0886; AVX512VBMI2-NEXT: vpbroadcastw %xmm1, %xmm1887; AVX512VBMI2-NEXT: vpshldvw %zmm1, %zmm0, %zmm0888; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0889; AVX512VBMI2-NEXT: vzeroupper890; AVX512VBMI2-NEXT: retq891;892; AVX512VLVBMI2-LABEL: splatvar_rotate_v8i16:893; AVX512VLVBMI2: # %bb.0:894; AVX512VLVBMI2-NEXT: vpbroadcastw %xmm1, %xmm1895; AVX512VLVBMI2-NEXT: vpshldvw %xmm1, %xmm0, %xmm0896; AVX512VLVBMI2-NEXT: retq897;898; XOPAVX1-LABEL: splatvar_rotate_v8i16:899; XOPAVX1: # %bb.0:900; XOPAVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]901; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]902; XOPAVX1-NEXT: vprotw %xmm1, %xmm0, %xmm0903; XOPAVX1-NEXT: retq904;905; XOPAVX2-LABEL: splatvar_rotate_v8i16:906; XOPAVX2: # %bb.0:907; XOPAVX2-NEXT: vpbroadcastw %xmm1, %xmm1908; XOPAVX2-NEXT: vprotw %xmm1, %xmm0, %xmm0909; XOPAVX2-NEXT: retq910;911; X86-SSE2-LABEL: splatvar_rotate_v8i16:912; X86-SSE2: # %bb.0:913; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1914; X86-SSE2-NEXT: movdqa %xmm0, %xmm2915; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]916; X86-SSE2-NEXT: pslld %xmm1, %xmm2917; X86-SSE2-NEXT: psrad $16, %xmm2918; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]919; X86-SSE2-NEXT: pslld %xmm1, %xmm0920; X86-SSE2-NEXT: psrad $16, %xmm0921; X86-SSE2-NEXT: packssdw %xmm2, %xmm0922; X86-SSE2-NEXT: retl923 %splat = shufflevector <8 x i16> %b, <8 x i16> undef, <8 x i32> zeroinitializer924 %splat16 = sub <8 x i16> <i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16>, %splat925 %shl = shl <8 x i16> %a, %splat926 %lshr = lshr <8 x i16> %a, %splat16927 %or = or <8 x i16> %shl, %lshr928 ret <8 x i16> %or929}930 931define <16 x i8> @splatvar_rotate_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {932; SSE-LABEL: splatvar_rotate_v16i8:933; SSE: # %bb.0:934; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1935; SSE-NEXT: movdqa %xmm0, %xmm2936; SSE-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]937; SSE-NEXT: psllw %xmm1, %xmm2938; SSE-NEXT: psrlw $8, %xmm2939; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]940; SSE-NEXT: psllw %xmm1, %xmm0941; SSE-NEXT: psrlw $8, %xmm0942; SSE-NEXT: packuswb %xmm2, %xmm0943; SSE-NEXT: retq944;945; AVX-LABEL: splatvar_rotate_v16i8:946; AVX: # %bb.0:947; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1948; AVX-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]949; AVX-NEXT: vpsllw %xmm1, %xmm2, %xmm2950; AVX-NEXT: vpsrlw $8, %xmm2, %xmm2951; AVX-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]952; AVX-NEXT: vpsllw %xmm1, %xmm0, %xmm0953; AVX-NEXT: vpsrlw $8, %xmm0, %xmm0954; AVX-NEXT: vpackuswb %xmm2, %xmm0, %xmm0955; AVX-NEXT: retq956;957; AVX512-LABEL: splatvar_rotate_v16i8:958; AVX512: # %bb.0:959; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1960; AVX512-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]961; AVX512-NEXT: vpsllw %xmm1, %xmm2, %xmm2962; AVX512-NEXT: vpsrlw $8, %xmm2, %xmm2963; AVX512-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]964; AVX512-NEXT: vpsllw %xmm1, %xmm0, %xmm0965; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm0966; AVX512-NEXT: vpackuswb %xmm2, %xmm0, %xmm0967; AVX512-NEXT: retq968;969; XOPAVX1-LABEL: splatvar_rotate_v16i8:970; XOPAVX1: # %bb.0:971; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2972; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1973; XOPAVX1-NEXT: vprotb %xmm1, %xmm0, %xmm0974; XOPAVX1-NEXT: retq975;976; XOPAVX2-LABEL: splatvar_rotate_v16i8:977; XOPAVX2: # %bb.0:978; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm1979; XOPAVX2-NEXT: vprotb %xmm1, %xmm0, %xmm0980; XOPAVX2-NEXT: retq981;982; X86-SSE2-LABEL: splatvar_rotate_v16i8:983; X86-SSE2: # %bb.0:984; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1985; X86-SSE2-NEXT: movdqa %xmm0, %xmm2986; X86-SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]987; X86-SSE2-NEXT: psllw %xmm1, %xmm2988; X86-SSE2-NEXT: psrlw $8, %xmm2989; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]990; X86-SSE2-NEXT: psllw %xmm1, %xmm0991; X86-SSE2-NEXT: psrlw $8, %xmm0992; X86-SSE2-NEXT: packuswb %xmm2, %xmm0993; X86-SSE2-NEXT: retl994 %splat = shufflevector <16 x i8> %b, <16 x i8> undef, <16 x i32> zeroinitializer995 %splat8 = sub <16 x i8> <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8>, %splat996 %shl = shl <16 x i8> %a, %splat997 %lshr = lshr <16 x i8> %a, %splat8998 %or = or <16 x i8> %shl, %lshr999 ret <16 x i8> %or1000}1001 1002;1003; Constant Rotates1004;1005 1006define <2 x i64> @constant_rotate_v2i64(<2 x i64> %a) nounwind {1007; SSE2-LABEL: constant_rotate_v2i64:1008; SSE2: # %bb.0:1009; SSE2-NEXT: movdqa %xmm0, %xmm11010; SSE2-NEXT: psrlq $60, %xmm11011; SSE2-NEXT: movdqa %xmm0, %xmm21012; SSE2-NEXT: psrlq $50, %xmm21013; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]1014; SSE2-NEXT: movdqa %xmm0, %xmm11015; SSE2-NEXT: psllq $4, %xmm11016; SSE2-NEXT: psllq $14, %xmm01017; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]1018; SSE2-NEXT: orpd %xmm2, %xmm01019; SSE2-NEXT: retq1020;1021; SSE41-LABEL: constant_rotate_v2i64:1022; SSE41: # %bb.0:1023; SSE41-NEXT: movdqa %xmm0, %xmm11024; SSE41-NEXT: psrlq $50, %xmm11025; SSE41-NEXT: movdqa %xmm0, %xmm21026; SSE41-NEXT: psrlq $60, %xmm21027; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]1028; SSE41-NEXT: movdqa %xmm0, %xmm11029; SSE41-NEXT: psllq $14, %xmm11030; SSE41-NEXT: psllq $4, %xmm01031; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]1032; SSE41-NEXT: por %xmm2, %xmm01033; SSE41-NEXT: retq1034;1035; AVX1-LABEL: constant_rotate_v2i64:1036; AVX1: # %bb.0:1037; AVX1-NEXT: vpsrlq $50, %xmm0, %xmm11038; AVX1-NEXT: vpsrlq $60, %xmm0, %xmm21039; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]1040; AVX1-NEXT: vpsllq $14, %xmm0, %xmm21041; AVX1-NEXT: vpsllq $4, %xmm0, %xmm01042; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]1043; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm01044; AVX1-NEXT: retq1045;1046; AVX2-LABEL: constant_rotate_v2i64:1047; AVX2: # %bb.0:1048; AVX2-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11049; AVX2-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01050; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01051; AVX2-NEXT: retq1052;1053; AVX512NOVLX-LABEL: constant_rotate_v2i64:1054; AVX512NOVLX: # %bb.0:1055; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01056; AVX512NOVLX-NEXT: vpmovsxbq {{.*#+}} xmm1 = [4,14]1057; AVX512NOVLX-NEXT: vprolvq %zmm1, %zmm0, %zmm01058; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01059; AVX512NOVLX-NEXT: vzeroupper1060; AVX512NOVLX-NEXT: retq1061;1062; AVX512VLX-LABEL: constant_rotate_v2i64:1063; AVX512VLX: # %bb.0:1064; AVX512VLX-NEXT: vprolvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01065; AVX512VLX-NEXT: retq1066;1067; XOP-LABEL: constant_rotate_v2i64:1068; XOP: # %bb.0:1069; XOP-NEXT: vprotq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01070; XOP-NEXT: retq1071;1072; X86-SSE2-LABEL: constant_rotate_v2i64:1073; X86-SSE2: # %bb.0:1074; X86-SSE2-NEXT: movdqa %xmm0, %xmm11075; X86-SSE2-NEXT: psrlq $60, %xmm11076; X86-SSE2-NEXT: movdqa %xmm0, %xmm21077; X86-SSE2-NEXT: psrlq $50, %xmm21078; X86-SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]1079; X86-SSE2-NEXT: movdqa %xmm0, %xmm11080; X86-SSE2-NEXT: psllq $4, %xmm11081; X86-SSE2-NEXT: psllq $14, %xmm01082; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]1083; X86-SSE2-NEXT: orpd %xmm2, %xmm01084; X86-SSE2-NEXT: retl1085 %shl = shl <2 x i64> %a, <i64 4, i64 14>1086 %lshr = lshr <2 x i64> %a, <i64 60, i64 50>1087 %or = or <2 x i64> %shl, %lshr1088 ret <2 x i64> %or1089}1090 1091define <4 x i32> @constant_rotate_v4i32(<4 x i32> %a) nounwind {1092; SSE2-LABEL: constant_rotate_v4i32:1093; SSE2: # %bb.0:1094; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1095; SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16,32,64,128]1096; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]1097; SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [32,u,128,u]1098; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]1099; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]1100; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1101; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1102; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1103; SSE2-NEXT: por %xmm2, %xmm01104; SSE2-NEXT: retq1105;1106; SSE41-LABEL: constant_rotate_v4i32:1107; SSE41: # %bb.0:1108; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1109; SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [32,u,128,u]1110; SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16,32,64,128]1111; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1112; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1113; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1114; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1115; SSE41-NEXT: por %xmm2, %xmm01116; SSE41-NEXT: retq1117;1118; AVX1-LABEL: constant_rotate_v4i32:1119; AVX1: # %bb.0:1120; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1121; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [32,u,128,u]1122; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [16,32,64,128]1123; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1124; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1125; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1126; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1127; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm01128; AVX1-NEXT: retq1129;1130; AVX2-LABEL: constant_rotate_v4i32:1131; AVX2: # %bb.0:1132; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11133; AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01134; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01135; AVX2-NEXT: retq1136;1137; AVX512NOVLX-LABEL: constant_rotate_v4i32:1138; AVX512NOVLX: # %bb.0:1139; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01140; AVX512NOVLX-NEXT: vpmovsxbd {{.*#+}} xmm1 = [4,5,6,7]1141; AVX512NOVLX-NEXT: vprolvd %zmm1, %zmm0, %zmm01142; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01143; AVX512NOVLX-NEXT: vzeroupper1144; AVX512NOVLX-NEXT: retq1145;1146; AVX512VLX-LABEL: constant_rotate_v4i32:1147; AVX512VLX: # %bb.0:1148; AVX512VLX-NEXT: vprolvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01149; AVX512VLX-NEXT: retq1150;1151; XOP-LABEL: constant_rotate_v4i32:1152; XOP: # %bb.0:1153; XOP-NEXT: vprotd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01154; XOP-NEXT: retq1155;1156; X86-SSE2-LABEL: constant_rotate_v4i32:1157; X86-SSE2: # %bb.0:1158; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1159; X86-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [16,32,64,128]1160; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]1161; X86-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [32,u,128,u]1162; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]1163; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]1164; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1165; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1166; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1167; X86-SSE2-NEXT: por %xmm2, %xmm01168; X86-SSE2-NEXT: retl1169 %shl = shl <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>1170 %lshr = lshr <4 x i32> %a, <i32 28, i32 27, i32 26, i32 25>1171 %or = or <4 x i32> %shl, %lshr1172 ret <4 x i32> %or1173}1174 1175define <8 x i16> @constant_rotate_v8i16(<8 x i16> %a) nounwind {1176; SSE2-LABEL: constant_rotate_v8i16:1177; SSE2: # %bb.0:1178; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]1179; SSE2-NEXT: movdqa %xmm0, %xmm21180; SSE2-NEXT: pmulhuw %xmm1, %xmm21181; SSE2-NEXT: pmullw %xmm1, %xmm01182; SSE2-NEXT: por %xmm2, %xmm01183; SSE2-NEXT: retq1184;1185; SSE41-LABEL: constant_rotate_v8i16:1186; SSE41: # %bb.0:1187; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]1188; SSE41-NEXT: movdqa %xmm0, %xmm21189; SSE41-NEXT: pmulhuw %xmm1, %xmm21190; SSE41-NEXT: pmullw %xmm1, %xmm01191; SSE41-NEXT: por %xmm2, %xmm01192; SSE41-NEXT: retq1193;1194; AVX-LABEL: constant_rotate_v8i16:1195; AVX: # %bb.0:1196; AVX-NEXT: vpmovzxbw {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]1197; AVX-NEXT: vpmulhuw %xmm1, %xmm0, %xmm21198; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm01199; AVX-NEXT: vpor %xmm2, %xmm0, %xmm01200; AVX-NEXT: retq1201;1202; AVX512F-LABEL: constant_rotate_v8i16:1203; AVX512F: # %bb.0:1204; AVX512F-NEXT: vpmovzxbw {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]1205; AVX512F-NEXT: vpmulhuw %xmm1, %xmm0, %xmm21206; AVX512F-NEXT: vpmullw %xmm1, %xmm0, %xmm01207; AVX512F-NEXT: vpor %xmm2, %xmm0, %xmm01208; AVX512F-NEXT: retq1209;1210; AVX512VL-LABEL: constant_rotate_v8i16:1211; AVX512VL: # %bb.0:1212; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]1213; AVX512VL-NEXT: vpmulhuw %xmm1, %xmm0, %xmm21214; AVX512VL-NEXT: vpmullw %xmm1, %xmm0, %xmm01215; AVX512VL-NEXT: vpor %xmm2, %xmm0, %xmm01216; AVX512VL-NEXT: retq1217;1218; AVX512BW-LABEL: constant_rotate_v8i16:1219; AVX512BW: # %bb.0:1220; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01221; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]1222; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm2 = [16,15,14,13,12,11,10,9]1223; AVX512BW-NEXT: vpsrlvw %zmm2, %zmm0, %zmm21224; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm01225; AVX512BW-NEXT: vpor %xmm2, %xmm0, %xmm01226; AVX512BW-NEXT: vzeroupper1227; AVX512BW-NEXT: retq1228;1229; AVX512VLBW-LABEL: constant_rotate_v8i16:1230; AVX512VLBW: # %bb.0:1231; AVX512VLBW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11232; AVX512VLBW-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01233; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm01234; AVX512VLBW-NEXT: retq1235;1236; AVX512VBMI2-LABEL: constant_rotate_v8i16:1237; AVX512VBMI2: # %bb.0:1238; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01239; AVX512VBMI2-NEXT: vpmovsxbw {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]1240; AVX512VBMI2-NEXT: vpshldvw %zmm1, %zmm0, %zmm01241; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01242; AVX512VBMI2-NEXT: vzeroupper1243; AVX512VBMI2-NEXT: retq1244;1245; AVX512VLVBMI2-LABEL: constant_rotate_v8i16:1246; AVX512VLVBMI2: # %bb.0:1247; AVX512VLVBMI2-NEXT: vpshldvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01248; AVX512VLVBMI2-NEXT: retq1249;1250; XOP-LABEL: constant_rotate_v8i16:1251; XOP: # %bb.0:1252; XOP-NEXT: vprotw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01253; XOP-NEXT: retq1254;1255; X86-SSE2-LABEL: constant_rotate_v8i16:1256; X86-SSE2: # %bb.0:1257; X86-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]1258; X86-SSE2-NEXT: movdqa %xmm0, %xmm21259; X86-SSE2-NEXT: pmulhuw %xmm1, %xmm21260; X86-SSE2-NEXT: pmullw %xmm1, %xmm01261; X86-SSE2-NEXT: por %xmm2, %xmm01262; X86-SSE2-NEXT: retl1263 %shl = shl <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>1264 %lshr = lshr <8 x i16> %a, <i16 16, i16 15, i16 14, i16 13, i16 12, i16 11, i16 10, i16 9>1265 %or = or <8 x i16> %shl, %lshr1266 ret <8 x i16> %or1267}1268 1269define <16 x i8> @constant_rotate_v16i8(<16 x i8> %a) nounwind {1270; SSE-LABEL: constant_rotate_v16i8:1271; SSE: # %bb.0:1272; SSE-NEXT: movdqa %xmm0, %xmm11273; SSE-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]1274; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [1,128,64,32,16,8,4,2]1275; SSE-NEXT: psrlw $8, %xmm11276; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1277; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,2,4,8,16,32,64,128]1278; SSE-NEXT: psrlw $8, %xmm01279; SSE-NEXT: packuswb %xmm1, %xmm01280; SSE-NEXT: retq1281;1282; AVX-LABEL: constant_rotate_v16i8:1283; AVX: # %bb.0:1284; AVX-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1285; AVX-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,128,64,32,16,8,4,2]1286; AVX-NEXT: vpsrlw $8, %xmm1, %xmm11287; AVX-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1288; AVX-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]1289; AVX-NEXT: vpsrlw $8, %xmm0, %xmm01290; AVX-NEXT: vpackuswb %xmm1, %xmm0, %xmm01291; AVX-NEXT: retq1292;1293; AVX512F-LABEL: constant_rotate_v16i8:1294; AVX512F: # %bb.0:1295; AVX512F-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1296; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,128,64,32,16,8,4,2]1297; AVX512F-NEXT: vpsrlw $8, %xmm1, %xmm11298; AVX512F-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1299; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]1300; AVX512F-NEXT: vpsrlw $8, %xmm0, %xmm01301; AVX512F-NEXT: vpackuswb %xmm1, %xmm0, %xmm01302; AVX512F-NEXT: retq1303;1304; AVX512VL-LABEL: constant_rotate_v16i8:1305; AVX512VL: # %bb.0:1306; AVX512VL-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1307; AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,128,64,32,16,8,4,2]1308; AVX512VL-NEXT: vpsrlw $8, %xmm1, %xmm11309; AVX512VL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1310; AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]1311; AVX512VL-NEXT: vpsrlw $8, %xmm0, %xmm01312; AVX512VL-NEXT: vpackuswb %xmm1, %xmm0, %xmm01313; AVX512VL-NEXT: retq1314;1315; AVX512BW-LABEL: constant_rotate_v16i8:1316; AVX512BW: # %bb.0:1317; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm1 = [0,7,6,5,4,3,2,1]1318; AVX512BW-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1319; AVX512BW-NEXT: vpsllvw %zmm1, %zmm2, %zmm11320; AVX512BW-NEXT: vpsrlw $8, %xmm1, %xmm11321; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7]1322; AVX512BW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1323; AVX512BW-NEXT: vpsllvw %zmm2, %zmm0, %zmm01324; AVX512BW-NEXT: vpsrlw $8, %xmm0, %xmm01325; AVX512BW-NEXT: vpackuswb %xmm1, %xmm0, %xmm01326; AVX512BW-NEXT: vzeroupper1327; AVX512BW-NEXT: retq1328;1329; AVX512VLBW-LABEL: constant_rotate_v16i8:1330; AVX512VLBW: # %bb.0:1331; AVX512VLBW-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1332; AVX512VLBW-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11333; AVX512VLBW-NEXT: vpsrlw $8, %xmm1, %xmm11334; AVX512VLBW-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1335; AVX512VLBW-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01336; AVX512VLBW-NEXT: vpsrlw $8, %xmm0, %xmm01337; AVX512VLBW-NEXT: vpackuswb %xmm1, %xmm0, %xmm01338; AVX512VLBW-NEXT: retq1339;1340; AVX512VBMI2-LABEL: constant_rotate_v16i8:1341; AVX512VBMI2: # %bb.0:1342; AVX512VBMI2-NEXT: vpmovsxbw {{.*#+}} xmm1 = [0,7,6,5,4,3,2,1]1343; AVX512VBMI2-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1344; AVX512VBMI2-NEXT: vpsllvw %zmm1, %zmm2, %zmm11345; AVX512VBMI2-NEXT: vpsrlw $8, %xmm1, %xmm11346; AVX512VBMI2-NEXT: vpmovsxbw {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7]1347; AVX512VBMI2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1348; AVX512VBMI2-NEXT: vpsllvw %zmm2, %zmm0, %zmm01349; AVX512VBMI2-NEXT: vpsrlw $8, %xmm0, %xmm01350; AVX512VBMI2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01351; AVX512VBMI2-NEXT: vzeroupper1352; AVX512VBMI2-NEXT: retq1353;1354; AVX512VLVBMI2-LABEL: constant_rotate_v16i8:1355; AVX512VLVBMI2: # %bb.0:1356; AVX512VLVBMI2-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1357; AVX512VLVBMI2-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11358; AVX512VLVBMI2-NEXT: vpsrlw $8, %xmm1, %xmm11359; AVX512VLVBMI2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1360; AVX512VLVBMI2-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01361; AVX512VLVBMI2-NEXT: vpsrlw $8, %xmm0, %xmm01362; AVX512VLVBMI2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01363; AVX512VLVBMI2-NEXT: retq1364;1365; XOP-LABEL: constant_rotate_v16i8:1366; XOP: # %bb.0:1367; XOP-NEXT: vprotb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01368; XOP-NEXT: retq1369;1370; X86-SSE2-LABEL: constant_rotate_v16i8:1371; X86-SSE2: # %bb.0:1372; X86-SSE2-NEXT: movdqa %xmm0, %xmm11373; X86-SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]1374; X86-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [1,128,64,32,16,8,4,2]1375; X86-SSE2-NEXT: psrlw $8, %xmm11376; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1377; X86-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [1,2,4,8,16,32,64,128]1378; X86-SSE2-NEXT: psrlw $8, %xmm01379; X86-SSE2-NEXT: packuswb %xmm1, %xmm01380; X86-SSE2-NEXT: retl1381 %shl = shl <16 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>1382 %lshr = lshr <16 x i8> %a, <i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7>1383 %or = or <16 x i8> %shl, %lshr1384 ret <16 x i8> %or1385}1386 1387;1388; Uniform Constant Rotates1389;1390 1391define <2 x i64> @splatconstant_rotate_v2i64(<2 x i64> %a) nounwind {1392; SSE-LABEL: splatconstant_rotate_v2i64:1393; SSE: # %bb.0:1394; SSE-NEXT: movdqa %xmm0, %xmm11395; SSE-NEXT: psrlq $50, %xmm11396; SSE-NEXT: psllq $14, %xmm01397; SSE-NEXT: por %xmm1, %xmm01398; SSE-NEXT: retq1399;1400; AVX-LABEL: splatconstant_rotate_v2i64:1401; AVX: # %bb.0:1402; AVX-NEXT: vpsrlq $50, %xmm0, %xmm11403; AVX-NEXT: vpsllq $14, %xmm0, %xmm01404; AVX-NEXT: vpor %xmm1, %xmm0, %xmm01405; AVX-NEXT: retq1406;1407; AVX512NOVLX-LABEL: splatconstant_rotate_v2i64:1408; AVX512NOVLX: # %bb.0:1409; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01410; AVX512NOVLX-NEXT: vprolq $14, %zmm0, %zmm01411; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01412; AVX512NOVLX-NEXT: vzeroupper1413; AVX512NOVLX-NEXT: retq1414;1415; AVX512VLX-LABEL: splatconstant_rotate_v2i64:1416; AVX512VLX: # %bb.0:1417; AVX512VLX-NEXT: vprolq $14, %xmm0, %xmm01418; AVX512VLX-NEXT: retq1419;1420; XOP-LABEL: splatconstant_rotate_v2i64:1421; XOP: # %bb.0:1422; XOP-NEXT: vprotq $14, %xmm0, %xmm01423; XOP-NEXT: retq1424;1425; X86-SSE2-LABEL: splatconstant_rotate_v2i64:1426; X86-SSE2: # %bb.0:1427; X86-SSE2-NEXT: movdqa %xmm0, %xmm11428; X86-SSE2-NEXT: psrlq $50, %xmm11429; X86-SSE2-NEXT: psllq $14, %xmm01430; X86-SSE2-NEXT: por %xmm1, %xmm01431; X86-SSE2-NEXT: retl1432 %shl = shl <2 x i64> %a, <i64 14, i64 14>1433 %lshr = lshr <2 x i64> %a, <i64 50, i64 50>1434 %or = or <2 x i64> %shl, %lshr1435 ret <2 x i64> %or1436}1437 1438define <4 x i32> @splatconstant_rotate_v4i32(<4 x i32> %a) nounwind {1439; SSE-LABEL: splatconstant_rotate_v4i32:1440; SSE: # %bb.0:1441; SSE-NEXT: movdqa %xmm0, %xmm11442; SSE-NEXT: psrld $28, %xmm11443; SSE-NEXT: pslld $4, %xmm01444; SSE-NEXT: por %xmm1, %xmm01445; SSE-NEXT: retq1446;1447; AVX-LABEL: splatconstant_rotate_v4i32:1448; AVX: # %bb.0:1449; AVX-NEXT: vpsrld $28, %xmm0, %xmm11450; AVX-NEXT: vpslld $4, %xmm0, %xmm01451; AVX-NEXT: vpor %xmm1, %xmm0, %xmm01452; AVX-NEXT: retq1453;1454; AVX512NOVLX-LABEL: splatconstant_rotate_v4i32:1455; AVX512NOVLX: # %bb.0:1456; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01457; AVX512NOVLX-NEXT: vprold $4, %zmm0, %zmm01458; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01459; AVX512NOVLX-NEXT: vzeroupper1460; AVX512NOVLX-NEXT: retq1461;1462; AVX512VLX-LABEL: splatconstant_rotate_v4i32:1463; AVX512VLX: # %bb.0:1464; AVX512VLX-NEXT: vprold $4, %xmm0, %xmm01465; AVX512VLX-NEXT: retq1466;1467; XOP-LABEL: splatconstant_rotate_v4i32:1468; XOP: # %bb.0:1469; XOP-NEXT: vprotd $4, %xmm0, %xmm01470; XOP-NEXT: retq1471;1472; X86-SSE2-LABEL: splatconstant_rotate_v4i32:1473; X86-SSE2: # %bb.0:1474; X86-SSE2-NEXT: movdqa %xmm0, %xmm11475; X86-SSE2-NEXT: psrld $28, %xmm11476; X86-SSE2-NEXT: pslld $4, %xmm01477; X86-SSE2-NEXT: por %xmm1, %xmm01478; X86-SSE2-NEXT: retl1479 %shl = shl <4 x i32> %a, <i32 4, i32 4, i32 4, i32 4>1480 %lshr = lshr <4 x i32> %a, <i32 28, i32 28, i32 28, i32 28>1481 %or = or <4 x i32> %shl, %lshr1482 ret <4 x i32> %or1483}1484 1485define <8 x i16> @splatconstant_rotate_v8i16(<8 x i16> %a) nounwind {1486; SSE-LABEL: splatconstant_rotate_v8i16:1487; SSE: # %bb.0:1488; SSE-NEXT: movdqa %xmm0, %xmm11489; SSE-NEXT: psrlw $9, %xmm11490; SSE-NEXT: psllw $7, %xmm01491; SSE-NEXT: por %xmm1, %xmm01492; SSE-NEXT: retq1493;1494; AVX-LABEL: splatconstant_rotate_v8i16:1495; AVX: # %bb.0:1496; AVX-NEXT: vpsrlw $9, %xmm0, %xmm11497; AVX-NEXT: vpsllw $7, %xmm0, %xmm01498; AVX-NEXT: vpor %xmm1, %xmm0, %xmm01499; AVX-NEXT: retq1500;1501; AVX512F-LABEL: splatconstant_rotate_v8i16:1502; AVX512F: # %bb.0:1503; AVX512F-NEXT: vpsrlw $9, %xmm0, %xmm11504; AVX512F-NEXT: vpsllw $7, %xmm0, %xmm01505; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm01506; AVX512F-NEXT: retq1507;1508; AVX512VL-LABEL: splatconstant_rotate_v8i16:1509; AVX512VL: # %bb.0:1510; AVX512VL-NEXT: vpsrlw $9, %xmm0, %xmm11511; AVX512VL-NEXT: vpsllw $7, %xmm0, %xmm01512; AVX512VL-NEXT: vpor %xmm1, %xmm0, %xmm01513; AVX512VL-NEXT: retq1514;1515; AVX512BW-LABEL: splatconstant_rotate_v8i16:1516; AVX512BW: # %bb.0:1517; AVX512BW-NEXT: vpsrlw $9, %xmm0, %xmm11518; AVX512BW-NEXT: vpsllw $7, %xmm0, %xmm01519; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm01520; AVX512BW-NEXT: retq1521;1522; AVX512VLBW-LABEL: splatconstant_rotate_v8i16:1523; AVX512VLBW: # %bb.0:1524; AVX512VLBW-NEXT: vpsrlw $9, %xmm0, %xmm11525; AVX512VLBW-NEXT: vpsllw $7, %xmm0, %xmm01526; AVX512VLBW-NEXT: vpor %xmm1, %xmm0, %xmm01527; AVX512VLBW-NEXT: retq1528;1529; AVX512VBMI2-LABEL: splatconstant_rotate_v8i16:1530; AVX512VBMI2: # %bb.0:1531; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01532; AVX512VBMI2-NEXT: vpshldw $7, %zmm0, %zmm0, %zmm01533; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01534; AVX512VBMI2-NEXT: vzeroupper1535; AVX512VBMI2-NEXT: retq1536;1537; AVX512VLVBMI2-LABEL: splatconstant_rotate_v8i16:1538; AVX512VLVBMI2: # %bb.0:1539; AVX512VLVBMI2-NEXT: vpshldw $7, %xmm0, %xmm0, %xmm01540; AVX512VLVBMI2-NEXT: retq1541;1542; XOP-LABEL: splatconstant_rotate_v8i16:1543; XOP: # %bb.0:1544; XOP-NEXT: vprotw $7, %xmm0, %xmm01545; XOP-NEXT: retq1546;1547; X86-SSE2-LABEL: splatconstant_rotate_v8i16:1548; X86-SSE2: # %bb.0:1549; X86-SSE2-NEXT: movdqa %xmm0, %xmm11550; X86-SSE2-NEXT: psrlw $9, %xmm11551; X86-SSE2-NEXT: psllw $7, %xmm01552; X86-SSE2-NEXT: por %xmm1, %xmm01553; X86-SSE2-NEXT: retl1554 %shl = shl <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>1555 %lshr = lshr <8 x i16> %a, <i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9>1556 %or = or <8 x i16> %shl, %lshr1557 ret <8 x i16> %or1558}1559 1560define <16 x i8> @splatconstant_rotate_v16i8(<16 x i8> %a) nounwind {1561; SSE-LABEL: splatconstant_rotate_v16i8:1562; SSE: # %bb.0:1563; SSE-NEXT: movdqa %xmm0, %xmm11564; SSE-NEXT: psrlw $4, %xmm11565; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11566; SSE-NEXT: psllw $4, %xmm01567; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01568; SSE-NEXT: por %xmm1, %xmm01569; SSE-NEXT: retq1570;1571; AVX-LABEL: splatconstant_rotate_v16i8:1572; AVX: # %bb.0:1573; AVX-NEXT: vpsrlw $4, %xmm0, %xmm11574; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11575; AVX-NEXT: vpsllw $4, %xmm0, %xmm01576; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01577; AVX-NEXT: vpor %xmm1, %xmm0, %xmm01578; AVX-NEXT: retq1579;1580; AVX512NOVLX-LABEL: splatconstant_rotate_v16i8:1581; AVX512NOVLX: # %bb.0:1582; AVX512NOVLX-NEXT: vpsllw $4, %xmm0, %xmm11583; AVX512NOVLX-NEXT: vpsrlw $4, %xmm0, %xmm01584; AVX512NOVLX-NEXT: vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))1585; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01586; AVX512NOVLX-NEXT: vzeroupper1587; AVX512NOVLX-NEXT: retq1588;1589; AVX512VLX-LABEL: splatconstant_rotate_v16i8:1590; AVX512VLX: # %bb.0:1591; AVX512VLX-NEXT: vpsllw $4, %xmm0, %xmm11592; AVX512VLX-NEXT: vpsrlw $4, %xmm0, %xmm01593; AVX512VLX-NEXT: vpternlogd {{.*#+}} xmm0 = xmm0 ^ (m32bcst & (xmm0 ^ xmm1))1594; AVX512VLX-NEXT: retq1595;1596; XOP-LABEL: splatconstant_rotate_v16i8:1597; XOP: # %bb.0:1598; XOP-NEXT: vprotb $4, %xmm0, %xmm01599; XOP-NEXT: retq1600;1601; X86-SSE2-LABEL: splatconstant_rotate_v16i8:1602; X86-SSE2: # %bb.0:1603; X86-SSE2-NEXT: movdqa %xmm0, %xmm11604; X86-SSE2-NEXT: psrlw $4, %xmm11605; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11606; X86-SSE2-NEXT: psllw $4, %xmm01607; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01608; X86-SSE2-NEXT: por %xmm1, %xmm01609; X86-SSE2-NEXT: retl1610 %shl = shl <16 x i8> %a, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>1611 %lshr = lshr <16 x i8> %a, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>1612 %or = or <16 x i8> %shl, %lshr1613 ret <16 x i8> %or1614}1615 1616;1617; Masked Uniform Constant Rotates1618;1619 1620define <2 x i64> @splatconstant_rotate_mask_v2i64(<2 x i64> %a) nounwind {1621; SSE-LABEL: splatconstant_rotate_mask_v2i64:1622; SSE: # %bb.0:1623; SSE-NEXT: psrlq $49, %xmm01624; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01625; SSE-NEXT: retq1626;1627; AVX-LABEL: splatconstant_rotate_mask_v2i64:1628; AVX: # %bb.0:1629; AVX-NEXT: vpsrlq $49, %xmm0, %xmm01630; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01631; AVX-NEXT: retq1632;1633; AVX512-LABEL: splatconstant_rotate_mask_v2i64:1634; AVX512: # %bb.0:1635; AVX512-NEXT: vpsrlq $49, %xmm0, %xmm01636; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01637; AVX512-NEXT: retq1638;1639; XOP-LABEL: splatconstant_rotate_mask_v2i64:1640; XOP: # %bb.0:1641; XOP-NEXT: vpsrlq $49, %xmm0, %xmm01642; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01643; XOP-NEXT: retq1644;1645; X86-SSE2-LABEL: splatconstant_rotate_mask_v2i64:1646; X86-SSE2: # %bb.0:1647; X86-SSE2-NEXT: psrlq $49, %xmm01648; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01649; X86-SSE2-NEXT: retl1650 %shl = shl <2 x i64> %a, <i64 15, i64 15>1651 %lshr = lshr <2 x i64> %a, <i64 49, i64 49>1652 %rmask = and <2 x i64> %lshr, <i64 255, i64 127>1653 %lmask = and <2 x i64> %shl, <i64 65, i64 33>1654 %or = or <2 x i64> %lmask, %rmask1655 ret <2 x i64> %or1656}1657 1658define <4 x i32> @splatconstant_rotate_mask_v4i32(<4 x i32> %a) nounwind {1659; SSE-LABEL: splatconstant_rotate_mask_v4i32:1660; SSE: # %bb.0:1661; SSE-NEXT: movdqa %xmm0, %xmm11662; SSE-NEXT: psrld $28, %xmm11663; SSE-NEXT: pslld $4, %xmm01664; SSE-NEXT: por %xmm1, %xmm01665; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01666; SSE-NEXT: retq1667;1668; AVX-LABEL: splatconstant_rotate_mask_v4i32:1669; AVX: # %bb.0:1670; AVX-NEXT: vpsrld $28, %xmm0, %xmm11671; AVX-NEXT: vpslld $4, %xmm0, %xmm01672; AVX-NEXT: vpor %xmm1, %xmm0, %xmm01673; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01674; AVX-NEXT: retq1675;1676; AVX512NOVLX-LABEL: splatconstant_rotate_mask_v4i32:1677; AVX512NOVLX: # %bb.0:1678; AVX512NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01679; AVX512NOVLX-NEXT: vprold $4, %zmm0, %zmm01680; AVX512NOVLX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01681; AVX512NOVLX-NEXT: vzeroupper1682; AVX512NOVLX-NEXT: retq1683;1684; AVX512VLX-LABEL: splatconstant_rotate_mask_v4i32:1685; AVX512VLX: # %bb.0:1686; AVX512VLX-NEXT: vprold $4, %xmm0, %xmm01687; AVX512VLX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01688; AVX512VLX-NEXT: retq1689;1690; XOP-LABEL: splatconstant_rotate_mask_v4i32:1691; XOP: # %bb.0:1692; XOP-NEXT: vprotd $4, %xmm0, %xmm01693; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01694; XOP-NEXT: retq1695;1696; X86-SSE2-LABEL: splatconstant_rotate_mask_v4i32:1697; X86-SSE2: # %bb.0:1698; X86-SSE2-NEXT: movdqa %xmm0, %xmm11699; X86-SSE2-NEXT: psrld $28, %xmm11700; X86-SSE2-NEXT: pslld $4, %xmm01701; X86-SSE2-NEXT: por %xmm1, %xmm01702; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01703; X86-SSE2-NEXT: retl1704 %shl = shl <4 x i32> %a, <i32 4, i32 4, i32 4, i32 4>1705 %lshr = lshr <4 x i32> %a, <i32 28, i32 28, i32 28, i32 28>1706 %rmask = and <4 x i32> %lshr, <i32 127, i32 255, i32 511, i32 1023>1707 %lmask = and <4 x i32> %shl, <i32 1023, i32 511, i32 255, i32 127>1708 %or = or <4 x i32> %lmask, %rmask1709 ret <4 x i32> %or1710}1711 1712define <8 x i16> @splatconstant_rotate_mask_v8i16(<8 x i16> %a) nounwind {1713; SSE-LABEL: splatconstant_rotate_mask_v8i16:1714; SSE: # %bb.0:1715; SSE-NEXT: movdqa %xmm0, %xmm11716; SSE-NEXT: psrlw $11, %xmm11717; SSE-NEXT: psllw $5, %xmm01718; SSE-NEXT: por %xmm1, %xmm01719; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01720; SSE-NEXT: retq1721;1722; AVX-LABEL: splatconstant_rotate_mask_v8i16:1723; AVX: # %bb.0:1724; AVX-NEXT: vpsrlw $11, %xmm0, %xmm11725; AVX-NEXT: vpsllw $5, %xmm0, %xmm01726; AVX-NEXT: vpor %xmm1, %xmm0, %xmm01727; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01728; AVX-NEXT: retq1729;1730; AVX512F-LABEL: splatconstant_rotate_mask_v8i16:1731; AVX512F: # %bb.0:1732; AVX512F-NEXT: vpsrlw $11, %xmm0, %xmm11733; AVX512F-NEXT: vpsllw $5, %xmm0, %xmm01734; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm01735; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01736; AVX512F-NEXT: retq1737;1738; AVX512VL-LABEL: splatconstant_rotate_mask_v8i16:1739; AVX512VL: # %bb.0:1740; AVX512VL-NEXT: vpsllw $5, %xmm0, %xmm11741; AVX512VL-NEXT: vpsrlw $11, %xmm0, %xmm01742; AVX512VL-NEXT: vpternlogd {{.*#+}} xmm0 = m32bcst & (xmm0 | xmm1)1743; AVX512VL-NEXT: retq1744;1745; AVX512BW-LABEL: splatconstant_rotate_mask_v8i16:1746; AVX512BW: # %bb.0:1747; AVX512BW-NEXT: vpsrlw $11, %xmm0, %xmm11748; AVX512BW-NEXT: vpsllw $5, %xmm0, %xmm01749; AVX512BW-NEXT: vpor %xmm1, %xmm0, %xmm01750; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01751; AVX512BW-NEXT: retq1752;1753; AVX512VLBW-LABEL: splatconstant_rotate_mask_v8i16:1754; AVX512VLBW: # %bb.0:1755; AVX512VLBW-NEXT: vpsllw $5, %xmm0, %xmm11756; AVX512VLBW-NEXT: vpsrlw $11, %xmm0, %xmm01757; AVX512VLBW-NEXT: vpternlogd {{.*#+}} xmm0 = m32bcst & (xmm0 | xmm1)1758; AVX512VLBW-NEXT: retq1759;1760; AVX512VBMI2-LABEL: splatconstant_rotate_mask_v8i16:1761; AVX512VBMI2: # %bb.0:1762; AVX512VBMI2-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01763; AVX512VBMI2-NEXT: vpshldw $5, %zmm0, %zmm0, %zmm01764; AVX512VBMI2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01765; AVX512VBMI2-NEXT: vzeroupper1766; AVX512VBMI2-NEXT: retq1767;1768; AVX512VLVBMI2-LABEL: splatconstant_rotate_mask_v8i16:1769; AVX512VLVBMI2: # %bb.0:1770; AVX512VLVBMI2-NEXT: vpshldw $5, %xmm0, %xmm0, %xmm01771; AVX512VLVBMI2-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm01772; AVX512VLVBMI2-NEXT: retq1773;1774; XOP-LABEL: splatconstant_rotate_mask_v8i16:1775; XOP: # %bb.0:1776; XOP-NEXT: vprotw $5, %xmm0, %xmm01777; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01778; XOP-NEXT: retq1779;1780; X86-SSE2-LABEL: splatconstant_rotate_mask_v8i16:1781; X86-SSE2: # %bb.0:1782; X86-SSE2-NEXT: movdqa %xmm0, %xmm11783; X86-SSE2-NEXT: psrlw $11, %xmm11784; X86-SSE2-NEXT: psllw $5, %xmm01785; X86-SSE2-NEXT: por %xmm1, %xmm01786; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01787; X86-SSE2-NEXT: retl1788 %shl = shl <8 x i16> %a, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>1789 %lshr = lshr <8 x i16> %a, <i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11>1790 %rmask = and <8 x i16> %lshr, <i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55>1791 %lmask = and <8 x i16> %shl, <i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33>1792 %or = or <8 x i16> %lmask, %rmask1793 ret <8 x i16> %or1794}1795 1796define <16 x i8> @splatconstant_rotate_mask_v16i8(<16 x i8> %a) nounwind {1797; SSE-LABEL: splatconstant_rotate_mask_v16i8:1798; SSE: # %bb.0:1799; SSE-NEXT: movdqa %xmm0, %xmm11800; SSE-NEXT: psrlw $4, %xmm11801; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11802; SSE-NEXT: psllw $4, %xmm01803; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01804; SSE-NEXT: por %xmm1, %xmm01805; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01806; SSE-NEXT: retq1807;1808; AVX-LABEL: splatconstant_rotate_mask_v16i8:1809; AVX: # %bb.0:1810; AVX-NEXT: vpsrlw $4, %xmm0, %xmm11811; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11812; AVX-NEXT: vpsllw $4, %xmm0, %xmm01813; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01814; AVX-NEXT: vpor %xmm1, %xmm0, %xmm01815; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01816; AVX-NEXT: retq1817;1818; AVX512NOVLX-LABEL: splatconstant_rotate_mask_v16i8:1819; AVX512NOVLX: # %bb.0:1820; AVX512NOVLX-NEXT: vpsllw $4, %xmm0, %xmm11821; AVX512NOVLX-NEXT: vpsrlw $4, %xmm0, %xmm01822; AVX512NOVLX-NEXT: vpternlogd {{.*#+}} zmm0 = zmm0 ^ (m32bcst & (zmm0 ^ zmm1))1823; AVX512NOVLX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01824; AVX512NOVLX-NEXT: vzeroupper1825; AVX512NOVLX-NEXT: retq1826;1827; AVX512VLX-LABEL: splatconstant_rotate_mask_v16i8:1828; AVX512VLX: # %bb.0:1829; AVX512VLX-NEXT: vpsllw $4, %xmm0, %xmm11830; AVX512VLX-NEXT: vpsrlw $4, %xmm0, %xmm01831; AVX512VLX-NEXT: vpternlogd {{.*#+}} xmm0 = xmm0 ^ (m32bcst & (xmm0 ^ xmm1))1832; AVX512VLX-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm01833; AVX512VLX-NEXT: retq1834;1835; XOP-LABEL: splatconstant_rotate_mask_v16i8:1836; XOP: # %bb.0:1837; XOP-NEXT: vprotb $4, %xmm0, %xmm01838; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01839; XOP-NEXT: retq1840;1841; X86-SSE2-LABEL: splatconstant_rotate_mask_v16i8:1842; X86-SSE2: # %bb.0:1843; X86-SSE2-NEXT: movdqa %xmm0, %xmm11844; X86-SSE2-NEXT: psrlw $4, %xmm11845; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11846; X86-SSE2-NEXT: psllw $4, %xmm01847; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01848; X86-SSE2-NEXT: por %xmm1, %xmm01849; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01850; X86-SSE2-NEXT: retl1851 %shl = shl <16 x i8> %a, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>1852 %lshr = lshr <16 x i8> %a, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>1853 %rmask = and <16 x i8> %lshr, <i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55>1854 %lmask = and <16 x i8> %shl, <i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33>1855 %or = or <16 x i8> %lmask, %rmask1856 ret <16 x i8> %or1857}1858 1859define <4 x i32> @rot16_demandedbits(<4 x i32> %x, <4 x i32> %y) nounwind {1860; X86-LABEL: rot16_demandedbits:1861; X86: # %bb.0:1862; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1863; X86-NEXT: movl %eax, %ecx1864; X86-NEXT: shrl $11, %ecx1865; X86-NEXT: shll $5, %eax1866; X86-NEXT: orl %ecx, %eax1867; X86-NEXT: andl $65536, %eax # imm = 0x100001868; X86-NEXT: retl1869;1870; X64-LABEL: rot16_demandedbits:1871; X64: # %bb.0:1872; X64-NEXT: movl %edi, %eax1873; X64-NEXT: movl %edi, %ecx1874; X64-NEXT: shrl $11, %ecx1875; X64-NEXT: shll $5, %eax1876; X64-NEXT: orl %ecx, %eax1877; X64-NEXT: andl $65536, %eax # imm = 0x100001878; X64-NEXT: retq1879; SSE2-LABEL: rot16_demandedbits:1880; SSE2: # %bb.0:1881; SSE2-NEXT: movdqa %xmm0, %xmm11882; SSE2-NEXT: psrld $11, %xmm11883; SSE2-NEXT: pslld $11, %xmm01884; SSE2-NEXT: por %xmm1, %xmm01885; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01886; SSE2-NEXT: retq1887;1888; SSE41-LABEL: rot16_demandedbits:1889; SSE41: # %bb.0:1890; SSE41-NEXT: movdqa %xmm0, %xmm11891; SSE41-NEXT: psrld $11, %xmm11892; SSE41-NEXT: pslld $11, %xmm01893; SSE41-NEXT: por %xmm1, %xmm01894; SSE41-NEXT: pxor %xmm1, %xmm11895; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]1896; SSE41-NEXT: retq1897;1898; AVX-LABEL: rot16_demandedbits:1899; AVX: # %bb.0:1900; AVX-NEXT: vpsrld $11, %xmm0, %xmm11901; AVX-NEXT: vpslld $11, %xmm0, %xmm01902; AVX-NEXT: vpor %xmm0, %xmm1, %xmm01903; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm11904; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]1905; AVX-NEXT: retq1906;1907; AVX512-LABEL: rot16_demandedbits:1908; AVX512: # %bb.0:1909; AVX512-NEXT: vpsrld $11, %xmm0, %xmm11910; AVX512-NEXT: vpslld $11, %xmm0, %xmm01911; AVX512-NEXT: vpor %xmm0, %xmm1, %xmm01912; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm11913; AVX512-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]1914; AVX512-NEXT: retq1915;1916; XOP-LABEL: rot16_demandedbits:1917; XOP: # %bb.0:1918; XOP-NEXT: vpsrld $11, %xmm0, %xmm11919; XOP-NEXT: vpslld $11, %xmm0, %xmm01920; XOP-NEXT: vpor %xmm0, %xmm1, %xmm01921; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm11922; XOP-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]1923; XOP-NEXT: retq1924;1925; X86-SSE2-LABEL: rot16_demandedbits:1926; X86-SSE2: # %bb.0:1927; X86-SSE2-NEXT: movdqa %xmm0, %xmm11928; X86-SSE2-NEXT: psrld $11, %xmm11929; X86-SSE2-NEXT: pslld $11, %xmm01930; X86-SSE2-NEXT: por %xmm1, %xmm01931; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01932; X86-SSE2-NEXT: retl1933 %t0 = lshr <4 x i32> %x, <i32 11, i32 11, i32 11, i32 11>1934 %t1 = shl <4 x i32> %x, <i32 11, i32 11, i32 11, i32 11>1935 %t2 = or <4 x i32> %t0, %t11936 %t3 = and <4 x i32> %t2, <i32 65535, i32 65535, i32 65535, i32 65535>1937 ret <4 x i32> %t31938}1939 1940define <4 x i16> @rot16_trunc(<4 x i32> %x, <4 x i32> %y) nounwind {1941; SSE2-LABEL: rot16_trunc:1942; SSE2: # %bb.0:1943; SSE2-NEXT: movdqa %xmm0, %xmm11944; SSE2-NEXT: psrld $11, %xmm11945; SSE2-NEXT: pslld $5, %xmm01946; SSE2-NEXT: por %xmm1, %xmm01947; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]1948; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]1949; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1950; SSE2-NEXT: retq1951;1952; SSE41-LABEL: rot16_trunc:1953; SSE41: # %bb.0:1954; SSE41-NEXT: movdqa %xmm0, %xmm11955; SSE41-NEXT: psrld $11, %xmm11956; SSE41-NEXT: pslld $5, %xmm01957; SSE41-NEXT: por %xmm1, %xmm01958; SSE41-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]1959; SSE41-NEXT: retq1960;1961; AVX-LABEL: rot16_trunc:1962; AVX: # %bb.0:1963; AVX-NEXT: vpsrld $11, %xmm0, %xmm11964; AVX-NEXT: vpslld $5, %xmm0, %xmm01965; AVX-NEXT: vpor %xmm0, %xmm1, %xmm01966; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]1967; AVX-NEXT: retq1968;1969; AVX512NOVLX-LABEL: rot16_trunc:1970; AVX512NOVLX: # %bb.0:1971; AVX512NOVLX-NEXT: vpsrld $11, %xmm0, %xmm11972; AVX512NOVLX-NEXT: vpslld $5, %xmm0, %xmm01973; AVX512NOVLX-NEXT: vpor %xmm0, %xmm1, %xmm01974; AVX512NOVLX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]1975; AVX512NOVLX-NEXT: retq1976;1977; AVX512VLX-LABEL: rot16_trunc:1978; AVX512VLX: # %bb.0:1979; AVX512VLX-NEXT: vpsrld $11, %xmm0, %xmm11980; AVX512VLX-NEXT: vpslld $5, %xmm0, %xmm01981; AVX512VLX-NEXT: vpor %xmm0, %xmm1, %xmm01982; AVX512VLX-NEXT: vpmovdw %xmm0, %xmm01983; AVX512VLX-NEXT: retq1984;1985; XOP-LABEL: rot16_trunc:1986; XOP: # %bb.0:1987; XOP-NEXT: vpsrld $11, %xmm0, %xmm11988; XOP-NEXT: vpslld $5, %xmm0, %xmm01989; XOP-NEXT: vpor %xmm0, %xmm1, %xmm01990; XOP-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]1991; XOP-NEXT: retq1992;1993; X86-SSE2-LABEL: rot16_trunc:1994; X86-SSE2: # %bb.0:1995; X86-SSE2-NEXT: movdqa %xmm0, %xmm11996; X86-SSE2-NEXT: psrld $11, %xmm11997; X86-SSE2-NEXT: pslld $5, %xmm01998; X86-SSE2-NEXT: por %xmm1, %xmm01999; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]2000; X86-SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]2001; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]2002; X86-SSE2-NEXT: retl2003 %t0 = lshr <4 x i32> %x, <i32 11, i32 11, i32 11, i32 11>2004 %t1 = shl <4 x i32> %x, <i32 5, i32 5, i32 5, i32 5>2005 %t2 = or <4 x i32> %t0, %t12006 %t3 = trunc <4 x i32> %t2 to <4 x i16>2007 ret <4 x i16> %t32008}2009