brintos

brintos / llvm-project-archived public Read only

0
0
Text · 36.6 KiB · aec3140 Raw
603 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_mem_shuffle2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=SSE3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse3 | FileCheck %s --check-prefix=SSE4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX17; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX28 9; PR2128110define <64 x i16> @interleave8x8(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c, <8 x i16> %d, <8 x i16> %e, <8 x i16> %f, <8 x i16> %h, <8 x i16> %g) {11; SSE-LABEL: interleave8x8:12; SSE:       # %bb.0:13; SSE-NEXT:    movq %rdi, %rax14; SSE-NEXT:    movdqa %xmm0, %xmm815; SSE-NEXT:    punpcklwd {{.*#+}} xmm8 = xmm8[0],xmm1[0],xmm8[1],xmm1[1],xmm8[2],xmm1[2],xmm8[3],xmm1[3]16; SSE-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]17; SSE-NEXT:    movdqa %xmm2, %xmm918; SSE-NEXT:    punpcklwd {{.*#+}} xmm9 = xmm9[0],xmm3[0],xmm9[1],xmm3[1],xmm9[2],xmm3[2],xmm9[3],xmm3[3]19; SSE-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]20; SSE-NEXT:    movdqa %xmm0, %xmm321; SSE-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm2[2],xmm3[3],xmm2[3]22; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]23; SSE-NEXT:    movdqa %xmm8, %xmm124; SSE-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm9[2],xmm1[3],xmm9[3]25; SSE-NEXT:    punpckldq {{.*#+}} xmm8 = xmm8[0],xmm9[0],xmm8[1],xmm9[1]26; SSE-NEXT:    movdqa %xmm4, %xmm227; SSE-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1],xmm2[2],xmm5[2],xmm2[3],xmm5[3]28; SSE-NEXT:    punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm5[4],xmm4[5],xmm5[5],xmm4[6],xmm5[6],xmm4[7],xmm5[7]29; SSE-NEXT:    movdqa %xmm7, %xmm530; SSE-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm6[0],xmm5[1],xmm6[1],xmm5[2],xmm6[2],xmm5[3],xmm6[3]31; SSE-NEXT:    punpckhwd {{.*#+}} xmm7 = xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7]32; SSE-NEXT:    movdqa %xmm4, %xmm633; SSE-NEXT:    punpckhdq {{.*#+}} xmm6 = xmm6[2],xmm7[2],xmm6[3],xmm7[3]34; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm7[0],xmm4[1],xmm7[1]35; SSE-NEXT:    movdqa %xmm2, %xmm736; SSE-NEXT:    punpckhdq {{.*#+}} xmm7 = xmm7[2],xmm5[2],xmm7[3],xmm5[3]37; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]38; SSE-NEXT:    movdqa %xmm8, %xmm539; SSE-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3]40; SSE-NEXT:    punpckhwd {{.*#+}} xmm8 = xmm8[4],xmm2[4],xmm8[5],xmm2[5],xmm8[6],xmm2[6],xmm8[7],xmm2[7]41; SSE-NEXT:    movdqa %xmm1, %xmm242; SSE-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1],xmm2[2],xmm7[2],xmm2[3],xmm7[3]43; SSE-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm7[4],xmm1[5],xmm7[5],xmm1[6],xmm7[6],xmm1[7],xmm7[7]44; SSE-NEXT:    movdqa %xmm0, %xmm745; SSE-NEXT:    punpcklwd {{.*#+}} xmm7 = xmm7[0],xmm4[0],xmm7[1],xmm4[1],xmm7[2],xmm4[2],xmm7[3],xmm4[3]46; SSE-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]47; SSE-NEXT:    movdqa %xmm3, %xmm448; SSE-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1],xmm4[2],xmm6[2],xmm4[3],xmm6[3]49; SSE-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm6[4],xmm3[5],xmm6[5],xmm3[6],xmm6[6],xmm3[7],xmm6[7]50; SSE-NEXT:    movdqa %xmm3, 112(%rdi)51; SSE-NEXT:    movdqa %xmm4, 96(%rdi)52; SSE-NEXT:    movdqa %xmm0, 80(%rdi)53; SSE-NEXT:    movdqa %xmm7, 64(%rdi)54; SSE-NEXT:    movdqa %xmm1, 48(%rdi)55; SSE-NEXT:    movdqa %xmm2, 32(%rdi)56; SSE-NEXT:    movdqa %xmm8, 16(%rdi)57; SSE-NEXT:    movdqa %xmm5, (%rdi)58; SSE-NEXT:    retq59;60; AVX1-LABEL: interleave8x8:61; AVX1:       # %bb.0:62; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm8 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]63; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]64; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]65; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm2 = xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]66; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm3 = xmm0[2],xmm2[2],xmm0[3],xmm2[3]67; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm2 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]68; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm9 = xmm8[2],xmm1[2],xmm8[3],xmm1[3]69; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm8[0],xmm1[0],xmm8[1],xmm1[1]70; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm4[0],xmm5[0],xmm4[1],xmm5[1],xmm4[2],xmm5[2],xmm4[3],xmm5[3]71; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm4 = xmm4[4],xmm5[4],xmm4[5],xmm5[5],xmm4[6],xmm5[6],xmm4[7],xmm5[7]72; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm5 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3]73; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm6 = xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7]74; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm7 = xmm4[2],xmm6[2],xmm4[3],xmm6[3]75; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]76; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm6 = xmm1[2],xmm5[2],xmm1[3],xmm5[3]77; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1]78; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm5 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]79; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]80; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm081; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm9[4],xmm6[4],xmm9[5],xmm6[5],xmm9[6],xmm6[6],xmm9[7],xmm6[7]82; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm5 = xmm9[0],xmm6[0],xmm9[1],xmm6[1],xmm9[2],xmm6[2],xmm9[3],xmm6[3]83; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm5, %ymm184; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm5 = xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]85; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]86; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm2, %ymm287; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm4 = xmm3[4],xmm7[4],xmm3[5],xmm7[5],xmm3[6],xmm7[6],xmm3[7],xmm7[7]88; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm3 = xmm3[0],xmm7[0],xmm3[1],xmm7[1],xmm3[2],xmm7[2],xmm3[3],xmm7[3]89; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm390; AVX1-NEXT:    retq91;92; AVX2-LABEL: interleave8x8:93; AVX2:       # %bb.0:94; AVX2-NEXT:    vpunpckhwd {{.*#+}} xmm8 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]95; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]96; AVX2-NEXT:    vinserti128 $1, %xmm8, %ymm0, %ymm097; AVX2-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]98; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]99; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1100; AVX2-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]101; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]102; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm3 = ymm0[2,3],ymm2[2,3]103; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm0[0,1],ymm2[0,1]104; AVX2-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm4[4],xmm5[4],xmm4[5],xmm5[5],xmm4[6],xmm5[6],xmm4[7],xmm5[7]105; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm4[0],xmm5[0],xmm4[1],xmm5[1],xmm4[2],xmm5[2],xmm4[3],xmm5[3]106; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1107; AVX2-NEXT:    vpunpckhwd {{.*#+}} xmm2 = xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7]108; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm4 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3]109; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm4, %ymm2110; AVX2-NEXT:    vpunpckhdq {{.*#+}} ymm4 = ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[6],ymm2[6],ymm1[7],ymm2[7]111; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[4],ymm2[4],ymm1[5],ymm2[5]112; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm2 = ymm1[2,3],ymm4[2,3]113; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm1 = ymm1[0,1],ymm4[0,1]114; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15]115; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11]116; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm1[0,1],ymm4[0,1]117; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm1 = ymm1[2,3],ymm4[2,3]118; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm3[4],ymm2[4],ymm3[5],ymm2[5],ymm3[6],ymm2[6],ymm3[7],ymm2[7],ymm3[12],ymm2[12],ymm3[13],ymm2[13],ymm3[14],ymm2[14],ymm3[15],ymm2[15]119; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm3 = ymm3[0],ymm2[0],ymm3[1],ymm2[1],ymm3[2],ymm2[2],ymm3[3],ymm2[3],ymm3[8],ymm2[8],ymm3[9],ymm2[9],ymm3[10],ymm2[10],ymm3[11],ymm2[11]120; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm2 = ymm3[0,1],ymm4[0,1]121; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm3 = ymm3[2,3],ymm4[2,3]122; AVX2-NEXT:    retq123  %ab = shufflevector <8 x i16> %a, <8 x i16> %b, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>124  %cd = shufflevector <8 x i16> %c, <8 x i16> %d, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>125  %ab32 = bitcast <16 x i16> %ab to <8 x i32>126  %cd32 = bitcast <16 x i16> %cd to <8 x i32>127  %abcd32 = shufflevector <8 x i32> %ab32, <8 x i32> %cd32, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>128  %abcd = bitcast <16 x i32> %abcd32 to <32 x i16>129 130  %ef = shufflevector <8 x i16> %e, <8 x i16> %f, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>131  %gh = shufflevector <8 x i16> %g, <8 x i16> %h, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>132  %ef32 = bitcast <16 x i16> %ef to <8 x i32>133  %gh32 = bitcast <16 x i16> %gh to <8 x i32>134  %efgh32 = shufflevector <8 x i32> %ef32, <8 x i32> %gh32, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>135  %efgh = bitcast <16 x i32> %efgh32 to <32 x i16>136 137  %result = shufflevector <32 x i16> %abcd, <32 x i16> %efgh, <64 x i32> <i32 0, i32 32, i32 1, i32 33, i32 2, i32 34, i32 3, i32 35, i32 4, i32 36, i32 5, i32 37, i32 6, i32 38, i32 7, i32 39, i32 8, i32 40, i32 9, i32 41, i32 10, i32 42, i32 11, i32 43, i32 12, i32 44, i32 13, i32 45, i32 14, i32 46, i32 15, i32 47, i32 16, i32 48, i32 17, i32 49, i32 18, i32 50, i32 19, i32 51, i32 20, i32 52, i32 21, i32 53, i32 22, i32 54, i32 23, i32 55, i32 24, i32 56, i32 25, i32 57, i32 26, i32 58, i32 27, i32 59, i32 28, i32 60, i32 29, i32 61, i32 30, i32 62, i32 31, i32 63>138  ret <64 x i16> %result139}140 141define <8 x double> @interleave2x4f64(<4 x double> %a, <4 x double> %b) {142; SSE-LABEL: interleave2x4f64:143; SSE:       # %bb.0:144; SSE-NEXT:    movaps %xmm0, %xmm4145; SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]146; SSE-NEXT:    unpckhpd {{.*#+}} xmm4 = xmm4[1],xmm2[1]147; SSE-NEXT:    movaps %xmm1, %xmm2148; SSE-NEXT:    movlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]149; SSE-NEXT:    movhlps {{.*#+}} xmm3 = xmm1[1],xmm3[1]150; SSE-NEXT:    movaps %xmm4, %xmm1151; SSE-NEXT:    retq152;153; AVX1-LABEL: interleave2x4f64:154; AVX1:       # %bb.0:155; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm1[2,3,2,3]156; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm3 = ymm0[2,3,2,3]157; AVX1-NEXT:    vshufpd {{.*#+}} ymm2 = ymm3[0],ymm2[0],ymm3[3],ymm2[3]158; AVX1-NEXT:    vunpckhpd {{.*#+}} xmm3 = xmm0[1],xmm1[1]159; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]160; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0161; AVX1-NEXT:    vmovapd %ymm2, %ymm1162; AVX1-NEXT:    retq163;164; AVX2-LABEL: interleave2x4f64:165; AVX2:       # %bb.0:166; AVX2-NEXT:    vpermpd {{.*#+}} ymm2 = ymm1[0,0,2,1]167; AVX2-NEXT:    vpermpd {{.*#+}} ymm3 = ymm0[0,1,1,3]168; AVX2-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3]169; AVX2-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[2,1,2,3]170; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,1,2,3]171; AVX2-NEXT:    vshufpd {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[3],ymm1[3]172; AVX2-NEXT:    vmovapd %ymm2, %ymm0173; AVX2-NEXT:    retq174  %result = shufflevector <4 x double> %a, <4 x double> %b, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>175  ret <8 x double> %result176}177 178define <8 x i64> @interleave2x4i64(<4 x i64> %a, <4 x i64> %b) {179; SSE-LABEL: interleave2x4i64:180; SSE:       # %bb.0:181; SSE-NEXT:    movaps %xmm1, %xmm4182; SSE-NEXT:    movaps %xmm0, %xmm1183; SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]184; SSE-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm2[1]185; SSE-NEXT:    movaps %xmm4, %xmm2186; SSE-NEXT:    movlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]187; SSE-NEXT:    unpckhpd {{.*#+}} xmm4 = xmm4[1],xmm3[1]188; SSE-NEXT:    movaps %xmm4, %xmm3189; SSE-NEXT:    retq190;191; AVX1-LABEL: interleave2x4i64:192; AVX1:       # %bb.0:193; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm1[2,3,2,3]194; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm3 = ymm0[2,3,2,3]195; AVX1-NEXT:    vshufpd {{.*#+}} ymm2 = ymm3[0],ymm2[0],ymm3[3],ymm2[3]196; AVX1-NEXT:    vunpckhpd {{.*#+}} xmm3 = xmm0[1],xmm1[1]197; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]198; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0199; AVX1-NEXT:    vmovapd %ymm2, %ymm1200; AVX1-NEXT:    retq201;202; AVX2-LABEL: interleave2x4i64:203; AVX2:       # %bb.0:204; AVX2-NEXT:    vpermpd {{.*#+}} ymm2 = ymm1[0,0,2,1]205; AVX2-NEXT:    vpermpd {{.*#+}} ymm3 = ymm0[0,1,1,3]206; AVX2-NEXT:    vblendps {{.*#+}} ymm2 = ymm3[0,1],ymm2[2,3],ymm3[4,5],ymm2[6,7]207; AVX2-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,2,2,3]208; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,1,3,3]209; AVX2-NEXT:    vblendps {{.*#+}} ymm1 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]210; AVX2-NEXT:    vmovaps %ymm2, %ymm0211; AVX2-NEXT:    retq212  %result = shufflevector <4 x i64> %a, <4 x i64> %b, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>213  ret <8 x i64> %result214}215 216define <16 x float> @interleave2x8f32(<8 x float> %a, <8 x float> %b) {217; SSE-LABEL: interleave2x8f32:218; SSE:       # %bb.0:219; SSE-NEXT:    movaps %xmm1, %xmm4220; SSE-NEXT:    movaps %xmm0, %xmm1221; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]222; SSE-NEXT:    unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]223; SSE-NEXT:    movaps %xmm4, %xmm2224; SSE-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]225; SSE-NEXT:    unpckhps {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]226; SSE-NEXT:    movaps %xmm4, %xmm3227; SSE-NEXT:    retq228;229; AVX1-LABEL: interleave2x8f32:230; AVX1:       # %bb.0:231; AVX1-NEXT:    vunpckhps {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]232; AVX1-NEXT:    vunpcklps {{.*#+}} xmm3 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]233; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2234; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1235; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0236; AVX1-NEXT:    vunpckhps {{.*#+}} xmm3 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]237; AVX1-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]238; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm1239; AVX1-NEXT:    vmovaps %ymm2, %ymm0240; AVX1-NEXT:    retq241;242; AVX2-LABEL: interleave2x8f32:243; AVX2:       # %bb.0:244; AVX2-NEXT:    vunpckhps {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]245; AVX2-NEXT:    vunpcklps {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]246; AVX2-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm1[0,1],ymm2[0,1]247; AVX2-NEXT:    vperm2f128 {{.*#+}} ymm1 = ymm1[2,3],ymm2[2,3]248; AVX2-NEXT:    retq249  %result = shufflevector <8 x float> %a, <8 x float> %b, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>250  ret <16 x float> %result251}252 253define <16 x i32> @interleave2x8i32(<8 x i32> %a, <8 x i32> %b) {254; SSE-LABEL: interleave2x8i32:255; SSE:       # %bb.0:256; SSE-NEXT:    movaps %xmm1, %xmm4257; SSE-NEXT:    movaps %xmm0, %xmm1258; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]259; SSE-NEXT:    unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]260; SSE-NEXT:    movaps %xmm4, %xmm2261; SSE-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]262; SSE-NEXT:    unpckhps {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]263; SSE-NEXT:    movaps %xmm4, %xmm3264; SSE-NEXT:    retq265;266; AVX1-LABEL: interleave2x8i32:267; AVX1:       # %bb.0:268; AVX1-NEXT:    vunpckhps {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]269; AVX1-NEXT:    vunpcklps {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]270; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm1 = ymm0[2,3],ymm2[2,3]271; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0272; AVX1-NEXT:    retq273;274; AVX2-LABEL: interleave2x8i32:275; AVX2:       # %bb.0:276; AVX2-NEXT:    vunpckhps {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]277; AVX2-NEXT:    vunpcklps {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]278; AVX2-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm1[0,1],ymm2[0,1]279; AVX2-NEXT:    vperm2f128 {{.*#+}} ymm1 = ymm1[2,3],ymm2[2,3]280; AVX2-NEXT:    retq281  %result = shufflevector <8 x i32> %a, <8 x i32> %b, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>282  ret <16 x i32> %result283}284 285define <32 x i16> @interleave2x16i16(<16 x i16> %a, <16 x i16> %b) {286; SSE-LABEL: interleave2x16i16:287; SSE:       # %bb.0:288; SSE-NEXT:    movdqa %xmm1, %xmm4289; SSE-NEXT:    movdqa %xmm0, %xmm1290; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]291; SSE-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]292; SSE-NEXT:    movdqa %xmm4, %xmm2293; SSE-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]294; SSE-NEXT:    punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]295; SSE-NEXT:    movdqa %xmm4, %xmm3296; SSE-NEXT:    retq297;298; AVX1-LABEL: interleave2x16i16:299; AVX1:       # %bb.0:300; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm2 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]301; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm3 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]302; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2303; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1304; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0305; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm3 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]306; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]307; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm1308; AVX1-NEXT:    vmovaps %ymm2, %ymm0309; AVX1-NEXT:    retq310;311; AVX2-LABEL: interleave2x16i16:312; AVX2:       # %bb.0:313; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm2 = ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15]314; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11]315; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm1[0,1],ymm2[0,1]316; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm1 = ymm1[2,3],ymm2[2,3]317; AVX2-NEXT:    retq318  %result = shufflevector <16 x i16> %a, <16 x i16> %b, <32 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23, i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>319  ret <32 x i16> %result320}321 322define <64 x i16> @interleave2x32i16(<32 x i16> %a, <32 x i16> %b) {323; SSE-LABEL: interleave2x32i16:324; SSE:       # %bb.0:325; SSE-NEXT:    movq %rdi, %rax326; SSE-NEXT:    movdqa %xmm0, %xmm8327; SSE-NEXT:    punpcklwd {{.*#+}} xmm8 = xmm8[0],xmm4[0],xmm8[1],xmm4[1],xmm8[2],xmm4[2],xmm8[3],xmm4[3]328; SSE-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]329; SSE-NEXT:    movdqa %xmm1, %xmm4330; SSE-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1],xmm4[2],xmm5[2],xmm4[3],xmm5[3]331; SSE-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm5[4],xmm1[5],xmm5[5],xmm1[6],xmm5[6],xmm1[7],xmm5[7]332; SSE-NEXT:    movdqa %xmm2, %xmm5333; SSE-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm6[0],xmm5[1],xmm6[1],xmm5[2],xmm6[2],xmm5[3],xmm6[3]334; SSE-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm6[4],xmm2[5],xmm6[5],xmm2[6],xmm6[6],xmm2[7],xmm6[7]335; SSE-NEXT:    movdqa %xmm3, %xmm6336; SSE-NEXT:    punpcklwd {{.*#+}} xmm6 = xmm6[0],xmm7[0],xmm6[1],xmm7[1],xmm6[2],xmm7[2],xmm6[3],xmm7[3]337; SSE-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm7[4],xmm3[5],xmm7[5],xmm3[6],xmm7[6],xmm3[7],xmm7[7]338; SSE-NEXT:    movdqa %xmm3, 112(%rdi)339; SSE-NEXT:    movdqa %xmm6, 96(%rdi)340; SSE-NEXT:    movdqa %xmm2, 80(%rdi)341; SSE-NEXT:    movdqa %xmm5, 64(%rdi)342; SSE-NEXT:    movdqa %xmm1, 48(%rdi)343; SSE-NEXT:    movdqa %xmm4, 32(%rdi)344; SSE-NEXT:    movdqa %xmm0, 16(%rdi)345; SSE-NEXT:    movdqa %xmm8, (%rdi)346; SSE-NEXT:    retq347;348; AVX1-LABEL: interleave2x32i16:349; AVX1:       # %bb.0:350; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm4 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]351; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm5 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]352; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4353; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2354; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0355; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm5 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]356; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]357; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm5358; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]359; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]360; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm2361; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm0362; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1363; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm3 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]364; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]365; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm3366; AVX1-NEXT:    vmovaps %ymm4, %ymm0367; AVX1-NEXT:    vmovaps %ymm5, %ymm1368; AVX1-NEXT:    retq369;370; AVX2-LABEL: interleave2x32i16:371; AVX2:       # %bb.0:372; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15]373; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11]374; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm2[0,1],ymm4[0,1]375; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm4 = ymm2[2,3],ymm4[2,3]376; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm1[4],ymm3[4],ymm1[5],ymm3[5],ymm1[6],ymm3[6],ymm1[7],ymm3[7],ymm1[12],ymm3[12],ymm1[13],ymm3[13],ymm1[14],ymm3[14],ymm1[15],ymm3[15]377; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm3[0],ymm1[1],ymm3[1],ymm1[2],ymm3[2],ymm1[3],ymm3[3],ymm1[8],ymm3[8],ymm1[9],ymm3[9],ymm1[10],ymm3[10],ymm1[11],ymm3[11]378; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm2 = ymm1[0,1],ymm5[0,1]379; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm3 = ymm1[2,3],ymm5[2,3]380; AVX2-NEXT:    vmovdqa %ymm4, %ymm1381; AVX2-NEXT:    retq382  %result = shufflevector <32 x i16> %a, <32 x i16> %b, <64 x i32> <i32 0, i32 32, i32 1, i32 33, i32 2, i32 34, i32 3, i32 35, i32 4, i32 36, i32 5, i32 37, i32 6, i32 38, i32 7, i32 39, i32 8, i32 40, i32 9, i32 41, i32 10, i32 42, i32 11, i32 43, i32 12, i32 44, i32 13, i32 45, i32 14, i32 46, i32 15, i32 47, i32 16, i32 48, i32 17, i32 49, i32 18, i32 50, i32 19, i32 51, i32 20, i32 52, i32 21, i32 53, i32 22, i32 54, i32 23, i32 55, i32 24, i32 56, i32 25, i32 57, i32 26, i32 58, i32 27, i32 59, i32 28, i32 60, i32 29, i32 61, i32 30, i32 62, i32 31, i32 63>383  ret <64 x i16> %result384}385 386define <64 x i8> @interleave2x32i8(<32 x i8> %a, <32 x i8> %b) {387; SSE-LABEL: interleave2x32i8:388; SSE:       # %bb.0:389; SSE-NEXT:    movdqa %xmm1, %xmm4390; SSE-NEXT:    movdqa %xmm0, %xmm1391; SSE-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]392; SSE-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]393; SSE-NEXT:    movdqa %xmm4, %xmm2394; SSE-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]395; SSE-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm3[8],xmm4[9],xmm3[9],xmm4[10],xmm3[10],xmm4[11],xmm3[11],xmm4[12],xmm3[12],xmm4[13],xmm3[13],xmm4[14],xmm3[14],xmm4[15],xmm3[15]396; SSE-NEXT:    movdqa %xmm4, %xmm3397; SSE-NEXT:    retq398;399; AVX1-LABEL: interleave2x32i8:400; AVX1:       # %bb.0:401; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]402; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm3 = 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]403; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2404; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1405; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0406; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]407; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]408; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm1409; AVX1-NEXT:    vmovaps %ymm2, %ymm0410; AVX1-NEXT:    retq411;412; AVX2-LABEL: interleave2x32i8:413; AVX2:       # %bb.0:414; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]415; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]416; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm1[0,1],ymm2[0,1]417; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm1 = ymm1[2,3],ymm2[2,3]418; AVX2-NEXT:    retq419  %result = shufflevector <32 x i8> %a, <32 x i8> %b, <64 x i32> <i32 0, i32 32, i32 1, i32 33, i32 2, i32 34, i32 3, i32 35, i32 4, i32 36, i32 5, i32 37, i32 6, i32 38, i32 7, i32 39, i32 8, i32 40, i32 9, i32 41, i32 10, i32 42, i32 11, i32 43, i32 12, i32 44, i32 13, i32 45, i32 14, i32 46, i32 15, i32 47, i32 16, i32 48, i32 17, i32 49, i32 18, i32 50, i32 19, i32 51, i32 20, i32 52, i32 21, i32 53, i32 22, i32 54, i32 23, i32 55, i32 24, i32 56, i32 25, i32 57, i32 26, i32 58, i32 27, i32 59, i32 28, i32 60, i32 29, i32 61, i32 30, i32 62, i32 31, i32 63>420  ret <64 x i8> %result421}422 423define void @splat2_i8(ptr %s, ptr %d) {424; SSE-LABEL: splat2_i8:425; SSE:       # %bb.0:426; SSE-NEXT:    movdqu (%rdi), %xmm0427; SSE-NEXT:    movdqu 16(%rdi), %xmm1428; SSE-NEXT:    movdqa %xmm0, %xmm2429; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]430; SSE-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]431; SSE-NEXT:    movdqa %xmm1, %xmm3432; SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]433; SSE-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]434; SSE-NEXT:    movdqu %xmm1, 48(%rsi)435; SSE-NEXT:    movdqu %xmm3, 32(%rsi)436; SSE-NEXT:    movdqu %xmm0, 16(%rsi)437; SSE-NEXT:    movdqu %xmm2, (%rsi)438; SSE-NEXT:    retq439;440; AVX1-LABEL: splat2_i8:441; AVX1:       # %bb.0:442; AVX1-NEXT:    vmovdqu (%rdi), %xmm0443; AVX1-NEXT:    vmovdqu 16(%rdi), %xmm1444; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]445; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]446; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm3 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]447; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]448; AVX1-NEXT:    vmovdqu %xmm1, 48(%rsi)449; AVX1-NEXT:    vmovdqu %xmm3, 32(%rsi)450; AVX1-NEXT:    vmovdqu %xmm0, 16(%rsi)451; AVX1-NEXT:    vmovdqu %xmm2, (%rsi)452; AVX1-NEXT:    retq453;454; AVX2-LABEL: splat2_i8:455; AVX2:       # %bb.0:456; AVX2-NEXT:    vpermq $216, (%rdi), %ymm0 # ymm0 = mem[0,2,1,3]457; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]458; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm0 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]459; AVX2-NEXT:    vmovdqu %ymm0, 32(%rsi)460; AVX2-NEXT:    vmovdqu %ymm1, (%rsi)461; AVX2-NEXT:    vzeroupper462; AVX2-NEXT:    retq463  %ld32 = load <32 x i8>, ptr %s, align 1464  %cat = shufflevector <32 x i8> %ld32, <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>465  %cat2 = shufflevector <64 x i8> %cat, <64 x i8> undef, <64 x i32> <i32 0, i32 32, i32 1, i32 33, i32 2, i32 34, i32 3, i32 35, i32 4, i32 36, i32 5, i32 37, i32 6, i32 38, i32 7, i32 39, i32 8, i32 40, i32 9, i32 41, i32 10, i32 42, i32 11, i32 43, i32 12, i32 44, i32 13, i32 45, i32 14, i32 46, i32 15, i32 47, i32 16, i32 48, i32 17, i32 49, i32 18, i32 50, i32 19, i32 51, i32 20, i32 52, i32 21, i32 53, i32 22, i32 54, i32 23, i32 55, i32 24, i32 56, i32 25, i32 57, i32 26, i32 58, i32 27, i32 59, i32 28, i32 60, i32 29, i32 61, i32 30, i32 62, i32 31, i32 63>466  store <64 x i8> %cat2, ptr %d, align 1467  ret void468}469 470define void @splat2_i16(ptr %s, ptr %d) {471; SSE-LABEL: splat2_i16:472; SSE:       # %bb.0:473; SSE-NEXT:    movdqu (%rdi), %xmm0474; SSE-NEXT:    movdqu 16(%rdi), %xmm1475; SSE-NEXT:    movdqa %xmm0, %xmm2476; SSE-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]477; SSE-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]478; SSE-NEXT:    movdqa %xmm1, %xmm3479; SSE-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]480; SSE-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]481; SSE-NEXT:    movdqu %xmm1, 48(%rsi)482; SSE-NEXT:    movdqu %xmm3, 32(%rsi)483; SSE-NEXT:    movdqu %xmm0, 16(%rsi)484; SSE-NEXT:    movdqu %xmm2, (%rsi)485; SSE-NEXT:    retq486;487; AVX1-LABEL: splat2_i16:488; AVX1:       # %bb.0:489; AVX1-NEXT:    vmovdqu (%rdi), %xmm0490; AVX1-NEXT:    vmovdqu 16(%rdi), %xmm1491; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm0[0,0,1,1,2,2,3,3]492; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]493; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm3 = xmm1[0,0,1,1,2,2,3,3]494; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]495; AVX1-NEXT:    vmovdqu %xmm1, 48(%rsi)496; AVX1-NEXT:    vmovdqu %xmm3, 32(%rsi)497; AVX1-NEXT:    vmovdqu %xmm0, 16(%rsi)498; AVX1-NEXT:    vmovdqu %xmm2, (%rsi)499; AVX1-NEXT:    retq500;501; AVX2-LABEL: splat2_i16:502; AVX2:       # %bb.0:503; AVX2-NEXT:    vpermq $216, (%rdi), %ymm0 # ymm0 = mem[0,2,1,3]504; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]505; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm0 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]506; AVX2-NEXT:    vmovdqu %ymm0, 32(%rsi)507; AVX2-NEXT:    vmovdqu %ymm1, (%rsi)508; AVX2-NEXT:    vzeroupper509; AVX2-NEXT:    retq510  %ld32 = load <16 x i16>, ptr %s, align 1511  %cat = shufflevector <16 x i16> %ld32, <16 x i16> undef, <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 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>512  %cat2 = shufflevector <32 x i16> %cat, <32 x i16> undef, <32 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23, i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>513  store <32 x i16> %cat2, ptr %d, align 1514  ret void515}516 517define void @splat2_i32(ptr %s, ptr %d) {518; SSE-LABEL: splat2_i32:519; SSE:       # %bb.0:520; SSE-NEXT:    movdqu (%rdi), %xmm0521; SSE-NEXT:    movdqu 16(%rdi), %xmm1522; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,1,1]523; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]524; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,1,1]525; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]526; SSE-NEXT:    movdqu %xmm1, 48(%rsi)527; SSE-NEXT:    movdqu %xmm3, 32(%rsi)528; SSE-NEXT:    movdqu %xmm0, 16(%rsi)529; SSE-NEXT:    movdqu %xmm2, (%rsi)530; SSE-NEXT:    retq531;532; AVX1-LABEL: splat2_i32:533; AVX1:       # %bb.0:534; AVX1-NEXT:    vmovups (%rdi), %xmm0535; AVX1-NEXT:    vmovups 16(%rdi), %xmm1536; AVX1-NEXT:    vshufps {{.*#+}} xmm2 = xmm0[0,0,1,1]537; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[2,2,3,3]538; AVX1-NEXT:    vshufps {{.*#+}} xmm3 = xmm1[0,0,1,1]539; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[2,2,3,3]540; AVX1-NEXT:    vmovups %xmm1, 48(%rsi)541; AVX1-NEXT:    vmovups %xmm3, 32(%rsi)542; AVX1-NEXT:    vmovups %xmm0, 16(%rsi)543; AVX1-NEXT:    vmovups %xmm2, (%rsi)544; AVX1-NEXT:    retq545;546; AVX2-LABEL: splat2_i32:547; AVX2:       # %bb.0:548; AVX2-NEXT:    vpermpd $216, (%rdi), %ymm0 # ymm0 = mem[0,2,1,3]549; AVX2-NEXT:    vshufps {{.*#+}} ymm1 = ymm0[0,0,1,1,4,4,5,5]550; AVX2-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[2,2,3,3,6,6,7,7]551; AVX2-NEXT:    vmovups %ymm0, 32(%rsi)552; AVX2-NEXT:    vmovups %ymm1, (%rsi)553; AVX2-NEXT:    vzeroupper554; AVX2-NEXT:    retq555  %ld32 = load <8 x i32>, ptr %s, align 1556  %cat = shufflevector <8 x i32> %ld32, <8 x i32> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>557  %cat2 = shufflevector <16 x i32> %cat, <16 x i32> undef, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>558  store <16 x i32> %cat2, ptr %d, align 1559  ret void560}561 562define void @splat2_i64(ptr %s, ptr %d) {563; SSE-LABEL: splat2_i64:564; SSE:       # %bb.0:565; SSE-NEXT:    movdqu (%rdi), %xmm0566; SSE-NEXT:    movdqu 16(%rdi), %xmm1567; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,1,0,1]568; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]569; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,1,0,1]570; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]571; SSE-NEXT:    movdqu %xmm1, 48(%rsi)572; SSE-NEXT:    movdqu %xmm3, 32(%rsi)573; SSE-NEXT:    movdqu %xmm0, 16(%rsi)574; SSE-NEXT:    movdqu %xmm2, (%rsi)575; SSE-NEXT:    retq576;577; AVX1-LABEL: splat2_i64:578; AVX1:       # %bb.0:579; AVX1-NEXT:    vbroadcastf128 (%rdi), %ymm0 # ymm0 = mem[0,1,0,1]580; AVX1-NEXT:    vshufpd {{.*#+}} ymm0 = ymm0[0,0,3,3]581; AVX1-NEXT:    vbroadcastf128 16(%rdi), %ymm1 # ymm1 = mem[0,1,0,1]582; AVX1-NEXT:    vshufpd {{.*#+}} ymm1 = ymm1[0,0,3,3]583; AVX1-NEXT:    vmovupd %ymm1, 32(%rsi)584; AVX1-NEXT:    vmovupd %ymm0, (%rsi)585; AVX1-NEXT:    vzeroupper586; AVX1-NEXT:    retq587;588; AVX2-LABEL: splat2_i64:589; AVX2:       # %bb.0:590; AVX2-NEXT:    vmovups (%rdi), %ymm0591; AVX2-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,0,1,1]592; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,2,3,3]593; AVX2-NEXT:    vmovups %ymm0, 32(%rsi)594; AVX2-NEXT:    vmovups %ymm1, (%rsi)595; AVX2-NEXT:    vzeroupper596; AVX2-NEXT:    retq597  %ld32 = load <4 x i64>, ptr %s, align 1598  %cat = shufflevector <4 x i64> %ld32, <4 x i64> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>599  %cat2 = shufflevector <8 x i64> %cat, <8 x i64> undef, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>600  store <8 x i64> %cat2, ptr %d, align 1601  ret void602}603