1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+sse4.2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE42 4; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 5; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-SLOW 6; 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-ALL 7; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST,AVX2-FAST-PERLANE 8; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+xop | FileCheck %s --check-prefix=XOP 9 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: retq 18; 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: retq 25; 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: retq 32; 33; XOP-LABEL: v3i64: 34; XOP: # %bb.0: 35; XOP-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm0[0],xmm1[0] 36; XOP-NEXT: vpextrq $1, %xmm0, 16(%rdi) 37; XOP-NEXT: vmovdqa %xmm1, (%rdi) 38; XOP-NEXT: retq 39 %r = shufflevector <2 x i64> %a, <2 x i64> %b, <3 x i32> <i32 0, i32 2, i32 1> 40 store <3 x i64> %r, ptr %p 41 ret void 42} 43define void @v3f64(<2 x double> %a, <2 x double> %b, ptr %p) nounwind { 44; SSE-LABEL: v3f64: 45; SSE: # %bb.0: 46; SSE-NEXT: movhps %xmm0, 16(%rdi) 47; SSE-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] 48; SSE-NEXT: movaps %xmm0, (%rdi) 49; SSE-NEXT: retq 50; 51; AVX-LABEL: v3f64: 52; AVX: # %bb.0: 53; AVX-NEXT: vmovlhps {{.*#+}} xmm1 = xmm0[0],xmm1[0] 54; AVX-NEXT: vmovhps %xmm0, 16(%rdi) 55; AVX-NEXT: vmovaps %xmm1, (%rdi) 56; AVX-NEXT: retq 57; 58; XOP-LABEL: v3f64: 59; XOP: # %bb.0: 60; XOP-NEXT: vmovlhps {{.*#+}} xmm1 = xmm0[0],xmm1[0] 61; XOP-NEXT: vmovhps %xmm0, 16(%rdi) 62; XOP-NEXT: vmovaps %xmm1, (%rdi) 63; XOP-NEXT: retq 64 %r = shufflevector <2 x double> %a, <2 x double> %b, <3 x i32> <i32 0, i32 2, i32 1> 65 store <3 x double> %r, ptr %p 66 ret void 67} 68 69define void @v3i32(<2 x i32> %a, <2 x i32> %b, ptr %p) nounwind { 70; SSE2-LABEL: v3i32: 71; SSE2: # %bb.0: 72; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1] 73; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 74; SSE2-NEXT: movd %xmm2, 8(%rdi) 75; SSE2-NEXT: movq %xmm0, (%rdi) 76; SSE2-NEXT: retq 77; 78; SSE42-LABEL: v3i32: 79; SSE42: # %bb.0: 80; SSE42-NEXT: extractps $1, %xmm0, 8(%rdi) 81; SSE42-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 82; SSE42-NEXT: movlps %xmm0, (%rdi) 83; SSE42-NEXT: retq 84; 85; AVX-LABEL: v3i32: 86; AVX: # %bb.0: 87; AVX-NEXT: vunpcklps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 88; AVX-NEXT: vextractps $1, %xmm0, 8(%rdi) 89; AVX-NEXT: vmovlps %xmm1, (%rdi) 90; AVX-NEXT: retq 91; 92; XOP-LABEL: v3i32: 93; XOP: # %bb.0: 94; XOP-NEXT: vunpcklps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 95; XOP-NEXT: vextractps $1, %xmm0, 8(%rdi) 96; XOP-NEXT: vmovlps %xmm1, (%rdi) 97; XOP-NEXT: retq 98 %r = shufflevector <2 x i32> %a, <2 x i32> %b, <3 x i32> <i32 0, i32 2, i32 1> 99 store <3 x i32> %r, ptr %p 100 ret void 101} 102 103define void @v5i16(<4 x i16> %a, <4 x i16> %b, ptr %p) nounwind { 104; SSE2-LABEL: v5i16: 105; SSE2: # %bb.0: 106; SSE2-NEXT: psrlq $16, %xmm1 107; SSE2-NEXT: pextrw $3, %xmm0, %eax 108; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 109; SSE2-NEXT: movw %ax, 8(%rdi) 110; SSE2-NEXT: movq %xmm0, (%rdi) 111; SSE2-NEXT: retq 112; 113; SSE42-LABEL: v5i16: 114; SSE42: # %bb.0: 115; SSE42-NEXT: psrlq $16, %xmm1 116; SSE42-NEXT: pextrw $3, %xmm0, 8(%rdi) 117; SSE42-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 118; SSE42-NEXT: movq %xmm0, (%rdi) 119; SSE42-NEXT: retq 120; 121; AVX-LABEL: v5i16: 122; AVX: # %bb.0: 123; AVX-NEXT: vpsrlq $16, %xmm1, %xmm1 124; AVX-NEXT: vpunpcklwd {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 125; AVX-NEXT: vpextrw $3, %xmm0, 8(%rdi) 126; AVX-NEXT: vmovq %xmm1, (%rdi) 127; AVX-NEXT: retq 128; 129; XOP-LABEL: v5i16: 130; XOP: # %bb.0: 131; XOP-NEXT: vpsrlq $16, %xmm1, %xmm1 132; XOP-NEXT: vpunpcklwd {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 133; XOP-NEXT: vpextrw $3, %xmm0, 8(%rdi) 134; XOP-NEXT: vmovq %xmm1, (%rdi) 135; XOP-NEXT: retq 136 %r = shufflevector <4 x i16> %a, <4 x i16> %b, <5 x i32> <i32 0, i32 5, i32 1, i32 6, i32 3> 137 store <5 x i16> %r, ptr %p 138 ret void 139} 140 141define void @v5i32(<4 x i32> %a, <4 x i32> %b, ptr %p) nounwind { 142; SSE2-LABEL: v5i32: 143; SSE2: # %bb.0: 144; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,2,2,3] 145; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,3,3,3] 146; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 147; SSE2-NEXT: movd %xmm2, 16(%rdi) 148; SSE2-NEXT: movdqa %xmm0, (%rdi) 149; SSE2-NEXT: retq 150; 151; SSE42-LABEL: v5i32: 152; SSE42: # %bb.0: 153; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,2,2] 154; SSE42-NEXT: pmovzxdq {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero 155; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7] 156; SSE42-NEXT: pextrd $3, %xmm0, 16(%rdi) 157; SSE42-NEXT: movdqa %xmm2, (%rdi) 158; SSE42-NEXT: retq 159; 160; AVX1-LABEL: v5i32: 161; AVX1: # %bb.0: 162; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,2,2] 163; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero 164; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7] 165; AVX1-NEXT: vpextrd $3, %xmm0, 16(%rdi) 166; AVX1-NEXT: vmovdqa %xmm1, (%rdi) 167; AVX1-NEXT: retq 168; 169; AVX2-LABEL: v5i32: 170; AVX2: # %bb.0: 171; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,2,2] 172; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero 173; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3] 174; AVX2-NEXT: vpextrd $3, %xmm0, 16(%rdi) 175; AVX2-NEXT: vmovdqa %xmm1, (%rdi) 176; AVX2-NEXT: retq 177; 178; XOP-LABEL: v5i32: 179; XOP: # %bb.0: 180; XOP-NEXT: vpperm {{.*#+}} xmm1 = xmm0[0,1,2,3],xmm1[4,5,6,7],xmm0[4,5,6,7],xmm1[8,9,10,11] 181; XOP-NEXT: vpextrd $3, %xmm0, 16(%rdi) 182; XOP-NEXT: vmovdqa %xmm1, (%rdi) 183; XOP-NEXT: retq 184 %r = shufflevector <4 x i32> %a, <4 x i32> %b, <5 x i32> <i32 0, i32 5, i32 1, i32 6, i32 3> 185 store <5 x i32> %r, ptr %p 186 ret void 187} 188 189define void @v5f32(<4 x float> %a, <4 x float> %b, ptr %p) nounwind { 190; SSE2-LABEL: v5f32: 191; SSE2: # %bb.0: 192; SSE2-NEXT: movaps %xmm0, %xmm2 193; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,1],xmm1[1,2] 194; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2,1,3] 195; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3] 196; SSE2-NEXT: movss %xmm0, 16(%rdi) 197; SSE2-NEXT: movaps %xmm2, (%rdi) 198; SSE2-NEXT: retq 199; 200; SSE42-LABEL: v5f32: 201; SSE42: # %bb.0: 202; SSE42-NEXT: extractps $3, %xmm0, 16(%rdi) 203; SSE42-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[1,2] 204; SSE42-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,1,3] 205; SSE42-NEXT: movaps %xmm0, (%rdi) 206; SSE42-NEXT: retq 207; 208; AVX-LABEL: v5f32: 209; AVX: # %bb.0: 210; AVX-NEXT: vshufps {{.*#+}} xmm1 = xmm0[0,1],xmm1[1,2] 211; AVX-NEXT: vpermilps {{.*#+}} xmm1 = xmm1[0,2,1,3] 212; AVX-NEXT: vextractps $3, %xmm0, 16(%rdi) 213; AVX-NEXT: vmovaps %xmm1, (%rdi) 214; AVX-NEXT: retq 215; 216; XOP-LABEL: v5f32: 217; XOP: # %bb.0: 218; XOP-NEXT: vshufps {{.*#+}} xmm1 = xmm0[0,1],xmm1[1,2] 219; XOP-NEXT: vpermilps {{.*#+}} xmm1 = xmm1[0,2,1,3] 220; XOP-NEXT: vextractps $3, %xmm0, 16(%rdi) 221; XOP-NEXT: vmovaps %xmm1, (%rdi) 222; XOP-NEXT: retq 223 %r = shufflevector <4 x float> %a, <4 x float> %b, <5 x i32> <i32 0, i32 5, i32 1, i32 6, i32 3> 224 store <5 x float> %r, ptr %p 225 ret void 226} 227 228define void @v7i8(<4 x i8> %a, <4 x i8> %b, ptr %p) nounwind { 229; SSE2-LABEL: v7i8: 230; SSE2: # %bb.0: 231; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 232; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,3,1,3,4,5,6,7] 233; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [0,255,0,255,0,255,255,255,255,255,255,255,255,255,255,255] 234; SSE2-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp) 235; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 236; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[2,2,3,0,4,5,6,7] 237; SSE2-NEXT: pand %xmm2, %xmm1 238; SSE2-NEXT: pandn %xmm0, %xmm2 239; SSE2-NEXT: por %xmm1, %xmm2 240; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 241; SSE2-NEXT: movb %al, 6(%rdi) 242; SSE2-NEXT: movd %xmm2, (%rdi) 243; SSE2-NEXT: pextrw $2, %xmm2, %eax 244; SSE2-NEXT: movw %ax, 4(%rdi) 245; SSE2-NEXT: retq 246; 247; SSE42-LABEL: v7i8: 248; SSE42: # %bb.0: 249; SSE42-NEXT: pextrb $0, %xmm1, 6(%rdi) 250; 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] 251; SSE42-NEXT: pshufb {{.*#+}} xmm1 = xmm1[1,4,7,4,3,6,0,u,u,u,u,u,u,u,u,u] 252; SSE42-NEXT: pextrw $2, %xmm1, 4(%rdi) 253; SSE42-NEXT: movd %xmm1, (%rdi) 254; SSE42-NEXT: retq 255; 256; AVX-LABEL: v7i8: 257; AVX: # %bb.0: 258; AVX-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] 259; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,4,7,4,3,6,0,u,u,u,u,u,u,u,u,u] 260; AVX-NEXT: vpextrb $0, %xmm1, 6(%rdi) 261; AVX-NEXT: vpextrw $2, %xmm0, 4(%rdi) 262; AVX-NEXT: vmovd %xmm0, (%rdi) 263; AVX-NEXT: retq 264; 265; XOP-LABEL: v7i8: 266; XOP: # %bb.0: 267; 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] 268; XOP-NEXT: vpextrb $0, %xmm1, 6(%rdi) 269; XOP-NEXT: vpextrw $2, %xmm0, 4(%rdi) 270; XOP-NEXT: vmovd %xmm0, (%rdi) 271; XOP-NEXT: retq 272 %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> 273 store <7 x i8> %r, ptr %p 274 ret void 275} 276 277define void @v7i16(<4 x i16> %a, <4 x i16> %b, ptr %p) nounwind { 278; SSE2-LABEL: v7i16: 279; SSE2: # %bb.0: 280; SSE2-NEXT: movd %xmm1, %eax 281; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] 282; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,1,0,3,4,5,6,7] 283; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,7,6,7] 284; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 285; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,2,3,2,4,5,6,7] 286; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,5,6,4,7] 287; SSE2-NEXT: movw %ax, 12(%rdi) 288; SSE2-NEXT: movq %xmm0, (%rdi) 289; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3] 290; SSE2-NEXT: movd %xmm0, 8(%rdi) 291; SSE2-NEXT: retq 292; 293; SSE42-LABEL: v7i16: 294; SSE42: # %bb.0: 295; SSE42-NEXT: pextrw $0, %xmm1, 12(%rdi) 296; SSE42-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] 297; SSE42-NEXT: pshufb {{.*#+}} xmm1 = xmm1[2,3,8,9,14,15,8,9,6,7,12,13,0,1,14,15] 298; SSE42-NEXT: pextrd $2, %xmm1, 8(%rdi) 299; SSE42-NEXT: movq %xmm1, (%rdi) 300; SSE42-NEXT: retq 301; 302; AVX-LABEL: v7i16: 303; AVX: # %bb.0: 304; AVX-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] 305; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[2,3,8,9,14,15,8,9,6,7,12,13,0,1,14,15] 306; AVX-NEXT: vpextrw $0, %xmm1, 12(%rdi) 307; AVX-NEXT: vpextrd $2, %xmm0, 8(%rdi) 308; AVX-NEXT: vmovq %xmm0, (%rdi) 309; AVX-NEXT: retq 310; 311; XOP-LABEL: v7i16: 312; XOP: # %bb.0: 313; 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] 314; XOP-NEXT: vpextrw $0, %xmm1, 12(%rdi) 315; XOP-NEXT: vpextrd $2, %xmm0, 8(%rdi) 316; XOP-NEXT: vmovq %xmm0, (%rdi) 317; XOP-NEXT: retq 318 %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> 319 store <7 x i16> %r, ptr %p 320 ret void 321} 322 323 324define void @v7i32(<4 x i32> %a, <4 x i32> %b, ptr %p) nounwind { 325; SSE2-LABEL: v7i32: 326; SSE2: # %bb.0: 327; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,2,2,2] 328; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,1,0,3] 329; SSE2-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm2[2],xmm3[3],xmm2[3] 330; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3] 331; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1] 332; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 333; SSE2-NEXT: movd %xmm1, 24(%rdi) 334; SSE2-NEXT: movq %xmm0, 16(%rdi) 335; SSE2-NEXT: movdqa %xmm3, (%rdi) 336; SSE2-NEXT: retq 337; 338; SSE42-LABEL: v7i32: 339; SSE42: # %bb.0: 340; SSE42-NEXT: movdqa %xmm0, %xmm2 341; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5],xmm2[6,7] 342; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,3,2] 343; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 344; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3] 345; SSE42-NEXT: movd %xmm1, 24(%rdi) 346; SSE42-NEXT: movq %xmm0, 16(%rdi) 347; SSE42-NEXT: movdqa %xmm2, (%rdi) 348; SSE42-NEXT: retq 349; 350; AVX-LABEL: v7i32: 351; AVX: # %bb.0: 352; AVX-NEXT: vblendps {{.*#+}} xmm2 = xmm0[0,1],xmm1[2],xmm0[3] 353; AVX-NEXT: vpermilps {{.*#+}} xmm2 = xmm2[0,2,3,2] 354; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3] 355; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[1,3,2,3] 356; AVX-NEXT: vmovss %xmm1, 24(%rdi) 357; AVX-NEXT: vmovlps %xmm0, 16(%rdi) 358; AVX-NEXT: vmovaps %xmm2, (%rdi) 359; AVX-NEXT: retq 360; 361; XOP-LABEL: v7i32: 362; XOP: # %bb.0: 363; XOP-NEXT: vblendps {{.*#+}} xmm2 = xmm0[0,1],xmm1[2],xmm0[3] 364; XOP-NEXT: vpermilps {{.*#+}} xmm2 = xmm2[0,2,3,2] 365; XOP-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3] 366; XOP-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[1,3,2,3] 367; XOP-NEXT: vmovss %xmm1, 24(%rdi) 368; XOP-NEXT: vmovlps %xmm0, 16(%rdi) 369; XOP-NEXT: vmovaps %xmm2, (%rdi) 370; XOP-NEXT: retq 371 %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> 372 store <7 x i32> %r, ptr %p 373 ret void 374} 375 376define void @v12i8(<8 x i8> %a, <8 x i8> %b, ptr %p) nounwind { 377; SSE2-LABEL: v12i8: 378; SSE2: # %bb.0: 379; SSE2-NEXT: pxor %xmm2, %xmm2 380; 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] 381; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,1,2,3] 382; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,3,1,3,4,5,6,7] 383; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,4,7] 384; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,3,2,1] 385; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,1,4,5,6,7] 386; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,4] 387; SSE2-NEXT: packuswb %xmm2, %xmm0 388; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,0,255,255,0,255,255,0,255,255,0,255,255,255,255] 389; SSE2-NEXT: pand %xmm2, %xmm0 390; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,1,1,4,5,6,7] 391; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,3] 392; SSE2-NEXT: pandn %xmm1, %xmm2 393; SSE2-NEXT: por %xmm0, %xmm2 394; SSE2-NEXT: movq %xmm2, (%rdi) 395; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3] 396; SSE2-NEXT: movd %xmm0, 8(%rdi) 397; SSE2-NEXT: retq 398; 399; SSE42-LABEL: v12i8: 400; SSE42: # %bb.0: 401; 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] 402; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u] 403; SSE42-NEXT: pextrd $2, %xmm0, 8(%rdi) 404; SSE42-NEXT: movq %xmm0, (%rdi) 405; SSE42-NEXT: retq 406; 407; AVX-LABEL: v12i8: 408; AVX: # %bb.0: 409; AVX-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] 410; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u] 411; AVX-NEXT: vpextrd $2, %xmm0, 8(%rdi) 412; AVX-NEXT: vmovq %xmm0, (%rdi) 413; AVX-NEXT: retq 414; 415; XOP-LABEL: v12i8: 416; XOP: # %bb.0: 417; 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] 418; XOP-NEXT: vpextrd $2, %xmm0, 8(%rdi) 419; XOP-NEXT: vmovq %xmm0, (%rdi) 420; XOP-NEXT: retq 421 %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> 422 store <12 x i8> %r, ptr %p 423 ret void 424} 425 426define void @v12i16(<8 x i16> %a, <8 x i16> %b, ptr %p) nounwind { 427; SSE2-LABEL: v12i16: 428; SSE2: # %bb.0: 429; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,0,0] 430; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [65535,65535,0,65535,65535,0,65535,65535] 431; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm0[0,1,2,3,6,5,4,7] 432; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,3,2,1] 433; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,2,2,1,4,5,6,7] 434; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,5,6,4] 435; SSE2-NEXT: pand %xmm3, %xmm4 436; SSE2-NEXT: pandn %xmm2, %xmm3 437; SSE2-NEXT: por %xmm4, %xmm3 438; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1] 439; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [0,65535,65535,0,65535,65535,65535,65535] 440; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3] 441; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,3,1,3,4,5,6,7] 442; SSE2-NEXT: pand %xmm2, %xmm0 443; SSE2-NEXT: pandn %xmm1, %xmm2 444; SSE2-NEXT: por %xmm0, %xmm2 445; SSE2-NEXT: movq %xmm2, 16(%rdi) 446; SSE2-NEXT: movdqa %xmm3, (%rdi) 447; SSE2-NEXT: retq 448; 449; SSE42-LABEL: v12i16: 450; SSE42: # %bb.0: 451; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,1,1] 452; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm0[3,1,2,3] 453; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,3,1,3,4,5,6,7] 454; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm2[0],xmm3[1,2],xmm2[3],xmm3[4,5,6,7] 455; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0] 456; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,2,3,10,11,u,u,4,5,12,13] 457; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7] 458; SSE42-NEXT: movdqa %xmm0, (%rdi) 459; SSE42-NEXT: movq %xmm3, 16(%rdi) 460; SSE42-NEXT: retq 461; 462; AVX1-LABEL: v12i16: 463; AVX1: # %bb.0: 464; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1] 465; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[3,1,2,3] 466; AVX1-NEXT: vpshuflw {{.*#+}} xmm3 = xmm3[0,3,1,3,4,5,6,7] 467; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2],xmm2[3],xmm3[4,5,6,7] 468; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0] 469; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,2,3,10,11,u,u,4,5,12,13] 470; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7] 471; AVX1-NEXT: vmovdqa %xmm0, (%rdi) 472; AVX1-NEXT: vmovq %xmm2, 16(%rdi) 473; AVX1-NEXT: retq 474; 475; AVX2-SLOW-LABEL: v12i16: 476; AVX2-SLOW: # %bb.0: 477; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1] 478; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[3,1,2,3] 479; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm3 = xmm3[0,3,1,3,4,5,6,7] 480; AVX2-SLOW-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2],xmm2[3],xmm3[4,5,6,7] 481; AVX2-SLOW-NEXT: vpbroadcastd %xmm1, %xmm1 482; AVX2-SLOW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,2,3,10,11,u,u,4,5,12,13] 483; AVX2-SLOW-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7] 484; AVX2-SLOW-NEXT: vmovdqa %xmm0, (%rdi) 485; AVX2-SLOW-NEXT: vmovq %xmm2, 16(%rdi) 486; AVX2-SLOW-NEXT: retq 487; 488; AVX2-FAST-LABEL: v12i16: 489; AVX2-FAST: # %bb.0: 490; AVX2-FAST-NEXT: vpbroadcastd %xmm1, %xmm2 491; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm3 = xmm0[0,1,8,9,u,u,2,3,10,11,u,u,4,5,12,13] 492; AVX2-FAST-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2],xmm3[3,4],xmm2[5],xmm3[6,7] 493; AVX2-FAST-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,1,1] 494; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[u,u,6,7,14,15,u,u,u,u,u,u,u,u,u,u] 495; AVX2-FAST-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3],xmm0[4,5,6,7] 496; AVX2-FAST-NEXT: vmovq %xmm0, 16(%rdi) 497; AVX2-FAST-NEXT: vmovdqa %xmm2, (%rdi) 498; AVX2-FAST-NEXT: retq 499; 500; XOP-LABEL: v12i16: 501; XOP: # %bb.0: 502; 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] 503; XOP-NEXT: vpperm {{.*#+}} xmm0 = xmm1[4,5],xmm0[6,7,14,15],xmm1[6,7],xmm0[u,u,u,u,u,u,u,u] 504; XOP-NEXT: vmovq %xmm0, 16(%rdi) 505; XOP-NEXT: vmovdqa %xmm2, (%rdi) 506; XOP-NEXT: retq 507 %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> 508 store <12 x i16> %r, ptr %p 509 ret void 510} 511 512define void @v12i32(<8 x i32> %a, <8 x i32> %b, ptr %p) nounwind { 513; SSE2-LABEL: v12i32: 514; SSE2: # %bb.0: 515; SSE2-NEXT: movaps %xmm2, %xmm3 516; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,1],xmm0[1,3] 517; SSE2-NEXT: movaps %xmm0, %xmm4 518; SSE2-NEXT: unpcklps {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1] 519; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,1],xmm3[0,2] 520; SSE2-NEXT: movaps %xmm0, %xmm3 521; SSE2-NEXT: unpckhpd {{.*#+}} xmm3 = xmm3[1],xmm1[1] 522; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3],xmm1[3,3] 523; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2],xmm2[2,3] 524; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,1],xmm1[1,1] 525; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[2,0],xmm3[0,2] 526; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0,1,3] 527; SSE2-NEXT: movaps %xmm2, 16(%rdi) 528; SSE2-NEXT: movaps %xmm4, (%rdi) 529; SSE2-NEXT: movaps %xmm0, 32(%rdi) 530; SSE2-NEXT: retq 531; 532; SSE42-LABEL: v12i32: 533; SSE42: # %bb.0: 534; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,1,1] 535; SSE42-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,1,0,1] 536; SSE42-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm3[2,3],xmm4[4,5,6,7] 537; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,1,0,1] 538; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5],xmm4[6,7] 539; SSE42-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,2,2] 540; SSE42-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm0[4,5],xmm4[6,7] 541; SSE42-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm2[2,3],xmm4[4,5,6,7] 542; SSE42-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3],xmm1[3,3] 543; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3] 544; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,3,4,5],xmm1[6,7] 545; SSE42-NEXT: movdqa %xmm1, 32(%rdi) 546; SSE42-NEXT: movdqa %xmm4, 16(%rdi) 547; SSE42-NEXT: movdqa %xmm3, (%rdi) 548; SSE42-NEXT: retq 549; 550; AVX1-LABEL: v12i32: 551; AVX1: # %bb.0: 552; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,0,1] 553; AVX1-NEXT: vmovsldup {{.*#+}} ymm2 = ymm2[0,0,2,2,4,4,6,6] 554; AVX1-NEXT: vpermilps {{.*#+}} ymm3 = ymm0[0,u,u,1,5,u,u,6] 555; AVX1-NEXT: vblendps {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2,3,4,5],ymm2[6],ymm3[7] 556; AVX1-NEXT: vpermilps {{.*#+}} xmm3 = xmm1[0,1,0,1] 557; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm3 558; AVX1-NEXT: vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7] 559; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 560; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3],xmm3[3,3] 561; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm1[2,3,2,3] 562; AVX1-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3] 563; AVX1-NEXT: vmovaps %xmm0, 32(%rdi) 564; AVX1-NEXT: vmovaps %ymm2, (%rdi) 565; AVX1-NEXT: vzeroupper 566; AVX1-NEXT: retq 567; 568; AVX2-SLOW-LABEL: v12i32: 569; AVX2-SLOW: # %bb.0: 570; AVX2-SLOW-NEXT: vmovaps {{.*#+}} ymm2 = <0,4,u,1,5,u,2,6> 571; AVX2-SLOW-NEXT: vpermps %ymm0, %ymm2, %ymm2 572; AVX2-SLOW-NEXT: vbroadcastsd %xmm1, %ymm3 573; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7] 574; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm3 575; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3],xmm3[3,3] 576; AVX2-SLOW-NEXT: vpermilps {{.*#+}} xmm1 = xmm1[2,3,2,3] 577; AVX2-SLOW-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3] 578; AVX2-SLOW-NEXT: vmovaps %xmm0, 32(%rdi) 579; AVX2-SLOW-NEXT: vmovaps %ymm2, (%rdi) 580; AVX2-SLOW-NEXT: vzeroupper 581; AVX2-SLOW-NEXT: retq 582; 583; AVX2-FAST-ALL-LABEL: v12i32: 584; AVX2-FAST-ALL: # %bb.0: 585; AVX2-FAST-ALL-NEXT: vmovaps {{.*#+}} ymm2 = <0,4,u,1,5,u,2,6> 586; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm2, %ymm2 587; AVX2-FAST-ALL-NEXT: vbroadcastsd %xmm1, %ymm3 588; AVX2-FAST-ALL-NEXT: vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7] 589; AVX2-FAST-ALL-NEXT: vmovaps {{.*#+}} ymm3 = <u,3,7,u,u,u,u,u> 590; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm3, %ymm0 591; AVX2-FAST-ALL-NEXT: vpermilps {{.*#+}} xmm1 = xmm1[2,3,2,3] 592; AVX2-FAST-ALL-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3] 593; AVX2-FAST-ALL-NEXT: vmovaps %xmm0, 32(%rdi) 594; AVX2-FAST-ALL-NEXT: vmovaps %ymm2, (%rdi) 595; AVX2-FAST-ALL-NEXT: vzeroupper 596; AVX2-FAST-ALL-NEXT: retq 597; 598; AVX2-FAST-PERLANE-LABEL: v12i32: 599; AVX2-FAST-PERLANE: # %bb.0: 600; AVX2-FAST-PERLANE-NEXT: vmovaps {{.*#+}} ymm2 = <0,4,u,1,5,u,2,6> 601; AVX2-FAST-PERLANE-NEXT: vpermps %ymm0, %ymm2, %ymm2 602; AVX2-FAST-PERLANE-NEXT: vbroadcastsd %xmm1, %ymm3 603; AVX2-FAST-PERLANE-NEXT: vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7] 604; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm3 605; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3],xmm3[3,3] 606; AVX2-FAST-PERLANE-NEXT: vpermilps {{.*#+}} xmm1 = xmm1[2,3,2,3] 607; AVX2-FAST-PERLANE-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3] 608; AVX2-FAST-PERLANE-NEXT: vmovaps %xmm0, 32(%rdi) 609; AVX2-FAST-PERLANE-NEXT: vmovaps %ymm2, (%rdi) 610; AVX2-FAST-PERLANE-NEXT: vzeroupper 611; AVX2-FAST-PERLANE-NEXT: retq 612; 613; XOP-LABEL: v12i32: 614; XOP: # %bb.0: 615; XOP-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,0,1] 616; XOP-NEXT: vpermil2ps {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[u,1,5,u],ymm2[6],ymm0[6] 617; XOP-NEXT: vpermilps {{.*#+}} xmm3 = xmm1[0,1,0,1] 618; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm3 619; XOP-NEXT: vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7] 620; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3 621; XOP-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3],xmm3[3,3] 622; XOP-NEXT: vpermilps {{.*#+}} xmm1 = xmm1[2,3,2,3] 623; XOP-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3] 624; XOP-NEXT: vmovaps %xmm0, 32(%rdi) 625; XOP-NEXT: vmovaps %ymm2, (%rdi) 626; XOP-NEXT: vzeroupper 627; XOP-NEXT: retq 628 %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> 629 store <12 x i32> %r, ptr %p 630 ret void 631} 632 633define void @pr29025(<4 x i8> %a, <4 x i8> %b, <4 x i8> %c, ptr%p) nounwind { 634; SSE2-LABEL: pr29025: 635; SSE2: # %bb.0: 636; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 637; SSE2-NEXT: pxor %xmm1, %xmm1 638; 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] 639; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3] 640; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,3,1,3,4,5,6,7] 641; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,4,7] 642; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,3,2,1] 643; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,1,4,5,6,7] 644; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,4] 645; SSE2-NEXT: packuswb %xmm1, %xmm0 646; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [255,255,0,255,255,0,255,255,0,255,255,0,255,255,255,255] 647; SSE2-NEXT: pand %xmm1, %xmm0 648; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,0,1,1,4,5,6,7] 649; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,1,3] 650; SSE2-NEXT: pandn %xmm2, %xmm1 651; SSE2-NEXT: por %xmm0, %xmm1 652; SSE2-NEXT: movq %xmm1, (%rdi) 653; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3] 654; SSE2-NEXT: movd %xmm0, 8(%rdi) 655; SSE2-NEXT: retq 656; 657; SSE42-LABEL: pr29025: 658; SSE42: # %bb.0: 659; SSE42-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 660; 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] 661; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u] 662; SSE42-NEXT: pextrd $2, %xmm0, 8(%rdi) 663; SSE42-NEXT: movq %xmm0, (%rdi) 664; SSE42-NEXT: retq 665; 666; AVX-LABEL: pr29025: 667; AVX: # %bb.0: 668; AVX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 669; AVX-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] 670; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u] 671; AVX-NEXT: vpextrd $2, %xmm0, 8(%rdi) 672; AVX-NEXT: vmovq %xmm0, (%rdi) 673; AVX-NEXT: retq 674; 675; XOP-LABEL: pr29025: 676; XOP: # %bb.0: 677; XOP-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 678; 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] 679; XOP-NEXT: vpextrd $2, %xmm0, 8(%rdi) 680; XOP-NEXT: vmovq %xmm0, (%rdi) 681; XOP-NEXT: retq 682 %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> 683 %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> 684 %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> 685 store <12 x i8> %r, ptr %p, align 1 686 ret void 687} 688 689define void @interleave_24i8_out(ptr %p, ptr %q1, ptr %q2, ptr %q3) nounwind { 690; SSE2-LABEL: interleave_24i8_out: 691; SSE2: # %bb.0: 692; SSE2-NEXT: movdqu (%rdi), %xmm0 693; SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 694; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,0,255,255,0,255,255,255,255,255,255,255,255,255,255] 695; SSE2-NEXT: movdqa %xmm0, %xmm2 696; SSE2-NEXT: pand %xmm4, %xmm2 697; SSE2-NEXT: pandn %xmm1, %xmm4 698; SSE2-NEXT: por %xmm2, %xmm4 699; SSE2-NEXT: pxor %xmm2, %xmm2 700; 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] 701; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [65535,0,65535,65535,0,65535,65535,0] 702; SSE2-NEXT: pand %xmm5, %xmm4 703; SSE2-NEXT: movdqa %xmm0, %xmm3 704; 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] 705; SSE2-NEXT: pandn %xmm3, %xmm5 706; SSE2-NEXT: por %xmm4, %xmm5 707; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[0,2,1,3] 708; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,7,6,5] 709; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,3,2,1] 710; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,3,2,1,4,5,6,7] 711; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,6,5,4,7] 712; SSE2-NEXT: packuswb %xmm4, %xmm4 713; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [0,255,255,0,255,255,0,255,255,255,255,255,255,255,255,255] 714; SSE2-NEXT: movdqa %xmm0, %xmm6 715; SSE2-NEXT: pand %xmm5, %xmm6 716; SSE2-NEXT: pandn %xmm1, %xmm5 717; SSE2-NEXT: por %xmm6, %xmm5 718; SSE2-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3],xmm5[4],xmm2[4],xmm5[5],xmm2[5],xmm5[6],xmm2[6],xmm5[7],xmm2[7] 719; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [65535,65535,0,65535,65535,0,65535,65535] 720; SSE2-NEXT: pand %xmm6, %xmm5 721; SSE2-NEXT: pandn %xmm3, %xmm6 722; SSE2-NEXT: por %xmm5, %xmm6 723; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm6[2,1,0,3,4,5,6,7] 724; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,6,5,4,7] 725; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,3,2,1] 726; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[1,2,3,0,4,5,6,7] 727; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,6,7,4] 728; SSE2-NEXT: packuswb %xmm5, %xmm5 729; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [255,0,255,255,0,255,255,0,255,255,255,255,255,255,255,255] 730; SSE2-NEXT: pand %xmm6, %xmm0 731; SSE2-NEXT: pandn %xmm1, %xmm6 732; SSE2-NEXT: por %xmm0, %xmm6 733; SSE2-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm2[0],xmm6[1],xmm2[1],xmm6[2],xmm2[2],xmm6[3],xmm2[3],xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7] 734; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [0,65535,65535,0,65535,65535,0,65535] 735; SSE2-NEXT: pand %xmm0, %xmm6 736; SSE2-NEXT: pandn %xmm3, %xmm0 737; SSE2-NEXT: por %xmm6, %xmm0 738; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,0] 739; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,7,6,5] 740; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,0] 741; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[2,1,0,3,4,5,6,7] 742; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,4,7] 743; SSE2-NEXT: packuswb %xmm0, %xmm0 744; SSE2-NEXT: movq %xmm4, (%rsi) 745; SSE2-NEXT: movq %xmm5, (%rdx) 746; SSE2-NEXT: movq %xmm0, (%rcx) 747; SSE2-NEXT: retq 748; 749; SSE42-LABEL: interleave_24i8_out: 750; SSE42: # %bb.0: 751; SSE42-NEXT: movdqu (%rdi), %xmm0 752; SSE42-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 753; SSE42-NEXT: movdqa %xmm1, %xmm2 754; SSE42-NEXT: pshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,xmm2[2,5,u,u,u,u,u,u,u,u] 755; SSE42-NEXT: movdqa %xmm0, %xmm3 756; SSE42-NEXT: pshufb {{.*#+}} xmm3 = xmm3[0,3,6,9,12,15],zero,zero,xmm3[u,u,u,u,u,u,u,u] 757; SSE42-NEXT: por %xmm2, %xmm3 758; SSE42-NEXT: movdqa %xmm1, %xmm2 759; SSE42-NEXT: pshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,xmm2[0,3,6,u,u,u,u,u,u,u,u] 760; SSE42-NEXT: movdqa %xmm0, %xmm4 761; SSE42-NEXT: pshufb {{.*#+}} xmm4 = xmm4[1,4,7,10,13],zero,zero,zero,xmm4[u,u,u,u,u,u,u,u] 762; SSE42-NEXT: por %xmm2, %xmm4 763; SSE42-NEXT: pshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,xmm1[1,4,7,u,u,u,u,u,u,u,u] 764; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[2,5,8,11,14],zero,zero,zero,xmm0[u,u,u,u,u,u,u,u] 765; SSE42-NEXT: por %xmm1, %xmm0 766; SSE42-NEXT: movq %xmm3, (%rsi) 767; SSE42-NEXT: movq %xmm4, (%rdx) 768; SSE42-NEXT: movq %xmm0, (%rcx) 769; SSE42-NEXT: retq 770; 771; AVX-LABEL: interleave_24i8_out: 772; AVX: # %bb.0: 773; AVX-NEXT: vmovdqu (%rdi), %xmm0 774; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 775; AVX-NEXT: vpshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,xmm1[2,5,u,u,u,u,u,u,u,u] 776; AVX-NEXT: vpshufb {{.*#+}} xmm3 = xmm0[0,3,6,9,12,15],zero,zero,xmm0[u,u,u,u,u,u,u,u] 777; AVX-NEXT: vpor %xmm2, %xmm3, %xmm2 778; AVX-NEXT: vpshufb {{.*#+}} xmm3 = zero,zero,zero,zero,zero,xmm1[0,3,6,u,u,u,u,u,u,u,u] 779; AVX-NEXT: vpshufb {{.*#+}} xmm4 = xmm0[1,4,7,10,13],zero,zero,zero,xmm0[u,u,u,u,u,u,u,u] 780; AVX-NEXT: vpor %xmm3, %xmm4, %xmm3 781; AVX-NEXT: vpshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,xmm1[1,4,7,u,u,u,u,u,u,u,u] 782; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[2,5,8,11,14],zero,zero,zero,xmm0[u,u,u,u,u,u,u,u] 783; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 784; AVX-NEXT: vmovq %xmm2, (%rsi) 785; AVX-NEXT: vmovq %xmm3, (%rdx) 786; AVX-NEXT: vmovq %xmm0, (%rcx) 787; AVX-NEXT: retq 788; 789; XOP-LABEL: interleave_24i8_out: 790; XOP: # %bb.0: 791; XOP-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 792; XOP-NEXT: vmovdqu (%rdi), %xmm1 793; XOP-NEXT: vpperm {{.*#+}} xmm2 = xmm1[0,3,6,9,12,15],xmm0[2,5],xmm1[u,u,u,u,u,u,u,u] 794; XOP-NEXT: vpperm {{.*#+}} xmm3 = xmm1[1,4,7,10,13],xmm0[0,3,6],xmm1[u,u,u,u,u,u,u,u] 795; XOP-NEXT: vpperm {{.*#+}} xmm0 = xmm1[2,5,8,11,14],xmm0[1,4,7],xmm1[u,u,u,u,u,u,u,u] 796; XOP-NEXT: vmovq %xmm2, (%rsi) 797; XOP-NEXT: vmovq %xmm3, (%rdx) 798; XOP-NEXT: vmovq %xmm0, (%rcx) 799; XOP-NEXT: retq 800 %wide.vec = load <24 x i8>, ptr %p, align 4 801 %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> 802 %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> 803 %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> 804 store <8 x i8> %s1, ptr %q1, align 4 805 store <8 x i8> %s2, ptr %q2, align 4 806 store <8 x i8> %s3, ptr %q3, align 4 807 ret void 808} 809 810define void @interleave_24i8_in(ptr %p, ptr %q1, ptr %q2, ptr %q3) nounwind { 811; SSE2-LABEL: interleave_24i8_in: 812; SSE2: # %bb.0: 813; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 814; SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 815; SSE2-NEXT: movq {{.*#+}} xmm2 = mem[0],zero 816; SSE2-NEXT: pxor %xmm3, %xmm3 817; 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] 818; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,2,2] 819; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [65535,65535,0,65535,65535,0,65535,65535] 820; SSE2-NEXT: pand %xmm5, %xmm4 821; 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] 822; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm1[3,3,3,3,4,5,6,7] 823; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,4,4,4] 824; SSE2-NEXT: pandn %xmm3, %xmm5 825; SSE2-NEXT: por %xmm4, %xmm5 826; SSE2-NEXT: movdqa %xmm2, %xmm3 827; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3] 828; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,1,2,1] 829; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,1,2,2,4,5,6,7] 830; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,5,4,5] 831; SSE2-NEXT: packuswb %xmm5, %xmm3 832; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,0,255,255,0,255,255,0,255,255,0,255,255,0,255] 833; SSE2-NEXT: pand %xmm4, %xmm3 834; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,1,0,1] 835; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,0,0,0,4,5,6,7] 836; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,5,6,6] 837; SSE2-NEXT: pandn %xmm5, %xmm4 838; SSE2-NEXT: por %xmm3, %xmm4 839; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 840; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,1,3,3] 841; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[2,1,1,0,4,5,6,7] 842; SSE2-NEXT: packuswb %xmm1, %xmm1 843; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,255,0,255,255,0,255,255,255,255,255,255,255,255] 844; SSE2-NEXT: pand %xmm2, %xmm1 845; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[2,1,3,3,4,5,6,7] 846; SSE2-NEXT: pandn %xmm0, %xmm2 847; SSE2-NEXT: por %xmm1, %xmm2 848; SSE2-NEXT: movq %xmm2, 16(%rdi) 849; SSE2-NEXT: movdqu %xmm4, (%rdi) 850; SSE2-NEXT: retq 851; 852; SSE42-LABEL: interleave_24i8_in: 853; SSE42: # %bb.0: 854; SSE42-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 855; SSE42-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 856; SSE42-NEXT: movq {{.*#+}} xmm2 = mem[0],zero 857; SSE42-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 858; SSE42-NEXT: movdqa %xmm2, %xmm1 859; 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] 860; SSE42-NEXT: movdqa %xmm0, %xmm3 861; SSE42-NEXT: pshufb {{.*#+}} xmm3 = zero,zero,xmm3[0],zero,zero,xmm3[1],zero,zero,xmm3[2],zero,zero,xmm3[3],zero,zero,xmm3[4],zero 862; SSE42-NEXT: por %xmm1, %xmm3 863; SSE42-NEXT: pshufb {{.*#+}} xmm2 = xmm2[13],zero,xmm2[6,14],zero,xmm2[7,15],zero,xmm2[u,u,u,u,u,u,u,u] 864; SSE42-NEXT: pshufb {{.*#+}} xmm0 = zero,xmm0[5],zero,zero,xmm0[6],zero,zero,xmm0[7,u,u,u,u,u,u,u,u] 865; SSE42-NEXT: por %xmm2, %xmm0 866; SSE42-NEXT: movq %xmm0, 16(%rdi) 867; SSE42-NEXT: movdqu %xmm3, (%rdi) 868; SSE42-NEXT: retq 869; 870; AVX-LABEL: interleave_24i8_in: 871; AVX: # %bb.0: 872; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 873; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 874; AVX-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero 875; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 876; AVX-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] 877; AVX-NEXT: vpshufb {{.*#+}} xmm3 = zero,zero,xmm0[0],zero,zero,xmm0[1],zero,zero,xmm0[2],zero,zero,xmm0[3],zero,zero,xmm0[4],zero 878; AVX-NEXT: vpor %xmm3, %xmm2, %xmm2 879; AVX-NEXT: vpshufb {{.*#+}} xmm1 = xmm1[13],zero,xmm1[6,14],zero,xmm1[7,15],zero,xmm1[u,u,u,u,u,u,u,u] 880; AVX-NEXT: vpshufb {{.*#+}} xmm0 = zero,xmm0[5],zero,zero,xmm0[6],zero,zero,xmm0[7,u,u,u,u,u,u,u,u] 881; AVX-NEXT: vpor %xmm0, %xmm1, %xmm0 882; AVX-NEXT: vmovq %xmm0, 16(%rdi) 883; AVX-NEXT: vmovdqu %xmm2, (%rdi) 884; AVX-NEXT: retq 885; 886; XOP-LABEL: interleave_24i8_in: 887; XOP: # %bb.0: 888; XOP-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 889; XOP-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 890; XOP-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero 891; XOP-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 892; 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] 893; 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] 894; XOP-NEXT: vmovq %xmm0, 16(%rdi) 895; XOP-NEXT: vmovdqu %xmm2, (%rdi) 896; XOP-NEXT: retq 897 %s1 = load <8 x i8>, ptr %q1, align 4 898 %s2 = load <8 x i8>, ptr %q2, align 4 899 %s3 = load <8 x i8>, ptr %q3, align 4 900 %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> 901 %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> 902 %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> 903 store <24 x i8> %interleaved, ptr %p, align 4 904 ret void 905} 906 907 908define void @interleave_24i16_out(ptr %p, ptr %q1, ptr %q2, ptr %q3) nounwind { 909; SSE2-LABEL: interleave_24i16_out: 910; SSE2: # %bb.0: 911; SSE2-NEXT: movdqu (%rdi), %xmm3 912; SSE2-NEXT: movdqu 16(%rdi), %xmm2 913; SSE2-NEXT: movdqu 32(%rdi), %xmm8 914; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,0,65535,65535,0,65535,65535,0] 915; SSE2-NEXT: movdqa %xmm3, %xmm4 916; SSE2-NEXT: pand %xmm1, %xmm4 917; SSE2-NEXT: pandn %xmm2, %xmm1 918; SSE2-NEXT: por %xmm4, %xmm1 919; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,1,3] 920; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,5,6,7] 921; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,1,3] 922; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,3,2,1,4,5,6,7] 923; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm2[0,1,2,3,4,7,6,7] 924; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm8[0,1,2,1] 925; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,5,6,5] 926; SSE2-NEXT: shufps {{.*#+}} xmm5 = xmm5[3,0],xmm4[2,0] 927; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,0] 928; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535,0,65535,65535,0,65535,65535] 929; SSE2-NEXT: movdqa %xmm4, %xmm5 930; SSE2-NEXT: pandn %xmm2, %xmm5 931; SSE2-NEXT: movdqa %xmm3, %xmm6 932; SSE2-NEXT: pand %xmm4, %xmm6 933; SSE2-NEXT: por %xmm5, %xmm6 934; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm6[2,1,2,3,4,5,6,7] 935; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,5,4,7] 936; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,3,2,3] 937; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[1,2,3,0,4,5,6,7] 938; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,5,5,5] 939; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [65535,65535,65535,65535,65535,0,0,0] 940; SSE2-NEXT: pand %xmm6, %xmm5 941; SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm8[0,3,2,3,4,5,6,7] 942; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,1,0,3] 943; SSE2-NEXT: pshufhw {{.*#+}} xmm7 = xmm7[0,1,2,3,4,4,5,6] 944; SSE2-NEXT: movdqa %xmm6, %xmm0 945; SSE2-NEXT: pandn %xmm7, %xmm0 946; SSE2-NEXT: por %xmm5, %xmm0 947; SSE2-NEXT: pand %xmm4, %xmm2 948; SSE2-NEXT: pandn %xmm3, %xmm4 949; SSE2-NEXT: por %xmm2, %xmm4 950; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[3,1,2,0] 951; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,6,5,6,7] 952; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,1,0,3] 953; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[2,1,0,3,4,5,6,7] 954; SSE2-NEXT: pand %xmm6, %xmm2 955; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm8[0,1,2,3,4,7,6,7] 956; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,1,0,2] 957; SSE2-NEXT: pandn %xmm3, %xmm6 958; SSE2-NEXT: por %xmm2, %xmm6 959; SSE2-NEXT: movups %xmm1, (%rsi) 960; SSE2-NEXT: movdqu %xmm0, (%rdx) 961; SSE2-NEXT: movdqu %xmm6, (%rcx) 962; SSE2-NEXT: retq 963; 964; SSE42-LABEL: interleave_24i16_out: 965; SSE42: # %bb.0: 966; SSE42-NEXT: movdqu (%rdi), %xmm0 967; SSE42-NEXT: movdqu 16(%rdi), %xmm1 968; SSE42-NEXT: movdqu 32(%rdi), %xmm2 969; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,1,2,1] 970; SSE42-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,5,6,5] 971; SSE42-NEXT: movdqa %xmm0, %xmm4 972; SSE42-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0],xmm1[1],xmm4[2,3],xmm1[4],xmm4[5,6],xmm1[7] 973; SSE42-NEXT: pshufb {{.*#+}} xmm4 = xmm4[0,1,6,7,12,13,2,3,8,9,14,15,u,u,u,u] 974; SSE42-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5],xmm3[6,7] 975; SSE42-NEXT: movdqa %xmm2, %xmm3 976; SSE42-NEXT: pshufb {{.*#+}} xmm3 = xmm3[u,u,u,u,u,u,u,u,u,u,0,1,6,7,12,13] 977; SSE42-NEXT: movdqa %xmm0, %xmm5 978; SSE42-NEXT: pblendw {{.*#+}} xmm5 = xmm5[0,1],xmm1[2],xmm5[3,4],xmm1[5],xmm5[6,7] 979; SSE42-NEXT: pshufb {{.*#+}} xmm5 = xmm5[2,3,8,9,14,15,4,5,10,11,u,u,u,u,u,u] 980; SSE42-NEXT: pblendw {{.*#+}} xmm5 = xmm5[0,1,2,3,4],xmm3[5,6,7] 981; SSE42-NEXT: pshufb {{.*#+}} xmm2 = xmm2[u,u,u,u,u,u,u,u,u,u,2,3,8,9,14,15] 982; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7] 983; SSE42-NEXT: pshufb {{.*#+}} xmm1 = xmm1[4,5,10,11,0,1,6,7,12,13,u,u,u,u,u,u] 984; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3,4],xmm2[5,6,7] 985; SSE42-NEXT: movdqu %xmm4, (%rsi) 986; SSE42-NEXT: movdqu %xmm5, (%rdx) 987; SSE42-NEXT: movdqu %xmm1, (%rcx) 988; SSE42-NEXT: retq 989; 990; AVX1-LABEL: interleave_24i16_out: 991; AVX1: # %bb.0: 992; AVX1-NEXT: vmovdqu (%rdi), %xmm0 993; AVX1-NEXT: vmovdqu 16(%rdi), %xmm1 994; AVX1-NEXT: vmovdqu 32(%rdi), %xmm2 995; 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: vpshufb {{.*#+}} xmm4 = xmm2[u,u,u,u,u,u,u,u,u,u,0,1,6,7,12,13] 1001; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7] 1002; AVX1-NEXT: vpshufb {{.*#+}} xmm5 = xmm5[2,3,8,9,14,15,4,5,10,11,u,u,u,u,u,u] 1003; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3,4],xmm4[5,6,7] 1004; AVX1-NEXT: vpshufb {{.*#+}} xmm2 = xmm2[u,u,u,u,u,u,u,u,u,u,2,3,8,9,14,15] 1005; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7] 1006; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[4,5,10,11,0,1,6,7,12,13,u,u,u,u,u,u] 1007; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4],xmm2[5,6,7] 1008; AVX1-NEXT: vmovdqu %xmm3, (%rsi) 1009; AVX1-NEXT: vmovdqu %xmm4, (%rdx) 1010; AVX1-NEXT: vmovdqu %xmm0, (%rcx) 1011; AVX1-NEXT: retq 1012; 1013; AVX2-LABEL: interleave_24i16_out: 1014; AVX2: # %bb.0: 1015; AVX2-NEXT: vmovdqu (%rdi), %xmm0 1016; AVX2-NEXT: vmovdqu 16(%rdi), %xmm1 1017; AVX2-NEXT: vmovdqu 32(%rdi), %xmm2 1018; AVX2-NEXT: vpblendw {{.*#+}} xmm3 = xmm0[0,1],xmm2[2],xmm0[3,4],xmm2[5],xmm0[6,7] 1019; AVX2-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0],xmm1[1],xmm3[2,3],xmm1[4],xmm3[5,6],xmm1[7] 1020; AVX2-NEXT: vpshufb {{.*#+}} xmm3 = xmm3[0,1,6,7,12,13,2,3,8,9,14,15,4,5,10,11] 1021; AVX2-NEXT: vpblendw {{.*#+}} xmm4 = xmm2[0],xmm0[1,2],xmm2[3],xmm0[4,5],xmm2[6],xmm0[7] 1022; AVX2-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm1[2],xmm4[3,4],xmm1[5],xmm4[6,7] 1023; AVX2-NEXT: vpshufb {{.*#+}} xmm4 = xmm4[2,3,8,9,14,15,4,5,10,11,0,1,6,7,12,13] 1024; AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2,3],xmm2[4],xmm0[5,6],xmm2[7] 1025; AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3],xmm0[4,5],xmm1[6],xmm0[7] 1026; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[4,5,10,11,0,1,6,7,12,13,2,3,8,9,14,15] 1027; AVX2-NEXT: vmovdqu %xmm3, (%rsi) 1028; AVX2-NEXT: vmovdqu %xmm4, (%rdx) 1029; AVX2-NEXT: vmovdqu %xmm0, (%rcx) 1030; AVX2-NEXT: retq 1031; 1032; XOP-LABEL: interleave_24i16_out: 1033; XOP: # %bb.0: 1034; XOP-NEXT: vmovdqu (%rdi), %xmm0 1035; XOP-NEXT: vmovdqu 16(%rdi), %xmm1 1036; XOP-NEXT: vmovdqu 32(%rdi), %xmm2 1037; XOP-NEXT: vpblendw {{.*#+}} xmm3 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7] 1038; XOP-NEXT: vpperm {{.*#+}} xmm3 = xmm3[0,1,6,7,12,13,2,3,8,9,14,15],xmm2[4,5,10,11] 1039; XOP-NEXT: vpblendw {{.*#+}} xmm4 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7] 1040; XOP-NEXT: vpperm {{.*#+}} xmm4 = xmm4[2,3,8,9,14,15,4,5,10,11],xmm2[0,1,6,7,12,13] 1041; XOP-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7] 1042; XOP-NEXT: vpperm {{.*#+}} xmm0 = xmm0[4,5,10,11,0,1,6,7,12,13],xmm2[2,3,8,9,14,15] 1043; XOP-NEXT: vmovdqu %xmm3, (%rsi) 1044; XOP-NEXT: vmovdqu %xmm4, (%rdx) 1045; XOP-NEXT: vmovdqu %xmm0, (%rcx) 1046; XOP-NEXT: retq 1047 %wide.vec = load <24 x i16>, ptr %p, align 4 1048 %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> 1049 %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> 1050 %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> 1051 store <8 x i16> %s1, ptr %q1, align 4 1052 store <8 x i16> %s2, ptr %q2, align 4 1053 store <8 x i16> %s3, ptr %q3, align 4 1054 ret void 1055} 1056 1057define void @interleave_24i16_out_reverse(ptr %p, ptr %q1, ptr %q2, ptr %q3) nounwind { 1058; SSE2-LABEL: interleave_24i16_out_reverse: 1059; SSE2: # %bb.0: 1060; SSE2-NEXT: movdqu (%rdi), %xmm8 1061; SSE2-NEXT: movdqu 16(%rdi), %xmm1 1062; SSE2-NEXT: movdqu 32(%rdi), %xmm3 1063; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [65535,0,65535,65535,0,65535,65535,0] 1064; SSE2-NEXT: movdqa %xmm1, %xmm4 1065; SSE2-NEXT: pand %xmm2, %xmm4 1066; SSE2-NEXT: pandn %xmm3, %xmm2 1067; SSE2-NEXT: por %xmm4, %xmm2 1068; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,1,3] 1069; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[2,1,0,3,4,5,6,7] 1070; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,3,2,1] 1071; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm2[0,1,2,3,5,6,6,7] 1072; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm8[0,1,2,1] 1073; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,5,5,6] 1074; SSE2-NEXT: shufps {{.*#+}} xmm5 = xmm5[3,0],xmm4[2,0] 1075; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,0,1,2,4,5,6,7] 1076; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,1],xmm5[2,0] 1077; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535,0,65535,65535,0,65535,65535] 1078; SSE2-NEXT: movdqa %xmm4, %xmm5 1079; SSE2-NEXT: pandn %xmm1, %xmm5 1080; SSE2-NEXT: movdqa %xmm3, %xmm6 1081; SSE2-NEXT: pand %xmm4, %xmm6 1082; SSE2-NEXT: por %xmm5, %xmm6 1083; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm6[0,3,2,3,4,5,6,7] 1084; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,6,5,6,7] 1085; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,1,1] 1086; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[2,1,0,3,4,5,6,7] 1087; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [65535,65535,65535,65535,65535,0,0,0] 1088; SSE2-NEXT: pand %xmm6, %xmm5 1089; SSE2-NEXT: pshufhw {{.*#+}} xmm7 = xmm8[0,1,2,3,4,7,6,7] 1090; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,1,2,0] 1091; SSE2-NEXT: pshufhw {{.*#+}} xmm7 = xmm7[0,1,2,3,4,5,4,7] 1092; SSE2-NEXT: movdqa %xmm6, %xmm0 1093; SSE2-NEXT: pandn %xmm7, %xmm0 1094; SSE2-NEXT: por %xmm5, %xmm0 1095; SSE2-NEXT: pand %xmm4, %xmm1 1096; SSE2-NEXT: pandn %xmm3, %xmm4 1097; SSE2-NEXT: por %xmm1, %xmm4 1098; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[3,1,2,0] 1099; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[2,1,2,3,4,5,6,7] 1100; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 1101; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,0,1,2,4,5,6,7] 1102; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,7,7,7] 1103; SSE2-NEXT: pand %xmm6, %xmm1 1104; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm8[0,3,2,3,4,5,6,7] 1105; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,1,0,3] 1106; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,6,5,4] 1107; SSE2-NEXT: pandn %xmm3, %xmm6 1108; SSE2-NEXT: por %xmm1, %xmm6 1109; SSE2-NEXT: movups %xmm2, (%rsi) 1110; SSE2-NEXT: movdqu %xmm0, (%rdx) 1111; SSE2-NEXT: movdqu %xmm6, (%rcx) 1112; SSE2-NEXT: retq 1113; 1114; SSE42-LABEL: interleave_24i16_out_reverse: 1115; SSE42: # %bb.0: 1116; SSE42-NEXT: movdqu (%rdi), %xmm0 1117; SSE42-NEXT: movdqu 16(%rdi), %xmm1 1118; SSE42-NEXT: movdqu 32(%rdi), %xmm2 1119; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,1,2,1] 1120; SSE42-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,5,5,6] 1121; SSE42-NEXT: movdqa %xmm1, %xmm4 1122; SSE42-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0],xmm2[1],xmm4[2,3],xmm2[4],xmm4[5,6],xmm2[7] 1123; SSE42-NEXT: pshufb {{.*#+}} xmm4 = xmm4[14,15,8,9,2,3,12,13,6,7,0,1,u,u,u,u] 1124; SSE42-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5],xmm3[6,7] 1125; SSE42-NEXT: movdqa %xmm0, %xmm3 1126; SSE42-NEXT: pshufb {{.*#+}} xmm3 = xmm3[u,u,u,u,u,u,u,u,u,u,14,15,8,9,2,3] 1127; SSE42-NEXT: movdqa %xmm2, %xmm5 1128; SSE42-NEXT: pblendw {{.*#+}} xmm5 = xmm5[0,1],xmm1[2],xmm5[3,4],xmm1[5],xmm5[6,7] 1129; SSE42-NEXT: pshufb {{.*#+}} xmm5 = xmm5[12,13,6,7,0,1,10,11,4,5,u,u,u,u,u,u] 1130; SSE42-NEXT: pblendw {{.*#+}} xmm5 = xmm5[0,1,2,3,4],xmm3[5,6,7] 1131; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[u,u,u,u,u,u,u,u,u,u,12,13,6,7,0,1] 1132; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2],xmm1[3,4],xmm2[5],xmm1[6,7] 1133; SSE42-NEXT: pshufb {{.*#+}} xmm1 = xmm1[10,11,4,5,14,15,8,9,2,3,u,u,u,u,u,u] 1134; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3,4],xmm0[5,6,7] 1135; SSE42-NEXT: movdqu %xmm4, (%rsi) 1136; SSE42-NEXT: movdqu %xmm5, (%rdx) 1137; SSE42-NEXT: movdqu %xmm1, (%rcx) 1138; SSE42-NEXT: retq 1139; 1140; AVX1-LABEL: interleave_24i16_out_reverse: 1141; AVX1: # %bb.0: 1142; AVX1-NEXT: vmovdqu (%rdi), %xmm0 1143; AVX1-NEXT: vmovdqu 16(%rdi), %xmm1 1144; AVX1-NEXT: vmovdqu 32(%rdi), %xmm2 1145; AVX1-NEXT: vpshufb {{.*#+}} xmm3 = xmm2[14,15,8,9,2,3,u,u,u,u,u,u,u,u,u,u] 1146; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7] 1147; AVX1-NEXT: vpshufb {{.*#+}} xmm4 = xmm4[u,u,u,u,u,u,12,13,6,7,0,1,10,11,4,5] 1148; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1,2],xmm4[3,4,5,6,7] 1149; AVX1-NEXT: vpshufb {{.*#+}} xmm4 = xmm2[12,13,6,7,0,1,u,u,u,u,u,u,u,u,u,u] 1150; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7] 1151; AVX1-NEXT: vpshufb {{.*#+}} xmm5 = xmm5[u,u,u,u,u,u,10,11,4,5,14,15,8,9,2,3] 1152; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1,2],xmm5[3,4,5,6,7] 1153; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,1,2,3] 1154; AVX1-NEXT: vpshuflw {{.*#+}} xmm2 = xmm2[1,2,2,3,4,5,6,7] 1155; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7] 1156; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[u,u,u,u,14,15,8,9,2,3,12,13,6,7,0,1] 1157; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3,4,5,6,7] 1158; AVX1-NEXT: vmovdqu %xmm3, (%rsi) 1159; AVX1-NEXT: vmovdqu %xmm4, (%rdx) 1160; AVX1-NEXT: vmovdqu %xmm0, (%rcx) 1161; AVX1-NEXT: retq 1162; 1163; AVX2-LABEL: interleave_24i16_out_reverse: 1164; AVX2: # %bb.0: 1165; AVX2-NEXT: vmovdqu (%rdi), %xmm0 1166; AVX2-NEXT: vmovdqu 16(%rdi), %xmm1 1167; AVX2-NEXT: vmovdqu 32(%rdi), %xmm2 1168; AVX2-NEXT: vpblendw {{.*#+}} xmm3 = xmm0[0],xmm2[1],xmm0[2,3],xmm2[4],xmm0[5,6],xmm2[7] 1169; AVX2-NEXT: vpblendw {{.*#+}} xmm3 = xmm1[0],xmm3[1,2],xmm1[3],xmm3[4,5],xmm1[6],xmm3[7] 1170; AVX2-NEXT: vpshufb {{.*#+}} xmm3 = xmm3[14,15,8,9,2,3,12,13,6,7,0,1,10,11,4,5] 1171; AVX2-NEXT: vpblendw {{.*#+}} xmm4 = xmm2[0],xmm0[1,2],xmm2[3],xmm0[4,5],xmm2[6],xmm0[7] 1172; AVX2-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm1[2],xmm4[3,4],xmm1[5],xmm4[6,7] 1173; AVX2-NEXT: vpshufb {{.*#+}} xmm4 = xmm4[12,13,6,7,0,1,10,11,4,5,14,15,8,9,2,3] 1174; AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2],xmm0[3,4],xmm2[5],xmm0[6,7] 1175; AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7] 1176; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[10,11,4,5,14,15,8,9,2,3,12,13,6,7,0,1] 1177; AVX2-NEXT: vmovdqu %xmm3, (%rsi) 1178; AVX2-NEXT: vmovdqu %xmm4, (%rdx) 1179; AVX2-NEXT: vmovdqu %xmm0, (%rcx) 1180; AVX2-NEXT: retq 1181; 1182; XOP-LABEL: interleave_24i16_out_reverse: 1183; XOP: # %bb.0: 1184; XOP-NEXT: vmovdqu (%rdi), %xmm0 1185; XOP-NEXT: vmovdqu 16(%rdi), %xmm1 1186; XOP-NEXT: vmovdqu 32(%rdi), %xmm2 1187; XOP-NEXT: vpblendw {{.*#+}} xmm3 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7] 1188; XOP-NEXT: vpperm {{.*#+}} xmm3 = xmm2[14,15,8,9,2,3],xmm3[12,13,6,7,0,1,10,11,4,5] 1189; XOP-NEXT: vpblendw {{.*#+}} xmm4 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7] 1190; XOP-NEXT: vpperm {{.*#+}} xmm4 = xmm2[12,13,6,7,0,1],xmm4[10,11,4,5,14,15,8,9,2,3] 1191; XOP-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7] 1192; XOP-NEXT: vpperm {{.*#+}} xmm0 = xmm2[10,11,4,5],xmm0[14,15,8,9,2,3,12,13,6,7,0,1] 1193; XOP-NEXT: vmovdqu %xmm3, (%rsi) 1194; XOP-NEXT: vmovdqu %xmm4, (%rdx) 1195; XOP-NEXT: vmovdqu %xmm0, (%rcx) 1196; XOP-NEXT: retq 1197 %wide.vec.reverse = load <24 x i16>, ptr %p, align 4 1198 %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> 1199 %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> 1200 %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> 1201 %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> 1202 store <8 x i16> %s1, ptr %q1, align 4 1203 store <8 x i16> %s2, ptr %q2, align 4 1204 store <8 x i16> %s3, ptr %q3, align 4 1205 ret void 1206} 1207 1208define void @interleave_24i16_in(ptr %p, ptr %q1, ptr %q2, ptr %q3) nounwind { 1209; SSE2-LABEL: interleave_24i16_in: 1210; SSE2: # %bb.0: 1211; SSE2-NEXT: movdqu (%rsi), %xmm0 1212; SSE2-NEXT: movdqu (%rdx), %xmm2 1213; SSE2-NEXT: movdqu (%rcx), %xmm3 1214; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,0,0,0] 1215; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535,0,65535,65535,0,65535,65535] 1216; SSE2-NEXT: movdqa %xmm4, %xmm5 1217; SSE2-NEXT: pandn %xmm1, %xmm5 1218; SSE2-NEXT: movdqa %xmm0, %xmm1 1219; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 1220; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,2,1] 1221; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,2,2,4,5,6,7] 1222; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,5,4,5] 1223; SSE2-NEXT: pand %xmm4, %xmm1 1224; SSE2-NEXT: por %xmm5, %xmm1 1225; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,2,2] 1226; SSE2-NEXT: pand %xmm4, %xmm5 1227; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm2[3,3,3,3,4,5,6,7] 1228; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,4,4,4,4] 1229; SSE2-NEXT: pandn %xmm6, %xmm4 1230; SSE2-NEXT: por %xmm5, %xmm4 1231; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [0,65535,65535,0,65535,65535,0,65535] 1232; SSE2-NEXT: pand %xmm5, %xmm4 1233; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[1,1,2,2] 1234; SSE2-NEXT: pandn %xmm6, %xmm5 1235; SSE2-NEXT: por %xmm4, %xmm5 1236; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,2,3,3] 1237; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [65535,0,65535,65535,0,65535,65535,0] 1238; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 1239; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,1,3,3] 1240; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[2,1,1,0,4,5,6,7] 1241; SSE2-NEXT: pand %xmm4, %xmm0 1242; SSE2-NEXT: pandn %xmm3, %xmm4 1243; SSE2-NEXT: por %xmm0, %xmm4 1244; SSE2-NEXT: movdqu %xmm4, 32(%rdi) 1245; SSE2-NEXT: movdqu %xmm5, 16(%rdi) 1246; SSE2-NEXT: movdqu %xmm1, (%rdi) 1247; SSE2-NEXT: retq 1248; 1249; SSE42-LABEL: interleave_24i16_in: 1250; SSE42: # %bb.0: 1251; SSE42-NEXT: movdqu (%rsi), %xmm0 1252; SSE42-NEXT: movdqu (%rdx), %xmm1 1253; SSE42-NEXT: movdqu (%rcx), %xmm2 1254; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,2,2] 1255; SSE42-NEXT: pshuflw {{.*#+}} xmm4 = xmm1[3,3,3,3,4,5,6,7] 1256; SSE42-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,4,4,4] 1257; SSE42-NEXT: pblendw {{.*#+}} xmm4 = xmm3[0,1],xmm4[2],xmm3[3,4],xmm4[5],xmm3[6,7] 1258; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,2,2] 1259; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1,2],xmm3[3],xmm4[4,5],xmm3[6],xmm4[7] 1260; SSE42-NEXT: movdqa %xmm0, %xmm4 1261; SSE42-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3] 1262; SSE42-NEXT: pshufb {{.*#+}} xmm4 = xmm4[0,1,2,3,u,u,4,5,6,7,u,u,8,9,10,11] 1263; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,0,0] 1264; SSE42-NEXT: pblendw {{.*#+}} xmm5 = xmm4[0,1],xmm5[2],xmm4[3,4],xmm5[5],xmm4[6,7] 1265; SSE42-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1266; SSE42-NEXT: pshufb {{.*#+}} xmm1 = xmm1[4,5,u,u,10,11,8,9,u,u,14,15,12,13,u,u] 1267; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,2,3,3] 1268; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4],xmm1[5,6],xmm0[7] 1269; SSE42-NEXT: movdqu %xmm0, 32(%rdi) 1270; SSE42-NEXT: movdqu %xmm5, (%rdi) 1271; SSE42-NEXT: movdqu %xmm3, 16(%rdi) 1272; SSE42-NEXT: retq 1273; 1274; AVX1-LABEL: interleave_24i16_in: 1275; AVX1: # %bb.0: 1276; AVX1-NEXT: vmovdqu (%rsi), %xmm0 1277; AVX1-NEXT: vmovdqu (%rdx), %xmm1 1278; AVX1-NEXT: vmovdqu (%rcx), %xmm2 1279; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,2,2] 1280; AVX1-NEXT: vpshuflw {{.*#+}} xmm4 = xmm1[3,3,3,3,4,5,6,7] 1281; AVX1-NEXT: vpshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,4,4,4] 1282; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2],xmm3[3,4],xmm4[5],xmm3[6,7] 1283; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm2[1,1,2,2] 1284; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0],xmm3[1,2],xmm4[3],xmm3[4,5],xmm4[6],xmm3[7] 1285; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm4 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1286; AVX1-NEXT: vpshufb {{.*#+}} xmm4 = xmm4[4,5,u,u,10,11,8,9,u,u,14,15,12,13,u,u] 1287; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm2[2,2,3,3] 1288; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0],xmm5[1],xmm4[2,3],xmm5[4],xmm4[5,6],xmm5[7] 1289; AVX1-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 1290; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,u,u,4,5,6,7,u,u,8,9,10,11] 1291; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm2[0,0,0,0] 1292; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7] 1293; AVX1-NEXT: vmovdqu %xmm0, (%rdi) 1294; AVX1-NEXT: vmovdqu %xmm4, 32(%rdi) 1295; AVX1-NEXT: vmovdqu %xmm3, 16(%rdi) 1296; AVX1-NEXT: retq 1297; 1298; AVX2-SLOW-LABEL: interleave_24i16_in: 1299; AVX2-SLOW: # %bb.0: 1300; AVX2-SLOW-NEXT: vmovdqu (%rsi), %xmm0 1301; AVX2-SLOW-NEXT: vmovdqu (%rdx), %xmm1 1302; AVX2-SLOW-NEXT: vmovdqu (%rcx), %xmm2 1303; AVX2-SLOW-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm3 1304; AVX2-SLOW-NEXT: vpshufb {{.*#+}} ymm4 = ymm3[0,1,u,u,6,7,2,3,u,u,8,9,4,5,u,u,16,17,u,u,22,23,18,19,u,u,24,25,20,21,u,u] 1305; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm3 = ymm3[2,3,0,1] 1306; AVX2-SLOW-NEXT: vpshufb {{.*#+}} ymm3 = ymm3[u,u,0,1,u,u,u,u,2,3,u,u,u,u,4,5,u,u,22,23,u,u,u,u,24,25,u,u,u,u,26,27] 1307; AVX2-SLOW-NEXT: vpblendw {{.*#+}} ymm3 = ymm4[0],ymm3[1],ymm4[2,3],ymm3[4],ymm4[5,6],ymm3[7],ymm4[8],ymm3[9],ymm4[10,11],ymm3[12],ymm4[13,14],ymm3[15] 1308; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm4 = <u,0,0,u,1,1,u,2> 1309; AVX2-SLOW-NEXT: vpermd %ymm2, %ymm4, %ymm4 1310; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm5 = [255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255] 1311; AVX2-SLOW-NEXT: vpblendvb %ymm5, %ymm3, %ymm4, %ymm3 1312; AVX2-SLOW-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1313; AVX2-SLOW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[4,5,u,u,10,11,8,9,u,u,14,15,12,13,u,u] 1314; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm2[2,2,3,3] 1315; AVX2-SLOW-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7] 1316; AVX2-SLOW-NEXT: vmovdqu %xmm0, 32(%rdi) 1317; AVX2-SLOW-NEXT: vmovdqu %ymm3, (%rdi) 1318; AVX2-SLOW-NEXT: vzeroupper 1319; AVX2-SLOW-NEXT: retq 1320; 1321; AVX2-FAST-ALL-LABEL: interleave_24i16_in: 1322; AVX2-FAST-ALL: # %bb.0: 1323; AVX2-FAST-ALL-NEXT: vmovdqu (%rsi), %xmm0 1324; AVX2-FAST-ALL-NEXT: vmovdqu (%rdx), %xmm1 1325; AVX2-FAST-ALL-NEXT: vmovdqu (%rcx), %xmm2 1326; AVX2-FAST-ALL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm3 1327; AVX2-FAST-ALL-NEXT: vmovdqa {{.*#+}} ymm4 = <u,0,0,u,1,1,u,2> 1328; AVX2-FAST-ALL-NEXT: vpermd %ymm2, %ymm4, %ymm4 1329; AVX2-FAST-ALL-NEXT: vmovdqa {{.*#+}} ymm5 = [0,4,1,5,1,5,2,6] 1330; AVX2-FAST-ALL-NEXT: vpermd %ymm3, %ymm5, %ymm3 1331; 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] 1332; AVX2-FAST-ALL-NEXT: vmovdqa {{.*#+}} ymm5 = [255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255] 1333; AVX2-FAST-ALL-NEXT: vpblendvb %ymm5, %ymm3, %ymm4, %ymm3 1334; AVX2-FAST-ALL-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1335; AVX2-FAST-ALL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[4,5,u,u,10,11,8,9,u,u,14,15,12,13,u,u] 1336; AVX2-FAST-ALL-NEXT: vpshufd {{.*#+}} xmm1 = xmm2[2,2,3,3] 1337; AVX2-FAST-ALL-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7] 1338; AVX2-FAST-ALL-NEXT: vmovdqu %xmm0, 32(%rdi) 1339; AVX2-FAST-ALL-NEXT: vmovdqu %ymm3, (%rdi) 1340; AVX2-FAST-ALL-NEXT: vzeroupper 1341; AVX2-FAST-ALL-NEXT: retq 1342; 1343; AVX2-FAST-PERLANE-LABEL: interleave_24i16_in: 1344; AVX2-FAST-PERLANE: # %bb.0: 1345; AVX2-FAST-PERLANE-NEXT: vmovdqu (%rsi), %xmm0 1346; AVX2-FAST-PERLANE-NEXT: vmovdqu (%rdx), %xmm1 1347; AVX2-FAST-PERLANE-NEXT: vmovdqu (%rcx), %xmm2 1348; AVX2-FAST-PERLANE-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm3 1349; AVX2-FAST-PERLANE-NEXT: vpshufb {{.*#+}} ymm4 = ymm3[0,1,u,u,6,7,2,3,u,u,8,9,4,5,u,u,16,17,u,u,22,23,18,19,u,u,24,25,20,21,u,u] 1350; AVX2-FAST-PERLANE-NEXT: vpermq {{.*#+}} ymm3 = ymm3[2,3,0,1] 1351; AVX2-FAST-PERLANE-NEXT: vpshufb {{.*#+}} ymm3 = ymm3[u,u,0,1,u,u,u,u,2,3,u,u,u,u,4,5,u,u,22,23,u,u,u,u,24,25,u,u,u,u,26,27] 1352; AVX2-FAST-PERLANE-NEXT: vpblendw {{.*#+}} ymm3 = ymm4[0],ymm3[1],ymm4[2,3],ymm3[4],ymm4[5,6],ymm3[7],ymm4[8],ymm3[9],ymm4[10,11],ymm3[12],ymm4[13,14],ymm3[15] 1353; AVX2-FAST-PERLANE-NEXT: vmovdqa {{.*#+}} ymm4 = <u,0,0,u,1,1,u,2> 1354; AVX2-FAST-PERLANE-NEXT: vpermd %ymm2, %ymm4, %ymm4 1355; AVX2-FAST-PERLANE-NEXT: vmovdqa {{.*#+}} ymm5 = [255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255] 1356; AVX2-FAST-PERLANE-NEXT: vpblendvb %ymm5, %ymm3, %ymm4, %ymm3 1357; AVX2-FAST-PERLANE-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1358; AVX2-FAST-PERLANE-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[4,5,u,u,10,11,8,9,u,u,14,15,12,13,u,u] 1359; AVX2-FAST-PERLANE-NEXT: vpshufd {{.*#+}} xmm1 = xmm2[2,2,3,3] 1360; AVX2-FAST-PERLANE-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7] 1361; AVX2-FAST-PERLANE-NEXT: vmovdqu %xmm0, 32(%rdi) 1362; AVX2-FAST-PERLANE-NEXT: vmovdqu %ymm3, (%rdi) 1363; AVX2-FAST-PERLANE-NEXT: vzeroupper 1364; AVX2-FAST-PERLANE-NEXT: retq 1365; 1366; XOP-LABEL: interleave_24i16_in: 1367; XOP: # %bb.0: 1368; XOP-NEXT: vmovdqu (%rsi), %xmm0 1369; XOP-NEXT: vmovdqu (%rdx), %xmm1 1370; XOP-NEXT: vmovdqu (%rcx), %xmm2 1371; 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] 1372; XOP-NEXT: vpshufd {{.*#+}} xmm4 = xmm2[1,1,2,2] 1373; XOP-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0],xmm3[1,2],xmm4[3],xmm3[4,5],xmm4[6],xmm3[7] 1374; XOP-NEXT: vpunpcklwd {{.*#+}} xmm4 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 1375; 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] 1376; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 1377; XOP-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1378; 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] 1379; XOP-NEXT: vmovdqu %xmm0, 32(%rdi) 1380; XOP-NEXT: vmovups %ymm3, (%rdi) 1381; XOP-NEXT: vzeroupper 1382; XOP-NEXT: retq 1383 %s1 = load <8 x i16>, ptr %q1, align 4 1384 %s2 = load <8 x i16>, ptr %q2, align 4 1385 %s3 = load <8 x i16>, ptr %q3, align 4 1386 %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> 1387 %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> 1388 %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> 1389 store <24 x i16> %interleaved, ptr %p, align 4 1390 ret void 1391} 1392 1393define void @interleave_24i32_out(ptr %p, ptr %q1, ptr %q2, ptr %q3) nounwind { 1394; SSE2-LABEL: interleave_24i32_out: 1395; SSE2: # %bb.0: 1396; SSE2-NEXT: movdqu 64(%rdi), %xmm9 1397; SSE2-NEXT: movups 80(%rdi), %xmm8 1398; SSE2-NEXT: movdqu (%rdi), %xmm0 1399; SSE2-NEXT: movdqu 16(%rdi), %xmm10 1400; SSE2-NEXT: movups 32(%rdi), %xmm5 1401; SSE2-NEXT: movdqu 48(%rdi), %xmm3 1402; SSE2-NEXT: movaps %xmm5, %xmm6 1403; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[2,3,2,3] 1404; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm10[1,1,1,1] 1405; SSE2-NEXT: punpckldq {{.*#+}} xmm7 = xmm7[0],xmm4[0],xmm7[1],xmm4[1] 1406; SSE2-NEXT: shufps {{.*#+}} xmm7 = xmm7[0,1],xmm5[0,3] 1407; SSE2-NEXT: shufps {{.*#+}} xmm5 = xmm5[1,0],xmm10[2,0] 1408; SSE2-NEXT: movdqa %xmm0, %xmm4 1409; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,3],xmm5[2,0] 1410; SSE2-NEXT: movaps %xmm8, %xmm5 1411; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3] 1412; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm9[1,1,1,1] 1413; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 1414; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm8[0,3] 1415; SSE2-NEXT: shufps {{.*#+}} xmm8 = xmm8[1,0],xmm9[2,0] 1416; SSE2-NEXT: movdqa %xmm3, %xmm2 1417; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm8[2,0] 1418; SSE2-NEXT: shufps {{.*#+}} xmm5 = xmm5[2,1],xmm9[3,3] 1419; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,0],xmm9[0,0] 1420; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm5[2,0] 1421; SSE2-NEXT: shufps {{.*#+}} xmm6 = xmm6[2,1],xmm10[3,3] 1422; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm10[0,0] 1423; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm6[2,0] 1424; SSE2-NEXT: movups %xmm2, 16(%rsi) 1425; SSE2-NEXT: movups %xmm4, (%rsi) 1426; SSE2-NEXT: movups %xmm3, 16(%rdx) 1427; SSE2-NEXT: movups %xmm0, (%rdx) 1428; SSE2-NEXT: movups %xmm1, 16(%rcx) 1429; SSE2-NEXT: movups %xmm7, (%rcx) 1430; SSE2-NEXT: retq 1431; 1432; SSE42-LABEL: interleave_24i32_out: 1433; SSE42: # %bb.0: 1434; SSE42-NEXT: movups 80(%rdi), %xmm8 1435; SSE42-NEXT: movdqu 64(%rdi), %xmm9 1436; SSE42-NEXT: movdqu (%rdi), %xmm3 1437; SSE42-NEXT: movdqu 16(%rdi), %xmm2 1438; SSE42-NEXT: movups 32(%rdi), %xmm10 1439; SSE42-NEXT: movdqu 48(%rdi), %xmm5 1440; SSE42-NEXT: movdqa %xmm2, %xmm6 1441; SSE42-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1],xmm3[2,3],xmm6[4,5,6,7] 1442; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm3[2,3,2,3] 1443; SSE42-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,3],xmm2[2,3] 1444; SSE42-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1,2],xmm10[1] 1445; SSE42-NEXT: movdqa %xmm9, %xmm1 1446; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,3],xmm1[4,5,6,7] 1447; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm5[2,3,2,3] 1448; SSE42-NEXT: shufps {{.*#+}} xmm5 = xmm5[0,3],xmm9[2,3] 1449; SSE42-NEXT: insertps {{.*#+}} xmm5 = xmm5[0,1,2],xmm8[1] 1450; SSE42-NEXT: pshufd {{.*#+}} xmm4 = xmm10[2,2,2,2] 1451; SSE42-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,0,3,3] 1452; SSE42-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3,4,5],xmm4[6,7] 1453; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,0,3,3] 1454; SSE42-NEXT: pshufd {{.*#+}} xmm4 = xmm8[2,2,2,2] 1455; SSE42-NEXT: pblendw {{.*#+}} xmm4 = xmm1[0,1,2,3,4,5],xmm4[6,7] 1456; SSE42-NEXT: pblendw {{.*#+}} xmm7 = xmm7[0,1],xmm2[2,3],xmm7[4,5,6,7] 1457; SSE42-NEXT: shufps {{.*#+}} xmm7 = xmm7[0,1],xmm10[0,3] 1458; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm9[2,3],xmm0[4,5,6,7] 1459; SSE42-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm8[0,3] 1460; SSE42-NEXT: movups %xmm5, 16(%rsi) 1461; SSE42-NEXT: movups %xmm3, (%rsi) 1462; SSE42-NEXT: movdqu %xmm4, 16(%rdx) 1463; SSE42-NEXT: movdqu %xmm6, (%rdx) 1464; SSE42-NEXT: movups %xmm0, 16(%rcx) 1465; SSE42-NEXT: movups %xmm7, (%rcx) 1466; SSE42-NEXT: retq 1467; 1468; AVX1-LABEL: interleave_24i32_out: 1469; AVX1: # %bb.0: 1470; AVX1-NEXT: vmovups 64(%rdi), %ymm0 1471; AVX1-NEXT: vmovups 32(%rdi), %ymm1 1472; AVX1-NEXT: vmovups (%rdi), %ymm2 1473; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm2[0],ymm1[1],ymm2[2,3],ymm1[4],ymm2[5,6],ymm1[7] 1474; AVX1-NEXT: vmovups 16(%rdi), %xmm4 1475; AVX1-NEXT: vshufps {{.*#+}} ymm4 = ymm4[2,1],ymm1[1,3],ymm4[6,5],ymm1[5,7] 1476; AVX1-NEXT: vshufps {{.*#+}} ymm3 = ymm3[0,3],ymm4[0,2],ymm3[4,7],ymm4[4,6] 1477; AVX1-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm0[2,3,0,1] 1478; AVX1-NEXT: vshufps {{.*#+}} ymm5 = ymm0[1,0],ymm4[2,0],ymm0[5,4],ymm4[6,4] 1479; AVX1-NEXT: vpermilps {{.*#+}} ymm5 = ymm5[0,1,2,0,4,5,6,4] 1480; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4,5],ymm5[6,7] 1481; AVX1-NEXT: vshufps {{.*#+}} ymm5 = ymm0[2,0],ymm4[3,0],ymm0[6,4],ymm4[7,4] 1482; AVX1-NEXT: vshufps {{.*#+}} ymm5 = ymm4[0,0],ymm5[2,0],ymm4[4,4],ymm5[6,4] 1483; AVX1-NEXT: vmovups 16(%rdi), %xmm6 1484; AVX1-NEXT: vblendps {{.*#+}} ymm7 = ymm2[0,1],ymm1[2],ymm2[3,4],ymm1[5],ymm2[6,7] 1485; AVX1-NEXT: vshufps {{.*#+}} ymm7 = ymm7[1,2],ymm6[0,3],ymm7[5,6],ymm6[4,7] 1486; AVX1-NEXT: vpermilps {{.*#+}} ymm7 = ymm7[0,2,3,1,4,6,7,5] 1487; AVX1-NEXT: vblendps {{.*#+}} ymm5 = ymm7[0,1,2,3,4],ymm5[5,6,7] 1488; AVX1-NEXT: vblendps {{.*#+}} ymm2 = ymm1[0,1],ymm2[2],ymm1[3,4],ymm2[5],ymm1[6,7] 1489; AVX1-NEXT: vshufps {{.*#+}} ymm2 = ymm6[1,0],ymm2[2,0],ymm6[5,4],ymm2[6,4] 1490; AVX1-NEXT: vshufps {{.*#+}} ymm1 = ymm2[2,0],ymm1[0,3],ymm2[6,4],ymm1[4,7] 1491; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm4[0,1],ymm0[0,3],ymm4[4,5],ymm0[4,7] 1492; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3,4],ymm0[5,6,7] 1493; AVX1-NEXT: vmovups %ymm3, (%rsi) 1494; AVX1-NEXT: vmovups %ymm5, (%rdx) 1495; AVX1-NEXT: vmovups %ymm0, (%rcx) 1496; AVX1-NEXT: vzeroupper 1497; AVX1-NEXT: retq 1498; 1499; AVX2-SLOW-LABEL: interleave_24i32_out: 1500; AVX2-SLOW: # %bb.0: 1501; AVX2-SLOW-NEXT: vmovups (%rdi), %ymm0 1502; AVX2-SLOW-NEXT: vmovups 32(%rdi), %ymm1 1503; AVX2-SLOW-NEXT: vmovups 64(%rdi), %ymm2 1504; AVX2-SLOW-NEXT: vbroadcastsd {{.*#+}} ymm3 = [21474836482,21474836482,21474836482,21474836482] 1505; AVX2-SLOW-NEXT: vpermps %ymm2, %ymm3, %ymm3 1506; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm4 = ymm0[0],ymm1[1],ymm0[2,3],ymm1[4],ymm0[5,6],ymm1[7] 1507; AVX2-SLOW-NEXT: vmovaps {{.*#+}} ymm5 = <0,3,6,1,4,7,u,u> 1508; AVX2-SLOW-NEXT: vpermps %ymm4, %ymm5, %ymm4 1509; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3,4,5],ymm3[6,7] 1510; AVX2-SLOW-NEXT: vbroadcastf128 {{.*#+}} ymm4 = [0,0,3,6,0,0,3,6] 1511; AVX2-SLOW-NEXT: # ymm4 = mem[0,1,0,1] 1512; AVX2-SLOW-NEXT: vpermps %ymm2, %ymm4, %ymm4 1513; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm5 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7] 1514; AVX2-SLOW-NEXT: vmovaps {{.*#+}} ymm6 = <1,4,7,2,5,u,u,u> 1515; AVX2-SLOW-NEXT: vpermps %ymm5, %ymm6, %ymm5 1516; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm4 = ymm5[0,1,2,3,4],ymm4[5,6,7] 1517; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3,4],ymm0[5],ymm1[6,7] 1518; AVX2-SLOW-NEXT: vmovaps {{.*#+}} ymm1 = <2,5,0,3,6,u,u,u> 1519; AVX2-SLOW-NEXT: vpermps %ymm0, %ymm1, %ymm0 1520; AVX2-SLOW-NEXT: vpermilps {{.*#+}} ymm1 = ymm2[0,1,0,3,4,5,4,7] 1521; AVX2-SLOW-NEXT: vpermpd {{.*#+}} ymm1 = ymm1[0,1,0,3] 1522; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm1[5,6,7] 1523; AVX2-SLOW-NEXT: vmovups %ymm3, (%rsi) 1524; AVX2-SLOW-NEXT: vmovups %ymm4, (%rdx) 1525; AVX2-SLOW-NEXT: vmovups %ymm0, (%rcx) 1526; AVX2-SLOW-NEXT: vzeroupper 1527; AVX2-SLOW-NEXT: retq 1528; 1529; AVX2-FAST-ALL-LABEL: interleave_24i32_out: 1530; AVX2-FAST-ALL: # %bb.0: 1531; AVX2-FAST-ALL-NEXT: vmovups (%rdi), %ymm0 1532; AVX2-FAST-ALL-NEXT: vmovups 32(%rdi), %ymm1 1533; AVX2-FAST-ALL-NEXT: vmovups 64(%rdi), %ymm2 1534; AVX2-FAST-ALL-NEXT: vbroadcastsd {{.*#+}} ymm3 = [21474836482,21474836482,21474836482,21474836482] 1535; AVX2-FAST-ALL-NEXT: vpermps %ymm2, %ymm3, %ymm3 1536; AVX2-FAST-ALL-NEXT: vblendps {{.*#+}} ymm4 = ymm0[0],ymm1[1],ymm0[2,3],ymm1[4],ymm0[5,6],ymm1[7] 1537; AVX2-FAST-ALL-NEXT: vmovaps {{.*#+}} ymm5 = <0,3,6,1,4,7,u,u> 1538; AVX2-FAST-ALL-NEXT: vpermps %ymm4, %ymm5, %ymm4 1539; AVX2-FAST-ALL-NEXT: vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3,4,5],ymm3[6,7] 1540; AVX2-FAST-ALL-NEXT: vbroadcastf128 {{.*#+}} ymm4 = [0,0,3,6,0,0,3,6] 1541; AVX2-FAST-ALL-NEXT: # ymm4 = mem[0,1,0,1] 1542; AVX2-FAST-ALL-NEXT: vpermps %ymm2, %ymm4, %ymm4 1543; AVX2-FAST-ALL-NEXT: vblendps {{.*#+}} ymm5 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7] 1544; AVX2-FAST-ALL-NEXT: vmovaps {{.*#+}} ymm6 = <1,4,7,2,5,u,u,u> 1545; AVX2-FAST-ALL-NEXT: vpermps %ymm5, %ymm6, %ymm5 1546; AVX2-FAST-ALL-NEXT: vblendps {{.*#+}} ymm4 = ymm5[0,1,2,3,4],ymm4[5,6,7] 1547; AVX2-FAST-ALL-NEXT: vmovaps {{.*#+}} ymm5 = <u,u,u,u,u,1,4,7> 1548; AVX2-FAST-ALL-NEXT: vpermps %ymm2, %ymm5, %ymm2 1549; AVX2-FAST-ALL-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3,4],ymm0[5],ymm1[6,7] 1550; AVX2-FAST-ALL-NEXT: vmovaps {{.*#+}} ymm1 = <2,5,0,3,6,u,u,u> 1551; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm1, %ymm0 1552; AVX2-FAST-ALL-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm2[5,6,7] 1553; AVX2-FAST-ALL-NEXT: vmovups %ymm3, (%rsi) 1554; AVX2-FAST-ALL-NEXT: vmovups %ymm4, (%rdx) 1555; AVX2-FAST-ALL-NEXT: vmovups %ymm0, (%rcx) 1556; AVX2-FAST-ALL-NEXT: vzeroupper 1557; AVX2-FAST-ALL-NEXT: retq 1558; 1559; AVX2-FAST-PERLANE-LABEL: interleave_24i32_out: 1560; AVX2-FAST-PERLANE: # %bb.0: 1561; AVX2-FAST-PERLANE-NEXT: vmovups (%rdi), %ymm0 1562; AVX2-FAST-PERLANE-NEXT: vmovups 32(%rdi), %ymm1 1563; AVX2-FAST-PERLANE-NEXT: vmovups 64(%rdi), %ymm2 1564; AVX2-FAST-PERLANE-NEXT: vbroadcastsd {{.*#+}} ymm3 = [21474836482,21474836482,21474836482,21474836482] 1565; AVX2-FAST-PERLANE-NEXT: vpermps %ymm2, %ymm3, %ymm3 1566; AVX2-FAST-PERLANE-NEXT: vblendps {{.*#+}} ymm4 = ymm0[0],ymm1[1],ymm0[2,3],ymm1[4],ymm0[5,6],ymm1[7] 1567; AVX2-FAST-PERLANE-NEXT: vmovaps {{.*#+}} ymm5 = <0,3,6,1,4,7,u,u> 1568; AVX2-FAST-PERLANE-NEXT: vpermps %ymm4, %ymm5, %ymm4 1569; AVX2-FAST-PERLANE-NEXT: vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3,4,5],ymm3[6,7] 1570; AVX2-FAST-PERLANE-NEXT: vbroadcastf128 {{.*#+}} ymm4 = [0,0,3,6,0,0,3,6] 1571; AVX2-FAST-PERLANE-NEXT: # ymm4 = mem[0,1,0,1] 1572; AVX2-FAST-PERLANE-NEXT: vpermps %ymm2, %ymm4, %ymm4 1573; AVX2-FAST-PERLANE-NEXT: vblendps {{.*#+}} ymm5 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7] 1574; AVX2-FAST-PERLANE-NEXT: vmovaps {{.*#+}} ymm6 = <1,4,7,2,5,u,u,u> 1575; AVX2-FAST-PERLANE-NEXT: vpermps %ymm5, %ymm6, %ymm5 1576; AVX2-FAST-PERLANE-NEXT: vblendps {{.*#+}} ymm4 = ymm5[0,1,2,3,4],ymm4[5,6,7] 1577; AVX2-FAST-PERLANE-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3,4],ymm0[5],ymm1[6,7] 1578; AVX2-FAST-PERLANE-NEXT: vmovaps {{.*#+}} ymm1 = <2,5,0,3,6,u,u,u> 1579; AVX2-FAST-PERLANE-NEXT: vpermps %ymm0, %ymm1, %ymm0 1580; AVX2-FAST-PERLANE-NEXT: vpermilps {{.*#+}} ymm1 = ymm2[0,1,0,3,4,5,4,7] 1581; AVX2-FAST-PERLANE-NEXT: vpermpd {{.*#+}} ymm1 = ymm1[0,1,0,3] 1582; AVX2-FAST-PERLANE-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm1[5,6,7] 1583; AVX2-FAST-PERLANE-NEXT: vmovups %ymm3, (%rsi) 1584; AVX2-FAST-PERLANE-NEXT: vmovups %ymm4, (%rdx) 1585; AVX2-FAST-PERLANE-NEXT: vmovups %ymm0, (%rcx) 1586; AVX2-FAST-PERLANE-NEXT: vzeroupper 1587; AVX2-FAST-PERLANE-NEXT: retq 1588; 1589; XOP-LABEL: interleave_24i32_out: 1590; XOP: # %bb.0: 1591; XOP-NEXT: vmovups 64(%rdi), %ymm0 1592; XOP-NEXT: vmovups 32(%rdi), %ymm1 1593; XOP-NEXT: vmovups (%rdi), %ymm2 1594; XOP-NEXT: vblendps {{.*#+}} ymm3 = ymm2[0],ymm1[1],ymm2[2,3],ymm1[4],ymm2[5,6],ymm1[7] 1595; XOP-NEXT: vmovups 16(%rdi), %xmm4 1596; XOP-NEXT: vshufps {{.*#+}} ymm4 = ymm4[2,1],ymm1[1,3],ymm4[6,5],ymm1[5,7] 1597; XOP-NEXT: vshufps {{.*#+}} ymm3 = ymm3[0,3],ymm4[0,2],ymm3[4,7],ymm4[4,6] 1598; XOP-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm0[2,3,0,1] 1599; XOP-NEXT: vshufps {{.*#+}} ymm5 = ymm0[1,0],ymm4[2,0],ymm0[5,4],ymm4[6,4] 1600; XOP-NEXT: vpermilps {{.*#+}} ymm5 = ymm5[0,1,2,0,4,5,6,4] 1601; XOP-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4,5],ymm5[6,7] 1602; XOP-NEXT: vshufps {{.*#+}} ymm5 = ymm0[2,0],ymm4[3,0],ymm0[6,4],ymm4[7,4] 1603; XOP-NEXT: vshufps {{.*#+}} ymm5 = ymm4[0,0],ymm5[2,0],ymm4[4,4],ymm5[6,4] 1604; XOP-NEXT: vmovups 16(%rdi), %xmm6 1605; XOP-NEXT: vblendps {{.*#+}} ymm7 = ymm2[0,1],ymm1[2],ymm2[3,4],ymm1[5],ymm2[6,7] 1606; XOP-NEXT: vshufps {{.*#+}} ymm7 = ymm7[1,2],ymm6[0,3],ymm7[5,6],ymm6[4,7] 1607; XOP-NEXT: vpermilps {{.*#+}} ymm7 = ymm7[0,2,3,1,4,6,7,5] 1608; XOP-NEXT: vblendps {{.*#+}} ymm5 = ymm7[0,1,2,3,4],ymm5[5,6,7] 1609; XOP-NEXT: vblendps {{.*#+}} ymm2 = ymm1[0,1],ymm2[2],ymm1[3,4],ymm2[5],ymm1[6,7] 1610; XOP-NEXT: vshufps {{.*#+}} ymm2 = ymm6[1,0],ymm2[2,0],ymm6[5,4],ymm2[6,4] 1611; XOP-NEXT: vshufps {{.*#+}} ymm1 = ymm2[2,0],ymm1[0,3],ymm2[6,4],ymm1[4,7] 1612; XOP-NEXT: vshufps {{.*#+}} ymm0 = ymm4[0,1],ymm0[0,3],ymm4[4,5],ymm0[4,7] 1613; XOP-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3,4],ymm0[5,6,7] 1614; XOP-NEXT: vmovups %ymm3, (%rsi) 1615; XOP-NEXT: vmovups %ymm5, (%rdx) 1616; XOP-NEXT: vmovups %ymm0, (%rcx) 1617; XOP-NEXT: vzeroupper 1618; XOP-NEXT: retq 1619 %wide.vec = load <24 x i32>, ptr %p, align 4 1620 %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> 1621 %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> 1622 %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> 1623 store <8 x i32> %s1, ptr %q1, align 4 1624 store <8 x i32> %s2, ptr %q2, align 4 1625 store <8 x i32> %s3, ptr %q3, align 4 1626 ret void 1627} 1628 1629define void @interleave_24i32_in(ptr %p, ptr %q1, ptr %q2, ptr %q3) nounwind { 1630; SSE2-LABEL: interleave_24i32_in: 1631; SSE2: # %bb.0: 1632; SSE2-NEXT: movups (%rsi), %xmm1 1633; SSE2-NEXT: movups 16(%rsi), %xmm0 1634; SSE2-NEXT: movups (%rdx), %xmm2 1635; SSE2-NEXT: movups 16(%rdx), %xmm5 1636; SSE2-NEXT: movups (%rcx), %xmm8 1637; SSE2-NEXT: movups 16(%rcx), %xmm9 1638; SSE2-NEXT: movaps %xmm8, %xmm7 1639; SSE2-NEXT: shufps {{.*#+}} xmm7 = xmm7[0,1],xmm1[1,3] 1640; SSE2-NEXT: movaps %xmm1, %xmm3 1641; SSE2-NEXT: unpcklps {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1] 1642; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,1],xmm7[0,2] 1643; SSE2-NEXT: movaps %xmm0, %xmm7 1644; SSE2-NEXT: unpckhpd {{.*#+}} xmm7 = xmm7[1],xmm5[1] 1645; SSE2-NEXT: movaps %xmm9, %xmm6 1646; SSE2-NEXT: shufps {{.*#+}} xmm6 = xmm6[0,1],xmm0[1,3] 1647; SSE2-NEXT: movaps %xmm0, %xmm4 1648; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3],xmm5[3,3] 1649; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2],xmm9[2,3] 1650; SSE2-NEXT: shufps {{.*#+}} xmm9 = xmm9[1,1],xmm5[1,1] 1651; SSE2-NEXT: shufps {{.*#+}} xmm9 = xmm9[2,0],xmm7[0,2] 1652; SSE2-NEXT: unpcklps {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1] 1653; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,1],xmm6[0,2] 1654; SSE2-NEXT: movaps %xmm1, %xmm5 1655; SSE2-NEXT: unpckhpd {{.*#+}} xmm5 = xmm5[1],xmm2[1] 1656; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3],xmm2[3,3] 1657; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,2],xmm8[2,3] 1658; SSE2-NEXT: shufps {{.*#+}} xmm8 = xmm8[1,1],xmm2[1,1] 1659; SSE2-NEXT: shufps {{.*#+}} xmm8 = xmm8[2,0],xmm5[0,2] 1660; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0,1,3] 1661; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0,1,3] 1662; SSE2-NEXT: movups %xmm8, 16(%rdi) 1663; SSE2-NEXT: movups %xmm4, 48(%rdi) 1664; SSE2-NEXT: movups %xmm9, 64(%rdi) 1665; SSE2-NEXT: movups %xmm3, (%rdi) 1666; SSE2-NEXT: movups %xmm1, 32(%rdi) 1667; SSE2-NEXT: movups %xmm0, 80(%rdi) 1668; SSE2-NEXT: retq 1669; 1670; SSE42-LABEL: interleave_24i32_in: 1671; SSE42: # %bb.0: 1672; SSE42-NEXT: movdqu (%rsi), %xmm0 1673; SSE42-NEXT: movdqu 16(%rsi), %xmm4 1674; SSE42-NEXT: movdqu (%rdx), %xmm9 1675; SSE42-NEXT: movdqu 16(%rdx), %xmm5 1676; SSE42-NEXT: movdqu (%rcx), %xmm3 1677; SSE42-NEXT: movdqu 16(%rcx), %xmm6 1678; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm9[0,0,1,1] 1679; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,1,0,1] 1680; SSE42-NEXT: pblendw {{.*#+}} xmm7 = xmm7[0,1],xmm1[2,3],xmm7[4,5,6,7] 1681; SSE42-NEXT: pshufd {{.*#+}} xmm8 = xmm3[0,1,0,1] 1682; SSE42-NEXT: pblendw {{.*#+}} xmm8 = xmm7[0,1,2,3],xmm8[4,5],xmm7[6,7] 1683; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm5[1,1,2,2] 1684; SSE42-NEXT: pblendw {{.*#+}} xmm7 = xmm7[0,1,2,3],xmm4[4,5],xmm7[6,7] 1685; SSE42-NEXT: pblendw {{.*#+}} xmm7 = xmm7[0,1],xmm6[2,3],xmm7[4,5,6,7] 1686; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm5[0,0,1,1] 1687; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm4[0,1,0,1] 1688; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5,6,7] 1689; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm6[0,1,0,1] 1690; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5],xmm2[6,7] 1691; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm9[1,1,2,2] 1692; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm0[4,5],xmm2[6,7] 1693; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5,6,7] 1694; SSE42-NEXT: shufps {{.*#+}} xmm4 = xmm4[3,3],xmm5[3,3] 1695; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm6[2,3,2,3] 1696; SSE42-NEXT: pblendw {{.*#+}} xmm5 = xmm5[0,1],xmm4[2,3,4,5],xmm5[6,7] 1697; SSE42-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3],xmm9[3,3] 1698; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3] 1699; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm0[2,3,4,5],xmm3[6,7] 1700; SSE42-NEXT: movdqu %xmm3, 32(%rdi) 1701; SSE42-NEXT: movdqu %xmm5, 80(%rdi) 1702; SSE42-NEXT: movdqu %xmm2, 16(%rdi) 1703; SSE42-NEXT: movdqu %xmm1, 48(%rdi) 1704; SSE42-NEXT: movdqu %xmm7, 64(%rdi) 1705; SSE42-NEXT: movdqu %xmm8, (%rdi) 1706; SSE42-NEXT: retq 1707; 1708; AVX1-LABEL: interleave_24i32_in: 1709; AVX1: # %bb.0: 1710; AVX1-NEXT: vmovupd (%rcx), %ymm0 1711; AVX1-NEXT: vmovups (%rdx), %xmm1 1712; AVX1-NEXT: vmovups 16(%rdx), %xmm2 1713; AVX1-NEXT: vmovups (%rsi), %xmm3 1714; AVX1-NEXT: vmovups 16(%rsi), %xmm4 1715; AVX1-NEXT: vshufps {{.*#+}} xmm5 = xmm4[3,3],xmm2[3,3] 1716; AVX1-NEXT: vunpckhpd {{.*#+}} xmm4 = xmm4[1],xmm2[1] 1717; AVX1-NEXT: vshufps {{.*#+}} xmm2 = xmm2[1,1],xmm4[0,2] 1718; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm2 1719; AVX1-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm0[2,3,2,3] 1720; AVX1-NEXT: vpermilpd {{.*#+}} ymm4 = ymm4[0,0,3,3] 1721; AVX1-NEXT: vblendps {{.*#+}} ymm2 = ymm2[0],ymm4[1],ymm2[2,3],ymm4[4],ymm2[5,6],ymm4[7] 1722; AVX1-NEXT: vunpckhpd {{.*#+}} xmm4 = xmm3[1],xmm1[1] 1723; AVX1-NEXT: vshufps {{.*#+}} xmm4 = xmm1[1,1],xmm4[0,2] 1724; AVX1-NEXT: vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm3[0] 1725; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm1[2,0],xmm3[2,1] 1726; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm1 1727; AVX1-NEXT: vbroadcastsd (%rcx), %ymm3 1728; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0,1],ymm3[2],ymm1[3,4],ymm3[5],ymm1[6,7] 1729; AVX1-NEXT: vpermilps {{.*#+}} ymm3 = mem[0,0,3,3,4,4,7,7] 1730; AVX1-NEXT: vpermilpd {{.*#+}} ymm4 = mem[1,0,2,2] 1731; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm4[0,1],ymm3[2],ymm4[3,4],ymm3[5],ymm4[6,7] 1732; AVX1-NEXT: vpermilpd {{.*#+}} ymm0 = ymm0[1,1,2,2] 1733; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm3[1,2],ymm0[3],ymm3[4,5],ymm0[6],ymm3[7] 1734; AVX1-NEXT: vmovups %ymm0, 32(%rdi) 1735; AVX1-NEXT: vmovups %ymm1, (%rdi) 1736; AVX1-NEXT: vmovups %ymm2, 64(%rdi) 1737; AVX1-NEXT: vzeroupper 1738; AVX1-NEXT: retq 1739; 1740; AVX2-SLOW-LABEL: interleave_24i32_in: 1741; AVX2-SLOW: # %bb.0: 1742; AVX2-SLOW-NEXT: vmovups (%rsi), %ymm0 1743; AVX2-SLOW-NEXT: vmovups (%rdx), %ymm1 1744; AVX2-SLOW-NEXT: vmovups (%rcx), %ymm2 1745; AVX2-SLOW-NEXT: vbroadcastsd 24(%rsi), %ymm3 1746; AVX2-SLOW-NEXT: vpermilps {{.*#+}} ymm4 = ymm1[1,2,3,3,5,6,7,7] 1747; AVX2-SLOW-NEXT: vpermpd {{.*#+}} ymm4 = ymm4[2,2,2,3] 1748; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm3 = ymm4[0,1],ymm3[2],ymm4[3,4],ymm3[5],ymm4[6,7] 1749; AVX2-SLOW-NEXT: vpermpd {{.*#+}} ymm4 = ymm2[2,1,3,3] 1750; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0],ymm4[1],ymm3[2,3],ymm4[4],ymm3[5,6],ymm4[7] 1751; AVX2-SLOW-NEXT: vpermilps {{.*#+}} xmm4 = mem[1,0,2,2] 1752; AVX2-SLOW-NEXT: vpermpd {{.*#+}} ymm4 = ymm4[0,1,0,1] 1753; AVX2-SLOW-NEXT: vpermpd {{.*#+}} ymm5 = ymm0[0,0,2,1] 1754; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm4 = ymm5[0],ymm4[1],ymm5[2,3],ymm4[4],ymm5[5,6],ymm4[7] 1755; AVX2-SLOW-NEXT: vbroadcastsd (%rcx), %ymm5 1756; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm4 = ymm4[0,1],ymm5[2],ymm4[3,4],ymm5[5],ymm4[6,7] 1757; AVX2-SLOW-NEXT: vpermilps {{.*#+}} ymm1 = ymm1[0,0,3,3,4,4,7,7] 1758; AVX2-SLOW-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[1,1,2,2] 1759; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7] 1760; AVX2-SLOW-NEXT: vpermpd {{.*#+}} ymm1 = ymm2[1,1,2,2] 1761; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1,2],ymm1[3],ymm0[4,5],ymm1[6],ymm0[7] 1762; AVX2-SLOW-NEXT: vmovups %ymm0, 32(%rdi) 1763; AVX2-SLOW-NEXT: vmovups %ymm4, (%rdi) 1764; AVX2-SLOW-NEXT: vmovups %ymm3, 64(%rdi) 1765; AVX2-SLOW-NEXT: vzeroupper 1766; AVX2-SLOW-NEXT: retq 1767; 1768; AVX2-FAST-ALL-LABEL: interleave_24i32_in: 1769; AVX2-FAST-ALL: # %bb.0: 1770; AVX2-FAST-ALL-NEXT: vmovups (%rsi), %ymm0 1771; AVX2-FAST-ALL-NEXT: vmovups (%rdx), %ymm1 1772; AVX2-FAST-ALL-NEXT: vmovups (%rcx), %ymm2 1773; AVX2-FAST-ALL-NEXT: vmovaps {{.*#+}} ymm3 = <5,u,u,6,u,u,7,u> 1774; AVX2-FAST-ALL-NEXT: vpermps %ymm1, %ymm3, %ymm3 1775; AVX2-FAST-ALL-NEXT: vbroadcastsd 24(%rsi), %ymm4 1776; AVX2-FAST-ALL-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0,1],ymm4[2],ymm3[3,4],ymm4[5],ymm3[6,7] 1777; AVX2-FAST-ALL-NEXT: vpermpd {{.*#+}} ymm4 = ymm2[2,1,3,3] 1778; AVX2-FAST-ALL-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0],ymm4[1],ymm3[2,3],ymm4[4],ymm3[5,6],ymm4[7] 1779; AVX2-FAST-ALL-NEXT: vbroadcastf128 {{.*#+}} ymm4 = [1,0,2,2,1,0,2,2] 1780; AVX2-FAST-ALL-NEXT: # ymm4 = mem[0,1,0,1] 1781; AVX2-FAST-ALL-NEXT: vpermps %ymm1, %ymm4, %ymm4 1782; AVX2-FAST-ALL-NEXT: vpermpd {{.*#+}} ymm5 = ymm0[0,0,2,1] 1783; AVX2-FAST-ALL-NEXT: vblendps {{.*#+}} ymm4 = ymm5[0],ymm4[1],ymm5[2,3],ymm4[4],ymm5[5,6],ymm4[7] 1784; AVX2-FAST-ALL-NEXT: vbroadcastsd (%rcx), %ymm5 1785; AVX2-FAST-ALL-NEXT: vblendps {{.*#+}} ymm4 = ymm4[0,1],ymm5[2],ymm4[3,4],ymm5[5],ymm4[6,7] 1786; AVX2-FAST-ALL-NEXT: vpermilps {{.*#+}} ymm1 = ymm1[0,0,3,3,4,4,7,7] 1787; AVX2-FAST-ALL-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[1,1,2,2] 1788; AVX2-FAST-ALL-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7] 1789; AVX2-FAST-ALL-NEXT: vpermpd {{.*#+}} ymm1 = ymm2[1,1,2,2] 1790; AVX2-FAST-ALL-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1,2],ymm1[3],ymm0[4,5],ymm1[6],ymm0[7] 1791; AVX2-FAST-ALL-NEXT: vmovups %ymm0, 32(%rdi) 1792; AVX2-FAST-ALL-NEXT: vmovups %ymm4, (%rdi) 1793; AVX2-FAST-ALL-NEXT: vmovups %ymm3, 64(%rdi) 1794; AVX2-FAST-ALL-NEXT: vzeroupper 1795; AVX2-FAST-ALL-NEXT: retq 1796; 1797; AVX2-FAST-PERLANE-LABEL: interleave_24i32_in: 1798; AVX2-FAST-PERLANE: # %bb.0: 1799; AVX2-FAST-PERLANE-NEXT: vmovups (%rsi), %ymm0 1800; AVX2-FAST-PERLANE-NEXT: vmovups (%rdx), %ymm1 1801; AVX2-FAST-PERLANE-NEXT: vmovups (%rcx), %ymm2 1802; AVX2-FAST-PERLANE-NEXT: vbroadcastsd 24(%rsi), %ymm3 1803; AVX2-FAST-PERLANE-NEXT: vpermilps {{.*#+}} ymm4 = ymm1[1,2,3,3,5,6,7,7] 1804; AVX2-FAST-PERLANE-NEXT: vpermpd {{.*#+}} ymm4 = ymm4[2,2,2,3] 1805; AVX2-FAST-PERLANE-NEXT: vblendps {{.*#+}} ymm3 = ymm4[0,1],ymm3[2],ymm4[3,4],ymm3[5],ymm4[6,7] 1806; AVX2-FAST-PERLANE-NEXT: vpermpd {{.*#+}} ymm4 = ymm2[2,1,3,3] 1807; AVX2-FAST-PERLANE-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0],ymm4[1],ymm3[2,3],ymm4[4],ymm3[5,6],ymm4[7] 1808; AVX2-FAST-PERLANE-NEXT: vpermilps {{.*#+}} xmm4 = mem[1,0,2,2] 1809; AVX2-FAST-PERLANE-NEXT: vpermpd {{.*#+}} ymm4 = ymm4[0,1,0,1] 1810; AVX2-FAST-PERLANE-NEXT: vpermpd {{.*#+}} ymm5 = ymm0[0,0,2,1] 1811; AVX2-FAST-PERLANE-NEXT: vblendps {{.*#+}} ymm4 = ymm5[0],ymm4[1],ymm5[2,3],ymm4[4],ymm5[5,6],ymm4[7] 1812; AVX2-FAST-PERLANE-NEXT: vbroadcastsd (%rcx), %ymm5 1813; AVX2-FAST-PERLANE-NEXT: vblendps {{.*#+}} ymm4 = ymm4[0,1],ymm5[2],ymm4[3,4],ymm5[5],ymm4[6,7] 1814; AVX2-FAST-PERLANE-NEXT: vpermilps {{.*#+}} ymm1 = ymm1[0,0,3,3,4,4,7,7] 1815; AVX2-FAST-PERLANE-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[1,1,2,2] 1816; AVX2-FAST-PERLANE-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7] 1817; AVX2-FAST-PERLANE-NEXT: vpermpd {{.*#+}} ymm1 = ymm2[1,1,2,2] 1818; AVX2-FAST-PERLANE-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1,2],ymm1[3],ymm0[4,5],ymm1[6],ymm0[7] 1819; AVX2-FAST-PERLANE-NEXT: vmovups %ymm0, 32(%rdi) 1820; AVX2-FAST-PERLANE-NEXT: vmovups %ymm4, (%rdi) 1821; AVX2-FAST-PERLANE-NEXT: vmovups %ymm3, 64(%rdi) 1822; AVX2-FAST-PERLANE-NEXT: vzeroupper 1823; AVX2-FAST-PERLANE-NEXT: retq 1824; 1825; XOP-LABEL: interleave_24i32_in: 1826; XOP: # %bb.0: 1827; XOP-NEXT: vmovups (%rsi), %ymm0 1828; XOP-NEXT: vmovups (%rdx), %ymm1 1829; XOP-NEXT: vpermil2ps {{.*#+}} ymm0 = ymm0[u,3],ymm1[3],ymm0[u,4],ymm1[4],ymm0[u,5] 1830; XOP-NEXT: vmovups (%rcx), %ymm1 1831; XOP-NEXT: vmovups (%rdx), %xmm2 1832; XOP-NEXT: vmovups 16(%rdx), %xmm3 1833; XOP-NEXT: vmovups (%rsi), %xmm4 1834; XOP-NEXT: vmovups 16(%rsi), %xmm5 1835; XOP-NEXT: vshufps {{.*#+}} xmm6 = xmm5[3,3],xmm3[3,3] 1836; XOP-NEXT: vunpckhpd {{.*#+}} xmm5 = xmm5[1],xmm3[1] 1837; XOP-NEXT: vshufps {{.*#+}} xmm3 = xmm3[1,1],xmm5[0,2] 1838; XOP-NEXT: vinsertf128 $1, %xmm6, %ymm3, %ymm3 1839; XOP-NEXT: vperm2f128 {{.*#+}} ymm5 = ymm1[2,3,2,3] 1840; XOP-NEXT: vpermilpd {{.*#+}} ymm5 = ymm5[0,0,3,3] 1841; XOP-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0],ymm5[1],ymm3[2,3],ymm5[4],ymm3[5,6],ymm5[7] 1842; XOP-NEXT: vunpckhpd {{.*#+}} xmm5 = xmm4[1],xmm2[1] 1843; XOP-NEXT: vshufps {{.*#+}} xmm5 = xmm2[1,1],xmm5[0,2] 1844; XOP-NEXT: vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm4[0] 1845; XOP-NEXT: vshufps {{.*#+}} xmm2 = xmm2[2,0],xmm4[2,1] 1846; XOP-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm2 1847; XOP-NEXT: vbroadcastsd (%rcx), %ymm4 1848; XOP-NEXT: vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm4[2],ymm2[3,4],ymm4[5],ymm2[6,7] 1849; XOP-NEXT: vpermilpd {{.*#+}} ymm1 = ymm1[1,1,2,2] 1850; XOP-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1,2],ymm1[3],ymm0[4,5],ymm1[6],ymm0[7] 1851; XOP-NEXT: vmovups %ymm0, 32(%rdi) 1852; XOP-NEXT: vmovups %ymm2, (%rdi) 1853; XOP-NEXT: vmovups %ymm3, 64(%rdi) 1854; XOP-NEXT: vzeroupper 1855; XOP-NEXT: retq 1856 %s1 = load <8 x i32>, ptr %q1, align 4 1857 %s2 = load <8 x i32>, ptr %q2, align 4 1858 %s3 = load <8 x i32>, ptr %q3, align 4 1859 %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> 1860 %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> 1861 %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> 1862 store <24 x i32> %interleaved, ptr %p, align 4 1863 ret void 1864} 1865 1866; Repeat each element x 3 of <16 x i8> a0 + a1 to create a <96 x i8>. 1867define void @splat3_128(<16 x i8> %a0, <16 x i8> %a1, ptr%a2) { 1868; SSE2-LABEL: splat3_128: 1869; SSE2: # %bb.0: 1870; SSE2-NEXT: pxor %xmm4, %xmm4 1871; SSE2-NEXT: movdqa %xmm0, %xmm3 1872; 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] 1873; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm3[2,3,3,3,4,5,6,7] 1874; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm2[0,1,2,3,4,4,4,5] 1875; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,1,0,1] 1876; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,1,4,5,6,7] 1877; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,6] 1878; SSE2-NEXT: packuswb %xmm5, %xmm2 1879; 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] 1880; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,1,0,1] 1881; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,0,0,1,4,5,6,7] 1882; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,5,6,6] 1883; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3] 1884; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[1,1,2,2,4,5,6,7] 1885; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,6,7,7,7] 1886; SSE2-NEXT: packuswb %xmm5, %xmm3 1887; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm0[2,3,3,3,4,5,6,7] 1888; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,4,4,5] 1889; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 1890; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,1,2,2,4,5,6,7] 1891; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,7,7] 1892; SSE2-NEXT: packuswb %xmm0, %xmm5 1893; SSE2-NEXT: movdqa %xmm1, %xmm0 1894; 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] 1895; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm0[2,3,3,3,4,5,6,7] 1896; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,4,4,4,5] 1897; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,1,0,1] 1898; SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm7[0,0,0,1,4,5,6,7] 1899; SSE2-NEXT: pshufhw {{.*#+}} xmm7 = xmm7[0,1,2,3,5,5,6,6] 1900; SSE2-NEXT: packuswb %xmm6, %xmm7 1901; 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] 1902; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,1,0,1] 1903; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,0,0,1,4,5,6,7] 1904; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,5,6,6] 1905; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 1906; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,1,2,2,4,5,6,7] 1907; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,7,7] 1908; SSE2-NEXT: packuswb %xmm4, %xmm0 1909; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm1[2,3,3,3,4,5,6,7] 1910; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,4,4,5] 1911; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3] 1912; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[1,1,2,2,4,5,6,7] 1913; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,7,7,7] 1914; SSE2-NEXT: packuswb %xmm1, %xmm4 1915; SSE2-NEXT: movdqa %xmm4, 80(%rdi) 1916; SSE2-NEXT: movdqa %xmm0, 64(%rdi) 1917; SSE2-NEXT: movdqa %xmm7, 48(%rdi) 1918; SSE2-NEXT: movdqa %xmm5, 32(%rdi) 1919; SSE2-NEXT: movdqa %xmm3, 16(%rdi) 1920; SSE2-NEXT: movdqa %xmm2, (%rdi) 1921; SSE2-NEXT: retq 1922; 1923; SSE42-LABEL: splat3_128: 1924; SSE42: # %bb.0: 1925; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5] 1926; SSE42-NEXT: movdqa %xmm0, %xmm3 1927; SSE42-NEXT: pshufb %xmm2, %xmm3 1928; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10] 1929; SSE42-NEXT: movdqa %xmm0, %xmm5 1930; SSE42-NEXT: pshufb %xmm4, %xmm5 1931; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15] 1932; SSE42-NEXT: pshufb %xmm6, %xmm0 1933; SSE42-NEXT: movdqa %xmm1, %xmm7 1934; SSE42-NEXT: pshufb %xmm2, %xmm7 1935; SSE42-NEXT: movdqa %xmm1, %xmm2 1936; SSE42-NEXT: pshufb %xmm4, %xmm2 1937; SSE42-NEXT: pshufb %xmm6, %xmm1 1938; SSE42-NEXT: movdqa %xmm1, 80(%rdi) 1939; SSE42-NEXT: movdqa %xmm2, 64(%rdi) 1940; SSE42-NEXT: movdqa %xmm7, 48(%rdi) 1941; SSE42-NEXT: movdqa %xmm0, 32(%rdi) 1942; SSE42-NEXT: movdqa %xmm5, 16(%rdi) 1943; SSE42-NEXT: movdqa %xmm3, (%rdi) 1944; SSE42-NEXT: retq 1945; 1946; AVX1-LABEL: splat3_128: 1947; AVX1: # %bb.0: 1948; AVX1-NEXT: vpalignr {{.*#+}} xmm2 = xmm1[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5] 1949; AVX1-NEXT: vpalignr {{.*#+}} xmm3 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5] 1950; AVX1-NEXT: vpalignr {{.*#+}} xmm4 = xmm1[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10] 1951; AVX1-NEXT: vpalignr {{.*#+}} xmm5 = xmm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10] 1952; AVX1-NEXT: vpalignr {{.*#+}} xmm6 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4] 1953; AVX1-NEXT: vpalignr {{.*#+}} xmm7 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4] 1954; AVX1-NEXT: vpalignr {{.*#+}} xmm3 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm3[0,1,2,3,4] 1955; AVX1-NEXT: vpalignr {{.*#+}} xmm2 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4] 1956; AVX1-NEXT: vpalignr {{.*#+}} xmm5 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4] 1957; AVX1-NEXT: vpalignr {{.*#+}} xmm4 = xmm1[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4] 1958; AVX1-NEXT: vpalignr {{.*#+}} xmm1 = xmm7[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4] 1959; AVX1-NEXT: vpalignr {{.*#+}} xmm0 = xmm6[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4] 1960; AVX1-NEXT: vpalignr {{.*#+}} xmm2 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4] 1961; AVX1-NEXT: vpalignr {{.*#+}} xmm3 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4] 1962; AVX1-NEXT: vpalignr {{.*#+}} xmm4 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm7[0,1,2,3,4] 1963; AVX1-NEXT: vpalignr {{.*#+}} xmm5 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm6[0,1,2,3,4] 1964; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5] 1965; AVX1-NEXT: vpshufb %xmm6, %xmm3, %xmm3 1966; AVX1-NEXT: vpshufb %xmm6, %xmm0, %xmm0 1967; AVX1-NEXT: vpshufb %xmm6, %xmm5, %xmm5 1968; AVX1-NEXT: vpshufb %xmm6, %xmm1, %xmm1 1969; AVX1-NEXT: vpshufb %xmm6, %xmm2, %xmm2 1970; AVX1-NEXT: vpshufb %xmm6, %xmm4, %xmm4 1971; AVX1-NEXT: vmovdqa %xmm4, 80(%rdi) 1972; AVX1-NEXT: vmovdqa %xmm2, 64(%rdi) 1973; AVX1-NEXT: vmovdqa %xmm1, 48(%rdi) 1974; AVX1-NEXT: vmovdqa %xmm5, 32(%rdi) 1975; AVX1-NEXT: vmovdqa %xmm3, 16(%rdi) 1976; AVX1-NEXT: vmovdqa %xmm0, (%rdi) 1977; AVX1-NEXT: retq 1978; 1979; AVX2-LABEL: splat3_128: 1980; AVX2: # %bb.0: 1981; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0 1982; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1983; 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] 1984; 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] 1985; 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] 1986; 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] 1987; 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] 1988; 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] 1989; 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] 1990; 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] 1991; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm3 1992; AVX2-NEXT: vmovdqa {{.*#+}} 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] 1993; AVX2-NEXT: vpshufb %ymm4, %ymm3, %ymm3 1994; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7] 1995; AVX2-NEXT: vpshufb %ymm4, %ymm0, %ymm0 1996; AVX2-NEXT: vperm2i128 {{.*#+}} ymm1 = ymm1[2,3],ymm2[2,3] 1997; AVX2-NEXT: vpshufb %ymm4, %ymm1, %ymm1 1998; AVX2-NEXT: vmovdqa %ymm1, 64(%rdi) 1999; AVX2-NEXT: vmovdqa %ymm0, 32(%rdi) 2000; AVX2-NEXT: vmovdqa %ymm3, (%rdi) 2001; AVX2-NEXT: vzeroupper 2002; AVX2-NEXT: retq 2003; 2004; XOP-LABEL: splat3_128: 2005; XOP: # %bb.0: 2006; XOP-NEXT: vpalignr {{.*#+}} xmm2 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5] 2007; XOP-NEXT: vpalignr {{.*#+}} xmm3 = xmm1[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5] 2008; XOP-NEXT: vpalignr {{.*#+}} xmm4 = xmm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10] 2009; XOP-NEXT: vpalignr {{.*#+}} xmm5 = xmm1[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10] 2010; XOP-NEXT: vpalignr {{.*#+}} xmm6 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4] 2011; XOP-NEXT: vpalignr {{.*#+}} xmm7 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4] 2012; XOP-NEXT: vpalignr {{.*#+}} xmm8 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm3[0,1,2,3,4] 2013; XOP-NEXT: vpalignr {{.*#+}} xmm2 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4] 2014; XOP-NEXT: vpalignr {{.*#+}} xmm5 = xmm1[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4] 2015; XOP-NEXT: vpalignr {{.*#+}} xmm4 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4] 2016; XOP-NEXT: vmovdqa {{.*#+}} xmm3 = [5,16,11,6,17,12,7,18,13,8,19,14,9,20,15,10] 2017; XOP-NEXT: vpperm %xmm3, %xmm4, %xmm2, %xmm2 2018; XOP-NEXT: vpperm %xmm3, %xmm0, %xmm7, %xmm0 2019; XOP-NEXT: vpperm %xmm3, %xmm7, %xmm4, %xmm4 2020; XOP-NEXT: vpperm %xmm3, %xmm1, %xmm6, %xmm1 2021; XOP-NEXT: vpperm %xmm3, %xmm5, %xmm8, %xmm7 2022; XOP-NEXT: vpperm %xmm3, %xmm6, %xmm5, %xmm3 2023; XOP-NEXT: vmovdqa %xmm3, 80(%rdi) 2024; XOP-NEXT: vmovdqa %xmm7, 64(%rdi) 2025; XOP-NEXT: vmovdqa %xmm1, 48(%rdi) 2026; XOP-NEXT: vmovdqa %xmm4, 32(%rdi) 2027; XOP-NEXT: vmovdqa %xmm2, 16(%rdi) 2028; XOP-NEXT: vmovdqa %xmm0, (%rdi) 2029; XOP-NEXT: retq 2030 %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> 2031 %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> 2032 %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> 2033 store <96 x i8> %3, ptr %a2 2034 ret void 2035} 2036 2037; Repeat each element x 3 of <32 x i8> a0 to create a <96 x i8>. 2038define void @splat3_256(<32 x i8> %a0, ptr%a1) { 2039; SSE2-LABEL: splat3_256: 2040; SSE2: # %bb.0: 2041; SSE2-NEXT: pxor %xmm4, %xmm4 2042; SSE2-NEXT: movdqa %xmm0, %xmm3 2043; 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] 2044; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm3[2,3,3,3,4,5,6,7] 2045; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm2[0,1,2,3,4,4,4,5] 2046; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,1,0,1] 2047; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,1,4,5,6,7] 2048; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,6] 2049; SSE2-NEXT: packuswb %xmm5, %xmm2 2050; 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] 2051; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,1,0,1] 2052; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,0,0,1,4,5,6,7] 2053; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,5,6,6] 2054; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3] 2055; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[1,1,2,2,4,5,6,7] 2056; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,6,7,7,7] 2057; SSE2-NEXT: packuswb %xmm5, %xmm3 2058; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm0[2,3,3,3,4,5,6,7] 2059; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,4,4,5] 2060; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 2061; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,1,2,2,4,5,6,7] 2062; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,7,7] 2063; SSE2-NEXT: packuswb %xmm0, %xmm5 2064; SSE2-NEXT: movdqa %xmm1, %xmm0 2065; 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] 2066; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm0[2,3,3,3,4,5,6,7] 2067; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,4,4,4,5] 2068; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,1,0,1] 2069; SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm7[0,0,0,1,4,5,6,7] 2070; SSE2-NEXT: pshufhw {{.*#+}} xmm7 = xmm7[0,1,2,3,5,5,6,6] 2071; SSE2-NEXT: packuswb %xmm6, %xmm7 2072; 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] 2073; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,1,0,1] 2074; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,0,0,1,4,5,6,7] 2075; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,5,6,6] 2076; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 2077; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,1,2,2,4,5,6,7] 2078; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,7,7] 2079; SSE2-NEXT: packuswb %xmm4, %xmm0 2080; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm1[2,3,3,3,4,5,6,7] 2081; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,4,4,5] 2082; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3] 2083; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[1,1,2,2,4,5,6,7] 2084; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,7,7,7] 2085; SSE2-NEXT: packuswb %xmm1, %xmm4 2086; SSE2-NEXT: movdqa %xmm4, 80(%rdi) 2087; SSE2-NEXT: movdqa %xmm0, 64(%rdi) 2088; SSE2-NEXT: movdqa %xmm7, 48(%rdi) 2089; SSE2-NEXT: movdqa %xmm5, 32(%rdi) 2090; SSE2-NEXT: movdqa %xmm3, 16(%rdi) 2091; SSE2-NEXT: movdqa %xmm2, (%rdi) 2092; SSE2-NEXT: retq 2093; 2094; SSE42-LABEL: splat3_256: 2095; SSE42: # %bb.0: 2096; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5] 2097; SSE42-NEXT: movdqa %xmm0, %xmm3 2098; SSE42-NEXT: pshufb %xmm2, %xmm3 2099; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10] 2100; SSE42-NEXT: movdqa %xmm0, %xmm5 2101; SSE42-NEXT: pshufb %xmm4, %xmm5 2102; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15] 2103; SSE42-NEXT: pshufb %xmm6, %xmm0 2104; SSE42-NEXT: movdqa %xmm1, %xmm7 2105; SSE42-NEXT: pshufb %xmm2, %xmm7 2106; SSE42-NEXT: movdqa %xmm1, %xmm2 2107; SSE42-NEXT: pshufb %xmm4, %xmm2 2108; SSE42-NEXT: pshufb %xmm6, %xmm1 2109; SSE42-NEXT: movdqa %xmm1, 80(%rdi) 2110; SSE42-NEXT: movdqa %xmm2, 64(%rdi) 2111; SSE42-NEXT: movdqa %xmm7, 48(%rdi) 2112; SSE42-NEXT: movdqa %xmm0, 32(%rdi) 2113; SSE42-NEXT: movdqa %xmm5, 16(%rdi) 2114; SSE42-NEXT: movdqa %xmm3, (%rdi) 2115; SSE42-NEXT: retq 2116; 2117; AVX1-LABEL: splat3_256: 2118; AVX1: # %bb.0: 2119; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 2120; AVX1-NEXT: vpalignr {{.*#+}} xmm2 = xmm1[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5] 2121; AVX1-NEXT: vpalignr {{.*#+}} xmm3 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5] 2122; AVX1-NEXT: vpalignr {{.*#+}} xmm4 = xmm1[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10] 2123; AVX1-NEXT: vpalignr {{.*#+}} xmm5 = xmm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10] 2124; AVX1-NEXT: vpalignr {{.*#+}} xmm6 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4] 2125; AVX1-NEXT: vpalignr {{.*#+}} xmm7 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4] 2126; AVX1-NEXT: vpalignr {{.*#+}} xmm3 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm3[0,1,2,3,4] 2127; AVX1-NEXT: vpalignr {{.*#+}} xmm2 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4] 2128; AVX1-NEXT: vpalignr {{.*#+}} xmm5 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4] 2129; AVX1-NEXT: vpalignr {{.*#+}} xmm4 = xmm1[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4] 2130; AVX1-NEXT: vpalignr {{.*#+}} xmm1 = xmm7[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4] 2131; AVX1-NEXT: vpalignr {{.*#+}} xmm0 = xmm6[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4] 2132; AVX1-NEXT: vpalignr {{.*#+}} xmm2 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4] 2133; AVX1-NEXT: vpalignr {{.*#+}} xmm3 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4] 2134; AVX1-NEXT: vpalignr {{.*#+}} xmm4 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm7[0,1,2,3,4] 2135; AVX1-NEXT: vpalignr {{.*#+}} xmm5 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm6[0,1,2,3,4] 2136; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5] 2137; AVX1-NEXT: vpshufb %xmm6, %xmm3, %xmm3 2138; AVX1-NEXT: vpshufb %xmm6, %xmm0, %xmm0 2139; AVX1-NEXT: vpshufb %xmm6, %xmm5, %xmm5 2140; AVX1-NEXT: vpshufb %xmm6, %xmm1, %xmm1 2141; AVX1-NEXT: vpshufb %xmm6, %xmm2, %xmm2 2142; AVX1-NEXT: vpshufb %xmm6, %xmm4, %xmm4 2143; AVX1-NEXT: vmovdqa %xmm4, 80(%rdi) 2144; AVX1-NEXT: vmovdqa %xmm2, 64(%rdi) 2145; AVX1-NEXT: vmovdqa %xmm1, 48(%rdi) 2146; AVX1-NEXT: vmovdqa %xmm5, 32(%rdi) 2147; AVX1-NEXT: vmovdqa %xmm3, 16(%rdi) 2148; AVX1-NEXT: vmovdqa %xmm0, (%rdi) 2149; AVX1-NEXT: vzeroupper 2150; AVX1-NEXT: retq 2151; 2152; AVX2-LABEL: splat3_256: 2153; AVX2: # %bb.0: 2154; 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] 2155; 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] 2156; 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] 2157; 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] 2158; 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] 2159; 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] 2160; 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] 2161; 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] 2162; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm3 2163; AVX2-NEXT: vmovdqa {{.*#+}} 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] 2164; AVX2-NEXT: vpshufb %ymm4, %ymm3, %ymm3 2165; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7] 2166; AVX2-NEXT: vpshufb %ymm4, %ymm0, %ymm0 2167; AVX2-NEXT: vperm2i128 {{.*#+}} ymm1 = ymm1[2,3],ymm2[2,3] 2168; AVX2-NEXT: vpshufb %ymm4, %ymm1, %ymm1 2169; AVX2-NEXT: vmovdqa %ymm1, 64(%rdi) 2170; AVX2-NEXT: vmovdqa %ymm0, 32(%rdi) 2171; AVX2-NEXT: vmovdqa %ymm3, (%rdi) 2172; AVX2-NEXT: vzeroupper 2173; AVX2-NEXT: retq 2174; 2175; XOP-LABEL: splat3_256: 2176; XOP: # %bb.0: 2177; XOP-NEXT: vpalignr {{.*#+}} xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5] 2178; XOP-NEXT: vextractf128 $1, %ymm0, %xmm2 2179; XOP-NEXT: vpalignr {{.*#+}} xmm3 = xmm2[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5] 2180; XOP-NEXT: vpalignr {{.*#+}} xmm4 = xmm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10] 2181; XOP-NEXT: vpalignr {{.*#+}} xmm5 = xmm2[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10] 2182; XOP-NEXT: vpalignr {{.*#+}} xmm6 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4] 2183; XOP-NEXT: vpalignr {{.*#+}} xmm7 = xmm1[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4] 2184; XOP-NEXT: vpalignr {{.*#+}} xmm8 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm3[0,1,2,3,4] 2185; XOP-NEXT: vpalignr {{.*#+}} xmm1 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4] 2186; XOP-NEXT: vpalignr {{.*#+}} xmm5 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4] 2187; XOP-NEXT: vpalignr {{.*#+}} xmm4 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4] 2188; XOP-NEXT: vmovdqa {{.*#+}} xmm3 = [5,16,11,6,17,12,7,18,13,8,19,14,9,20,15,10] 2189; XOP-NEXT: vpperm %xmm3, %xmm4, %xmm1, %xmm1 2190; XOP-NEXT: vpperm %xmm3, %xmm0, %xmm7, %xmm0 2191; XOP-NEXT: vpperm %xmm3, %xmm7, %xmm4, %xmm4 2192; XOP-NEXT: vpperm %xmm3, %xmm2, %xmm6, %xmm2 2193; XOP-NEXT: vpperm %xmm3, %xmm5, %xmm8, %xmm7 2194; XOP-NEXT: vpperm %xmm3, %xmm6, %xmm5, %xmm3 2195; XOP-NEXT: vmovdqa %xmm3, 80(%rdi) 2196; XOP-NEXT: vmovdqa %xmm7, 64(%rdi) 2197; XOP-NEXT: vmovdqa %xmm2, 48(%rdi) 2198; XOP-NEXT: vmovdqa %xmm4, 32(%rdi) 2199; XOP-NEXT: vmovdqa %xmm1, 16(%rdi) 2200; XOP-NEXT: vmovdqa %xmm0, (%rdi) 2201; XOP-NEXT: vzeroupper 2202; XOP-NEXT: retq 2203 %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> 2204 %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> 2205 %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> 2206 store <96 x i8> %3, ptr %a1 2207 ret void 2208} 2209 2210; D79987 2211define <16 x i32> @splat_v3i32(ptr %ptr) { 2212; SSE2-LABEL: splat_v3i32: 2213; SSE2: # %bb.0: 2214; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 2215; SSE2-NEXT: xorps %xmm1, %xmm1 2216; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] 2217; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,0,1] 2218; SSE2-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 2219; SSE2-NEXT: xorps %xmm1, %xmm1 2220; SSE2-NEXT: xorps %xmm3, %xmm3 2221; SSE2-NEXT: retq 2222; 2223; SSE42-LABEL: splat_v3i32: 2224; SSE42: # %bb.0: 2225; SSE42-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 2226; SSE42-NEXT: pxor %xmm1, %xmm1 2227; SSE42-NEXT: pxor %xmm2, %xmm2 2228; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm0[0,1],xmm2[2,3,4,5,6,7] 2229; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7] 2230; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,0,1] 2231; SSE42-NEXT: pxor %xmm1, %xmm1 2232; SSE42-NEXT: xorps %xmm3, %xmm3 2233; SSE42-NEXT: retq 2234; 2235; AVX1-LABEL: splat_v3i32: 2236; AVX1: # %bb.0: 2237; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = mem[0,0] 2238; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 2239; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm2[0],ymm1[1],ymm2[2,3,4,5,6,7] 2240; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1],ymm1[2],ymm2[3,4,5,6,7] 2241; AVX1-NEXT: retq 2242; 2243; AVX2-SLOW-LABEL: splat_v3i32: 2244; AVX2-SLOW: # %bb.0: 2245; AVX2-SLOW-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero 2246; AVX2-SLOW-NEXT: vxorps %xmm2, %xmm2, %xmm2 2247; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm0 = ymm2[0],ymm1[1],ymm2[2,3,4,5,6,7] 2248; AVX2-SLOW-NEXT: vbroadcastss %xmm1, %xmm1 2249; AVX2-SLOW-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1],ymm1[2],ymm2[3,4,5,6,7] 2250; AVX2-SLOW-NEXT: retq 2251; 2252; AVX2-FAST-LABEL: splat_v3i32: 2253; AVX2-FAST: # %bb.0: 2254; AVX2-FAST-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 2255; AVX2-FAST-NEXT: vpxor %xmm0, %xmm0, %xmm0 2256; AVX2-FAST-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2,3,4,5,6,7] 2257; 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,zero 2258; AVX2-FAST-NEXT: retq 2259; 2260; XOP-LABEL: splat_v3i32: 2261; XOP: # %bb.0: 2262; XOP-NEXT: vmovddup {{.*#+}} xmm1 = mem[0,0] 2263; XOP-NEXT: vxorps %xmm2, %xmm2, %xmm2 2264; XOP-NEXT: vblendps {{.*#+}} ymm0 = ymm2[0],ymm1[1],ymm2[2,3,4,5,6,7] 2265; XOP-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1],ymm1[2],ymm2[3,4,5,6,7] 2266; XOP-NEXT: retq 2267 %1 = load <3 x i32>, ptr %ptr, align 1 2268 %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> 2269 %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> 2270 ret <16 x i32 > %3 2271} 2272 2273define <2 x double> @wrongorder(<4 x double> %A, ptr %P) #0 { 2274; SSE2-LABEL: wrongorder: 2275; SSE2: # %bb.0: 2276; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0] 2277; SSE2-NEXT: movaps %xmm0, 48(%rdi) 2278; SSE2-NEXT: movaps %xmm0, 32(%rdi) 2279; SSE2-NEXT: movaps %xmm0, 16(%rdi) 2280; SSE2-NEXT: movaps %xmm0, (%rdi) 2281; SSE2-NEXT: retq 2282; 2283; SSE42-LABEL: wrongorder: 2284; SSE42: # %bb.0: 2285; SSE42-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 2286; SSE42-NEXT: movapd %xmm0, 48(%rdi) 2287; SSE42-NEXT: movapd %xmm0, 32(%rdi) 2288; SSE42-NEXT: movapd %xmm0, 16(%rdi) 2289; SSE42-NEXT: movapd %xmm0, (%rdi) 2290; SSE42-NEXT: retq 2291; 2292; AVX1-LABEL: wrongorder: 2293; AVX1: # %bb.0: 2294; AVX1-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0] 2295; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm1 2296; AVX1-NEXT: vmovaps %ymm1, 32(%rdi) 2297; AVX1-NEXT: vmovaps %ymm1, (%rdi) 2298; AVX1-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 2299; AVX1-NEXT: vzeroupper 2300; AVX1-NEXT: retq 2301; 2302; AVX2-LABEL: wrongorder: 2303; AVX2: # %bb.0: 2304; AVX2-NEXT: vbroadcastsd %xmm0, %ymm0 2305; AVX2-NEXT: vmovaps %ymm0, 32(%rdi) 2306; AVX2-NEXT: vmovaps %ymm0, (%rdi) 2307; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 2308; AVX2-NEXT: vzeroupper 2309; AVX2-NEXT: retq 2310; 2311; XOP-LABEL: wrongorder: 2312; XOP: # %bb.0: 2313; XOP-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0] 2314; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm1 2315; XOP-NEXT: vmovaps %ymm1, 32(%rdi) 2316; XOP-NEXT: vmovaps %ymm1, (%rdi) 2317; XOP-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 2318; XOP-NEXT: vzeroupper 2319; XOP-NEXT: retq 2320 %shuffle = shufflevector <4 x double> %A, <4 x double> %A, <8 x i32> zeroinitializer 2321 store <8 x double> %shuffle, ptr %P, align 64 2322 %m2 = load <8 x double>, ptr %P, align 64 2323 store <8 x double> %m2, ptr %P, align 64 2324 %m3 = load <8 x double>, ptr %P, align 64 2325 %m4 = shufflevector <8 x double> %m3, <8 x double> undef, <2 x i32> <i32 2, i32 0> 2326 ret <2 x double> %m4 2327} 2328 2329define void @PR41097() { 2330; SSE2-LABEL: PR41097: 2331; SSE2: # %bb.0: 2332; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2333; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2334; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7] 2335; SSE2-NEXT: psrad $24, %xmm0 2336; SSE2-NEXT: pxor %xmm1, %xmm1 2337; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 2338; SSE2-NEXT: movdqu %xmm0, (%rax) 2339; SSE2-NEXT: retq 2340; 2341; SSE42-LABEL: PR41097: 2342; SSE42: # %bb.0: 2343; SSE42-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2344; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,3,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 2345; SSE42-NEXT: pmovsxbd %xmm0, %xmm0 2346; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 2347; SSE42-NEXT: movdqu %xmm0, (%rax) 2348; SSE42-NEXT: retq 2349; 2350; AVX-LABEL: PR41097: 2351; AVX: # %bb.0: 2352; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2353; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,3,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 2354; AVX-NEXT: vpmovsxbd %xmm0, %xmm0 2355; AVX-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 2356; AVX-NEXT: vmovdqu %xmm0, (%rax) 2357; AVX-NEXT: retq 2358; 2359; XOP-LABEL: PR41097: 2360; XOP: # %bb.0: 2361; XOP-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2362; XOP-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,3,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 2363; XOP-NEXT: vpmovsxbd %xmm0, %xmm0 2364; XOP-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 2365; XOP-NEXT: vmovdqu %xmm0, (%rax) 2366; XOP-NEXT: retq 2367 %wide.vec = load <6 x i8>, ptr undef, align 1 2368 %strided.vec = shufflevector <6 x i8> %wide.vec, <6 x i8> undef, <2 x i32> <i32 0, i32 3> 2369 %tmp = sext <2 x i8> %strided.vec to <2 x i32> 2370 %tmp7 = zext <2 x i32> %tmp to <2 x i64> 2371 store <2 x i64> %tmp7, ptr undef, align 8 2372 ret void 2373} 2374 2375define void @D107009(ptr %input, ptr %output) { 2376; SSE-LABEL: D107009: 2377; SSE: # %bb.0: 2378; SSE-NEXT: movdqa 16(%rdi), %xmm0 2379; SSE-NEXT: movdqa 80(%rdi), %xmm1 2380; SSE-NEXT: movdqa 144(%rdi), %xmm2 2381; SSE-NEXT: movdqa 208(%rdi), %xmm3 2382; SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1] 2383; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] 2384; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2385; SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[1],mem[1] 2386; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[1],mem[1] 2387; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] 2388; SSE-NEXT: psrld $16, %xmm2 2389; SSE-NEXT: psrld $16, %xmm0 2390; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 2391; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3] 2392; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm0[3,3,3,3] 2393; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,1,1] 2394; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm2[2,3,2,3] 2395; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm2[3,3,3,3] 2396; SSE-NEXT: movdqa %xmm0, 128(%rsi) 2397; SSE-NEXT: movdqa %xmm2, 144(%rsi) 2398; SSE-NEXT: movdqa %xmm0, 16(%rsi) 2399; SSE-NEXT: movdqa %xmm7, 240(%rsi) 2400; SSE-NEXT: movdqa %xmm6, 208(%rsi) 2401; SSE-NEXT: movdqa %xmm5, 176(%rsi) 2402; SSE-NEXT: movdqa %xmm4, 112(%rsi) 2403; SSE-NEXT: movdqa %xmm3, 80(%rsi) 2404; SSE-NEXT: movdqa %xmm1, 48(%rsi) 2405; SSE-NEXT: retq 2406; 2407; AVX1-LABEL: D107009: 2408; AVX1: # %bb.0: 2409; AVX1-NEXT: vmovups 96(%rdi), %ymm0 2410; AVX1-NEXT: vmovups (%rdi), %ymm1 2411; AVX1-NEXT: vmovups 128(%rdi), %ymm2 2412; AVX1-NEXT: vmovups 224(%rdi), %ymm3 2413; AVX1-NEXT: vunpcklpd {{.*#+}} ymm3 = ymm3[0],mem[0],ymm3[2],mem[2] 2414; AVX1-NEXT: vunpcklps {{.*#+}} ymm2 = ymm2[0],mem[0],ymm2[1],mem[1],ymm2[4],mem[4],ymm2[5],mem[5] 2415; AVX1-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2,0],ymm2[4,5],ymm3[6,4] 2416; AVX1-NEXT: vunpcklps {{.*#+}} ymm1 = ymm1[0],mem[0],ymm1[1],mem[1],ymm1[4],mem[4],ymm1[5],mem[5] 2417; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 2418; AVX1-NEXT: vunpcklpd {{.*#+}} ymm0 = ymm0[0],mem[0],ymm0[2],mem[2] 2419; AVX1-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[0,1,2,0,4,5,6,4] 2420; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2421; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 2422; AVX1-NEXT: vpsrld $16, %xmm0, %xmm0 2423; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm1 2424; AVX1-NEXT: vpsrld $16, %xmm1, %xmm1 2425; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 2426; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[0,1,1,3] 2427; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[2,1,3,3] 2428; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 2429; AVX1-NEXT: vmovshdup {{.*#+}} ymm3 = ymm1[1,1,3,3,5,5,7,7] 2430; AVX1-NEXT: vpermilps {{.*#+}} ymm4 = ymm1[3,3,3,3,7,7,7,7] 2431; AVX1-NEXT: vpermilpd {{.*#+}} ymm5 = ymm1[0,0,3,2] 2432; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm0[1,1,1,1] 2433; AVX1-NEXT: vpshufd {{.*#+}} xmm7 = xmm0[3,3,3,3] 2434; AVX1-NEXT: vmovdqa %xmm0, 16(%rsi) 2435; AVX1-NEXT: vmovdqa %xmm7, 112(%rsi) 2436; AVX1-NEXT: vmovdqa %xmm6, 48(%rsi) 2437; AVX1-NEXT: vmovups %ymm1, 128(%rsi) 2438; AVX1-NEXT: vmovupd %ymm5, 192(%rsi) 2439; AVX1-NEXT: vmovups %ymm4, 224(%rsi) 2440; AVX1-NEXT: vmovups %ymm3, 160(%rsi) 2441; AVX1-NEXT: vmovups %ymm2, 64(%rsi) 2442; AVX1-NEXT: vzeroupper 2443; AVX1-NEXT: retq 2444; 2445; AVX2-LABEL: D107009: 2446; AVX2: # %bb.0: 2447; AVX2-NEXT: vmovdqu 64(%rdi), %ymm0 2448; AVX2-NEXT: vmovdqu 128(%rdi), %ymm1 2449; AVX2-NEXT: vmovdqu 192(%rdi), %ymm2 2450; AVX2-NEXT: vpunpckldq {{.*#+}} ymm2 = ymm2[0],mem[0],ymm2[1],mem[1],ymm2[4],mem[4],ymm2[5],mem[5] 2451; AVX2-NEXT: vpunpckldq {{.*#+}} ymm1 = ymm1[0],mem[0],ymm1[1],mem[1],ymm1[4],mem[4],ymm1[5],mem[5] 2452; AVX2-NEXT: vpunpcklqdq {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[2],ymm2[2] 2453; AVX2-NEXT: vpbroadcastd 48(%rdi), %xmm2 2454; AVX2-NEXT: vpbroadcastd 16(%rdi), %ymm3 2455; AVX2-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1] 2456; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5] 2457; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,2,2,2] 2458; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3] 2459; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7] 2460; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0 2461; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 2462; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[3,3,3,3] 2463; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,1,1] 2464; AVX2-NEXT: vpbroadcastd %xmm0, %ymm4 2465; AVX2-NEXT: vpshufd {{.*#+}} ymm5 = ymm0[3,3,3,3,7,7,7,7] 2466; AVX2-NEXT: vpshufd {{.*#+}} ymm6 = ymm0[2,3,2,3,6,7,6,7] 2467; AVX2-NEXT: vpshufd {{.*#+}} ymm7 = ymm0[1,1,1,1,5,5,5,5] 2468; AVX2-NEXT: vmovdqu %ymm0, 128(%rsi) 2469; AVX2-NEXT: vmovdqu %ymm7, 160(%rsi) 2470; AVX2-NEXT: vmovdqu %ymm6, 192(%rsi) 2471; AVX2-NEXT: vmovdqu %ymm5, 224(%rsi) 2472; AVX2-NEXT: vmovdqu %ymm4, (%rsi) 2473; AVX2-NEXT: vmovdqa %xmm3, 48(%rsi) 2474; AVX2-NEXT: vmovdqa %xmm2, 112(%rsi) 2475; AVX2-NEXT: vmovdqu %ymm1, 64(%rsi) 2476; AVX2-NEXT: vzeroupper 2477; AVX2-NEXT: retq 2478; 2479; XOP-LABEL: D107009: 2480; XOP: # %bb.0: 2481; XOP-NEXT: vmovups 96(%rdi), %ymm0 2482; XOP-NEXT: vmovups (%rdi), %ymm1 2483; XOP-NEXT: vmovups 128(%rdi), %ymm2 2484; XOP-NEXT: vmovups 224(%rdi), %ymm3 2485; XOP-NEXT: vunpcklpd {{.*#+}} ymm3 = ymm3[0],mem[0],ymm3[2],mem[2] 2486; XOP-NEXT: vunpcklps {{.*#+}} ymm2 = ymm2[0],mem[0],ymm2[1],mem[1],ymm2[4],mem[4],ymm2[5],mem[5] 2487; XOP-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2,0],ymm2[4,5],ymm3[6,4] 2488; XOP-NEXT: vunpcklps {{.*#+}} ymm1 = ymm1[0],mem[0],ymm1[1],mem[1],ymm1[4],mem[4],ymm1[5],mem[5] 2489; XOP-NEXT: vextractf128 $1, %ymm1, %xmm1 2490; XOP-NEXT: vunpcklpd {{.*#+}} ymm0 = ymm0[0],mem[0],ymm0[2],mem[2] 2491; XOP-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[0,1,2,0,4,5,6,4] 2492; XOP-NEXT: vextractf128 $1, %ymm0, %xmm0 2493; XOP-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 2494; XOP-NEXT: vpsrld $16, %xmm0, %xmm0 2495; XOP-NEXT: vextractf128 $1, %ymm2, %xmm1 2496; XOP-NEXT: vpsrld $16, %xmm1, %xmm1 2497; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 2498; XOP-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[0,1,1,3] 2499; XOP-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[2,1,3,3] 2500; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 2501; XOP-NEXT: vmovshdup {{.*#+}} ymm3 = ymm1[1,1,3,3,5,5,7,7] 2502; XOP-NEXT: vpermilps {{.*#+}} ymm4 = ymm1[3,3,3,3,7,7,7,7] 2503; XOP-NEXT: vpermilpd {{.*#+}} ymm5 = ymm1[0,0,3,2] 2504; XOP-NEXT: vpshufd {{.*#+}} xmm6 = xmm0[1,1,1,1] 2505; XOP-NEXT: vpshufd {{.*#+}} xmm7 = xmm0[3,3,3,3] 2506; XOP-NEXT: vmovdqa %xmm0, 16(%rsi) 2507; XOP-NEXT: vmovdqa %xmm7, 112(%rsi) 2508; XOP-NEXT: vmovdqa %xmm6, 48(%rsi) 2509; XOP-NEXT: vmovups %ymm1, 128(%rsi) 2510; XOP-NEXT: vmovupd %ymm5, 192(%rsi) 2511; XOP-NEXT: vmovups %ymm4, 224(%rsi) 2512; XOP-NEXT: vmovups %ymm3, 160(%rsi) 2513; XOP-NEXT: vmovups %ymm2, 64(%rsi) 2514; XOP-NEXT: vzeroupper 2515; XOP-NEXT: retq 2516 %i = load <64 x i32>, ptr %input, align 16 2517 %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> 2518 %i3 = lshr <8 x i32> %i2, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16> 2519 %i4 = add <8 x i32> zeroinitializer, %i3 2520 %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> 2521 %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> 2522 %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> 2523 store <64 x i32> %i7, ptr %output, align 16 2524 ret void 2525} 2526