brintos

brintos / llvm-project-archived public Read only

0
0
Text · 81.1 KiB · 0bf5a8d Raw
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