| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX2 | |
| ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F | |
| ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL | |
| define <16 x i8> @buildvec_v16i8_stride8(ptr %p) { | |
| ; AVX2-LABEL: buildvec_v16i8_stride8: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: movzbl (%rdi), %eax | |
| ; AVX2-NEXT: vmovd %eax, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $1, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $2, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $3, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $4, 32(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $5, 40(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $6, 48(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $7, 56(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $8, 64(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $9, 72(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $10, 80(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $11, 88(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $12, 96(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $13, 104(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $14, 112(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $15, 120(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: retq | |
| ; | |
| ; AVX512F-LABEL: buildvec_v16i8_stride8: | |
| ; AVX512F: # %bb.0: | |
| ; AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 | |
| ; AVX512F-NEXT: vpmovqw %zmm0, %xmm0 | |
| ; AVX512F-NEXT: vpsrlq $56, 57(%rdi), %zmm1 | |
| ; AVX512F-NEXT: vpmovqw %zmm1, %xmm1 | |
| ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero | |
| ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 | |
| ; AVX512F-NEXT: vzeroupper | |
| ; AVX512F-NEXT: retq | |
| ; | |
| ; AVX512VL-LABEL: buildvec_v16i8_stride8: | |
| ; AVX512VL: # %bb.0: | |
| ; AVX512VL-NEXT: vmovdqu64 (%rdi), %zmm0 | |
| ; AVX512VL-NEXT: vpmovqw %zmm0, %xmm0 | |
| ; AVX512VL-NEXT: vpsrlq $56, 57(%rdi), %zmm1 | |
| ; AVX512VL-NEXT: vpmovqw %zmm1, %xmm1 | |
| ; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX512VL-NEXT: vpmovwb %ymm0, %xmm0 | |
| ; AVX512VL-NEXT: vzeroupper | |
| ; AVX512VL-NEXT: retq | |
| %p0 = getelementptr inbounds i8, ptr %p, i64 0 | |
| %p1 = getelementptr inbounds i8, ptr %p, i64 8 | |
| %p2 = getelementptr inbounds i8, ptr %p, i64 16 | |
| %p3 = getelementptr inbounds i8, ptr %p, i64 24 | |
| %p4 = getelementptr inbounds i8, ptr %p, i64 32 | |
| %p5 = getelementptr inbounds i8, ptr %p, i64 40 | |
| %p6 = getelementptr inbounds i8, ptr %p, i64 48 | |
| %p7 = getelementptr inbounds i8, ptr %p, i64 56 | |
| %p8 = getelementptr inbounds i8, ptr %p, i64 64 | |
| %p9 = getelementptr inbounds i8, ptr %p, i64 72 | |
| %p10 = getelementptr inbounds i8, ptr %p, i64 80 | |
| %p11 = getelementptr inbounds i8, ptr %p, i64 88 | |
| %p12 = getelementptr inbounds i8, ptr %p, i64 96 | |
| %p13 = getelementptr inbounds i8, ptr %p, i64 104 | |
| %p14 = getelementptr inbounds i8, ptr %p, i64 112 | |
| %p15 = getelementptr inbounds i8, ptr %p, i64 120 | |
| %v0 = load i8, ptr %p0 | |
| %v1 = load i8, ptr %p1 | |
| %v2 = load i8, ptr %p2 | |
| %v3 = load i8, ptr %p3 | |
| %v4 = load i8, ptr %p4 | |
| %v5 = load i8, ptr %p5 | |
| %v6 = load i8, ptr %p6 | |
| %v7 = load i8, ptr %p7 | |
| %v8 = load i8, ptr %p8 | |
| %v9 = load i8, ptr %p9 | |
| %v10 = load i8, ptr %p10 | |
| %v11 = load i8, ptr %p11 | |
| %v12 = load i8, ptr %p12 | |
| %v13 = load i8, ptr %p13 | |
| %v14 = load i8, ptr %p14 | |
| %v15 = load i8, ptr %p15 | |
| %r0 = insertelement <16 x i8> poison, i8 %v0, i32 0 | |
| %r1 = insertelement <16 x i8> %r0, i8 %v1, i32 1 | |
| %r2 = insertelement <16 x i8> %r1, i8 %v2, i32 2 | |
| %r3 = insertelement <16 x i8> %r2, i8 %v3, i32 3 | |
| %r4 = insertelement <16 x i8> %r3, i8 %v4, i32 4 | |
| %r5 = insertelement <16 x i8> %r4, i8 %v5, i32 5 | |
| %r6 = insertelement <16 x i8> %r5, i8 %v6, i32 6 | |
| %r7 = insertelement <16 x i8> %r6, i8 %v7, i32 7 | |
| %r8 = insertelement <16 x i8> %r7, i8 %v8, i32 8 | |
| %r9 = insertelement <16 x i8> %r8, i8 %v9, i32 9 | |
| %r10 = insertelement <16 x i8> %r9, i8 %v10, i32 10 | |
| %r11 = insertelement <16 x i8> %r10, i8 %v11, i32 11 | |
| %r12 = insertelement <16 x i8> %r11, i8 %v12, i32 12 | |
| %r13 = insertelement <16 x i8> %r12, i8 %v13, i32 13 | |
| %r14 = insertelement <16 x i8> %r13, i8 %v14, i32 14 | |
| %r15 = insertelement <16 x i8> %r14, i8 %v15, i32 15 | |
| ret <16 x i8> %r15 | |
| } | |
| define <16 x i8> @buildvec_v16i8_stride4(ptr %p) { | |
| ; AVX2-LABEL: buildvec_v16i8_stride4: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: vmovdqu (%rdi), %ymm0 | |
| ; AVX2-NEXT: vmovdqu 29(%rdi), %ymm1 | |
| ; AVX2-NEXT: vpsrld $24, %ymm1, %ymm1 | |
| ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 | |
| ; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u] | |
| ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] | |
| ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 | |
| ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 | |
| ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 | |
| ; AVX2-NEXT: vzeroupper | |
| ; AVX2-NEXT: retq | |
| ; | |
| ; AVX512F-LABEL: buildvec_v16i8_stride4: | |
| ; AVX512F: # %bb.0: | |
| ; AVX512F-NEXT: vmovdqu (%rdi), %ymm0 | |
| ; AVX512F-NEXT: vmovdqu 29(%rdi), %ymm1 | |
| ; AVX512F-NEXT: vpsrld $24, %ymm1, %ymm1 | |
| ; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 | |
| ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 | |
| ; AVX512F-NEXT: vzeroupper | |
| ; AVX512F-NEXT: retq | |
| ; | |
| ; AVX512VL-LABEL: buildvec_v16i8_stride4: | |
| ; AVX512VL: # %bb.0: | |
| ; AVX512VL-NEXT: vmovdqu (%rdi), %ymm0 | |
| ; AVX512VL-NEXT: vpsrld $24, 29(%rdi), %ymm1 | |
| ; AVX512VL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 | |
| ; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0 | |
| ; AVX512VL-NEXT: vzeroupper | |
| ; AVX512VL-NEXT: retq | |
| %p0 = getelementptr inbounds i8, ptr %p, i64 0 | |
| %p1 = getelementptr inbounds i8, ptr %p, i64 4 | |
| %p2 = getelementptr inbounds i8, ptr %p, i64 8 | |
| %p3 = getelementptr inbounds i8, ptr %p, i64 12 | |
| %p4 = getelementptr inbounds i8, ptr %p, i64 16 | |
| %p5 = getelementptr inbounds i8, ptr %p, i64 20 | |
| %p6 = getelementptr inbounds i8, ptr %p, i64 24 | |
| %p7 = getelementptr inbounds i8, ptr %p, i64 28 | |
| %p8 = getelementptr inbounds i8, ptr %p, i64 32 | |
| %p9 = getelementptr inbounds i8, ptr %p, i64 36 | |
| %p10 = getelementptr inbounds i8, ptr %p, i64 40 | |
| %p11 = getelementptr inbounds i8, ptr %p, i64 44 | |
| %p12 = getelementptr inbounds i8, ptr %p, i64 48 | |
| %p13 = getelementptr inbounds i8, ptr %p, i64 52 | |
| %p14 = getelementptr inbounds i8, ptr %p, i64 56 | |
| %p15 = getelementptr inbounds i8, ptr %p, i64 60 | |
| %v0 = load i8, ptr %p0 | |
| %v1 = load i8, ptr %p1 | |
| %v2 = load i8, ptr %p2 | |
| %v3 = load i8, ptr %p3 | |
| %v4 = load i8, ptr %p4 | |
| %v5 = load i8, ptr %p5 | |
| %v6 = load i8, ptr %p6 | |
| %v7 = load i8, ptr %p7 | |
| %v8 = load i8, ptr %p8 | |
| %v9 = load i8, ptr %p9 | |
| %v10 = load i8, ptr %p10 | |
| %v11 = load i8, ptr %p11 | |
| %v12 = load i8, ptr %p12 | |
| %v13 = load i8, ptr %p13 | |
| %v14 = load i8, ptr %p14 | |
| %v15 = load i8, ptr %p15 | |
| %r0 = insertelement <16 x i8> poison, i8 %v0, i32 0 | |
| %r1 = insertelement <16 x i8> %r0, i8 %v1, i32 1 | |
| %r2 = insertelement <16 x i8> %r1, i8 %v2, i32 2 | |
| %r3 = insertelement <16 x i8> %r2, i8 %v3, i32 3 | |
| %r4 = insertelement <16 x i8> %r3, i8 %v4, i32 4 | |
| %r5 = insertelement <16 x i8> %r4, i8 %v5, i32 5 | |
| %r6 = insertelement <16 x i8> %r5, i8 %v6, i32 6 | |
| %r7 = insertelement <16 x i8> %r6, i8 %v7, i32 7 | |
| %r8 = insertelement <16 x i8> %r7, i8 %v8, i32 8 | |
| %r9 = insertelement <16 x i8> %r8, i8 %v9, i32 9 | |
| %r10 = insertelement <16 x i8> %r9, i8 %v10, i32 10 | |
| %r11 = insertelement <16 x i8> %r10, i8 %v11, i32 11 | |
| %r12 = insertelement <16 x i8> %r11, i8 %v12, i32 12 | |
| %r13 = insertelement <16 x i8> %r12, i8 %v13, i32 13 | |
| %r14 = insertelement <16 x i8> %r13, i8 %v14, i32 14 | |
| %r15 = insertelement <16 x i8> %r14, i8 %v15, i32 15 | |
| ret <16 x i8> %r15 | |
| } | |
| define <8 x i16> @buildvec_v8i16_stride4(ptr %p) { | |
| ; AVX2-LABEL: buildvec_v8i16_stride4: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: vmovdqu (%rdi), %xmm0 | |
| ; AVX2-NEXT: vmovdqu 14(%rdi), %xmm1 | |
| ; AVX2-NEXT: vpsrld $16, %xmm1, %xmm1 | |
| ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u] | |
| ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] | |
| ; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 | |
| ; AVX2-NEXT: vzeroupper | |
| ; AVX2-NEXT: retq | |
| ; | |
| ; AVX512F-LABEL: buildvec_v8i16_stride4: | |
| ; AVX512F: # %bb.0: | |
| ; AVX512F-NEXT: vmovdqu (%rdi), %xmm0 | |
| ; AVX512F-NEXT: vmovdqu 14(%rdi), %xmm1 | |
| ; AVX512F-NEXT: vpsrld $16, %xmm1, %xmm1 | |
| ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX512F-NEXT: vpmovdw %zmm0, %ymm0 | |
| ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 | |
| ; AVX512F-NEXT: vzeroupper | |
| ; AVX512F-NEXT: retq | |
| ; | |
| ; AVX512VL-LABEL: buildvec_v8i16_stride4: | |
| ; AVX512VL: # %bb.0: | |
| ; AVX512VL-NEXT: vmovdqu (%rdi), %xmm0 | |
| ; AVX512VL-NEXT: vpsrld $16, 14(%rdi), %xmm1 | |
| ; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX512VL-NEXT: vpmovdw %ymm0, %xmm0 | |
| ; AVX512VL-NEXT: vzeroupper | |
| ; AVX512VL-NEXT: retq | |
| %p0 = getelementptr inbounds i8, ptr %p, i64 0 | |
| %p1 = getelementptr inbounds i8, ptr %p, i64 4 | |
| %p2 = getelementptr inbounds i8, ptr %p, i64 8 | |
| %p3 = getelementptr inbounds i8, ptr %p, i64 12 | |
| %p4 = getelementptr inbounds i8, ptr %p, i64 16 | |
| %p5 = getelementptr inbounds i8, ptr %p, i64 20 | |
| %p6 = getelementptr inbounds i8, ptr %p, i64 24 | |
| %p7 = getelementptr inbounds i8, ptr %p, i64 28 | |
| %v0 = load i16, ptr %p0 | |
| %v1 = load i16, ptr %p1 | |
| %v2 = load i16, ptr %p2 | |
| %v3 = load i16, ptr %p3 | |
| %v4 = load i16, ptr %p4 | |
| %v5 = load i16, ptr %p5 | |
| %v6 = load i16, ptr %p6 | |
| %v7 = load i16, ptr %p7 | |
| %r0 = insertelement <8 x i16> poison, i16 %v0, i32 0 | |
| %r1 = insertelement <8 x i16> %r0, i16 %v1, i32 1 | |
| %r2 = insertelement <8 x i16> %r1, i16 %v2, i32 2 | |
| %r3 = insertelement <8 x i16> %r2, i16 %v3, i32 3 | |
| %r4 = insertelement <8 x i16> %r3, i16 %v4, i32 4 | |
| %r5 = insertelement <8 x i16> %r4, i16 %v5, i32 5 | |
| %r6 = insertelement <8 x i16> %r5, i16 %v6, i32 6 | |
| %r7 = insertelement <8 x i16> %r6, i16 %v7, i32 7 | |
| ret <8 x i16> %r7 | |
| } | |
| define <16 x i16> @buildvec_v16i16_stride8(ptr %p) { | |
| ; AVX2-LABEL: buildvec_v16i16_stride8: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: vmovups 64(%rdi), %xmm0 | |
| ; AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],mem[0,2] | |
| ; AVX2-NEXT: vmovdqu 90(%rdi), %ymm1 | |
| ; AVX2-NEXT: vpsrlq $48, %ymm1, %ymm1 | |
| ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 | |
| ; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 | |
| ; AVX2-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] | |
| ; AVX2-NEXT: vpshufb %ymm1, %ymm0, %ymm0 | |
| ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] | |
| ; AVX2-NEXT: vmovups (%rdi), %xmm2 | |
| ; AVX2-NEXT: vshufps {{.*#+}} xmm2 = xmm2[0,2],mem[0,2] | |
| ; AVX2-NEXT: vmovdqu 26(%rdi), %ymm3 | |
| ; AVX2-NEXT: vpsrlq $48, %ymm3, %ymm3 | |
| ; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm4 | |
| ; AVX2-NEXT: vpackusdw %xmm4, %xmm3, %xmm3 | |
| ; AVX2-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 | |
| ; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1 | |
| ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] | |
| ; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 | |
| ; AVX2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: buildvec_v16i16_stride8: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: vmovdqu64 (%rdi), %zmm0 | |
| ; AVX512-NEXT: vpmovqw %zmm0, %xmm0 | |
| ; AVX512-NEXT: vpsrlq $48, 58(%rdi), %zmm1 | |
| ; AVX512-NEXT: vpmovqw %zmm1, %xmm1 | |
| ; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX512-NEXT: retq | |
| %p0 = getelementptr inbounds i8, ptr %p, i64 0 | |
| %p1 = getelementptr inbounds i8, ptr %p, i64 8 | |
| %p2 = getelementptr inbounds i8, ptr %p, i64 16 | |
| %p3 = getelementptr inbounds i8, ptr %p, i64 24 | |
| %p4 = getelementptr inbounds i8, ptr %p, i64 32 | |
| %p5 = getelementptr inbounds i8, ptr %p, i64 40 | |
| %p6 = getelementptr inbounds i8, ptr %p, i64 48 | |
| %p7 = getelementptr inbounds i8, ptr %p, i64 56 | |
| %p8 = getelementptr inbounds i8, ptr %p, i64 64 | |
| %p9 = getelementptr inbounds i8, ptr %p, i64 72 | |
| %p10 = getelementptr inbounds i8, ptr %p, i64 80 | |
| %p11 = getelementptr inbounds i8, ptr %p, i64 88 | |
| %p12 = getelementptr inbounds i8, ptr %p, i64 96 | |
| %p13 = getelementptr inbounds i8, ptr %p, i64 104 | |
| %p14 = getelementptr inbounds i8, ptr %p, i64 112 | |
| %p15 = getelementptr inbounds i8, ptr %p, i64 120 | |
| %v0 = load i16, ptr %p0 | |
| %v1 = load i16, ptr %p1 | |
| %v2 = load i16, ptr %p2 | |
| %v3 = load i16, ptr %p3 | |
| %v4 = load i16, ptr %p4 | |
| %v5 = load i16, ptr %p5 | |
| %v6 = load i16, ptr %p6 | |
| %v7 = load i16, ptr %p7 | |
| %v8 = load i16, ptr %p8 | |
| %v9 = load i16, ptr %p9 | |
| %v10 = load i16, ptr %p10 | |
| %v11 = load i16, ptr %p11 | |
| %v12 = load i16, ptr %p12 | |
| %v13 = load i16, ptr %p13 | |
| %v14 = load i16, ptr %p14 | |
| %v15 = load i16, ptr %p15 | |
| %r0 = insertelement <16 x i16> poison, i16 %v0, i32 0 | |
| %r1 = insertelement <16 x i16> %r0, i16 %v1, i32 1 | |
| %r2 = insertelement <16 x i16> %r1, i16 %v2, i32 2 | |
| %r3 = insertelement <16 x i16> %r2, i16 %v3, i32 3 | |
| %r4 = insertelement <16 x i16> %r3, i16 %v4, i32 4 | |
| %r5 = insertelement <16 x i16> %r4, i16 %v5, i32 5 | |
| %r6 = insertelement <16 x i16> %r5, i16 %v6, i32 6 | |
| %r7 = insertelement <16 x i16> %r6, i16 %v7, i32 7 | |
| %r8 = insertelement <16 x i16> %r7, i16 %v8, i32 8 | |
| %r9 = insertelement <16 x i16> %r8, i16 %v9, i32 9 | |
| %r10 = insertelement <16 x i16> %r9, i16 %v10, i32 10 | |
| %r11 = insertelement <16 x i16> %r10, i16 %v11, i32 11 | |
| %r12 = insertelement <16 x i16> %r11, i16 %v12, i32 12 | |
| %r13 = insertelement <16 x i16> %r12, i16 %v13, i32 13 | |
| %r14 = insertelement <16 x i16> %r13, i16 %v14, i32 14 | |
| %r15 = insertelement <16 x i16> %r14, i16 %v15, i32 15 | |
| ret <16 x i16> %r15 | |
| } | |
| define <32 x i8> @buildvec_v32i8_stride4(ptr %p) { | |
| ; AVX2-LABEL: buildvec_v32i8_stride4: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: vmovdqu (%rdi), %ymm0 | |
| ; AVX2-NEXT: vmovdqu 29(%rdi), %ymm1 | |
| ; AVX2-NEXT: vmovdqu 64(%rdi), %ymm2 | |
| ; AVX2-NEXT: vmovdqu 93(%rdi), %ymm3 | |
| ; AVX2-NEXT: vpsrld $24, %ymm3, %ymm3 | |
| ; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm4 | |
| ; AVX2-NEXT: vpackusdw %xmm4, %xmm3, %xmm3 | |
| ; AVX2-NEXT: vmovdqa {{.*#+}} ymm4 = [0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u] | |
| ; AVX2-NEXT: vpshufb %ymm4, %ymm2, %ymm2 | |
| ; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] | |
| ; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 | |
| ; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] | |
| ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2 | |
| ; AVX2-NEXT: vpsrld $24, %ymm1, %ymm1 | |
| ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5 | |
| ; AVX2-NEXT: vpackusdw %xmm5, %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpshufb %ymm4, %ymm0, %ymm0 | |
| ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] | |
| ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0 | |
| ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 | |
| ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] | |
| ; AVX2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: buildvec_v32i8_stride4: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: vmovdqu64 (%rdi), %zmm0 | |
| ; AVX512-NEXT: vpmovdb %zmm0, %xmm0 | |
| ; AVX512-NEXT: vpsrld $24, 61(%rdi), %zmm1 | |
| ; AVX512-NEXT: vpmovdb %zmm1, %xmm1 | |
| ; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX512-NEXT: retq | |
| %p0 = getelementptr inbounds i8, ptr %p, i64 0 | |
| %p1 = getelementptr inbounds i8, ptr %p, i64 4 | |
| %p2 = getelementptr inbounds i8, ptr %p, i64 8 | |
| %p3 = getelementptr inbounds i8, ptr %p, i64 12 | |
| %p4 = getelementptr inbounds i8, ptr %p, i64 16 | |
| %p5 = getelementptr inbounds i8, ptr %p, i64 20 | |
| %p6 = getelementptr inbounds i8, ptr %p, i64 24 | |
| %p7 = getelementptr inbounds i8, ptr %p, i64 28 | |
| %p8 = getelementptr inbounds i8, ptr %p, i64 32 | |
| %p9 = getelementptr inbounds i8, ptr %p, i64 36 | |
| %p10 = getelementptr inbounds i8, ptr %p, i64 40 | |
| %p11 = getelementptr inbounds i8, ptr %p, i64 44 | |
| %p12 = getelementptr inbounds i8, ptr %p, i64 48 | |
| %p13 = getelementptr inbounds i8, ptr %p, i64 52 | |
| %p14 = getelementptr inbounds i8, ptr %p, i64 56 | |
| %p15 = getelementptr inbounds i8, ptr %p, i64 60 | |
| %p16 = getelementptr inbounds i8, ptr %p, i64 64 | |
| %p17 = getelementptr inbounds i8, ptr %p, i64 68 | |
| %p18 = getelementptr inbounds i8, ptr %p, i64 72 | |
| %p19 = getelementptr inbounds i8, ptr %p, i64 76 | |
| %p20 = getelementptr inbounds i8, ptr %p, i64 80 | |
| %p21 = getelementptr inbounds i8, ptr %p, i64 84 | |
| %p22 = getelementptr inbounds i8, ptr %p, i64 88 | |
| %p23 = getelementptr inbounds i8, ptr %p, i64 92 | |
| %p24 = getelementptr inbounds i8, ptr %p, i64 96 | |
| %p25 = getelementptr inbounds i8, ptr %p, i64 100 | |
| %p26 = getelementptr inbounds i8, ptr %p, i64 104 | |
| %p27 = getelementptr inbounds i8, ptr %p, i64 108 | |
| %p28 = getelementptr inbounds i8, ptr %p, i64 112 | |
| %p29 = getelementptr inbounds i8, ptr %p, i64 116 | |
| %p30 = getelementptr inbounds i8, ptr %p, i64 120 | |
| %p31 = getelementptr inbounds i8, ptr %p, i64 124 | |
| %v0 = load i8, ptr %p0 | |
| %v1 = load i8, ptr %p1 | |
| %v2 = load i8, ptr %p2 | |
| %v3 = load i8, ptr %p3 | |
| %v4 = load i8, ptr %p4 | |
| %v5 = load i8, ptr %p5 | |
| %v6 = load i8, ptr %p6 | |
| %v7 = load i8, ptr %p7 | |
| %v8 = load i8, ptr %p8 | |
| %v9 = load i8, ptr %p9 | |
| %v10 = load i8, ptr %p10 | |
| %v11 = load i8, ptr %p11 | |
| %v12 = load i8, ptr %p12 | |
| %v13 = load i8, ptr %p13 | |
| %v14 = load i8, ptr %p14 | |
| %v15 = load i8, ptr %p15 | |
| %v16 = load i8, ptr %p16 | |
| %v17 = load i8, ptr %p17 | |
| %v18 = load i8, ptr %p18 | |
| %v19 = load i8, ptr %p19 | |
| %v20 = load i8, ptr %p20 | |
| %v21 = load i8, ptr %p21 | |
| %v22 = load i8, ptr %p22 | |
| %v23 = load i8, ptr %p23 | |
| %v24 = load i8, ptr %p24 | |
| %v25 = load i8, ptr %p25 | |
| %v26 = load i8, ptr %p26 | |
| %v27 = load i8, ptr %p27 | |
| %v28 = load i8, ptr %p28 | |
| %v29 = load i8, ptr %p29 | |
| %v30 = load i8, ptr %p30 | |
| %v31 = load i8, ptr %p31 | |
| %r0 = insertelement <32 x i8> poison, i8 %v0, i32 0 | |
| %r1 = insertelement <32 x i8> %r0, i8 %v1, i32 1 | |
| %r2 = insertelement <32 x i8> %r1, i8 %v2, i32 2 | |
| %r3 = insertelement <32 x i8> %r2, i8 %v3, i32 3 | |
| %r4 = insertelement <32 x i8> %r3, i8 %v4, i32 4 | |
| %r5 = insertelement <32 x i8> %r4, i8 %v5, i32 5 | |
| %r6 = insertelement <32 x i8> %r5, i8 %v6, i32 6 | |
| %r7 = insertelement <32 x i8> %r6, i8 %v7, i32 7 | |
| %r8 = insertelement <32 x i8> %r7, i8 %v8, i32 8 | |
| %r9 = insertelement <32 x i8> %r8, i8 %v9, i32 9 | |
| %r10 = insertelement <32 x i8> %r9, i8 %v10, i32 10 | |
| %r11 = insertelement <32 x i8> %r10, i8 %v11, i32 11 | |
| %r12 = insertelement <32 x i8> %r11, i8 %v12, i32 12 | |
| %r13 = insertelement <32 x i8> %r12, i8 %v13, i32 13 | |
| %r14 = insertelement <32 x i8> %r13, i8 %v14, i32 14 | |
| %r15 = insertelement <32 x i8> %r14, i8 %v15, i32 15 | |
| %r16 = insertelement <32 x i8> %r15, i8 %v16, i32 16 | |
| %r17 = insertelement <32 x i8> %r16, i8 %v17, i32 17 | |
| %r18 = insertelement <32 x i8> %r17, i8 %v18, i32 18 | |
| %r19 = insertelement <32 x i8> %r18, i8 %v19, i32 19 | |
| %r20 = insertelement <32 x i8> %r19, i8 %v20, i32 20 | |
| %r21 = insertelement <32 x i8> %r20, i8 %v21, i32 21 | |
| %r22 = insertelement <32 x i8> %r21, i8 %v22, i32 22 | |
| %r23 = insertelement <32 x i8> %r22, i8 %v23, i32 23 | |
| %r24 = insertelement <32 x i8> %r23, i8 %v24, i32 24 | |
| %r25 = insertelement <32 x i8> %r24, i8 %v25, i32 25 | |
| %r26 = insertelement <32 x i8> %r25, i8 %v26, i32 26 | |
| %r27 = insertelement <32 x i8> %r26, i8 %v27, i32 27 | |
| %r28 = insertelement <32 x i8> %r27, i8 %v28, i32 28 | |
| %r29 = insertelement <32 x i8> %r28, i8 %v29, i32 29 | |
| %r30 = insertelement <32 x i8> %r29, i8 %v30, i32 30 | |
| %r31 = insertelement <32 x i8> %r30, i8 %v31, i32 31 | |
| ret <32 x i8> %r31 | |
| } | |
| define <16 x i8> @buildvec_v16i8_stride8_volatile(ptr %p) { | |
| ; AVX2-LABEL: buildvec_v16i8_stride8_volatile: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: movzbl (%rdi), %eax | |
| ; AVX2-NEXT: vmovd %eax, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $1, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $2, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $3, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $4, 32(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $5, 40(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $6, 48(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $7, 56(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $8, 64(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $9, 72(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $10, 80(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $11, 88(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $12, 96(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $13, 104(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $14, 112(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $15, 120(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: buildvec_v16i8_stride8_volatile: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: movzbl (%rdi), %eax | |
| ; AVX512-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $1, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $2, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $3, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $4, 32(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $5, 40(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $6, 48(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $7, 56(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $8, 64(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $9, 72(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $10, 80(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $11, 88(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $12, 96(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $13, 104(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $14, 112(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $15, 120(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: retq | |
| %p0 = getelementptr inbounds i8, ptr %p, i64 0 | |
| %p1 = getelementptr inbounds i8, ptr %p, i64 8 | |
| %p2 = getelementptr inbounds i8, ptr %p, i64 16 | |
| %p3 = getelementptr inbounds i8, ptr %p, i64 24 | |
| %p4 = getelementptr inbounds i8, ptr %p, i64 32 | |
| %p5 = getelementptr inbounds i8, ptr %p, i64 40 | |
| %p6 = getelementptr inbounds i8, ptr %p, i64 48 | |
| %p7 = getelementptr inbounds i8, ptr %p, i64 56 | |
| %p8 = getelementptr inbounds i8, ptr %p, i64 64 | |
| %p9 = getelementptr inbounds i8, ptr %p, i64 72 | |
| %p10 = getelementptr inbounds i8, ptr %p, i64 80 | |
| %p11 = getelementptr inbounds i8, ptr %p, i64 88 | |
| %p12 = getelementptr inbounds i8, ptr %p, i64 96 | |
| %p13 = getelementptr inbounds i8, ptr %p, i64 104 | |
| %p14 = getelementptr inbounds i8, ptr %p, i64 112 | |
| %p15 = getelementptr inbounds i8, ptr %p, i64 120 | |
| %v0 = load volatile i8, ptr %p0 | |
| %v1 = load volatile i8, ptr %p1 | |
| %v2 = load volatile i8, ptr %p2 | |
| %v3 = load volatile i8, ptr %p3 | |
| %v4 = load volatile i8, ptr %p4 | |
| %v5 = load volatile i8, ptr %p5 | |
| %v6 = load volatile i8, ptr %p6 | |
| %v7 = load volatile i8, ptr %p7 | |
| %v8 = load volatile i8, ptr %p8 | |
| %v9 = load volatile i8, ptr %p9 | |
| %v10 = load volatile i8, ptr %p10 | |
| %v11 = load volatile i8, ptr %p11 | |
| %v12 = load volatile i8, ptr %p12 | |
| %v13 = load volatile i8, ptr %p13 | |
| %v14 = load volatile i8, ptr %p14 | |
| %v15 = load volatile i8, ptr %p15 | |
| %r0 = insertelement <16 x i8> poison, i8 %v0, i32 0 | |
| %r1 = insertelement <16 x i8> %r0, i8 %v1, i32 1 | |
| %r2 = insertelement <16 x i8> %r1, i8 %v2, i32 2 | |
| %r3 = insertelement <16 x i8> %r2, i8 %v3, i32 3 | |
| %r4 = insertelement <16 x i8> %r3, i8 %v4, i32 4 | |
| %r5 = insertelement <16 x i8> %r4, i8 %v5, i32 5 | |
| %r6 = insertelement <16 x i8> %r5, i8 %v6, i32 6 | |
| %r7 = insertelement <16 x i8> %r6, i8 %v7, i32 7 | |
| %r8 = insertelement <16 x i8> %r7, i8 %v8, i32 8 | |
| %r9 = insertelement <16 x i8> %r8, i8 %v9, i32 9 | |
| %r10 = insertelement <16 x i8> %r9, i8 %v10, i32 10 | |
| %r11 = insertelement <16 x i8> %r10, i8 %v11, i32 11 | |
| %r12 = insertelement <16 x i8> %r11, i8 %v12, i32 12 | |
| %r13 = insertelement <16 x i8> %r12, i8 %v13, i32 13 | |
| %r14 = insertelement <16 x i8> %r13, i8 %v14, i32 14 | |
| %r15 = insertelement <16 x i8> %r14, i8 %v15, i32 15 | |
| ret <16 x i8> %r15 | |
| } | |
| define <16 x i8> @buildvec_v16i8_stride8_one_skewed(ptr %p) { | |
| ; AVX2-LABEL: buildvec_v16i8_stride8_one_skewed: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: movzbl (%rdi), %eax | |
| ; AVX2-NEXT: vmovd %eax, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $1, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $2, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $3, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $4, 32(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $5, 40(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $6, 48(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $7, 56(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $8, 65(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $9, 72(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $10, 80(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $11, 88(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $12, 96(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $13, 104(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $14, 112(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $15, 120(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: buildvec_v16i8_stride8_one_skewed: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: movzbl (%rdi), %eax | |
| ; AVX512-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $1, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $2, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $3, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $4, 32(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $5, 40(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $6, 48(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $7, 56(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $8, 65(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $9, 72(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $10, 80(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $11, 88(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $12, 96(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $13, 104(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $14, 112(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $15, 120(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: retq | |
| %p0 = getelementptr inbounds i8, ptr %p, i64 0 | |
| %p1 = getelementptr inbounds i8, ptr %p, i64 8 | |
| %p2 = getelementptr inbounds i8, ptr %p, i64 16 | |
| %p3 = getelementptr inbounds i8, ptr %p, i64 24 | |
| %p4 = getelementptr inbounds i8, ptr %p, i64 32 | |
| %p5 = getelementptr inbounds i8, ptr %p, i64 40 | |
| %p6 = getelementptr inbounds i8, ptr %p, i64 48 | |
| %p7 = getelementptr inbounds i8, ptr %p, i64 56 | |
| %p8 = getelementptr inbounds i8, ptr %p, i64 65 ; not aligned with the stride | |
| %p9 = getelementptr inbounds i8, ptr %p, i64 72 | |
| %p10 = getelementptr inbounds i8, ptr %p, i64 80 | |
| %p11 = getelementptr inbounds i8, ptr %p, i64 88 | |
| %p12 = getelementptr inbounds i8, ptr %p, i64 96 | |
| %p13 = getelementptr inbounds i8, ptr %p, i64 104 | |
| %p14 = getelementptr inbounds i8, ptr %p, i64 112 | |
| %p15 = getelementptr inbounds i8, ptr %p, i64 120 | |
| %v0 = load i8, ptr %p0 | |
| %v1 = load i8, ptr %p1 | |
| %v2 = load i8, ptr %p2 | |
| %v3 = load i8, ptr %p3 | |
| %v4 = load i8, ptr %p4 | |
| %v5 = load i8, ptr %p5 | |
| %v6 = load i8, ptr %p6 | |
| %v7 = load i8, ptr %p7 | |
| %v8 = load i8, ptr %p8 | |
| %v9 = load i8, ptr %p9 | |
| %v10 = load i8, ptr %p10 | |
| %v11 = load i8, ptr %p11 | |
| %v12 = load i8, ptr %p12 | |
| %v13 = load i8, ptr %p13 | |
| %v14 = load i8, ptr %p14 | |
| %v15 = load i8, ptr %p15 | |
| %r0 = insertelement <16 x i8> poison, i8 %v0, i32 0 | |
| %r1 = insertelement <16 x i8> %r0, i8 %v1, i32 1 | |
| %r2 = insertelement <16 x i8> %r1, i8 %v2, i32 2 | |
| %r3 = insertelement <16 x i8> %r2, i8 %v3, i32 3 | |
| %r4 = insertelement <16 x i8> %r3, i8 %v4, i32 4 | |
| %r5 = insertelement <16 x i8> %r4, i8 %v5, i32 5 | |
| %r6 = insertelement <16 x i8> %r5, i8 %v6, i32 6 | |
| %r7 = insertelement <16 x i8> %r6, i8 %v7, i32 7 | |
| %r8 = insertelement <16 x i8> %r7, i8 %v8, i32 8 | |
| %r9 = insertelement <16 x i8> %r8, i8 %v9, i32 9 | |
| %r10 = insertelement <16 x i8> %r9, i8 %v10, i32 10 | |
| %r11 = insertelement <16 x i8> %r10, i8 %v11, i32 11 | |
| %r12 = insertelement <16 x i8> %r11, i8 %v12, i32 12 | |
| %r13 = insertelement <16 x i8> %r12, i8 %v13, i32 13 | |
| %r14 = insertelement <16 x i8> %r13, i8 %v14, i32 14 | |
| %r15 = insertelement <16 x i8> %r14, i8 %v15, i32 15 | |
| ret <16 x i8> %r15 | |
| } | |
| define <32 x i8> @buildvec_v32i8_stride8(ptr %p) { | |
| ; AVX2-LABEL: buildvec_v32i8_stride8: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: movzbl 128(%rdi), %eax | |
| ; AVX2-NEXT: vmovd %eax, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $1, 136(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $2, 144(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $3, 152(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $4, 160(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $5, 168(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $6, 176(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $7, 184(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $8, 192(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $9, 200(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $10, 208(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $11, 216(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $12, 224(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $13, 232(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $14, 240(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $15, 248(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: movzbl (%rdi), %eax | |
| ; AVX2-NEXT: vmovd %eax, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $1, 8(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $2, 16(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $3, 24(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $4, 32(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $5, 40(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $6, 48(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $7, 56(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $8, 64(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $9, 72(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $10, 80(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $11, 88(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $12, 96(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $13, 104(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $14, 112(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vpinsrb $15, 120(%rdi), %xmm1, %xmm1 | |
| ; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 | |
| ; AVX2-NEXT: retq | |
| ; | |
| ; AVX512F-LABEL: buildvec_v32i8_stride8: | |
| ; AVX512F: # %bb.0: | |
| ; AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 | |
| ; AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 | |
| ; AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2 | |
| ; AVX512F-NEXT: vpmovqw %zmm0, %xmm0 | |
| ; AVX512F-NEXT: vpmovqw %zmm1, %xmm1 | |
| ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero | |
| ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 | |
| ; AVX512F-NEXT: vpmovqw %zmm2, %xmm1 | |
| ; AVX512F-NEXT: vpsrlq $56, 185(%rdi), %zmm2 | |
| ; AVX512F-NEXT: vpmovqw %zmm2, %xmm2 | |
| ; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 | |
| ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero | |
| ; AVX512F-NEXT: vpmovdb %zmm1, %xmm1 | |
| ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX512F-NEXT: retq | |
| ; | |
| ; AVX512VL-LABEL: buildvec_v32i8_stride8: | |
| ; AVX512VL: # %bb.0: | |
| ; AVX512VL-NEXT: vmovdqu64 (%rdi), %zmm0 | |
| ; AVX512VL-NEXT: vmovdqu64 64(%rdi), %zmm1 | |
| ; AVX512VL-NEXT: vmovdqu64 128(%rdi), %zmm2 | |
| ; AVX512VL-NEXT: vpmovqw %zmm2, %xmm2 | |
| ; AVX512VL-NEXT: vpsrlq $56, 185(%rdi), %zmm3 | |
| ; AVX512VL-NEXT: vpmovqw %zmm3, %xmm3 | |
| ; AVX512VL-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 | |
| ; AVX512VL-NEXT: vpmovqw %zmm0, %xmm0 | |
| ; AVX512VL-NEXT: vpmovqw %zmm1, %xmm1 | |
| ; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX512VL-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0 | |
| ; AVX512VL-NEXT: vpmovwb %zmm0, %ymm0 | |
| ; AVX512VL-NEXT: retq | |
| %p0 = getelementptr inbounds i8, ptr %p, i64 0 | |
| %p1 = getelementptr inbounds i8, ptr %p, i64 8 | |
| %p2 = getelementptr inbounds i8, ptr %p, i64 16 | |
| %p3 = getelementptr inbounds i8, ptr %p, i64 24 | |
| %p4 = getelementptr inbounds i8, ptr %p, i64 32 | |
| %p5 = getelementptr inbounds i8, ptr %p, i64 40 | |
| %p6 = getelementptr inbounds i8, ptr %p, i64 48 | |
| %p7 = getelementptr inbounds i8, ptr %p, i64 56 | |
| %p8 = getelementptr inbounds i8, ptr %p, i64 64 | |
| %p9 = getelementptr inbounds i8, ptr %p, i64 72 | |
| %p10 = getelementptr inbounds i8, ptr %p, i64 80 | |
| %p11 = getelementptr inbounds i8, ptr %p, i64 88 | |
| %p12 = getelementptr inbounds i8, ptr %p, i64 96 | |
| %p13 = getelementptr inbounds i8, ptr %p, i64 104 | |
| %p14 = getelementptr inbounds i8, ptr %p, i64 112 | |
| %p15 = getelementptr inbounds i8, ptr %p, i64 120 | |
| %p16 = getelementptr inbounds i8, ptr %p, i64 128 | |
| %p17 = getelementptr inbounds i8, ptr %p, i64 136 | |
| %p18 = getelementptr inbounds i8, ptr %p, i64 144 | |
| %p19 = getelementptr inbounds i8, ptr %p, i64 152 | |
| %p20 = getelementptr inbounds i8, ptr %p, i64 160 | |
| %p21 = getelementptr inbounds i8, ptr %p, i64 168 | |
| %p22 = getelementptr inbounds i8, ptr %p, i64 176 | |
| %p23 = getelementptr inbounds i8, ptr %p, i64 184 | |
| %p24 = getelementptr inbounds i8, ptr %p, i64 192 | |
| %p25 = getelementptr inbounds i8, ptr %p, i64 200 | |
| %p26 = getelementptr inbounds i8, ptr %p, i64 208 | |
| %p27 = getelementptr inbounds i8, ptr %p, i64 216 | |
| %p28 = getelementptr inbounds i8, ptr %p, i64 224 | |
| %p29 = getelementptr inbounds i8, ptr %p, i64 232 | |
| %p30 = getelementptr inbounds i8, ptr %p, i64 240 | |
| %p31 = getelementptr inbounds i8, ptr %p, i64 248 | |
| %v0 = load i8, ptr %p0 | |
| %v1 = load i8, ptr %p1 | |
| %v2 = load i8, ptr %p2 | |
| %v3 = load i8, ptr %p3 | |
| %v4 = load i8, ptr %p4 | |
| %v5 = load i8, ptr %p5 | |
| %v6 = load i8, ptr %p6 | |
| %v7 = load i8, ptr %p7 | |
| %v8 = load i8, ptr %p8 | |
| %v9 = load i8, ptr %p9 | |
| %v10 = load i8, ptr %p10 | |
| %v11 = load i8, ptr %p11 | |
| %v12 = load i8, ptr %p12 | |
| %v13 = load i8, ptr %p13 | |
| %v14 = load i8, ptr %p14 | |
| %v15 = load i8, ptr %p15 | |
| %v16 = load i8, ptr %p16 | |
| %v17 = load i8, ptr %p17 | |
| %v18 = load i8, ptr %p18 | |
| %v19 = load i8, ptr %p19 | |
| %v20 = load i8, ptr %p20 | |
| %v21 = load i8, ptr %p21 | |
| %v22 = load i8, ptr %p22 | |
| %v23 = load i8, ptr %p23 | |
| %v24 = load i8, ptr %p24 | |
| %v25 = load i8, ptr %p25 | |
| %v26 = load i8, ptr %p26 | |
| %v27 = load i8, ptr %p27 | |
| %v28 = load i8, ptr %p28 | |
| %v29 = load i8, ptr %p29 | |
| %v30 = load i8, ptr %p30 | |
| %v31 = load i8, ptr %p31 | |
| %r0 = insertelement <32 x i8> poison, i8 %v0, i32 0 | |
| %r1 = insertelement <32 x i8> %r0, i8 %v1, i32 1 | |
| %r2 = insertelement <32 x i8> %r1, i8 %v2, i32 2 | |
| %r3 = insertelement <32 x i8> %r2, i8 %v3, i32 3 | |
| %r4 = insertelement <32 x i8> %r3, i8 %v4, i32 4 | |
| %r5 = insertelement <32 x i8> %r4, i8 %v5, i32 5 | |
| %r6 = insertelement <32 x i8> %r5, i8 %v6, i32 6 | |
| %r7 = insertelement <32 x i8> %r6, i8 %v7, i32 7 | |
| %r8 = insertelement <32 x i8> %r7, i8 %v8, i32 8 | |
| %r9 = insertelement <32 x i8> %r8, i8 %v9, i32 9 | |
| %r10 = insertelement <32 x i8> %r9, i8 %v10, i32 10 | |
| %r11 = insertelement <32 x i8> %r10, i8 %v11, i32 11 | |
| %r12 = insertelement <32 x i8> %r11, i8 %v12, i32 12 | |
| %r13 = insertelement <32 x i8> %r12, i8 %v13, i32 13 | |
| %r14 = insertelement <32 x i8> %r13, i8 %v14, i32 14 | |
| %r15 = insertelement <32 x i8> %r14, i8 %v15, i32 15 | |
| %r16 = insertelement <32 x i8> %r15, i8 %v16, i32 16 | |
| %r17 = insertelement <32 x i8> %r16, i8 %v17, i32 17 | |
| %r18 = insertelement <32 x i8> %r17, i8 %v18, i32 18 | |
| %r19 = insertelement <32 x i8> %r18, i8 %v19, i32 19 | |
| %r20 = insertelement <32 x i8> %r19, i8 %v20, i32 20 | |
| %r21 = insertelement <32 x i8> %r20, i8 %v21, i32 21 | |
| %r22 = insertelement <32 x i8> %r21, i8 %v22, i32 22 | |
| %r23 = insertelement <32 x i8> %r22, i8 %v23, i32 23 | |
| %r24 = insertelement <32 x i8> %r23, i8 %v24, i32 24 | |
| %r25 = insertelement <32 x i8> %r24, i8 %v25, i32 25 | |
| %r26 = insertelement <32 x i8> %r25, i8 %v26, i32 26 | |
| %r27 = insertelement <32 x i8> %r26, i8 %v27, i32 27 | |
| %r28 = insertelement <32 x i8> %r27, i8 %v28, i32 28 | |
| %r29 = insertelement <32 x i8> %r28, i8 %v29, i32 29 | |
| %r30 = insertelement <32 x i8> %r29, i8 %v30, i32 30 | |
| %r31 = insertelement <32 x i8> %r30, i8 %v31, i32 31 | |
| ret <32 x i8> %r31 | |
| } | |
| define <8 x i8> @buildvec_v8i8_stride8(ptr %p) { | |
| ; AVX2-LABEL: buildvec_v8i8_stride8: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: movzbl (%rdi), %eax | |
| ; AVX2-NEXT: vmovd %eax, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $1, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $2, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $3, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $4, 32(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $5, 40(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $6, 48(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $7, 56(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: buildvec_v8i8_stride8: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: movzbl (%rdi), %eax | |
| ; AVX512-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $1, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $2, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $3, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $4, 32(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $5, 40(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $6, 48(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $7, 56(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: retq | |
| %p0 = getelementptr inbounds i8, ptr %p, i64 0 | |
| %p1 = getelementptr inbounds i8, ptr %p, i64 8 | |
| %p2 = getelementptr inbounds i8, ptr %p, i64 16 | |
| %p3 = getelementptr inbounds i8, ptr %p, i64 24 | |
| %p4 = getelementptr inbounds i8, ptr %p, i64 32 | |
| %p5 = getelementptr inbounds i8, ptr %p, i64 40 | |
| %p6 = getelementptr inbounds i8, ptr %p, i64 48 | |
| %p7 = getelementptr inbounds i8, ptr %p, i64 56 | |
| %v0 = load i8, ptr %p0 | |
| %v1 = load i8, ptr %p1 | |
| %v2 = load i8, ptr %p2 | |
| %v3 = load i8, ptr %p3 | |
| %v4 = load i8, ptr %p4 | |
| %v5 = load i8, ptr %p5 | |
| %v6 = load i8, ptr %p6 | |
| %v7 = load i8, ptr %p7 | |
| %r0 = insertelement <8 x i8> poison, i8 %v0, i32 0 | |
| %r1 = insertelement <8 x i8> %r0, i8 %v1, i32 1 | |
| %r2 = insertelement <8 x i8> %r1, i8 %v2, i32 2 | |
| %r3 = insertelement <8 x i8> %r2, i8 %v3, i32 3 | |
| %r4 = insertelement <8 x i8> %r3, i8 %v4, i32 4 | |
| %r5 = insertelement <8 x i8> %r4, i8 %v5, i32 5 | |
| %r6 = insertelement <8 x i8> %r5, i8 %v6, i32 6 | |
| %r7 = insertelement <8 x i8> %r6, i8 %v7, i32 7 | |
| ret <8 x i8> %r7 | |
| } | |
| define <16 x i8> @buildvec_interleaved_undef(ptr %p) { | |
| ; AVX2-LABEL: buildvec_interleaved_undef: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: movzbl (%rdi), %eax | |
| ; AVX2-NEXT: vmovd %eax, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $1, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $2, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $3, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $12, 96(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $13, 104(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $14, 112(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $15, 120(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: buildvec_interleaved_undef: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: movzbl (%rdi), %eax | |
| ; AVX512-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $1, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $2, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $3, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $12, 96(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $13, 104(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $14, 112(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $15, 120(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: retq | |
| %p0 = getelementptr inbounds i8, ptr %p, i64 0 | |
| %p1 = getelementptr inbounds i8, ptr %p, i64 8 | |
| %p2 = getelementptr inbounds i8, ptr %p, i64 16 | |
| %p3 = getelementptr inbounds i8, ptr %p, i64 24 | |
| %p12 = getelementptr inbounds i8, ptr %p, i64 96 | |
| %p13 = getelementptr inbounds i8, ptr %p, i64 104 | |
| %p14 = getelementptr inbounds i8, ptr %p, i64 112 | |
| %p15 = getelementptr inbounds i8, ptr %p, i64 120 | |
| %v0 = load i8, ptr %p0 | |
| %v1 = load i8, ptr %p1 | |
| %v2 = load i8, ptr %p2 | |
| %v3 = load i8, ptr %p3 | |
| %v12 = load i8, ptr %p12 | |
| %v13 = load i8, ptr %p13 | |
| %v14 = load i8, ptr %p14 | |
| %v15 = load i8, ptr %p15 | |
| %r0 = insertelement <16 x i8> poison, i8 %v0, i32 0 | |
| %r1 = insertelement <16 x i8> %r0, i8 %v1, i32 1 | |
| %r2 = insertelement <16 x i8> %r1, i8 %v2, i32 2 | |
| %r3 = insertelement <16 x i8> %r2, i8 %v3, i32 3 | |
| %r12 = insertelement <16 x i8> %r3, i8 %v12, i32 12 | |
| %r13 = insertelement <16 x i8> %r12, i8 %v13, i32 13 | |
| %r14 = insertelement <16 x i8> %r13, i8 %v14, i32 14 | |
| %r15 = insertelement <16 x i8> %r14, i8 %v15, i32 15 | |
| ret <16 x i8> %r15 | |
| } | |
| define <32 x i8> @buildvec_v32i8_stride8_basepos16(ptr %p) { | |
| ; AVX2-LABEL: buildvec_v32i8_stride8_basepos16: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: movzbl (%rdi), %eax | |
| ; AVX2-NEXT: vmovd %eax, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $1, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $2, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $3, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $4, 32(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $5, 40(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $6, 48(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $7, 56(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0 | |
| ; AVX2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: buildvec_v32i8_stride8_basepos16: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: movzbl (%rdi), %eax | |
| ; AVX512-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $1, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $2, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $3, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $4, 32(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $5, 40(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $6, 48(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $7, 56(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0 | |
| ; AVX512-NEXT: retq | |
| %p0 = getelementptr inbounds i8, ptr %p, i64 0 | |
| %p1 = getelementptr inbounds i8, ptr %p, i64 8 | |
| %p2 = getelementptr inbounds i8, ptr %p, i64 16 | |
| %p3 = getelementptr inbounds i8, ptr %p, i64 24 | |
| %p4 = getelementptr inbounds i8, ptr %p, i64 32 | |
| %p5 = getelementptr inbounds i8, ptr %p, i64 40 | |
| %p6 = getelementptr inbounds i8, ptr %p, i64 48 | |
| %p7 = getelementptr inbounds i8, ptr %p, i64 56 | |
| %v0 = load i8, ptr %p0 | |
| %v1 = load i8, ptr %p1 | |
| %v2 = load i8, ptr %p2 | |
| %v3 = load i8, ptr %p3 | |
| %v4 = load i8, ptr %p4 | |
| %v5 = load i8, ptr %p5 | |
| %v6 = load i8, ptr %p6 | |
| %v7 = load i8, ptr %p7 | |
| %r0 = insertelement <32 x i8> poison, i8 %v0, i32 16 | |
| %r1 = insertelement <32 x i8> %r0, i8 %v1, i32 17 | |
| %r2 = insertelement <32 x i8> %r1, i8 %v2, i32 18 | |
| %r3 = insertelement <32 x i8> %r2, i8 %v3, i32 19 | |
| %r4 = insertelement <32 x i8> %r3, i8 %v4, i32 20 | |
| %r5 = insertelement <32 x i8> %r4, i8 %v5, i32 21 | |
| %r6 = insertelement <32 x i8> %r5, i8 %v6, i32 22 | |
| %r7 = insertelement <32 x i8> %r6, i8 %v7, i32 23 | |
| ret <32 x i8> %r7 | |
| } | |
| define <32 x i8> @buildvec_v32i8_stride8_basepos8(ptr %p) { | |
| ; AVX2-LABEL: buildvec_v32i8_stride8_basepos8: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: vpxor %xmm0, %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $8, (%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $9, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $10, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $11, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $12, 32(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $13, 40(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $14, 48(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $15, 56(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: buildvec_v32i8_stride8_basepos8: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $8, (%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $9, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $10, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $11, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $12, 32(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $13, 40(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $14, 48(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $15, 56(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: retq | |
| %p0 = getelementptr inbounds i8, ptr %p, i64 0 | |
| %p1 = getelementptr inbounds i8, ptr %p, i64 8 | |
| %p2 = getelementptr inbounds i8, ptr %p, i64 16 | |
| %p3 = getelementptr inbounds i8, ptr %p, i64 24 | |
| %p4 = getelementptr inbounds i8, ptr %p, i64 32 | |
| %p5 = getelementptr inbounds i8, ptr %p, i64 40 | |
| %p6 = getelementptr inbounds i8, ptr %p, i64 48 | |
| %p7 = getelementptr inbounds i8, ptr %p, i64 56 | |
| %v0 = load i8, ptr %p0 | |
| %v1 = load i8, ptr %p1 | |
| %v2 = load i8, ptr %p2 | |
| %v3 = load i8, ptr %p3 | |
| %v4 = load i8, ptr %p4 | |
| %v5 = load i8, ptr %p5 | |
| %v6 = load i8, ptr %p6 | |
| %v7 = load i8, ptr %p7 | |
| %r0 = insertelement <32 x i8> poison, i8 %v0, i32 8 | |
| %r1 = insertelement <32 x i8> %r0, i8 %v1, i32 9 | |
| %r2 = insertelement <32 x i8> %r1, i8 %v2, i32 10 | |
| %r3 = insertelement <32 x i8> %r2, i8 %v3, i32 11 | |
| %r4 = insertelement <32 x i8> %r3, i8 %v4, i32 12 | |
| %r5 = insertelement <32 x i8> %r4, i8 %v5, i32 13 | |
| %r6 = insertelement <32 x i8> %r5, i8 %v6, i32 14 | |
| %r7 = insertelement <32 x i8> %r6, i8 %v7, i32 15 | |
| ret <32 x i8> %r7 | |
| } | |
| define <16 x i8> @buildvec_v16i8_stride8_reverse(ptr %p) { | |
| ; AVX2-LABEL: buildvec_v16i8_stride8_reverse: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: movzbl 120(%rdi), %eax | |
| ; AVX2-NEXT: vmovd %eax, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $1, 112(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $2, 104(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $3, 96(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $4, 88(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $5, 80(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $6, 72(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $7, 64(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $8, 56(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $9, 48(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $10, 40(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $11, 32(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $12, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $13, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $14, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $15, (%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: retq | |
| ; | |
| ; AVX512F-LABEL: buildvec_v16i8_stride8_reverse: | |
| ; AVX512F: # %bb.0: | |
| ; AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 | |
| ; AVX512F-NEXT: vpmovqw %zmm0, %xmm0 | |
| ; AVX512F-NEXT: vpsrlq $56, 57(%rdi), %zmm1 | |
| ; AVX512F-NEXT: vpmovqw %zmm1, %xmm1 | |
| ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero | |
| ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 | |
| ; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0] | |
| ; AVX512F-NEXT: vzeroupper | |
| ; AVX512F-NEXT: retq | |
| ; | |
| ; AVX512VL-LABEL: buildvec_v16i8_stride8_reverse: | |
| ; AVX512VL: # %bb.0: | |
| ; AVX512VL-NEXT: vmovdqu64 (%rdi), %zmm0 | |
| ; AVX512VL-NEXT: vpmovqw %zmm0, %xmm0 | |
| ; AVX512VL-NEXT: vpsrlq $56, 57(%rdi), %zmm1 | |
| ; AVX512VL-NEXT: vpmovqw %zmm1, %xmm1 | |
| ; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX512VL-NEXT: vpmovwb %ymm0, %xmm0 | |
| ; AVX512VL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0] | |
| ; AVX512VL-NEXT: vzeroupper | |
| ; AVX512VL-NEXT: retq | |
| %p0 = getelementptr inbounds i8, ptr %p, i64 120 | |
| %p1 = getelementptr inbounds i8, ptr %p, i64 112 | |
| %p2 = getelementptr inbounds i8, ptr %p, i64 104 | |
| %p3 = getelementptr inbounds i8, ptr %p, i64 96 | |
| %p4 = getelementptr inbounds i8, ptr %p, i64 88 | |
| %p5 = getelementptr inbounds i8, ptr %p, i64 80 | |
| %p6 = getelementptr inbounds i8, ptr %p, i64 72 | |
| %p7 = getelementptr inbounds i8, ptr %p, i64 64 | |
| %p8 = getelementptr inbounds i8, ptr %p, i64 56 | |
| %p9 = getelementptr inbounds i8, ptr %p, i64 48 | |
| %p10 = getelementptr inbounds i8, ptr %p, i64 40 | |
| %p11 = getelementptr inbounds i8, ptr %p, i64 32 | |
| %p12 = getelementptr inbounds i8, ptr %p, i64 24 | |
| %p13 = getelementptr inbounds i8, ptr %p, i64 16 | |
| %p14 = getelementptr inbounds i8, ptr %p, i64 8 | |
| %p15 = getelementptr inbounds i8, ptr %p, i64 0 | |
| %v0 = load i8, ptr %p0 | |
| %v1 = load i8, ptr %p1 | |
| %v2 = load i8, ptr %p2 | |
| %v3 = load i8, ptr %p3 | |
| %v4 = load i8, ptr %p4 | |
| %v5 = load i8, ptr %p5 | |
| %v6 = load i8, ptr %p6 | |
| %v7 = load i8, ptr %p7 | |
| %v8 = load i8, ptr %p8 | |
| %v9 = load i8, ptr %p9 | |
| %v10 = load i8, ptr %p10 | |
| %v11 = load i8, ptr %p11 | |
| %v12 = load i8, ptr %p12 | |
| %v13 = load i8, ptr %p13 | |
| %v14 = load i8, ptr %p14 | |
| %v15 = load i8, ptr %p15 | |
| %r0 = insertelement <16 x i8> poison, i8 %v0, i32 0 | |
| %r1 = insertelement <16 x i8> %r0, i8 %v1, i32 1 | |
| %r2 = insertelement <16 x i8> %r1, i8 %v2, i32 2 | |
| %r3 = insertelement <16 x i8> %r2, i8 %v3, i32 3 | |
| %r4 = insertelement <16 x i8> %r3, i8 %v4, i32 4 | |
| %r5 = insertelement <16 x i8> %r4, i8 %v5, i32 5 | |
| %r6 = insertelement <16 x i8> %r5, i8 %v6, i32 6 | |
| %r7 = insertelement <16 x i8> %r6, i8 %v7, i32 7 | |
| %r8 = insertelement <16 x i8> %r7, i8 %v8, i32 8 | |
| %r9 = insertelement <16 x i8> %r8, i8 %v9, i32 9 | |
| %r10 = insertelement <16 x i8> %r9, i8 %v10, i32 10 | |
| %r11 = insertelement <16 x i8> %r10, i8 %v11, i32 11 | |
| %r12 = insertelement <16 x i8> %r11, i8 %v12, i32 12 | |
| %r13 = insertelement <16 x i8> %r12, i8 %v13, i32 13 | |
| %r14 = insertelement <16 x i8> %r13, i8 %v14, i32 14 | |
| %r15 = insertelement <16 x i8> %r14, i8 %v15, i32 15 | |
| ret <16 x i8> %r15 | |
| } | |
| define <32 x i8> @buildvec_v32i8_stride8_trailing_zeros(ptr %p) { | |
| ; AVX2-LABEL: buildvec_v32i8_stride8_trailing_zeros: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: movzbl (%rdi), %eax | |
| ; AVX2-NEXT: vmovd %eax, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $1, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $2, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $3, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $4, 32(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $5, 40(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $6, 48(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: vpinsrb $7, 56(%rdi), %xmm0, %xmm0 | |
| ; AVX2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: buildvec_v32i8_stride8_trailing_zeros: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: movzbl (%rdi), %eax | |
| ; AVX512-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $1, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $2, 16(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $3, 24(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $4, 32(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $5, 40(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $6, 48(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpinsrb $7, 56(%rdi), %xmm0, %xmm0 | |
| ; AVX512-NEXT: retq | |
| %p0 = getelementptr inbounds i8, ptr %p, i64 0 | |
| %p1 = getelementptr inbounds i8, ptr %p, i64 8 | |
| %p2 = getelementptr inbounds i8, ptr %p, i64 16 | |
| %p3 = getelementptr inbounds i8, ptr %p, i64 24 | |
| %p4 = getelementptr inbounds i8, ptr %p, i64 32 | |
| %p5 = getelementptr inbounds i8, ptr %p, i64 40 | |
| %p6 = getelementptr inbounds i8, ptr %p, i64 48 | |
| %p7 = getelementptr inbounds i8, ptr %p, i64 56 | |
| %v0 = load i8, ptr %p0 | |
| %v1 = load i8, ptr %p1 | |
| %v2 = load i8, ptr %p2 | |
| %v3 = load i8, ptr %p3 | |
| %v4 = load i8, ptr %p4 | |
| %v5 = load i8, ptr %p5 | |
| %v6 = load i8, ptr %p6 | |
| %v7 = load i8, ptr %p7 | |
| %r0 = insertelement <32 x i8> zeroinitializer, i8 %v0, i32 0 | |
| %r1 = insertelement <32 x i8> %r0, i8 %v1, i32 1 | |
| %r2 = insertelement <32 x i8> %r1, i8 %v2, i32 2 | |
| %r3 = insertelement <32 x i8> %r2, i8 %v3, i32 3 | |
| %r4 = insertelement <32 x i8> %r3, i8 %v4, i32 4 | |
| %r5 = insertelement <32 x i8> %r4, i8 %v5, i32 5 | |
| %r6 = insertelement <32 x i8> %r5, i8 %v6, i32 6 | |
| %r7 = insertelement <32 x i8> %r6, i8 %v7, i32 7 | |
| ret <32 x i8> %r7 | |
| } |