brintos

brintos / llvm-project-archived public Read only

0
0
Text · 133.1 KiB · ac45541 Raw
2558 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,SSE424; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX15; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-SLOW6; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx2,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST,AVX2-FAST-ALL7; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST,AVX2-FAST-PERLANE8; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+xop | FileCheck %s --check-prefixes=AVX,XOP9 10define void @v3i64(<2 x i64> %a, <2 x i64> %b, ptr %p) nounwind {11; SSE2-LABEL: v3i64:12; SSE2:       # %bb.0:13; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]14; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]15; SSE2-NEXT:    movq %xmm2, 16(%rdi)16; SSE2-NEXT:    movdqa %xmm0, (%rdi)17; SSE2-NEXT:    retq18;19; SSE42-LABEL: v3i64:20; SSE42:       # %bb.0:21; SSE42-NEXT:    pextrq $1, %xmm0, 16(%rdi)22; SSE42-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]23; SSE42-NEXT:    movdqa %xmm0, (%rdi)24; SSE42-NEXT:    retq25;26; AVX-LABEL: v3i64:27; AVX:       # %bb.0:28; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm0[0],xmm1[0]29; AVX-NEXT:    vpextrq $1, %xmm0, 16(%rdi)30; AVX-NEXT:    vmovdqa %xmm1, (%rdi)31; AVX-NEXT:    retq32  %r = shufflevector <2 x i64> %a, <2 x i64> %b, <3 x i32> <i32 0, i32 2, i32 1>33  store <3 x i64> %r, ptr %p34  ret void35}36define void @v3f64(<2 x double> %a, <2 x double> %b, ptr %p) nounwind {37; SSE-LABEL: v3f64:38; SSE:       # %bb.0:39; SSE-NEXT:    movhps %xmm0, 16(%rdi)40; SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]41; SSE-NEXT:    movaps %xmm0, (%rdi)42; SSE-NEXT:    retq43;44; AVX-LABEL: v3f64:45; AVX:       # %bb.0:46; AVX-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm0[0],xmm1[0]47; AVX-NEXT:    vmovhps %xmm0, 16(%rdi)48; AVX-NEXT:    vmovaps %xmm1, (%rdi)49; AVX-NEXT:    retq50  %r = shufflevector <2 x double> %a, <2 x double> %b, <3 x i32> <i32 0, i32 2, i32 1>51  store <3 x double> %r, ptr %p52  ret void53}54 55define void @v3i32(<2 x i32> %a, <2 x i32> %b, ptr %p) nounwind {56; SSE2-LABEL: v3i32:57; SSE2:       # %bb.0:58; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]59; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]60; SSE2-NEXT:    movd %xmm2, 8(%rdi)61; SSE2-NEXT:    movq %xmm0, (%rdi)62; SSE2-NEXT:    retq63;64; SSE42-LABEL: v3i32:65; SSE42:       # %bb.0:66; SSE42-NEXT:    extractps $1, %xmm0, 8(%rdi)67; SSE42-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]68; SSE42-NEXT:    movlps %xmm0, (%rdi)69; SSE42-NEXT:    retq70;71; AVX-LABEL: v3i32:72; AVX:       # %bb.0:73; AVX-NEXT:    vunpcklps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]74; AVX-NEXT:    vextractps $1, %xmm0, 8(%rdi)75; AVX-NEXT:    vmovlps %xmm1, (%rdi)76; AVX-NEXT:    retq77  %r = shufflevector <2 x i32> %a, <2 x i32> %b, <3 x i32> <i32 0, i32 2, i32 1>78  store <3 x i32> %r, ptr %p79  ret void80}81 82define void @v5i16(<4 x i16> %a, <4 x i16> %b, ptr %p) nounwind {83; SSE2-LABEL: v5i16:84; SSE2:       # %bb.0:85; SSE2-NEXT:    psrlq $16, %xmm186; SSE2-NEXT:    pextrw $3, %xmm0, %eax87; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]88; SSE2-NEXT:    movw %ax, 8(%rdi)89; SSE2-NEXT:    movq %xmm0, (%rdi)90; SSE2-NEXT:    retq91;92; SSE42-LABEL: v5i16:93; SSE42:       # %bb.0:94; SSE42-NEXT:    psrlq $16, %xmm195; SSE42-NEXT:    pextrw $3, %xmm0, 8(%rdi)96; SSE42-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]97; SSE42-NEXT:    movq %xmm0, (%rdi)98; SSE42-NEXT:    retq99;100; AVX-LABEL: v5i16:101; AVX:       # %bb.0:102; AVX-NEXT:    vpsrlq $16, %xmm1, %xmm1103; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]104; AVX-NEXT:    vpextrw $3, %xmm0, 8(%rdi)105; AVX-NEXT:    vmovq %xmm1, (%rdi)106; AVX-NEXT:    retq107  %r = shufflevector <4 x i16> %a, <4 x i16> %b, <5 x i32> <i32 0, i32 5, i32 1, i32 6, i32 3>108  store <5 x i16> %r, ptr %p109  ret void110}111 112define void @v5i32(<4 x i32> %a, <4 x i32> %b, ptr %p) nounwind {113; SSE2-LABEL: v5i32:114; SSE2:       # %bb.0:115; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,2,2,3]116; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]117; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]118; SSE2-NEXT:    movd %xmm2, 16(%rdi)119; SSE2-NEXT:    movdqa %xmm0, (%rdi)120; SSE2-NEXT:    retq121;122; SSE42-LABEL: v5i32:123; SSE42:       # %bb.0:124; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,2,2,3]125; SSE42-NEXT:    pextrd $3, %xmm0, 16(%rdi)126; SSE42-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]127; SSE42-NEXT:    movdqa %xmm0, (%rdi)128; SSE42-NEXT:    retq129;130; AVX-LABEL: v5i32:131; AVX:       # %bb.0:132; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[1,2,2,3]133; AVX-NEXT:    vunpcklps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]134; AVX-NEXT:    vextractps $3, %xmm0, 16(%rdi)135; AVX-NEXT:    vmovaps %xmm1, (%rdi)136; AVX-NEXT:    retq137  %r = shufflevector <4 x i32> %a, <4 x i32> %b, <5 x i32> <i32 0, i32 5, i32 1, i32 6, i32 3>138  store <5 x i32> %r, ptr %p139  ret void140}141 142define void @v5f32(<4 x float> %a, <4 x float> %b, ptr %p) nounwind {143; SSE2-LABEL: v5f32:144; SSE2:       # %bb.0:145; SSE2-NEXT:    movaps %xmm0, %xmm2146; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm1[1,2]147; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2,1,3]148; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]149; SSE2-NEXT:    movss %xmm0, 16(%rdi)150; SSE2-NEXT:    movaps %xmm2, (%rdi)151; SSE2-NEXT:    retq152;153; SSE42-LABEL: v5f32:154; SSE42:       # %bb.0:155; SSE42-NEXT:    extractps $3, %xmm0, 16(%rdi)156; SSE42-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[1,2]157; SSE42-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]158; SSE42-NEXT:    movaps %xmm0, (%rdi)159; SSE42-NEXT:    retq160;161; AVX-LABEL: v5f32:162; AVX:       # %bb.0:163; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[0,1],xmm1[1,2]164; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2,1,3]165; AVX-NEXT:    vextractps $3, %xmm0, 16(%rdi)166; AVX-NEXT:    vmovaps %xmm1, (%rdi)167; AVX-NEXT:    retq168  %r = shufflevector <4 x float> %a, <4 x float> %b, <5 x i32> <i32 0, i32 5, i32 1, i32 6, i32 3>169  store <5 x float> %r, ptr %p170  ret void171}172 173define void @v7i8(<4 x i8> %a, <4 x i8> %b, ptr %p) nounwind {174; SSE2-LABEL: v7i8:175; SSE2:       # %bb.0:176; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]177; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,1,3,4,5,6,7]178; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,255,0,255,0,255,255,255,255,255,255,255,255,255,255,255]179; SSE2-NEXT:    movdqa %xmm1, -{{[0-9]+}}(%rsp)180; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]181; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,2,3,0,4,5,6,7]182; SSE2-NEXT:    pand %xmm2, %xmm1183; SSE2-NEXT:    pandn %xmm0, %xmm2184; SSE2-NEXT:    por %xmm1, %xmm2185; SSE2-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax186; SSE2-NEXT:    movb %al, 6(%rdi)187; SSE2-NEXT:    movd %xmm2, (%rdi)188; SSE2-NEXT:    pextrw $2, %xmm2, %eax189; SSE2-NEXT:    movw %ax, 4(%rdi)190; SSE2-NEXT:    retq191;192; SSE42-LABEL: v7i8:193; SSE42:       # %bb.0:194; SSE42-NEXT:    pextrb $0, %xmm1, 6(%rdi)195; SSE42-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]196; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[1,4,7,4,3,6,0,u,u,u,u,u,u,u,u,u]197; SSE42-NEXT:    pextrw $2, %xmm1, 4(%rdi)198; SSE42-NEXT:    movd %xmm1, (%rdi)199; SSE42-NEXT:    retq200;201; AVX1-LABEL: v7i8:202; AVX1:       # %bb.0:203; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]204; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,4,7,4,3,6,0,u,u,u,u,u,u,u,u,u]205; AVX1-NEXT:    vpextrb $0, %xmm1, 6(%rdi)206; AVX1-NEXT:    vpextrw $2, %xmm0, 4(%rdi)207; AVX1-NEXT:    vmovd %xmm0, (%rdi)208; AVX1-NEXT:    retq209;210; AVX2-LABEL: v7i8:211; AVX2:       # %bb.0:212; AVX2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]213; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,4,7,4,3,6,0,u,u,u,u,u,u,u,u,u]214; AVX2-NEXT:    vpextrb $0, %xmm1, 6(%rdi)215; AVX2-NEXT:    vpextrw $2, %xmm0, 4(%rdi)216; AVX2-NEXT:    vmovd %xmm0, (%rdi)217; AVX2-NEXT:    retq218;219; XOP-LABEL: v7i8:220; XOP:       # %bb.0:221; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[0],xmm1[2],xmm0[3],xmm1[2],xmm0[1],xmm1[3,0,u,u,u,u,u,u,u,u,u]222; XOP-NEXT:    vpextrb $0, %xmm1, 6(%rdi)223; XOP-NEXT:    vpextrw $2, %xmm0, 4(%rdi)224; XOP-NEXT:    vmovd %xmm0, (%rdi)225; XOP-NEXT:    retq226  %r = shufflevector <4 x i8> %a, <4 x i8> %b, <7 x i32> <i32 0, i32 6, i32 3, i32 6, i32 1, i32 7, i32 4>227  store <7 x i8> %r, ptr %p228  ret void229}230 231define void @v7i16(<4 x i16> %a, <4 x i16> %b, ptr %p) nounwind {232; SSE2-LABEL: v7i16:233; SSE2:       # %bb.0:234; SSE2-NEXT:    movd %xmm1, %eax235; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]236; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,1,0,3,4,5,6,7]237; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,7,6,7]238; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]239; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,2,3,2,4,5,6,7]240; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,5,6,4,7]241; SSE2-NEXT:    movw %ax, 12(%rdi)242; SSE2-NEXT:    movq %xmm0, (%rdi)243; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]244; SSE2-NEXT:    movd %xmm0, 8(%rdi)245; SSE2-NEXT:    retq246;247; SSE42-LABEL: v7i16:248; SSE42:       # %bb.0:249; SSE42-NEXT:    pextrw $0, %xmm1, 12(%rdi)250; SSE42-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]251; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[2,3,8,9,14,15,8,9,6,7,12,13,0,1,14,15]252; SSE42-NEXT:    pextrd $2, %xmm1, 8(%rdi)253; SSE42-NEXT:    movq %xmm1, (%rdi)254; SSE42-NEXT:    retq255;256; AVX1-LABEL: v7i16:257; AVX1:       # %bb.0:258; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]259; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,3,8,9,14,15,8,9,6,7,12,13,0,1,14,15]260; AVX1-NEXT:    vpextrw $0, %xmm1, 12(%rdi)261; AVX1-NEXT:    vpextrd $2, %xmm0, 8(%rdi)262; AVX1-NEXT:    vmovq %xmm0, (%rdi)263; AVX1-NEXT:    retq264;265; AVX2-LABEL: v7i16:266; AVX2:       # %bb.0:267; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]268; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,3,8,9,14,15,8,9,6,7,12,13,0,1,14,15]269; AVX2-NEXT:    vpextrw $0, %xmm1, 12(%rdi)270; AVX2-NEXT:    vpextrd $2, %xmm0, 8(%rdi)271; AVX2-NEXT:    vmovq %xmm0, (%rdi)272; AVX2-NEXT:    retq273;274; XOP-LABEL: v7i16:275; XOP:       # %bb.0:276; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[0,1],xmm1[4,5],xmm0[6,7],xmm1[4,5],xmm0[2,3],xmm1[6,7,0,1],xmm0[6,7]277; XOP-NEXT:    vpextrw $0, %xmm1, 12(%rdi)278; XOP-NEXT:    vpextrd $2, %xmm0, 8(%rdi)279; XOP-NEXT:    vmovq %xmm0, (%rdi)280; XOP-NEXT:    retq281  %r = shufflevector <4 x i16> %a, <4 x i16> %b, <7 x i32> <i32 0, i32 6, i32 3, i32 6, i32 1, i32 7, i32 4>282  store <7 x i16> %r, ptr %p283  ret void284}285 286 287define void @v7i32(<4 x i32> %a, <4 x i32> %b, ptr %p) nounwind {288; SSE2-LABEL: v7i32:289; SSE2:       # %bb.0:290; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,2,2]291; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,1,0,3]292; SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm2[2],xmm3[3],xmm2[3]293; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]294; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]295; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]296; SSE2-NEXT:    movd %xmm1, 24(%rdi)297; SSE2-NEXT:    movq %xmm0, 16(%rdi)298; SSE2-NEXT:    movdqa %xmm3, (%rdi)299; SSE2-NEXT:    retq300;301; SSE42-LABEL: v7i32:302; SSE42:       # %bb.0:303; SSE42-NEXT:    movdqa %xmm0, %xmm2304; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5],xmm2[6,7]305; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,3,2]306; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]307; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]308; SSE42-NEXT:    movd %xmm1, 24(%rdi)309; SSE42-NEXT:    movq %xmm0, 16(%rdi)310; SSE42-NEXT:    movdqa %xmm2, (%rdi)311; SSE42-NEXT:    retq312;313; AVX-LABEL: v7i32:314; AVX:       # %bb.0:315; AVX-NEXT:    vblendps {{.*#+}} xmm2 = xmm0[0,1],xmm1[2],xmm0[3]316; AVX-NEXT:    vshufps {{.*#+}} xmm2 = xmm2[0,2,3,2]317; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]318; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[1,3,2,3]319; AVX-NEXT:    vmovss %xmm1, 24(%rdi)320; AVX-NEXT:    vmovlps %xmm0, 16(%rdi)321; AVX-NEXT:    vmovaps %xmm2, (%rdi)322; AVX-NEXT:    retq323  %r = shufflevector <4 x i32> %a, <4 x i32> %b, <7 x i32> <i32 0, i32 6, i32 3, i32 6, i32 1, i32 7, i32 4>324  store <7 x i32> %r, ptr %p325  ret void326}327 328define void @v12i8(<8 x i8> %a, <8 x i8> %b, ptr %p) nounwind {329; SSE2-LABEL: v12i8:330; SSE2:       # %bb.0:331; SSE2-NEXT:    pxor %xmm2, %xmm2332; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]333; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,1,2,3]334; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,3,1,3,4,5,6,7]335; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,4,7]336; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,1]337; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,1,4,5,6,7]338; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,4]339; SSE2-NEXT:    packuswb %xmm2, %xmm0340; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,0,255,255,0,255,255,0,255,255,0,255,255,255,255]341; SSE2-NEXT:    pand %xmm2, %xmm0342; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,1,1,4,5,6,7]343; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,3]344; SSE2-NEXT:    pandn %xmm1, %xmm2345; SSE2-NEXT:    por %xmm0, %xmm2346; SSE2-NEXT:    movq %xmm2, (%rdi)347; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]348; SSE2-NEXT:    movd %xmm0, 8(%rdi)349; SSE2-NEXT:    retq350;351; SSE42-LABEL: v12i8:352; SSE42:       # %bb.0:353; SSE42-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]354; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u]355; SSE42-NEXT:    pextrd $2, %xmm0, 8(%rdi)356; SSE42-NEXT:    movq %xmm0, (%rdi)357; SSE42-NEXT:    retq358;359; AVX1-LABEL: v12i8:360; AVX1:       # %bb.0:361; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]362; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u]363; AVX1-NEXT:    vpextrd $2, %xmm0, 8(%rdi)364; AVX1-NEXT:    vmovq %xmm0, (%rdi)365; AVX1-NEXT:    retq366;367; AVX2-LABEL: v12i8:368; AVX2:       # %bb.0:369; AVX2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]370; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u]371; AVX2-NEXT:    vpextrd $2, %xmm0, 8(%rdi)372; AVX2-NEXT:    vmovq %xmm0, (%rdi)373; AVX2-NEXT:    retq374;375; XOP-LABEL: v12i8:376; XOP:       # %bb.0:377; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[0,4],xmm1[0],xmm0[1,5],xmm1[1],xmm0[2,6],xmm1[2],xmm0[3,7],xmm1[3],xmm0[u,u,u,u]378; XOP-NEXT:    vpextrd $2, %xmm0, 8(%rdi)379; XOP-NEXT:    vmovq %xmm0, (%rdi)380; XOP-NEXT:    retq381  %r = shufflevector <8 x i8> %a, <8 x i8> %b, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>382  store <12 x i8> %r, ptr %p383  ret void384}385 386define void @v12i16(<8 x i16> %a, <8 x i16> %b, ptr %p) nounwind {387; SSE2-LABEL: v12i16:388; SSE2:       # %bb.0:389; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,0,0]390; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [65535,65535,0,65535,65535,0,65535,65535]391; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm0[0,1,2,3,6,5,4,7]392; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,3,2,1]393; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,2,2,1,4,5,6,7]394; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,5,6,4]395; SSE2-NEXT:    pand %xmm3, %xmm4396; SSE2-NEXT:    pandn %xmm2, %xmm3397; SSE2-NEXT:    por %xmm4, %xmm3398; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]399; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,65535,65535,0,65535,65535,65535,65535]400; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]401; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,1,3,4,5,6,7]402; SSE2-NEXT:    pand %xmm2, %xmm0403; SSE2-NEXT:    pandn %xmm1, %xmm2404; SSE2-NEXT:    por %xmm0, %xmm2405; SSE2-NEXT:    movq %xmm2, 16(%rdi)406; SSE2-NEXT:    movdqa %xmm3, (%rdi)407; SSE2-NEXT:    retq408;409; SSE42-LABEL: v12i16:410; SSE42:       # %bb.0:411; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]412; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[3,1,2,3]413; SSE42-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,3,1,3,4,5,6,7]414; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm2[0],xmm3[1,2],xmm2[3],xmm3[4,5,6,7]415; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]416; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,2,3,10,11,u,u,4,5,12,13]417; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]418; SSE42-NEXT:    movdqa %xmm0, (%rdi)419; SSE42-NEXT:    movq %xmm3, 16(%rdi)420; SSE42-NEXT:    retq421;422; AVX1-LABEL: v12i16:423; AVX1:       # %bb.0:424; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]425; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[3,1,2,3]426; AVX1-NEXT:    vpshuflw {{.*#+}} xmm3 = xmm3[0,3,1,3,4,5,6,7]427; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2],xmm2[3],xmm3[4,5,6,7]428; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]429; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,2,3,10,11,u,u,4,5,12,13]430; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]431; AVX1-NEXT:    vmovdqa %xmm0, (%rdi)432; AVX1-NEXT:    vmovq %xmm2, 16(%rdi)433; AVX1-NEXT:    retq434;435; AVX2-SLOW-LABEL: v12i16:436; AVX2-SLOW:       # %bb.0:437; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]438; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[3,1,2,3]439; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm3 = xmm3[0,3,1,3,4,5,6,7]440; AVX2-SLOW-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2],xmm2[3],xmm3[4,5,6,7]441; AVX2-SLOW-NEXT:    vpbroadcastd %xmm1, %xmm1442; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,2,3,10,11,u,u,4,5,12,13]443; AVX2-SLOW-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]444; AVX2-SLOW-NEXT:    vmovdqa %xmm0, (%rdi)445; AVX2-SLOW-NEXT:    vmovq %xmm2, 16(%rdi)446; AVX2-SLOW-NEXT:    retq447;448; AVX2-FAST-LABEL: v12i16:449; AVX2-FAST:       # %bb.0:450; AVX2-FAST-NEXT:    vpbroadcastd %xmm1, %xmm2451; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm3 = xmm0[0,1,8,9,u,u,2,3,10,11,u,u,4,5,12,13]452; AVX2-FAST-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2],xmm3[3,4],xmm2[5],xmm3[6,7]453; AVX2-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]454; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[u,u,6,7,14,15,u,u,u,u,u,u,u,u,u,u]455; AVX2-FAST-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3],xmm0[4,5,6,7]456; AVX2-FAST-NEXT:    vmovq %xmm0, 16(%rdi)457; AVX2-FAST-NEXT:    vmovdqa %xmm2, (%rdi)458; AVX2-FAST-NEXT:    retq459;460; XOP-LABEL: v12i16:461; XOP:       # %bb.0:462; XOP-NEXT:    vpperm {{.*#+}} xmm2 = xmm0[0,1,8,9],xmm1[0,1],xmm0[2,3,10,11],xmm1[2,3],xmm0[4,5,12,13]463; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm1[4,5],xmm0[6,7,14,15],xmm1[6,7],xmm0[u,u,u,u,u,u,u,u]464; XOP-NEXT:    vmovq %xmm0, 16(%rdi)465; XOP-NEXT:    vmovdqa %xmm2, (%rdi)466; XOP-NEXT:    retq467  %r = shufflevector <8 x i16> %a, <8 x i16> %b, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>468  store <12 x i16> %r, ptr %p469  ret void470}471 472define void @v12i32(<8 x i32> %a, <8 x i32> %b, ptr %p) nounwind {473; SSE2-LABEL: v12i32:474; SSE2:       # %bb.0:475; SSE2-NEXT:    movaps %xmm2, %xmm3476; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm0[1,3]477; SSE2-NEXT:    movaps %xmm0, %xmm4478; SSE2-NEXT:    unpcklps {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]479; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,1],xmm3[0,2]480; SSE2-NEXT:    movaps %xmm0, %xmm3481; SSE2-NEXT:    unpckhpd {{.*#+}} xmm3 = xmm3[1],xmm1[1]482; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3],xmm1[3,3]483; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2],xmm2[2,3]484; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,1],xmm1[1,1]485; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[2,0],xmm3[0,2]486; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0,1,3]487; SSE2-NEXT:    movaps %xmm2, 16(%rdi)488; SSE2-NEXT:    movaps %xmm4, (%rdi)489; SSE2-NEXT:    movaps %xmm0, 32(%rdi)490; SSE2-NEXT:    retq491;492; SSE42-LABEL: v12i32:493; SSE42:       # %bb.0:494; SSE42-NEXT:    movdqa %xmm0, %xmm3495; SSE42-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]496; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,1,2,2]497; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,1,0,1]498; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm3[0,1,2,3],xmm4[4,5],xmm3[6,7]499; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,2,2]500; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm0[4,5],xmm3[6,7]501; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5,6,7]502; SSE42-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3],xmm1[3,3]503; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]504; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,3,4,5],xmm1[6,7]505; SSE42-NEXT:    movdqa %xmm1, 32(%rdi)506; SSE42-NEXT:    movdqa %xmm3, 16(%rdi)507; SSE42-NEXT:    movdqa %xmm4, (%rdi)508; SSE42-NEXT:    retq509;510; AVX1-LABEL: v12i32:511; AVX1:       # %bb.0:512; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,0,1]513; AVX1-NEXT:    vmovsldup {{.*#+}} ymm2 = ymm2[0,0,2,2,4,4,6,6]514; AVX1-NEXT:    vpermilps {{.*#+}} ymm3 = ymm0[0,u,u,1,5,u,u,6]515; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2,3,4,5],ymm2[6],ymm3[7]516; AVX1-NEXT:    vshufps {{.*#+}} xmm3 = xmm1[0,1,0,1]517; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm3, %ymm3518; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7]519; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3520; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3],xmm3[3,3]521; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[2,3,2,3]522; AVX1-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3]523; AVX1-NEXT:    vmovaps %xmm0, 32(%rdi)524; AVX1-NEXT:    vmovaps %ymm2, (%rdi)525; AVX1-NEXT:    vzeroupper526; AVX1-NEXT:    retq527;528; AVX2-SLOW-LABEL: v12i32:529; AVX2-SLOW:       # %bb.0:530; AVX2-SLOW-NEXT:    vmovaps {{.*#+}} ymm2 = [0,4,u,1,5,u,2,6]531; AVX2-SLOW-NEXT:    vpermps %ymm0, %ymm2, %ymm2532; AVX2-SLOW-NEXT:    vbroadcastsd %xmm1, %ymm3533; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7]534; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm3535; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3],xmm3[3,3]536; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[2,3,2,3]537; AVX2-SLOW-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3]538; AVX2-SLOW-NEXT:    vmovaps %xmm0, 32(%rdi)539; AVX2-SLOW-NEXT:    vmovaps %ymm2, (%rdi)540; AVX2-SLOW-NEXT:    vzeroupper541; AVX2-SLOW-NEXT:    retq542;543; AVX2-FAST-ALL-LABEL: v12i32:544; AVX2-FAST-ALL:       # %bb.0:545; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} ymm2 = [0,4,u,1,5,u,2,6]546; AVX2-FAST-ALL-NEXT:    vpermps %ymm0, %ymm2, %ymm2547; AVX2-FAST-ALL-NEXT:    vbroadcastsd %xmm1, %ymm3548; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7]549; AVX2-FAST-ALL-NEXT:    vbroadcastsd {{.*#+}} ymm3 = [7,3,7,3,7,3,7,3]550; AVX2-FAST-ALL-NEXT:    vpermps %ymm0, %ymm3, %ymm0551; AVX2-FAST-ALL-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[2,3,2,3]552; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3]553; AVX2-FAST-ALL-NEXT:    vmovaps %xmm0, 32(%rdi)554; AVX2-FAST-ALL-NEXT:    vmovaps %ymm2, (%rdi)555; AVX2-FAST-ALL-NEXT:    vzeroupper556; AVX2-FAST-ALL-NEXT:    retq557;558; AVX2-FAST-PERLANE-LABEL: v12i32:559; AVX2-FAST-PERLANE:       # %bb.0:560; AVX2-FAST-PERLANE-NEXT:    vmovaps {{.*#+}} ymm2 = [0,4,u,1,5,u,2,6]561; AVX2-FAST-PERLANE-NEXT:    vpermps %ymm0, %ymm2, %ymm2562; AVX2-FAST-PERLANE-NEXT:    vbroadcastsd %xmm1, %ymm3563; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7]564; AVX2-FAST-PERLANE-NEXT:    vextractf128 $1, %ymm0, %xmm3565; AVX2-FAST-PERLANE-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3],xmm3[3,3]566; AVX2-FAST-PERLANE-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[2,3,2,3]567; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3]568; AVX2-FAST-PERLANE-NEXT:    vmovaps %xmm0, 32(%rdi)569; AVX2-FAST-PERLANE-NEXT:    vmovaps %ymm2, (%rdi)570; AVX2-FAST-PERLANE-NEXT:    vzeroupper571; AVX2-FAST-PERLANE-NEXT:    retq572;573; XOP-LABEL: v12i32:574; XOP:       # %bb.0:575; XOP-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,0,1]576; XOP-NEXT:    vpermil2ps {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[u,1,5,u],ymm2[6],ymm0[6]577; XOP-NEXT:    vshufps {{.*#+}} xmm3 = xmm1[0,1,0,1]578; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm3, %ymm3579; XOP-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7]580; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm3581; XOP-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3],xmm3[3,3]582; XOP-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[2,3,2,3]583; XOP-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3]584; XOP-NEXT:    vmovaps %xmm0, 32(%rdi)585; XOP-NEXT:    vmovaps %ymm2, (%rdi)586; XOP-NEXT:    vzeroupper587; XOP-NEXT:    retq588  %r = shufflevector <8 x i32> %a, <8 x i32> %b, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>589  store <12 x i32> %r, ptr %p590  ret void591}592 593define void @pr29025(<4 x i8> %a, <4 x i8> %b, <4 x i8> %c, ptr%p) nounwind {594; SSE2-LABEL: pr29025:595; SSE2:       # %bb.0:596; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]597; SSE2-NEXT:    pxor %xmm1, %xmm1598; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]599; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]600; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,3,1,3,4,5,6,7]601; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,4,7]602; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,1]603; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,1,4,5,6,7]604; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,4]605; SSE2-NEXT:    packuswb %xmm1, %xmm0606; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,0,255,255,0,255,255,0,255,255,0,255,255,255,255]607; SSE2-NEXT:    pand %xmm1, %xmm0608; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,1,1,4,5,6,7]609; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,0,1,3]610; SSE2-NEXT:    pandn %xmm2, %xmm1611; SSE2-NEXT:    por %xmm0, %xmm1612; SSE2-NEXT:    movq %xmm1, (%rdi)613; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]614; SSE2-NEXT:    movd %xmm0, 8(%rdi)615; SSE2-NEXT:    retq616;617; SSE42-LABEL: pr29025:618; SSE42:       # %bb.0:619; SSE42-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]620; SSE42-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]621; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u]622; SSE42-NEXT:    pextrd $2, %xmm0, 8(%rdi)623; SSE42-NEXT:    movq %xmm0, (%rdi)624; SSE42-NEXT:    retq625;626; AVX1-LABEL: pr29025:627; AVX1:       # %bb.0:628; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]629; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]630; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u]631; AVX1-NEXT:    vpextrd $2, %xmm0, 8(%rdi)632; AVX1-NEXT:    vmovq %xmm0, (%rdi)633; AVX1-NEXT:    retq634;635; AVX2-LABEL: pr29025:636; AVX2:       # %bb.0:637; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]638; AVX2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]639; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u]640; AVX2-NEXT:    vpextrd $2, %xmm0, 8(%rdi)641; AVX2-NEXT:    vmovq %xmm0, (%rdi)642; AVX2-NEXT:    retq643;644; XOP-LABEL: pr29025:645; XOP:       # %bb.0:646; XOP-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]647; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[0,4],xmm2[0],xmm0[1,5],xmm2[1],xmm0[2,6],xmm2[2],xmm0[3,7],xmm2[3],xmm0[u,u,u,u]648; XOP-NEXT:    vpextrd $2, %xmm0, 8(%rdi)649; XOP-NEXT:    vmovq %xmm0, (%rdi)650; XOP-NEXT:    retq651  %s1 = shufflevector <4 x i8> %a, <4 x i8> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>652  %s2 = shufflevector <4 x i8> %c, <4 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>653  %r = shufflevector <8 x i8> %s1, <8 x i8> %s2, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>654  store <12 x i8> %r, ptr %p, align 1655  ret void656}657 658define void @interleave_24i8_out(ptr %p, ptr %q1, ptr %q2, ptr %q3) nounwind {659; SSE2-LABEL: interleave_24i8_out:660; SSE2:       # %bb.0:661; SSE2-NEXT:    movdqu (%rdi), %xmm0662; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero663; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,0,255,255,0,255,255,255,255,255,255,255,255,255,255]664; SSE2-NEXT:    movdqa %xmm0, %xmm2665; SSE2-NEXT:    pand %xmm4, %xmm2666; SSE2-NEXT:    pandn %xmm1, %xmm4667; SSE2-NEXT:    por %xmm2, %xmm4668; SSE2-NEXT:    pxor %xmm2, %xmm2669; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]670; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [65535,0,65535,65535,0,65535,65535,0]671; SSE2-NEXT:    pand %xmm5, %xmm4672; SSE2-NEXT:    movdqa %xmm0, %xmm3673; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]674; SSE2-NEXT:    pandn %xmm3, %xmm5675; SSE2-NEXT:    por %xmm4, %xmm5676; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[0,2,1,3]677; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,7,6,5]678; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,3,2,1]679; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,3,2,1,4,5,6,7]680; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,6,5,4,7]681; SSE2-NEXT:    packuswb %xmm4, %xmm4682; SSE2-NEXT:    movq %xmm4, (%rsi)683; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [0,255,255,0,255,255,0,255,255,255,255,255,255,255,255,255]684; SSE2-NEXT:    movdqa %xmm0, %xmm5685; SSE2-NEXT:    pand %xmm4, %xmm5686; SSE2-NEXT:    pandn %xmm1, %xmm4687; SSE2-NEXT:    por %xmm5, %xmm4688; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]689; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [65535,65535,0,65535,65535,0,65535,65535]690; SSE2-NEXT:    pand %xmm5, %xmm4691; SSE2-NEXT:    pandn %xmm3, %xmm5692; SSE2-NEXT:    por %xmm4, %xmm5693; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm5[2,1,0,3,4,5,6,7]694; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,6,5,4,7]695; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,3,2,1]696; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[1,2,3,0,4,5,6,7]697; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,6,7,4]698; SSE2-NEXT:    packuswb %xmm4, %xmm4699; SSE2-NEXT:    movq %xmm4, (%rdx)700; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,255,255,0,255,255,0,255,255,255,255,255,255,255,255]701; SSE2-NEXT:    pand %xmm4, %xmm0702; SSE2-NEXT:    pandn %xmm1, %xmm4703; SSE2-NEXT:    por %xmm0, %xmm4704; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]705; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [0,65535,65535,0,65535,65535,0,65535]706; SSE2-NEXT:    pand %xmm0, %xmm4707; SSE2-NEXT:    pandn %xmm3, %xmm0708; SSE2-NEXT:    por %xmm4, %xmm0709; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,0]710; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,7,6,5]711; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,0]712; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,1,0,3,4,5,6,7]713; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,4,7]714; SSE2-NEXT:    packuswb %xmm0, %xmm0715; SSE2-NEXT:    movq %xmm0, (%rcx)716; SSE2-NEXT:    retq717;718; SSE42-LABEL: interleave_24i8_out:719; SSE42:       # %bb.0:720; SSE42-NEXT:    movdqu (%rdi), %xmm0721; SSE42-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero722; SSE42-NEXT:    movdqa %xmm1, %xmm2723; SSE42-NEXT:    pshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,xmm2[2,5,u,u,u,u,u,u,u,u]724; SSE42-NEXT:    movdqa %xmm0, %xmm3725; SSE42-NEXT:    pshufb {{.*#+}} xmm3 = xmm3[0,3,6,9,12,15],zero,zero,xmm3[u,u,u,u,u,u,u,u]726; SSE42-NEXT:    por %xmm2, %xmm3727; SSE42-NEXT:    movq %xmm3, (%rsi)728; SSE42-NEXT:    movdqa %xmm1, %xmm2729; SSE42-NEXT:    pshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,xmm2[0,3,6,u,u,u,u,u,u,u,u]730; SSE42-NEXT:    movdqa %xmm0, %xmm3731; SSE42-NEXT:    pshufb {{.*#+}} xmm3 = xmm3[1,4,7,10,13],zero,zero,zero,xmm3[u,u,u,u,u,u,u,u]732; SSE42-NEXT:    por %xmm2, %xmm3733; SSE42-NEXT:    movq %xmm3, (%rdx)734; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,xmm1[1,4,7,u,u,u,u,u,u,u,u]735; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,5,8,11,14],zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]736; SSE42-NEXT:    por %xmm1, %xmm0737; SSE42-NEXT:    movq %xmm0, (%rcx)738; SSE42-NEXT:    retq739;740; AVX1-LABEL: interleave_24i8_out:741; AVX1:       # %bb.0:742; AVX1-NEXT:    vmovdqu (%rdi), %xmm0743; AVX1-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero744; AVX1-NEXT:    vpshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,xmm1[2,5,u,u,u,u,u,u,u,u]745; AVX1-NEXT:    vpshufb {{.*#+}} xmm3 = xmm0[0,3,6,9,12,15],zero,zero,xmm0[u,u,u,u,u,u,u,u]746; AVX1-NEXT:    vpor %xmm2, %xmm3, %xmm2747; AVX1-NEXT:    vmovq %xmm2, (%rsi)748; AVX1-NEXT:    vpshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,xmm1[0,3,6,u,u,u,u,u,u,u,u]749; AVX1-NEXT:    vpshufb {{.*#+}} xmm3 = xmm0[1,4,7,10,13],zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]750; AVX1-NEXT:    vpor %xmm2, %xmm3, %xmm2751; AVX1-NEXT:    vmovq %xmm2, (%rdx)752; AVX1-NEXT:    vpshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,xmm1[1,4,7,u,u,u,u,u,u,u,u]753; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,5,8,11,14],zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]754; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0755; AVX1-NEXT:    vmovq %xmm0, (%rcx)756; AVX1-NEXT:    retq757;758; AVX2-LABEL: interleave_24i8_out:759; AVX2:       # %bb.0:760; AVX2-NEXT:    vmovdqu (%rdi), %xmm0761; AVX2-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero762; AVX2-NEXT:    vpshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,xmm1[2,5,u,u,u,u,u,u,u,u]763; AVX2-NEXT:    vpshufb {{.*#+}} xmm3 = xmm0[0,3,6,9,12,15],zero,zero,xmm0[u,u,u,u,u,u,u,u]764; AVX2-NEXT:    vpor %xmm2, %xmm3, %xmm2765; AVX2-NEXT:    vmovq %xmm2, (%rsi)766; AVX2-NEXT:    vpshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,xmm1[0,3,6,u,u,u,u,u,u,u,u]767; AVX2-NEXT:    vpshufb {{.*#+}} xmm3 = xmm0[1,4,7,10,13],zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]768; AVX2-NEXT:    vpor %xmm2, %xmm3, %xmm2769; AVX2-NEXT:    vmovq %xmm2, (%rdx)770; AVX2-NEXT:    vpshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,xmm1[1,4,7,u,u,u,u,u,u,u,u]771; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,5,8,11,14],zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]772; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0773; AVX2-NEXT:    vmovq %xmm0, (%rcx)774; AVX2-NEXT:    retq775;776; XOP-LABEL: interleave_24i8_out:777; XOP:       # %bb.0:778; XOP-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero779; XOP-NEXT:    vmovdqu (%rdi), %xmm1780; XOP-NEXT:    vpperm {{.*#+}} xmm2 = xmm1[0,3,6,9,12,15],xmm0[2,5],xmm1[u,u,u,u,u,u,u,u]781; XOP-NEXT:    vmovq %xmm2, (%rsi)782; XOP-NEXT:    vpperm {{.*#+}} xmm2 = xmm1[1,4,7,10,13],xmm0[0,3,6],xmm1[u,u,u,u,u,u,u,u]783; XOP-NEXT:    vmovq %xmm2, (%rdx)784; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm1[2,5,8,11,14],xmm0[1,4,7],xmm1[u,u,u,u,u,u,u,u]785; XOP-NEXT:    vmovq %xmm0, (%rcx)786; XOP-NEXT:    retq787  %wide.vec = load <24 x i8>, ptr %p, align 4788  %s1 = shufflevector <24 x i8> %wide.vec, <24 x i8> undef, <8 x i32> <i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21>789  %s2 = shufflevector <24 x i8> %wide.vec, <24 x i8> undef, <8 x i32> <i32 1, i32 4, i32 7, i32 10, i32 13, i32 16, i32 19, i32 22>790  %s3 = shufflevector <24 x i8> %wide.vec, <24 x i8> undef, <8 x i32> <i32 2, i32 5, i32 8, i32 11, i32 14, i32 17, i32 20, i32 23>791  store <8 x i8> %s1, ptr %q1, align 4792  store <8 x i8> %s2, ptr %q2, align 4793  store <8 x i8> %s3, ptr %q3, align 4794  ret void795}796 797define void @interleave_24i8_in(ptr %p, ptr %q1, ptr %q2, ptr %q3) nounwind {798; SSE2-LABEL: interleave_24i8_in:799; SSE2:       # %bb.0:800; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero801; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero802; SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero803; SSE2-NEXT:    pxor %xmm3, %xmm3804; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]805; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,2,2]806; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [65535,65535,0,65535,65535,0,65535,65535]807; SSE2-NEXT:    pand %xmm5, %xmm4808; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]809; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm1[3,3,3,3,4,5,6,7]810; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,4,4,4]811; SSE2-NEXT:    pandn %xmm3, %xmm5812; SSE2-NEXT:    por %xmm4, %xmm5813; SSE2-NEXT:    movdqa %xmm2, %xmm3814; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]815; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,1,2,1]816; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,1,2,2,4,5,6,7]817; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,5,4,5]818; SSE2-NEXT:    packuswb %xmm5, %xmm3819; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,0,255,255,0,255,255,0,255,255,0,255,255,0,255]820; SSE2-NEXT:    pand %xmm4, %xmm3821; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,1,0,1]822; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[0,0,0,0,4,5,6,7]823; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,5,6,6]824; SSE2-NEXT:    pandn %xmm5, %xmm4825; SSE2-NEXT:    por %xmm3, %xmm4826; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]827; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,1,3,3]828; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,1,1,0,4,5,6,7]829; SSE2-NEXT:    packuswb %xmm1, %xmm1830; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,0,255,255,0,255,255,0,255,255,255,255,255,255,255,255]831; SSE2-NEXT:    pand %xmm2, %xmm1832; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,1,3,3,4,5,6,7]833; SSE2-NEXT:    pandn %xmm0, %xmm2834; SSE2-NEXT:    por %xmm1, %xmm2835; SSE2-NEXT:    movq %xmm2, 16(%rdi)836; SSE2-NEXT:    movdqu %xmm4, (%rdi)837; SSE2-NEXT:    retq838;839; SSE42-LABEL: interleave_24i8_in:840; SSE42:       # %bb.0:841; SSE42-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero842; SSE42-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero843; SSE42-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero844; SSE42-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]845; SSE42-NEXT:    movdqa %xmm2, %xmm1846; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,8],zero,xmm1[1,9],zero,xmm1[2,10],zero,xmm1[3,11],zero,xmm1[4,12],zero,xmm1[5]847; SSE42-NEXT:    movdqa %xmm0, %xmm3848; SSE42-NEXT:    pshufb {{.*#+}} xmm3 = zero,zero,xmm3[0],zero,zero,xmm3[1],zero,zero,xmm3[2],zero,zero,xmm3[3],zero,zero,xmm3[4],zero849; SSE42-NEXT:    por %xmm1, %xmm3850; SSE42-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[13],zero,xmm2[6,14],zero,xmm2[7,15],zero,xmm2[u,u,u,u,u,u,u,u]851; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = zero,xmm0[5],zero,zero,xmm0[6],zero,zero,xmm0[7,u,u,u,u,u,u,u,u]852; SSE42-NEXT:    por %xmm2, %xmm0853; SSE42-NEXT:    movq %xmm0, 16(%rdi)854; SSE42-NEXT:    movdqu %xmm3, (%rdi)855; SSE42-NEXT:    retq856;857; AVX1-LABEL: interleave_24i8_in:858; AVX1:       # %bb.0:859; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero860; AVX1-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero861; AVX1-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero862; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]863; AVX1-NEXT:    vpshufb {{.*#+}} xmm2 = xmm1[0,8],zero,xmm1[1,9],zero,xmm1[2,10],zero,xmm1[3,11],zero,xmm1[4,12],zero,xmm1[5]864; AVX1-NEXT:    vpshufb {{.*#+}} xmm3 = zero,zero,xmm0[0],zero,zero,xmm0[1],zero,zero,xmm0[2],zero,zero,xmm0[3],zero,zero,xmm0[4],zero865; AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2866; AVX1-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[13],zero,xmm1[6,14],zero,xmm1[7,15],zero,xmm1[u,u,u,u,u,u,u,u]867; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = zero,xmm0[5],zero,zero,xmm0[6],zero,zero,xmm0[7,u,u,u,u,u,u,u,u]868; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0869; AVX1-NEXT:    vmovq %xmm0, 16(%rdi)870; AVX1-NEXT:    vmovdqu %xmm2, (%rdi)871; AVX1-NEXT:    retq872;873; AVX2-LABEL: interleave_24i8_in:874; AVX2:       # %bb.0:875; AVX2-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero876; AVX2-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero877; AVX2-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero878; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]879; AVX2-NEXT:    vpshufb {{.*#+}} xmm2 = xmm1[0,8],zero,xmm1[1,9],zero,xmm1[2,10],zero,xmm1[3,11],zero,xmm1[4,12],zero,xmm1[5]880; AVX2-NEXT:    vpshufb {{.*#+}} xmm3 = zero,zero,xmm0[0],zero,zero,xmm0[1],zero,zero,xmm0[2],zero,zero,xmm0[3],zero,zero,xmm0[4],zero881; AVX2-NEXT:    vpor %xmm3, %xmm2, %xmm2882; AVX2-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[13],zero,xmm1[6,14],zero,xmm1[7,15],zero,xmm1[u,u,u,u,u,u,u,u]883; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = zero,xmm0[5],zero,zero,xmm0[6],zero,zero,xmm0[7,u,u,u,u,u,u,u,u]884; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0885; AVX2-NEXT:    vmovq %xmm0, 16(%rdi)886; AVX2-NEXT:    vmovdqu %xmm2, (%rdi)887; AVX2-NEXT:    retq888;889; XOP-LABEL: interleave_24i8_in:890; XOP:       # %bb.0:891; XOP-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero892; XOP-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero893; XOP-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero894; XOP-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]895; XOP-NEXT:    vpperm {{.*#+}} xmm2 = xmm1[0,8],xmm0[0],xmm1[1,9],xmm0[1],xmm1[2,10],xmm0[2],xmm1[3,11],xmm0[3],xmm1[4,12],xmm0[4],xmm1[5]896; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm1[13],xmm0[5],xmm1[6,14],xmm0[6],xmm1[7,15],xmm0[7],xmm1[u,u,u,u,u,u,u,u]897; XOP-NEXT:    vmovq %xmm0, 16(%rdi)898; XOP-NEXT:    vmovdqu %xmm2, (%rdi)899; XOP-NEXT:    retq900  %s1 = load <8 x i8>, ptr %q1, align 4901  %s2 = load <8 x i8>, ptr %q2, align 4902  %s3 = load <8 x i8>, ptr %q3, align 4903  %t1 = shufflevector <8 x i8> %s1, <8 x i8> %s2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>904  %t2 = shufflevector <8 x i8> %s3, <8 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>905  %interleaved = shufflevector <16 x i8> %t1, <16 x i8> %t2, <24 x i32> <i32 0, i32 8, i32 16, i32 1, i32 9, i32 17, i32 2, i32 10, i32 18, i32 3, i32 11, i32 19, i32 4, i32 12, i32 20, i32 5, i32 13, i32 21, i32 6, i32 14, i32 22, i32 7, i32 15, i32 23>906  store <24 x i8> %interleaved, ptr %p, align 4907  ret void908}909 910 911define void @interleave_24i16_out(ptr %p, ptr %q1, ptr %q2, ptr %q3) nounwind {912; SSE2-LABEL: interleave_24i16_out:913; SSE2:       # %bb.0:914; SSE2-NEXT:    movdqu (%rdi), %xmm3915; SSE2-NEXT:    movdqu 16(%rdi), %xmm2916; SSE2-NEXT:    movdqu 32(%rdi), %xmm0917; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,0,65535,65535,0,65535,65535,0]918; SSE2-NEXT:    movdqa %xmm3, %xmm4919; SSE2-NEXT:    pand %xmm1, %xmm4920; SSE2-NEXT:    pandn %xmm2, %xmm1921; SSE2-NEXT:    por %xmm4, %xmm1922; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,1,3]923; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,5,6,7]924; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,1,3]925; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,3,2,1,4,5,6,7]926; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm2[0,1,2,3,4,7,6,7]927; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,1,2,1]928; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,5,6,5]929; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[3,0],xmm4[2,0]930; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,0]931; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [65535,65535,0,65535,65535,0,65535,65535]932; SSE2-NEXT:    movdqa %xmm4, %xmm5933; SSE2-NEXT:    pandn %xmm2, %xmm5934; SSE2-NEXT:    movdqa %xmm3, %xmm6935; SSE2-NEXT:    pand %xmm4, %xmm6936; SSE2-NEXT:    por %xmm5, %xmm6937; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm6[2,1,2,3,4,5,6,7]938; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,5,4,7]939; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,3,2,3]940; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[1,2,3,0,4,5,6,7]941; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,5,5,5]942; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [65535,65535,65535,65535,65535,0,0,0]943; SSE2-NEXT:    pand %xmm6, %xmm5944; SSE2-NEXT:    pshuflw {{.*#+}} xmm7 = xmm0[0,3,2,3,4,5,6,7]945; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[0,1,0,3]946; SSE2-NEXT:    pshufhw {{.*#+}} xmm7 = xmm7[0,1,2,3,4,4,5,6]947; SSE2-NEXT:    movdqa %xmm6, %xmm8948; SSE2-NEXT:    pandn %xmm7, %xmm8949; SSE2-NEXT:    por %xmm5, %xmm8950; SSE2-NEXT:    pand %xmm4, %xmm2951; SSE2-NEXT:    pandn %xmm3, %xmm4952; SSE2-NEXT:    por %xmm2, %xmm4953; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[3,1,2,0]954; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,6,5,6,7]955; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,1,0,3]956; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[2,1,0,3,4,5,6,7]957; SSE2-NEXT:    pand %xmm6, %xmm2958; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,7,6,7]959; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,2]960; SSE2-NEXT:    pandn %xmm0, %xmm6961; SSE2-NEXT:    por %xmm2, %xmm6962; SSE2-NEXT:    movups %xmm1, (%rsi)963; SSE2-NEXT:    movdqu %xmm8, (%rdx)964; SSE2-NEXT:    movdqu %xmm6, (%rcx)965; SSE2-NEXT:    retq966;967; SSE42-LABEL: interleave_24i16_out:968; SSE42:       # %bb.0:969; SSE42-NEXT:    movdqu (%rdi), %xmm0970; SSE42-NEXT:    movdqu 16(%rdi), %xmm1971; SSE42-NEXT:    movdqu 32(%rdi), %xmm2972; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,1,2,1]973; SSE42-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,5,6,5]974; SSE42-NEXT:    movdqa %xmm0, %xmm4975; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0],xmm1[1],xmm4[2,3],xmm1[4],xmm4[5,6],xmm1[7]976; SSE42-NEXT:    pshufb {{.*#+}} xmm4 = xmm4[0,1,6,7,12,13,2,3,8,9,14,15,u,u,u,u]977; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5],xmm3[6,7]978; SSE42-NEXT:    movdqa %xmm0, %xmm3979; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm1[2],xmm3[3,4],xmm1[5],xmm3[6,7]980; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm2[0],xmm3[1,2],xmm2[3],xmm3[4,5],xmm2[6],xmm3[7]981; SSE42-NEXT:    pshufb {{.*#+}} xmm3 = xmm3[2,3,8,9,14,15,4,5,10,11,0,1,6,7,12,13]982; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7]983; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2,3],xmm2[4],xmm1[5,6],xmm2[7]984; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[4,5,10,11,0,1,6,7,12,13,2,3,8,9,14,15]985; SSE42-NEXT:    movdqu %xmm4, (%rsi)986; SSE42-NEXT:    movdqu %xmm3, (%rdx)987; SSE42-NEXT:    movdqu %xmm1, (%rcx)988; SSE42-NEXT:    retq989;990; AVX1-LABEL: interleave_24i16_out:991; AVX1:       # %bb.0:992; AVX1-NEXT:    vmovdqu (%rdi), %xmm0993; AVX1-NEXT:    vmovdqu 16(%rdi), %xmm1994; AVX1-NEXT:    vmovdqu 32(%rdi), %xmm2995; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm2[0,1,2,1]996; AVX1-NEXT:    vpshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,5,6,5]997; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]998; AVX1-NEXT:    vpshufb {{.*#+}} xmm4 = xmm4[0,1,6,7,12,13,2,3,8,9,14,15,u,u,u,u]999; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3,4,5],xmm3[6,7]1000; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]1001; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm2[0],xmm4[1,2],xmm2[3],xmm4[4,5],xmm2[6],xmm4[7]1002; AVX1-NEXT:    vpshufb {{.*#+}} xmm4 = xmm4[2,3,8,9,14,15,4,5,10,11,0,1,6,7,12,13]1003; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7]1004; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2,3],xmm2[4],xmm0[5,6],xmm2[7]1005; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,10,11,0,1,6,7,12,13,2,3,8,9,14,15]1006; AVX1-NEXT:    vmovdqu %xmm3, (%rsi)1007; AVX1-NEXT:    vmovdqu %xmm4, (%rdx)1008; AVX1-NEXT:    vmovdqu %xmm0, (%rcx)1009; AVX1-NEXT:    retq1010;1011; AVX2-LABEL: interleave_24i16_out:1012; AVX2:       # %bb.0:1013; AVX2-NEXT:    vmovdqu (%rdi), %xmm01014; AVX2-NEXT:    vmovdqu 16(%rdi), %xmm11015; AVX2-NEXT:    vmovdqu 32(%rdi), %xmm21016; AVX2-NEXT:    vpblendw {{.*#+}} xmm3 = xmm0[0,1],xmm2[2],xmm0[3,4],xmm2[5],xmm0[6,7]1017; AVX2-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0],xmm1[1],xmm3[2,3],xmm1[4],xmm3[5,6],xmm1[7]1018; AVX2-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[0,1,6,7,12,13,2,3,8,9,14,15,4,5,10,11]1019; AVX2-NEXT:    vpblendw {{.*#+}} xmm4 = xmm2[0],xmm0[1,2],xmm2[3],xmm0[4,5],xmm2[6],xmm0[7]1020; AVX2-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm1[2],xmm4[3,4],xmm1[5],xmm4[6,7]1021; AVX2-NEXT:    vpshufb {{.*#+}} xmm4 = xmm4[2,3,8,9,14,15,4,5,10,11,0,1,6,7,12,13]1022; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2,3],xmm2[4],xmm0[5,6],xmm2[7]1023; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3],xmm0[4,5],xmm1[6],xmm0[7]1024; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,10,11,0,1,6,7,12,13,2,3,8,9,14,15]1025; AVX2-NEXT:    vmovdqu %xmm3, (%rsi)1026; AVX2-NEXT:    vmovdqu %xmm4, (%rdx)1027; AVX2-NEXT:    vmovdqu %xmm0, (%rcx)1028; AVX2-NEXT:    retq1029;1030; XOP-LABEL: interleave_24i16_out:1031; XOP:       # %bb.0:1032; XOP-NEXT:    vmovdqu (%rdi), %xmm01033; XOP-NEXT:    vmovdqu 16(%rdi), %xmm11034; XOP-NEXT:    vmovdqu 32(%rdi), %xmm21035; XOP-NEXT:    vpblendw {{.*#+}} xmm3 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]1036; XOP-NEXT:    vpperm {{.*#+}} xmm3 = xmm3[0,1,6,7,12,13,2,3,8,9,14,15],xmm2[4,5,10,11]1037; XOP-NEXT:    vpblendw {{.*#+}} xmm4 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]1038; XOP-NEXT:    vpperm {{.*#+}} xmm4 = xmm4[2,3,8,9,14,15,4,5,10,11],xmm2[0,1,6,7,12,13]1039; XOP-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7]1040; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[4,5,10,11,0,1,6,7,12,13],xmm2[2,3,8,9,14,15]1041; XOP-NEXT:    vmovdqu %xmm3, (%rsi)1042; XOP-NEXT:    vmovdqu %xmm4, (%rdx)1043; XOP-NEXT:    vmovdqu %xmm0, (%rcx)1044; XOP-NEXT:    retq1045  %wide.vec = load <24 x i16>, ptr %p, align 41046  %s1 = shufflevector <24 x i16> %wide.vec, <24 x i16> undef, <8 x i32> <i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21>1047  %s2 = shufflevector <24 x i16> %wide.vec, <24 x i16> undef, <8 x i32> <i32 1, i32 4, i32 7, i32 10, i32 13, i32 16, i32 19, i32 22>1048  %s3 = shufflevector <24 x i16> %wide.vec, <24 x i16> undef, <8 x i32> <i32 2, i32 5, i32 8, i32 11, i32 14, i32 17, i32 20, i32 23>1049  store <8 x i16> %s1, ptr %q1, align 41050  store <8 x i16> %s2, ptr %q2, align 41051  store <8 x i16> %s3, ptr %q3, align 41052  ret void1053}1054 1055define void @interleave_24i16_out_reverse(ptr %p, ptr %q1, ptr %q2, ptr %q3) nounwind {1056; SSE2-LABEL: interleave_24i16_out_reverse:1057; SSE2:       # %bb.0:1058; SSE2-NEXT:    movdqu (%rdi), %xmm01059; SSE2-NEXT:    movdqu 16(%rdi), %xmm11060; SSE2-NEXT:    movdqu 32(%rdi), %xmm31061; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,0,65535,65535,0,65535,65535,0]1062; SSE2-NEXT:    movdqa %xmm1, %xmm41063; SSE2-NEXT:    pand %xmm2, %xmm41064; SSE2-NEXT:    pandn %xmm3, %xmm21065; SSE2-NEXT:    por %xmm4, %xmm21066; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,1,3]1067; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[2,1,0,3,4,5,6,7]1068; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,3,2,1]1069; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm2[0,1,2,3,5,6,6,7]1070; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,1,2,1]1071; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,5,5,6]1072; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[3,0],xmm4[2,0]1073; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,0,1,2,4,5,6,7]1074; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm5[2,0]1075; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [65535,65535,0,65535,65535,0,65535,65535]1076; SSE2-NEXT:    movdqa %xmm4, %xmm51077; SSE2-NEXT:    pandn %xmm1, %xmm51078; SSE2-NEXT:    movdqa %xmm3, %xmm61079; SSE2-NEXT:    pand %xmm4, %xmm61080; SSE2-NEXT:    por %xmm5, %xmm61081; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm6[0,3,2,3,4,5,6,7]1082; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,6,5,6,7]1083; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,2,1,1]1084; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[2,1,0,3,4,5,6,7]1085; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [65535,65535,65535,65535,65535,0,0,0]1086; SSE2-NEXT:    pand %xmm6, %xmm51087; SSE2-NEXT:    pshufhw {{.*#+}} xmm7 = xmm0[0,1,2,3,4,7,6,7]1088; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[0,1,2,0]1089; SSE2-NEXT:    pshufhw {{.*#+}} xmm7 = xmm7[0,1,2,3,4,5,4,7]1090; SSE2-NEXT:    movdqa %xmm6, %xmm81091; SSE2-NEXT:    pandn %xmm7, %xmm81092; SSE2-NEXT:    por %xmm5, %xmm81093; SSE2-NEXT:    pand %xmm4, %xmm11094; SSE2-NEXT:    pandn %xmm3, %xmm41095; SSE2-NEXT:    por %xmm1, %xmm41096; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[3,1,2,0]1097; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,1,2,3,4,5,6,7]1098; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1099; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,0,1,2,4,5,6,7]1100; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,7,7,7]1101; SSE2-NEXT:    pand %xmm6, %xmm11102; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,2,3,4,5,6,7]1103; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,3]1104; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,5,4]1105; SSE2-NEXT:    pandn %xmm0, %xmm61106; SSE2-NEXT:    por %xmm1, %xmm61107; SSE2-NEXT:    movups %xmm2, (%rsi)1108; SSE2-NEXT:    movdqu %xmm8, (%rdx)1109; SSE2-NEXT:    movdqu %xmm6, (%rcx)1110; SSE2-NEXT:    retq1111;1112; SSE42-LABEL: interleave_24i16_out_reverse:1113; SSE42:       # %bb.0:1114; SSE42-NEXT:    movdqu (%rdi), %xmm01115; SSE42-NEXT:    movdqu 16(%rdi), %xmm11116; SSE42-NEXT:    movdqu 32(%rdi), %xmm21117; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,1,2,1]1118; SSE42-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,5,5,6]1119; SSE42-NEXT:    movdqa %xmm1, %xmm41120; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0],xmm2[1],xmm4[2,3],xmm2[4],xmm4[5,6],xmm2[7]1121; SSE42-NEXT:    pshufb {{.*#+}} xmm4 = xmm4[14,15,8,9,2,3,12,13,6,7,0,1,u,u,u,u]1122; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5],xmm3[6,7]1123; SSE42-NEXT:    movdqa %xmm2, %xmm31124; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm1[2],xmm3[3,4],xmm1[5],xmm3[6,7]1125; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm0[1],xmm3[2,3],xmm0[4],xmm3[5,6],xmm0[7]1126; SSE42-NEXT:    pshufb {{.*#+}} xmm3 = xmm3[12,13,6,7,0,1,10,11,4,5,14,15,8,9,2,3]1127; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2],xmm1[3,4],xmm2[5],xmm1[6,7]1128; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2],xmm0[3],xmm1[4,5],xmm0[6],xmm1[7]1129; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[10,11,4,5,14,15,8,9,2,3,12,13,6,7,0,1]1130; SSE42-NEXT:    movdqu %xmm4, (%rsi)1131; SSE42-NEXT:    movdqu %xmm3, (%rdx)1132; SSE42-NEXT:    movdqu %xmm1, (%rcx)1133; SSE42-NEXT:    retq1134;1135; AVX1-LABEL: interleave_24i16_out_reverse:1136; AVX1:       # %bb.0:1137; AVX1-NEXT:    vmovdqu (%rdi), %xmm01138; AVX1-NEXT:    vmovdqu 16(%rdi), %xmm11139; AVX1-NEXT:    vmovdqu 32(%rdi), %xmm21140; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7]1141; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1],xmm3[2,3],xmm2[4],xmm3[5,6],xmm2[7]1142; AVX1-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[14,15,8,9,2,3,12,13,6,7,0,1,10,11,4,5]1143; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]1144; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm2[0],xmm4[1,2],xmm2[3],xmm4[4,5],xmm2[6],xmm4[7]1145; AVX1-NEXT:    vpshufb {{.*#+}} xmm4 = xmm4[12,13,6,7,0,1,10,11,4,5,14,15,8,9,2,3]1146; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,1,2,3]1147; AVX1-NEXT:    vpshuflw {{.*#+}} xmm2 = xmm2[1,2,2,3,4,5,6,7]1148; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]1149; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[u,u,u,u,14,15,8,9,2,3,12,13,6,7,0,1]1150; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3,4,5,6,7]1151; AVX1-NEXT:    vmovdqu %xmm3, (%rsi)1152; AVX1-NEXT:    vmovdqu %xmm4, (%rdx)1153; AVX1-NEXT:    vmovdqu %xmm0, (%rcx)1154; AVX1-NEXT:    retq1155;1156; AVX2-LABEL: interleave_24i16_out_reverse:1157; AVX2:       # %bb.0:1158; AVX2-NEXT:    vmovdqu (%rdi), %xmm01159; AVX2-NEXT:    vmovdqu 16(%rdi), %xmm11160; AVX2-NEXT:    vmovdqu 32(%rdi), %xmm21161; AVX2-NEXT:    vpblendw {{.*#+}} xmm3 = xmm0[0],xmm2[1],xmm0[2,3],xmm2[4],xmm0[5,6],xmm2[7]1162; AVX2-NEXT:    vpblendw {{.*#+}} xmm3 = xmm1[0],xmm3[1,2],xmm1[3],xmm3[4,5],xmm1[6],xmm3[7]1163; AVX2-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[14,15,8,9,2,3,12,13,6,7,0,1,10,11,4,5]1164; AVX2-NEXT:    vpblendw {{.*#+}} xmm4 = xmm2[0],xmm0[1,2],xmm2[3],xmm0[4,5],xmm2[6],xmm0[7]1165; AVX2-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm1[2],xmm4[3,4],xmm1[5],xmm4[6,7]1166; AVX2-NEXT:    vpshufb {{.*#+}} xmm4 = xmm4[12,13,6,7,0,1,10,11,4,5,14,15,8,9,2,3]1167; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2],xmm0[3,4],xmm2[5],xmm0[6,7]1168; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]1169; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[10,11,4,5,14,15,8,9,2,3,12,13,6,7,0,1]1170; AVX2-NEXT:    vmovdqu %xmm3, (%rsi)1171; AVX2-NEXT:    vmovdqu %xmm4, (%rdx)1172; AVX2-NEXT:    vmovdqu %xmm0, (%rcx)1173; AVX2-NEXT:    retq1174;1175; XOP-LABEL: interleave_24i16_out_reverse:1176; XOP:       # %bb.0:1177; XOP-NEXT:    vmovdqu (%rdi), %xmm01178; XOP-NEXT:    vmovdqu 16(%rdi), %xmm11179; XOP-NEXT:    vmovdqu 32(%rdi), %xmm21180; XOP-NEXT:    vpblendw {{.*#+}} xmm3 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7]1181; XOP-NEXT:    vpperm {{.*#+}} xmm3 = xmm2[14,15,8,9,2,3],xmm3[12,13,6,7,0,1,10,11,4,5]1182; XOP-NEXT:    vpblendw {{.*#+}} xmm4 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]1183; XOP-NEXT:    vpperm {{.*#+}} xmm4 = xmm2[12,13,6,7,0,1],xmm4[10,11,4,5,14,15,8,9,2,3]1184; XOP-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]1185; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm2[10,11,4,5],xmm0[14,15,8,9,2,3,12,13,6,7,0,1]1186; XOP-NEXT:    vmovdqu %xmm3, (%rsi)1187; XOP-NEXT:    vmovdqu %xmm4, (%rdx)1188; XOP-NEXT:    vmovdqu %xmm0, (%rcx)1189; XOP-NEXT:    retq1190  %wide.vec.reverse = load <24 x i16>, ptr %p, align 41191  %wide.vec = shufflevector <24 x i16> %wide.vec.reverse, <24 x i16> undef, <24 x i32> <i32 23, i32 22, i32 21, i32 20, i32 19, i32 18, i32 17, i32 16, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>1192  %s1 = shufflevector <24 x i16> %wide.vec, <24 x i16> undef, <8 x i32> <i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21>1193  %s2 = shufflevector <24 x i16> %wide.vec, <24 x i16> undef, <8 x i32> <i32 1, i32 4, i32 7, i32 10, i32 13, i32 16, i32 19, i32 22>1194  %s3 = shufflevector <24 x i16> %wide.vec, <24 x i16> undef, <8 x i32> <i32 2, i32 5, i32 8, i32 11, i32 14, i32 17, i32 20, i32 23>1195  store <8 x i16> %s1, ptr %q1, align 41196  store <8 x i16> %s2, ptr %q2, align 41197  store <8 x i16> %s3, ptr %q3, align 41198  ret void1199}1200 1201define void @interleave_24i16_in(ptr %p, ptr %q1, ptr %q2, ptr %q3) nounwind {1202; SSE2-LABEL: interleave_24i16_in:1203; SSE2:       # %bb.0:1204; SSE2-NEXT:    movdqu (%rsi), %xmm01205; SSE2-NEXT:    movdqu (%rdx), %xmm21206; SSE2-NEXT:    movdqu (%rcx), %xmm31207; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,0,0,0]1208; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [65535,65535,0,65535,65535,0,65535,65535]1209; SSE2-NEXT:    movdqa %xmm4, %xmm51210; SSE2-NEXT:    pandn %xmm1, %xmm51211; SSE2-NEXT:    movdqa %xmm0, %xmm11212; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]1213; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,2,1]1214; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,2,2,4,5,6,7]1215; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,5,4,5]1216; SSE2-NEXT:    pand %xmm4, %xmm11217; SSE2-NEXT:    por %xmm5, %xmm11218; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,2,2]1219; SSE2-NEXT:    pand %xmm4, %xmm51220; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm2[3,3,3,3,4,5,6,7]1221; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,4,4,4,4]1222; SSE2-NEXT:    pandn %xmm6, %xmm41223; SSE2-NEXT:    por %xmm5, %xmm41224; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [0,65535,65535,0,65535,65535,0,65535]1225; SSE2-NEXT:    pand %xmm5, %xmm41226; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[1,1,2,2]1227; SSE2-NEXT:    pandn %xmm6, %xmm51228; SSE2-NEXT:    por %xmm4, %xmm51229; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,2,3,3]1230; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [65535,0,65535,65535,0,65535,65535,0]1231; SSE2-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]1232; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,1,3,3]1233; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,1,1,0,4,5,6,7]1234; SSE2-NEXT:    pand %xmm4, %xmm01235; SSE2-NEXT:    pandn %xmm3, %xmm41236; SSE2-NEXT:    por %xmm0, %xmm41237; SSE2-NEXT:    movdqu %xmm4, 32(%rdi)1238; SSE2-NEXT:    movdqu %xmm5, 16(%rdi)1239; SSE2-NEXT:    movdqu %xmm1, (%rdi)1240; SSE2-NEXT:    retq1241;1242; SSE42-LABEL: interleave_24i16_in:1243; SSE42:       # %bb.0:1244; SSE42-NEXT:    movdqu (%rsi), %xmm01245; SSE42-NEXT:    movdqu (%rdx), %xmm11246; SSE42-NEXT:    movdqu (%rcx), %xmm21247; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,2,2]1248; SSE42-NEXT:    pshuflw {{.*#+}} xmm4 = xmm1[3,3,3,3,4,5,6,7]1249; SSE42-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,4,4,4]1250; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm3[0,1],xmm4[2],xmm3[3,4],xmm4[5],xmm3[6,7]1251; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,2,2]1252; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1,2],xmm3[3],xmm4[4,5],xmm3[6],xmm4[7]1253; SSE42-NEXT:    movdqa %xmm0, %xmm41254; SSE42-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]1255; SSE42-NEXT:    pshufb {{.*#+}} xmm4 = xmm4[0,1,2,3,u,u,4,5,6,7,u,u,8,9,10,11]1256; SSE42-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,0,0]1257; SSE42-NEXT:    pblendw {{.*#+}} xmm5 = xmm4[0,1],xmm5[2],xmm4[3,4],xmm5[5],xmm4[6,7]1258; SSE42-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1259; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[4,5,u,u,10,11,8,9,u,u,14,15,12,13,u,u]1260; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,2,3,3]1261; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4],xmm1[5,6],xmm0[7]1262; SSE42-NEXT:    movdqu %xmm0, 32(%rdi)1263; SSE42-NEXT:    movdqu %xmm5, (%rdi)1264; SSE42-NEXT:    movdqu %xmm3, 16(%rdi)1265; SSE42-NEXT:    retq1266;1267; AVX1-LABEL: interleave_24i16_in:1268; AVX1:       # %bb.0:1269; AVX1-NEXT:    vmovdqu (%rsi), %xmm01270; AVX1-NEXT:    vmovdqu (%rdx), %xmm11271; AVX1-NEXT:    vmovdqu (%rcx), %xmm21272; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,2,2]1273; AVX1-NEXT:    vpshuflw {{.*#+}} xmm4 = xmm1[3,3,3,3,4,5,6,7]1274; AVX1-NEXT:    vpshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,4,4,4]1275; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2],xmm3[3,4],xmm4[5],xmm3[6,7]1276; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm2[1,1,2,2]1277; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0],xmm3[1,2],xmm4[3],xmm3[4,5],xmm4[6],xmm3[7]1278; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm4 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1279; AVX1-NEXT:    vpshufb {{.*#+}} xmm4 = xmm4[4,5,u,u,10,11,8,9,u,u,14,15,12,13,u,u]1280; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm2[2,2,3,3]1281; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0],xmm5[1],xmm4[2,3],xmm5[4],xmm4[5,6],xmm5[7]1282; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1283; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,u,u,4,5,6,7,u,u,8,9,10,11]1284; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[0,0,0,0]1285; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]1286; AVX1-NEXT:    vmovdqu %xmm0, (%rdi)1287; AVX1-NEXT:    vmovdqu %xmm4, 32(%rdi)1288; AVX1-NEXT:    vmovdqu %xmm3, 16(%rdi)1289; AVX1-NEXT:    retq1290;1291; AVX2-SLOW-LABEL: interleave_24i16_in:1292; AVX2-SLOW:       # %bb.0:1293; AVX2-SLOW-NEXT:    vmovdqu (%rsi), %xmm01294; AVX2-SLOW-NEXT:    vmovdqu (%rdx), %xmm11295; AVX2-SLOW-NEXT:    vmovdqu (%rcx), %xmm21296; AVX2-SLOW-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm31297; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,1,0,1,6,7,2,3,2,3,8,9,4,5,4,5,16,17,6,7,22,23,18,19,8,9,24,25,20,21,10,11]1298; AVX2-SLOW-NEXT:    vpshufb %ymm4, %ymm3, %ymm51299; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm3 = ymm3[2,3,0,1]1300; AVX2-SLOW-NEXT:    vpshufb %ymm4, %ymm3, %ymm31301; AVX2-SLOW-NEXT:    vpblendw {{.*#+}} ymm3 = ymm5[0],ymm3[1],ymm5[2,3],ymm3[4],ymm5[5,6],ymm3[7],ymm5[8],ymm3[9],ymm5[10,11],ymm3[12],ymm5[13,14],ymm3[15]1302; AVX2-SLOW-NEXT:    vpmovsxbd {{.*#+}} ymm4 = [0,0,0,0,1,1,0,2]1303; AVX2-SLOW-NEXT:    vpermd %ymm2, %ymm4, %ymm41304; AVX2-SLOW-NEXT:    vpmovsxbw {{.*#+}} ymm5 = [65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535]1305; AVX2-SLOW-NEXT:    vpblendvb %ymm5, %ymm3, %ymm4, %ymm31306; AVX2-SLOW-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1307; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,u,u,10,11,8,9,u,u,14,15,12,13,u,u]1308; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[2,2,3,3]1309; AVX2-SLOW-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]1310; AVX2-SLOW-NEXT:    vmovdqu %xmm0, 32(%rdi)1311; AVX2-SLOW-NEXT:    vmovdqu %ymm3, (%rdi)1312; AVX2-SLOW-NEXT:    vzeroupper1313; AVX2-SLOW-NEXT:    retq1314;1315; AVX2-FAST-ALL-LABEL: interleave_24i16_in:1316; AVX2-FAST-ALL:       # %bb.0:1317; AVX2-FAST-ALL-NEXT:    vmovdqu (%rsi), %xmm01318; AVX2-FAST-ALL-NEXT:    vmovdqu (%rdx), %xmm11319; AVX2-FAST-ALL-NEXT:    vmovdqu (%rcx), %xmm21320; AVX2-FAST-ALL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm31321; AVX2-FAST-ALL-NEXT:    vpmovsxbd {{.*#+}} ymm4 = [0,0,0,0,1,1,0,2]1322; AVX2-FAST-ALL-NEXT:    vpermd %ymm2, %ymm4, %ymm41323; AVX2-FAST-ALL-NEXT:    vpmovsxbd {{.*#+}} ymm5 = [0,4,1,5,1,5,2,6]1324; AVX2-FAST-ALL-NEXT:    vpermd %ymm3, %ymm5, %ymm31325; AVX2-FAST-ALL-NEXT:    vpshufb {{.*#+}} ymm3 = ymm3[0,1,4,5,u,u,2,3,6,7,u,u,8,9,12,13,u,u,18,19,22,23,u,u,24,25,28,29,u,u,26,27]1326; AVX2-FAST-ALL-NEXT:    vpmovsxbw {{.*#+}} ymm5 = [65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535]1327; AVX2-FAST-ALL-NEXT:    vpblendvb %ymm5, %ymm3, %ymm4, %ymm31328; AVX2-FAST-ALL-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1329; AVX2-FAST-ALL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,u,u,10,11,8,9,u,u,14,15,12,13,u,u]1330; AVX2-FAST-ALL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[2,2,3,3]1331; AVX2-FAST-ALL-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]1332; AVX2-FAST-ALL-NEXT:    vmovdqu %xmm0, 32(%rdi)1333; AVX2-FAST-ALL-NEXT:    vmovdqu %ymm3, (%rdi)1334; AVX2-FAST-ALL-NEXT:    vzeroupper1335; AVX2-FAST-ALL-NEXT:    retq1336;1337; AVX2-FAST-PERLANE-LABEL: interleave_24i16_in:1338; AVX2-FAST-PERLANE:       # %bb.0:1339; AVX2-FAST-PERLANE-NEXT:    vmovdqu (%rsi), %xmm01340; AVX2-FAST-PERLANE-NEXT:    vmovdqu (%rdx), %xmm11341; AVX2-FAST-PERLANE-NEXT:    vmovdqu (%rcx), %xmm21342; AVX2-FAST-PERLANE-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm31343; AVX2-FAST-PERLANE-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,1,0,1,6,7,2,3,2,3,8,9,4,5,4,5,16,17,6,7,22,23,18,19,8,9,24,25,20,21,10,11]1344; AVX2-FAST-PERLANE-NEXT:    vpshufb %ymm4, %ymm3, %ymm51345; AVX2-FAST-PERLANE-NEXT:    vpermq {{.*#+}} ymm3 = ymm3[2,3,0,1]1346; AVX2-FAST-PERLANE-NEXT:    vpshufb %ymm4, %ymm3, %ymm31347; AVX2-FAST-PERLANE-NEXT:    vpblendw {{.*#+}} ymm3 = ymm5[0],ymm3[1],ymm5[2,3],ymm3[4],ymm5[5,6],ymm3[7],ymm5[8],ymm3[9],ymm5[10,11],ymm3[12],ymm5[13,14],ymm3[15]1348; AVX2-FAST-PERLANE-NEXT:    vpmovsxbd {{.*#+}} ymm4 = [0,0,0,0,1,1,0,2]1349; AVX2-FAST-PERLANE-NEXT:    vpermd %ymm2, %ymm4, %ymm41350; AVX2-FAST-PERLANE-NEXT:    vpmovsxbw {{.*#+}} ymm5 = [65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535]1351; AVX2-FAST-PERLANE-NEXT:    vpblendvb %ymm5, %ymm3, %ymm4, %ymm31352; AVX2-FAST-PERLANE-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1353; AVX2-FAST-PERLANE-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,u,u,10,11,8,9,u,u,14,15,12,13,u,u]1354; AVX2-FAST-PERLANE-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[2,2,3,3]1355; AVX2-FAST-PERLANE-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]1356; AVX2-FAST-PERLANE-NEXT:    vmovdqu %xmm0, 32(%rdi)1357; AVX2-FAST-PERLANE-NEXT:    vmovdqu %ymm3, (%rdi)1358; AVX2-FAST-PERLANE-NEXT:    vzeroupper1359; AVX2-FAST-PERLANE-NEXT:    retq1360;1361; XOP-LABEL: interleave_24i16_in:1362; XOP:       # %bb.0:1363; XOP-NEXT:    vmovdqu (%rsi), %xmm01364; XOP-NEXT:    vmovdqu (%rdx), %xmm11365; XOP-NEXT:    vmovdqu (%rcx), %xmm21366; XOP-NEXT:    vpperm {{.*#+}} xmm3 = xmm0[u,u,6,7],xmm1[6,7],xmm0[u,u,8,9],xmm1[8,9],xmm0[u,u,10,11]1367; XOP-NEXT:    vpshufd {{.*#+}} xmm4 = xmm2[1,1,2,2]1368; XOP-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0],xmm3[1,2],xmm4[3],xmm3[4,5],xmm4[6],xmm3[7]1369; XOP-NEXT:    vpunpcklwd {{.*#+}} xmm4 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1370; XOP-NEXT:    vpperm {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm2[0,1],xmm4[4,5,6,7],xmm2[2,3],xmm4[8,9,10,11]1371; XOP-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm31372; XOP-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1373; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[4,5],xmm2[10,11],xmm0[10,11,8,9],xmm2[12,13],xmm0[14,15,12,13],xmm2[14,15]1374; XOP-NEXT:    vmovdqu %xmm0, 32(%rdi)1375; XOP-NEXT:    vmovups %ymm3, (%rdi)1376; XOP-NEXT:    vzeroupper1377; XOP-NEXT:    retq1378  %s1 = load <8 x i16>, ptr %q1, align 41379  %s2 = load <8 x i16>, ptr %q2, align 41380  %s3 = load <8 x i16>, ptr %q3, align 41381  %t1 = shufflevector <8 x i16> %s1, <8 x i16> %s2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>1382  %t2 = shufflevector <8 x i16> %s3, <8 x i16> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1383  %interleaved = shufflevector <16 x i16> %t1, <16 x i16> %t2, <24 x i32> <i32 0, i32 8, i32 16, i32 1, i32 9, i32 17, i32 2, i32 10, i32 18, i32 3, i32 11, i32 19, i32 4, i32 12, i32 20, i32 5, i32 13, i32 21, i32 6, i32 14, i32 22, i32 7, i32 15, i32 23>1384  store <24 x i16> %interleaved, ptr %p, align 41385  ret void1386}1387 1388define void @interleave_24i32_out(ptr %p, ptr %q1, ptr %q2, ptr %q3) nounwind {1389; SSE2-LABEL: interleave_24i32_out:1390; SSE2:       # %bb.0:1391; SSE2-NEXT:    movdqu 64(%rdi), %xmm21392; SSE2-NEXT:    movups 80(%rdi), %xmm41393; SSE2-NEXT:    movdqu (%rdi), %xmm01394; SSE2-NEXT:    movdqu 16(%rdi), %xmm31395; SSE2-NEXT:    movups 32(%rdi), %xmm61396; SSE2-NEXT:    movdqu 48(%rdi), %xmm11397; SSE2-NEXT:    movaps %xmm6, %xmm71398; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[2,3,2,3]1399; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[1,1,1,1]1400; SSE2-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm8[0],xmm5[1],xmm8[1]1401; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,1],xmm6[0,3]1402; SSE2-NEXT:    shufps {{.*#+}} xmm6 = xmm6[1,0],xmm3[2,0]1403; SSE2-NEXT:    movdqa %xmm0, %xmm81404; SSE2-NEXT:    shufps {{.*#+}} xmm8 = xmm8[0,3],xmm6[2,0]1405; SSE2-NEXT:    movaps %xmm4, %xmm61406; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm1[2,3,2,3]1407; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm2[1,1,1,1]1408; SSE2-NEXT:    punpckldq {{.*#+}} xmm9 = xmm9[0],xmm10[0],xmm9[1],xmm10[1]1409; SSE2-NEXT:    shufps {{.*#+}} xmm9 = xmm9[0,1],xmm4[0,3]1410; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[1,0],xmm2[2,0]1411; SSE2-NEXT:    movdqa %xmm1, %xmm101412; SSE2-NEXT:    shufps {{.*#+}} xmm10 = xmm10[0,3],xmm4[2,0]1413; SSE2-NEXT:    shufps {{.*#+}} xmm6 = xmm6[2,1],xmm2[3,3]1414; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm2[0,0]1415; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm6[2,0]1416; SSE2-NEXT:    shufps {{.*#+}} xmm7 = xmm7[2,1],xmm3[3,3]1417; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm3[0,0]1418; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm7[2,0]1419; SSE2-NEXT:    movups %xmm10, 16(%rsi)1420; SSE2-NEXT:    movups %xmm8, (%rsi)1421; SSE2-NEXT:    movups %xmm1, 16(%rdx)1422; SSE2-NEXT:    movups %xmm0, (%rdx)1423; SSE2-NEXT:    movups %xmm9, 16(%rcx)1424; SSE2-NEXT:    movups %xmm5, (%rcx)1425; SSE2-NEXT:    retq1426;1427; SSE42-LABEL: interleave_24i32_out:1428; SSE42:       # %bb.0:1429; SSE42-NEXT:    movups 80(%rdi), %xmm01430; SSE42-NEXT:    movdqu 64(%rdi), %xmm11431; SSE42-NEXT:    movdqu (%rdi), %xmm41432; SSE42-NEXT:    movdqu 16(%rdi), %xmm21433; SSE42-NEXT:    movups 32(%rdi), %xmm31434; SSE42-NEXT:    movdqu 48(%rdi), %xmm51435; SSE42-NEXT:    movdqa %xmm2, %xmm61436; SSE42-NEXT:    pblendw {{.*#+}} xmm6 = xmm6[0,1],xmm4[2,3],xmm6[4,5,6,7]1437; SSE42-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[2,3,2,3]1438; SSE42-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,3],xmm2[2,3]1439; SSE42-NEXT:    insertps {{.*#+}} xmm4 = xmm4[0,1,2],xmm3[1]1440; SSE42-NEXT:    movdqa %xmm1, %xmm81441; SSE42-NEXT:    pblendw {{.*#+}} xmm8 = xmm8[0,1],xmm5[2,3],xmm8[4,5,6,7]1442; SSE42-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[2,3,2,3]1443; SSE42-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,3],xmm1[2,3]1444; SSE42-NEXT:    insertps {{.*#+}} xmm5 = xmm5[0,1,2],xmm0[1]1445; SSE42-NEXT:    pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm3[4,5],xmm6[6,7]1446; SSE42-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,0,3,2]1447; SSE42-NEXT:    pblendw {{.*#+}} xmm8 = xmm8[0,1,2,3],xmm0[4,5],xmm8[6,7]1448; SSE42-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,0,3,2]1449; SSE42-NEXT:    pblendw {{.*#+}} xmm7 = xmm7[0,1],xmm2[2,3],xmm7[4,5,6,7]1450; SSE42-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,1],xmm3[0,3]1451; SSE42-NEXT:    pblendw {{.*#+}} xmm9 = xmm9[0,1],xmm1[2,3],xmm9[4,5,6,7]1452; SSE42-NEXT:    shufps {{.*#+}} xmm9 = xmm9[0,1],xmm0[0,3]1453; SSE42-NEXT:    movups %xmm5, 16(%rsi)1454; SSE42-NEXT:    movups %xmm4, (%rsi)1455; SSE42-NEXT:    movdqu %xmm8, 16(%rdx)1456; SSE42-NEXT:    movdqu %xmm6, (%rdx)1457; SSE42-NEXT:    movups %xmm9, 16(%rcx)1458; SSE42-NEXT:    movups %xmm7, (%rcx)1459; SSE42-NEXT:    retq1460;1461; AVX1-LABEL: interleave_24i32_out:1462; AVX1:       # %bb.0:1463; AVX1-NEXT:    vmovups 64(%rdi), %ymm01464; AVX1-NEXT:    vmovups 32(%rdi), %ymm11465; AVX1-NEXT:    vmovups (%rdi), %ymm21466; AVX1-NEXT:    vblendps {{.*#+}} ymm3 = ymm2[0],ymm1[1],ymm2[2,3],ymm1[4],ymm2[5,6],ymm1[7]1467; AVX1-NEXT:    vmovups 16(%rdi), %xmm41468; AVX1-NEXT:    vshufps {{.*#+}} ymm4 = ymm4[2,1],ymm1[1,3],ymm4[6,5],ymm1[5,7]1469; AVX1-NEXT:    vshufps {{.*#+}} ymm3 = ymm3[0,3],ymm4[0,2],ymm3[4,7],ymm4[4,6]1470; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm4 = ymm0[2,3,0,1]1471; AVX1-NEXT:    vshufps {{.*#+}} ymm5 = ymm0[1,0],ymm4[2,0],ymm0[5,4],ymm4[6,4]1472; AVX1-NEXT:    vshufps {{.*#+}} ymm5 = ymm5[0,1,2,0,4,5,6,4]1473; AVX1-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4,5],ymm5[6,7]1474; AVX1-NEXT:    vshufps {{.*#+}} ymm5 = ymm0[2,0],ymm4[3,0],ymm0[6,4],ymm4[7,4]1475; AVX1-NEXT:    vshufps {{.*#+}} ymm5 = ymm4[0,0],ymm5[2,0],ymm4[4,4],ymm5[6,4]1476; AVX1-NEXT:    vmovups 16(%rdi), %xmm61477; AVX1-NEXT:    vblendps {{.*#+}} ymm7 = ymm2[0,1],ymm1[2],ymm2[3,4],ymm1[5],ymm2[6,7]1478; AVX1-NEXT:    vshufps {{.*#+}} ymm7 = ymm7[1,2],ymm6[0,3],ymm7[5,6],ymm6[4,7]1479; AVX1-NEXT:    vshufps {{.*#+}} ymm7 = ymm7[0,2,3,1,4,6,7,5]1480; AVX1-NEXT:    vblendps {{.*#+}} ymm5 = ymm7[0,1,2,3,4],ymm5[5,6,7]1481; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm1[0,1],ymm2[2],ymm1[3,4],ymm2[5],ymm1[6,7]1482; AVX1-NEXT:    vshufps {{.*#+}} ymm2 = ymm6[1,0],ymm2[2,0],ymm6[5,4],ymm2[6,4]1483; AVX1-NEXT:    vshufps {{.*#+}} ymm1 = ymm2[2,0],ymm1[0,3],ymm2[6,4],ymm1[4,7]1484; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm4[0,1],ymm0[0,3],ymm4[4,5],ymm0[4,7]1485; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3,4],ymm0[5,6,7]1486; AVX1-NEXT:    vmovups %ymm3, (%rsi)1487; AVX1-NEXT:    vmovups %ymm5, (%rdx)1488; AVX1-NEXT:    vmovups %ymm0, (%rcx)1489; AVX1-NEXT:    vzeroupper1490; AVX1-NEXT:    retq1491;1492; AVX2-SLOW-LABEL: interleave_24i32_out:1493; AVX2-SLOW:       # %bb.0:1494; AVX2-SLOW-NEXT:    vmovups (%rdi), %ymm01495; AVX2-SLOW-NEXT:    vmovups 32(%rdi), %ymm11496; AVX2-SLOW-NEXT:    vmovups 64(%rdi), %ymm21497; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm3 = ymm0[0],ymm1[1],ymm0[2,3],ymm1[4],ymm0[5,6],ymm1[7]1498; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1],ymm2[2],ymm3[3,4],ymm2[5],ymm3[6,7]1499; AVX2-SLOW-NEXT:    vmovaps {{.*#+}} ymm4 = [0,3,6,1,4,7,2,5]1500; AVX2-SLOW-NEXT:    vpermps %ymm3, %ymm4, %ymm31501; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm4 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]1502; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm4 = ymm2[0],ymm4[1,2],ymm2[3],ymm4[4,5],ymm2[6],ymm4[7]1503; AVX2-SLOW-NEXT:    vmovaps {{.*#+}} ymm5 = [1,4,7,2,5,0,3,6]1504; AVX2-SLOW-NEXT:    vpermps %ymm4, %ymm5, %ymm41505; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3,4],ymm0[5],ymm1[6,7]1506; AVX2-SLOW-NEXT:    vmovaps {{.*#+}} ymm1 = [2,5,0,3,6,u,u,u]1507; AVX2-SLOW-NEXT:    vpermps %ymm0, %ymm1, %ymm01508; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm1 = ymm2[0,1,0,3,4,5,4,7]1509; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,1,0,3]1510; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm1[5,6,7]1511; AVX2-SLOW-NEXT:    vmovups %ymm3, (%rsi)1512; AVX2-SLOW-NEXT:    vmovups %ymm4, (%rdx)1513; AVX2-SLOW-NEXT:    vmovups %ymm0, (%rcx)1514; AVX2-SLOW-NEXT:    vzeroupper1515; AVX2-SLOW-NEXT:    retq1516;1517; AVX2-FAST-ALL-LABEL: interleave_24i32_out:1518; AVX2-FAST-ALL:       # %bb.0:1519; AVX2-FAST-ALL-NEXT:    vmovups (%rdi), %ymm01520; AVX2-FAST-ALL-NEXT:    vmovups 32(%rdi), %ymm11521; AVX2-FAST-ALL-NEXT:    vmovups 64(%rdi), %ymm21522; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm3 = ymm0[0],ymm1[1],ymm0[2,3],ymm1[4],ymm0[5,6],ymm1[7]1523; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1],ymm2[2],ymm3[3,4],ymm2[5],ymm3[6,7]1524; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} ymm4 = [0,3,6,1,4,7,2,5]1525; AVX2-FAST-ALL-NEXT:    vpermps %ymm3, %ymm4, %ymm31526; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm4 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]1527; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm4 = ymm2[0],ymm4[1,2],ymm2[3],ymm4[4,5],ymm2[6],ymm4[7]1528; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} ymm5 = [1,4,7,2,5,0,3,6]1529; AVX2-FAST-ALL-NEXT:    vpermps %ymm4, %ymm5, %ymm41530; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3,4],ymm0[5],ymm1[6,7]1531; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm2[1],ymm0[2,3],ymm2[4],ymm0[5,6],ymm2[7]1532; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} ymm1 = [2,5,0,3,6,1,4,7]1533; AVX2-FAST-ALL-NEXT:    vpermps %ymm0, %ymm1, %ymm01534; AVX2-FAST-ALL-NEXT:    vmovups %ymm3, (%rsi)1535; AVX2-FAST-ALL-NEXT:    vmovups %ymm4, (%rdx)1536; AVX2-FAST-ALL-NEXT:    vmovups %ymm0, (%rcx)1537; AVX2-FAST-ALL-NEXT:    vzeroupper1538; AVX2-FAST-ALL-NEXT:    retq1539;1540; AVX2-FAST-PERLANE-LABEL: interleave_24i32_out:1541; AVX2-FAST-PERLANE:       # %bb.0:1542; AVX2-FAST-PERLANE-NEXT:    vmovups (%rdi), %ymm01543; AVX2-FAST-PERLANE-NEXT:    vmovups 32(%rdi), %ymm11544; AVX2-FAST-PERLANE-NEXT:    vmovups 64(%rdi), %ymm21545; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm3 = ymm0[0],ymm1[1],ymm0[2,3],ymm1[4],ymm0[5,6],ymm1[7]1546; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1],ymm2[2],ymm3[3,4],ymm2[5],ymm3[6,7]1547; AVX2-FAST-PERLANE-NEXT:    vmovaps {{.*#+}} ymm4 = [0,3,6,1,4,7,2,5]1548; AVX2-FAST-PERLANE-NEXT:    vpermps %ymm3, %ymm4, %ymm31549; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm4 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]1550; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm4 = ymm2[0],ymm4[1,2],ymm2[3],ymm4[4,5],ymm2[6],ymm4[7]1551; AVX2-FAST-PERLANE-NEXT:    vmovaps {{.*#+}} ymm5 = [1,4,7,2,5,0,3,6]1552; AVX2-FAST-PERLANE-NEXT:    vpermps %ymm4, %ymm5, %ymm41553; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3,4],ymm0[5],ymm1[6,7]1554; AVX2-FAST-PERLANE-NEXT:    vmovaps {{.*#+}} ymm1 = [2,5,0,3,6,u,u,u]1555; AVX2-FAST-PERLANE-NEXT:    vpermps %ymm0, %ymm1, %ymm01556; AVX2-FAST-PERLANE-NEXT:    vshufps {{.*#+}} ymm1 = ymm2[0,1,0,3,4,5,4,7]1557; AVX2-FAST-PERLANE-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,1,0,3]1558; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm1[5,6,7]1559; AVX2-FAST-PERLANE-NEXT:    vmovups %ymm3, (%rsi)1560; AVX2-FAST-PERLANE-NEXT:    vmovups %ymm4, (%rdx)1561; AVX2-FAST-PERLANE-NEXT:    vmovups %ymm0, (%rcx)1562; AVX2-FAST-PERLANE-NEXT:    vzeroupper1563; AVX2-FAST-PERLANE-NEXT:    retq1564;1565; XOP-LABEL: interleave_24i32_out:1566; XOP:       # %bb.0:1567; XOP-NEXT:    vmovups 64(%rdi), %ymm01568; XOP-NEXT:    vmovups 32(%rdi), %ymm11569; XOP-NEXT:    vmovups (%rdi), %ymm21570; XOP-NEXT:    vblendps {{.*#+}} ymm3 = ymm2[0],ymm1[1],ymm2[2,3],ymm1[4],ymm2[5,6],ymm1[7]1571; XOP-NEXT:    vmovups 16(%rdi), %xmm41572; XOP-NEXT:    vshufps {{.*#+}} ymm4 = ymm4[2,1],ymm1[1,3],ymm4[6,5],ymm1[5,7]1573; XOP-NEXT:    vshufps {{.*#+}} ymm3 = ymm3[0,3],ymm4[0,2],ymm3[4,7],ymm4[4,6]1574; XOP-NEXT:    vperm2f128 {{.*#+}} ymm4 = ymm0[2,3,0,1]1575; XOP-NEXT:    vshufps {{.*#+}} ymm5 = ymm0[1,0],ymm4[2,0],ymm0[5,4],ymm4[6,4]1576; XOP-NEXT:    vshufps {{.*#+}} ymm5 = ymm5[0,1,2,0,4,5,6,4]1577; XOP-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4,5],ymm5[6,7]1578; XOP-NEXT:    vshufps {{.*#+}} ymm5 = ymm0[2,0],ymm4[3,0],ymm0[6,4],ymm4[7,4]1579; XOP-NEXT:    vshufps {{.*#+}} ymm5 = ymm4[0,0],ymm5[2,0],ymm4[4,4],ymm5[6,4]1580; XOP-NEXT:    vmovups 16(%rdi), %xmm61581; XOP-NEXT:    vblendps {{.*#+}} ymm7 = ymm2[0,1],ymm1[2],ymm2[3,4],ymm1[5],ymm2[6,7]1582; XOP-NEXT:    vshufps {{.*#+}} ymm7 = ymm7[1,2],ymm6[0,3],ymm7[5,6],ymm6[4,7]1583; XOP-NEXT:    vshufps {{.*#+}} ymm7 = ymm7[0,2,3,1,4,6,7,5]1584; XOP-NEXT:    vblendps {{.*#+}} ymm5 = ymm7[0,1,2,3,4],ymm5[5,6,7]1585; XOP-NEXT:    vblendps {{.*#+}} ymm2 = ymm1[0,1],ymm2[2],ymm1[3,4],ymm2[5],ymm1[6,7]1586; XOP-NEXT:    vshufps {{.*#+}} ymm2 = ymm6[1,0],ymm2[2,0],ymm6[5,4],ymm2[6,4]1587; XOP-NEXT:    vshufps {{.*#+}} ymm1 = ymm2[2,0],ymm1[0,3],ymm2[6,4],ymm1[4,7]1588; XOP-NEXT:    vshufps {{.*#+}} ymm0 = ymm4[0,1],ymm0[0,3],ymm4[4,5],ymm0[4,7]1589; XOP-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3,4],ymm0[5,6,7]1590; XOP-NEXT:    vmovups %ymm3, (%rsi)1591; XOP-NEXT:    vmovups %ymm5, (%rdx)1592; XOP-NEXT:    vmovups %ymm0, (%rcx)1593; XOP-NEXT:    vzeroupper1594; XOP-NEXT:    retq1595  %wide.vec = load <24 x i32>, ptr %p, align 41596  %s1 = shufflevector <24 x i32> %wide.vec, <24 x i32> undef, <8 x i32> <i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21>1597  %s2 = shufflevector <24 x i32> %wide.vec, <24 x i32> undef, <8 x i32> <i32 1, i32 4, i32 7, i32 10, i32 13, i32 16, i32 19, i32 22>1598  %s3 = shufflevector <24 x i32> %wide.vec, <24 x i32> undef, <8 x i32> <i32 2, i32 5, i32 8, i32 11, i32 14, i32 17, i32 20, i32 23>1599  store <8 x i32> %s1, ptr %q1, align 41600  store <8 x i32> %s2, ptr %q2, align 41601  store <8 x i32> %s3, ptr %q3, align 41602  ret void1603}1604 1605define void @interleave_24i32_in(ptr %p, ptr %q1, ptr %q2, ptr %q3) nounwind {1606; SSE2-LABEL: interleave_24i32_in:1607; SSE2:       # %bb.0:1608; SSE2-NEXT:    movups (%rsi), %xmm11609; SSE2-NEXT:    movups 16(%rsi), %xmm01610; SSE2-NEXT:    movups (%rdx), %xmm31611; SSE2-NEXT:    movups 16(%rdx), %xmm51612; SSE2-NEXT:    movups (%rcx), %xmm41613; SSE2-NEXT:    movups 16(%rcx), %xmm71614; SSE2-NEXT:    movaps %xmm4, %xmm61615; SSE2-NEXT:    shufps {{.*#+}} xmm6 = xmm6[0,1],xmm1[1,3]1616; SSE2-NEXT:    movaps %xmm1, %xmm21617; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]1618; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm6[0,2]1619; SSE2-NEXT:    movaps %xmm0, %xmm81620; SSE2-NEXT:    unpckhpd {{.*#+}} xmm8 = xmm8[1],xmm5[1]1621; SSE2-NEXT:    movaps %xmm7, %xmm91622; SSE2-NEXT:    shufps {{.*#+}} xmm9 = xmm9[0,1],xmm0[1,3]1623; SSE2-NEXT:    movaps %xmm0, %xmm61624; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3],xmm5[3,3]1625; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2],xmm7[2,3]1626; SSE2-NEXT:    shufps {{.*#+}} xmm7 = xmm7[1,1],xmm5[1,1]1627; SSE2-NEXT:    shufps {{.*#+}} xmm7 = xmm7[2,0],xmm8[0,2]1628; SSE2-NEXT:    unpcklps {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1]1629; SSE2-NEXT:    shufps {{.*#+}} xmm6 = xmm6[0,1],xmm9[0,2]1630; SSE2-NEXT:    movaps %xmm1, %xmm51631; SSE2-NEXT:    unpckhpd {{.*#+}} xmm5 = xmm5[1],xmm3[1]1632; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,3],xmm3[3,3]1633; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,2],xmm4[2,3]1634; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[1,1],xmm3[1,1]1635; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[2,0],xmm5[0,2]1636; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0,1,3]1637; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0,1,3]1638; SSE2-NEXT:    movups %xmm4, 16(%rdi)1639; SSE2-NEXT:    movups %xmm6, 48(%rdi)1640; SSE2-NEXT:    movups %xmm7, 64(%rdi)1641; SSE2-NEXT:    movups %xmm2, (%rdi)1642; SSE2-NEXT:    movups %xmm1, 32(%rdi)1643; SSE2-NEXT:    movups %xmm0, 80(%rdi)1644; SSE2-NEXT:    retq1645;1646; SSE42-LABEL: interleave_24i32_in:1647; SSE42:       # %bb.0:1648; SSE42-NEXT:    movdqu (%rsi), %xmm01649; SSE42-NEXT:    movdqu 16(%rsi), %xmm21650; SSE42-NEXT:    movdqu (%rdx), %xmm31651; SSE42-NEXT:    movdqu 16(%rdx), %xmm41652; SSE42-NEXT:    movdqu (%rcx), %xmm51653; SSE42-NEXT:    movdqu 16(%rcx), %xmm61654; SSE42-NEXT:    movdqa %xmm0, %xmm11655; SSE42-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]1656; SSE42-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[0,1,2,2]1657; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[0,1,0,1]1658; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm7[0,1,2,3],xmm1[4,5],xmm7[6,7]1659; SSE42-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,1,2,2]1660; SSE42-NEXT:    pblendw {{.*#+}} xmm7 = xmm7[0,1,2,3],xmm2[4,5],xmm7[6,7]1661; SSE42-NEXT:    pblendw {{.*#+}} xmm7 = xmm7[0,1],xmm6[2,3],xmm7[4,5,6,7]1662; SSE42-NEXT:    movdqa %xmm2, %xmm81663; SSE42-NEXT:    punpckldq {{.*#+}} xmm8 = xmm8[0],xmm4[0],xmm8[1],xmm4[1]1664; SSE42-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[0,1,2,2]1665; SSE42-NEXT:    pshufd {{.*#+}} xmm9 = xmm6[0,1,0,1]1666; SSE42-NEXT:    pblendw {{.*#+}} xmm9 = xmm8[0,1,2,3],xmm9[4,5],xmm8[6,7]1667; SSE42-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[1,1,2,2]1668; SSE42-NEXT:    pblendw {{.*#+}} xmm8 = xmm8[0,1,2,3],xmm0[4,5],xmm8[6,7]1669; SSE42-NEXT:    pblendw {{.*#+}} xmm8 = xmm8[0,1],xmm5[2,3],xmm8[4,5,6,7]1670; SSE42-NEXT:    shufps {{.*#+}} xmm2 = xmm2[3,3],xmm4[3,3]1671; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[2,3,2,3]1672; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm2[2,3,4,5],xmm4[6,7]1673; SSE42-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3],xmm3[3,3]1674; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[2,3,2,3]1675; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,3,4,5],xmm2[6,7]1676; SSE42-NEXT:    movdqu %xmm2, 32(%rdi)1677; SSE42-NEXT:    movdqu %xmm4, 80(%rdi)1678; SSE42-NEXT:    movdqu %xmm8, 16(%rdi)1679; SSE42-NEXT:    movdqu %xmm9, 48(%rdi)1680; SSE42-NEXT:    movdqu %xmm7, 64(%rdi)1681; SSE42-NEXT:    movdqu %xmm1, (%rdi)1682; SSE42-NEXT:    retq1683;1684; AVX1-LABEL: interleave_24i32_in:1685; AVX1:       # %bb.0:1686; AVX1-NEXT:    vmovups (%rdx), %xmm01687; AVX1-NEXT:    vmovups 16(%rdx), %xmm11688; AVX1-NEXT:    vmovups (%rsi), %xmm21689; AVX1-NEXT:    vmovups 16(%rsi), %xmm31690; AVX1-NEXT:    vshufps {{.*#+}} xmm4 = xmm3[3,3],xmm1[3,3]1691; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[1,1,2,2]1692; AVX1-NEXT:    vblendps {{.*#+}} xmm1 = xmm1[0,1],xmm3[2],xmm1[3]1693; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm11694; AVX1-NEXT:    vbroadcastf128 {{.*#+}} ymm3 = mem[0,1,0,1]1695; AVX1-NEXT:    vshufpd {{.*#+}} ymm3 = ymm3[0,0,3,3]1696; AVX1-NEXT:    vblendps {{.*#+}} ymm1 = ymm1[0],ymm3[1],ymm1[2,3],ymm3[4],ymm1[5,6],ymm3[7]1697; AVX1-NEXT:    vshufps {{.*#+}} xmm3 = xmm0[1,1,2,2]1698; AVX1-NEXT:    vblendps {{.*#+}} xmm3 = xmm3[0,1],xmm2[2],xmm3[3]1699; AVX1-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]1700; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1,2,2]1701; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm01702; AVX1-NEXT:    vbroadcastsd (%rcx), %ymm21703; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm2[2],ymm0[3,4],ymm2[5],ymm0[6,7]1704; AVX1-NEXT:    vpermilps {{.*#+}} ymm2 = mem[0,0,3,3,4,4,7,7]1705; AVX1-NEXT:    vpermilpd {{.*#+}} ymm3 = mem[1,0,2,2]1706; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm3[0,1],ymm2[2],ymm3[3,4],ymm2[5],ymm3[6,7]1707; AVX1-NEXT:    vpermilpd {{.*#+}} ymm3 = mem[1,1,2,2]1708; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm3[0],ymm2[1,2],ymm3[3],ymm2[4,5],ymm3[6],ymm2[7]1709; AVX1-NEXT:    vmovups %ymm2, 32(%rdi)1710; AVX1-NEXT:    vmovups %ymm0, (%rdi)1711; AVX1-NEXT:    vmovups %ymm1, 64(%rdi)1712; AVX1-NEXT:    vzeroupper1713; AVX1-NEXT:    retq1714;1715; AVX2-SLOW-LABEL: interleave_24i32_in:1716; AVX2-SLOW:       # %bb.0:1717; AVX2-SLOW-NEXT:    vmovups (%rsi), %ymm01718; AVX2-SLOW-NEXT:    vmovups (%rdx), %ymm11719; AVX2-SLOW-NEXT:    vmovups (%rcx), %ymm21720; AVX2-SLOW-NEXT:    vbroadcastsd 24(%rsi), %ymm31721; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm4 = ymm1[1,2,3,3,5,6,7,7]1722; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm4 = ymm4[2,2,2,3]1723; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm3 = ymm4[0,1],ymm3[2],ymm4[3,4],ymm3[5],ymm4[6,7]1724; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm4 = ymm2[2,1,3,3]1725; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0],ymm4[1],ymm3[2,3],ymm4[4],ymm3[5,6],ymm4[7]1726; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm4 = mem[1,0,2,2]1727; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm4 = ymm4[0,1,0,1]1728; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm5 = ymm0[0,0,2,1]1729; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm4 = ymm5[0],ymm4[1],ymm5[2,3],ymm4[4],ymm5[5,6],ymm4[7]1730; AVX2-SLOW-NEXT:    vbroadcastsd (%rcx), %ymm51731; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm4 = ymm4[0,1],ymm5[2],ymm4[3,4],ymm5[5],ymm4[6,7]1732; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm1 = ymm1[0,0,3,3,4,4,7,7]1733; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,1,2,2]1734; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]1735; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm1 = ymm2[1,1,2,2]1736; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1,2],ymm1[3],ymm0[4,5],ymm1[6],ymm0[7]1737; AVX2-SLOW-NEXT:    vmovups %ymm0, 32(%rdi)1738; AVX2-SLOW-NEXT:    vmovups %ymm4, (%rdi)1739; AVX2-SLOW-NEXT:    vmovups %ymm3, 64(%rdi)1740; AVX2-SLOW-NEXT:    vzeroupper1741; AVX2-SLOW-NEXT:    retq1742;1743; AVX2-FAST-ALL-LABEL: interleave_24i32_in:1744; AVX2-FAST-ALL:       # %bb.0:1745; AVX2-FAST-ALL-NEXT:    vmovups (%rsi), %ymm01746; AVX2-FAST-ALL-NEXT:    vmovups (%rdx), %ymm11747; AVX2-FAST-ALL-NEXT:    vmovups (%rcx), %ymm21748; AVX2-FAST-ALL-NEXT:    vbroadcastf128 {{.*#+}} ymm3 = [5,0,7,6,5,0,7,6]1749; AVX2-FAST-ALL-NEXT:    # ymm3 = mem[0,1,0,1]1750; AVX2-FAST-ALL-NEXT:    vpermps %ymm1, %ymm3, %ymm31751; AVX2-FAST-ALL-NEXT:    vbroadcastsd 24(%rsi), %ymm41752; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1],ymm4[2],ymm3[3,4],ymm4[5],ymm3[6,7]1753; AVX2-FAST-ALL-NEXT:    vpermpd {{.*#+}} ymm4 = ymm2[2,1,3,3]1754; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0],ymm4[1],ymm3[2,3],ymm4[4],ymm3[5,6],ymm4[7]1755; AVX2-FAST-ALL-NEXT:    vbroadcastf128 {{.*#+}} ymm4 = [1,0,2,2,1,0,2,2]1756; AVX2-FAST-ALL-NEXT:    # ymm4 = mem[0,1,0,1]1757; AVX2-FAST-ALL-NEXT:    vpermps %ymm1, %ymm4, %ymm41758; AVX2-FAST-ALL-NEXT:    vpermpd {{.*#+}} ymm5 = ymm0[0,0,2,1]1759; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm4 = ymm5[0],ymm4[1],ymm5[2,3],ymm4[4],ymm5[5,6],ymm4[7]1760; AVX2-FAST-ALL-NEXT:    vbroadcastsd (%rcx), %ymm51761; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm4 = ymm4[0,1],ymm5[2],ymm4[3,4],ymm5[5],ymm4[6,7]1762; AVX2-FAST-ALL-NEXT:    vshufps {{.*#+}} ymm1 = ymm1[0,0,3,3,4,4,7,7]1763; AVX2-FAST-ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,1,2,2]1764; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]1765; AVX2-FAST-ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm2[1,1,2,2]1766; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1,2],ymm1[3],ymm0[4,5],ymm1[6],ymm0[7]1767; AVX2-FAST-ALL-NEXT:    vmovups %ymm0, 32(%rdi)1768; AVX2-FAST-ALL-NEXT:    vmovups %ymm4, (%rdi)1769; AVX2-FAST-ALL-NEXT:    vmovups %ymm3, 64(%rdi)1770; AVX2-FAST-ALL-NEXT:    vzeroupper1771; AVX2-FAST-ALL-NEXT:    retq1772;1773; AVX2-FAST-PERLANE-LABEL: interleave_24i32_in:1774; AVX2-FAST-PERLANE:       # %bb.0:1775; AVX2-FAST-PERLANE-NEXT:    vmovups (%rsi), %ymm01776; AVX2-FAST-PERLANE-NEXT:    vmovups (%rdx), %ymm11777; AVX2-FAST-PERLANE-NEXT:    vmovups (%rcx), %ymm21778; AVX2-FAST-PERLANE-NEXT:    vbroadcastsd 24(%rsi), %ymm31779; AVX2-FAST-PERLANE-NEXT:    vshufps {{.*#+}} ymm4 = ymm1[1,2,3,3,5,6,7,7]1780; AVX2-FAST-PERLANE-NEXT:    vpermpd {{.*#+}} ymm4 = ymm4[2,2,2,3]1781; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm3 = ymm4[0,1],ymm3[2],ymm4[3,4],ymm3[5],ymm4[6,7]1782; AVX2-FAST-PERLANE-NEXT:    vpermpd {{.*#+}} ymm4 = ymm2[2,1,3,3]1783; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0],ymm4[1],ymm3[2,3],ymm4[4],ymm3[5,6],ymm4[7]1784; AVX2-FAST-PERLANE-NEXT:    vpermilps {{.*#+}} xmm4 = mem[1,0,2,2]1785; AVX2-FAST-PERLANE-NEXT:    vpermpd {{.*#+}} ymm4 = ymm4[0,1,0,1]1786; AVX2-FAST-PERLANE-NEXT:    vpermpd {{.*#+}} ymm5 = ymm0[0,0,2,1]1787; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm4 = ymm5[0],ymm4[1],ymm5[2,3],ymm4[4],ymm5[5,6],ymm4[7]1788; AVX2-FAST-PERLANE-NEXT:    vbroadcastsd (%rcx), %ymm51789; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm4 = ymm4[0,1],ymm5[2],ymm4[3,4],ymm5[5],ymm4[6,7]1790; AVX2-FAST-PERLANE-NEXT:    vshufps {{.*#+}} ymm1 = ymm1[0,0,3,3,4,4,7,7]1791; AVX2-FAST-PERLANE-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,1,2,2]1792; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]1793; AVX2-FAST-PERLANE-NEXT:    vpermpd {{.*#+}} ymm1 = ymm2[1,1,2,2]1794; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1,2],ymm1[3],ymm0[4,5],ymm1[6],ymm0[7]1795; AVX2-FAST-PERLANE-NEXT:    vmovups %ymm0, 32(%rdi)1796; AVX2-FAST-PERLANE-NEXT:    vmovups %ymm4, (%rdi)1797; AVX2-FAST-PERLANE-NEXT:    vmovups %ymm3, 64(%rdi)1798; AVX2-FAST-PERLANE-NEXT:    vzeroupper1799; AVX2-FAST-PERLANE-NEXT:    retq1800;1801; XOP-LABEL: interleave_24i32_in:1802; XOP:       # %bb.0:1803; XOP-NEXT:    vmovups (%rsi), %ymm01804; XOP-NEXT:    vmovups (%rdx), %ymm11805; XOP-NEXT:    vpermil2ps {{.*#+}} ymm0 = ymm0[u,3],ymm1[3],ymm0[u,4],ymm1[4],ymm0[u,5]1806; XOP-NEXT:    vmovups (%rdx), %xmm11807; XOP-NEXT:    vmovups 16(%rdx), %xmm21808; XOP-NEXT:    vmovups (%rsi), %xmm31809; XOP-NEXT:    vmovups 16(%rsi), %xmm41810; XOP-NEXT:    vshufps {{.*#+}} xmm5 = xmm4[3,3],xmm2[3,3]1811; XOP-NEXT:    vshufps {{.*#+}} xmm2 = xmm2[1,1,2,2]1812; XOP-NEXT:    vblendps {{.*#+}} xmm2 = xmm2[0,1],xmm4[2],xmm2[3]1813; XOP-NEXT:    vinsertf128 $1, %xmm5, %ymm2, %ymm21814; XOP-NEXT:    vbroadcastf128 {{.*#+}} ymm4 = mem[0,1,0,1]1815; XOP-NEXT:    vshufpd {{.*#+}} ymm4 = ymm4[0,0,3,3]1816; XOP-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0],ymm4[1],ymm2[2,3],ymm4[4],ymm2[5,6],ymm4[7]1817; XOP-NEXT:    vshufps {{.*#+}} xmm4 = xmm1[1,1,2,2]1818; XOP-NEXT:    vblendps {{.*#+}} xmm4 = xmm4[0,1],xmm3[2],xmm4[3]1819; XOP-NEXT:    vunpcklps {{.*#+}} xmm1 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]1820; XOP-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,1,2,2]1821; XOP-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm11822; XOP-NEXT:    vbroadcastsd (%rcx), %ymm31823; XOP-NEXT:    vblendps {{.*#+}} ymm1 = ymm1[0,1],ymm3[2],ymm1[3,4],ymm3[5],ymm1[6,7]1824; XOP-NEXT:    vpermilpd {{.*#+}} ymm3 = mem[1,1,2,2]1825; XOP-NEXT:    vblendps {{.*#+}} ymm0 = ymm3[0],ymm0[1,2],ymm3[3],ymm0[4,5],ymm3[6],ymm0[7]1826; XOP-NEXT:    vmovups %ymm0, 32(%rdi)1827; XOP-NEXT:    vmovups %ymm1, (%rdi)1828; XOP-NEXT:    vmovups %ymm2, 64(%rdi)1829; XOP-NEXT:    vzeroupper1830; XOP-NEXT:    retq1831  %s1 = load <8 x i32>, ptr %q1, align 41832  %s2 = load <8 x i32>, ptr %q2, align 41833  %s3 = load <8 x i32>, ptr %q3, align 41834  %t1 = shufflevector <8 x i32> %s1, <8 x i32> %s2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>1835  %t2 = shufflevector <8 x i32> %s3, <8 x i32> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1836  %interleaved = shufflevector <16 x i32> %t1, <16 x i32> %t2, <24 x i32> <i32 0, i32 8, i32 16, i32 1, i32 9, i32 17, i32 2, i32 10, i32 18, i32 3, i32 11, i32 19, i32 4, i32 12, i32 20, i32 5, i32 13, i32 21, i32 6, i32 14, i32 22, i32 7, i32 15, i32 23>1837  store <24 x i32> %interleaved, ptr %p, align 41838  ret void1839}1840 1841; Repeat each element x 3 of <16 x i8> a0 + a1 to create a <96 x i8>.1842define void @splat3_128(<16 x i8> %a0, <16 x i8> %a1, ptr%a2) {1843; SSE2-LABEL: splat3_128:1844; SSE2:       # %bb.0:1845; SSE2-NEXT:    pxor %xmm4, %xmm41846; SSE2-NEXT:    movdqa %xmm0, %xmm31847; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]1848; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm3[2,3,3,3,4,5,6,7]1849; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm2[0,1,2,3,4,4,4,5]1850; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,1,0,1]1851; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,1,4,5,6,7]1852; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,6]1853; SSE2-NEXT:    packuswb %xmm5, %xmm21854; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm4[8],xmm0[9],xmm4[9],xmm0[10],xmm4[10],xmm0[11],xmm4[11],xmm0[12],xmm4[12],xmm0[13],xmm4[13],xmm0[14],xmm4[14],xmm0[15],xmm4[15]1855; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,1,0,1]1856; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[0,0,0,1,4,5,6,7]1857; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,5,6,6]1858; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]1859; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[1,1,2,2,4,5,6,7]1860; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,6,7,7,7]1861; SSE2-NEXT:    packuswb %xmm5, %xmm31862; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm0[2,3,3,3,4,5,6,7]1863; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,4,4,5]1864; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1865; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,2,2,4,5,6,7]1866; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,7,7]1867; SSE2-NEXT:    packuswb %xmm0, %xmm51868; SSE2-NEXT:    movdqa %xmm1, %xmm01869; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]1870; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm0[2,3,3,3,4,5,6,7]1871; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,4,4,4,5]1872; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[0,1,0,1]1873; SSE2-NEXT:    pshuflw {{.*#+}} xmm7 = xmm7[0,0,0,1,4,5,6,7]1874; SSE2-NEXT:    pshufhw {{.*#+}} xmm7 = xmm7[0,1,2,3,5,5,6,6]1875; SSE2-NEXT:    packuswb %xmm6, %xmm71876; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15]1877; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,1,0,1]1878; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,0,0,1,4,5,6,7]1879; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,5,6,6]1880; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1881; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,2,2,4,5,6,7]1882; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,7,7]1883; SSE2-NEXT:    packuswb %xmm4, %xmm01884; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm1[2,3,3,3,4,5,6,7]1885; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,4,4,5]1886; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1887; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[1,1,2,2,4,5,6,7]1888; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,7,7,7]1889; SSE2-NEXT:    packuswb %xmm1, %xmm41890; SSE2-NEXT:    movdqa %xmm4, 80(%rdi)1891; SSE2-NEXT:    movdqa %xmm0, 64(%rdi)1892; SSE2-NEXT:    movdqa %xmm7, 48(%rdi)1893; SSE2-NEXT:    movdqa %xmm5, 32(%rdi)1894; SSE2-NEXT:    movdqa %xmm3, 16(%rdi)1895; SSE2-NEXT:    movdqa %xmm2, (%rdi)1896; SSE2-NEXT:    retq1897;1898; SSE42-LABEL: splat3_128:1899; SSE42:       # %bb.0:1900; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5]1901; SSE42-NEXT:    movdqa %xmm0, %xmm31902; SSE42-NEXT:    pshufb %xmm2, %xmm31903; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10]1904; SSE42-NEXT:    movdqa %xmm0, %xmm51905; SSE42-NEXT:    pshufb %xmm4, %xmm51906; SSE42-NEXT:    movdqa {{.*#+}} xmm6 = [10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15]1907; SSE42-NEXT:    pshufb %xmm6, %xmm01908; SSE42-NEXT:    movdqa %xmm1, %xmm71909; SSE42-NEXT:    pshufb %xmm2, %xmm71910; SSE42-NEXT:    movdqa %xmm1, %xmm21911; SSE42-NEXT:    pshufb %xmm4, %xmm21912; SSE42-NEXT:    pshufb %xmm6, %xmm11913; SSE42-NEXT:    movdqa %xmm1, 80(%rdi)1914; SSE42-NEXT:    movdqa %xmm2, 64(%rdi)1915; SSE42-NEXT:    movdqa %xmm7, 48(%rdi)1916; SSE42-NEXT:    movdqa %xmm0, 32(%rdi)1917; SSE42-NEXT:    movdqa %xmm5, 16(%rdi)1918; SSE42-NEXT:    movdqa %xmm3, (%rdi)1919; SSE42-NEXT:    retq1920;1921; AVX1-LABEL: splat3_128:1922; AVX1:       # %bb.0:1923; AVX1-NEXT:    vpalignr {{.*#+}} xmm2 = xmm1[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]1924; AVX1-NEXT:    vpalignr {{.*#+}} xmm3 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]1925; AVX1-NEXT:    vpalignr {{.*#+}} xmm4 = xmm1[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]1926; AVX1-NEXT:    vpalignr {{.*#+}} xmm5 = xmm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]1927; AVX1-NEXT:    vpalignr {{.*#+}} xmm6 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4]1928; AVX1-NEXT:    vpalignr {{.*#+}} xmm7 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]1929; AVX1-NEXT:    vpalignr {{.*#+}} xmm3 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm3[0,1,2,3,4]1930; AVX1-NEXT:    vpalignr {{.*#+}} xmm2 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4]1931; AVX1-NEXT:    vpalignr {{.*#+}} xmm5 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4]1932; AVX1-NEXT:    vpalignr {{.*#+}} xmm4 = xmm1[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4]1933; AVX1-NEXT:    vpalignr {{.*#+}} xmm1 = xmm7[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]1934; AVX1-NEXT:    vpalignr {{.*#+}} xmm0 = xmm6[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4]1935; AVX1-NEXT:    vpalignr {{.*#+}} xmm2 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4]1936; AVX1-NEXT:    vpalignr {{.*#+}} xmm3 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4]1937; AVX1-NEXT:    vpalignr {{.*#+}} xmm4 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm7[0,1,2,3,4]1938; AVX1-NEXT:    vpalignr {{.*#+}} xmm5 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm6[0,1,2,3,4]1939; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5]1940; AVX1-NEXT:    vpshufb %xmm6, %xmm3, %xmm31941; AVX1-NEXT:    vpshufb %xmm6, %xmm0, %xmm01942; AVX1-NEXT:    vpshufb %xmm6, %xmm5, %xmm51943; AVX1-NEXT:    vpshufb %xmm6, %xmm1, %xmm11944; AVX1-NEXT:    vpshufb %xmm6, %xmm2, %xmm21945; AVX1-NEXT:    vpshufb %xmm6, %xmm4, %xmm41946; AVX1-NEXT:    vmovdqa %xmm4, 80(%rdi)1947; AVX1-NEXT:    vmovdqa %xmm2, 64(%rdi)1948; AVX1-NEXT:    vmovdqa %xmm1, 48(%rdi)1949; AVX1-NEXT:    vmovdqa %xmm5, 32(%rdi)1950; AVX1-NEXT:    vmovdqa %xmm3, 16(%rdi)1951; AVX1-NEXT:    vmovdqa %xmm0, (%rdi)1952; AVX1-NEXT:    retq1953;1954; AVX2-LABEL: splat3_128:1955; AVX2:       # %bb.0:1956; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm01957; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm01958; AVX2-NEXT:    vpalignr {{.*#+}} ymm1 = ymm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5,22,23,24,25,26,27,28,29,30,31,16,17,18,19,20,21]1959; AVX2-NEXT:    vpalignr {{.*#+}} ymm2 = ymm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10,27,28,29,30,31,16,17,18,19,20,21,22,23,24,25,26]1960; AVX2-NEXT:    vpalignr {{.*#+}} ymm3 = ymm1[5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3,4],ymm1[21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19,20]1961; AVX2-NEXT:    vpalignr {{.*#+}} ymm1 = ymm2[5,6,7,8,9,10,11,12,13,14,15],ymm1[0,1,2,3,4],ymm2[21,22,23,24,25,26,27,28,29,30,31],ymm1[16,17,18,19,20]1962; AVX2-NEXT:    vpalignr {{.*#+}} ymm2 = ymm0[5,6,7,8,9,10,11,12,13,14,15],ymm2[0,1,2,3,4],ymm0[21,22,23,24,25,26,27,28,29,30,31],ymm2[16,17,18,19,20]1963; AVX2-NEXT:    vpalignr {{.*#+}} ymm0 = ymm3[5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3,4],ymm3[21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19,20]1964; AVX2-NEXT:    vpalignr {{.*#+}} ymm1 = ymm1[5,6,7,8,9,10,11,12,13,14,15],ymm2[0,1,2,3,4],ymm1[21,22,23,24,25,26,27,28,29,30,31],ymm2[16,17,18,19,20]1965; AVX2-NEXT:    vpalignr {{.*#+}} ymm2 = ymm2[5,6,7,8,9,10,11,12,13,14,15],ymm3[0,1,2,3,4],ymm2[21,22,23,24,25,26,27,28,29,30,31],ymm3[16,17,18,19,20]1966; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm31967; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm4 = [0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5,0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5]1968; AVX2-NEXT:    # ymm4 = mem[0,1,0,1]1969; AVX2-NEXT:    vpshufb %ymm4, %ymm3, %ymm31970; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]1971; AVX2-NEXT:    vpshufb %ymm4, %ymm0, %ymm01972; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm1 = ymm1[2,3],ymm2[2,3]1973; AVX2-NEXT:    vpshufb %ymm4, %ymm1, %ymm11974; AVX2-NEXT:    vmovdqa %ymm1, 64(%rdi)1975; AVX2-NEXT:    vmovdqa %ymm0, 32(%rdi)1976; AVX2-NEXT:    vmovdqa %ymm3, (%rdi)1977; AVX2-NEXT:    vzeroupper1978; AVX2-NEXT:    retq1979;1980; XOP-LABEL: splat3_128:1981; XOP:       # %bb.0:1982; XOP-NEXT:    vpalignr {{.*#+}} xmm2 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]1983; XOP-NEXT:    vpalignr {{.*#+}} xmm3 = xmm1[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]1984; XOP-NEXT:    vpalignr {{.*#+}} xmm4 = xmm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]1985; XOP-NEXT:    vpalignr {{.*#+}} xmm5 = xmm1[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]1986; XOP-NEXT:    vpalignr {{.*#+}} xmm6 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]1987; XOP-NEXT:    vpalignr {{.*#+}} xmm7 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4]1988; XOP-NEXT:    vpalignr {{.*#+}} xmm3 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm3[0,1,2,3,4]1989; XOP-NEXT:    vpalignr {{.*#+}} xmm2 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4]1990; XOP-NEXT:    vpalignr {{.*#+}} xmm5 = xmm1[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4]1991; XOP-NEXT:    vpalignr {{.*#+}} xmm4 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4]1992; XOP-NEXT:    vmovdqa {{.*#+}} xmm8 = [5,16,11,6,17,12,7,18,13,8,19,14,9,20,15,10]1993; XOP-NEXT:    vpperm %xmm8, %xmm4, %xmm2, %xmm21994; XOP-NEXT:    vpperm %xmm8, %xmm0, %xmm7, %xmm01995; XOP-NEXT:    vpperm %xmm8, %xmm7, %xmm4, %xmm41996; XOP-NEXT:    vpperm %xmm8, %xmm1, %xmm6, %xmm11997; XOP-NEXT:    vpperm %xmm8, %xmm5, %xmm3, %xmm31998; XOP-NEXT:    vpperm %xmm8, %xmm6, %xmm5, %xmm51999; XOP-NEXT:    vmovdqa %xmm5, 80(%rdi)2000; XOP-NEXT:    vmovdqa %xmm3, 64(%rdi)2001; XOP-NEXT:    vmovdqa %xmm1, 48(%rdi)2002; XOP-NEXT:    vmovdqa %xmm4, 32(%rdi)2003; XOP-NEXT:    vmovdqa %xmm2, 16(%rdi)2004; XOP-NEXT:    vmovdqa %xmm0, (%rdi)2005; XOP-NEXT:    retq2006  %1 = shufflevector <16 x i8> %a0, <16 x i8> %a1, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>2007  %2 = shufflevector <16 x i8> %a0, <16 x i8> %a1, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2008  %3 = shufflevector <64 x i8> %1, <64 x i8> %2, <96 x i32> <i32 0, i32 32, i32 64, i32 1, i32 33, i32 65, i32 2, i32 34, i32 66, i32 3, i32 35, i32 67, i32 4, i32 36, i32 68, i32 5, i32 37, i32 69, i32 6, i32 38, i32 70, i32 7, i32 39, i32 71, i32 8, i32 40, i32 72, i32 9, i32 41, i32 73, i32 10, i32 42, i32 74, i32 11, i32 43, i32 75, i32 12, i32 44, i32 76, i32 13, i32 45, i32 77, i32 14, i32 46, i32 78, i32 15, i32 47, i32 79, i32 16, i32 48, i32 80, i32 17, i32 49, i32 81, i32 18, i32 50, i32 82, i32 19, i32 51, i32 83, i32 20, i32 52, i32 84, i32 21, i32 53, i32 85, i32 22, i32 54, i32 86, i32 23, i32 55, i32 87, i32 24, i32 56, i32 88, i32 25, i32 57, i32 89, i32 26, i32 58, i32 90, i32 27, i32 59, i32 91, i32 28, i32 60, i32 92, i32 29, i32 61, i32 93, i32 30, i32 62, i32 94, i32 31, i32 63, i32 95>2009  store <96 x i8> %3, ptr %a22010  ret void2011}2012 2013; Repeat each element x 3 of <32 x i8> a0 to create a <96 x i8>.2014define void @splat3_256(<32 x i8> %a0, ptr%a1) {2015; SSE2-LABEL: splat3_256:2016; SSE2:       # %bb.0:2017; SSE2-NEXT:    pxor %xmm4, %xmm42018; SSE2-NEXT:    movdqa %xmm0, %xmm32019; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]2020; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm3[2,3,3,3,4,5,6,7]2021; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm2[0,1,2,3,4,4,4,5]2022; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,1,0,1]2023; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,1,4,5,6,7]2024; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,6]2025; SSE2-NEXT:    packuswb %xmm5, %xmm22026; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm4[8],xmm0[9],xmm4[9],xmm0[10],xmm4[10],xmm0[11],xmm4[11],xmm0[12],xmm4[12],xmm0[13],xmm4[13],xmm0[14],xmm4[14],xmm0[15],xmm4[15]2027; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,1,0,1]2028; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[0,0,0,1,4,5,6,7]2029; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,5,6,6]2030; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]2031; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[1,1,2,2,4,5,6,7]2032; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,6,7,7,7]2033; SSE2-NEXT:    packuswb %xmm5, %xmm32034; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm0[2,3,3,3,4,5,6,7]2035; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,4,4,5]2036; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]2037; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,2,2,4,5,6,7]2038; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,7,7]2039; SSE2-NEXT:    packuswb %xmm0, %xmm52040; SSE2-NEXT:    movdqa %xmm1, %xmm02041; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]2042; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm0[2,3,3,3,4,5,6,7]2043; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,4,4,4,5]2044; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[0,1,0,1]2045; SSE2-NEXT:    pshuflw {{.*#+}} xmm7 = xmm7[0,0,0,1,4,5,6,7]2046; SSE2-NEXT:    pshufhw {{.*#+}} xmm7 = xmm7[0,1,2,3,5,5,6,6]2047; SSE2-NEXT:    packuswb %xmm6, %xmm72048; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15]2049; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,1,0,1]2050; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,0,0,1,4,5,6,7]2051; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,5,6,6]2052; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]2053; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,2,2,4,5,6,7]2054; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,7,7]2055; SSE2-NEXT:    packuswb %xmm4, %xmm02056; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm1[2,3,3,3,4,5,6,7]2057; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,4,4,5]2058; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]2059; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[1,1,2,2,4,5,6,7]2060; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,7,7,7]2061; SSE2-NEXT:    packuswb %xmm1, %xmm42062; SSE2-NEXT:    movdqa %xmm4, 80(%rdi)2063; SSE2-NEXT:    movdqa %xmm0, 64(%rdi)2064; SSE2-NEXT:    movdqa %xmm7, 48(%rdi)2065; SSE2-NEXT:    movdqa %xmm5, 32(%rdi)2066; SSE2-NEXT:    movdqa %xmm3, 16(%rdi)2067; SSE2-NEXT:    movdqa %xmm2, (%rdi)2068; SSE2-NEXT:    retq2069;2070; SSE42-LABEL: splat3_256:2071; SSE42:       # %bb.0:2072; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5]2073; SSE42-NEXT:    movdqa %xmm0, %xmm32074; SSE42-NEXT:    pshufb %xmm2, %xmm32075; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10]2076; SSE42-NEXT:    movdqa %xmm0, %xmm52077; SSE42-NEXT:    pshufb %xmm4, %xmm52078; SSE42-NEXT:    movdqa {{.*#+}} xmm6 = [10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15]2079; SSE42-NEXT:    pshufb %xmm6, %xmm02080; SSE42-NEXT:    movdqa %xmm1, %xmm72081; SSE42-NEXT:    pshufb %xmm2, %xmm72082; SSE42-NEXT:    movdqa %xmm1, %xmm22083; SSE42-NEXT:    pshufb %xmm4, %xmm22084; SSE42-NEXT:    pshufb %xmm6, %xmm12085; SSE42-NEXT:    movdqa %xmm1, 80(%rdi)2086; SSE42-NEXT:    movdqa %xmm2, 64(%rdi)2087; SSE42-NEXT:    movdqa %xmm7, 48(%rdi)2088; SSE42-NEXT:    movdqa %xmm0, 32(%rdi)2089; SSE42-NEXT:    movdqa %xmm5, 16(%rdi)2090; SSE42-NEXT:    movdqa %xmm3, (%rdi)2091; SSE42-NEXT:    retq2092;2093; AVX1-LABEL: splat3_256:2094; AVX1:       # %bb.0:2095; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm12096; AVX1-NEXT:    vpalignr {{.*#+}} xmm2 = xmm1[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]2097; AVX1-NEXT:    vpalignr {{.*#+}} xmm3 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]2098; AVX1-NEXT:    vpalignr {{.*#+}} xmm4 = xmm1[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]2099; AVX1-NEXT:    vpalignr {{.*#+}} xmm5 = xmm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]2100; AVX1-NEXT:    vpalignr {{.*#+}} xmm6 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4]2101; AVX1-NEXT:    vpalignr {{.*#+}} xmm7 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]2102; AVX1-NEXT:    vpalignr {{.*#+}} xmm3 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm3[0,1,2,3,4]2103; AVX1-NEXT:    vpalignr {{.*#+}} xmm2 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4]2104; AVX1-NEXT:    vpalignr {{.*#+}} xmm5 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4]2105; AVX1-NEXT:    vpalignr {{.*#+}} xmm4 = xmm1[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4]2106; AVX1-NEXT:    vpalignr {{.*#+}} xmm1 = xmm7[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]2107; AVX1-NEXT:    vpalignr {{.*#+}} xmm0 = xmm6[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4]2108; AVX1-NEXT:    vpalignr {{.*#+}} xmm2 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4]2109; AVX1-NEXT:    vpalignr {{.*#+}} xmm3 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4]2110; AVX1-NEXT:    vpalignr {{.*#+}} xmm4 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm7[0,1,2,3,4]2111; AVX1-NEXT:    vpalignr {{.*#+}} xmm5 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm6[0,1,2,3,4]2112; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5]2113; AVX1-NEXT:    vpshufb %xmm6, %xmm3, %xmm32114; AVX1-NEXT:    vpshufb %xmm6, %xmm0, %xmm02115; AVX1-NEXT:    vpshufb %xmm6, %xmm5, %xmm52116; AVX1-NEXT:    vpshufb %xmm6, %xmm1, %xmm12117; AVX1-NEXT:    vpshufb %xmm6, %xmm2, %xmm22118; AVX1-NEXT:    vpshufb %xmm6, %xmm4, %xmm42119; AVX1-NEXT:    vmovdqa %xmm4, 80(%rdi)2120; AVX1-NEXT:    vmovdqa %xmm2, 64(%rdi)2121; AVX1-NEXT:    vmovdqa %xmm1, 48(%rdi)2122; AVX1-NEXT:    vmovdqa %xmm5, 32(%rdi)2123; AVX1-NEXT:    vmovdqa %xmm3, 16(%rdi)2124; AVX1-NEXT:    vmovdqa %xmm0, (%rdi)2125; AVX1-NEXT:    vzeroupper2126; AVX1-NEXT:    retq2127;2128; AVX2-LABEL: splat3_256:2129; AVX2:       # %bb.0:2130; AVX2-NEXT:    vpalignr {{.*#+}} ymm1 = ymm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5,22,23,24,25,26,27,28,29,30,31,16,17,18,19,20,21]2131; AVX2-NEXT:    vpalignr {{.*#+}} ymm2 = ymm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10,27,28,29,30,31,16,17,18,19,20,21,22,23,24,25,26]2132; AVX2-NEXT:    vpalignr {{.*#+}} ymm3 = ymm1[5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3,4],ymm1[21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19,20]2133; AVX2-NEXT:    vpalignr {{.*#+}} ymm1 = ymm2[5,6,7,8,9,10,11,12,13,14,15],ymm1[0,1,2,3,4],ymm2[21,22,23,24,25,26,27,28,29,30,31],ymm1[16,17,18,19,20]2134; AVX2-NEXT:    vpalignr {{.*#+}} ymm2 = ymm0[5,6,7,8,9,10,11,12,13,14,15],ymm2[0,1,2,3,4],ymm0[21,22,23,24,25,26,27,28,29,30,31],ymm2[16,17,18,19,20]2135; AVX2-NEXT:    vpalignr {{.*#+}} ymm0 = ymm3[5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3,4],ymm3[21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19,20]2136; AVX2-NEXT:    vpalignr {{.*#+}} ymm1 = ymm1[5,6,7,8,9,10,11,12,13,14,15],ymm2[0,1,2,3,4],ymm1[21,22,23,24,25,26,27,28,29,30,31],ymm2[16,17,18,19,20]2137; AVX2-NEXT:    vpalignr {{.*#+}} ymm2 = ymm2[5,6,7,8,9,10,11,12,13,14,15],ymm3[0,1,2,3,4],ymm2[21,22,23,24,25,26,27,28,29,30,31],ymm3[16,17,18,19,20]2138; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm32139; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm4 = [0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5,0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5]2140; AVX2-NEXT:    # ymm4 = mem[0,1,0,1]2141; AVX2-NEXT:    vpshufb %ymm4, %ymm3, %ymm32142; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]2143; AVX2-NEXT:    vpshufb %ymm4, %ymm0, %ymm02144; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm1 = ymm1[2,3],ymm2[2,3]2145; AVX2-NEXT:    vpshufb %ymm4, %ymm1, %ymm12146; AVX2-NEXT:    vmovdqa %ymm1, 64(%rdi)2147; AVX2-NEXT:    vmovdqa %ymm0, 32(%rdi)2148; AVX2-NEXT:    vmovdqa %ymm3, (%rdi)2149; AVX2-NEXT:    vzeroupper2150; AVX2-NEXT:    retq2151;2152; XOP-LABEL: splat3_256:2153; XOP:       # %bb.0:2154; XOP-NEXT:    vpalignr {{.*#+}} xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]2155; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm22156; XOP-NEXT:    vpalignr {{.*#+}} xmm3 = xmm2[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]2157; XOP-NEXT:    vpalignr {{.*#+}} xmm4 = xmm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]2158; XOP-NEXT:    vpalignr {{.*#+}} xmm5 = xmm2[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]2159; XOP-NEXT:    vpalignr {{.*#+}} xmm6 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4]2160; XOP-NEXT:    vpalignr {{.*#+}} xmm7 = xmm1[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4]2161; XOP-NEXT:    vpalignr {{.*#+}} xmm3 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm3[0,1,2,3,4]2162; XOP-NEXT:    vpalignr {{.*#+}} xmm1 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]2163; XOP-NEXT:    vpalignr {{.*#+}} xmm5 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4]2164; XOP-NEXT:    vpalignr {{.*#+}} xmm4 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4]2165; XOP-NEXT:    vmovdqa {{.*#+}} xmm8 = [5,16,11,6,17,12,7,18,13,8,19,14,9,20,15,10]2166; XOP-NEXT:    vpperm %xmm8, %xmm4, %xmm1, %xmm12167; XOP-NEXT:    vpperm %xmm8, %xmm0, %xmm7, %xmm02168; XOP-NEXT:    vpperm %xmm8, %xmm7, %xmm4, %xmm42169; XOP-NEXT:    vpperm %xmm8, %xmm2, %xmm6, %xmm22170; XOP-NEXT:    vpperm %xmm8, %xmm5, %xmm3, %xmm32171; XOP-NEXT:    vpperm %xmm8, %xmm6, %xmm5, %xmm52172; XOP-NEXT:    vmovdqa %xmm5, 80(%rdi)2173; XOP-NEXT:    vmovdqa %xmm3, 64(%rdi)2174; XOP-NEXT:    vmovdqa %xmm2, 48(%rdi)2175; XOP-NEXT:    vmovdqa %xmm4, 32(%rdi)2176; XOP-NEXT:    vmovdqa %xmm1, 16(%rdi)2177; XOP-NEXT:    vmovdqa %xmm0, (%rdi)2178; XOP-NEXT:    vzeroupper2179; XOP-NEXT:    retq2180  %1 = shufflevector <32 x i8> %a0, <32 x i8> undef, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>2181  %2 = shufflevector <32 x i8> %a0, <32 x i8> undef, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2182  %3 = shufflevector <64 x i8> %1, <64 x i8> %2, <96 x i32> <i32 0, i32 32, i32 64, i32 1, i32 33, i32 65, i32 2, i32 34, i32 66, i32 3, i32 35, i32 67, i32 4, i32 36, i32 68, i32 5, i32 37, i32 69, i32 6, i32 38, i32 70, i32 7, i32 39, i32 71, i32 8, i32 40, i32 72, i32 9, i32 41, i32 73, i32 10, i32 42, i32 74, i32 11, i32 43, i32 75, i32 12, i32 44, i32 76, i32 13, i32 45, i32 77, i32 14, i32 46, i32 78, i32 15, i32 47, i32 79, i32 16, i32 48, i32 80, i32 17, i32 49, i32 81, i32 18, i32 50, i32 82, i32 19, i32 51, i32 83, i32 20, i32 52, i32 84, i32 21, i32 53, i32 85, i32 22, i32 54, i32 86, i32 23, i32 55, i32 87, i32 24, i32 56, i32 88, i32 25, i32 57, i32 89, i32 26, i32 58, i32 90, i32 27, i32 59, i32 91, i32 28, i32 60, i32 92, i32 29, i32 61, i32 93, i32 30, i32 62, i32 94, i32 31, i32 63, i32 95>2183  store <96 x i8> %3, ptr %a12184  ret void2185}2186 2187; D799872188define <16 x i32> @splat_v3i32(ptr %ptr) {2189; SSE2-LABEL: splat_v3i32:2190; SSE2:       # %bb.0:2191; SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2192; SSE2-NEXT:    xorps %xmm1, %xmm12193; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]2194; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,0,1]2195; SSE2-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02196; SSE2-NEXT:    xorps %xmm1, %xmm12197; SSE2-NEXT:    xorps %xmm3, %xmm32198; SSE2-NEXT:    retq2199;2200; SSE42-LABEL: splat_v3i32:2201; SSE42:       # %bb.0:2202; SSE42-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero2203; SSE42-NEXT:    pxor %xmm1, %xmm12204; SSE42-NEXT:    pxor %xmm2, %xmm22205; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm0[0,1],xmm2[2,3,4,5,6,7]2206; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7]2207; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,0,1]2208; SSE42-NEXT:    xorps %xmm3, %xmm32209; SSE42-NEXT:    retq2210;2211; AVX1-LABEL: splat_v3i32:2212; AVX1:       # %bb.0:2213; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = mem[0,0]2214; AVX1-NEXT:    vxorps %xmm2, %xmm2, %xmm22215; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm2[0],ymm1[1],ymm2[2,3,4,5,6,7]2216; AVX1-NEXT:    vblendps {{.*#+}} ymm1 = ymm2[0,1],ymm1[2],ymm2[3,4,5,6,7]2217; AVX1-NEXT:    retq2218;2219; AVX2-SLOW-LABEL: splat_v3i32:2220; AVX2-SLOW:       # %bb.0:2221; AVX2-SLOW-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero2222; AVX2-SLOW-NEXT:    vxorps %xmm2, %xmm2, %xmm22223; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm0 = ymm2[0],ymm1[1],ymm2[2,3,4,5,6,7]2224; AVX2-SLOW-NEXT:    vbroadcastss %xmm1, %xmm12225; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm1 = ymm2[0,1],ymm1[2],ymm2[3,4,5,6,7]2226; AVX2-SLOW-NEXT:    retq2227;2228; AVX2-FAST-LABEL: splat_v3i32:2229; AVX2-FAST:       # %bb.0:2230; AVX2-FAST-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero2231; AVX2-FAST-NEXT:    vpxor %xmm0, %xmm0, %xmm02232; AVX2-FAST-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2,3,4,5,6,7]2233; AVX2-FAST-NEXT:    vpshufb {{.*#+}} ymm1 = zero,zero,zero,zero,zero,zero,zero,zero,ymm1[0,1,2,3],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero2234; AVX2-FAST-NEXT:    retq2235;2236; XOP-LABEL: splat_v3i32:2237; XOP:       # %bb.0:2238; XOP-NEXT:    vmovddup {{.*#+}} xmm1 = mem[0,0]2239; XOP-NEXT:    vxorps %xmm2, %xmm2, %xmm22240; XOP-NEXT:    vblendps {{.*#+}} ymm0 = ymm2[0],ymm1[1],ymm2[2,3,4,5,6,7]2241; XOP-NEXT:    vblendps {{.*#+}} ymm1 = ymm2[0,1],ymm1[2],ymm2[3,4,5,6,7]2242; XOP-NEXT:    retq2243  %1 = load <3 x i32>, ptr %ptr, align 12244  %2 = shufflevector <3 x i32> %1, <3 x i32> undef, <16 x i32> <i32 0, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2245  %3 = shufflevector <16 x i32> <i32 0, i32 undef, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 0, i32 0, i32 0, i32 0, i32 0>, <16 x i32> %2, <16 x i32> <i32 0, i32 17, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 16, i32 11, i32 12, i32 13, i32 14, i32 15>2246  ret <16 x i32 > %32247}2248 2249define <2 x double> @wrongorder(<4 x double> %A, ptr %P) #0 {2250; SSE2-LABEL: wrongorder:2251; SSE2:       # %bb.0:2252; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]2253; SSE2-NEXT:    movaps %xmm0, 48(%rdi)2254; SSE2-NEXT:    movaps %xmm0, 32(%rdi)2255; SSE2-NEXT:    movaps %xmm0, 16(%rdi)2256; SSE2-NEXT:    movaps %xmm0, (%rdi)2257; SSE2-NEXT:    retq2258;2259; SSE42-LABEL: wrongorder:2260; SSE42:       # %bb.0:2261; SSE42-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]2262; SSE42-NEXT:    movapd %xmm0, 48(%rdi)2263; SSE42-NEXT:    movapd %xmm0, 32(%rdi)2264; SSE42-NEXT:    movapd %xmm0, 16(%rdi)2265; SSE42-NEXT:    movapd %xmm0, (%rdi)2266; SSE42-NEXT:    retq2267;2268; AVX1-LABEL: wrongorder:2269; AVX1:       # %bb.0:2270; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]2271; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm12272; AVX1-NEXT:    vmovaps %ymm1, 32(%rdi)2273; AVX1-NEXT:    vmovaps %ymm1, (%rdi)2274; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm02275; AVX1-NEXT:    vzeroupper2276; AVX1-NEXT:    retq2277;2278; AVX2-LABEL: wrongorder:2279; AVX2:       # %bb.0:2280; AVX2-NEXT:    vbroadcastsd %xmm0, %ymm02281; AVX2-NEXT:    vmovaps %ymm0, 32(%rdi)2282; AVX2-NEXT:    vmovaps %ymm0, (%rdi)2283; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm02284; AVX2-NEXT:    vzeroupper2285; AVX2-NEXT:    retq2286;2287; XOP-LABEL: wrongorder:2288; XOP:       # %bb.0:2289; XOP-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]2290; XOP-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm12291; XOP-NEXT:    vmovaps %ymm1, 32(%rdi)2292; XOP-NEXT:    vmovaps %ymm1, (%rdi)2293; XOP-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm02294; XOP-NEXT:    vzeroupper2295; XOP-NEXT:    retq2296  %shuffle = shufflevector <4 x double> %A, <4 x double> %A, <8 x i32> zeroinitializer2297  store <8 x double> %shuffle, ptr %P, align 642298  %m2 = load <8 x double>, ptr %P, align 642299  store <8 x double> %m2, ptr %P, align 642300  %m3 = load <8 x double>, ptr %P, align 642301  %m4 = shufflevector <8 x double> %m3, <8 x double> undef, <2 x i32> <i32 2, i32 0>2302  ret <2 x double> %m42303}2304 2305define void @PR41097() {2306; SSE2-LABEL: PR41097:2307; SSE2:       # %bb.0:2308; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero2309; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2310; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]2311; SSE2-NEXT:    psrad $24, %xmm02312; SSE2-NEXT:    pxor %xmm1, %xmm12313; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]2314; SSE2-NEXT:    movdqu %xmm0, (%rax)2315; SSE2-NEXT:    retq2316;2317; SSE42-LABEL: PR41097:2318; SSE42:       # %bb.0:2319; SSE42-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero2320; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,3,u,u,u,u,u,u,u,u,u,u,u,u,u,u]2321; SSE42-NEXT:    pmovsxbd %xmm0, %xmm02322; SSE42-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero2323; SSE42-NEXT:    movdqu %xmm0, (%rax)2324; SSE42-NEXT:    retq2325;2326; AVX-LABEL: PR41097:2327; AVX:       # %bb.0:2328; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero2329; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,3,u,u,u,u,u,u,u,u,u,u,u,u,u,u]2330; AVX-NEXT:    vpmovsxbd %xmm0, %xmm02331; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero2332; AVX-NEXT:    vmovdqu %xmm0, (%rax)2333; AVX-NEXT:    retq2334  %wide.vec = load <6 x i8>, ptr undef, align 12335  %strided.vec = shufflevector <6 x i8> %wide.vec, <6 x i8> undef, <2 x i32> <i32 0, i32 3>2336  %tmp = sext <2 x i8> %strided.vec to <2 x i32>2337  %tmp7 = zext <2 x i32> %tmp to <2 x i64>2338  store <2 x i64> %tmp7, ptr undef, align 82339  ret void2340}2341 2342; FIXME - should use INSERTPS2343define <2 x float> @PR86068(<2 x float> %0, <2 x float> %1) {2344; SSE2-LABEL: PR86068:2345; SSE2:       # %bb.0: # %entry2346; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1],xmm1[1,1]2347; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[1,1]2348; SSE2-NEXT:    retq2349;2350; SSE42-LABEL: PR86068:2351; SSE42:       # %bb.0: # %entry2352; SSE42-NEXT:    movshdup {{.*#+}} xmm1 = xmm1[1,1,3,3]2353; SSE42-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]2354; SSE42-NEXT:    retq2355;2356; AVX-LABEL: PR86068:2357; AVX:       # %bb.0: # %entry2358; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm1[1,1,3,3]2359; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]2360; AVX-NEXT:    retq2361entry:2362  %3 = shufflevector <2 x float> %1, <2 x float> poison, <2 x i32> <i32 1, i32 poison>2363  %4 = shufflevector <2 x float> %3, <2 x float> %0, <2 x i32> <i32 0, i32 3>2364  ret <2 x float> %42365}2366 2367define void @D107009(ptr %input, ptr %output) {2368; SSE-LABEL: D107009:2369; SSE:       # %bb.0:2370; SSE-NEXT:    movdqa 16(%rdi), %xmm02371; SSE-NEXT:    movdqa 80(%rdi), %xmm12372; SSE-NEXT:    movdqa 144(%rdi), %xmm22373; SSE-NEXT:    movdqa 208(%rdi), %xmm32374; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]2375; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]2376; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]2377; SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[1],mem[1]2378; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[1],mem[1]2379; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]2380; SSE-NEXT:    psrld $16, %xmm22381; SSE-NEXT:    psrld $16, %xmm02382; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2383; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]2384; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[3,3,3,3]2385; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,1,1]2386; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[2,3,2,3]2387; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[3,3,3,3]2388; SSE-NEXT:    movdqa %xmm0, 128(%rsi)2389; SSE-NEXT:    movdqa %xmm2, 144(%rsi)2390; SSE-NEXT:    movdqa %xmm0, 16(%rsi)2391; SSE-NEXT:    movdqa %xmm7, 240(%rsi)2392; SSE-NEXT:    movdqa %xmm6, 208(%rsi)2393; SSE-NEXT:    movdqa %xmm5, 176(%rsi)2394; SSE-NEXT:    movdqa %xmm4, 112(%rsi)2395; SSE-NEXT:    movdqa %xmm3, 80(%rsi)2396; SSE-NEXT:    movdqa %xmm1, 48(%rsi)2397; SSE-NEXT:    retq2398;2399; AVX1-LABEL: D107009:2400; AVX1:       # %bb.0:2401; AVX1-NEXT:    vmovups 128(%rdi), %ymm02402; AVX1-NEXT:    vmovups 224(%rdi), %ymm12403; AVX1-NEXT:    vunpcklpd {{.*#+}} ymm1 = ymm1[0],mem[0],ymm1[2],mem[2]2404; AVX1-NEXT:    vunpcklps {{.*#+}} ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]2405; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,0],ymm0[4,5],ymm1[6,4]2406; AVX1-NEXT:    vmovaps 112(%rdi), %xmm12407; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],mem[0]2408; AVX1-NEXT:    vmovaps 16(%rdi), %xmm22409; AVX1-NEXT:    vunpcklps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[1],mem[1]2410; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,0]2411; AVX1-NEXT:    vpsrld $16, %xmm1, %xmm12412; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm02413; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm02414; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm02415; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[0,1,1,3]2416; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[2,1,3,3]2417; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm22418; AVX1-NEXT:    vshufps {{.*#+}} ymm3 = ymm0[3,3,3,3,7,7,7,7]2419; AVX1-NEXT:    vshufpd {{.*#+}} ymm4 = ymm0[0,0,3,2]2420; AVX1-NEXT:    vmovshdup {{.*#+}} ymm5 = ymm0[1,1,3,3,5,5,7,7]2421; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm1[3,3,3,3]2422; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm1[1,1,1,1]2423; AVX1-NEXT:    vmovdqa %xmm1, 16(%rsi)2424; AVX1-NEXT:    vmovdqa %xmm7, 48(%rsi)2425; AVX1-NEXT:    vmovdqa %xmm6, 112(%rsi)2426; AVX1-NEXT:    vmovups %ymm0, 128(%rsi)2427; AVX1-NEXT:    vmovups %ymm5, 160(%rsi)2428; AVX1-NEXT:    vmovupd %ymm4, 192(%rsi)2429; AVX1-NEXT:    vmovupd %ymm3, 224(%rsi)2430; AVX1-NEXT:    vmovups %ymm2, 64(%rsi)2431; AVX1-NEXT:    vzeroupper2432; AVX1-NEXT:    retq2433;2434; AVX2-LABEL: D107009:2435; AVX2:       # %bb.0:2436; AVX2-NEXT:    vmovdqu 64(%rdi), %ymm02437; AVX2-NEXT:    vmovdqu 128(%rdi), %ymm12438; AVX2-NEXT:    vmovdqu 192(%rdi), %ymm22439; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm2 = ymm2[0],mem[0],ymm2[1],mem[1],ymm2[4],mem[4],ymm2[5],mem[5]2440; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm1 = ymm1[0],mem[0],ymm1[1],mem[1],ymm1[4],mem[4],ymm1[5],mem[5]2441; AVX2-NEXT:    vpunpcklqdq {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[2],ymm2[2]2442; AVX2-NEXT:    vmovdqa 16(%rdi), %xmm22443; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[1],mem[1]2444; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]2445; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,2,2,2]2446; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3]2447; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]2448; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm02449; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero2450; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]2451; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]2452; AVX2-NEXT:    vpbroadcastd %xmm0, %ymm42453; AVX2-NEXT:    vpshufd {{.*#+}} ymm5 = ymm0[3,3,3,3,7,7,7,7]2454; AVX2-NEXT:    vpshufd {{.*#+}} ymm6 = ymm0[2,3,2,3,6,7,6,7]2455; AVX2-NEXT:    vpshufd {{.*#+}} ymm7 = ymm0[1,1,1,1,5,5,5,5]2456; AVX2-NEXT:    vmovdqu %ymm0, 128(%rsi)2457; AVX2-NEXT:    vmovdqu %ymm7, 160(%rsi)2458; AVX2-NEXT:    vmovdqu %ymm6, 192(%rsi)2459; AVX2-NEXT:    vmovdqu %ymm5, 224(%rsi)2460; AVX2-NEXT:    vmovdqu %ymm4, (%rsi)2461; AVX2-NEXT:    vmovdqa %xmm3, 48(%rsi)2462; AVX2-NEXT:    vmovdqa %xmm2, 112(%rsi)2463; AVX2-NEXT:    vmovdqu %ymm1, 64(%rsi)2464; AVX2-NEXT:    vzeroupper2465; AVX2-NEXT:    retq2466;2467; XOP-LABEL: D107009:2468; XOP:       # %bb.0:2469; XOP-NEXT:    vmovups 128(%rdi), %ymm02470; XOP-NEXT:    vmovups 224(%rdi), %ymm12471; XOP-NEXT:    vunpcklpd {{.*#+}} ymm1 = ymm1[0],mem[0],ymm1[2],mem[2]2472; XOP-NEXT:    vunpcklps {{.*#+}} ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]2473; XOP-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,0],ymm0[4,5],ymm1[6,4]2474; XOP-NEXT:    vmovaps 112(%rdi), %xmm12475; XOP-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],mem[0]2476; XOP-NEXT:    vmovaps 16(%rdi), %xmm22477; XOP-NEXT:    vunpcklps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[1],mem[1]2478; XOP-NEXT:    vshufps {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,0]2479; XOP-NEXT:    vpsrld $16, %xmm1, %xmm12480; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm02481; XOP-NEXT:    vpsrld $16, %xmm0, %xmm02482; XOP-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm02483; XOP-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[0,1,1,3]2484; XOP-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[2,1,3,3]2485; XOP-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm22486; XOP-NEXT:    vshufps {{.*#+}} ymm3 = ymm0[3,3,3,3,7,7,7,7]2487; XOP-NEXT:    vshufpd {{.*#+}} ymm4 = ymm0[0,0,3,2]2488; XOP-NEXT:    vmovshdup {{.*#+}} ymm5 = ymm0[1,1,3,3,5,5,7,7]2489; XOP-NEXT:    vpshufd {{.*#+}} xmm6 = xmm1[3,3,3,3]2490; XOP-NEXT:    vpshufd {{.*#+}} xmm7 = xmm1[1,1,1,1]2491; XOP-NEXT:    vmovdqa %xmm1, 16(%rsi)2492; XOP-NEXT:    vmovdqa %xmm7, 48(%rsi)2493; XOP-NEXT:    vmovdqa %xmm6, 112(%rsi)2494; XOP-NEXT:    vmovups %ymm0, 128(%rsi)2495; XOP-NEXT:    vmovups %ymm5, 160(%rsi)2496; XOP-NEXT:    vmovupd %ymm4, 192(%rsi)2497; XOP-NEXT:    vmovupd %ymm3, 224(%rsi)2498; XOP-NEXT:    vmovups %ymm2, 64(%rsi)2499; XOP-NEXT:    vzeroupper2500; XOP-NEXT:    retq2501  %i = load <64 x i32>, ptr %input, align 162502  %i2 = shufflevector <64 x i32> %i, <64 x i32> poison, <8 x i32> <i32 4, i32 12, i32 20, i32 28, i32 36, i32 44, i32 52, i32 60>2503  %i3 = lshr <8 x i32> %i2, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>2504  %i4 = add <8 x i32> zeroinitializer, %i32505  %i5 = shufflevector <8 x i32> %i4, <8 x i32> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>2506  %i6 = shufflevector <16 x i32> %i5, <16 x i32> poison, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>2507  %i7 = shufflevector <32 x i32> poison, <32 x i32> %i6, <64 x i32> <i32 0, i32 8, i32 16, i32 24, i32 32, i32 40, i32 48, i32 56, i32 1, i32 9, i32 17, i32 25, i32 33, i32 41, i32 49, i32 57, i32 2, i32 10, i32 18, i32 26, i32 34, i32 42, i32 50, i32 58, i32 3, i32 11, i32 19, i32 27, i32 35, i32 43, i32 51, i32 59, i32 4, i32 12, i32 20, i32 28, i32 36, i32 44, i32 52, i32 60, i32 5, i32 13, i32 21, i32 29, i32 37, i32 45, i32 53, i32 61, i32 6, i32 14, i32 22, i32 30, i32 38, i32 46, i32 54, i32 62, i32 7, i32 15, i32 23, i32 31, i32 39, i32 47, i32 55, i32 63>2508  store <64 x i32> %i7, ptr %output, align 162509  ret void2510}2511 2512; Ensure concatenation of repeated subvector loads before vector can be split apart.2513define void @split_v2i64_subvector_broadcast(ptr readonly align 8 captures(none) dereferenceable(64) %arg) {2514; SSE-LABEL: split_v2i64_subvector_broadcast:2515; SSE:       # %bb.0:2516; SSE-NEXT:    movups 8(%rdi), %xmm02517; SSE-NEXT:    movups 40(%rdi), %xmm12518; SSE-NEXT:    movaps %xmm0, %xmm22519; SSE-NEXT:    movlhps {{.*#+}} xmm2 = xmm2[0],xmm1[0]2520; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]2521; SSE-NEXT:    movups %xmm0, (%rax)2522; SSE-NEXT:    movups %xmm2, (%rax)2523; SSE-NEXT:    retq2524;2525; AVX1-LABEL: split_v2i64_subvector_broadcast:2526; AVX1:       # %bb.0:2527; AVX1-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]2528; AVX1-NEXT:    vbroadcastf128 {{.*#+}} ymm1 = mem[0,1,0,1]2529; AVX1-NEXT:    vshufpd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[3],ymm0[3]2530; AVX1-NEXT:    vmovupd %ymm0, (%rax)2531; AVX1-NEXT:    vzeroupper2532; AVX1-NEXT:    retq2533;2534; AVX2-LABEL: split_v2i64_subvector_broadcast:2535; AVX2:       # %bb.0:2536; AVX2-NEXT:    vmovups 40(%rdi), %xmm02537; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,2,1]2538; AVX2-NEXT:    vpermpd {{.*#+}} ymm1 = mem[0,1,1,3]2539; AVX2-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3],ymm1[4,5],ymm0[6,7]2540; AVX2-NEXT:    vmovups %ymm0, (%rax)2541; AVX2-NEXT:    vzeroupper2542; AVX2-NEXT:    retq2543;2544; XOP-LABEL: split_v2i64_subvector_broadcast:2545; XOP:       # %bb.0:2546; XOP-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]2547; XOP-NEXT:    vbroadcastf128 {{.*#+}} ymm1 = mem[0,1,0,1]2548; XOP-NEXT:    vshufpd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[3],ymm0[3]2549; XOP-NEXT:    vmovupd %ymm0, (%rax)2550; XOP-NEXT:    vzeroupper2551; XOP-NEXT:    retq2552  %gep = getelementptr inbounds nuw i8, ptr %arg, i64 82553  %load = load <6 x i64>, ptr %gep, align 82554  %shuffle = shufflevector <6 x i64> %load, <6 x i64> poison, <4 x i32> <i32 0, i32 4, i32 1, i32 5>2555  store <4 x i64> %shuffle, ptr poison, align 82556  ret void2557}2558