blob: db530a2618aa70f7e55c4789cc4906f0d81714eb [file] [edit]
; 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
}