Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / X86 / any_extend_vector_inreg_of_broadcast.ll
blobfe48059f9d0e653a6eefc04abfde869c608d3acd
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2,FALLBACK0
3 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,SSE42,FALLBACK1
4 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx  | FileCheck %s --check-prefixes=AVX,AVX1-ONLY,FALLBACK2
5 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX2,AVX2-SLOW,FALLBACK3
6 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX2,AVX2-FAST-PERLANE,FALLBACK4
7 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX2,AVX2-FAST,FALLBACK5
8 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512vl | FileCheck %s --check-prefixes=AVX512F,AVX512F-SLOW,FALLBACK6
9 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512F,AVX512F-FAST,FALLBACK7
10 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512vl,+avx512dq | FileCheck %s --check-prefixes=AVX512DQ,AVX512DQ-SLOW,FALLBACK8
11 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512vl,+avx512dq,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512DQ,AVX512DQ-FAST,FALLBACK9
12 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512vl,+avx512bw | FileCheck %s --check-prefixes=AVX512BW,AVX512BW-SLOW,FALLBACK10
13 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512vl,+avx512bw,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512BW,AVX512BW-FAST,FALLBACK11
14 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512vl,+avx512dq,+avx512bw | FileCheck %s --check-prefixes=AVX512BW,AVX512BW-SLOW,FALLBACK12
15 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512vl,+avx512dq,+avx512bw,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512BW,AVX512BW-FAST,FALLBACK13
17 define void @vec32_i8_widen_to_i16_factor2_broadcast_to_v2i16_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
18 ; SSE2-LABEL: vec32_i8_widen_to_i16_factor2_broadcast_to_v2i16_factor2:
19 ; SSE2:       # %bb.0:
20 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
21 ; SSE2-NEXT:    paddb (%rsi), %xmm0
22 ; SSE2-NEXT:    pxor %xmm1, %xmm1
23 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
24 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,5,6,7]
25 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
26 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,0,2,4,5,6,7]
27 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
28 ; SSE2-NEXT:    paddb (%rdx), %xmm0
29 ; SSE2-NEXT:    movdqa %xmm0, (%rcx)
30 ; SSE2-NEXT:    retq
32 ; SSE42-LABEL: vec32_i8_widen_to_i16_factor2_broadcast_to_v2i16_factor2:
33 ; SSE42:       # %bb.0:
34 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
35 ; SSE42-NEXT:    paddb (%rsi), %xmm0
36 ; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,5,0,7,u,u,u,u,u,u,u,u,u,u,u,u]
37 ; SSE42-NEXT:    paddb (%rdx), %xmm0
38 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
39 ; SSE42-NEXT:    retq
41 ; AVX-LABEL: vec32_i8_widen_to_i16_factor2_broadcast_to_v2i16_factor2:
42 ; AVX:       # %bb.0:
43 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
44 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
45 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,5,0,7,u,u,u,u,u,u,u,u,u,u,u,u]
46 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
47 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
48 ; AVX-NEXT:    retq
50 ; AVX2-LABEL: vec32_i8_widen_to_i16_factor2_broadcast_to_v2i16_factor2:
51 ; AVX2:       # %bb.0:
52 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
53 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
54 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,5,0,7,u,u,u,u,u,u,u,u,u,u,u,u]
55 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
56 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
57 ; AVX2-NEXT:    vzeroupper
58 ; AVX2-NEXT:    retq
60 ; AVX512F-LABEL: vec32_i8_widen_to_i16_factor2_broadcast_to_v2i16_factor2:
61 ; AVX512F:       # %bb.0:
62 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
63 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
64 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,5,0,7,u,u,u,u,u,u,u,u,u,u,u,u]
65 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
66 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
67 ; AVX512F-NEXT:    vzeroupper
68 ; AVX512F-NEXT:    retq
70 ; AVX512DQ-LABEL: vec32_i8_widen_to_i16_factor2_broadcast_to_v2i16_factor2:
71 ; AVX512DQ:       # %bb.0:
72 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
73 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
74 ; AVX512DQ-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,5,0,7,u,u,u,u,u,u,u,u,u,u,u,u]
75 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
76 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
77 ; AVX512DQ-NEXT:    vzeroupper
78 ; AVX512DQ-NEXT:    retq
80 ; AVX512BW-LABEL: vec32_i8_widen_to_i16_factor2_broadcast_to_v2i16_factor2:
81 ; AVX512BW:       # %bb.0:
82 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
83 ; AVX512BW-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
84 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,5,0,7,u,u,u,u,u,u,u,u,u,u,u,u]
85 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
86 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
87 ; AVX512BW-NEXT:    vzeroupper
88 ; AVX512BW-NEXT:    retq
89   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
90   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
91   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
92   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <4 x i32> <i32 0, i32 5, i32 0, i32 7>
93   %out.bytevec.padded = shufflevector <4 x i8> %broadcast.of.aextinreg, <4 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
94   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
95   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
96   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
97   ret void
100 define void @vec64_i8_widen_to_i16_factor2_broadcast_to_v4i16_factor4(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
101 ; SSE2-LABEL: vec64_i8_widen_to_i16_factor2_broadcast_to_v4i16_factor4:
102 ; SSE2:       # %bb.0:
103 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
104 ; SSE2-NEXT:    paddb (%rsi), %xmm0
105 ; SSE2-NEXT:    pxor %xmm1, %xmm1
106 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
107 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
108 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]
109 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
110 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,1,2,3,4,5,6,7]
111 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,5,6,7]
112 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
113 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7]
114 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
115 ; SSE2-NEXT:    packuswb %xmm2, %xmm2
116 ; SSE2-NEXT:    paddb (%rdx), %xmm2
117 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
118 ; SSE2-NEXT:    retq
120 ; SSE42-LABEL: vec64_i8_widen_to_i16_factor2_broadcast_to_v4i16_factor4:
121 ; SSE42:       # %bb.0:
122 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
123 ; SSE42-NEXT:    paddb (%rsi), %xmm0
124 ; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,9,0,11,0,13,0,15,u,u,u,u,u,u,u,u]
125 ; SSE42-NEXT:    paddb (%rdx), %xmm0
126 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
127 ; SSE42-NEXT:    retq
129 ; AVX-LABEL: vec64_i8_widen_to_i16_factor2_broadcast_to_v4i16_factor4:
130 ; AVX:       # %bb.0:
131 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
132 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
133 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,9,0,11,0,13,0,15,u,u,u,u,u,u,u,u]
134 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
135 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
136 ; AVX-NEXT:    retq
138 ; AVX2-LABEL: vec64_i8_widen_to_i16_factor2_broadcast_to_v4i16_factor4:
139 ; AVX2:       # %bb.0:
140 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
141 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
142 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,9,0,11,0,13,0,15,u,u,u,u,u,u,u,u]
143 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
144 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
145 ; AVX2-NEXT:    vzeroupper
146 ; AVX2-NEXT:    retq
148 ; AVX512F-LABEL: vec64_i8_widen_to_i16_factor2_broadcast_to_v4i16_factor4:
149 ; AVX512F:       # %bb.0:
150 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
151 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
152 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,9,0,11,0,13,0,15,u,u,u,u,u,u,u,u]
153 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
154 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
155 ; AVX512F-NEXT:    vzeroupper
156 ; AVX512F-NEXT:    retq
158 ; AVX512DQ-LABEL: vec64_i8_widen_to_i16_factor2_broadcast_to_v4i16_factor4:
159 ; AVX512DQ:       # %bb.0:
160 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
161 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
162 ; AVX512DQ-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,9,0,11,0,13,0,15,u,u,u,u,u,u,u,u]
163 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
164 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
165 ; AVX512DQ-NEXT:    vzeroupper
166 ; AVX512DQ-NEXT:    retq
168 ; AVX512BW-LABEL: vec64_i8_widen_to_i16_factor2_broadcast_to_v4i16_factor4:
169 ; AVX512BW:       # %bb.0:
170 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
171 ; AVX512BW-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
172 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,9,0,11,0,13,0,15,u,u,u,u,u,u,u,u]
173 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
174 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
175 ; AVX512BW-NEXT:    vzeroupper
176 ; AVX512BW-NEXT:    retq
177   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
178   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
179   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
180   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <8 x i32> <i32 0, i32 9, i32 0, i32 11, i32 0, i32 13, i32 0, i32 15>
181   %out.bytevec.padded = shufflevector <8 x i8> %broadcast.of.aextinreg, <8 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
182   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
183   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
184   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
185   ret void
188 define void @vec64_i8_widen_to_i32_factor4_broadcast_to_v2i32_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
189 ; SSE2-LABEL: vec64_i8_widen_to_i32_factor4_broadcast_to_v2i32_factor2:
190 ; SSE2:       # %bb.0:
191 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
192 ; SSE2-NEXT:    paddb (%rsi), %xmm0
193 ; SSE2-NEXT:    pxor %xmm1, %xmm1
194 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
195 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
196 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [0,65535,65535,65535,0,65535,65535,65535]
197 ; SSE2-NEXT:    pand %xmm3, %xmm2
198 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
199 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
200 ; SSE2-NEXT:    pandn %xmm0, %xmm3
201 ; SSE2-NEXT:    por %xmm2, %xmm3
202 ; SSE2-NEXT:    packuswb %xmm3, %xmm3
203 ; SSE2-NEXT:    paddb (%rdx), %xmm3
204 ; SSE2-NEXT:    movdqa %xmm3, (%rcx)
205 ; SSE2-NEXT:    retq
207 ; SSE42-LABEL: vec64_i8_widen_to_i32_factor4_broadcast_to_v2i32_factor2:
208 ; SSE42:       # %bb.0:
209 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
210 ; SSE42-NEXT:    paddb (%rsi), %xmm0
211 ; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,9,10,11,0,13,14,15,u,u,u,u,u,u,u,u]
212 ; SSE42-NEXT:    paddb (%rdx), %xmm0
213 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
214 ; SSE42-NEXT:    retq
216 ; AVX-LABEL: vec64_i8_widen_to_i32_factor4_broadcast_to_v2i32_factor2:
217 ; AVX:       # %bb.0:
218 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
219 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
220 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,9,10,11,0,13,14,15,u,u,u,u,u,u,u,u]
221 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
222 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
223 ; AVX-NEXT:    retq
225 ; AVX2-LABEL: vec64_i8_widen_to_i32_factor4_broadcast_to_v2i32_factor2:
226 ; AVX2:       # %bb.0:
227 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
228 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
229 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,9,10,11,0,13,14,15,u,u,u,u,u,u,u,u]
230 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
231 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
232 ; AVX2-NEXT:    vzeroupper
233 ; AVX2-NEXT:    retq
235 ; AVX512F-LABEL: vec64_i8_widen_to_i32_factor4_broadcast_to_v2i32_factor2:
236 ; AVX512F:       # %bb.0:
237 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
238 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
239 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,9,10,11,0,13,14,15,u,u,u,u,u,u,u,u]
240 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
241 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
242 ; AVX512F-NEXT:    vzeroupper
243 ; AVX512F-NEXT:    retq
245 ; AVX512DQ-LABEL: vec64_i8_widen_to_i32_factor4_broadcast_to_v2i32_factor2:
246 ; AVX512DQ:       # %bb.0:
247 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
248 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
249 ; AVX512DQ-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,9,10,11,0,13,14,15,u,u,u,u,u,u,u,u]
250 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
251 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
252 ; AVX512DQ-NEXT:    vzeroupper
253 ; AVX512DQ-NEXT:    retq
255 ; AVX512BW-LABEL: vec64_i8_widen_to_i32_factor4_broadcast_to_v2i32_factor2:
256 ; AVX512BW:       # %bb.0:
257 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
258 ; AVX512BW-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
259 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,9,10,11,0,13,14,15,u,u,u,u,u,u,u,u]
260 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
261 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
262 ; AVX512BW-NEXT:    vzeroupper
263 ; AVX512BW-NEXT:    retq
264   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
265   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
266   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
267   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <8 x i32> <i32 0, i32 9, i32 10, i32 11, i32 0, i32 13, i32 14, i32 15>
268   %out.bytevec.padded = shufflevector <8 x i8> %broadcast.of.aextinreg, <8 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
269   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
270   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
271   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
272   ret void
275 define void @vec64_i16_widen_to_i32_factor2_broadcast_to_v2i32_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
276 ; SSE2-LABEL: vec64_i16_widen_to_i32_factor2_broadcast_to_v2i32_factor2:
277 ; SSE2:       # %bb.0:
278 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
279 ; SSE2-NEXT:    paddb (%rsi), %xmm0
280 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,5,6,7]
281 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
282 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,0,2,4,5,6,7]
283 ; SSE2-NEXT:    paddb (%rdx), %xmm0
284 ; SSE2-NEXT:    movdqa %xmm0, (%rcx)
285 ; SSE2-NEXT:    retq
287 ; SSE42-LABEL: vec64_i16_widen_to_i32_factor2_broadcast_to_v2i32_factor2:
288 ; SSE42:       # %bb.0:
289 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
290 ; SSE42-NEXT:    paddb (%rsi), %xmm0
291 ; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,10,11,0,1,14,15,14,15,10,11,12,13,14,15]
292 ; SSE42-NEXT:    paddb (%rdx), %xmm0
293 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
294 ; SSE42-NEXT:    retq
296 ; AVX-LABEL: vec64_i16_widen_to_i32_factor2_broadcast_to_v2i32_factor2:
297 ; AVX:       # %bb.0:
298 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
299 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
300 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,10,11,0,1,14,15,14,15,10,11,12,13,14,15]
301 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
302 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
303 ; AVX-NEXT:    retq
305 ; AVX2-LABEL: vec64_i16_widen_to_i32_factor2_broadcast_to_v2i32_factor2:
306 ; AVX2:       # %bb.0:
307 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
308 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
309 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,10,11,0,1,14,15,14,15,10,11,12,13,14,15]
310 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
311 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
312 ; AVX2-NEXT:    vzeroupper
313 ; AVX2-NEXT:    retq
315 ; AVX512F-LABEL: vec64_i16_widen_to_i32_factor2_broadcast_to_v2i32_factor2:
316 ; AVX512F:       # %bb.0:
317 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
318 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
319 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,10,11,0,1,14,15,u,u,u,u,u,u,u,u]
320 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
321 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
322 ; AVX512F-NEXT:    vzeroupper
323 ; AVX512F-NEXT:    retq
325 ; AVX512DQ-LABEL: vec64_i16_widen_to_i32_factor2_broadcast_to_v2i32_factor2:
326 ; AVX512DQ:       # %bb.0:
327 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
328 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
329 ; AVX512DQ-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,10,11,0,1,14,15,u,u,u,u,u,u,u,u]
330 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
331 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
332 ; AVX512DQ-NEXT:    vzeroupper
333 ; AVX512DQ-NEXT:    retq
335 ; AVX512BW-LABEL: vec64_i16_widen_to_i32_factor2_broadcast_to_v2i32_factor2:
336 ; AVX512BW:       # %bb.0:
337 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
338 ; AVX512BW-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
339 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,10,11,0,1,14,15,u,u,u,u,u,u,u,u]
340 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
341 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
342 ; AVX512BW-NEXT:    vzeroupper
343 ; AVX512BW-NEXT:    retq
344   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
345   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
346   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
347   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
348   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <4 x i32> <i32 0, i32 5, i32 0, i32 7>
349   %out.bytevec = bitcast <4 x i16> %broadcast.of.aextinreg to <8 x i8>
350   %out.bytevec.padded = shufflevector <8 x i8> %out.bytevec, <8 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
351   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
352   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
353   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
354   ret void
357 define void @vec128_i8_widen_to_i16_factor2_broadcast_to_v8i16_factor8(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
358 ; SSE2-LABEL: vec128_i8_widen_to_i16_factor2_broadcast_to_v8i16_factor8:
359 ; SSE2:       # %bb.0:
360 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
361 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm1
362 ; SSE2-NEXT:    paddb (%rsi), %xmm0
363 ; SSE2-NEXT:    paddb 16(%rsi), %xmm1
364 ; SSE2-NEXT:    psrlw $8, %xmm1
365 ; SSE2-NEXT:    packuswb %xmm1, %xmm1
366 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
367 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
368 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
369 ; SSE2-NEXT:    paddb (%rdx), %xmm0
370 ; SSE2-NEXT:    movdqa %xmm0, (%rcx)
371 ; SSE2-NEXT:    retq
373 ; SSE42-LABEL: vec128_i8_widen_to_i16_factor2_broadcast_to_v8i16_factor8:
374 ; SSE42:       # %bb.0:
375 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
376 ; SSE42-NEXT:    movdqa 16(%rdi), %xmm1
377 ; SSE42-NEXT:    paddb (%rsi), %xmm0
378 ; SSE42-NEXT:    paddb 16(%rsi), %xmm1
379 ; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
380 ; SSE42-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
381 ; SSE42-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
382 ; SSE42-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
383 ; SSE42-NEXT:    paddb (%rdx), %xmm0
384 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
385 ; SSE42-NEXT:    retq
387 ; AVX-LABEL: vec128_i8_widen_to_i16_factor2_broadcast_to_v8i16_factor8:
388 ; AVX:       # %bb.0:
389 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
390 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
391 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
392 ; AVX-NEXT:    vpaddb 16(%rsi), %xmm1, %xmm1
393 ; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
394 ; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
395 ; AVX-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
396 ; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
397 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
398 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
399 ; AVX-NEXT:    retq
401 ; AVX2-LABEL: vec128_i8_widen_to_i16_factor2_broadcast_to_v8i16_factor8:
402 ; AVX2:       # %bb.0:
403 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
404 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
405 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
406 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
407 ; AVX2-NEXT:    vpbroadcastb %xmm0, %xmm0
408 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
409 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
410 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
411 ; AVX2-NEXT:    vzeroupper
412 ; AVX2-NEXT:    retq
414 ; AVX512F-LABEL: vec128_i8_widen_to_i16_factor2_broadcast_to_v8i16_factor8:
415 ; AVX512F:       # %bb.0:
416 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
417 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
418 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
419 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
420 ; AVX512F-NEXT:    vpbroadcastb %xmm0, %xmm0
421 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
422 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
423 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
424 ; AVX512F-NEXT:    vzeroupper
425 ; AVX512F-NEXT:    retq
427 ; AVX512DQ-LABEL: vec128_i8_widen_to_i16_factor2_broadcast_to_v8i16_factor8:
428 ; AVX512DQ:       # %bb.0:
429 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
430 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
431 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
432 ; AVX512DQ-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
433 ; AVX512DQ-NEXT:    vpbroadcastb %xmm0, %xmm0
434 ; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
435 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
436 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
437 ; AVX512DQ-NEXT:    vzeroupper
438 ; AVX512DQ-NEXT:    retq
440 ; AVX512BW-LABEL: vec128_i8_widen_to_i16_factor2_broadcast_to_v8i16_factor8:
441 ; AVX512BW:       # %bb.0:
442 ; AVX512BW-NEXT:    vmovdqa (%rdi), %ymm0
443 ; AVX512BW-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
444 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
445 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
446 ; AVX512BW-NEXT:    vpbroadcastb %xmm0, %xmm0
447 ; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
448 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
449 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
450 ; AVX512BW-NEXT:    vzeroupper
451 ; AVX512BW-NEXT:    retq
452   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
453   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
454   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
455   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <16 x i32> <i32 0, i32 17, i32 0, i32 19, i32 0, i32 21, i32 0, i32 23, i32 0, i32 25, i32 0, i32 27, i32 0, i32 29, i32 0, i32 31>
456   %out.bytevec.padded = shufflevector <16 x i8> %broadcast.of.aextinreg, <16 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
457   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
458   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
459   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
460   ret void
463 define void @vec128_i8_widen_to_i32_factor4_broadcast_to_v4i32_factor4(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
464 ; SSE2-LABEL: vec128_i8_widen_to_i32_factor4_broadcast_to_v4i32_factor4:
465 ; SSE2:       # %bb.0:
466 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
467 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm1
468 ; SSE2-NEXT:    paddb (%rsi), %xmm0
469 ; SSE2-NEXT:    paddb 16(%rsi), %xmm1
470 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
471 ; SSE2-NEXT:    pand %xmm2, %xmm1
472 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
473 ; SSE2-NEXT:    pandn %xmm0, %xmm2
474 ; SSE2-NEXT:    por %xmm1, %xmm2
475 ; SSE2-NEXT:    paddb (%rdx), %xmm2
476 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
477 ; SSE2-NEXT:    retq
479 ; SSE42-LABEL: vec128_i8_widen_to_i32_factor4_broadcast_to_v4i32_factor4:
480 ; SSE42:       # %bb.0:
481 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
482 ; SSE42-NEXT:    movdqa 16(%rdi), %xmm1
483 ; SSE42-NEXT:    paddb 16(%rsi), %xmm1
484 ; SSE42-NEXT:    paddb (%rsi), %xmm0
485 ; SSE42-NEXT:    palignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
486 ; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,15,4,5,6,15,8,9,10,15,12,13,14]
487 ; SSE42-NEXT:    paddb (%rdx), %xmm0
488 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
489 ; SSE42-NEXT:    retq
491 ; AVX-LABEL: vec128_i8_widen_to_i32_factor4_broadcast_to_v4i32_factor4:
492 ; AVX:       # %bb.0:
493 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
494 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
495 ; AVX-NEXT:    vpaddb 16(%rsi), %xmm1, %xmm1
496 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
497 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
498 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,15,4,5,6,15,8,9,10,15,12,13,14]
499 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
500 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
501 ; AVX-NEXT:    retq
503 ; AVX2-LABEL: vec128_i8_widen_to_i32_factor4_broadcast_to_v4i32_factor4:
504 ; AVX2:       # %bb.0:
505 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
506 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
507 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
508 ; AVX2-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
509 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,15,4,5,6,15,8,9,10,15,12,13,14]
510 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
511 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
512 ; AVX2-NEXT:    vzeroupper
513 ; AVX2-NEXT:    retq
515 ; AVX512F-LABEL: vec128_i8_widen_to_i32_factor4_broadcast_to_v4i32_factor4:
516 ; AVX512F:       # %bb.0:
517 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
518 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
519 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
520 ; AVX512F-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
521 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,15,4,5,6,15,8,9,10,15,12,13,14]
522 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
523 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
524 ; AVX512F-NEXT:    vzeroupper
525 ; AVX512F-NEXT:    retq
527 ; AVX512DQ-LABEL: vec128_i8_widen_to_i32_factor4_broadcast_to_v4i32_factor4:
528 ; AVX512DQ:       # %bb.0:
529 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
530 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
531 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
532 ; AVX512DQ-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
533 ; AVX512DQ-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,15,4,5,6,15,8,9,10,15,12,13,14]
534 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
535 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
536 ; AVX512DQ-NEXT:    vzeroupper
537 ; AVX512DQ-NEXT:    retq
539 ; AVX512BW-LABEL: vec128_i8_widen_to_i32_factor4_broadcast_to_v4i32_factor4:
540 ; AVX512BW:       # %bb.0:
541 ; AVX512BW-NEXT:    vmovdqa (%rdi), %ymm0
542 ; AVX512BW-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
543 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
544 ; AVX512BW-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
545 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,15,4,5,6,15,8,9,10,15,12,13,14]
546 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
547 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
548 ; AVX512BW-NEXT:    vzeroupper
549 ; AVX512BW-NEXT:    retq
550   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
551   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
552   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
553   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <16 x i32> <i32 0, i32 17, i32 18, i32 19, i32 0, i32 21, i32 22, i32 23, i32 0, i32 25, i32 26, i32 27, i32 0, i32 29, i32 30, i32 31>
554   %out.bytevec.padded = shufflevector <16 x i8> %broadcast.of.aextinreg, <16 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
555   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
556   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
557   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
558   ret void
561 define void @vec128_i8_widen_to_i64_factor8_broadcast_to_v2i64_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
562 ; SSE2-LABEL: vec128_i8_widen_to_i64_factor8_broadcast_to_v2i64_factor2:
563 ; SSE2:       # %bb.0:
564 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
565 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm1
566 ; SSE2-NEXT:    paddb (%rsi), %xmm0
567 ; SSE2-NEXT:    paddb 16(%rsi), %xmm1
568 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
569 ; SSE2-NEXT:    pand %xmm2, %xmm1
570 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
571 ; SSE2-NEXT:    pandn %xmm0, %xmm2
572 ; SSE2-NEXT:    por %xmm1, %xmm2
573 ; SSE2-NEXT:    paddb (%rdx), %xmm2
574 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
575 ; SSE2-NEXT:    retq
577 ; SSE42-LABEL: vec128_i8_widen_to_i64_factor8_broadcast_to_v2i64_factor2:
578 ; SSE42:       # %bb.0:
579 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
580 ; SSE42-NEXT:    movdqa 16(%rdi), %xmm1
581 ; SSE42-NEXT:    paddb 16(%rsi), %xmm1
582 ; SSE42-NEXT:    paddb (%rsi), %xmm0
583 ; SSE42-NEXT:    palignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
584 ; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,5,6,15,8,9,10,11,12,13,14]
585 ; SSE42-NEXT:    paddb (%rdx), %xmm0
586 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
587 ; SSE42-NEXT:    retq
589 ; AVX-LABEL: vec128_i8_widen_to_i64_factor8_broadcast_to_v2i64_factor2:
590 ; AVX:       # %bb.0:
591 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
592 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
593 ; AVX-NEXT:    vpaddb 16(%rsi), %xmm1, %xmm1
594 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
595 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
596 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,5,6,15,8,9,10,11,12,13,14]
597 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
598 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
599 ; AVX-NEXT:    retq
601 ; AVX2-LABEL: vec128_i8_widen_to_i64_factor8_broadcast_to_v2i64_factor2:
602 ; AVX2:       # %bb.0:
603 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
604 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
605 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
606 ; AVX2-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
607 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,5,6,15,8,9,10,11,12,13,14]
608 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
609 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
610 ; AVX2-NEXT:    vzeroupper
611 ; AVX2-NEXT:    retq
613 ; AVX512F-LABEL: vec128_i8_widen_to_i64_factor8_broadcast_to_v2i64_factor2:
614 ; AVX512F:       # %bb.0:
615 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
616 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
617 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
618 ; AVX512F-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
619 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,5,6,15,8,9,10,11,12,13,14]
620 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
621 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
622 ; AVX512F-NEXT:    vzeroupper
623 ; AVX512F-NEXT:    retq
625 ; AVX512DQ-LABEL: vec128_i8_widen_to_i64_factor8_broadcast_to_v2i64_factor2:
626 ; AVX512DQ:       # %bb.0:
627 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
628 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
629 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
630 ; AVX512DQ-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
631 ; AVX512DQ-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,5,6,15,8,9,10,11,12,13,14]
632 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
633 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
634 ; AVX512DQ-NEXT:    vzeroupper
635 ; AVX512DQ-NEXT:    retq
637 ; AVX512BW-LABEL: vec128_i8_widen_to_i64_factor8_broadcast_to_v2i64_factor2:
638 ; AVX512BW:       # %bb.0:
639 ; AVX512BW-NEXT:    vmovdqa (%rdi), %ymm0
640 ; AVX512BW-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
641 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
642 ; AVX512BW-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
643 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,5,6,15,8,9,10,11,12,13,14]
644 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
645 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
646 ; AVX512BW-NEXT:    vzeroupper
647 ; AVX512BW-NEXT:    retq
648   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
649   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
650   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
651   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <16 x i32> <i32 0, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 0, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
652   %out.bytevec.padded = shufflevector <16 x i8> %broadcast.of.aextinreg, <16 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
653   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
654   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
655   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
656   ret void
659 define void @vec128_i16_widen_to_i32_factor2_broadcast_to_v4i32_factor4(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
660 ; SSE2-LABEL: vec128_i16_widen_to_i32_factor2_broadcast_to_v4i32_factor4:
661 ; SSE2:       # %bb.0:
662 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
663 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm1
664 ; SSE2-NEXT:    paddb 16(%rsi), %xmm1
665 ; SSE2-NEXT:    paddb (%rsi), %xmm0
666 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
667 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,1,2,3,4,5,6,7]
668 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,5,6,7]
669 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
670 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[1,0,3,2,4,5,6,7]
671 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
672 ; SSE2-NEXT:    paddb (%rdx), %xmm0
673 ; SSE2-NEXT:    movdqa %xmm0, (%rcx)
674 ; SSE2-NEXT:    retq
676 ; SSE42-LABEL: vec128_i16_widen_to_i32_factor2_broadcast_to_v4i32_factor4:
677 ; SSE42:       # %bb.0:
678 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
679 ; SSE42-NEXT:    movdqa 16(%rdi), %xmm1
680 ; SSE42-NEXT:    paddb (%rsi), %xmm0
681 ; SSE42-NEXT:    paddb 16(%rsi), %xmm1
682 ; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[2,3,6,7,10,11,14,15,u,u,u,u,u,u,u,u]
683 ; SSE42-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
684 ; SSE42-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
685 ; SSE42-NEXT:    paddb (%rdx), %xmm0
686 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
687 ; SSE42-NEXT:    retq
689 ; AVX-LABEL: vec128_i16_widen_to_i32_factor2_broadcast_to_v4i32_factor4:
690 ; AVX:       # %bb.0:
691 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
692 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
693 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
694 ; AVX-NEXT:    vpaddb 16(%rsi), %xmm1, %xmm1
695 ; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[2,3,6,7,10,11,14,15,u,u,u,u,u,u,u,u]
696 ; AVX-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
697 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
698 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
699 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
700 ; AVX-NEXT:    retq
702 ; AVX2-LABEL: vec128_i16_widen_to_i32_factor2_broadcast_to_v4i32_factor4:
703 ; AVX2:       # %bb.0:
704 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
705 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
706 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
707 ; AVX2-NEXT:    vpbroadcastw %xmm0, %xmm0
708 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
709 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
710 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
711 ; AVX2-NEXT:    vzeroupper
712 ; AVX2-NEXT:    retq
714 ; AVX512F-LABEL: vec128_i16_widen_to_i32_factor2_broadcast_to_v4i32_factor4:
715 ; AVX512F:       # %bb.0:
716 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
717 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
718 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
719 ; AVX512F-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6,7]
720 ; AVX512F-NEXT:    vmovd %xmm0, %eax
721 ; AVX512F-NEXT:    vpinsrw $2, %eax, %xmm2, %xmm0
722 ; AVX512F-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3],xmm0[4,5,6,7]
723 ; AVX512F-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
724 ; AVX512F-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4],xmm1[5],xmm0[6,7]
725 ; AVX512F-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
726 ; AVX512F-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,6],xmm1[7]
727 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
728 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
729 ; AVX512F-NEXT:    vzeroupper
730 ; AVX512F-NEXT:    retq
732 ; AVX512DQ-LABEL: vec128_i16_widen_to_i32_factor2_broadcast_to_v4i32_factor4:
733 ; AVX512DQ:       # %bb.0:
734 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
735 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
736 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
737 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6,7]
738 ; AVX512DQ-NEXT:    vmovd %xmm0, %eax
739 ; AVX512DQ-NEXT:    vpinsrw $2, %eax, %xmm2, %xmm0
740 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3],xmm0[4,5,6,7]
741 ; AVX512DQ-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
742 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4],xmm1[5],xmm0[6,7]
743 ; AVX512DQ-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
744 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,6],xmm1[7]
745 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
746 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
747 ; AVX512DQ-NEXT:    vzeroupper
748 ; AVX512DQ-NEXT:    retq
750 ; AVX512BW-SLOW-LABEL: vec128_i16_widen_to_i32_factor2_broadcast_to_v4i32_factor4:
751 ; AVX512BW-SLOW:       # %bb.0:
752 ; AVX512BW-SLOW-NEXT:    vmovdqa64 (%rdi), %zmm0
753 ; AVX512BW-SLOW-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,9,0,11,0,13,0,15]
754 ; AVX512BW-SLOW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
755 ; AVX512BW-SLOW-NEXT:    vpermw %zmm0, %zmm1, %zmm0
756 ; AVX512BW-SLOW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
757 ; AVX512BW-SLOW-NEXT:    vmovdqa64 %zmm0, (%rcx)
758 ; AVX512BW-SLOW-NEXT:    vzeroupper
759 ; AVX512BW-SLOW-NEXT:    retq
761 ; AVX512BW-FAST-LABEL: vec128_i16_widen_to_i32_factor2_broadcast_to_v4i32_factor4:
762 ; AVX512BW-FAST:       # %bb.0:
763 ; AVX512BW-FAST-NEXT:    vmovdqa64 (%rdi), %zmm0
764 ; AVX512BW-FAST-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,9,0,11,0,13,6,7]
765 ; AVX512BW-FAST-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
766 ; AVX512BW-FAST-NEXT:    vpermw %zmm0, %zmm1, %zmm1
767 ; AVX512BW-FAST-NEXT:    vmovd %xmm0, %eax
768 ; AVX512BW-FAST-NEXT:    vpinsrw $6, %eax, %xmm1, %xmm1
769 ; AVX512BW-FAST-NEXT:    vextracti128 $1, %ymm0, %xmm0
770 ; AVX512BW-FAST-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5,6],xmm0[7]
771 ; AVX512BW-FAST-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
772 ; AVX512BW-FAST-NEXT:    vmovdqa64 %zmm0, (%rcx)
773 ; AVX512BW-FAST-NEXT:    vzeroupper
774 ; AVX512BW-FAST-NEXT:    retq
775   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
776   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
777   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
778   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
779   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <8 x i32> <i32 0, i32 9, i32 0, i32 11, i32 0, i32 13, i32 0, i32 15>
780   %out.bytevec = bitcast <8 x i16> %broadcast.of.aextinreg to <16 x i8>
781   %out.bytevec.padded = shufflevector <16 x i8> %out.bytevec, <16 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
782   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
783   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
784   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
785   ret void
788 define void @vec128_i16_widen_to_i64_factor4_broadcast_to_v2i64_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
789 ; SSE2-LABEL: vec128_i16_widen_to_i64_factor4_broadcast_to_v2i64_factor2:
790 ; SSE2:       # %bb.0:
791 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
792 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm1
793 ; SSE2-NEXT:    paddb (%rsi), %xmm0
794 ; SSE2-NEXT:    paddb 16(%rsi), %xmm1
795 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,65535,65535,65535,0,65535,65535,65535]
796 ; SSE2-NEXT:    pand %xmm2, %xmm1
797 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
798 ; SSE2-NEXT:    pandn %xmm0, %xmm2
799 ; SSE2-NEXT:    por %xmm1, %xmm2
800 ; SSE2-NEXT:    paddb (%rdx), %xmm2
801 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
802 ; SSE2-NEXT:    retq
804 ; SSE42-LABEL: vec128_i16_widen_to_i64_factor4_broadcast_to_v2i64_factor2:
805 ; SSE42:       # %bb.0:
806 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
807 ; SSE42-NEXT:    movdqa 16(%rdi), %xmm1
808 ; SSE42-NEXT:    paddb 16(%rsi), %xmm1
809 ; SSE42-NEXT:    paddb (%rsi), %xmm0
810 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
811 ; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
812 ; SSE42-NEXT:    paddb (%rdx), %xmm0
813 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
814 ; SSE42-NEXT:    retq
816 ; AVX-LABEL: vec128_i16_widen_to_i64_factor4_broadcast_to_v2i64_factor2:
817 ; AVX:       # %bb.0:
818 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
819 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
820 ; AVX-NEXT:    vpaddb 16(%rsi), %xmm1, %xmm1
821 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
822 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
823 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
824 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
825 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
826 ; AVX-NEXT:    retq
828 ; AVX2-LABEL: vec128_i16_widen_to_i64_factor4_broadcast_to_v2i64_factor2:
829 ; AVX2:       # %bb.0:
830 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
831 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
832 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
833 ; AVX2-NEXT:    vpbroadcastw %xmm0, %xmm0
834 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
835 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
836 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
837 ; AVX2-NEXT:    vzeroupper
838 ; AVX2-NEXT:    retq
840 ; AVX512F-LABEL: vec128_i16_widen_to_i64_factor4_broadcast_to_v2i64_factor2:
841 ; AVX512F:       # %bb.0:
842 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
843 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
844 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
845 ; AVX512F-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0],xmm1[1,2,3],xmm0[4,5,6,7]
846 ; AVX512F-NEXT:    vmovd %xmm0, %eax
847 ; AVX512F-NEXT:    vpinsrw $4, %eax, %xmm2, %xmm0
848 ; AVX512F-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4],xmm1[5,6,7]
849 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
850 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
851 ; AVX512F-NEXT:    vzeroupper
852 ; AVX512F-NEXT:    retq
854 ; AVX512DQ-LABEL: vec128_i16_widen_to_i64_factor4_broadcast_to_v2i64_factor2:
855 ; AVX512DQ:       # %bb.0:
856 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
857 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
858 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
859 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0],xmm1[1,2,3],xmm0[4,5,6,7]
860 ; AVX512DQ-NEXT:    vmovd %xmm0, %eax
861 ; AVX512DQ-NEXT:    vpinsrw $4, %eax, %xmm2, %xmm0
862 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4],xmm1[5,6,7]
863 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
864 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
865 ; AVX512DQ-NEXT:    vzeroupper
866 ; AVX512DQ-NEXT:    retq
868 ; AVX512BW-SLOW-LABEL: vec128_i16_widen_to_i64_factor4_broadcast_to_v2i64_factor2:
869 ; AVX512BW-SLOW:       # %bb.0:
870 ; AVX512BW-SLOW-NEXT:    vmovdqa64 (%rdi), %zmm0
871 ; AVX512BW-SLOW-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,9,10,11,0,13,6,7]
872 ; AVX512BW-SLOW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
873 ; AVX512BW-SLOW-NEXT:    vpermw %zmm0, %zmm1, %zmm1
874 ; AVX512BW-SLOW-NEXT:    vextracti128 $1, %ymm0, %xmm0
875 ; AVX512BW-SLOW-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[3]
876 ; AVX512BW-SLOW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
877 ; AVX512BW-SLOW-NEXT:    vmovdqa64 %zmm0, (%rcx)
878 ; AVX512BW-SLOW-NEXT:    vzeroupper
879 ; AVX512BW-SLOW-NEXT:    retq
881 ; AVX512BW-FAST-LABEL: vec128_i16_widen_to_i64_factor4_broadcast_to_v2i64_factor2:
882 ; AVX512BW-FAST:       # %bb.0:
883 ; AVX512BW-FAST-NEXT:    vmovdqa64 (%rdi), %zmm0
884 ; AVX512BW-FAST-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,9,10,11,0,5,6,7]
885 ; AVX512BW-FAST-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
886 ; AVX512BW-FAST-NEXT:    vpermw %zmm0, %zmm1, %zmm1
887 ; AVX512BW-FAST-NEXT:    vextracti128 $1, %ymm0, %xmm0
888 ; AVX512BW-FAST-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4],xmm0[5,6,7]
889 ; AVX512BW-FAST-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
890 ; AVX512BW-FAST-NEXT:    vmovdqa64 %zmm0, (%rcx)
891 ; AVX512BW-FAST-NEXT:    vzeroupper
892 ; AVX512BW-FAST-NEXT:    retq
893   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
894   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
895   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
896   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
897   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <8 x i32> <i32 0, i32 9, i32 10, i32 11, i32 0, i32 13, i32 14, i32 15>
898   %out.bytevec = bitcast <8 x i16> %broadcast.of.aextinreg to <16 x i8>
899   %out.bytevec.padded = shufflevector <16 x i8> %out.bytevec, <16 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
900   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
901   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
902   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
903   ret void
906 define void @vec128_i32_widen_to_i64_factor2_broadcast_to_v2i64_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
907 ; SSE2-LABEL: vec128_i32_widen_to_i64_factor2_broadcast_to_v2i64_factor2:
908 ; SSE2:       # %bb.0:
909 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
910 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm1
911 ; SSE2-NEXT:    paddb (%rsi), %xmm0
912 ; SSE2-NEXT:    paddb 16(%rsi), %xmm1
913 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
914 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
915 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
916 ; SSE2-NEXT:    paddb (%rdx), %xmm0
917 ; SSE2-NEXT:    movdqa %xmm0, (%rcx)
918 ; SSE2-NEXT:    retq
920 ; SSE42-LABEL: vec128_i32_widen_to_i64_factor2_broadcast_to_v2i64_factor2:
921 ; SSE42:       # %bb.0:
922 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
923 ; SSE42-NEXT:    movdqa 16(%rdi), %xmm1
924 ; SSE42-NEXT:    paddb 16(%rsi), %xmm1
925 ; SSE42-NEXT:    paddb (%rsi), %xmm0
926 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
927 ; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
928 ; SSE42-NEXT:    paddb (%rdx), %xmm0
929 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
930 ; SSE42-NEXT:    retq
932 ; AVX-LABEL: vec128_i32_widen_to_i64_factor2_broadcast_to_v2i64_factor2:
933 ; AVX:       # %bb.0:
934 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
935 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
936 ; AVX-NEXT:    vpaddb 16(%rsi), %xmm1, %xmm1
937 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
938 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
939 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
940 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
941 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
942 ; AVX-NEXT:    retq
944 ; AVX2-SLOW-LABEL: vec128_i32_widen_to_i64_factor2_broadcast_to_v2i64_factor2:
945 ; AVX2-SLOW:       # %bb.0:
946 ; AVX2-SLOW-NEXT:    vmovdqa (%rdi), %ymm0
947 ; AVX2-SLOW-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
948 ; AVX2-SLOW-NEXT:    vextracti128 $1, %ymm0, %xmm1
949 ; AVX2-SLOW-NEXT:    vpbroadcastd %xmm0, %xmm0
950 ; AVX2-SLOW-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
951 ; AVX2-SLOW-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
952 ; AVX2-SLOW-NEXT:    vmovdqa %ymm0, (%rcx)
953 ; AVX2-SLOW-NEXT:    vzeroupper
954 ; AVX2-SLOW-NEXT:    retq
956 ; AVX2-FAST-PERLANE-LABEL: vec128_i32_widen_to_i64_factor2_broadcast_to_v2i64_factor2:
957 ; AVX2-FAST-PERLANE:       # %bb.0:
958 ; AVX2-FAST-PERLANE-NEXT:    vmovdqa (%rdi), %ymm0
959 ; AVX2-FAST-PERLANE-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
960 ; AVX2-FAST-PERLANE-NEXT:    vextracti128 $1, %ymm0, %xmm1
961 ; AVX2-FAST-PERLANE-NEXT:    vpbroadcastd %xmm0, %xmm0
962 ; AVX2-FAST-PERLANE-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
963 ; AVX2-FAST-PERLANE-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
964 ; AVX2-FAST-PERLANE-NEXT:    vmovdqa %ymm0, (%rcx)
965 ; AVX2-FAST-PERLANE-NEXT:    vzeroupper
966 ; AVX2-FAST-PERLANE-NEXT:    retq
968 ; AVX2-FAST-LABEL: vec128_i32_widen_to_i64_factor2_broadcast_to_v2i64_factor2:
969 ; AVX2-FAST:       # %bb.0:
970 ; AVX2-FAST-NEXT:    vmovdqa (%rdi), %ymm0
971 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,5,0,7]
972 ; AVX2-FAST-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
973 ; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm1, %ymm0
974 ; AVX2-FAST-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
975 ; AVX2-FAST-NEXT:    vmovdqa %ymm0, (%rcx)
976 ; AVX2-FAST-NEXT:    vzeroupper
977 ; AVX2-FAST-NEXT:    retq
979 ; AVX512F-LABEL: vec128_i32_widen_to_i64_factor2_broadcast_to_v2i64_factor2:
980 ; AVX512F:       # %bb.0:
981 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm0 = [0,5,0,7]
982 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm1
983 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm1, %ymm1
984 ; AVX512F-NEXT:    vpermd %zmm1, %zmm0, %zmm0
985 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
986 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
987 ; AVX512F-NEXT:    vzeroupper
988 ; AVX512F-NEXT:    retq
990 ; AVX512DQ-LABEL: vec128_i32_widen_to_i64_factor2_broadcast_to_v2i64_factor2:
991 ; AVX512DQ:       # %bb.0:
992 ; AVX512DQ-NEXT:    vmovdqa {{.*#+}} xmm0 = [0,5,0,7]
993 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm1
994 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm1, %ymm1
995 ; AVX512DQ-NEXT:    vpermd %zmm1, %zmm0, %zmm0
996 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
997 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
998 ; AVX512DQ-NEXT:    vzeroupper
999 ; AVX512DQ-NEXT:    retq
1001 ; AVX512BW-LABEL: vec128_i32_widen_to_i64_factor2_broadcast_to_v2i64_factor2:
1002 ; AVX512BW:       # %bb.0:
1003 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
1004 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,5,0,7]
1005 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
1006 ; AVX512BW-NEXT:    vpermd %zmm0, %zmm1, %zmm0
1007 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
1008 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
1009 ; AVX512BW-NEXT:    vzeroupper
1010 ; AVX512BW-NEXT:    retq
1011   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
1012   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
1013   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
1014   %in.vec.cast = bitcast <64 x i8> %in.vec to <16 x i32>
1015   %broadcast.of.aextinreg = shufflevector <16 x i32> %in.vec.cast, <16 x i32> poison, <4 x i32> <i32 0, i32 5, i32 0, i32 7>
1016   %out.bytevec = bitcast <4 x i32> %broadcast.of.aextinreg to <16 x i8>
1017   %out.bytevec.padded = shufflevector <16 x i8> %out.bytevec, <16 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1018   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
1019   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
1020   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
1021   ret void
1024 define void @vec256_i8_widen_to_i16_factor2_broadcast_to_v16i16_factor16(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
1025 ; SSE2-LABEL: vec256_i8_widen_to_i16_factor2_broadcast_to_v16i16_factor16:
1026 ; SSE2:       # %bb.0:
1027 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
1028 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm1
1029 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm2
1030 ; SSE2-NEXT:    paddb 48(%rsi), %xmm2
1031 ; SSE2-NEXT:    paddb (%rsi), %xmm0
1032 ; SSE2-NEXT:    paddb 32(%rsi), %xmm1
1033 ; SSE2-NEXT:    psrlw $8, %xmm1
1034 ; SSE2-NEXT:    packuswb %xmm1, %xmm1
1035 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1036 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
1037 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1038 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
1039 ; SSE2-NEXT:    psrlw $8, %xmm2
1040 ; SSE2-NEXT:    packuswb %xmm2, %xmm2
1041 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1042 ; SSE2-NEXT:    paddb 16(%rdx), %xmm0
1043 ; SSE2-NEXT:    paddb (%rdx), %xmm3
1044 ; SSE2-NEXT:    movdqa %xmm3, (%rcx)
1045 ; SSE2-NEXT:    movdqa %xmm0, 16(%rcx)
1046 ; SSE2-NEXT:    retq
1048 ; SSE42-LABEL: vec256_i8_widen_to_i16_factor2_broadcast_to_v16i16_factor16:
1049 ; SSE42:       # %bb.0:
1050 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
1051 ; SSE42-NEXT:    movdqa 32(%rdi), %xmm1
1052 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm2
1053 ; SSE42-NEXT:    paddb 48(%rsi), %xmm2
1054 ; SSE42-NEXT:    paddb (%rsi), %xmm0
1055 ; SSE42-NEXT:    paddb 32(%rsi), %xmm1
1056 ; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
1057 ; SSE42-NEXT:    pshufb %xmm3, %xmm1
1058 ; SSE42-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1059 ; SSE42-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
1060 ; SSE42-NEXT:    movdqa %xmm0, %xmm4
1061 ; SSE42-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]
1062 ; SSE42-NEXT:    pshufb %xmm3, %xmm2
1063 ; SSE42-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1064 ; SSE42-NEXT:    paddb 16(%rdx), %xmm0
1065 ; SSE42-NEXT:    paddb (%rdx), %xmm4
1066 ; SSE42-NEXT:    movdqa %xmm4, (%rcx)
1067 ; SSE42-NEXT:    movdqa %xmm0, 16(%rcx)
1068 ; SSE42-NEXT:    retq
1070 ; AVX-LABEL: vec256_i8_widen_to_i16_factor2_broadcast_to_v16i16_factor16:
1071 ; AVX:       # %bb.0:
1072 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
1073 ; AVX-NEXT:    vmovdqa 32(%rdi), %xmm1
1074 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm2
1075 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm2, %xmm2
1076 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
1077 ; AVX-NEXT:    vpaddb 32(%rsi), %xmm1, %xmm1
1078 ; AVX-NEXT:    vmovddup {{.*#+}} xmm3 = [1,3,5,7,9,11,13,15,1,3,5,7,9,11,13,15]
1079 ; AVX-NEXT:    # xmm3 = mem[0,0]
1080 ; AVX-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1081 ; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1082 ; AVX-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
1083 ; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1084 ; AVX-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
1085 ; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1086 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
1087 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
1088 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
1089 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
1090 ; AVX-NEXT:    retq
1092 ; AVX2-LABEL: vec256_i8_widen_to_i16_factor2_broadcast_to_v16i16_factor16:
1093 ; AVX2:       # %bb.0:
1094 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm0
1095 ; AVX2-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1096 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u,17,19,21,23,25,27,29,31,u,u,u,u,u,u,u,u]
1097 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm1
1098 ; AVX2-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1099 ; AVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
1100 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
1101 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1102 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
1103 ; AVX2-NEXT:    vzeroupper
1104 ; AVX2-NEXT:    retq
1106 ; AVX512F-LABEL: vec256_i8_widen_to_i16_factor2_broadcast_to_v16i16_factor16:
1107 ; AVX512F:       # %bb.0:
1108 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm0
1109 ; AVX512F-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1110 ; AVX512F-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u,17,19,21,23,25,27,29,31,u,u,u,u,u,u,u,u]
1111 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm1
1112 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1113 ; AVX512F-NEXT:    vpbroadcastb %xmm1, %ymm1
1114 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
1115 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1116 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
1117 ; AVX512F-NEXT:    vzeroupper
1118 ; AVX512F-NEXT:    retq
1120 ; AVX512DQ-LABEL: vec256_i8_widen_to_i16_factor2_broadcast_to_v16i16_factor16:
1121 ; AVX512DQ:       # %bb.0:
1122 ; AVX512DQ-NEXT:    vmovdqa 32(%rdi), %ymm0
1123 ; AVX512DQ-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1124 ; AVX512DQ-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u,17,19,21,23,25,27,29,31,u,u,u,u,u,u,u,u]
1125 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm1
1126 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1127 ; AVX512DQ-NEXT:    vpbroadcastb %xmm1, %ymm1
1128 ; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
1129 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1130 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
1131 ; AVX512DQ-NEXT:    vzeroupper
1132 ; AVX512DQ-NEXT:    retq
1134 ; AVX512BW-LABEL: vec256_i8_widen_to_i16_factor2_broadcast_to_v16i16_factor16:
1135 ; AVX512BW:       # %bb.0:
1136 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
1137 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
1138 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1139 ; AVX512BW-NEXT:    vpshufb {{.*#+}} ymm1 = ymm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u,17,19,21,23,25,27,29,31,u,u,u,u,u,u,u,u]
1140 ; AVX512BW-NEXT:    vpbroadcastb %xmm0, %ymm0
1141 ; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
1142 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
1143 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
1144 ; AVX512BW-NEXT:    vzeroupper
1145 ; AVX512BW-NEXT:    retq
1146   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
1147   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
1148   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
1149   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <32 x i32> <i32 0, i32 33, i32 0, i32 35, i32 0, i32 37, i32 0, i32 39, i32 0, i32 41, i32 0, i32 43, i32 0, i32 45, i32 0, i32 47, i32 0, i32 49, i32 0, i32 51, i32 0, i32 53, i32 0, i32 55, i32 0, i32 57, i32 0, i32 59, i32 0, i32 61, i32 0, i32 63>
1150   %out.bytevec.padded = shufflevector <32 x i8> %broadcast.of.aextinreg, <32 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1151   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
1152   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
1153   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
1154   ret void
1157 define void @vec256_i8_widen_to_i32_factor4_broadcast_to_v8i32_factor8(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
1158 ; SSE2-LABEL: vec256_i8_widen_to_i32_factor4_broadcast_to_v8i32_factor8:
1159 ; SSE2:       # %bb.0:
1160 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
1161 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm1
1162 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm2
1163 ; SSE2-NEXT:    paddb 48(%rsi), %xmm2
1164 ; SSE2-NEXT:    paddb (%rsi), %xmm0
1165 ; SSE2-NEXT:    paddb 32(%rsi), %xmm1
1166 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
1167 ; SSE2-NEXT:    pand %xmm3, %xmm1
1168 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
1169 ; SSE2-NEXT:    pand %xmm3, %xmm2
1170 ; SSE2-NEXT:    pandn %xmm0, %xmm3
1171 ; SSE2-NEXT:    por %xmm3, %xmm1
1172 ; SSE2-NEXT:    por %xmm2, %xmm3
1173 ; SSE2-NEXT:    paddb 16(%rdx), %xmm3
1174 ; SSE2-NEXT:    paddb (%rdx), %xmm1
1175 ; SSE2-NEXT:    movdqa %xmm1, (%rcx)
1176 ; SSE2-NEXT:    movdqa %xmm3, 16(%rcx)
1177 ; SSE2-NEXT:    retq
1179 ; SSE42-LABEL: vec256_i8_widen_to_i32_factor4_broadcast_to_v8i32_factor8:
1180 ; SSE42:       # %bb.0:
1181 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
1182 ; SSE42-NEXT:    movdqa 32(%rdi), %xmm1
1183 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm2
1184 ; SSE42-NEXT:    paddb 48(%rsi), %xmm2
1185 ; SSE42-NEXT:    paddb 32(%rsi), %xmm1
1186 ; SSE42-NEXT:    paddb (%rsi), %xmm0
1187 ; SSE42-NEXT:    movdqa %xmm0, %xmm3
1188 ; SSE42-NEXT:    palignr {{.*#+}} xmm3 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm3[0]
1189 ; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [15,0,1,2,15,4,5,6,15,8,9,10,15,12,13,14]
1190 ; SSE42-NEXT:    pshufb %xmm1, %xmm3
1191 ; SSE42-NEXT:    palignr {{.*#+}} xmm0 = xmm2[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
1192 ; SSE42-NEXT:    pshufb %xmm1, %xmm0
1193 ; SSE42-NEXT:    paddb 16(%rdx), %xmm0
1194 ; SSE42-NEXT:    paddb (%rdx), %xmm3
1195 ; SSE42-NEXT:    movdqa %xmm3, (%rcx)
1196 ; SSE42-NEXT:    movdqa %xmm0, 16(%rcx)
1197 ; SSE42-NEXT:    retq
1199 ; AVX-LABEL: vec256_i8_widen_to_i32_factor4_broadcast_to_v8i32_factor8:
1200 ; AVX:       # %bb.0:
1201 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
1202 ; AVX-NEXT:    vmovdqa 32(%rdi), %xmm1
1203 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm2
1204 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm2, %xmm2
1205 ; AVX-NEXT:    vpaddb 32(%rsi), %xmm1, %xmm1
1206 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
1207 ; AVX-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
1208 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,0,1,2,15,4,5,6,15,8,9,10,15,12,13,14]
1209 ; AVX-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1210 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm2[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
1211 ; AVX-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
1212 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
1213 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
1214 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
1215 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
1216 ; AVX-NEXT:    retq
1218 ; AVX2-LABEL: vec256_i8_widen_to_i32_factor4_broadcast_to_v8i32_factor8:
1219 ; AVX2:       # %bb.0:
1220 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm0
1221 ; AVX2-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1222 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm1
1223 ; AVX2-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1224 ; AVX2-NEXT:    vpbroadcastd %xmm1, %ymm1
1225 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
1226 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1227 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1228 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
1229 ; AVX2-NEXT:    vzeroupper
1230 ; AVX2-NEXT:    retq
1232 ; AVX512F-LABEL: vec256_i8_widen_to_i32_factor4_broadcast_to_v8i32_factor8:
1233 ; AVX512F:       # %bb.0:
1234 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm0
1235 ; AVX512F-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1236 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm1
1237 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1238 ; AVX512F-NEXT:    vpbroadcastd %xmm1, %ymm1
1239 ; AVX512F-NEXT:    vpternlogd $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm1
1240 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm1, %ymm0
1241 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
1242 ; AVX512F-NEXT:    vzeroupper
1243 ; AVX512F-NEXT:    retq
1245 ; AVX512DQ-LABEL: vec256_i8_widen_to_i32_factor4_broadcast_to_v8i32_factor8:
1246 ; AVX512DQ:       # %bb.0:
1247 ; AVX512DQ-NEXT:    vmovdqa 32(%rdi), %ymm0
1248 ; AVX512DQ-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1249 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm1
1250 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1251 ; AVX512DQ-NEXT:    vpbroadcastd %xmm1, %ymm1
1252 ; AVX512DQ-NEXT:    vpternlogd $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm1
1253 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm1, %ymm0
1254 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
1255 ; AVX512DQ-NEXT:    vzeroupper
1256 ; AVX512DQ-NEXT:    retq
1258 ; AVX512BW-LABEL: vec256_i8_widen_to_i32_factor4_broadcast_to_v8i32_factor8:
1259 ; AVX512BW:       # %bb.0:
1260 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
1261 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
1262 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1263 ; AVX512BW-NEXT:    vpbroadcastd %xmm0, %ymm0
1264 ; AVX512BW-NEXT:    movl $286331153, %eax # imm = 0x11111111
1265 ; AVX512BW-NEXT:    kmovd %eax, %k1
1266 ; AVX512BW-NEXT:    vmovdqu8 %ymm0, %ymm1 {%k1}
1267 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm1, %zmm0
1268 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
1269 ; AVX512BW-NEXT:    vzeroupper
1270 ; AVX512BW-NEXT:    retq
1271   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
1272   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
1273   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
1274   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <32 x i32> <i32 0, i32 33, i32 34, i32 35, i32 0, i32 37, i32 38, i32 39, i32 0, i32 41, i32 42, i32 43, i32 0, i32 45, i32 46, i32 47, i32 0, i32 49, i32 50, i32 51, i32 0, i32 53, i32 54, i32 55, i32 0, i32 57, i32 58, i32 59, i32 0, i32 61, i32 62, i32 63>
1275   %out.bytevec.padded = shufflevector <32 x i8> %broadcast.of.aextinreg, <32 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1276   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
1277   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
1278   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
1279   ret void
1282 define void @vec256_i8_widen_to_i64_factor8_broadcast_to_v4i64_factor4(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
1283 ; SSE2-LABEL: vec256_i8_widen_to_i64_factor8_broadcast_to_v4i64_factor4:
1284 ; SSE2:       # %bb.0:
1285 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
1286 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm1
1287 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm2
1288 ; SSE2-NEXT:    paddb 48(%rsi), %xmm2
1289 ; SSE2-NEXT:    paddb (%rsi), %xmm0
1290 ; SSE2-NEXT:    paddb 32(%rsi), %xmm1
1291 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
1292 ; SSE2-NEXT:    pand %xmm3, %xmm1
1293 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1294 ; SSE2-NEXT:    pand %xmm3, %xmm2
1295 ; SSE2-NEXT:    pandn %xmm0, %xmm3
1296 ; SSE2-NEXT:    por %xmm3, %xmm1
1297 ; SSE2-NEXT:    por %xmm2, %xmm3
1298 ; SSE2-NEXT:    paddb 16(%rdx), %xmm3
1299 ; SSE2-NEXT:    paddb (%rdx), %xmm1
1300 ; SSE2-NEXT:    movdqa %xmm1, (%rcx)
1301 ; SSE2-NEXT:    movdqa %xmm3, 16(%rcx)
1302 ; SSE2-NEXT:    retq
1304 ; SSE42-LABEL: vec256_i8_widen_to_i64_factor8_broadcast_to_v4i64_factor4:
1305 ; SSE42:       # %bb.0:
1306 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
1307 ; SSE42-NEXT:    movdqa 32(%rdi), %xmm1
1308 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm2
1309 ; SSE42-NEXT:    paddb 48(%rsi), %xmm2
1310 ; SSE42-NEXT:    paddb 32(%rsi), %xmm1
1311 ; SSE42-NEXT:    paddb (%rsi), %xmm0
1312 ; SSE42-NEXT:    movdqa %xmm0, %xmm3
1313 ; SSE42-NEXT:    palignr {{.*#+}} xmm3 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm3[0]
1314 ; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [15,0,1,2,3,4,5,6,15,8,9,10,11,12,13,14]
1315 ; SSE42-NEXT:    pshufb %xmm1, %xmm3
1316 ; SSE42-NEXT:    palignr {{.*#+}} xmm0 = xmm2[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
1317 ; SSE42-NEXT:    pshufb %xmm1, %xmm0
1318 ; SSE42-NEXT:    paddb 16(%rdx), %xmm0
1319 ; SSE42-NEXT:    paddb (%rdx), %xmm3
1320 ; SSE42-NEXT:    movdqa %xmm3, (%rcx)
1321 ; SSE42-NEXT:    movdqa %xmm0, 16(%rcx)
1322 ; SSE42-NEXT:    retq
1324 ; AVX-LABEL: vec256_i8_widen_to_i64_factor8_broadcast_to_v4i64_factor4:
1325 ; AVX:       # %bb.0:
1326 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
1327 ; AVX-NEXT:    vmovdqa 32(%rdi), %xmm1
1328 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm2
1329 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm2, %xmm2
1330 ; AVX-NEXT:    vpaddb 32(%rsi), %xmm1, %xmm1
1331 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
1332 ; AVX-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
1333 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,0,1,2,3,4,5,6,15,8,9,10,11,12,13,14]
1334 ; AVX-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1335 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm2[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
1336 ; AVX-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
1337 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
1338 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
1339 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
1340 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
1341 ; AVX-NEXT:    retq
1343 ; AVX2-LABEL: vec256_i8_widen_to_i64_factor8_broadcast_to_v4i64_factor4:
1344 ; AVX2:       # %bb.0:
1345 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm0
1346 ; AVX2-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1347 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm1
1348 ; AVX2-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1349 ; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm1
1350 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
1351 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1352 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1353 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
1354 ; AVX2-NEXT:    vzeroupper
1355 ; AVX2-NEXT:    retq
1357 ; AVX512F-LABEL: vec256_i8_widen_to_i64_factor8_broadcast_to_v4i64_factor4:
1358 ; AVX512F:       # %bb.0:
1359 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm0
1360 ; AVX512F-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1361 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm1
1362 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1363 ; AVX512F-NEXT:    vpbroadcastq %xmm1, %ymm1
1364 ; AVX512F-NEXT:    vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm1
1365 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm1, %ymm0
1366 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
1367 ; AVX512F-NEXT:    vzeroupper
1368 ; AVX512F-NEXT:    retq
1370 ; AVX512DQ-LABEL: vec256_i8_widen_to_i64_factor8_broadcast_to_v4i64_factor4:
1371 ; AVX512DQ:       # %bb.0:
1372 ; AVX512DQ-NEXT:    vmovdqa 32(%rdi), %ymm0
1373 ; AVX512DQ-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1374 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm1
1375 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1376 ; AVX512DQ-NEXT:    vpbroadcastq %xmm1, %ymm1
1377 ; AVX512DQ-NEXT:    vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm1
1378 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm1, %ymm0
1379 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
1380 ; AVX512DQ-NEXT:    vzeroupper
1381 ; AVX512DQ-NEXT:    retq
1383 ; AVX512BW-LABEL: vec256_i8_widen_to_i64_factor8_broadcast_to_v4i64_factor4:
1384 ; AVX512BW:       # %bb.0:
1385 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
1386 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
1387 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1388 ; AVX512BW-NEXT:    vpbroadcastq %xmm0, %ymm0
1389 ; AVX512BW-NEXT:    movl $16843009, %eax # imm = 0x1010101
1390 ; AVX512BW-NEXT:    kmovd %eax, %k1
1391 ; AVX512BW-NEXT:    vmovdqu8 %ymm0, %ymm1 {%k1}
1392 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm1, %zmm0
1393 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
1394 ; AVX512BW-NEXT:    vzeroupper
1395 ; AVX512BW-NEXT:    retq
1396   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
1397   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
1398   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
1399   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <32 x i32> <i32 0, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 0, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 0, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 0, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63>
1400   %out.bytevec.padded = shufflevector <32 x i8> %broadcast.of.aextinreg, <32 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1401   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
1402   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
1403   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
1404   ret void
1407 define void @vec256_i8_widen_to_i128_factor16_broadcast_to_v2i128_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
1408 ; SSE2-LABEL: vec256_i8_widen_to_i128_factor16_broadcast_to_v2i128_factor2:
1409 ; SSE2:       # %bb.0:
1410 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
1411 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm1
1412 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm2
1413 ; SSE2-NEXT:    paddb 48(%rsi), %xmm2
1414 ; SSE2-NEXT:    paddb 32(%rsi), %xmm1
1415 ; SSE2-NEXT:    paddb (%rsi), %xmm0
1416 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1417 ; SSE2-NEXT:    pand %xmm3, %xmm1
1418 ; SSE2-NEXT:    pand %xmm3, %xmm2
1419 ; SSE2-NEXT:    pandn %xmm0, %xmm3
1420 ; SSE2-NEXT:    por %xmm3, %xmm1
1421 ; SSE2-NEXT:    por %xmm3, %xmm2
1422 ; SSE2-NEXT:    paddb 16(%rdx), %xmm2
1423 ; SSE2-NEXT:    paddb (%rdx), %xmm1
1424 ; SSE2-NEXT:    movdqa %xmm1, (%rcx)
1425 ; SSE2-NEXT:    movdqa %xmm2, 16(%rcx)
1426 ; SSE2-NEXT:    retq
1428 ; SSE42-LABEL: vec256_i8_widen_to_i128_factor16_broadcast_to_v2i128_factor2:
1429 ; SSE42:       # %bb.0:
1430 ; SSE42-NEXT:    movdqa (%rdi), %xmm1
1431 ; SSE42-NEXT:    movdqa 32(%rdi), %xmm2
1432 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm3
1433 ; SSE42-NEXT:    paddb 48(%rsi), %xmm3
1434 ; SSE42-NEXT:    paddb 32(%rsi), %xmm2
1435 ; SSE42-NEXT:    paddb (%rsi), %xmm1
1436 ; SSE42-NEXT:    movaps {{.*#+}} xmm0 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1437 ; SSE42-NEXT:    movdqa %xmm1, %xmm4
1438 ; SSE42-NEXT:    pblendvb %xmm0, %xmm2, %xmm4
1439 ; SSE42-NEXT:    pblendvb %xmm0, %xmm3, %xmm1
1440 ; SSE42-NEXT:    paddb 16(%rdx), %xmm1
1441 ; SSE42-NEXT:    paddb (%rdx), %xmm4
1442 ; SSE42-NEXT:    movdqa %xmm4, (%rcx)
1443 ; SSE42-NEXT:    movdqa %xmm1, 16(%rcx)
1444 ; SSE42-NEXT:    retq
1446 ; AVX-LABEL: vec256_i8_widen_to_i128_factor16_broadcast_to_v2i128_factor2:
1447 ; AVX:       # %bb.0:
1448 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
1449 ; AVX-NEXT:    vmovdqa 32(%rdi), %xmm1
1450 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm2
1451 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm2, %xmm2
1452 ; AVX-NEXT:    vpaddb 32(%rsi), %xmm1, %xmm1
1453 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
1454 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1455 ; AVX-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm1
1456 ; AVX-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
1457 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
1458 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
1459 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
1460 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
1461 ; AVX-NEXT:    retq
1463 ; AVX2-LABEL: vec256_i8_widen_to_i128_factor16_broadcast_to_v2i128_factor2:
1464 ; AVX2:       # %bb.0:
1465 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
1466 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
1467 ; AVX2-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
1468 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
1469 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,0,1]
1470 ; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1471 ; AVX2-NEXT:    # ymm2 = mem[0,1,0,1]
1472 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1473 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1474 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
1475 ; AVX2-NEXT:    vzeroupper
1476 ; AVX2-NEXT:    retq
1478 ; AVX512F-LABEL: vec256_i8_widen_to_i128_factor16_broadcast_to_v2i128_factor2:
1479 ; AVX512F:       # %bb.0:
1480 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
1481 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm1
1482 ; AVX512F-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
1483 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
1484 ; AVX512F-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,0,1]
1485 ; AVX512F-NEXT:    vbroadcasti128 {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1486 ; AVX512F-NEXT:    # ymm2 = mem[0,1,0,1]
1487 ; AVX512F-NEXT:    vpternlogq $202, %ymm0, %ymm1, %ymm2
1488 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm2, %ymm0
1489 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
1490 ; AVX512F-NEXT:    vzeroupper
1491 ; AVX512F-NEXT:    retq
1493 ; AVX512DQ-LABEL: vec256_i8_widen_to_i128_factor16_broadcast_to_v2i128_factor2:
1494 ; AVX512DQ:       # %bb.0:
1495 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
1496 ; AVX512DQ-NEXT:    vmovdqa 32(%rdi), %ymm1
1497 ; AVX512DQ-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
1498 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
1499 ; AVX512DQ-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,0,1]
1500 ; AVX512DQ-NEXT:    vbroadcasti128 {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1501 ; AVX512DQ-NEXT:    # ymm2 = mem[0,1,0,1]
1502 ; AVX512DQ-NEXT:    vpternlogq $202, %ymm0, %ymm1, %ymm2
1503 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm2, %ymm0
1504 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
1505 ; AVX512DQ-NEXT:    vzeroupper
1506 ; AVX512DQ-NEXT:    retq
1508 ; AVX512BW-LABEL: vec256_i8_widen_to_i128_factor16_broadcast_to_v2i128_factor2:
1509 ; AVX512BW:       # %bb.0:
1510 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
1511 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
1512 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1513 ; AVX512BW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,0,1]
1514 ; AVX512BW-NEXT:    movl $65537, %eax # imm = 0x10001
1515 ; AVX512BW-NEXT:    kmovd %eax, %k1
1516 ; AVX512BW-NEXT:    vmovdqu8 %ymm0, %ymm1 {%k1}
1517 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm1, %zmm0
1518 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
1519 ; AVX512BW-NEXT:    vzeroupper
1520 ; AVX512BW-NEXT:    retq
1521   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
1522   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
1523   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
1524   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <32 x i32> <i32 0, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 0, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63>
1525   %out.bytevec.padded = shufflevector <32 x i8> %broadcast.of.aextinreg, <32 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1526   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
1527   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
1528   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
1529   ret void
1532 define void @vec256_i16_widen_to_i32_factor2_broadcast_to_v8i32_factor8(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
1533 ; SSE2-LABEL: vec256_i16_widen_to_i32_factor2_broadcast_to_v8i32_factor8:
1534 ; SSE2:       # %bb.0:
1535 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
1536 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm1
1537 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm2
1538 ; SSE2-NEXT:    paddb 48(%rsi), %xmm2
1539 ; SSE2-NEXT:    paddb 32(%rsi), %xmm1
1540 ; SSE2-NEXT:    paddb (%rsi), %xmm0
1541 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
1542 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,1,2,3,4,5,6,7]
1543 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,5,6,7]
1544 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1545 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[1,0,3,2,4,5,6,7]
1546 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1547 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]
1548 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm2[3,1,2,3,4,5,6,7]
1549 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,5,6,7]
1550 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1551 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[1,0,3,2,4,5,6,7]
1552 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1553 ; SSE2-NEXT:    paddb 16(%rdx), %xmm0
1554 ; SSE2-NEXT:    paddb (%rdx), %xmm3
1555 ; SSE2-NEXT:    movdqa %xmm3, (%rcx)
1556 ; SSE2-NEXT:    movdqa %xmm0, 16(%rcx)
1557 ; SSE2-NEXT:    retq
1559 ; SSE42-LABEL: vec256_i16_widen_to_i32_factor2_broadcast_to_v8i32_factor8:
1560 ; SSE42:       # %bb.0:
1561 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
1562 ; SSE42-NEXT:    movdqa 32(%rdi), %xmm1
1563 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm2
1564 ; SSE42-NEXT:    paddb 48(%rsi), %xmm2
1565 ; SSE42-NEXT:    paddb (%rsi), %xmm0
1566 ; SSE42-NEXT:    paddb 32(%rsi), %xmm1
1567 ; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
1568 ; SSE42-NEXT:    pshufb %xmm3, %xmm1
1569 ; SSE42-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
1570 ; SSE42-NEXT:    movdqa %xmm0, %xmm4
1571 ; SSE42-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]
1572 ; SSE42-NEXT:    pshufb %xmm3, %xmm2
1573 ; SSE42-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1574 ; SSE42-NEXT:    paddb 16(%rdx), %xmm0
1575 ; SSE42-NEXT:    paddb (%rdx), %xmm4
1576 ; SSE42-NEXT:    movdqa %xmm4, (%rcx)
1577 ; SSE42-NEXT:    movdqa %xmm0, 16(%rcx)
1578 ; SSE42-NEXT:    retq
1580 ; AVX-LABEL: vec256_i16_widen_to_i32_factor2_broadcast_to_v8i32_factor8:
1581 ; AVX:       # %bb.0:
1582 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
1583 ; AVX-NEXT:    vmovdqa 32(%rdi), %xmm1
1584 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm2
1585 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm2, %xmm2
1586 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
1587 ; AVX-NEXT:    vpaddb 32(%rsi), %xmm1, %xmm1
1588 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
1589 ; AVX-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1590 ; AVX-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
1591 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1592 ; AVX-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
1593 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1594 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
1595 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
1596 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
1597 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
1598 ; AVX-NEXT:    retq
1600 ; AVX2-LABEL: vec256_i16_widen_to_i32_factor2_broadcast_to_v8i32_factor8:
1601 ; AVX2:       # %bb.0:
1602 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm0
1603 ; AVX2-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1604 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm1
1605 ; AVX2-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1606 ; AVX2-NEXT:    vpbroadcastw %xmm1, %ymm1
1607 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7],ymm1[8],ymm0[9],ymm1[10],ymm0[11],ymm1[12],ymm0[13],ymm1[14],ymm0[15]
1608 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1609 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
1610 ; AVX2-NEXT:    vzeroupper
1611 ; AVX2-NEXT:    retq
1613 ; AVX512F-LABEL: vec256_i16_widen_to_i32_factor2_broadcast_to_v8i32_factor8:
1614 ; AVX512F:       # %bb.0:
1615 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm0
1616 ; AVX512F-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1617 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm1
1618 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1619 ; AVX512F-NEXT:    vpbroadcastw %xmm1, %ymm1
1620 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7],ymm1[8],ymm0[9],ymm1[10],ymm0[11],ymm1[12],ymm0[13],ymm1[14],ymm0[15]
1621 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1622 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
1623 ; AVX512F-NEXT:    vzeroupper
1624 ; AVX512F-NEXT:    retq
1626 ; AVX512DQ-LABEL: vec256_i16_widen_to_i32_factor2_broadcast_to_v8i32_factor8:
1627 ; AVX512DQ:       # %bb.0:
1628 ; AVX512DQ-NEXT:    vmovdqa 32(%rdi), %ymm0
1629 ; AVX512DQ-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1630 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm1
1631 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1632 ; AVX512DQ-NEXT:    vpbroadcastw %xmm1, %ymm1
1633 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7],ymm1[8],ymm0[9],ymm1[10],ymm0[11],ymm1[12],ymm0[13],ymm1[14],ymm0[15]
1634 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1635 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
1636 ; AVX512DQ-NEXT:    vzeroupper
1637 ; AVX512DQ-NEXT:    retq
1639 ; AVX512BW-LABEL: vec256_i16_widen_to_i32_factor2_broadcast_to_v8i32_factor8:
1640 ; AVX512BW:       # %bb.0:
1641 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
1642 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
1643 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1644 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,17,0,19,0,21,0,23,0,25,0,27,0,29,0,31]
1645 ; AVX512BW-NEXT:    vpermi2w %ymm1, %ymm0, %ymm2
1646 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm2, %zmm0
1647 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
1648 ; AVX512BW-NEXT:    vzeroupper
1649 ; AVX512BW-NEXT:    retq
1650   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
1651   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
1652   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
1653   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
1654   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <16 x i32> <i32 0, i32 17, i32 0, i32 19, i32 0, i32 21, i32 0, i32 23, i32 0, i32 25, i32 0, i32 27, i32 0, i32 29, i32 0, i32 31>
1655   %out.bytevec = bitcast <16 x i16> %broadcast.of.aextinreg to <32 x i8>
1656   %out.bytevec.padded = shufflevector <32 x i8> %out.bytevec, <32 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1657   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
1658   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
1659   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
1660   ret void
1663 define void @vec256_i16_widen_to_i64_factor4_broadcast_to_v4i64_factor4(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
1664 ; SSE2-LABEL: vec256_i16_widen_to_i64_factor4_broadcast_to_v4i64_factor4:
1665 ; SSE2:       # %bb.0:
1666 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
1667 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm1
1668 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm2
1669 ; SSE2-NEXT:    paddb 48(%rsi), %xmm2
1670 ; SSE2-NEXT:    paddb (%rsi), %xmm0
1671 ; SSE2-NEXT:    paddb 32(%rsi), %xmm1
1672 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [0,65535,65535,65535,0,65535,65535,65535]
1673 ; SSE2-NEXT:    pand %xmm3, %xmm1
1674 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1675 ; SSE2-NEXT:    pand %xmm3, %xmm2
1676 ; SSE2-NEXT:    pandn %xmm0, %xmm3
1677 ; SSE2-NEXT:    por %xmm3, %xmm1
1678 ; SSE2-NEXT:    por %xmm2, %xmm3
1679 ; SSE2-NEXT:    paddb 16(%rdx), %xmm3
1680 ; SSE2-NEXT:    paddb (%rdx), %xmm1
1681 ; SSE2-NEXT:    movdqa %xmm1, (%rcx)
1682 ; SSE2-NEXT:    movdqa %xmm3, 16(%rcx)
1683 ; SSE2-NEXT:    retq
1685 ; SSE42-LABEL: vec256_i16_widen_to_i64_factor4_broadcast_to_v4i64_factor4:
1686 ; SSE42:       # %bb.0:
1687 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
1688 ; SSE42-NEXT:    movdqa 32(%rdi), %xmm1
1689 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm2
1690 ; SSE42-NEXT:    paddb 48(%rsi), %xmm2
1691 ; SSE42-NEXT:    paddb 32(%rsi), %xmm1
1692 ; SSE42-NEXT:    paddb (%rsi), %xmm0
1693 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1694 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
1695 ; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3],xmm0[4],xmm2[5,6,7]
1696 ; SSE42-NEXT:    paddb 16(%rdx), %xmm2
1697 ; SSE42-NEXT:    paddb (%rdx), %xmm1
1698 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
1699 ; SSE42-NEXT:    movdqa %xmm2, 16(%rcx)
1700 ; SSE42-NEXT:    retq
1702 ; AVX-LABEL: vec256_i16_widen_to_i64_factor4_broadcast_to_v4i64_factor4:
1703 ; AVX:       # %bb.0:
1704 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
1705 ; AVX-NEXT:    vmovdqa 32(%rdi), %xmm1
1706 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm2
1707 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm2, %xmm2
1708 ; AVX-NEXT:    vpaddb 32(%rsi), %xmm1, %xmm1
1709 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
1710 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1711 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
1712 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3],xmm0[4],xmm2[5,6,7]
1713 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
1714 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
1715 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
1716 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
1717 ; AVX-NEXT:    retq
1719 ; AVX2-LABEL: vec256_i16_widen_to_i64_factor4_broadcast_to_v4i64_factor4:
1720 ; AVX2:       # %bb.0:
1721 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm0
1722 ; AVX2-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1723 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm1
1724 ; AVX2-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1725 ; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm1
1726 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3],ymm1[4],ymm0[5,6,7],ymm1[8],ymm0[9,10,11],ymm1[12],ymm0[13,14,15]
1727 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1728 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
1729 ; AVX2-NEXT:    vzeroupper
1730 ; AVX2-NEXT:    retq
1732 ; AVX512F-LABEL: vec256_i16_widen_to_i64_factor4_broadcast_to_v4i64_factor4:
1733 ; AVX512F:       # %bb.0:
1734 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm0
1735 ; AVX512F-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1736 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm1
1737 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1738 ; AVX512F-NEXT:    vpbroadcastq %xmm1, %ymm1
1739 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3],ymm1[4],ymm0[5,6,7],ymm1[8],ymm0[9,10,11],ymm1[12],ymm0[13,14,15]
1740 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1741 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
1742 ; AVX512F-NEXT:    vzeroupper
1743 ; AVX512F-NEXT:    retq
1745 ; AVX512DQ-LABEL: vec256_i16_widen_to_i64_factor4_broadcast_to_v4i64_factor4:
1746 ; AVX512DQ:       # %bb.0:
1747 ; AVX512DQ-NEXT:    vmovdqa 32(%rdi), %ymm0
1748 ; AVX512DQ-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1749 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm1
1750 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1751 ; AVX512DQ-NEXT:    vpbroadcastq %xmm1, %ymm1
1752 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3],ymm1[4],ymm0[5,6,7],ymm1[8],ymm0[9,10,11],ymm1[12],ymm0[13,14,15]
1753 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1754 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
1755 ; AVX512DQ-NEXT:    vzeroupper
1756 ; AVX512DQ-NEXT:    retq
1758 ; AVX512BW-LABEL: vec256_i16_widen_to_i64_factor4_broadcast_to_v4i64_factor4:
1759 ; AVX512BW:       # %bb.0:
1760 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
1761 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
1762 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1763 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [16,1,2,3,16,5,6,7,16,9,10,11,16,13,14,15]
1764 ; AVX512BW-NEXT:    vpermi2w %ymm0, %ymm1, %ymm2
1765 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm2, %zmm0
1766 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
1767 ; AVX512BW-NEXT:    vzeroupper
1768 ; AVX512BW-NEXT:    retq
1769   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
1770   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
1771   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
1772   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
1773   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <16 x i32> <i32 0, i32 17, i32 18, i32 19, i32 0, i32 21, i32 22, i32 23, i32 0, i32 25, i32 26, i32 27, i32 0, i32 29, i32 30, i32 31>
1774   %out.bytevec = bitcast <16 x i16> %broadcast.of.aextinreg to <32 x i8>
1775   %out.bytevec.padded = shufflevector <32 x i8> %out.bytevec, <32 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1776   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
1777   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
1778   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
1779   ret void
1782 define void @vec256_i16_widen_to_i128_factor8_broadcast_to_v2i128_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
1783 ; SSE2-LABEL: vec256_i16_widen_to_i128_factor8_broadcast_to_v2i128_factor2:
1784 ; SSE2:       # %bb.0:
1785 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
1786 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm1
1787 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm2
1788 ; SSE2-NEXT:    paddb 48(%rsi), %xmm2
1789 ; SSE2-NEXT:    paddb 32(%rsi), %xmm1
1790 ; SSE2-NEXT:    paddb (%rsi), %xmm0
1791 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [0,65535,65535,65535,65535,65535,65535,65535]
1792 ; SSE2-NEXT:    pand %xmm3, %xmm1
1793 ; SSE2-NEXT:    pand %xmm3, %xmm2
1794 ; SSE2-NEXT:    pandn %xmm0, %xmm3
1795 ; SSE2-NEXT:    por %xmm3, %xmm1
1796 ; SSE2-NEXT:    por %xmm3, %xmm2
1797 ; SSE2-NEXT:    paddb 16(%rdx), %xmm2
1798 ; SSE2-NEXT:    paddb (%rdx), %xmm1
1799 ; SSE2-NEXT:    movdqa %xmm1, (%rcx)
1800 ; SSE2-NEXT:    movdqa %xmm2, 16(%rcx)
1801 ; SSE2-NEXT:    retq
1803 ; SSE42-LABEL: vec256_i16_widen_to_i128_factor8_broadcast_to_v2i128_factor2:
1804 ; SSE42:       # %bb.0:
1805 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
1806 ; SSE42-NEXT:    movdqa 32(%rdi), %xmm1
1807 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm2
1808 ; SSE42-NEXT:    paddb 48(%rsi), %xmm2
1809 ; SSE42-NEXT:    paddb (%rsi), %xmm0
1810 ; SSE42-NEXT:    paddb 32(%rsi), %xmm1
1811 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]
1812 ; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3,4,5,6,7]
1813 ; SSE42-NEXT:    paddb 16(%rdx), %xmm0
1814 ; SSE42-NEXT:    paddb (%rdx), %xmm1
1815 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
1816 ; SSE42-NEXT:    movdqa %xmm0, 16(%rcx)
1817 ; SSE42-NEXT:    retq
1819 ; AVX-LABEL: vec256_i16_widen_to_i128_factor8_broadcast_to_v2i128_factor2:
1820 ; AVX:       # %bb.0:
1821 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
1822 ; AVX-NEXT:    vmovdqa 32(%rdi), %xmm1
1823 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm2
1824 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm2, %xmm2
1825 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
1826 ; AVX-NEXT:    vpaddb 32(%rsi), %xmm1, %xmm1
1827 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]
1828 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3,4,5,6,7]
1829 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
1830 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
1831 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
1832 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
1833 ; AVX-NEXT:    retq
1835 ; AVX2-LABEL: vec256_i16_widen_to_i128_factor8_broadcast_to_v2i128_factor2:
1836 ; AVX2:       # %bb.0:
1837 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
1838 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
1839 ; AVX2-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
1840 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
1841 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,0,1]
1842 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1843 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1844 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
1845 ; AVX2-NEXT:    vzeroupper
1846 ; AVX2-NEXT:    retq
1848 ; AVX512F-LABEL: vec256_i16_widen_to_i128_factor8_broadcast_to_v2i128_factor2:
1849 ; AVX512F:       # %bb.0:
1850 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
1851 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm1
1852 ; AVX512F-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
1853 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
1854 ; AVX512F-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,0,1]
1855 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1856 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1857 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
1858 ; AVX512F-NEXT:    vzeroupper
1859 ; AVX512F-NEXT:    retq
1861 ; AVX512DQ-LABEL: vec256_i16_widen_to_i128_factor8_broadcast_to_v2i128_factor2:
1862 ; AVX512DQ:       # %bb.0:
1863 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
1864 ; AVX512DQ-NEXT:    vmovdqa 32(%rdi), %ymm1
1865 ; AVX512DQ-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
1866 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
1867 ; AVX512DQ-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,0,1]
1868 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1869 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1870 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
1871 ; AVX512DQ-NEXT:    vzeroupper
1872 ; AVX512DQ-NEXT:    retq
1874 ; AVX512BW-LABEL: vec256_i16_widen_to_i128_factor8_broadcast_to_v2i128_factor2:
1875 ; AVX512BW:       # %bb.0:
1876 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
1877 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
1878 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1879 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [16,1,2,3,4,5,6,7,16,9,10,11,12,13,14,15]
1880 ; AVX512BW-NEXT:    vpermi2w %ymm0, %ymm1, %ymm2
1881 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm2, %zmm0
1882 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
1883 ; AVX512BW-NEXT:    vzeroupper
1884 ; AVX512BW-NEXT:    retq
1885   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
1886   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
1887   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
1888   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
1889   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <16 x i32> <i32 0, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 0, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
1890   %out.bytevec = bitcast <16 x i16> %broadcast.of.aextinreg to <32 x i8>
1891   %out.bytevec.padded = shufflevector <32 x i8> %out.bytevec, <32 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1892   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
1893   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
1894   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
1895   ret void
1898 define void @vec256_i32_widen_to_i64_factor2_broadcast_to_v4i64_factor4(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
1899 ; SSE2-LABEL: vec256_i32_widen_to_i64_factor2_broadcast_to_v4i64_factor4:
1900 ; SSE2:       # %bb.0:
1901 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
1902 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm1
1903 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm2
1904 ; SSE2-NEXT:    paddb 48(%rsi), %xmm2
1905 ; SSE2-NEXT:    paddb (%rsi), %xmm0
1906 ; SSE2-NEXT:    paddb 32(%rsi), %xmm1
1907 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1908 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1909 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1910 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
1911 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
1912 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1913 ; SSE2-NEXT:    paddb 16(%rdx), %xmm0
1914 ; SSE2-NEXT:    paddb (%rdx), %xmm3
1915 ; SSE2-NEXT:    movdqa %xmm3, (%rcx)
1916 ; SSE2-NEXT:    movdqa %xmm0, 16(%rcx)
1917 ; SSE2-NEXT:    retq
1919 ; SSE42-LABEL: vec256_i32_widen_to_i64_factor2_broadcast_to_v4i64_factor4:
1920 ; SSE42:       # %bb.0:
1921 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
1922 ; SSE42-NEXT:    movdqa 32(%rdi), %xmm1
1923 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm2
1924 ; SSE42-NEXT:    paddb 48(%rsi), %xmm2
1925 ; SSE42-NEXT:    paddb 32(%rsi), %xmm1
1926 ; SSE42-NEXT:    paddb (%rsi), %xmm0
1927 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1928 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
1929 ; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1930 ; SSE42-NEXT:    paddb 16(%rdx), %xmm2
1931 ; SSE42-NEXT:    paddb (%rdx), %xmm1
1932 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
1933 ; SSE42-NEXT:    movdqa %xmm2, 16(%rcx)
1934 ; SSE42-NEXT:    retq
1936 ; AVX-LABEL: vec256_i32_widen_to_i64_factor2_broadcast_to_v4i64_factor4:
1937 ; AVX:       # %bb.0:
1938 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
1939 ; AVX-NEXT:    vmovdqa 32(%rdi), %xmm1
1940 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm2
1941 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm2, %xmm2
1942 ; AVX-NEXT:    vpaddb 32(%rsi), %xmm1, %xmm1
1943 ; AVX-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1944 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
1945 ; AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1946 ; AVX-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,0],ymm1[1,3],ymm0[4,4],ymm1[5,7]
1947 ; AVX-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]
1948 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
1949 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm1, %xmm1
1950 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
1951 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
1952 ; AVX-NEXT:    vmovdqa %xmm1, 16(%rcx)
1953 ; AVX-NEXT:    vzeroupper
1954 ; AVX-NEXT:    retq
1956 ; AVX2-LABEL: vec256_i32_widen_to_i64_factor2_broadcast_to_v4i64_factor4:
1957 ; AVX2:       # %bb.0:
1958 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm0
1959 ; AVX2-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1960 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm1
1961 ; AVX2-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1962 ; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm1
1963 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7]
1964 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1965 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
1966 ; AVX2-NEXT:    vzeroupper
1967 ; AVX2-NEXT:    retq
1969 ; AVX512F-SLOW-LABEL: vec256_i32_widen_to_i64_factor2_broadcast_to_v4i64_factor4:
1970 ; AVX512F-SLOW:       # %bb.0:
1971 ; AVX512F-SLOW-NEXT:    vmovdqa 32(%rdi), %ymm0
1972 ; AVX512F-SLOW-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1973 ; AVX512F-SLOW-NEXT:    vmovdqa (%rdi), %xmm1
1974 ; AVX512F-SLOW-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1975 ; AVX512F-SLOW-NEXT:    vpbroadcastq %xmm1, %ymm1
1976 ; AVX512F-SLOW-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7]
1977 ; AVX512F-SLOW-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
1978 ; AVX512F-SLOW-NEXT:    vmovdqa %ymm0, (%rcx)
1979 ; AVX512F-SLOW-NEXT:    vzeroupper
1980 ; AVX512F-SLOW-NEXT:    retq
1982 ; AVX512F-FAST-LABEL: vec256_i32_widen_to_i64_factor2_broadcast_to_v4i64_factor4:
1983 ; AVX512F-FAST:       # %bb.0:
1984 ; AVX512F-FAST-NEXT:    vmovdqa 32(%rdi), %ymm0
1985 ; AVX512F-FAST-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1986 ; AVX512F-FAST-NEXT:    vmovdqa (%rdi), %xmm1
1987 ; AVX512F-FAST-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
1988 ; AVX512F-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,9,0,11,0,13,0,15]
1989 ; AVX512F-FAST-NEXT:    vpermi2d %ymm0, %ymm1, %ymm2
1990 ; AVX512F-FAST-NEXT:    vpaddb (%rdx), %ymm2, %ymm0
1991 ; AVX512F-FAST-NEXT:    vmovdqa %ymm0, (%rcx)
1992 ; AVX512F-FAST-NEXT:    vzeroupper
1993 ; AVX512F-FAST-NEXT:    retq
1995 ; AVX512DQ-SLOW-LABEL: vec256_i32_widen_to_i64_factor2_broadcast_to_v4i64_factor4:
1996 ; AVX512DQ-SLOW:       # %bb.0:
1997 ; AVX512DQ-SLOW-NEXT:    vmovdqa 32(%rdi), %ymm0
1998 ; AVX512DQ-SLOW-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
1999 ; AVX512DQ-SLOW-NEXT:    vmovdqa (%rdi), %xmm1
2000 ; AVX512DQ-SLOW-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
2001 ; AVX512DQ-SLOW-NEXT:    vpbroadcastq %xmm1, %ymm1
2002 ; AVX512DQ-SLOW-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7]
2003 ; AVX512DQ-SLOW-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
2004 ; AVX512DQ-SLOW-NEXT:    vmovdqa %ymm0, (%rcx)
2005 ; AVX512DQ-SLOW-NEXT:    vzeroupper
2006 ; AVX512DQ-SLOW-NEXT:    retq
2008 ; AVX512DQ-FAST-LABEL: vec256_i32_widen_to_i64_factor2_broadcast_to_v4i64_factor4:
2009 ; AVX512DQ-FAST:       # %bb.0:
2010 ; AVX512DQ-FAST-NEXT:    vmovdqa 32(%rdi), %ymm0
2011 ; AVX512DQ-FAST-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
2012 ; AVX512DQ-FAST-NEXT:    vmovdqa (%rdi), %xmm1
2013 ; AVX512DQ-FAST-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
2014 ; AVX512DQ-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,9,0,11,0,13,0,15]
2015 ; AVX512DQ-FAST-NEXT:    vpermi2d %ymm0, %ymm1, %ymm2
2016 ; AVX512DQ-FAST-NEXT:    vpaddb (%rdx), %ymm2, %ymm0
2017 ; AVX512DQ-FAST-NEXT:    vmovdqa %ymm0, (%rcx)
2018 ; AVX512DQ-FAST-NEXT:    vzeroupper
2019 ; AVX512DQ-FAST-NEXT:    retq
2021 ; AVX512BW-SLOW-LABEL: vec256_i32_widen_to_i64_factor2_broadcast_to_v4i64_factor4:
2022 ; AVX512BW-SLOW:       # %bb.0:
2023 ; AVX512BW-SLOW-NEXT:    vmovdqa64 (%rdi), %zmm0
2024 ; AVX512BW-SLOW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
2025 ; AVX512BW-SLOW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2026 ; AVX512BW-SLOW-NEXT:    vpbroadcastq %xmm0, %ymm0
2027 ; AVX512BW-SLOW-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
2028 ; AVX512BW-SLOW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
2029 ; AVX512BW-SLOW-NEXT:    vmovdqa64 %zmm0, (%rcx)
2030 ; AVX512BW-SLOW-NEXT:    vzeroupper
2031 ; AVX512BW-SLOW-NEXT:    retq
2033 ; AVX512BW-FAST-LABEL: vec256_i32_widen_to_i64_factor2_broadcast_to_v4i64_factor4:
2034 ; AVX512BW-FAST:       # %bb.0:
2035 ; AVX512BW-FAST-NEXT:    vmovdqa64 (%rdi), %zmm0
2036 ; AVX512BW-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,25,0,27,0,29,0,31]
2037 ; AVX512BW-FAST-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
2038 ; AVX512BW-FAST-NEXT:    vpermt2d %zmm0, %zmm1, %zmm0
2039 ; AVX512BW-FAST-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
2040 ; AVX512BW-FAST-NEXT:    vmovdqa64 %zmm0, (%rcx)
2041 ; AVX512BW-FAST-NEXT:    vzeroupper
2042 ; AVX512BW-FAST-NEXT:    retq
2043   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
2044   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
2045   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
2046   %in.vec.cast = bitcast <64 x i8> %in.vec to <16 x i32>
2047   %broadcast.of.aextinreg = shufflevector <16 x i32> %in.vec.cast, <16 x i32> poison, <8 x i32> <i32 0, i32 9, i32 0, i32 11, i32 0, i32 13, i32 0, i32 15>
2048   %out.bytevec = bitcast <8 x i32> %broadcast.of.aextinreg to <32 x i8>
2049   %out.bytevec.padded = shufflevector <32 x i8> %out.bytevec, <32 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
2050   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
2051   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
2052   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
2053   ret void
2056 define void @vec256_i32_widen_to_i128_factor4_broadcast_to_v2i128_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
2057 ; SSE2-LABEL: vec256_i32_widen_to_i128_factor4_broadcast_to_v2i128_factor2:
2058 ; SSE2:       # %bb.0:
2059 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
2060 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm1
2061 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm2
2062 ; SSE2-NEXT:    paddb 48(%rsi), %xmm2
2063 ; SSE2-NEXT:    paddb (%rsi), %xmm0
2064 ; SSE2-NEXT:    paddb 32(%rsi), %xmm1
2065 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
2066 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
2067 ; SSE2-NEXT:    paddb 16(%rdx), %xmm2
2068 ; SSE2-NEXT:    paddb (%rdx), %xmm1
2069 ; SSE2-NEXT:    movdqa %xmm1, (%rcx)
2070 ; SSE2-NEXT:    movdqa %xmm2, 16(%rcx)
2071 ; SSE2-NEXT:    retq
2073 ; SSE42-LABEL: vec256_i32_widen_to_i128_factor4_broadcast_to_v2i128_factor2:
2074 ; SSE42:       # %bb.0:
2075 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
2076 ; SSE42-NEXT:    movdqa 32(%rdi), %xmm1
2077 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm2
2078 ; SSE42-NEXT:    paddb 48(%rsi), %xmm2
2079 ; SSE42-NEXT:    paddb (%rsi), %xmm0
2080 ; SSE42-NEXT:    paddb 32(%rsi), %xmm1
2081 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
2082 ; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3,4,5,6,7]
2083 ; SSE42-NEXT:    paddb 16(%rdx), %xmm0
2084 ; SSE42-NEXT:    paddb (%rdx), %xmm1
2085 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
2086 ; SSE42-NEXT:    movdqa %xmm0, 16(%rcx)
2087 ; SSE42-NEXT:    retq
2089 ; AVX-LABEL: vec256_i32_widen_to_i128_factor4_broadcast_to_v2i128_factor2:
2090 ; AVX:       # %bb.0:
2091 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
2092 ; AVX-NEXT:    vmovdqa 32(%rdi), %xmm1
2093 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm2
2094 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm2, %xmm2
2095 ; AVX-NEXT:    vpaddb 32(%rsi), %xmm1, %xmm1
2096 ; AVX-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2097 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2098 ; AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
2099 ; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
2100 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
2101 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm1, %xmm1
2102 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
2103 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
2104 ; AVX-NEXT:    vmovdqa %xmm1, 16(%rcx)
2105 ; AVX-NEXT:    vzeroupper
2106 ; AVX-NEXT:    retq
2108 ; AVX2-LABEL: vec256_i32_widen_to_i128_factor4_broadcast_to_v2i128_factor2:
2109 ; AVX2:       # %bb.0:
2110 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
2111 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
2112 ; AVX2-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
2113 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
2114 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,0,1]
2115 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
2116 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
2117 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
2118 ; AVX2-NEXT:    vzeroupper
2119 ; AVX2-NEXT:    retq
2121 ; AVX512F-SLOW-LABEL: vec256_i32_widen_to_i128_factor4_broadcast_to_v2i128_factor2:
2122 ; AVX512F-SLOW:       # %bb.0:
2123 ; AVX512F-SLOW-NEXT:    vmovdqa (%rdi), %ymm0
2124 ; AVX512F-SLOW-NEXT:    vmovdqa 32(%rdi), %ymm1
2125 ; AVX512F-SLOW-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
2126 ; AVX512F-SLOW-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
2127 ; AVX512F-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,0,1]
2128 ; AVX512F-SLOW-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
2129 ; AVX512F-SLOW-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
2130 ; AVX512F-SLOW-NEXT:    vmovdqa %ymm0, (%rcx)
2131 ; AVX512F-SLOW-NEXT:    vzeroupper
2132 ; AVX512F-SLOW-NEXT:    retq
2134 ; AVX512F-FAST-LABEL: vec256_i32_widen_to_i128_factor4_broadcast_to_v2i128_factor2:
2135 ; AVX512F-FAST:       # %bb.0:
2136 ; AVX512F-FAST-NEXT:    vmovdqa (%rdi), %ymm0
2137 ; AVX512F-FAST-NEXT:    vmovdqa 32(%rdi), %ymm1
2138 ; AVX512F-FAST-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
2139 ; AVX512F-FAST-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
2140 ; AVX512F-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [8,1,2,3,8,5,6,7]
2141 ; AVX512F-FAST-NEXT:    vpermi2d %ymm0, %ymm1, %ymm2
2142 ; AVX512F-FAST-NEXT:    vpaddb (%rdx), %ymm2, %ymm0
2143 ; AVX512F-FAST-NEXT:    vmovdqa %ymm0, (%rcx)
2144 ; AVX512F-FAST-NEXT:    vzeroupper
2145 ; AVX512F-FAST-NEXT:    retq
2147 ; AVX512DQ-SLOW-LABEL: vec256_i32_widen_to_i128_factor4_broadcast_to_v2i128_factor2:
2148 ; AVX512DQ-SLOW:       # %bb.0:
2149 ; AVX512DQ-SLOW-NEXT:    vmovdqa (%rdi), %ymm0
2150 ; AVX512DQ-SLOW-NEXT:    vmovdqa 32(%rdi), %ymm1
2151 ; AVX512DQ-SLOW-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
2152 ; AVX512DQ-SLOW-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
2153 ; AVX512DQ-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,0,1]
2154 ; AVX512DQ-SLOW-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
2155 ; AVX512DQ-SLOW-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
2156 ; AVX512DQ-SLOW-NEXT:    vmovdqa %ymm0, (%rcx)
2157 ; AVX512DQ-SLOW-NEXT:    vzeroupper
2158 ; AVX512DQ-SLOW-NEXT:    retq
2160 ; AVX512DQ-FAST-LABEL: vec256_i32_widen_to_i128_factor4_broadcast_to_v2i128_factor2:
2161 ; AVX512DQ-FAST:       # %bb.0:
2162 ; AVX512DQ-FAST-NEXT:    vmovdqa (%rdi), %ymm0
2163 ; AVX512DQ-FAST-NEXT:    vmovdqa 32(%rdi), %ymm1
2164 ; AVX512DQ-FAST-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
2165 ; AVX512DQ-FAST-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
2166 ; AVX512DQ-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [8,1,2,3,8,5,6,7]
2167 ; AVX512DQ-FAST-NEXT:    vpermi2d %ymm0, %ymm1, %ymm2
2168 ; AVX512DQ-FAST-NEXT:    vpaddb (%rdx), %ymm2, %ymm0
2169 ; AVX512DQ-FAST-NEXT:    vmovdqa %ymm0, (%rcx)
2170 ; AVX512DQ-FAST-NEXT:    vzeroupper
2171 ; AVX512DQ-FAST-NEXT:    retq
2173 ; AVX512BW-SLOW-LABEL: vec256_i32_widen_to_i128_factor4_broadcast_to_v2i128_factor2:
2174 ; AVX512BW-SLOW:       # %bb.0:
2175 ; AVX512BW-SLOW-NEXT:    vmovdqa64 (%rdi), %zmm0
2176 ; AVX512BW-SLOW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
2177 ; AVX512BW-SLOW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2178 ; AVX512BW-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,0,1]
2179 ; AVX512BW-SLOW-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
2180 ; AVX512BW-SLOW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
2181 ; AVX512BW-SLOW-NEXT:    vmovdqa64 %zmm0, (%rcx)
2182 ; AVX512BW-SLOW-NEXT:    vzeroupper
2183 ; AVX512BW-SLOW-NEXT:    retq
2185 ; AVX512BW-FAST-LABEL: vec256_i32_widen_to_i128_factor4_broadcast_to_v2i128_factor2:
2186 ; AVX512BW-FAST:       # %bb.0:
2187 ; AVX512BW-FAST-NEXT:    vmovdqa64 (%rdi), %zmm0
2188 ; AVX512BW-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,9,10,11,0,13,14,15]
2189 ; AVX512BW-FAST-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
2190 ; AVX512BW-FAST-NEXT:    vpermd %zmm0, %zmm1, %zmm0
2191 ; AVX512BW-FAST-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
2192 ; AVX512BW-FAST-NEXT:    vmovdqa64 %zmm0, (%rcx)
2193 ; AVX512BW-FAST-NEXT:    vzeroupper
2194 ; AVX512BW-FAST-NEXT:    retq
2195   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
2196   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
2197   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
2198   %in.vec.cast = bitcast <64 x i8> %in.vec to <16 x i32>
2199   %broadcast.of.aextinreg = shufflevector <16 x i32> %in.vec.cast, <16 x i32> poison, <8 x i32> <i32 0, i32 9, i32 10, i32 11, i32 0, i32 13, i32 14, i32 15>
2200   %out.bytevec = bitcast <8 x i32> %broadcast.of.aextinreg to <32 x i8>
2201   %out.bytevec.padded = shufflevector <32 x i8> %out.bytevec, <32 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
2202   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
2203   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
2204   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
2205   ret void
2208 define void @vec256_i64_widen_to_i128_factor2_broadcast_to_v2i128_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
2209 ; SSE2-LABEL: vec256_i64_widen_to_i128_factor2_broadcast_to_v2i128_factor2:
2210 ; SSE2:       # %bb.0:
2211 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
2212 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm1
2213 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm2
2214 ; SSE2-NEXT:    paddb 48(%rsi), %xmm2
2215 ; SSE2-NEXT:    paddb (%rsi), %xmm0
2216 ; SSE2-NEXT:    paddb 32(%rsi), %xmm1
2217 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
2218 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm2[1]
2219 ; SSE2-NEXT:    paddb 16(%rdx), %xmm0
2220 ; SSE2-NEXT:    paddb (%rdx), %xmm1
2221 ; SSE2-NEXT:    movdqa %xmm1, (%rcx)
2222 ; SSE2-NEXT:    movdqa %xmm0, 16(%rcx)
2223 ; SSE2-NEXT:    retq
2225 ; SSE42-LABEL: vec256_i64_widen_to_i128_factor2_broadcast_to_v2i128_factor2:
2226 ; SSE42:       # %bb.0:
2227 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
2228 ; SSE42-NEXT:    movdqa 32(%rdi), %xmm1
2229 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm2
2230 ; SSE42-NEXT:    paddb 48(%rsi), %xmm2
2231 ; SSE42-NEXT:    paddb 32(%rsi), %xmm1
2232 ; SSE42-NEXT:    paddb (%rsi), %xmm0
2233 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1,2,3],xmm1[4,5,6,7]
2234 ; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
2235 ; SSE42-NEXT:    paddb 16(%rdx), %xmm0
2236 ; SSE42-NEXT:    paddb (%rdx), %xmm1
2237 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
2238 ; SSE42-NEXT:    movdqa %xmm0, 16(%rcx)
2239 ; SSE42-NEXT:    retq
2241 ; AVX-LABEL: vec256_i64_widen_to_i128_factor2_broadcast_to_v2i128_factor2:
2242 ; AVX:       # %bb.0:
2243 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
2244 ; AVX-NEXT:    vmovdqa 32(%rdi), %xmm1
2245 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm2
2246 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm2, %xmm2
2247 ; AVX-NEXT:    vpaddb 32(%rsi), %xmm1, %xmm1
2248 ; AVX-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2249 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2250 ; AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
2251 ; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
2252 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
2253 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm1, %xmm1
2254 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
2255 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
2256 ; AVX-NEXT:    vmovdqa %xmm1, 16(%rcx)
2257 ; AVX-NEXT:    vzeroupper
2258 ; AVX-NEXT:    retq
2260 ; AVX2-LABEL: vec256_i64_widen_to_i128_factor2_broadcast_to_v2i128_factor2:
2261 ; AVX2:       # %bb.0:
2262 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm0
2263 ; AVX2-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
2264 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm1
2265 ; AVX2-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
2266 ; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm1
2267 ; AVX2-NEXT:    vpunpckhqdq {{.*#+}} ymm0 = ymm1[1],ymm0[1],ymm1[3],ymm0[3]
2268 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
2269 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
2270 ; AVX2-NEXT:    vzeroupper
2271 ; AVX2-NEXT:    retq
2273 ; AVX512F-SLOW-LABEL: vec256_i64_widen_to_i128_factor2_broadcast_to_v2i128_factor2:
2274 ; AVX512F-SLOW:       # %bb.0:
2275 ; AVX512F-SLOW-NEXT:    vmovdqa 32(%rdi), %ymm0
2276 ; AVX512F-SLOW-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
2277 ; AVX512F-SLOW-NEXT:    vmovdqa (%rdi), %xmm1
2278 ; AVX512F-SLOW-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
2279 ; AVX512F-SLOW-NEXT:    vpbroadcastq %xmm1, %ymm1
2280 ; AVX512F-SLOW-NEXT:    vpunpckhqdq {{.*#+}} ymm0 = ymm1[1],ymm0[1],ymm1[3],ymm0[3]
2281 ; AVX512F-SLOW-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
2282 ; AVX512F-SLOW-NEXT:    vmovdqa %ymm0, (%rcx)
2283 ; AVX512F-SLOW-NEXT:    vzeroupper
2284 ; AVX512F-SLOW-NEXT:    retq
2286 ; AVX512F-FAST-LABEL: vec256_i64_widen_to_i128_factor2_broadcast_to_v2i128_factor2:
2287 ; AVX512F-FAST:       # %bb.0:
2288 ; AVX512F-FAST-NEXT:    vmovdqa (%rdi), %ymm0
2289 ; AVX512F-FAST-NEXT:    vmovdqa 32(%rdi), %ymm1
2290 ; AVX512F-FAST-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
2291 ; AVX512F-FAST-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
2292 ; AVX512F-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,5,0,7]
2293 ; AVX512F-FAST-NEXT:    vpermi2q %ymm1, %ymm0, %ymm2
2294 ; AVX512F-FAST-NEXT:    vpaddb (%rdx), %ymm2, %ymm0
2295 ; AVX512F-FAST-NEXT:    vmovdqa %ymm0, (%rcx)
2296 ; AVX512F-FAST-NEXT:    vzeroupper
2297 ; AVX512F-FAST-NEXT:    retq
2299 ; AVX512DQ-SLOW-LABEL: vec256_i64_widen_to_i128_factor2_broadcast_to_v2i128_factor2:
2300 ; AVX512DQ-SLOW:       # %bb.0:
2301 ; AVX512DQ-SLOW-NEXT:    vmovdqa 32(%rdi), %ymm0
2302 ; AVX512DQ-SLOW-NEXT:    vpaddb 32(%rsi), %ymm0, %ymm0
2303 ; AVX512DQ-SLOW-NEXT:    vmovdqa (%rdi), %xmm1
2304 ; AVX512DQ-SLOW-NEXT:    vpaddb (%rsi), %xmm1, %xmm1
2305 ; AVX512DQ-SLOW-NEXT:    vpbroadcastq %xmm1, %ymm1
2306 ; AVX512DQ-SLOW-NEXT:    vpunpckhqdq {{.*#+}} ymm0 = ymm1[1],ymm0[1],ymm1[3],ymm0[3]
2307 ; AVX512DQ-SLOW-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
2308 ; AVX512DQ-SLOW-NEXT:    vmovdqa %ymm0, (%rcx)
2309 ; AVX512DQ-SLOW-NEXT:    vzeroupper
2310 ; AVX512DQ-SLOW-NEXT:    retq
2312 ; AVX512DQ-FAST-LABEL: vec256_i64_widen_to_i128_factor2_broadcast_to_v2i128_factor2:
2313 ; AVX512DQ-FAST:       # %bb.0:
2314 ; AVX512DQ-FAST-NEXT:    vmovdqa (%rdi), %ymm0
2315 ; AVX512DQ-FAST-NEXT:    vmovdqa 32(%rdi), %ymm1
2316 ; AVX512DQ-FAST-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
2317 ; AVX512DQ-FAST-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
2318 ; AVX512DQ-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,5,0,7]
2319 ; AVX512DQ-FAST-NEXT:    vpermi2q %ymm1, %ymm0, %ymm2
2320 ; AVX512DQ-FAST-NEXT:    vpaddb (%rdx), %ymm2, %ymm0
2321 ; AVX512DQ-FAST-NEXT:    vmovdqa %ymm0, (%rcx)
2322 ; AVX512DQ-FAST-NEXT:    vzeroupper
2323 ; AVX512DQ-FAST-NEXT:    retq
2325 ; AVX512BW-SLOW-LABEL: vec256_i64_widen_to_i128_factor2_broadcast_to_v2i128_factor2:
2326 ; AVX512BW-SLOW:       # %bb.0:
2327 ; AVX512BW-SLOW-NEXT:    vmovdqa64 (%rdi), %zmm0
2328 ; AVX512BW-SLOW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
2329 ; AVX512BW-SLOW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2330 ; AVX512BW-SLOW-NEXT:    vpbroadcastq %xmm0, %ymm0
2331 ; AVX512BW-SLOW-NEXT:    vpunpckhqdq {{.*#+}} ymm0 = ymm0[1],ymm1[1],ymm0[3],ymm1[3]
2332 ; AVX512BW-SLOW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
2333 ; AVX512BW-SLOW-NEXT:    vmovdqa64 %zmm0, (%rcx)
2334 ; AVX512BW-SLOW-NEXT:    vzeroupper
2335 ; AVX512BW-SLOW-NEXT:    retq
2337 ; AVX512BW-FAST-LABEL: vec256_i64_widen_to_i128_factor2_broadcast_to_v2i128_factor2:
2338 ; AVX512BW-FAST:       # %bb.0:
2339 ; AVX512BW-FAST-NEXT:    vmovdqa64 (%rdi), %zmm0
2340 ; AVX512BW-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,5,0,7]
2341 ; AVX512BW-FAST-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
2342 ; AVX512BW-FAST-NEXT:    vpermq %zmm0, %zmm1, %zmm0
2343 ; AVX512BW-FAST-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
2344 ; AVX512BW-FAST-NEXT:    vmovdqa64 %zmm0, (%rcx)
2345 ; AVX512BW-FAST-NEXT:    vzeroupper
2346 ; AVX512BW-FAST-NEXT:    retq
2347   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
2348   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
2349   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
2350   %in.vec.cast = bitcast <64 x i8> %in.vec to <8 x i64>
2351   %broadcast.of.aextinreg = shufflevector <8 x i64> %in.vec.cast, <8 x i64> poison, <4 x i32> <i32 0, i32 5, i32 0, i32 7>
2352   %out.bytevec = bitcast <4 x i64> %broadcast.of.aextinreg to <32 x i8>
2353   %out.bytevec.padded = shufflevector <32 x i8> %out.bytevec, <32 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
2354   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
2355   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
2356   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
2357   ret void
2360 define void @vec384_i8_widen_to_i16_factor2_broadcast_to_v24i16_factor24(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
2361 ; SSE2-LABEL: vec384_i8_widen_to_i16_factor2_broadcast_to_v24i16_factor24:
2362 ; SSE2:       # %bb.0:
2363 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
2364 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
2365 ; SSE2-NEXT:    paddb (%rsi), %xmm0
2366 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
2367 ; SSE2-NEXT:    psrlw $8, %xmm1
2368 ; SSE2-NEXT:    packuswb %xmm1, %xmm1
2369 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm0[0,0,0,0,4,5,6,7]
2370 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2371 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2372 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2373 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,0,0,0]
2374 ; SSE2-NEXT:    paddb (%rdx), %xmm0
2375 ; SSE2-NEXT:    movdqa 16(%rdx), %xmm2
2376 ; SSE2-NEXT:    paddb %xmm1, %xmm2
2377 ; SSE2-NEXT:    paddb 32(%rdx), %xmm1
2378 ; SSE2-NEXT:    movdqa %xmm1, 32(%rcx)
2379 ; SSE2-NEXT:    movdqa %xmm2, 16(%rcx)
2380 ; SSE2-NEXT:    movdqa %xmm0, (%rcx)
2381 ; SSE2-NEXT:    retq
2383 ; SSE42-LABEL: vec384_i8_widen_to_i16_factor2_broadcast_to_v24i16_factor24:
2384 ; SSE42:       # %bb.0:
2385 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
2386 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
2387 ; SSE42-NEXT:    paddb (%rsi), %xmm0
2388 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
2389 ; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
2390 ; SSE42-NEXT:    pshuflw {{.*#+}} xmm2 = xmm0[0,0,0,0,4,5,6,7]
2391 ; SSE42-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2392 ; SSE42-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2393 ; SSE42-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2394 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,0,0,0]
2395 ; SSE42-NEXT:    paddb (%rdx), %xmm0
2396 ; SSE42-NEXT:    movdqa 16(%rdx), %xmm2
2397 ; SSE42-NEXT:    paddb %xmm1, %xmm2
2398 ; SSE42-NEXT:    paddb 32(%rdx), %xmm1
2399 ; SSE42-NEXT:    movdqa %xmm1, 32(%rcx)
2400 ; SSE42-NEXT:    movdqa %xmm2, 16(%rcx)
2401 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
2402 ; SSE42-NEXT:    retq
2404 ; AVX-LABEL: vec384_i8_widen_to_i16_factor2_broadcast_to_v24i16_factor24:
2405 ; AVX:       # %bb.0:
2406 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
2407 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
2408 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2409 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2410 ; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
2411 ; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2412 ; AVX-NEXT:    vpshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]
2413 ; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
2414 ; AVX-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2415 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2416 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
2417 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm2
2418 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
2419 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
2420 ; AVX-NEXT:    vmovdqa %xmm2, 32(%rcx)
2421 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
2422 ; AVX-NEXT:    retq
2424 ; AVX2-LABEL: vec384_i8_widen_to_i16_factor2_broadcast_to_v24i16_factor24:
2425 ; AVX2:       # %bb.0:
2426 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
2427 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
2428 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2429 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
2430 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2431 ; AVX2-NEXT:    vpbroadcastb %xmm0, %ymm0
2432 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
2433 ; AVX2-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
2434 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
2435 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rcx)
2436 ; AVX2-NEXT:    vmovdqa %ymm1, (%rcx)
2437 ; AVX2-NEXT:    vzeroupper
2438 ; AVX2-NEXT:    retq
2440 ; AVX512F-LABEL: vec384_i8_widen_to_i16_factor2_broadcast_to_v24i16_factor24:
2441 ; AVX512F:       # %bb.0:
2442 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
2443 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm1
2444 ; AVX512F-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2445 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
2446 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2447 ; AVX512F-NEXT:    vpbroadcastb %xmm0, %ymm0
2448 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
2449 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
2450 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
2451 ; AVX512F-NEXT:    vmovdqa %ymm0, 32(%rcx)
2452 ; AVX512F-NEXT:    vmovdqa %ymm1, (%rcx)
2453 ; AVX512F-NEXT:    vzeroupper
2454 ; AVX512F-NEXT:    retq
2456 ; AVX512DQ-LABEL: vec384_i8_widen_to_i16_factor2_broadcast_to_v24i16_factor24:
2457 ; AVX512DQ:       # %bb.0:
2458 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
2459 ; AVX512DQ-NEXT:    vmovdqa 48(%rdi), %xmm1
2460 ; AVX512DQ-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2461 ; AVX512DQ-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
2462 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2463 ; AVX512DQ-NEXT:    vpbroadcastb %xmm0, %ymm0
2464 ; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
2465 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
2466 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
2467 ; AVX512DQ-NEXT:    vmovdqa %ymm0, 32(%rcx)
2468 ; AVX512DQ-NEXT:    vmovdqa %ymm1, (%rcx)
2469 ; AVX512DQ-NEXT:    vzeroupper
2470 ; AVX512DQ-NEXT:    retq
2472 ; AVX512BW-LABEL: vec384_i8_widen_to_i16_factor2_broadcast_to_v24i16_factor24:
2473 ; AVX512BW:       # %bb.0:
2474 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
2475 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
2476 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2477 ; AVX512BW-NEXT:    vextracti128 $1, %ymm1, %xmm1
2478 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
2479 ; AVX512BW-NEXT:    vpbroadcastb %xmm0, %ymm0
2480 ; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
2481 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
2482 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
2483 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
2484 ; AVX512BW-NEXT:    vzeroupper
2485 ; AVX512BW-NEXT:    retq
2486   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
2487   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
2488   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
2489   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <48 x i32> <i32 0, i32 49, i32 0, i32 51, i32 0, i32 53, i32 0, i32 55, i32 0, i32 57, i32 0, i32 59, i32 0, i32 61, i32 0, i32 63, i32 0, i32 65, i32 0, i32 67, i32 0, i32 69, i32 0, i32 71, i32 0, i32 73, i32 0, i32 75, i32 0, i32 77, i32 0, i32 79, i32 0, i32 81, i32 0, i32 83, i32 0, i32 85, i32 0, i32 87, i32 0, i32 89, i32 0, i32 91, i32 0, i32 93, i32 0, i32 95>
2490   %out.bytevec.padded = shufflevector <48 x i8> %broadcast.of.aextinreg, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
2491   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
2492   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
2493   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
2494   ret void
2497 define void @vec384_i8_widen_to_i24_factor3_broadcast_to_v16i24_factor16(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
2498 ; SSE2-LABEL: vec384_i8_widen_to_i24_factor3_broadcast_to_v16i24_factor16:
2499 ; SSE2:       # %bb.0:
2500 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
2501 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
2502 ; SSE2-NEXT:    paddb (%rsi), %xmm0
2503 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
2504 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,255,255,0,255,255,0,255,255,0,255,255,0,255,255,0]
2505 ; SSE2-NEXT:    pand %xmm2, %xmm1
2506 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2507 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2508 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2509 ; SSE2-NEXT:    pandn %xmm0, %xmm2
2510 ; SSE2-NEXT:    por %xmm1, %xmm2
2511 ; SSE2-NEXT:    paddb (%rdx), %xmm2
2512 ; SSE2-NEXT:    movdqa 16(%rdx), %xmm1
2513 ; SSE2-NEXT:    paddb %xmm0, %xmm1
2514 ; SSE2-NEXT:    paddb 32(%rdx), %xmm0
2515 ; SSE2-NEXT:    movdqa %xmm0, 32(%rcx)
2516 ; SSE2-NEXT:    movdqa %xmm1, 16(%rcx)
2517 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
2518 ; SSE2-NEXT:    retq
2520 ; SSE42-LABEL: vec384_i8_widen_to_i24_factor3_broadcast_to_v16i24_factor16:
2521 ; SSE42:       # %bb.0:
2522 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
2523 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
2524 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
2525 ; SSE42-NEXT:    paddb (%rsi), %xmm0
2526 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
2527 ; SSE42-NEXT:    palignr {{.*#+}} xmm2 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm2[0]
2528 ; SSE42-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[15,0,1,15,3,4,15,6,7,15,9,10,15,12,13,15]
2529 ; SSE42-NEXT:    pxor %xmm1, %xmm1
2530 ; SSE42-NEXT:    pshufb %xmm1, %xmm0
2531 ; SSE42-NEXT:    paddb (%rdx), %xmm2
2532 ; SSE42-NEXT:    movdqa 16(%rdx), %xmm1
2533 ; SSE42-NEXT:    paddb %xmm0, %xmm1
2534 ; SSE42-NEXT:    paddb 32(%rdx), %xmm0
2535 ; SSE42-NEXT:    movdqa %xmm0, 32(%rcx)
2536 ; SSE42-NEXT:    movdqa %xmm1, 16(%rcx)
2537 ; SSE42-NEXT:    movdqa %xmm2, (%rcx)
2538 ; SSE42-NEXT:    retq
2540 ; AVX-LABEL: vec384_i8_widen_to_i24_factor3_broadcast_to_v16i24_factor16:
2541 ; AVX:       # %bb.0:
2542 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
2543 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
2544 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2545 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2546 ; AVX-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2547 ; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,15,3,4,15,6,7,15,9,10,15,12,13,15]
2548 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2549 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
2550 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
2551 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm2
2552 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
2553 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
2554 ; AVX-NEXT:    vmovdqa %xmm2, 32(%rcx)
2555 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
2556 ; AVX-NEXT:    retq
2558 ; AVX2-LABEL: vec384_i8_widen_to_i24_factor3_broadcast_to_v16i24_factor16:
2559 ; AVX2:       # %bb.0:
2560 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
2561 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
2562 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2563 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2564 ; AVX2-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2565 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,15,3,4,15,6,7,15,9,10,15,12,13,15]
2566 ; AVX2-NEXT:    vpbroadcastb %xmm0, %xmm0
2567 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
2568 ; AVX2-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
2569 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
2570 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rcx)
2571 ; AVX2-NEXT:    vmovdqa %ymm1, (%rcx)
2572 ; AVX2-NEXT:    vzeroupper
2573 ; AVX2-NEXT:    retq
2575 ; AVX512F-LABEL: vec384_i8_widen_to_i24_factor3_broadcast_to_v16i24_factor16:
2576 ; AVX512F:       # %bb.0:
2577 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
2578 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm1
2579 ; AVX512F-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2580 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2581 ; AVX512F-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2582 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,15,3,4,15,6,7,15,9,10,15,12,13,15]
2583 ; AVX512F-NEXT:    vpbroadcastb %xmm0, %ymm0
2584 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
2585 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
2586 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
2587 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
2588 ; AVX512F-NEXT:    vmovdqa %ymm0, 32(%rcx)
2589 ; AVX512F-NEXT:    vmovdqa %ymm1, (%rcx)
2590 ; AVX512F-NEXT:    vzeroupper
2591 ; AVX512F-NEXT:    retq
2593 ; AVX512DQ-LABEL: vec384_i8_widen_to_i24_factor3_broadcast_to_v16i24_factor16:
2594 ; AVX512DQ:       # %bb.0:
2595 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
2596 ; AVX512DQ-NEXT:    vmovdqa 48(%rdi), %xmm1
2597 ; AVX512DQ-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2598 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2599 ; AVX512DQ-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2600 ; AVX512DQ-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,15,3,4,15,6,7,15,9,10,15,12,13,15]
2601 ; AVX512DQ-NEXT:    vpbroadcastb %xmm0, %ymm0
2602 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
2603 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
2604 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
2605 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
2606 ; AVX512DQ-NEXT:    vmovdqa %ymm0, 32(%rcx)
2607 ; AVX512DQ-NEXT:    vmovdqa %ymm1, (%rcx)
2608 ; AVX512DQ-NEXT:    vzeroupper
2609 ; AVX512DQ-NEXT:    retq
2611 ; AVX512BW-LABEL: vec384_i8_widen_to_i24_factor3_broadcast_to_v16i24_factor16:
2612 ; AVX512BW:       # %bb.0:
2613 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
2614 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
2615 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2616 ; AVX512BW-NEXT:    vextracti128 $1, %ymm1, %xmm1
2617 ; AVX512BW-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2618 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,15,3,4,15,6,7,15,9,10,15,12,13,15]
2619 ; AVX512BW-NEXT:    vpbroadcastb %xmm0, %xmm0
2620 ; AVX512BW-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
2621 ; AVX512BW-NEXT:    vinserti32x4 $2, %xmm0, %zmm1, %zmm0
2622 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
2623 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
2624 ; AVX512BW-NEXT:    vzeroupper
2625 ; AVX512BW-NEXT:    retq
2626   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
2627   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
2628   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
2629   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <48 x i32> <i32 0, i32 49, i32 50, i32 0, i32 52, i32 53, i32 0, i32 55, i32 56, i32 0, i32 58, i32 59, i32 0, i32 61, i32 62, i32 0, i32 64, i32 65, i32 0, i32 67, i32 68, i32 0, i32 70, i32 71, i32 0, i32 73, i32 74, i32 0, i32 76, i32 77, i32 0, i32 79, i32 80, i32 0, i32 82, i32 83, i32 0, i32 85, i32 86, i32 0, i32 88, i32 89, i32 0, i32 91, i32 92, i32 0, i32 94, i32 95>
2630   %out.bytevec.padded = shufflevector <48 x i8> %broadcast.of.aextinreg, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
2631   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
2632   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
2633   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
2634   ret void
2637 define void @vec384_i8_widen_to_i32_factor4_broadcast_to_v12i32_factor12(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
2638 ; SSE2-LABEL: vec384_i8_widen_to_i32_factor4_broadcast_to_v12i32_factor12:
2639 ; SSE2:       # %bb.0:
2640 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
2641 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
2642 ; SSE2-NEXT:    paddb (%rsi), %xmm0
2643 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
2644 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
2645 ; SSE2-NEXT:    pand %xmm2, %xmm1
2646 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2647 ; SSE2-NEXT:    pandn %xmm0, %xmm2
2648 ; SSE2-NEXT:    por %xmm1, %xmm2
2649 ; SSE2-NEXT:    paddb (%rdx), %xmm2
2650 ; SSE2-NEXT:    movdqa 16(%rdx), %xmm1
2651 ; SSE2-NEXT:    paddb %xmm0, %xmm1
2652 ; SSE2-NEXT:    paddb 32(%rdx), %xmm0
2653 ; SSE2-NEXT:    movdqa %xmm0, 32(%rcx)
2654 ; SSE2-NEXT:    movdqa %xmm1, 16(%rcx)
2655 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
2656 ; SSE2-NEXT:    retq
2658 ; SSE42-LABEL: vec384_i8_widen_to_i32_factor4_broadcast_to_v12i32_factor12:
2659 ; SSE42:       # %bb.0:
2660 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
2661 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
2662 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
2663 ; SSE42-NEXT:    paddb (%rsi), %xmm0
2664 ; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,0,0]
2665 ; SSE42-NEXT:    palignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2666 ; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,15,4,5,6,15,8,9,10,15,12,13,14]
2667 ; SSE42-NEXT:    paddb (%rdx), %xmm0
2668 ; SSE42-NEXT:    movdqa 16(%rdx), %xmm1
2669 ; SSE42-NEXT:    paddb %xmm2, %xmm1
2670 ; SSE42-NEXT:    paddb 32(%rdx), %xmm2
2671 ; SSE42-NEXT:    movdqa %xmm2, 32(%rcx)
2672 ; SSE42-NEXT:    movdqa %xmm1, 16(%rcx)
2673 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
2674 ; SSE42-NEXT:    retq
2676 ; AVX-LABEL: vec384_i8_widen_to_i32_factor4_broadcast_to_v12i32_factor12:
2677 ; AVX:       # %bb.0:
2678 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
2679 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
2680 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2681 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2682 ; AVX-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2683 ; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,2,15,4,5,6,15,8,9,10,15,12,13,14]
2684 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2685 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
2686 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm2
2687 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
2688 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
2689 ; AVX-NEXT:    vmovdqa %xmm2, 32(%rcx)
2690 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
2691 ; AVX-NEXT:    retq
2693 ; AVX2-LABEL: vec384_i8_widen_to_i32_factor4_broadcast_to_v12i32_factor12:
2694 ; AVX2:       # %bb.0:
2695 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
2696 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
2697 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2698 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2699 ; AVX2-NEXT:    vpbroadcastd %xmm0, %ymm2
2700 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
2701 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm1, %ymm2, %ymm1
2702 ; AVX2-NEXT:    vpbroadcastb %xmm0, %xmm0
2703 ; AVX2-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
2704 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
2705 ; AVX2-NEXT:    vmovdqa %ymm1, (%rcx)
2706 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rcx)
2707 ; AVX2-NEXT:    vzeroupper
2708 ; AVX2-NEXT:    retq
2710 ; AVX512F-LABEL: vec384_i8_widen_to_i32_factor4_broadcast_to_v12i32_factor12:
2711 ; AVX512F:       # %bb.0:
2712 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
2713 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm1
2714 ; AVX512F-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2715 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2716 ; AVX512F-NEXT:    vpbroadcastd %xmm0, %ymm2
2717 ; AVX512F-NEXT:    vpternlogd $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm2
2718 ; AVX512F-NEXT:    vpbroadcastb %xmm0, %ymm0
2719 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm2, %ymm1
2720 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
2721 ; AVX512F-NEXT:    vmovdqa %ymm0, 32(%rcx)
2722 ; AVX512F-NEXT:    vmovdqa %ymm1, (%rcx)
2723 ; AVX512F-NEXT:    vzeroupper
2724 ; AVX512F-NEXT:    retq
2726 ; AVX512DQ-LABEL: vec384_i8_widen_to_i32_factor4_broadcast_to_v12i32_factor12:
2727 ; AVX512DQ:       # %bb.0:
2728 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
2729 ; AVX512DQ-NEXT:    vmovdqa 48(%rdi), %xmm1
2730 ; AVX512DQ-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2731 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2732 ; AVX512DQ-NEXT:    vpbroadcastd %xmm0, %ymm2
2733 ; AVX512DQ-NEXT:    vpternlogd $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm2
2734 ; AVX512DQ-NEXT:    vpbroadcastb %xmm0, %ymm0
2735 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm2, %ymm1
2736 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
2737 ; AVX512DQ-NEXT:    vmovdqa %ymm0, 32(%rcx)
2738 ; AVX512DQ-NEXT:    vmovdqa %ymm1, (%rcx)
2739 ; AVX512DQ-NEXT:    vzeroupper
2740 ; AVX512DQ-NEXT:    retq
2742 ; AVX512BW-LABEL: vec384_i8_widen_to_i32_factor4_broadcast_to_v12i32_factor12:
2743 ; AVX512BW:       # %bb.0:
2744 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
2745 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
2746 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2747 ; AVX512BW-NEXT:    vextracti128 $1, %ymm1, %xmm1
2748 ; AVX512BW-NEXT:    vpbroadcastd %xmm0, %ymm2
2749 ; AVX512BW-NEXT:    movl $286331153, %eax # imm = 0x11111111
2750 ; AVX512BW-NEXT:    kmovd %eax, %k1
2751 ; AVX512BW-NEXT:    vmovdqu8 %ymm2, %ymm1 {%k1}
2752 ; AVX512BW-NEXT:    vpbroadcastb %xmm0, %ymm0
2753 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
2754 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
2755 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
2756 ; AVX512BW-NEXT:    vzeroupper
2757 ; AVX512BW-NEXT:    retq
2758   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
2759   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
2760   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
2761   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <48 x i32> <i32 0, i32 49, i32 50, i32 51, i32 0, i32 53, i32 54, i32 55, i32 0, i32 57, i32 58, i32 59, i32 0, i32 61, i32 62, i32 63, i32 0, i32 65, i32 66, i32 67, i32 0, i32 69, i32 70, i32 71, i32 0, i32 73, i32 74, i32 75, i32 0, i32 77, i32 78, i32 79, i32 0, i32 81, i32 82, i32 83, i32 0, i32 85, i32 86, i32 87, i32 0, i32 89, i32 90, i32 91, i32 0, i32 93, i32 94, i32 95>
2762   %out.bytevec.padded = shufflevector <48 x i8> %broadcast.of.aextinreg, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
2763   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
2764   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
2765   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
2766   ret void
2769 define void @vec384_i8_widen_to_i48_factor6_broadcast_to_v8i48_factor8(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
2770 ; SSE2-LABEL: vec384_i8_widen_to_i48_factor6_broadcast_to_v8i48_factor8:
2771 ; SSE2:       # %bb.0:
2772 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
2773 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
2774 ; SSE2-NEXT:    paddb (%rsi), %xmm0
2775 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
2776 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,255,255,255,255,255,0,255,255,255,255,255,0,255,255,255]
2777 ; SSE2-NEXT:    pand %xmm2, %xmm1
2778 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2779 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2780 ; SSE2-NEXT:    pandn %xmm0, %xmm2
2781 ; SSE2-NEXT:    por %xmm1, %xmm2
2782 ; SSE2-NEXT:    paddb (%rdx), %xmm2
2783 ; SSE2-NEXT:    movdqa 16(%rdx), %xmm1
2784 ; SSE2-NEXT:    paddb %xmm0, %xmm1
2785 ; SSE2-NEXT:    paddb 32(%rdx), %xmm0
2786 ; SSE2-NEXT:    movdqa %xmm0, 32(%rcx)
2787 ; SSE2-NEXT:    movdqa %xmm1, 16(%rcx)
2788 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
2789 ; SSE2-NEXT:    retq
2791 ; SSE42-LABEL: vec384_i8_widen_to_i48_factor6_broadcast_to_v8i48_factor8:
2792 ; SSE42:       # %bb.0:
2793 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
2794 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
2795 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
2796 ; SSE42-NEXT:    paddb (%rsi), %xmm0
2797 ; SSE42-NEXT:    pshuflw {{.*#+}} xmm2 = xmm0[0,0,0,0,4,5,6,7]
2798 ; SSE42-NEXT:    palignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2799 ; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,15,6,7,8,9,10,15,12,13,14]
2800 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,0,0,0]
2801 ; SSE42-NEXT:    paddb (%rdx), %xmm0
2802 ; SSE42-NEXT:    movdqa 16(%rdx), %xmm2
2803 ; SSE42-NEXT:    paddb %xmm1, %xmm2
2804 ; SSE42-NEXT:    paddb 32(%rdx), %xmm1
2805 ; SSE42-NEXT:    movdqa %xmm1, 32(%rcx)
2806 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
2807 ; SSE42-NEXT:    movdqa %xmm2, 16(%rcx)
2808 ; SSE42-NEXT:    retq
2810 ; AVX-LABEL: vec384_i8_widen_to_i48_factor6_broadcast_to_v8i48_factor8:
2811 ; AVX:       # %bb.0:
2812 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
2813 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
2814 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2815 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2816 ; AVX-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2817 ; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,2,3,4,15,6,7,8,9,10,15,12,13,14]
2818 ; AVX-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
2819 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2820 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
2821 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm2
2822 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
2823 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
2824 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
2825 ; AVX-NEXT:    vmovdqa %xmm2, 32(%rcx)
2826 ; AVX-NEXT:    retq
2828 ; AVX2-LABEL: vec384_i8_widen_to_i48_factor6_broadcast_to_v8i48_factor8:
2829 ; AVX2:       # %bb.0:
2830 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
2831 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
2832 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2833 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2834 ; AVX2-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2835 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,2,3,4,15,6,7,8,9,10,15,12,13,14]
2836 ; AVX2-NEXT:    vpbroadcastb %xmm0, %xmm0
2837 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
2838 ; AVX2-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
2839 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
2840 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rcx)
2841 ; AVX2-NEXT:    vmovdqa %ymm1, (%rcx)
2842 ; AVX2-NEXT:    vzeroupper
2843 ; AVX2-NEXT:    retq
2845 ; AVX512F-LABEL: vec384_i8_widen_to_i48_factor6_broadcast_to_v8i48_factor8:
2846 ; AVX512F:       # %bb.0:
2847 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
2848 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm1
2849 ; AVX512F-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2850 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2851 ; AVX512F-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2852 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,2,3,4,15,6,7,8,9,10,15,12,13,14]
2853 ; AVX512F-NEXT:    vpbroadcastb %xmm0, %ymm0
2854 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
2855 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
2856 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
2857 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
2858 ; AVX512F-NEXT:    vmovdqa %ymm0, 32(%rcx)
2859 ; AVX512F-NEXT:    vmovdqa %ymm1, (%rcx)
2860 ; AVX512F-NEXT:    vzeroupper
2861 ; AVX512F-NEXT:    retq
2863 ; AVX512DQ-LABEL: vec384_i8_widen_to_i48_factor6_broadcast_to_v8i48_factor8:
2864 ; AVX512DQ:       # %bb.0:
2865 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
2866 ; AVX512DQ-NEXT:    vmovdqa 48(%rdi), %xmm1
2867 ; AVX512DQ-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2868 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2869 ; AVX512DQ-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2870 ; AVX512DQ-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,2,3,4,15,6,7,8,9,10,15,12,13,14]
2871 ; AVX512DQ-NEXT:    vpbroadcastb %xmm0, %ymm0
2872 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
2873 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
2874 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
2875 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
2876 ; AVX512DQ-NEXT:    vmovdqa %ymm0, 32(%rcx)
2877 ; AVX512DQ-NEXT:    vmovdqa %ymm1, (%rcx)
2878 ; AVX512DQ-NEXT:    vzeroupper
2879 ; AVX512DQ-NEXT:    retq
2881 ; AVX512BW-LABEL: vec384_i8_widen_to_i48_factor6_broadcast_to_v8i48_factor8:
2882 ; AVX512BW:       # %bb.0:
2883 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
2884 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
2885 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2886 ; AVX512BW-NEXT:    vextracti128 $1, %ymm1, %xmm1
2887 ; AVX512BW-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2888 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,2,3,4,15,6,7,8,9,10,15,12,13,14]
2889 ; AVX512BW-NEXT:    vpbroadcastb %xmm0, %ymm0
2890 ; AVX512BW-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
2891 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
2892 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
2893 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
2894 ; AVX512BW-NEXT:    vzeroupper
2895 ; AVX512BW-NEXT:    retq
2896   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
2897   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
2898   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
2899   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <48 x i32> <i32 0, i32 49, i32 50, i32 51, i32 52, i32 53, i32 0, i32 55, i32 56, i32 57, i32 58, i32 59, i32 0, i32 61, i32 62, i32 63, i32 64, i32 65, i32 0, i32 67, i32 68, i32 69, i32 70, i32 71, i32 0, i32 73, i32 74, i32 75, i32 76, i32 77, i32 0, i32 79, i32 80, i32 81, i32 82, i32 83, i32 0, i32 85, i32 86, i32 87, i32 88, i32 89, i32 0, i32 91, i32 92, i32 93, i32 94, i32 95>
2900   %out.bytevec.padded = shufflevector <48 x i8> %broadcast.of.aextinreg, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
2901   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
2902   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
2903   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
2904   ret void
2907 define void @vec384_i8_widen_to_i64_factor8_broadcast_to_v6i64_factor6(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
2908 ; SSE2-LABEL: vec384_i8_widen_to_i64_factor8_broadcast_to_v6i64_factor6:
2909 ; SSE2:       # %bb.0:
2910 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
2911 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
2912 ; SSE2-NEXT:    paddb (%rsi), %xmm0
2913 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
2914 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
2915 ; SSE2-NEXT:    pand %xmm2, %xmm1
2916 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
2917 ; SSE2-NEXT:    pandn %xmm0, %xmm2
2918 ; SSE2-NEXT:    por %xmm1, %xmm2
2919 ; SSE2-NEXT:    paddb (%rdx), %xmm2
2920 ; SSE2-NEXT:    movdqa 16(%rdx), %xmm1
2921 ; SSE2-NEXT:    paddb %xmm0, %xmm1
2922 ; SSE2-NEXT:    paddb 32(%rdx), %xmm0
2923 ; SSE2-NEXT:    movdqa %xmm0, 32(%rcx)
2924 ; SSE2-NEXT:    movdqa %xmm1, 16(%rcx)
2925 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
2926 ; SSE2-NEXT:    retq
2928 ; SSE42-LABEL: vec384_i8_widen_to_i64_factor8_broadcast_to_v6i64_factor6:
2929 ; SSE42:       # %bb.0:
2930 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
2931 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
2932 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
2933 ; SSE42-NEXT:    paddb (%rsi), %xmm0
2934 ; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,1,0,1]
2935 ; SSE42-NEXT:    palignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2936 ; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,5,6,15,8,9,10,11,12,13,14]
2937 ; SSE42-NEXT:    paddb (%rdx), %xmm0
2938 ; SSE42-NEXT:    movdqa 16(%rdx), %xmm1
2939 ; SSE42-NEXT:    paddb %xmm2, %xmm1
2940 ; SSE42-NEXT:    paddb 32(%rdx), %xmm2
2941 ; SSE42-NEXT:    movdqa %xmm2, 32(%rcx)
2942 ; SSE42-NEXT:    movdqa %xmm1, 16(%rcx)
2943 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
2944 ; SSE42-NEXT:    retq
2946 ; AVX-LABEL: vec384_i8_widen_to_i64_factor8_broadcast_to_v6i64_factor6:
2947 ; AVX:       # %bb.0:
2948 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
2949 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
2950 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2951 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2952 ; AVX-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
2953 ; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,2,3,4,5,6,15,8,9,10,11,12,13,14]
2954 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
2955 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
2956 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm2
2957 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
2958 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
2959 ; AVX-NEXT:    vmovdqa %xmm2, 32(%rcx)
2960 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
2961 ; AVX-NEXT:    retq
2963 ; AVX2-LABEL: vec384_i8_widen_to_i64_factor8_broadcast_to_v6i64_factor6:
2964 ; AVX2:       # %bb.0:
2965 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
2966 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
2967 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2968 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2969 ; AVX2-NEXT:    vpbroadcastq %xmm0, %ymm2
2970 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
2971 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm1, %ymm2, %ymm1
2972 ; AVX2-NEXT:    vpbroadcastb %xmm0, %xmm0
2973 ; AVX2-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
2974 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
2975 ; AVX2-NEXT:    vmovdqa %ymm1, (%rcx)
2976 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rcx)
2977 ; AVX2-NEXT:    vzeroupper
2978 ; AVX2-NEXT:    retq
2980 ; AVX512F-LABEL: vec384_i8_widen_to_i64_factor8_broadcast_to_v6i64_factor6:
2981 ; AVX512F:       # %bb.0:
2982 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
2983 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm1
2984 ; AVX512F-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
2985 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
2986 ; AVX512F-NEXT:    vpbroadcastq %xmm0, %ymm2
2987 ; AVX512F-NEXT:    vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm1, %ymm2
2988 ; AVX512F-NEXT:    vpbroadcastb %xmm0, %ymm0
2989 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm2, %ymm1
2990 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
2991 ; AVX512F-NEXT:    vmovdqa %ymm0, 32(%rcx)
2992 ; AVX512F-NEXT:    vmovdqa %ymm1, (%rcx)
2993 ; AVX512F-NEXT:    vzeroupper
2994 ; AVX512F-NEXT:    retq
2996 ; AVX512DQ-LABEL: vec384_i8_widen_to_i64_factor8_broadcast_to_v6i64_factor6:
2997 ; AVX512DQ:       # %bb.0:
2998 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
2999 ; AVX512DQ-NEXT:    vmovdqa 48(%rdi), %xmm1
3000 ; AVX512DQ-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3001 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3002 ; AVX512DQ-NEXT:    vpbroadcastq %xmm0, %ymm2
3003 ; AVX512DQ-NEXT:    vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm1, %ymm2
3004 ; AVX512DQ-NEXT:    vpbroadcastb %xmm0, %ymm0
3005 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm2, %ymm1
3006 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3007 ; AVX512DQ-NEXT:    vmovdqa %ymm0, 32(%rcx)
3008 ; AVX512DQ-NEXT:    vmovdqa %ymm1, (%rcx)
3009 ; AVX512DQ-NEXT:    vzeroupper
3010 ; AVX512DQ-NEXT:    retq
3012 ; AVX512BW-LABEL: vec384_i8_widen_to_i64_factor8_broadcast_to_v6i64_factor6:
3013 ; AVX512BW:       # %bb.0:
3014 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
3015 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
3016 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
3017 ; AVX512BW-NEXT:    vextracti128 $1, %ymm1, %xmm1
3018 ; AVX512BW-NEXT:    vpbroadcastq %xmm0, %ymm2
3019 ; AVX512BW-NEXT:    movl $16843009, %eax # imm = 0x1010101
3020 ; AVX512BW-NEXT:    kmovd %eax, %k1
3021 ; AVX512BW-NEXT:    vmovdqu8 %ymm2, %ymm1 {%k1}
3022 ; AVX512BW-NEXT:    vpbroadcastb %xmm0, %ymm0
3023 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
3024 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
3025 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
3026 ; AVX512BW-NEXT:    vzeroupper
3027 ; AVX512BW-NEXT:    retq
3028   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
3029   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
3030   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
3031   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <48 x i32> <i32 0, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 0, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63, i32 0, i32 65, i32 66, i32 67, i32 68, i32 69, i32 70, i32 71, i32 0, i32 73, i32 74, i32 75, i32 76, i32 77, i32 78, i32 79, i32 0, i32 81, i32 82, i32 83, i32 84, i32 85, i32 86, i32 87, i32 0, i32 89, i32 90, i32 91, i32 92, i32 93, i32 94, i32 95>
3032   %out.bytevec.padded = shufflevector <48 x i8> %broadcast.of.aextinreg, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
3033   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
3034   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
3035   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
3036   ret void
3039 define void @vec384_i8_widen_to_i96_factor12_broadcast_to_v4i96_factor4(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
3040 ; SSE2-LABEL: vec384_i8_widen_to_i96_factor12_broadcast_to_v4i96_factor4:
3041 ; SSE2:       # %bb.0:
3042 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3043 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
3044 ; SSE2-NEXT:    paddb (%rsi), %xmm0
3045 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
3046 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255]
3047 ; SSE2-NEXT:    pand %xmm2, %xmm1
3048 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
3049 ; SSE2-NEXT:    pandn %xmm3, %xmm2
3050 ; SSE2-NEXT:    por %xmm1, %xmm2
3051 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,1]
3052 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
3053 ; SSE2-NEXT:    paddb (%rdx), %xmm2
3054 ; SSE2-NEXT:    paddb 16(%rdx), %xmm0
3055 ; SSE2-NEXT:    paddb 32(%rdx), %xmm1
3056 ; SSE2-NEXT:    movdqa %xmm1, 32(%rcx)
3057 ; SSE2-NEXT:    movdqa %xmm0, 16(%rcx)
3058 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
3059 ; SSE2-NEXT:    retq
3061 ; SSE42-LABEL: vec384_i8_widen_to_i96_factor12_broadcast_to_v4i96_factor4:
3062 ; SSE42:       # %bb.0:
3063 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
3064 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
3065 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
3066 ; SSE42-NEXT:    paddb (%rsi), %xmm0
3067 ; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,1,1]
3068 ; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,1,0,1]
3069 ; SSE42-NEXT:    palignr {{.*#+}} xmm0 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
3070 ; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[15,0,1,2,3,4,5,6,7,8,9,10,15,12,13,14]
3071 ; SSE42-NEXT:    paddb (%rdx), %xmm0
3072 ; SSE42-NEXT:    paddb 16(%rdx), %xmm3
3073 ; SSE42-NEXT:    paddb 32(%rdx), %xmm2
3074 ; SSE42-NEXT:    movdqa %xmm2, 32(%rcx)
3075 ; SSE42-NEXT:    movdqa %xmm3, 16(%rcx)
3076 ; SSE42-NEXT:    movdqa %xmm0, (%rcx)
3077 ; SSE42-NEXT:    retq
3079 ; AVX-LABEL: vec384_i8_widen_to_i96_factor12_broadcast_to_v4i96_factor4:
3080 ; AVX:       # %bb.0:
3081 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
3082 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
3083 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3084 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3085 ; AVX-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
3086 ; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,2,3,4,5,6,7,8,9,10,15,12,13,14]
3087 ; AVX-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[0,1,0,1]
3088 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
3089 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
3090 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm0
3091 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm2, %xmm2
3092 ; AVX-NEXT:    vmovdqa %xmm2, 16(%rcx)
3093 ; AVX-NEXT:    vmovdqa %xmm0, 32(%rcx)
3094 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
3095 ; AVX-NEXT:    retq
3097 ; AVX2-LABEL: vec384_i8_widen_to_i96_factor12_broadcast_to_v4i96_factor4:
3098 ; AVX2:       # %bb.0:
3099 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
3100 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
3101 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3102 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3103 ; AVX2-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
3104 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,2,3,4,5,6,7,8,9,10,15,12,13,14]
3105 ; AVX2-NEXT:    vpbroadcastb %xmm0, %xmm0
3106 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
3107 ; AVX2-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3108 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3109 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rcx)
3110 ; AVX2-NEXT:    vmovdqa %ymm1, (%rcx)
3111 ; AVX2-NEXT:    vzeroupper
3112 ; AVX2-NEXT:    retq
3114 ; AVX512F-LABEL: vec384_i8_widen_to_i96_factor12_broadcast_to_v4i96_factor4:
3115 ; AVX512F:       # %bb.0:
3116 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
3117 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm1
3118 ; AVX512F-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3119 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3120 ; AVX512F-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
3121 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,2,3,4,5,6,7,8,9,10,15,12,13,14]
3122 ; AVX512F-NEXT:    vpbroadcastb %xmm0, %ymm0
3123 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
3124 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
3125 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3126 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3127 ; AVX512F-NEXT:    vmovdqa %ymm0, 32(%rcx)
3128 ; AVX512F-NEXT:    vmovdqa %ymm1, (%rcx)
3129 ; AVX512F-NEXT:    vzeroupper
3130 ; AVX512F-NEXT:    retq
3132 ; AVX512DQ-LABEL: vec384_i8_widen_to_i96_factor12_broadcast_to_v4i96_factor4:
3133 ; AVX512DQ:       # %bb.0:
3134 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
3135 ; AVX512DQ-NEXT:    vmovdqa 48(%rdi), %xmm1
3136 ; AVX512DQ-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3137 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3138 ; AVX512DQ-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
3139 ; AVX512DQ-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,2,3,4,5,6,7,8,9,10,15,12,13,14]
3140 ; AVX512DQ-NEXT:    vpbroadcastb %xmm0, %ymm0
3141 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
3142 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
3143 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3144 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3145 ; AVX512DQ-NEXT:    vmovdqa %ymm0, 32(%rcx)
3146 ; AVX512DQ-NEXT:    vmovdqa %ymm1, (%rcx)
3147 ; AVX512DQ-NEXT:    vzeroupper
3148 ; AVX512DQ-NEXT:    retq
3150 ; AVX512BW-LABEL: vec384_i8_widen_to_i96_factor12_broadcast_to_v4i96_factor4:
3151 ; AVX512BW:       # %bb.0:
3152 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
3153 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
3154 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
3155 ; AVX512BW-NEXT:    vextracti128 $1, %ymm1, %xmm1
3156 ; AVX512BW-NEXT:    vpalignr {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0]
3157 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[15,0,1,2,3,4,5,6,7,8,9,10,15,12,13,14]
3158 ; AVX512BW-NEXT:    vpbroadcastb %xmm0, %ymm0
3159 ; AVX512BW-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
3160 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
3161 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
3162 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
3163 ; AVX512BW-NEXT:    vzeroupper
3164 ; AVX512BW-NEXT:    retq
3165   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
3166   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
3167   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
3168   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <48 x i32> <i32 0, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 0, i32 61, i32 62, i32 63, i32 64, i32 65, i32 66, i32 67, i32 68, i32 69, i32 70, i32 71, i32 0, i32 73, i32 74, i32 75, i32 76, i32 77, i32 78, i32 79, i32 80, i32 81, i32 82, i32 83, i32 0, i32 85, i32 86, i32 87, i32 88, i32 89, i32 90, i32 91, i32 92, i32 93, i32 94, i32 95>
3169   %out.bytevec.padded = shufflevector <48 x i8> %broadcast.of.aextinreg, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
3170   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
3171   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
3172   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
3173   ret void
3176 define void @vec384_i8_widen_to_i128_factor16_broadcast_to_v3i128_factor3(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
3177 ; SSE2-LABEL: vec384_i8_widen_to_i128_factor16_broadcast_to_v3i128_factor3:
3178 ; SSE2:       # %bb.0:
3179 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3180 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm1
3181 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm2
3182 ; SSE2-NEXT:    paddb 16(%rsi), %xmm1
3183 ; SSE2-NEXT:    paddb 48(%rsi), %xmm2
3184 ; SSE2-NEXT:    paddb (%rsi), %xmm0
3185 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3186 ; SSE2-NEXT:    pand %xmm3, %xmm2
3187 ; SSE2-NEXT:    pandn %xmm0, %xmm3
3188 ; SSE2-NEXT:    por %xmm2, %xmm3
3189 ; SSE2-NEXT:    paddb (%rdx), %xmm3
3190 ; SSE2-NEXT:    movdqa 16(%rdx), %xmm2
3191 ; SSE2-NEXT:    paddb %xmm0, %xmm2
3192 ; SSE2-NEXT:    paddb 48(%rdx), %xmm1
3193 ; SSE2-NEXT:    paddb 32(%rdx), %xmm0
3194 ; SSE2-NEXT:    movdqa %xmm0, 32(%rcx)
3195 ; SSE2-NEXT:    movdqa %xmm1, 48(%rcx)
3196 ; SSE2-NEXT:    movdqa %xmm2, 16(%rcx)
3197 ; SSE2-NEXT:    movdqa %xmm3, (%rcx)
3198 ; SSE2-NEXT:    retq
3200 ; SSE42-LABEL: vec384_i8_widen_to_i128_factor16_broadcast_to_v3i128_factor3:
3201 ; SSE42:       # %bb.0:
3202 ; SSE42-NEXT:    movdqa (%rdi), %xmm1
3203 ; SSE42-NEXT:    movdqa 16(%rdi), %xmm2
3204 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm3
3205 ; SSE42-NEXT:    paddb 16(%rsi), %xmm2
3206 ; SSE42-NEXT:    paddb 48(%rsi), %xmm3
3207 ; SSE42-NEXT:    paddb (%rsi), %xmm1
3208 ; SSE42-NEXT:    movaps {{.*#+}} xmm0 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3209 ; SSE42-NEXT:    movdqa %xmm1, %xmm4
3210 ; SSE42-NEXT:    pblendvb %xmm0, %xmm3, %xmm4
3211 ; SSE42-NEXT:    paddb (%rdx), %xmm4
3212 ; SSE42-NEXT:    movdqa 16(%rdx), %xmm0
3213 ; SSE42-NEXT:    paddb %xmm1, %xmm0
3214 ; SSE42-NEXT:    paddb 48(%rdx), %xmm2
3215 ; SSE42-NEXT:    paddb 32(%rdx), %xmm1
3216 ; SSE42-NEXT:    movdqa %xmm1, 32(%rcx)
3217 ; SSE42-NEXT:    movdqa %xmm2, 48(%rcx)
3218 ; SSE42-NEXT:    movdqa %xmm0, 16(%rcx)
3219 ; SSE42-NEXT:    movdqa %xmm4, (%rcx)
3220 ; SSE42-NEXT:    retq
3222 ; AVX-LABEL: vec384_i8_widen_to_i128_factor16_broadcast_to_v3i128_factor3:
3223 ; AVX:       # %bb.0:
3224 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
3225 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
3226 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm2
3227 ; AVX-NEXT:    vpaddb 16(%rsi), %xmm1, %xmm1
3228 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm2, %xmm2
3229 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3230 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3231 ; AVX-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm2
3232 ; AVX-NEXT:    vpaddb (%rdx), %xmm2, %xmm2
3233 ; AVX-NEXT:    vpaddb 48(%rdx), %xmm1, %xmm1
3234 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm3
3235 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
3236 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
3237 ; AVX-NEXT:    vmovdqa %xmm3, 32(%rcx)
3238 ; AVX-NEXT:    vmovdqa %xmm1, 48(%rcx)
3239 ; AVX-NEXT:    vmovdqa %xmm2, (%rcx)
3240 ; AVX-NEXT:    retq
3242 ; AVX2-LABEL: vec384_i8_widen_to_i128_factor16_broadcast_to_v3i128_factor3:
3243 ; AVX2:       # %bb.0:
3244 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3245 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
3246 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
3247 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3248 ; AVX2-NEXT:    vpermq {{.*#+}} ymm2 = ymm0[0,1,0,1]
3249 ; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3250 ; AVX2-NEXT:    # ymm3 = mem[0,1,0,1]
3251 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm1, %ymm2, %ymm1
3252 ; AVX2-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3253 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3254 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rcx)
3255 ; AVX2-NEXT:    vmovdqa %ymm1, (%rcx)
3256 ; AVX2-NEXT:    vzeroupper
3257 ; AVX2-NEXT:    retq
3259 ; AVX512F-LABEL: vec384_i8_widen_to_i128_factor16_broadcast_to_v3i128_factor3:
3260 ; AVX512F:       # %bb.0:
3261 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
3262 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
3263 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm1
3264 ; AVX512F-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3265 ; AVX512F-NEXT:    vpermq {{.*#+}} ymm2 = ymm0[0,1,0,1]
3266 ; AVX512F-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3267 ; AVX512F-NEXT:    # ymm3 = mem[0,1,0,1]
3268 ; AVX512F-NEXT:    vpternlogq $202, %ymm2, %ymm1, %ymm3
3269 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm3, %ymm1
3270 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3271 ; AVX512F-NEXT:    vmovdqa %ymm0, 32(%rcx)
3272 ; AVX512F-NEXT:    vmovdqa %ymm1, (%rcx)
3273 ; AVX512F-NEXT:    vzeroupper
3274 ; AVX512F-NEXT:    retq
3276 ; AVX512DQ-LABEL: vec384_i8_widen_to_i128_factor16_broadcast_to_v3i128_factor3:
3277 ; AVX512DQ:       # %bb.0:
3278 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
3279 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
3280 ; AVX512DQ-NEXT:    vmovdqa 48(%rdi), %xmm1
3281 ; AVX512DQ-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3282 ; AVX512DQ-NEXT:    vpermq {{.*#+}} ymm2 = ymm0[0,1,0,1]
3283 ; AVX512DQ-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3284 ; AVX512DQ-NEXT:    # ymm3 = mem[0,1,0,1]
3285 ; AVX512DQ-NEXT:    vpternlogq $202, %ymm2, %ymm1, %ymm3
3286 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm3, %ymm1
3287 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3288 ; AVX512DQ-NEXT:    vmovdqa %ymm0, 32(%rcx)
3289 ; AVX512DQ-NEXT:    vmovdqa %ymm1, (%rcx)
3290 ; AVX512DQ-NEXT:    vzeroupper
3291 ; AVX512DQ-NEXT:    retq
3293 ; AVX512BW-LABEL: vec384_i8_widen_to_i128_factor16_broadcast_to_v3i128_factor3:
3294 ; AVX512BW:       # %bb.0:
3295 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
3296 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
3297 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
3298 ; AVX512BW-NEXT:    vextracti128 $1, %ymm1, %xmm1
3299 ; AVX512BW-NEXT:    vpermq {{.*#+}} ymm2 = ymm0[0,1,0,1]
3300 ; AVX512BW-NEXT:    movl $65537, %eax # imm = 0x10001
3301 ; AVX512BW-NEXT:    kmovd %eax, %k1
3302 ; AVX512BW-NEXT:    vmovdqu8 %ymm2, %ymm1 {%k1}
3303 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
3304 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
3305 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
3306 ; AVX512BW-NEXT:    vzeroupper
3307 ; AVX512BW-NEXT:    retq
3308   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
3309   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
3310   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
3311   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <48 x i32> <i32 0, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63, i32 0, i32 65, i32 66, i32 67, i32 68, i32 69, i32 70, i32 71, i32 72, i32 73, i32 74, i32 75, i32 76, i32 77, i32 78, i32 79, i32 0, i32 81, i32 82, i32 83, i32 84, i32 85, i32 86, i32 87, i32 88, i32 89, i32 90, i32 91, i32 92, i32 93, i32 94, i32 95>
3312   %out.bytevec.padded = shufflevector <48 x i8> %broadcast.of.aextinreg, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
3313   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
3314   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
3315   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
3316   ret void
3319 define void @vec384_i8_widen_to_i192_factor24_broadcast_to_v2i192_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
3320 ; SSE2-LABEL: vec384_i8_widen_to_i192_factor24_broadcast_to_v2i192_factor2:
3321 ; SSE2:       # %bb.0:
3322 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3323 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
3324 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
3325 ; SSE2-NEXT:    paddb (%rsi), %xmm0
3326 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3327 ; SSE2-NEXT:    pand %xmm2, %xmm1
3328 ; SSE2-NEXT:    pandn %xmm0, %xmm2
3329 ; SSE2-NEXT:    por %xmm1, %xmm2
3330 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
3331 ; SSE2-NEXT:    paddb (%rdx), %xmm2
3332 ; SSE2-NEXT:    paddb 16(%rdx), %xmm0
3333 ; SSE2-NEXT:    movdqa %xmm0, 16(%rcx)
3334 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
3335 ; SSE2-NEXT:    retq
3337 ; SSE42-LABEL: vec384_i8_widen_to_i192_factor24_broadcast_to_v2i192_factor2:
3338 ; SSE42:       # %bb.0:
3339 ; SSE42-NEXT:    movdqa (%rdi), %xmm1
3340 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm2
3341 ; SSE42-NEXT:    paddb 48(%rsi), %xmm2
3342 ; SSE42-NEXT:    paddb (%rsi), %xmm1
3343 ; SSE42-NEXT:    movaps {{.*#+}} xmm0 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3344 ; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,1,0,1]
3345 ; SSE42-NEXT:    pblendvb %xmm0, %xmm2, %xmm1
3346 ; SSE42-NEXT:    paddb (%rdx), %xmm1
3347 ; SSE42-NEXT:    paddb 16(%rdx), %xmm3
3348 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
3349 ; SSE42-NEXT:    movdqa %xmm3, 16(%rcx)
3350 ; SSE42-NEXT:    retq
3352 ; AVX-LABEL: vec384_i8_widen_to_i192_factor24_broadcast_to_v2i192_factor2:
3353 ; AVX:       # %bb.0:
3354 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
3355 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
3356 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3357 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3358 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3359 ; AVX-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm1
3360 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
3361 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
3362 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
3363 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
3364 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
3365 ; AVX-NEXT:    retq
3367 ; AVX2-LABEL: vec384_i8_widen_to_i192_factor24_broadcast_to_v2i192_factor2:
3368 ; AVX2:       # %bb.0:
3369 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
3370 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
3371 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3372 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3373 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3374 ; AVX2-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm1
3375 ; AVX2-NEXT:    vpbroadcastb %xmm0, %xmm0
3376 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
3377 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
3378 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
3379 ; AVX2-NEXT:    vzeroupper
3380 ; AVX2-NEXT:    retq
3382 ; AVX512F-LABEL: vec384_i8_widen_to_i192_factor24_broadcast_to_v2i192_factor2:
3383 ; AVX512F:       # %bb.0:
3384 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
3385 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm1
3386 ; AVX512F-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3387 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3388 ; AVX512F-NEXT:    vpternlogq $228, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
3389 ; AVX512F-NEXT:    vpbroadcastb %xmm0, %xmm0
3390 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
3391 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
3392 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
3393 ; AVX512F-NEXT:    vzeroupper
3394 ; AVX512F-NEXT:    retq
3396 ; AVX512DQ-LABEL: vec384_i8_widen_to_i192_factor24_broadcast_to_v2i192_factor2:
3397 ; AVX512DQ:       # %bb.0:
3398 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
3399 ; AVX512DQ-NEXT:    vmovdqa 48(%rdi), %xmm1
3400 ; AVX512DQ-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3401 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3402 ; AVX512DQ-NEXT:    vpternlogq $228, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
3403 ; AVX512DQ-NEXT:    vpbroadcastb %xmm0, %xmm0
3404 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
3405 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
3406 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
3407 ; AVX512DQ-NEXT:    vzeroupper
3408 ; AVX512DQ-NEXT:    retq
3410 ; AVX512BW-LABEL: vec384_i8_widen_to_i192_factor24_broadcast_to_v2i192_factor2:
3411 ; AVX512BW:       # %bb.0:
3412 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
3413 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
3414 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
3415 ; AVX512BW-NEXT:    vextracti128 $1, %ymm1, %xmm1
3416 ; AVX512BW-NEXT:    movw $1, %ax
3417 ; AVX512BW-NEXT:    kmovd %eax, %k1
3418 ; AVX512BW-NEXT:    vmovdqu8 %xmm0, %xmm1 {%k1}
3419 ; AVX512BW-NEXT:    vpbroadcastb %xmm0, %xmm0
3420 ; AVX512BW-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
3421 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
3422 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
3423 ; AVX512BW-NEXT:    vzeroupper
3424 ; AVX512BW-NEXT:    retq
3425   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
3426   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
3427   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
3428   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <48 x i32> <i32 0, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63, i32 64, i32 65, i32 66, i32 67, i32 68, i32 69, i32 70, i32 71, i32 0, i32 73, i32 74, i32 75, i32 76, i32 77, i32 78, i32 79, i32 80, i32 81, i32 82, i32 83, i32 84, i32 85, i32 86, i32 87, i32 88, i32 89, i32 90, i32 91, i32 92, i32 93, i32 94, i32 95>
3429   %out.bytevec.padded = shufflevector <48 x i8> %broadcast.of.aextinreg, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
3430   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
3431   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
3432   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
3433   ret void
3436 define void @vec384_i16_widen_to_i32_factor2_broadcast_to_v12i32_factor12(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
3437 ; SSE2-LABEL: vec384_i16_widen_to_i32_factor2_broadcast_to_v12i32_factor12:
3438 ; SSE2:       # %bb.0:
3439 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3440 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
3441 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
3442 ; SSE2-NEXT:    paddb (%rsi), %xmm0
3443 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm0[0,0,0,0,4,5,6,7]
3444 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,1,2,3,4,5,6,7]
3445 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,5,6,7]
3446 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
3447 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[1,0,3,2,4,5,6,7]
3448 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
3449 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
3450 ; SSE2-NEXT:    paddb (%rdx), %xmm2
3451 ; SSE2-NEXT:    movdqa 16(%rdx), %xmm1
3452 ; SSE2-NEXT:    paddb %xmm0, %xmm1
3453 ; SSE2-NEXT:    paddb 32(%rdx), %xmm0
3454 ; SSE2-NEXT:    movdqa %xmm0, 32(%rcx)
3455 ; SSE2-NEXT:    movdqa %xmm1, 16(%rcx)
3456 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
3457 ; SSE2-NEXT:    retq
3459 ; SSE42-LABEL: vec384_i16_widen_to_i32_factor2_broadcast_to_v12i32_factor12:
3460 ; SSE42:       # %bb.0:
3461 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
3462 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
3463 ; SSE42-NEXT:    paddb (%rsi), %xmm0
3464 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
3465 ; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[2,3,6,7,10,11,14,15,u,u,u,u,u,u,u,u]
3466 ; SSE42-NEXT:    pshuflw {{.*#+}} xmm2 = xmm0[0,0,0,0,4,5,6,7]
3467 ; SSE42-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
3468 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
3469 ; SSE42-NEXT:    paddb (%rdx), %xmm2
3470 ; SSE42-NEXT:    movdqa 16(%rdx), %xmm1
3471 ; SSE42-NEXT:    paddb %xmm0, %xmm1
3472 ; SSE42-NEXT:    paddb 32(%rdx), %xmm0
3473 ; SSE42-NEXT:    movdqa %xmm0, 32(%rcx)
3474 ; SSE42-NEXT:    movdqa %xmm1, 16(%rcx)
3475 ; SSE42-NEXT:    movdqa %xmm2, (%rcx)
3476 ; SSE42-NEXT:    retq
3478 ; AVX-LABEL: vec384_i16_widen_to_i32_factor2_broadcast_to_v12i32_factor12:
3479 ; AVX:       # %bb.0:
3480 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
3481 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
3482 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3483 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3484 ; AVX-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[0,0,0,0]
3485 ; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[2,3,6,7,10,11,14,15,u,u,u,u,u,u,u,u]
3486 ; AVX-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
3487 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3488 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
3489 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm2, %xmm1
3490 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm2, %xmm2
3491 ; AVX-NEXT:    vmovdqa %xmm2, 16(%rcx)
3492 ; AVX-NEXT:    vmovdqa %xmm1, 32(%rcx)
3493 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
3494 ; AVX-NEXT:    retq
3496 ; AVX2-LABEL: vec384_i16_widen_to_i32_factor2_broadcast_to_v12i32_factor12:
3497 ; AVX2:       # %bb.0:
3498 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
3499 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
3500 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3501 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3502 ; AVX2-NEXT:    vpbroadcastw %xmm0, %ymm0
3503 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7],ymm0[8],ymm1[9],ymm0[10],ymm1[11],ymm0[12],ymm1[13],ymm0[14],ymm1[15]
3504 ; AVX2-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3505 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3506 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rcx)
3507 ; AVX2-NEXT:    vmovdqa %ymm1, (%rcx)
3508 ; AVX2-NEXT:    vzeroupper
3509 ; AVX2-NEXT:    retq
3511 ; AVX512F-LABEL: vec384_i16_widen_to_i32_factor2_broadcast_to_v12i32_factor12:
3512 ; AVX512F:       # %bb.0:
3513 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
3514 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
3515 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm1
3516 ; AVX512F-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3517 ; AVX512F-NEXT:    vpbroadcastw %xmm0, %ymm2
3518 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm1 = ymm2[0],ymm1[1],ymm2[2],ymm1[3],ymm2[4],ymm1[5],ymm2[6],ymm1[7],ymm2[8],ymm1[9],ymm2[10],ymm1[11],ymm2[12],ymm1[13],ymm2[14],ymm1[15]
3519 ; AVX512F-NEXT:    vpbroadcastw %xmm0, %ymm0
3520 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3521 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3522 ; AVX512F-NEXT:    vmovdqa %ymm0, 32(%rcx)
3523 ; AVX512F-NEXT:    vmovdqa %ymm1, (%rcx)
3524 ; AVX512F-NEXT:    vzeroupper
3525 ; AVX512F-NEXT:    retq
3527 ; AVX512DQ-LABEL: vec384_i16_widen_to_i32_factor2_broadcast_to_v12i32_factor12:
3528 ; AVX512DQ:       # %bb.0:
3529 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
3530 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
3531 ; AVX512DQ-NEXT:    vmovdqa 48(%rdi), %xmm1
3532 ; AVX512DQ-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3533 ; AVX512DQ-NEXT:    vpbroadcastw %xmm0, %ymm2
3534 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} ymm1 = ymm2[0],ymm1[1],ymm2[2],ymm1[3],ymm2[4],ymm1[5],ymm2[6],ymm1[7],ymm2[8],ymm1[9],ymm2[10],ymm1[11],ymm2[12],ymm1[13],ymm2[14],ymm1[15]
3535 ; AVX512DQ-NEXT:    vpbroadcastw %xmm0, %ymm0
3536 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3537 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3538 ; AVX512DQ-NEXT:    vmovdqa %ymm0, 32(%rcx)
3539 ; AVX512DQ-NEXT:    vmovdqa %ymm1, (%rcx)
3540 ; AVX512DQ-NEXT:    vzeroupper
3541 ; AVX512DQ-NEXT:    retq
3543 ; AVX512BW-LABEL: vec384_i16_widen_to_i32_factor2_broadcast_to_v12i32_factor12:
3544 ; AVX512BW:       # %bb.0:
3545 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
3546 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
3547 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
3548 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,25,0,27,0,29,0,31]
3549 ; AVX512BW-NEXT:    vpermi2w %ymm1, %ymm0, %ymm2
3550 ; AVX512BW-NEXT:    vpbroadcastw %xmm0, %ymm0
3551 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm2, %zmm0
3552 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
3553 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
3554 ; AVX512BW-NEXT:    vzeroupper
3555 ; AVX512BW-NEXT:    retq
3556   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
3557   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
3558   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
3559   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
3560   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <24 x i32> <i32 0, i32 25, i32 0, i32 27, i32 0, i32 29, i32 0, i32 31, i32 0, i32 33, i32 0, i32 35, i32 0, i32 37, i32 0, i32 39, i32 0, i32 41, i32 0, i32 43, i32 0, i32 45, i32 0, i32 47>
3561   %out.bytevec = bitcast <24 x i16> %broadcast.of.aextinreg to <48 x i8>
3562   %out.bytevec.padded = shufflevector <48 x i8> %out.bytevec, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
3563   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
3564   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
3565   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
3566   ret void
3569 define void @vec384_i16_widen_to_i48_factor3_broadcast_to_v8i48_factor8(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
3570 ; SSE2-LABEL: vec384_i16_widen_to_i48_factor3_broadcast_to_v8i48_factor8:
3571 ; SSE2:       # %bb.0:
3572 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3573 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
3574 ; SSE2-NEXT:    paddb (%rsi), %xmm0
3575 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
3576 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,65535,65535,0,65535,65535,0,65535]
3577 ; SSE2-NEXT:    pand %xmm2, %xmm1
3578 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
3579 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
3580 ; SSE2-NEXT:    pandn %xmm0, %xmm2
3581 ; SSE2-NEXT:    por %xmm1, %xmm2
3582 ; SSE2-NEXT:    paddb (%rdx), %xmm2
3583 ; SSE2-NEXT:    movdqa 16(%rdx), %xmm1
3584 ; SSE2-NEXT:    paddb %xmm0, %xmm1
3585 ; SSE2-NEXT:    paddb 32(%rdx), %xmm0
3586 ; SSE2-NEXT:    movdqa %xmm0, 32(%rcx)
3587 ; SSE2-NEXT:    movdqa %xmm1, 16(%rcx)
3588 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
3589 ; SSE2-NEXT:    retq
3591 ; SSE42-LABEL: vec384_i16_widen_to_i48_factor3_broadcast_to_v8i48_factor8:
3592 ; SSE42:       # %bb.0:
3593 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
3594 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
3595 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
3596 ; SSE42-NEXT:    paddb (%rsi), %xmm0
3597 ; SSE42-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
3598 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
3599 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2],xmm0[3],xmm1[4,5],xmm0[6],xmm1[7]
3600 ; SSE42-NEXT:    paddb (%rdx), %xmm1
3601 ; SSE42-NEXT:    movdqa 16(%rdx), %xmm2
3602 ; SSE42-NEXT:    paddb %xmm0, %xmm2
3603 ; SSE42-NEXT:    paddb 32(%rdx), %xmm0
3604 ; SSE42-NEXT:    movdqa %xmm0, 32(%rcx)
3605 ; SSE42-NEXT:    movdqa %xmm2, 16(%rcx)
3606 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
3607 ; SSE42-NEXT:    retq
3609 ; AVX-LABEL: vec384_i16_widen_to_i48_factor3_broadcast_to_v8i48_factor8:
3610 ; AVX:       # %bb.0:
3611 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
3612 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
3613 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3614 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3615 ; AVX-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
3616 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
3617 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2],xmm0[3],xmm1[4,5],xmm0[6],xmm1[7]
3618 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
3619 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm2
3620 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
3621 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
3622 ; AVX-NEXT:    vmovdqa %xmm2, 32(%rcx)
3623 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
3624 ; AVX-NEXT:    retq
3626 ; AVX2-LABEL: vec384_i16_widen_to_i48_factor3_broadcast_to_v8i48_factor8:
3627 ; AVX2:       # %bb.0:
3628 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
3629 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
3630 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3631 ; AVX2-NEXT:    vpbroadcastw %xmm0, %xmm0
3632 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3633 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2],xmm0[3],xmm1[4,5],xmm0[6],xmm1[7]
3634 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
3635 ; AVX2-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3636 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3637 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rcx)
3638 ; AVX2-NEXT:    vmovdqa %ymm1, (%rcx)
3639 ; AVX2-NEXT:    vzeroupper
3640 ; AVX2-NEXT:    retq
3642 ; AVX512F-LABEL: vec384_i16_widen_to_i48_factor3_broadcast_to_v8i48_factor8:
3643 ; AVX512F:       # %bb.0:
3644 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
3645 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm1
3646 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3647 ; AVX512F-NEXT:    vpbroadcastw %xmm0, %ymm0
3648 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
3649 ; AVX512F-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3650 ; AVX512F-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2],xmm0[3],xmm1[4,5],xmm0[6],xmm1[7]
3651 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
3652 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3653 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3654 ; AVX512F-NEXT:    vmovdqa %ymm0, 32(%rcx)
3655 ; AVX512F-NEXT:    vmovdqa %ymm1, (%rcx)
3656 ; AVX512F-NEXT:    vzeroupper
3657 ; AVX512F-NEXT:    retq
3659 ; AVX512DQ-LABEL: vec384_i16_widen_to_i48_factor3_broadcast_to_v8i48_factor8:
3660 ; AVX512DQ:       # %bb.0:
3661 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
3662 ; AVX512DQ-NEXT:    vmovdqa 48(%rdi), %xmm1
3663 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3664 ; AVX512DQ-NEXT:    vpbroadcastw %xmm0, %ymm0
3665 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
3666 ; AVX512DQ-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3667 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2],xmm0[3],xmm1[4,5],xmm0[6],xmm1[7]
3668 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
3669 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3670 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3671 ; AVX512DQ-NEXT:    vmovdqa %ymm0, 32(%rcx)
3672 ; AVX512DQ-NEXT:    vmovdqa %ymm1, (%rcx)
3673 ; AVX512DQ-NEXT:    vzeroupper
3674 ; AVX512DQ-NEXT:    retq
3676 ; AVX512BW-LABEL: vec384_i16_widen_to_i48_factor3_broadcast_to_v8i48_factor8:
3677 ; AVX512BW:       # %bb.0:
3678 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
3679 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
3680 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
3681 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,25,26,0,28,29,0,31]
3682 ; AVX512BW-NEXT:    vpermi2w %ymm1, %ymm0, %ymm2
3683 ; AVX512BW-NEXT:    vpbroadcastw %xmm0, %xmm0
3684 ; AVX512BW-NEXT:    vinserti32x4 $2, %xmm0, %zmm2, %zmm0
3685 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
3686 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
3687 ; AVX512BW-NEXT:    vzeroupper
3688 ; AVX512BW-NEXT:    retq
3689   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
3690   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
3691   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
3692   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
3693   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <24 x i32> <i32 0, i32 25, i32 26, i32 0, i32 28, i32 29, i32 0, i32 31, i32 32, i32 0, i32 34, i32 35, i32 0, i32 37, i32 38, i32 0, i32 40, i32 41, i32 0, i32 43, i32 44, i32 0, i32 46, i32 47>
3694   %out.bytevec = bitcast <24 x i16> %broadcast.of.aextinreg to <48 x i8>
3695   %out.bytevec.padded = shufflevector <48 x i8> %out.bytevec, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
3696   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
3697   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
3698   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
3699   ret void
3702 define void @vec384_i16_widen_to_i64_factor4_broadcast_to_v6i64_factor6(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
3703 ; SSE2-LABEL: vec384_i16_widen_to_i64_factor4_broadcast_to_v6i64_factor6:
3704 ; SSE2:       # %bb.0:
3705 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3706 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
3707 ; SSE2-NEXT:    paddb (%rsi), %xmm0
3708 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
3709 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,65535,65535,65535,0,65535,65535,65535]
3710 ; SSE2-NEXT:    pand %xmm2, %xmm1
3711 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
3712 ; SSE2-NEXT:    pandn %xmm0, %xmm2
3713 ; SSE2-NEXT:    por %xmm1, %xmm2
3714 ; SSE2-NEXT:    paddb (%rdx), %xmm2
3715 ; SSE2-NEXT:    movdqa 16(%rdx), %xmm1
3716 ; SSE2-NEXT:    paddb %xmm0, %xmm1
3717 ; SSE2-NEXT:    paddb 32(%rdx), %xmm0
3718 ; SSE2-NEXT:    movdqa %xmm0, 32(%rcx)
3719 ; SSE2-NEXT:    movdqa %xmm1, 16(%rcx)
3720 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
3721 ; SSE2-NEXT:    retq
3723 ; SSE42-LABEL: vec384_i16_widen_to_i64_factor4_broadcast_to_v6i64_factor6:
3724 ; SSE42:       # %bb.0:
3725 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
3726 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
3727 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
3728 ; SSE42-NEXT:    paddb (%rsi), %xmm0
3729 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
3730 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
3731 ; SSE42-NEXT:    paddb (%rdx), %xmm1
3732 ; SSE42-NEXT:    movdqa 16(%rdx), %xmm2
3733 ; SSE42-NEXT:    paddb %xmm0, %xmm2
3734 ; SSE42-NEXT:    paddb 32(%rdx), %xmm0
3735 ; SSE42-NEXT:    movdqa %xmm0, 32(%rcx)
3736 ; SSE42-NEXT:    movdqa %xmm2, 16(%rcx)
3737 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
3738 ; SSE42-NEXT:    retq
3740 ; AVX-LABEL: vec384_i16_widen_to_i64_factor4_broadcast_to_v6i64_factor6:
3741 ; AVX:       # %bb.0:
3742 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
3743 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
3744 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3745 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3746 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
3747 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
3748 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
3749 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm2
3750 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
3751 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
3752 ; AVX-NEXT:    vmovdqa %xmm2, 32(%rcx)
3753 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
3754 ; AVX-NEXT:    retq
3756 ; AVX2-LABEL: vec384_i16_widen_to_i64_factor4_broadcast_to_v6i64_factor6:
3757 ; AVX2:       # %bb.0:
3758 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
3759 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
3760 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3761 ; AVX2-NEXT:    vpbroadcastw %xmm0, %xmm2
3762 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3763 ; AVX2-NEXT:    vpbroadcastq %xmm0, %ymm0
3764 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7],ymm0[8],ymm1[9,10,11],ymm0[12],ymm1[13,14,15]
3765 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
3766 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm2, %ymm1
3767 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
3768 ; AVX2-NEXT:    vmovdqa %ymm1, 32(%rcx)
3769 ; AVX2-NEXT:    vzeroupper
3770 ; AVX2-NEXT:    retq
3772 ; AVX512F-LABEL: vec384_i16_widen_to_i64_factor4_broadcast_to_v6i64_factor6:
3773 ; AVX512F:       # %bb.0:
3774 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
3775 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
3776 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm1
3777 ; AVX512F-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3778 ; AVX512F-NEXT:    vpbroadcastq %xmm0, %ymm2
3779 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm1 = ymm2[0],ymm1[1,2,3],ymm2[4],ymm1[5,6,7],ymm2[8],ymm1[9,10,11],ymm2[12],ymm1[13,14,15]
3780 ; AVX512F-NEXT:    vpbroadcastw %xmm0, %ymm0
3781 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3782 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3783 ; AVX512F-NEXT:    vmovdqa %ymm0, 32(%rcx)
3784 ; AVX512F-NEXT:    vmovdqa %ymm1, (%rcx)
3785 ; AVX512F-NEXT:    vzeroupper
3786 ; AVX512F-NEXT:    retq
3788 ; AVX512DQ-LABEL: vec384_i16_widen_to_i64_factor4_broadcast_to_v6i64_factor6:
3789 ; AVX512DQ:       # %bb.0:
3790 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
3791 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
3792 ; AVX512DQ-NEXT:    vmovdqa 48(%rdi), %xmm1
3793 ; AVX512DQ-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3794 ; AVX512DQ-NEXT:    vpbroadcastq %xmm0, %ymm2
3795 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} ymm1 = ymm2[0],ymm1[1,2,3],ymm2[4],ymm1[5,6,7],ymm2[8],ymm1[9,10,11],ymm2[12],ymm1[13,14,15]
3796 ; AVX512DQ-NEXT:    vpbroadcastw %xmm0, %ymm0
3797 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3798 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3799 ; AVX512DQ-NEXT:    vmovdqa %ymm0, 32(%rcx)
3800 ; AVX512DQ-NEXT:    vmovdqa %ymm1, (%rcx)
3801 ; AVX512DQ-NEXT:    vzeroupper
3802 ; AVX512DQ-NEXT:    retq
3804 ; AVX512BW-LABEL: vec384_i16_widen_to_i64_factor4_broadcast_to_v6i64_factor6:
3805 ; AVX512BW:       # %bb.0:
3806 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
3807 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
3808 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
3809 ; AVX512BW-NEXT:    vbroadcasti128 {{.*#+}} ymm2 = [16,9,10,11,16,13,14,15,16,9,10,11,16,13,14,15]
3810 ; AVX512BW-NEXT:    # ymm2 = mem[0,1,0,1]
3811 ; AVX512BW-NEXT:    vpermi2w %ymm0, %ymm1, %ymm2
3812 ; AVX512BW-NEXT:    vpbroadcastw %xmm0, %ymm0
3813 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm2, %zmm0
3814 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
3815 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
3816 ; AVX512BW-NEXT:    vzeroupper
3817 ; AVX512BW-NEXT:    retq
3818   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
3819   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
3820   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
3821   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
3822   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <24 x i32> <i32 0, i32 25, i32 26, i32 27, i32 0, i32 29, i32 30, i32 31, i32 0, i32 33, i32 34, i32 35, i32 0, i32 37, i32 38, i32 39, i32 0, i32 41, i32 42, i32 43, i32 0, i32 45, i32 46, i32 47>
3823   %out.bytevec = bitcast <24 x i16> %broadcast.of.aextinreg to <48 x i8>
3824   %out.bytevec.padded = shufflevector <48 x i8> %out.bytevec, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
3825   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
3826   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
3827   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
3828   ret void
3831 define void @vec384_i16_widen_to_i96_factor6_broadcast_to_v4i96_factor4(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
3832 ; SSE2-LABEL: vec384_i16_widen_to_i96_factor6_broadcast_to_v4i96_factor4:
3833 ; SSE2:       # %bb.0:
3834 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3835 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
3836 ; SSE2-NEXT:    paddb (%rsi), %xmm0
3837 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
3838 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,65535,65535,65535,65535,65535,0,65535]
3839 ; SSE2-NEXT:    pand %xmm2, %xmm1
3840 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
3841 ; SSE2-NEXT:    pandn %xmm3, %xmm2
3842 ; SSE2-NEXT:    por %xmm1, %xmm2
3843 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,1]
3844 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
3845 ; SSE2-NEXT:    paddb (%rdx), %xmm2
3846 ; SSE2-NEXT:    paddb 16(%rdx), %xmm0
3847 ; SSE2-NEXT:    paddb 32(%rdx), %xmm1
3848 ; SSE2-NEXT:    movdqa %xmm1, 32(%rcx)
3849 ; SSE2-NEXT:    movdqa %xmm0, 16(%rcx)
3850 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
3851 ; SSE2-NEXT:    retq
3853 ; SSE42-LABEL: vec384_i16_widen_to_i96_factor6_broadcast_to_v4i96_factor4:
3854 ; SSE42:       # %bb.0:
3855 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
3856 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
3857 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
3858 ; SSE42-NEXT:    paddb (%rsi), %xmm0
3859 ; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,0,0]
3860 ; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0],xmm1[1,2,3,4,5],xmm2[6],xmm1[7]
3861 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,1]
3862 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
3863 ; SSE42-NEXT:    paddb (%rdx), %xmm2
3864 ; SSE42-NEXT:    paddb 16(%rdx), %xmm0
3865 ; SSE42-NEXT:    paddb 32(%rdx), %xmm1
3866 ; SSE42-NEXT:    movdqa %xmm1, 32(%rcx)
3867 ; SSE42-NEXT:    movdqa %xmm0, 16(%rcx)
3868 ; SSE42-NEXT:    movdqa %xmm2, (%rcx)
3869 ; SSE42-NEXT:    retq
3871 ; AVX-LABEL: vec384_i16_widen_to_i96_factor6_broadcast_to_v4i96_factor4:
3872 ; AVX:       # %bb.0:
3873 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
3874 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
3875 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3876 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3877 ; AVX-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[0,0,1,1]
3878 ; AVX-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
3879 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3,4,5],xmm3[6],xmm1[7]
3880 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
3881 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
3882 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm2, %xmm2
3883 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
3884 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
3885 ; AVX-NEXT:    vmovdqa %xmm2, 32(%rcx)
3886 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
3887 ; AVX-NEXT:    retq
3889 ; AVX2-LABEL: vec384_i16_widen_to_i96_factor6_broadcast_to_v4i96_factor4:
3890 ; AVX2:       # %bb.0:
3891 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
3892 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
3893 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3894 ; AVX2-NEXT:    vpbroadcastw %xmm0, %xmm0
3895 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3896 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5],xmm0[6],xmm1[7]
3897 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
3898 ; AVX2-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3899 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3900 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rcx)
3901 ; AVX2-NEXT:    vmovdqa %ymm1, (%rcx)
3902 ; AVX2-NEXT:    vzeroupper
3903 ; AVX2-NEXT:    retq
3905 ; AVX512F-LABEL: vec384_i16_widen_to_i96_factor6_broadcast_to_v4i96_factor4:
3906 ; AVX512F:       # %bb.0:
3907 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
3908 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm1
3909 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3910 ; AVX512F-NEXT:    vpbroadcastw %xmm0, %ymm0
3911 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
3912 ; AVX512F-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3913 ; AVX512F-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5],xmm0[6],xmm1[7]
3914 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
3915 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3916 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3917 ; AVX512F-NEXT:    vmovdqa %ymm0, 32(%rcx)
3918 ; AVX512F-NEXT:    vmovdqa %ymm1, (%rcx)
3919 ; AVX512F-NEXT:    vzeroupper
3920 ; AVX512F-NEXT:    retq
3922 ; AVX512DQ-LABEL: vec384_i16_widen_to_i96_factor6_broadcast_to_v4i96_factor4:
3923 ; AVX512DQ:       # %bb.0:
3924 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
3925 ; AVX512DQ-NEXT:    vmovdqa 48(%rdi), %xmm1
3926 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
3927 ; AVX512DQ-NEXT:    vpbroadcastw %xmm0, %ymm0
3928 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
3929 ; AVX512DQ-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
3930 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5],xmm0[6],xmm1[7]
3931 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm1
3932 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
3933 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
3934 ; AVX512DQ-NEXT:    vmovdqa %ymm0, 32(%rcx)
3935 ; AVX512DQ-NEXT:    vmovdqa %ymm1, (%rcx)
3936 ; AVX512DQ-NEXT:    vzeroupper
3937 ; AVX512DQ-NEXT:    retq
3939 ; AVX512BW-LABEL: vec384_i16_widen_to_i96_factor6_broadcast_to_v4i96_factor4:
3940 ; AVX512BW:       # %bb.0:
3941 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
3942 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
3943 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
3944 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [16,9,10,11,12,13,16,15,u,u,u,u,16,u,u,u]
3945 ; AVX512BW-NEXT:    vpermi2w %ymm0, %ymm1, %ymm2
3946 ; AVX512BW-NEXT:    vpbroadcastw %xmm0, %ymm0
3947 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm2, %zmm0
3948 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
3949 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
3950 ; AVX512BW-NEXT:    vzeroupper
3951 ; AVX512BW-NEXT:    retq
3952   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
3953   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
3954   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
3955   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
3956   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <24 x i32> <i32 0, i32 25, i32 26, i32 27, i32 28, i32 29, i32 0, i32 31, i32 32, i32 33, i32 34, i32 35, i32 0, i32 37, i32 38, i32 39, i32 40, i32 41, i32 0, i32 43, i32 44, i32 45, i32 46, i32 47>
3957   %out.bytevec = bitcast <24 x i16> %broadcast.of.aextinreg to <48 x i8>
3958   %out.bytevec.padded = shufflevector <48 x i8> %out.bytevec, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
3959   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
3960   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
3961   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
3962   ret void
3965 define void @vec384_i16_widen_to_i128_factor8_broadcast_to_v3i128_factor3(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
3966 ; SSE2-LABEL: vec384_i16_widen_to_i128_factor8_broadcast_to_v3i128_factor3:
3967 ; SSE2:       # %bb.0:
3968 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3969 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
3970 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
3971 ; SSE2-NEXT:    paddb (%rsi), %xmm0
3972 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,65535,65535,65535,65535,65535,65535,65535]
3973 ; SSE2-NEXT:    pand %xmm2, %xmm1
3974 ; SSE2-NEXT:    pandn %xmm0, %xmm2
3975 ; SSE2-NEXT:    por %xmm1, %xmm2
3976 ; SSE2-NEXT:    paddb (%rdx), %xmm2
3977 ; SSE2-NEXT:    movdqa 16(%rdx), %xmm1
3978 ; SSE2-NEXT:    paddb %xmm0, %xmm1
3979 ; SSE2-NEXT:    paddb 32(%rdx), %xmm0
3980 ; SSE2-NEXT:    movdqa %xmm0, 32(%rcx)
3981 ; SSE2-NEXT:    movdqa %xmm1, 16(%rcx)
3982 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
3983 ; SSE2-NEXT:    retq
3985 ; SSE42-LABEL: vec384_i16_widen_to_i128_factor8_broadcast_to_v3i128_factor3:
3986 ; SSE42:       # %bb.0:
3987 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
3988 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
3989 ; SSE42-NEXT:    paddb (%rsi), %xmm0
3990 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
3991 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]
3992 ; SSE42-NEXT:    paddb (%rdx), %xmm1
3993 ; SSE42-NEXT:    movdqa 16(%rdx), %xmm2
3994 ; SSE42-NEXT:    paddb %xmm0, %xmm2
3995 ; SSE42-NEXT:    paddb 32(%rdx), %xmm0
3996 ; SSE42-NEXT:    movdqa %xmm0, 32(%rcx)
3997 ; SSE42-NEXT:    movdqa %xmm2, 16(%rcx)
3998 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
3999 ; SSE42-NEXT:    retq
4001 ; AVX-LABEL: vec384_i16_widen_to_i128_factor8_broadcast_to_v3i128_factor3:
4002 ; AVX:       # %bb.0:
4003 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
4004 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
4005 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm2
4006 ; AVX-NEXT:    vpaddb 16(%rsi), %xmm1, %xmm1
4007 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
4008 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm2, %xmm2
4009 ; AVX-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3,4,5,6,7]
4010 ; AVX-NEXT:    vpaddb (%rdx), %xmm2, %xmm2
4011 ; AVX-NEXT:    vpaddb 48(%rdx), %xmm1, %xmm1
4012 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm3
4013 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
4014 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
4015 ; AVX-NEXT:    vmovdqa %xmm3, 32(%rcx)
4016 ; AVX-NEXT:    vmovdqa %xmm1, 48(%rcx)
4017 ; AVX-NEXT:    vmovdqa %xmm2, (%rcx)
4018 ; AVX-NEXT:    retq
4020 ; AVX2-LABEL: vec384_i16_widen_to_i128_factor8_broadcast_to_v3i128_factor3:
4021 ; AVX2:       # %bb.0:
4022 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4023 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4024 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
4025 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
4026 ; AVX2-NEXT:    vpermq {{.*#+}} ymm2 = ymm0[0,1,0,1]
4027 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm1 = ymm2[0],ymm1[1,2,3,4,5,6,7],ymm2[8],ymm1[9,10,11,12,13,14,15]
4028 ; AVX2-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
4029 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
4030 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rcx)
4031 ; AVX2-NEXT:    vmovdqa %ymm1, (%rcx)
4032 ; AVX2-NEXT:    vzeroupper
4033 ; AVX2-NEXT:    retq
4035 ; AVX512F-LABEL: vec384_i16_widen_to_i128_factor8_broadcast_to_v3i128_factor3:
4036 ; AVX512F:       # %bb.0:
4037 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
4038 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4039 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm1
4040 ; AVX512F-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
4041 ; AVX512F-NEXT:    vpermq {{.*#+}} ymm2 = ymm0[0,1,0,1]
4042 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm1 = ymm2[0],ymm1[1,2,3,4,5,6,7],ymm2[8],ymm1[9,10,11,12,13,14,15]
4043 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
4044 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
4045 ; AVX512F-NEXT:    vmovdqa %ymm0, 32(%rcx)
4046 ; AVX512F-NEXT:    vmovdqa %ymm1, (%rcx)
4047 ; AVX512F-NEXT:    vzeroupper
4048 ; AVX512F-NEXT:    retq
4050 ; AVX512DQ-LABEL: vec384_i16_widen_to_i128_factor8_broadcast_to_v3i128_factor3:
4051 ; AVX512DQ:       # %bb.0:
4052 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
4053 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4054 ; AVX512DQ-NEXT:    vmovdqa 48(%rdi), %xmm1
4055 ; AVX512DQ-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
4056 ; AVX512DQ-NEXT:    vpermq {{.*#+}} ymm2 = ymm0[0,1,0,1]
4057 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} ymm1 = ymm2[0],ymm1[1,2,3,4,5,6,7],ymm2[8],ymm1[9,10,11,12,13,14,15]
4058 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
4059 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
4060 ; AVX512DQ-NEXT:    vmovdqa %ymm0, 32(%rcx)
4061 ; AVX512DQ-NEXT:    vmovdqa %ymm1, (%rcx)
4062 ; AVX512DQ-NEXT:    vzeroupper
4063 ; AVX512DQ-NEXT:    retq
4065 ; AVX512BW-LABEL: vec384_i16_widen_to_i128_factor8_broadcast_to_v3i128_factor3:
4066 ; AVX512BW:       # %bb.0:
4067 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
4068 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
4069 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
4070 ; AVX512BW-NEXT:    vbroadcasti128 {{.*#+}} ymm2 = [16,9,10,11,12,13,14,15,16,9,10,11,12,13,14,15]
4071 ; AVX512BW-NEXT:    # ymm2 = mem[0,1,0,1]
4072 ; AVX512BW-NEXT:    vpermi2w %ymm0, %ymm1, %ymm2
4073 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm2, %zmm0
4074 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
4075 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
4076 ; AVX512BW-NEXT:    vzeroupper
4077 ; AVX512BW-NEXT:    retq
4078   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
4079   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
4080   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
4081   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
4082   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <24 x i32> <i32 0, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 0, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 0, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47>
4083   %out.bytevec = bitcast <24 x i16> %broadcast.of.aextinreg to <48 x i8>
4084   %out.bytevec.padded = shufflevector <48 x i8> %out.bytevec, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
4085   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
4086   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
4087   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
4088   ret void
4091 define void @vec384_i16_widen_to_i192_factor12_broadcast_to_v2i192_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
4092 ; SSE2-LABEL: vec384_i16_widen_to_i192_factor12_broadcast_to_v2i192_factor2:
4093 ; SSE2:       # %bb.0:
4094 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
4095 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
4096 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
4097 ; SSE2-NEXT:    paddb (%rsi), %xmm0
4098 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,65535,65535,65535,65535,65535,65535,65535]
4099 ; SSE2-NEXT:    pand %xmm2, %xmm1
4100 ; SSE2-NEXT:    pandn %xmm0, %xmm2
4101 ; SSE2-NEXT:    por %xmm1, %xmm2
4102 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
4103 ; SSE2-NEXT:    paddb (%rdx), %xmm2
4104 ; SSE2-NEXT:    paddb 16(%rdx), %xmm0
4105 ; SSE2-NEXT:    movdqa %xmm0, 16(%rcx)
4106 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
4107 ; SSE2-NEXT:    retq
4109 ; SSE42-LABEL: vec384_i16_widen_to_i192_factor12_broadcast_to_v2i192_factor2:
4110 ; SSE42:       # %bb.0:
4111 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
4112 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
4113 ; SSE42-NEXT:    paddb (%rsi), %xmm0
4114 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
4115 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]
4116 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
4117 ; SSE42-NEXT:    paddb (%rdx), %xmm1
4118 ; SSE42-NEXT:    paddb 16(%rdx), %xmm0
4119 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
4120 ; SSE42-NEXT:    movdqa %xmm0, 16(%rcx)
4121 ; SSE42-NEXT:    retq
4123 ; AVX-LABEL: vec384_i16_widen_to_i192_factor12_broadcast_to_v2i192_factor2:
4124 ; AVX:       # %bb.0:
4125 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
4126 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
4127 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
4128 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
4129 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]
4130 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
4131 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
4132 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
4133 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
4134 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
4135 ; AVX-NEXT:    retq
4137 ; AVX2-LABEL: vec384_i16_widen_to_i192_factor12_broadcast_to_v2i192_factor2:
4138 ; AVX2:       # %bb.0:
4139 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
4140 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
4141 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
4142 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
4143 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]
4144 ; AVX2-NEXT:    vpbroadcastw %xmm0, %xmm0
4145 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
4146 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4147 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
4148 ; AVX2-NEXT:    vzeroupper
4149 ; AVX2-NEXT:    retq
4151 ; AVX512F-LABEL: vec384_i16_widen_to_i192_factor12_broadcast_to_v2i192_factor2:
4152 ; AVX512F:       # %bb.0:
4153 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
4154 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4155 ; AVX512F-NEXT:    vmovdqa 48(%rdi), %xmm1
4156 ; AVX512F-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
4157 ; AVX512F-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]
4158 ; AVX512F-NEXT:    vpbroadcastw %xmm0, %xmm0
4159 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
4160 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4161 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
4162 ; AVX512F-NEXT:    vzeroupper
4163 ; AVX512F-NEXT:    retq
4165 ; AVX512DQ-LABEL: vec384_i16_widen_to_i192_factor12_broadcast_to_v2i192_factor2:
4166 ; AVX512DQ:       # %bb.0:
4167 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
4168 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4169 ; AVX512DQ-NEXT:    vmovdqa 48(%rdi), %xmm1
4170 ; AVX512DQ-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
4171 ; AVX512DQ-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]
4172 ; AVX512DQ-NEXT:    vpbroadcastw %xmm0, %xmm0
4173 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
4174 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4175 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
4176 ; AVX512DQ-NEXT:    vzeroupper
4177 ; AVX512DQ-NEXT:    retq
4179 ; AVX512BW-LABEL: vec384_i16_widen_to_i192_factor12_broadcast_to_v2i192_factor2:
4180 ; AVX512BW:       # %bb.0:
4181 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
4182 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
4183 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
4184 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [16,9,10,11,12,13,14,15,u,u,u,u,16,u,u,u]
4185 ; AVX512BW-NEXT:    vpermi2w %ymm0, %ymm1, %ymm2
4186 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm2, %zmm0
4187 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
4188 ; AVX512BW-NEXT:    vzeroupper
4189 ; AVX512BW-NEXT:    retq
4190   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
4191   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
4192   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
4193   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
4194   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <24 x i32> <i32 0, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 0, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47>
4195   %out.bytevec = bitcast <24 x i16> %broadcast.of.aextinreg to <48 x i8>
4196   %out.bytevec.padded = shufflevector <48 x i8> %out.bytevec, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
4197   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
4198   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
4199   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
4200   ret void
4203 define void @vec384_i32_widen_to_i64_factor2_broadcast_to_v6i64_factor6(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
4204 ; SSE2-LABEL: vec384_i32_widen_to_i64_factor2_broadcast_to_v6i64_factor6:
4205 ; SSE2:       # %bb.0:
4206 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
4207 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
4208 ; SSE2-NEXT:    paddb (%rsi), %xmm0
4209 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
4210 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
4211 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,1,1]
4212 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
4213 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
4214 ; SSE2-NEXT:    paddb (%rdx), %xmm2
4215 ; SSE2-NEXT:    movdqa 16(%rdx), %xmm1
4216 ; SSE2-NEXT:    paddb %xmm0, %xmm1
4217 ; SSE2-NEXT:    paddb 32(%rdx), %xmm0
4218 ; SSE2-NEXT:    movdqa %xmm0, 32(%rcx)
4219 ; SSE2-NEXT:    movdqa %xmm1, 16(%rcx)
4220 ; SSE2-NEXT:    movdqa %xmm2, (%rcx)
4221 ; SSE2-NEXT:    retq
4223 ; SSE42-LABEL: vec384_i32_widen_to_i64_factor2_broadcast_to_v6i64_factor6:
4224 ; SSE42:       # %bb.0:
4225 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
4226 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
4227 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
4228 ; SSE42-NEXT:    paddb (%rsi), %xmm0
4229 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
4230 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
4231 ; SSE42-NEXT:    paddb (%rdx), %xmm1
4232 ; SSE42-NEXT:    movdqa 16(%rdx), %xmm2
4233 ; SSE42-NEXT:    paddb %xmm0, %xmm2
4234 ; SSE42-NEXT:    paddb 32(%rdx), %xmm0
4235 ; SSE42-NEXT:    movdqa %xmm0, 32(%rcx)
4236 ; SSE42-NEXT:    movdqa %xmm2, 16(%rcx)
4237 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
4238 ; SSE42-NEXT:    retq
4240 ; AVX-LABEL: vec384_i32_widen_to_i64_factor2_broadcast_to_v6i64_factor6:
4241 ; AVX:       # %bb.0:
4242 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
4243 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
4244 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
4245 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
4246 ; AVX-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[0,1,0,1]
4247 ; AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
4248 ; AVX-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,0],ymm1[1,3],ymm0[4,4],ymm1[5,7]
4249 ; AVX-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]
4250 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
4251 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm1, %xmm1
4252 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
4253 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm2, %xmm2
4254 ; AVX-NEXT:    vmovdqa %xmm2, 32(%rcx)
4255 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
4256 ; AVX-NEXT:    vmovdqa %xmm1, 16(%rcx)
4257 ; AVX-NEXT:    vzeroupper
4258 ; AVX-NEXT:    retq
4260 ; AVX2-LABEL: vec384_i32_widen_to_i64_factor2_broadcast_to_v6i64_factor6:
4261 ; AVX2:       # %bb.0:
4262 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
4263 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
4264 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
4265 ; AVX2-NEXT:    vpbroadcastd %xmm0, %xmm2
4266 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
4267 ; AVX2-NEXT:    vpbroadcastq %xmm0, %ymm0
4268 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4,5,6,7]
4269 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4270 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm2, %ymm1
4271 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
4272 ; AVX2-NEXT:    vmovdqa %ymm1, 32(%rcx)
4273 ; AVX2-NEXT:    vzeroupper
4274 ; AVX2-NEXT:    retq
4276 ; AVX512F-LABEL: vec384_i32_widen_to_i64_factor2_broadcast_to_v6i64_factor6:
4277 ; AVX512F:       # %bb.0:
4278 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
4279 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm1
4280 ; AVX512F-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4281 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4282 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
4283 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,13,0,15]
4284 ; AVX512F-NEXT:    vpermd %zmm0, %zmm1, %zmm0
4285 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
4286 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm1, %ymm1
4287 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4288 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
4289 ; AVX512F-NEXT:    vmovdqa %ymm1, 32(%rcx)
4290 ; AVX512F-NEXT:    vzeroupper
4291 ; AVX512F-NEXT:    retq
4293 ; AVX512DQ-LABEL: vec384_i32_widen_to_i64_factor2_broadcast_to_v6i64_factor6:
4294 ; AVX512DQ:       # %bb.0:
4295 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
4296 ; AVX512DQ-NEXT:    vmovdqa 32(%rdi), %ymm1
4297 ; AVX512DQ-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4298 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4299 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
4300 ; AVX512DQ-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,13,0,15]
4301 ; AVX512DQ-NEXT:    vpermd %zmm0, %zmm1, %zmm0
4302 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
4303 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm1, %ymm1
4304 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4305 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
4306 ; AVX512DQ-NEXT:    vmovdqa %ymm1, 32(%rcx)
4307 ; AVX512DQ-NEXT:    vzeroupper
4308 ; AVX512DQ-NEXT:    retq
4310 ; AVX512BW-LABEL: vec384_i32_widen_to_i64_factor2_broadcast_to_v6i64_factor6:
4311 ; AVX512BW:       # %bb.0:
4312 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
4313 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
4314 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,13,0,15]
4315 ; AVX512BW-NEXT:    vpermd %zmm0, %zmm1, %zmm0
4316 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
4317 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
4318 ; AVX512BW-NEXT:    vzeroupper
4319 ; AVX512BW-NEXT:    retq
4320   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
4321   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
4322   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
4323   %in.vec.cast = bitcast <64 x i8> %in.vec to <16 x i32>
4324   %broadcast.of.aextinreg = shufflevector <16 x i32> %in.vec.cast, <16 x i32> poison, <12 x i32> <i32 0, i32 13, i32 0, i32 15, i32 0, i32 17, i32 0, i32 19, i32 0, i32 21, i32 0, i32 23>
4325   %out.bytevec = bitcast <12 x i32> %broadcast.of.aextinreg to <48 x i8>
4326   %out.bytevec.padded = shufflevector <48 x i8> %out.bytevec, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
4327   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
4328   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
4329   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
4330   ret void
4333 define void @vec384_i32_widen_to_i96_factor3_broadcast_to_v4i96_factor4(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
4334 ; SSE2-LABEL: vec384_i32_widen_to_i96_factor3_broadcast_to_v4i96_factor4:
4335 ; SSE2:       # %bb.0:
4336 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
4337 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
4338 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
4339 ; SSE2-NEXT:    paddb (%rsi), %xmm0
4340 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,1,1]
4341 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,1,0,1]
4342 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[1,2]
4343 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
4344 ; SSE2-NEXT:    paddb (%rdx), %xmm0
4345 ; SSE2-NEXT:    paddb 16(%rdx), %xmm3
4346 ; SSE2-NEXT:    paddb 32(%rdx), %xmm2
4347 ; SSE2-NEXT:    movdqa %xmm2, 32(%rcx)
4348 ; SSE2-NEXT:    movdqa %xmm3, 16(%rcx)
4349 ; SSE2-NEXT:    movdqa %xmm0, (%rcx)
4350 ; SSE2-NEXT:    retq
4352 ; SSE42-LABEL: vec384_i32_widen_to_i96_factor3_broadcast_to_v4i96_factor4:
4353 ; SSE42:       # %bb.0:
4354 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
4355 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
4356 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
4357 ; SSE42-NEXT:    paddb (%rsi), %xmm0
4358 ; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,0,0]
4359 ; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3,4,5],xmm2[6,7]
4360 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,1]
4361 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
4362 ; SSE42-NEXT:    paddb (%rdx), %xmm2
4363 ; SSE42-NEXT:    paddb 16(%rdx), %xmm0
4364 ; SSE42-NEXT:    paddb 32(%rdx), %xmm1
4365 ; SSE42-NEXT:    movdqa %xmm1, 32(%rcx)
4366 ; SSE42-NEXT:    movdqa %xmm0, 16(%rcx)
4367 ; SSE42-NEXT:    movdqa %xmm2, (%rcx)
4368 ; SSE42-NEXT:    retq
4370 ; AVX-LABEL: vec384_i32_widen_to_i96_factor3_broadcast_to_v4i96_factor4:
4371 ; AVX:       # %bb.0:
4372 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
4373 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
4374 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
4375 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
4376 ; AVX-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[0,0,1,1]
4377 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
4378 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,2,0]
4379 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
4380 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
4381 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm2, %xmm2
4382 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
4383 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
4384 ; AVX-NEXT:    vmovdqa %xmm2, 32(%rcx)
4385 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
4386 ; AVX-NEXT:    retq
4388 ; AVX2-LABEL: vec384_i32_widen_to_i96_factor3_broadcast_to_v4i96_factor4:
4389 ; AVX2:       # %bb.0:
4390 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4391 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
4392 ; AVX2-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4393 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4394 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[0,0,1,1]
4395 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
4396 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,5,6,0]
4397 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
4398 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4399 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm2, %ymm1
4400 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
4401 ; AVX2-NEXT:    vmovdqa %ymm1, 32(%rcx)
4402 ; AVX2-NEXT:    vzeroupper
4403 ; AVX2-NEXT:    retq
4405 ; AVX512F-LABEL: vec384_i32_widen_to_i96_factor3_broadcast_to_v4i96_factor4:
4406 ; AVX512F:       # %bb.0:
4407 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
4408 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm1
4409 ; AVX512F-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4410 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4411 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
4412 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,13,14,0]
4413 ; AVX512F-NEXT:    vpermd %zmm0, %zmm1, %zmm0
4414 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
4415 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm1, %ymm1
4416 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4417 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
4418 ; AVX512F-NEXT:    vmovdqa %ymm1, 32(%rcx)
4419 ; AVX512F-NEXT:    vzeroupper
4420 ; AVX512F-NEXT:    retq
4422 ; AVX512DQ-LABEL: vec384_i32_widen_to_i96_factor3_broadcast_to_v4i96_factor4:
4423 ; AVX512DQ:       # %bb.0:
4424 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
4425 ; AVX512DQ-NEXT:    vmovdqa 32(%rdi), %ymm1
4426 ; AVX512DQ-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4427 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4428 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
4429 ; AVX512DQ-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,13,14,0]
4430 ; AVX512DQ-NEXT:    vpermd %zmm0, %zmm1, %zmm0
4431 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
4432 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm1, %ymm1
4433 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4434 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
4435 ; AVX512DQ-NEXT:    vmovdqa %ymm1, 32(%rcx)
4436 ; AVX512DQ-NEXT:    vzeroupper
4437 ; AVX512DQ-NEXT:    retq
4439 ; AVX512BW-SLOW-LABEL: vec384_i32_widen_to_i96_factor3_broadcast_to_v4i96_factor4:
4440 ; AVX512BW-SLOW:       # %bb.0:
4441 ; AVX512BW-SLOW-NEXT:    vmovdqa64 (%rdi), %zmm0
4442 ; AVX512BW-SLOW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
4443 ; AVX512BW-SLOW-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,13,14,0]
4444 ; AVX512BW-SLOW-NEXT:    vpermd %zmm0, %zmm1, %zmm1
4445 ; AVX512BW-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
4446 ; AVX512BW-SLOW-NEXT:    vinserti32x4 $2, %xmm0, %zmm1, %zmm0
4447 ; AVX512BW-SLOW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
4448 ; AVX512BW-SLOW-NEXT:    vmovdqa64 %zmm0, (%rcx)
4449 ; AVX512BW-SLOW-NEXT:    vzeroupper
4450 ; AVX512BW-SLOW-NEXT:    retq
4452 ; AVX512BW-FAST-LABEL: vec384_i32_widen_to_i96_factor3_broadcast_to_v4i96_factor4:
4453 ; AVX512BW-FAST:       # %bb.0:
4454 ; AVX512BW-FAST-NEXT:    vmovdqa64 (%rdi), %zmm0
4455 ; AVX512BW-FAST-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
4456 ; AVX512BW-FAST-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,13,14,0]
4457 ; AVX512BW-FAST-NEXT:    vpermd %zmm0, %zmm1, %zmm0
4458 ; AVX512BW-FAST-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
4459 ; AVX512BW-FAST-NEXT:    vmovdqa64 %zmm0, (%rcx)
4460 ; AVX512BW-FAST-NEXT:    vzeroupper
4461 ; AVX512BW-FAST-NEXT:    retq
4462   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
4463   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
4464   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
4465   %in.vec.cast = bitcast <64 x i8> %in.vec to <16 x i32>
4466   %broadcast.of.aextinreg = shufflevector <16 x i32> %in.vec.cast, <16 x i32> poison, <12 x i32> <i32 0, i32 13, i32 14, i32 0, i32 16, i32 17, i32 0, i32 19, i32 20, i32 0, i32 22, i32 23>
4467   %out.bytevec = bitcast <12 x i32> %broadcast.of.aextinreg to <48 x i8>
4468   %out.bytevec.padded = shufflevector <48 x i8> %out.bytevec, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
4469   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
4470   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
4471   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
4472   ret void
4475 define void @vec384_i32_widen_to_i128_factor4_broadcast_to_v3i128_factor3(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
4476 ; SSE2-LABEL: vec384_i32_widen_to_i128_factor4_broadcast_to_v3i128_factor3:
4477 ; SSE2:       # %bb.0:
4478 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
4479 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
4480 ; SSE2-NEXT:    paddb (%rsi), %xmm0
4481 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
4482 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
4483 ; SSE2-NEXT:    paddb (%rdx), %xmm1
4484 ; SSE2-NEXT:    movdqa 16(%rdx), %xmm2
4485 ; SSE2-NEXT:    paddb %xmm0, %xmm2
4486 ; SSE2-NEXT:    paddb 32(%rdx), %xmm0
4487 ; SSE2-NEXT:    movdqa %xmm0, 32(%rcx)
4488 ; SSE2-NEXT:    movdqa %xmm2, 16(%rcx)
4489 ; SSE2-NEXT:    movdqa %xmm1, (%rcx)
4490 ; SSE2-NEXT:    retq
4492 ; SSE42-LABEL: vec384_i32_widen_to_i128_factor4_broadcast_to_v3i128_factor3:
4493 ; SSE42:       # %bb.0:
4494 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
4495 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
4496 ; SSE42-NEXT:    paddb (%rsi), %xmm0
4497 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
4498 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
4499 ; SSE42-NEXT:    paddb (%rdx), %xmm1
4500 ; SSE42-NEXT:    movdqa 16(%rdx), %xmm2
4501 ; SSE42-NEXT:    paddb %xmm0, %xmm2
4502 ; SSE42-NEXT:    paddb 32(%rdx), %xmm0
4503 ; SSE42-NEXT:    movdqa %xmm0, 32(%rcx)
4504 ; SSE42-NEXT:    movdqa %xmm2, 16(%rcx)
4505 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
4506 ; SSE42-NEXT:    retq
4508 ; AVX-LABEL: vec384_i32_widen_to_i128_factor4_broadcast_to_v3i128_factor3:
4509 ; AVX:       # %bb.0:
4510 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
4511 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
4512 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm2
4513 ; AVX-NEXT:    vpaddb 16(%rsi), %xmm1, %xmm1
4514 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
4515 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm2, %xmm2
4516 ; AVX-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0,1],xmm2[2,3,4,5,6,7]
4517 ; AVX-NEXT:    vpaddb (%rdx), %xmm2, %xmm2
4518 ; AVX-NEXT:    vpaddb 48(%rdx), %xmm1, %xmm1
4519 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm3
4520 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
4521 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
4522 ; AVX-NEXT:    vmovdqa %xmm3, 32(%rcx)
4523 ; AVX-NEXT:    vmovdqa %xmm1, 48(%rcx)
4524 ; AVX-NEXT:    vmovdqa %xmm2, (%rcx)
4525 ; AVX-NEXT:    retq
4527 ; AVX2-LABEL: vec384_i32_widen_to_i128_factor4_broadcast_to_v3i128_factor3:
4528 ; AVX2:       # %bb.0:
4529 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4530 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4531 ; AVX2-NEXT:    vmovdqa 48(%rdi), %xmm1
4532 ; AVX2-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
4533 ; AVX2-NEXT:    vpermq {{.*#+}} ymm2 = ymm0[0,1,0,1]
4534 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm2[0],ymm1[1,2,3],ymm2[4,5,6,7]
4535 ; AVX2-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
4536 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
4537 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rcx)
4538 ; AVX2-NEXT:    vmovdqa %ymm1, (%rcx)
4539 ; AVX2-NEXT:    vzeroupper
4540 ; AVX2-NEXT:    retq
4542 ; AVX512F-LABEL: vec384_i32_widen_to_i128_factor4_broadcast_to_v3i128_factor3:
4543 ; AVX512F:       # %bb.0:
4544 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
4545 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm1
4546 ; AVX512F-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4547 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4548 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
4549 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,13,14,15]
4550 ; AVX512F-NEXT:    vpermd %zmm0, %zmm1, %zmm0
4551 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
4552 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm1, %ymm1
4553 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4554 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
4555 ; AVX512F-NEXT:    vmovdqa %ymm1, 32(%rcx)
4556 ; AVX512F-NEXT:    vzeroupper
4557 ; AVX512F-NEXT:    retq
4559 ; AVX512DQ-LABEL: vec384_i32_widen_to_i128_factor4_broadcast_to_v3i128_factor3:
4560 ; AVX512DQ:       # %bb.0:
4561 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
4562 ; AVX512DQ-NEXT:    vmovdqa 32(%rdi), %ymm1
4563 ; AVX512DQ-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4564 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4565 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
4566 ; AVX512DQ-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,13,14,15]
4567 ; AVX512DQ-NEXT:    vpermd %zmm0, %zmm1, %zmm0
4568 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
4569 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm1, %ymm1
4570 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4571 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
4572 ; AVX512DQ-NEXT:    vmovdqa %ymm1, 32(%rcx)
4573 ; AVX512DQ-NEXT:    vzeroupper
4574 ; AVX512DQ-NEXT:    retq
4576 ; AVX512BW-LABEL: vec384_i32_widen_to_i128_factor4_broadcast_to_v3i128_factor3:
4577 ; AVX512BW:       # %bb.0:
4578 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
4579 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,13,14,15,0,1,2,3]
4580 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
4581 ; AVX512BW-NEXT:    vpermd %zmm0, %zmm1, %zmm1
4582 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
4583 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
4584 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
4585 ; AVX512BW-NEXT:    vzeroupper
4586 ; AVX512BW-NEXT:    retq
4587   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
4588   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
4589   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
4590   %in.vec.cast = bitcast <64 x i8> %in.vec to <16 x i32>
4591   %broadcast.of.aextinreg = shufflevector <16 x i32> %in.vec.cast, <16 x i32> poison, <12 x i32> <i32 0, i32 13, i32 14, i32 15, i32 0, i32 17, i32 18, i32 19, i32 0, i32 21, i32 22, i32 23>
4592   %out.bytevec = bitcast <12 x i32> %broadcast.of.aextinreg to <48 x i8>
4593   %out.bytevec.padded = shufflevector <48 x i8> %out.bytevec, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
4594   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
4595   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
4596   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
4597   ret void
4600 define void @vec384_i32_widen_to_i192_factor6_broadcast_to_v2i192_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
4601 ; SSE2-LABEL: vec384_i32_widen_to_i192_factor6_broadcast_to_v2i192_factor2:
4602 ; SSE2:       # %bb.0:
4603 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
4604 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
4605 ; SSE2-NEXT:    paddb (%rsi), %xmm0
4606 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
4607 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
4608 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
4609 ; SSE2-NEXT:    paddb (%rdx), %xmm1
4610 ; SSE2-NEXT:    paddb 16(%rdx), %xmm0
4611 ; SSE2-NEXT:    movdqa %xmm1, (%rcx)
4612 ; SSE2-NEXT:    movdqa %xmm0, 16(%rcx)
4613 ; SSE2-NEXT:    retq
4615 ; SSE42-LABEL: vec384_i32_widen_to_i192_factor6_broadcast_to_v2i192_factor2:
4616 ; SSE42:       # %bb.0:
4617 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
4618 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
4619 ; SSE42-NEXT:    paddb (%rsi), %xmm0
4620 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
4621 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
4622 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
4623 ; SSE42-NEXT:    paddb (%rdx), %xmm1
4624 ; SSE42-NEXT:    paddb 16(%rdx), %xmm0
4625 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
4626 ; SSE42-NEXT:    movdqa %xmm0, 16(%rcx)
4627 ; SSE42-NEXT:    retq
4629 ; AVX-LABEL: vec384_i32_widen_to_i192_factor6_broadcast_to_v2i192_factor2:
4630 ; AVX:       # %bb.0:
4631 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
4632 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
4633 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
4634 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
4635 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
4636 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
4637 ; AVX-NEXT:    vpaddb (%rdx), %xmm1, %xmm1
4638 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm0
4639 ; AVX-NEXT:    vmovdqa %xmm1, (%rcx)
4640 ; AVX-NEXT:    vmovdqa %xmm0, 16(%rcx)
4641 ; AVX-NEXT:    retq
4643 ; AVX2-LABEL: vec384_i32_widen_to_i192_factor6_broadcast_to_v2i192_factor2:
4644 ; AVX2:       # %bb.0:
4645 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4646 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
4647 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4648 ; AVX2-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4649 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
4650 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,5,6,7]
4651 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
4652 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4653 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
4654 ; AVX2-NEXT:    vzeroupper
4655 ; AVX2-NEXT:    retq
4657 ; AVX512F-LABEL: vec384_i32_widen_to_i192_factor6_broadcast_to_v2i192_factor2:
4658 ; AVX512F:       # %bb.0:
4659 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
4660 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm1
4661 ; AVX512F-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4662 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4663 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
4664 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,13,14,15]
4665 ; AVX512F-NEXT:    vpermd %zmm0, %zmm1, %zmm0
4666 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4667 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
4668 ; AVX512F-NEXT:    vzeroupper
4669 ; AVX512F-NEXT:    retq
4671 ; AVX512DQ-LABEL: vec384_i32_widen_to_i192_factor6_broadcast_to_v2i192_factor2:
4672 ; AVX512DQ:       # %bb.0:
4673 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
4674 ; AVX512DQ-NEXT:    vmovdqa 32(%rdi), %ymm1
4675 ; AVX512DQ-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4676 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4677 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
4678 ; AVX512DQ-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,13,14,15]
4679 ; AVX512DQ-NEXT:    vpermd %zmm0, %zmm1, %zmm0
4680 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4681 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
4682 ; AVX512DQ-NEXT:    vzeroupper
4683 ; AVX512DQ-NEXT:    retq
4685 ; AVX512BW-SLOW-LABEL: vec384_i32_widen_to_i192_factor6_broadcast_to_v2i192_factor2:
4686 ; AVX512BW-SLOW:       # %bb.0:
4687 ; AVX512BW-SLOW-NEXT:    vmovdqa64 (%rdi), %zmm0
4688 ; AVX512BW-SLOW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
4689 ; AVX512BW-SLOW-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,13,14,15]
4690 ; AVX512BW-SLOW-NEXT:    vpermd %zmm0, %zmm1, %zmm0
4691 ; AVX512BW-SLOW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
4692 ; AVX512BW-SLOW-NEXT:    vmovdqa64 %zmm0, (%rcx)
4693 ; AVX512BW-SLOW-NEXT:    vzeroupper
4694 ; AVX512BW-SLOW-NEXT:    retq
4696 ; AVX512BW-FAST-LABEL: vec384_i32_widen_to_i192_factor6_broadcast_to_v2i192_factor2:
4697 ; AVX512BW-FAST:       # %bb.0:
4698 ; AVX512BW-FAST-NEXT:    vmovdqa64 (%rdi), %zmm0
4699 ; AVX512BW-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,13,14,15,0,1,2,3]
4700 ; AVX512BW-FAST-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
4701 ; AVX512BW-FAST-NEXT:    vpermd %zmm0, %zmm1, %zmm0
4702 ; AVX512BW-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,2,2]
4703 ; AVX512BW-FAST-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
4704 ; AVX512BW-FAST-NEXT:    vmovdqa64 %zmm0, (%rcx)
4705 ; AVX512BW-FAST-NEXT:    vzeroupper
4706 ; AVX512BW-FAST-NEXT:    retq
4707   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
4708   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
4709   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
4710   %in.vec.cast = bitcast <64 x i8> %in.vec to <16 x i32>
4711   %broadcast.of.aextinreg = shufflevector <16 x i32> %in.vec.cast, <16 x i32> poison, <12 x i32> <i32 0, i32 13, i32 14, i32 15, i32 16, i32 17, i32 0, i32 19, i32 20, i32 21, i32 22, i32 23>
4712   %out.bytevec = bitcast <12 x i32> %broadcast.of.aextinreg to <48 x i8>
4713   %out.bytevec.padded = shufflevector <48 x i8> %out.bytevec, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
4714   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
4715   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
4716   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
4717   ret void
4720 define void @vec384_i64_widen_to_i128_factor2_broadcast_to_v3i128_factor3(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
4721 ; SSE2-LABEL: vec384_i64_widen_to_i128_factor2_broadcast_to_v3i128_factor3:
4722 ; SSE2:       # %bb.0:
4723 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
4724 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
4725 ; SSE2-NEXT:    paddb (%rsi), %xmm0
4726 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
4727 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
4728 ; SSE2-NEXT:    paddb (%rdx), %xmm1
4729 ; SSE2-NEXT:    movdqa 16(%rdx), %xmm2
4730 ; SSE2-NEXT:    paddb %xmm0, %xmm2
4731 ; SSE2-NEXT:    paddb 32(%rdx), %xmm0
4732 ; SSE2-NEXT:    movdqa %xmm0, 32(%rcx)
4733 ; SSE2-NEXT:    movdqa %xmm2, 16(%rcx)
4734 ; SSE2-NEXT:    movdqa %xmm1, (%rcx)
4735 ; SSE2-NEXT:    retq
4737 ; SSE42-LABEL: vec384_i64_widen_to_i128_factor2_broadcast_to_v3i128_factor3:
4738 ; SSE42:       # %bb.0:
4739 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
4740 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
4741 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
4742 ; SSE42-NEXT:    paddb (%rsi), %xmm0
4743 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1,2,3],xmm1[4,5,6,7]
4744 ; SSE42-NEXT:    paddb (%rdx), %xmm1
4745 ; SSE42-NEXT:    movdqa 16(%rdx), %xmm2
4746 ; SSE42-NEXT:    paddb %xmm0, %xmm2
4747 ; SSE42-NEXT:    paddb 32(%rdx), %xmm0
4748 ; SSE42-NEXT:    movdqa %xmm0, 32(%rcx)
4749 ; SSE42-NEXT:    movdqa %xmm2, 16(%rcx)
4750 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
4751 ; SSE42-NEXT:    retq
4753 ; AVX-LABEL: vec384_i64_widen_to_i128_factor2_broadcast_to_v3i128_factor3:
4754 ; AVX:       # %bb.0:
4755 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
4756 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
4757 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm2
4758 ; AVX-NEXT:    vpaddb 16(%rsi), %xmm1, %xmm1
4759 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm2, %xmm2
4760 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
4761 ; AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm3
4762 ; AVX-NEXT:    vshufpd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[2]
4763 ; AVX-NEXT:    vextractf128 $1, %ymm2, %xmm3
4764 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm3, %xmm3
4765 ; AVX-NEXT:    vpaddb (%rdx), %xmm2, %xmm2
4766 ; AVX-NEXT:    vpaddb 48(%rdx), %xmm1, %xmm1
4767 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm0
4768 ; AVX-NEXT:    vmovdqa %xmm0, 32(%rcx)
4769 ; AVX-NEXT:    vmovdqa %xmm1, 48(%rcx)
4770 ; AVX-NEXT:    vmovdqa %xmm2, (%rcx)
4771 ; AVX-NEXT:    vmovdqa %xmm3, 16(%rcx)
4772 ; AVX-NEXT:    vzeroupper
4773 ; AVX-NEXT:    retq
4775 ; AVX2-LABEL: vec384_i64_widen_to_i128_factor2_broadcast_to_v3i128_factor3:
4776 ; AVX2:       # %bb.0:
4777 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4778 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
4779 ; AVX2-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4780 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4781 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
4782 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,3,0,3]
4783 ; AVX2-NEXT:    vpaddb (%rdx), %ymm1, %ymm1
4784 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm0
4785 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rcx)
4786 ; AVX2-NEXT:    vmovdqa %ymm1, (%rcx)
4787 ; AVX2-NEXT:    vzeroupper
4788 ; AVX2-NEXT:    retq
4790 ; AVX512F-LABEL: vec384_i64_widen_to_i128_factor2_broadcast_to_v3i128_factor3:
4791 ; AVX512F:       # %bb.0:
4792 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
4793 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm1
4794 ; AVX512F-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4795 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4796 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
4797 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0]
4798 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
4799 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
4800 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm1, %ymm1
4801 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4802 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
4803 ; AVX512F-NEXT:    vmovdqa %ymm1, 32(%rcx)
4804 ; AVX512F-NEXT:    vzeroupper
4805 ; AVX512F-NEXT:    retq
4807 ; AVX512DQ-LABEL: vec384_i64_widen_to_i128_factor2_broadcast_to_v3i128_factor3:
4808 ; AVX512DQ:       # %bb.0:
4809 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
4810 ; AVX512DQ-NEXT:    vmovdqa 32(%rdi), %ymm1
4811 ; AVX512DQ-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4812 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4813 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
4814 ; AVX512DQ-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0]
4815 ; AVX512DQ-NEXT:    vpermq %zmm0, %zmm1, %zmm0
4816 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
4817 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm1, %ymm1
4818 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4819 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
4820 ; AVX512DQ-NEXT:    vmovdqa %ymm1, 32(%rcx)
4821 ; AVX512DQ-NEXT:    vzeroupper
4822 ; AVX512DQ-NEXT:    retq
4824 ; AVX512BW-SLOW-LABEL: vec384_i64_widen_to_i128_factor2_broadcast_to_v3i128_factor3:
4825 ; AVX512BW-SLOW:       # %bb.0:
4826 ; AVX512BW-SLOW-NEXT:    vmovdqa64 (%rdi), %zmm0
4827 ; AVX512BW-SLOW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
4828 ; AVX512BW-SLOW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
4829 ; AVX512BW-SLOW-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
4830 ; AVX512BW-SLOW-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,3,0,3]
4831 ; AVX512BW-SLOW-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
4832 ; AVX512BW-SLOW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
4833 ; AVX512BW-SLOW-NEXT:    vmovdqa64 %zmm0, (%rcx)
4834 ; AVX512BW-SLOW-NEXT:    vzeroupper
4835 ; AVX512BW-SLOW-NEXT:    retq
4837 ; AVX512BW-FAST-LABEL: vec384_i64_widen_to_i128_factor2_broadcast_to_v3i128_factor3:
4838 ; AVX512BW-FAST:       # %bb.0:
4839 ; AVX512BW-FAST-NEXT:    vmovdqa64 (%rdi), %zmm0
4840 ; AVX512BW-FAST-NEXT:    vbroadcasti128 {{.*#+}} ymm1 = [0,7,0,7]
4841 ; AVX512BW-FAST-NEXT:    # ymm1 = mem[0,1,0,1]
4842 ; AVX512BW-FAST-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
4843 ; AVX512BW-FAST-NEXT:    vpermq %zmm0, %zmm1, %zmm1
4844 ; AVX512BW-FAST-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
4845 ; AVX512BW-FAST-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
4846 ; AVX512BW-FAST-NEXT:    vmovdqa64 %zmm0, (%rcx)
4847 ; AVX512BW-FAST-NEXT:    vzeroupper
4848 ; AVX512BW-FAST-NEXT:    retq
4849   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
4850   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
4851   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
4852   %in.vec.cast = bitcast <64 x i8> %in.vec to <8 x i64>
4853   %broadcast.of.aextinreg = shufflevector <8 x i64> %in.vec.cast, <8 x i64> poison, <6 x i32> <i32 0, i32 7, i32 0, i32 9, i32 0, i32 11>
4854   %out.bytevec = bitcast <6 x i64> %broadcast.of.aextinreg to <48 x i8>
4855   %out.bytevec.padded = shufflevector <48 x i8> %out.bytevec, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
4856   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
4857   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
4858   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
4859   ret void
4862 define void @vec384_i64_widen_to_i192_factor3_broadcast_to_v2i192_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
4863 ; SSE2-LABEL: vec384_i64_widen_to_i192_factor3_broadcast_to_v2i192_factor2:
4864 ; SSE2:       # %bb.0:
4865 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
4866 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
4867 ; SSE2-NEXT:    paddb (%rsi), %xmm0
4868 ; SSE2-NEXT:    paddb 48(%rsi), %xmm1
4869 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
4870 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
4871 ; SSE2-NEXT:    paddb (%rdx), %xmm1
4872 ; SSE2-NEXT:    paddb 16(%rdx), %xmm0
4873 ; SSE2-NEXT:    movdqa %xmm1, (%rcx)
4874 ; SSE2-NEXT:    movdqa %xmm0, 16(%rcx)
4875 ; SSE2-NEXT:    retq
4877 ; SSE42-LABEL: vec384_i64_widen_to_i192_factor3_broadcast_to_v2i192_factor2:
4878 ; SSE42:       # %bb.0:
4879 ; SSE42-NEXT:    movdqa (%rdi), %xmm0
4880 ; SSE42-NEXT:    movdqa 48(%rdi), %xmm1
4881 ; SSE42-NEXT:    paddb 48(%rsi), %xmm1
4882 ; SSE42-NEXT:    paddb (%rsi), %xmm0
4883 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1,2,3],xmm1[4,5,6,7]
4884 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
4885 ; SSE42-NEXT:    paddb (%rdx), %xmm1
4886 ; SSE42-NEXT:    paddb 16(%rdx), %xmm0
4887 ; SSE42-NEXT:    movdqa %xmm1, (%rcx)
4888 ; SSE42-NEXT:    movdqa %xmm0, 16(%rcx)
4889 ; SSE42-NEXT:    retq
4891 ; AVX-LABEL: vec384_i64_widen_to_i192_factor3_broadcast_to_v2i192_factor2:
4892 ; AVX:       # %bb.0:
4893 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
4894 ; AVX-NEXT:    vmovdqa 48(%rdi), %xmm1
4895 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
4896 ; AVX-NEXT:    vpaddb 48(%rsi), %xmm1, %xmm1
4897 ; AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
4898 ; AVX-NEXT:    vshufpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[2]
4899 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
4900 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm1, %xmm1
4901 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
4902 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
4903 ; AVX-NEXT:    vmovdqa %xmm1, 16(%rcx)
4904 ; AVX-NEXT:    vzeroupper
4905 ; AVX-NEXT:    retq
4907 ; AVX2-LABEL: vec384_i64_widen_to_i192_factor3_broadcast_to_v2i192_factor2:
4908 ; AVX2:       # %bb.0:
4909 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4910 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
4911 ; AVX2-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4912 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4913 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
4914 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,2,0]
4915 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4916 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
4917 ; AVX2-NEXT:    vzeroupper
4918 ; AVX2-NEXT:    retq
4920 ; AVX512F-LABEL: vec384_i64_widen_to_i192_factor3_broadcast_to_v2i192_factor2:
4921 ; AVX512F:       # %bb.0:
4922 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
4923 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm1
4924 ; AVX512F-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4925 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4926 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
4927 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0]
4928 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
4929 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4930 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
4931 ; AVX512F-NEXT:    vzeroupper
4932 ; AVX512F-NEXT:    retq
4934 ; AVX512DQ-LABEL: vec384_i64_widen_to_i192_factor3_broadcast_to_v2i192_factor2:
4935 ; AVX512DQ:       # %bb.0:
4936 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
4937 ; AVX512DQ-NEXT:    vmovdqa 32(%rdi), %ymm1
4938 ; AVX512DQ-NEXT:    vpaddb 32(%rsi), %ymm1, %ymm1
4939 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
4940 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
4941 ; AVX512DQ-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0]
4942 ; AVX512DQ-NEXT:    vpermq %zmm0, %zmm1, %zmm0
4943 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
4944 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
4945 ; AVX512DQ-NEXT:    vzeroupper
4946 ; AVX512DQ-NEXT:    retq
4948 ; AVX512BW-SLOW-LABEL: vec384_i64_widen_to_i192_factor3_broadcast_to_v2i192_factor2:
4949 ; AVX512BW-SLOW:       # %bb.0:
4950 ; AVX512BW-SLOW-NEXT:    vmovdqa64 (%rdi), %zmm0
4951 ; AVX512BW-SLOW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
4952 ; AVX512BW-SLOW-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0]
4953 ; AVX512BW-SLOW-NEXT:    vpermq %zmm0, %zmm1, %zmm0
4954 ; AVX512BW-SLOW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
4955 ; AVX512BW-SLOW-NEXT:    vmovdqa64 %zmm0, (%rcx)
4956 ; AVX512BW-SLOW-NEXT:    vzeroupper
4957 ; AVX512BW-SLOW-NEXT:    retq
4959 ; AVX512BW-FAST-LABEL: vec384_i64_widen_to_i192_factor3_broadcast_to_v2i192_factor2:
4960 ; AVX512BW-FAST:       # %bb.0:
4961 ; AVX512BW-FAST-NEXT:    vmovdqa64 (%rdi), %zmm0
4962 ; AVX512BW-FAST-NEXT:    vbroadcasti128 {{.*#+}} ymm1 = [0,7,0,7]
4963 ; AVX512BW-FAST-NEXT:    # ymm1 = mem[0,1,0,1]
4964 ; AVX512BW-FAST-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
4965 ; AVX512BW-FAST-NEXT:    vpermq %zmm0, %zmm1, %zmm0
4966 ; AVX512BW-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,2,2]
4967 ; AVX512BW-FAST-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
4968 ; AVX512BW-FAST-NEXT:    vmovdqa64 %zmm0, (%rcx)
4969 ; AVX512BW-FAST-NEXT:    vzeroupper
4970 ; AVX512BW-FAST-NEXT:    retq
4971   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
4972   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
4973   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
4974   %in.vec.cast = bitcast <64 x i8> %in.vec to <8 x i64>
4975   %broadcast.of.aextinreg = shufflevector <8 x i64> %in.vec.cast, <8 x i64> poison, <6 x i32> <i32 0, i32 7, i32 8, i32 0, i32 10, i32 11>
4976   %out.bytevec = bitcast <6 x i64> %broadcast.of.aextinreg to <48 x i8>
4977   %out.bytevec.padded = shufflevector <48 x i8> %out.bytevec, <48 x i8> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
4978   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
4979   %out.vec = add <64 x i8> %out.bytevec.padded, %out.vec.bias
4980   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
4981   ret void
4984 define void @vec512_i8_widen_to_i16_factor2_broadcast_to_v32i16_factor32(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
4985 ; SSE-LABEL: vec512_i8_widen_to_i16_factor2_broadcast_to_v32i16_factor32:
4986 ; SSE:       # %bb.0:
4987 ; SSE-NEXT:    movdqa (%rdi), %xmm0
4988 ; SSE-NEXT:    paddb (%rsi), %xmm0
4989 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
4990 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
4991 ; SSE-NEXT:    movdqa 16(%rdx), %xmm1
4992 ; SSE-NEXT:    paddb %xmm0, %xmm1
4993 ; SSE-NEXT:    movdqa (%rdx), %xmm2
4994 ; SSE-NEXT:    paddb %xmm0, %xmm2
4995 ; SSE-NEXT:    movdqa 48(%rdx), %xmm3
4996 ; SSE-NEXT:    paddb %xmm0, %xmm3
4997 ; SSE-NEXT:    paddb 32(%rdx), %xmm0
4998 ; SSE-NEXT:    movdqa %xmm0, 32(%rcx)
4999 ; SSE-NEXT:    movdqa %xmm3, 48(%rcx)
5000 ; SSE-NEXT:    movdqa %xmm2, (%rcx)
5001 ; SSE-NEXT:    movdqa %xmm1, 16(%rcx)
5002 ; SSE-NEXT:    retq
5004 ; AVX-LABEL: vec512_i8_widen_to_i16_factor2_broadcast_to_v32i16_factor32:
5005 ; AVX:       # %bb.0:
5006 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
5007 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5008 ; AVX-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
5009 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
5010 ; AVX-NEXT:    vpaddb 48(%rdx), %xmm0, %xmm1
5011 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm2
5012 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm3
5013 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
5014 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
5015 ; AVX-NEXT:    vmovdqa %xmm3, 16(%rcx)
5016 ; AVX-NEXT:    vmovdqa %xmm2, 32(%rcx)
5017 ; AVX-NEXT:    vmovdqa %xmm1, 48(%rcx)
5018 ; AVX-NEXT:    retq
5020 ; AVX2-LABEL: vec512_i8_widen_to_i16_factor2_broadcast_to_v32i16_factor32:
5021 ; AVX2:       # %bb.0:
5022 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
5023 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5024 ; AVX2-NEXT:    vpbroadcastb %xmm0, %ymm0
5025 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5026 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5027 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
5028 ; AVX2-NEXT:    vmovdqa %ymm1, 32(%rcx)
5029 ; AVX2-NEXT:    vzeroupper
5030 ; AVX2-NEXT:    retq
5032 ; AVX512F-LABEL: vec512_i8_widen_to_i16_factor2_broadcast_to_v32i16_factor32:
5033 ; AVX512F:       # %bb.0:
5034 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
5035 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5036 ; AVX512F-NEXT:    vpbroadcastb %xmm0, %ymm0
5037 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5038 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5039 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
5040 ; AVX512F-NEXT:    vmovdqa %ymm1, 32(%rcx)
5041 ; AVX512F-NEXT:    vzeroupper
5042 ; AVX512F-NEXT:    retq
5044 ; AVX512DQ-LABEL: vec512_i8_widen_to_i16_factor2_broadcast_to_v32i16_factor32:
5045 ; AVX512DQ:       # %bb.0:
5046 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
5047 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5048 ; AVX512DQ-NEXT:    vpbroadcastb %xmm0, %ymm0
5049 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5050 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5051 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
5052 ; AVX512DQ-NEXT:    vmovdqa %ymm1, 32(%rcx)
5053 ; AVX512DQ-NEXT:    vzeroupper
5054 ; AVX512DQ-NEXT:    retq
5056 ; AVX512BW-LABEL: vec512_i8_widen_to_i16_factor2_broadcast_to_v32i16_factor32:
5057 ; AVX512BW:       # %bb.0:
5058 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
5059 ; AVX512BW-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5060 ; AVX512BW-NEXT:    vpbroadcastb %xmm0, %zmm0
5061 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
5062 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
5063 ; AVX512BW-NEXT:    vzeroupper
5064 ; AVX512BW-NEXT:    retq
5065   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5066   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5067   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5068   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <64 x i32> <i32 0, i32 65, i32 0, i32 67, i32 0, i32 69, i32 0, i32 71, i32 0, i32 73, i32 0, i32 75, i32 0, i32 77, i32 0, i32 79, i32 0, i32 81, i32 0, i32 83, i32 0, i32 85, i32 0, i32 87, i32 0, i32 89, i32 0, i32 91, i32 0, i32 93, i32 0, i32 95, i32 0, i32 97, i32 0, i32 99, i32 0, i32 101, i32 0, i32 103, i32 0, i32 105, i32 0, i32 107, i32 0, i32 109, i32 0, i32 111, i32 0, i32 113, i32 0, i32 115, i32 0, i32 117, i32 0, i32 119, i32 0, i32 121, i32 0, i32 123, i32 0, i32 125, i32 0, i32 127>
5069   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5070   %out.vec = add <64 x i8> %broadcast.of.aextinreg, %out.vec.bias
5071   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5072   ret void
5075 define void @vec512_i8_widen_to_i32_factor4_broadcast_to_v16i32_factor16(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
5076 ; SSE-LABEL: vec512_i8_widen_to_i32_factor4_broadcast_to_v16i32_factor16:
5077 ; SSE:       # %bb.0:
5078 ; SSE-NEXT:    movdqa (%rdi), %xmm0
5079 ; SSE-NEXT:    paddb (%rsi), %xmm0
5080 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
5081 ; SSE-NEXT:    movdqa 16(%rdx), %xmm1
5082 ; SSE-NEXT:    paddb %xmm0, %xmm1
5083 ; SSE-NEXT:    movdqa (%rdx), %xmm2
5084 ; SSE-NEXT:    paddb %xmm0, %xmm2
5085 ; SSE-NEXT:    movdqa 48(%rdx), %xmm3
5086 ; SSE-NEXT:    paddb %xmm0, %xmm3
5087 ; SSE-NEXT:    paddb 32(%rdx), %xmm0
5088 ; SSE-NEXT:    movdqa %xmm0, 32(%rcx)
5089 ; SSE-NEXT:    movdqa %xmm3, 48(%rcx)
5090 ; SSE-NEXT:    movdqa %xmm2, (%rcx)
5091 ; SSE-NEXT:    movdqa %xmm1, 16(%rcx)
5092 ; SSE-NEXT:    retq
5094 ; AVX-LABEL: vec512_i8_widen_to_i32_factor4_broadcast_to_v16i32_factor16:
5095 ; AVX:       # %bb.0:
5096 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
5097 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5098 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
5099 ; AVX-NEXT:    vpaddb 48(%rdx), %xmm0, %xmm1
5100 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm2
5101 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm3
5102 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
5103 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
5104 ; AVX-NEXT:    vmovdqa %xmm3, 16(%rcx)
5105 ; AVX-NEXT:    vmovdqa %xmm2, 32(%rcx)
5106 ; AVX-NEXT:    vmovdqa %xmm1, 48(%rcx)
5107 ; AVX-NEXT:    retq
5109 ; AVX2-LABEL: vec512_i8_widen_to_i32_factor4_broadcast_to_v16i32_factor16:
5110 ; AVX2:       # %bb.0:
5111 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
5112 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5113 ; AVX2-NEXT:    vpbroadcastb %xmm0, %ymm0
5114 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5115 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5116 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
5117 ; AVX2-NEXT:    vmovdqa %ymm1, 32(%rcx)
5118 ; AVX2-NEXT:    vzeroupper
5119 ; AVX2-NEXT:    retq
5121 ; AVX512F-LABEL: vec512_i8_widen_to_i32_factor4_broadcast_to_v16i32_factor16:
5122 ; AVX512F:       # %bb.0:
5123 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
5124 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5125 ; AVX512F-NEXT:    vpbroadcastb %xmm0, %ymm0
5126 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5127 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5128 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
5129 ; AVX512F-NEXT:    vmovdqa %ymm1, 32(%rcx)
5130 ; AVX512F-NEXT:    vzeroupper
5131 ; AVX512F-NEXT:    retq
5133 ; AVX512DQ-LABEL: vec512_i8_widen_to_i32_factor4_broadcast_to_v16i32_factor16:
5134 ; AVX512DQ:       # %bb.0:
5135 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
5136 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5137 ; AVX512DQ-NEXT:    vpbroadcastb %xmm0, %ymm0
5138 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5139 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5140 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
5141 ; AVX512DQ-NEXT:    vmovdqa %ymm1, 32(%rcx)
5142 ; AVX512DQ-NEXT:    vzeroupper
5143 ; AVX512DQ-NEXT:    retq
5145 ; AVX512BW-LABEL: vec512_i8_widen_to_i32_factor4_broadcast_to_v16i32_factor16:
5146 ; AVX512BW:       # %bb.0:
5147 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
5148 ; AVX512BW-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5149 ; AVX512BW-NEXT:    vpbroadcastb %xmm0, %zmm0
5150 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
5151 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
5152 ; AVX512BW-NEXT:    vzeroupper
5153 ; AVX512BW-NEXT:    retq
5154   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5155   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5156   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5157   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <64 x i32> <i32 0, i32 65, i32 66, i32 67, i32 0, i32 69, i32 70, i32 71, i32 0, i32 73, i32 74, i32 75, i32 0, i32 77, i32 78, i32 79, i32 0, i32 81, i32 82, i32 83, i32 0, i32 85, i32 86, i32 87, i32 0, i32 89, i32 90, i32 91, i32 0, i32 93, i32 94, i32 95, i32 0, i32 97, i32 98, i32 99, i32 0, i32 101, i32 102, i32 103, i32 0, i32 105, i32 106, i32 107, i32 0, i32 109, i32 110, i32 111, i32 0, i32 113, i32 114, i32 115, i32 0, i32 117, i32 118, i32 119, i32 0, i32 121, i32 122, i32 123, i32 0, i32 125, i32 126, i32 127>
5158   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5159   %out.vec = add <64 x i8> %broadcast.of.aextinreg, %out.vec.bias
5160   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5161   ret void
5164 define void @vec512_i8_widen_to_i64_factor8_broadcast_to_v8i64_factor8(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
5165 ; SSE-LABEL: vec512_i8_widen_to_i64_factor8_broadcast_to_v8i64_factor8:
5166 ; SSE:       # %bb.0:
5167 ; SSE-NEXT:    movdqa (%rdi), %xmm0
5168 ; SSE-NEXT:    paddb (%rsi), %xmm0
5169 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
5170 ; SSE-NEXT:    movdqa 16(%rdx), %xmm1
5171 ; SSE-NEXT:    paddb %xmm0, %xmm1
5172 ; SSE-NEXT:    movdqa (%rdx), %xmm2
5173 ; SSE-NEXT:    paddb %xmm0, %xmm2
5174 ; SSE-NEXT:    movdqa 48(%rdx), %xmm3
5175 ; SSE-NEXT:    paddb %xmm0, %xmm3
5176 ; SSE-NEXT:    paddb 32(%rdx), %xmm0
5177 ; SSE-NEXT:    movdqa %xmm0, 32(%rcx)
5178 ; SSE-NEXT:    movdqa %xmm3, 48(%rcx)
5179 ; SSE-NEXT:    movdqa %xmm2, (%rcx)
5180 ; SSE-NEXT:    movdqa %xmm1, 16(%rcx)
5181 ; SSE-NEXT:    retq
5183 ; AVX-LABEL: vec512_i8_widen_to_i64_factor8_broadcast_to_v8i64_factor8:
5184 ; AVX:       # %bb.0:
5185 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
5186 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5187 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
5188 ; AVX-NEXT:    vpaddb 48(%rdx), %xmm0, %xmm1
5189 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm2
5190 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm3
5191 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
5192 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
5193 ; AVX-NEXT:    vmovdqa %xmm3, 16(%rcx)
5194 ; AVX-NEXT:    vmovdqa %xmm2, 32(%rcx)
5195 ; AVX-NEXT:    vmovdqa %xmm1, 48(%rcx)
5196 ; AVX-NEXT:    retq
5198 ; AVX2-LABEL: vec512_i8_widen_to_i64_factor8_broadcast_to_v8i64_factor8:
5199 ; AVX2:       # %bb.0:
5200 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
5201 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5202 ; AVX2-NEXT:    vpbroadcastb %xmm0, %ymm0
5203 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5204 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5205 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
5206 ; AVX2-NEXT:    vmovdqa %ymm1, 32(%rcx)
5207 ; AVX2-NEXT:    vzeroupper
5208 ; AVX2-NEXT:    retq
5210 ; AVX512F-LABEL: vec512_i8_widen_to_i64_factor8_broadcast_to_v8i64_factor8:
5211 ; AVX512F:       # %bb.0:
5212 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
5213 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5214 ; AVX512F-NEXT:    vpbroadcastb %xmm0, %ymm0
5215 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5216 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5217 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
5218 ; AVX512F-NEXT:    vmovdqa %ymm1, 32(%rcx)
5219 ; AVX512F-NEXT:    vzeroupper
5220 ; AVX512F-NEXT:    retq
5222 ; AVX512DQ-LABEL: vec512_i8_widen_to_i64_factor8_broadcast_to_v8i64_factor8:
5223 ; AVX512DQ:       # %bb.0:
5224 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
5225 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5226 ; AVX512DQ-NEXT:    vpbroadcastb %xmm0, %ymm0
5227 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5228 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5229 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
5230 ; AVX512DQ-NEXT:    vmovdqa %ymm1, 32(%rcx)
5231 ; AVX512DQ-NEXT:    vzeroupper
5232 ; AVX512DQ-NEXT:    retq
5234 ; AVX512BW-LABEL: vec512_i8_widen_to_i64_factor8_broadcast_to_v8i64_factor8:
5235 ; AVX512BW:       # %bb.0:
5236 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
5237 ; AVX512BW-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5238 ; AVX512BW-NEXT:    vpbroadcastb %xmm0, %zmm0
5239 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
5240 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
5241 ; AVX512BW-NEXT:    vzeroupper
5242 ; AVX512BW-NEXT:    retq
5243   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5244   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5245   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5246   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <64 x i32> <i32 0, i32 65, i32 66, i32 67, i32 68, i32 69, i32 70, i32 71, i32 0, i32 73, i32 74, i32 75, i32 76, i32 77, i32 78, i32 79, i32 0, i32 81, i32 82, i32 83, i32 84, i32 85, i32 86, i32 87, i32 0, i32 89, i32 90, i32 91, i32 92, i32 93, i32 94, i32 95, i32 0, i32 97, i32 98, i32 99, i32 100, i32 101, i32 102, i32 103, i32 0, i32 105, i32 106, i32 107, i32 108, i32 109, i32 110, i32 111, i32 0, i32 113, i32 114, i32 115, i32 116, i32 117, i32 118, i32 119, i32 0, i32 121, i32 122, i32 123, i32 124, i32 125, i32 126, i32 127>
5247   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5248   %out.vec = add <64 x i8> %broadcast.of.aextinreg, %out.vec.bias
5249   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5250   ret void
5253 define void @vec512_i8_widen_to_i128_factor16_broadcast_to_v4i128_factor4(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
5254 ; SSE-LABEL: vec512_i8_widen_to_i128_factor16_broadcast_to_v4i128_factor4:
5255 ; SSE:       # %bb.0:
5256 ; SSE-NEXT:    movdqa (%rdi), %xmm0
5257 ; SSE-NEXT:    paddb (%rsi), %xmm0
5258 ; SSE-NEXT:    movdqa 16(%rdx), %xmm1
5259 ; SSE-NEXT:    paddb %xmm0, %xmm1
5260 ; SSE-NEXT:    movdqa (%rdx), %xmm2
5261 ; SSE-NEXT:    paddb %xmm0, %xmm2
5262 ; SSE-NEXT:    movdqa 48(%rdx), %xmm3
5263 ; SSE-NEXT:    paddb %xmm0, %xmm3
5264 ; SSE-NEXT:    paddb 32(%rdx), %xmm0
5265 ; SSE-NEXT:    movdqa %xmm0, 32(%rcx)
5266 ; SSE-NEXT:    movdqa %xmm3, 48(%rcx)
5267 ; SSE-NEXT:    movdqa %xmm2, (%rcx)
5268 ; SSE-NEXT:    movdqa %xmm1, 16(%rcx)
5269 ; SSE-NEXT:    retq
5271 ; AVX-LABEL: vec512_i8_widen_to_i128_factor16_broadcast_to_v4i128_factor4:
5272 ; AVX:       # %bb.0:
5273 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
5274 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5275 ; AVX-NEXT:    vpaddb 48(%rdx), %xmm0, %xmm1
5276 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm2
5277 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm0, %xmm3
5278 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
5279 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
5280 ; AVX-NEXT:    vmovdqa %xmm3, 16(%rcx)
5281 ; AVX-NEXT:    vmovdqa %xmm2, 32(%rcx)
5282 ; AVX-NEXT:    vmovdqa %xmm1, 48(%rcx)
5283 ; AVX-NEXT:    retq
5285 ; AVX2-LABEL: vec512_i8_widen_to_i128_factor16_broadcast_to_v4i128_factor4:
5286 ; AVX2:       # %bb.0:
5287 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
5288 ; AVX2-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5289 ; AVX2-NEXT:    vpbroadcastb %xmm0, %ymm0
5290 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5291 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5292 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
5293 ; AVX2-NEXT:    vmovdqa %ymm1, 32(%rcx)
5294 ; AVX2-NEXT:    vzeroupper
5295 ; AVX2-NEXT:    retq
5297 ; AVX512F-LABEL: vec512_i8_widen_to_i128_factor16_broadcast_to_v4i128_factor4:
5298 ; AVX512F:       # %bb.0:
5299 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
5300 ; AVX512F-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5301 ; AVX512F-NEXT:    vpbroadcastb %xmm0, %ymm0
5302 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5303 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5304 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
5305 ; AVX512F-NEXT:    vmovdqa %ymm1, 32(%rcx)
5306 ; AVX512F-NEXT:    vzeroupper
5307 ; AVX512F-NEXT:    retq
5309 ; AVX512DQ-LABEL: vec512_i8_widen_to_i128_factor16_broadcast_to_v4i128_factor4:
5310 ; AVX512DQ:       # %bb.0:
5311 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %xmm0
5312 ; AVX512DQ-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5313 ; AVX512DQ-NEXT:    vpbroadcastb %xmm0, %ymm0
5314 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5315 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5316 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
5317 ; AVX512DQ-NEXT:    vmovdqa %ymm1, 32(%rcx)
5318 ; AVX512DQ-NEXT:    vzeroupper
5319 ; AVX512DQ-NEXT:    retq
5321 ; AVX512BW-LABEL: vec512_i8_widen_to_i128_factor16_broadcast_to_v4i128_factor4:
5322 ; AVX512BW:       # %bb.0:
5323 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
5324 ; AVX512BW-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5325 ; AVX512BW-NEXT:    vpbroadcastb %xmm0, %zmm0
5326 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
5327 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
5328 ; AVX512BW-NEXT:    vzeroupper
5329 ; AVX512BW-NEXT:    retq
5330   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5331   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5332   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5333   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <64 x i32> <i32 0, i32 65, i32 66, i32 67, i32 68, i32 69, i32 70, i32 71, i32 72, i32 73, i32 74, i32 75, i32 76, i32 77, i32 78, i32 79, i32 0, i32 81, i32 82, i32 83, i32 84, i32 85, i32 86, i32 87, i32 88, i32 89, i32 90, i32 91, i32 92, i32 93, i32 94, i32 95, i32 0, i32 97, i32 98, i32 99, i32 100, i32 101, i32 102, i32 103, i32 104, i32 105, i32 106, i32 107, i32 108, i32 109, i32 110, i32 111, i32 0, i32 113, i32 114, i32 115, i32 116, i32 117, i32 118, i32 119, i32 120, i32 121, i32 122, i32 123, i32 124, i32 125, i32 126, i32 127>
5334   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5335   %out.vec = add <64 x i8> %broadcast.of.aextinreg, %out.vec.bias
5336   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5337   ret void
5340 define void @vec512_i8_widen_to_i256_factor32_broadcast_to_v2i256_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
5341 ; SSE-LABEL: vec512_i8_widen_to_i256_factor32_broadcast_to_v2i256_factor2:
5342 ; SSE:       # %bb.0:
5343 ; SSE-NEXT:    movdqa (%rdi), %xmm0
5344 ; SSE-NEXT:    movdqa 16(%rdi), %xmm1
5345 ; SSE-NEXT:    paddb (%rsi), %xmm0
5346 ; SSE-NEXT:    paddb 16(%rsi), %xmm1
5347 ; SSE-NEXT:    movdqa 16(%rdx), %xmm2
5348 ; SSE-NEXT:    paddb %xmm1, %xmm2
5349 ; SSE-NEXT:    movdqa (%rdx), %xmm3
5350 ; SSE-NEXT:    paddb %xmm0, %xmm3
5351 ; SSE-NEXT:    paddb 48(%rdx), %xmm1
5352 ; SSE-NEXT:    paddb 32(%rdx), %xmm0
5353 ; SSE-NEXT:    movdqa %xmm0, 32(%rcx)
5354 ; SSE-NEXT:    movdqa %xmm1, 48(%rcx)
5355 ; SSE-NEXT:    movdqa %xmm3, (%rcx)
5356 ; SSE-NEXT:    movdqa %xmm2, 16(%rcx)
5357 ; SSE-NEXT:    retq
5359 ; AVX-LABEL: vec512_i8_widen_to_i256_factor32_broadcast_to_v2i256_factor2:
5360 ; AVX:       # %bb.0:
5361 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
5362 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
5363 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5364 ; AVX-NEXT:    vpaddb 16(%rsi), %xmm1, %xmm1
5365 ; AVX-NEXT:    vpaddb 48(%rdx), %xmm1, %xmm2
5366 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm3
5367 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm1, %xmm1
5368 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
5369 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
5370 ; AVX-NEXT:    vmovdqa %xmm1, 16(%rcx)
5371 ; AVX-NEXT:    vmovdqa %xmm3, 32(%rcx)
5372 ; AVX-NEXT:    vmovdqa %xmm2, 48(%rcx)
5373 ; AVX-NEXT:    retq
5375 ; AVX2-LABEL: vec512_i8_widen_to_i256_factor32_broadcast_to_v2i256_factor2:
5376 ; AVX2:       # %bb.0:
5377 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
5378 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
5379 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5380 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5381 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
5382 ; AVX2-NEXT:    vmovdqa %ymm1, 32(%rcx)
5383 ; AVX2-NEXT:    vzeroupper
5384 ; AVX2-NEXT:    retq
5386 ; AVX512F-LABEL: vec512_i8_widen_to_i256_factor32_broadcast_to_v2i256_factor2:
5387 ; AVX512F:       # %bb.0:
5388 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
5389 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
5390 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5391 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5392 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
5393 ; AVX512F-NEXT:    vmovdqa %ymm1, 32(%rcx)
5394 ; AVX512F-NEXT:    vzeroupper
5395 ; AVX512F-NEXT:    retq
5397 ; AVX512DQ-LABEL: vec512_i8_widen_to_i256_factor32_broadcast_to_v2i256_factor2:
5398 ; AVX512DQ:       # %bb.0:
5399 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
5400 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
5401 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5402 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5403 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
5404 ; AVX512DQ-NEXT:    vmovdqa %ymm1, 32(%rcx)
5405 ; AVX512DQ-NEXT:    vzeroupper
5406 ; AVX512DQ-NEXT:    retq
5408 ; AVX512BW-LABEL: vec512_i8_widen_to_i256_factor32_broadcast_to_v2i256_factor2:
5409 ; AVX512BW:       # %bb.0:
5410 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
5411 ; AVX512BW-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5412 ; AVX512BW-NEXT:    vpbroadcastb %xmm0, %zmm0
5413 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
5414 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
5415 ; AVX512BW-NEXT:    vzeroupper
5416 ; AVX512BW-NEXT:    retq
5417   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5418   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5419   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5420   %broadcast.of.aextinreg = shufflevector <64 x i8> %in.vec, <64 x i8> poison, <64 x i32> <i32 0, i32 65, i32 66, i32 67, i32 68, i32 69, i32 70, i32 71, i32 72, i32 73, i32 74, i32 75, i32 76, i32 77, i32 78, i32 79, i32 80, i32 81, i32 82, i32 83, i32 84, i32 85, i32 86, i32 87, i32 88, i32 89, i32 90, i32 91, i32 92, i32 93, i32 94, i32 95, i32 0, i32 97, i32 98, i32 99, i32 100, i32 101, i32 102, i32 103, i32 104, i32 105, i32 106, i32 107, i32 108, i32 109, i32 110, i32 111, i32 112, i32 113, i32 114, i32 115, i32 116, i32 117, i32 118, i32 119, i32 120, i32 121, i32 122, i32 123, i32 124, i32 125, i32 126, i32 127>
5421   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5422   %out.vec = add <64 x i8> %broadcast.of.aextinreg, %out.vec.bias
5423   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5424   ret void
5427 ; FIXME: all these crash during selection:
5428 ; define void @vec512_i16_widen_to_i32_factor2_broadcast_to_v16i32_factor16(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
5429 ;   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5430 ;   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5431 ;   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5432 ;   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
5433 ;   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <32 x i32> <i32 0, i32 33, i32 0, i32 35, i32 0, i32 37, i32 0, i32 39, i32 0, i32 41, i32 0, i32 43, i32 0, i32 45, i32 0, i32 47, i32 0, i32 49, i32 0, i32 51, i32 0, i32 53, i32 0, i32 55, i32 0, i32 57, i32 0, i32 59, i32 0, i32 61, i32 0, i32 63>
5434 ;   %out.bytevec = bitcast <32 x i16> %broadcast.of.aextinreg to <64 x i8>
5435 ;   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5436 ;   %out.vec = add <64 x i8> %out.bytevec, %out.vec.bias
5437 ;   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5438 ;   ret void
5439 ; }
5441 ; define void @vec512_i16_widen_to_i64_factor4_broadcast_to_v8i64_factor8(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
5442 ;   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5443 ;   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5444 ;   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5445 ;   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
5446 ;   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <32 x i32> <i32 0, i32 33, i32 34, i32 35, i32 0, i32 37, i32 38, i32 39, i32 0, i32 41, i32 42, i32 43, i32 0, i32 45, i32 46, i32 47, i32 0, i32 49, i32 50, i32 51, i32 0, i32 53, i32 54, i32 55, i32 0, i32 57, i32 58, i32 59, i32 0, i32 61, i32 62, i32 63>
5447 ;   %out.bytevec = bitcast <32 x i16> %broadcast.of.aextinreg to <64 x i8>
5448 ;   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5449 ;   %out.vec = add <64 x i8> %out.bytevec, %out.vec.bias
5450 ;   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5451 ;   ret void
5452 ; }
5454 ; define void @vec512_i16_widen_to_i128_factor8_broadcast_to_v4i128_factor4(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
5455 ;   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5456 ;   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5457 ;   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5458 ;   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
5459 ;   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <32 x i32> <i32 0, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 0, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 0, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 0, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63>
5460 ;   %out.bytevec = bitcast <32 x i16> %broadcast.of.aextinreg to <64 x i8>
5461 ;   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5462 ;   %out.vec = add <64 x i8> %out.bytevec, %out.vec.bias
5463 ;   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5464 ;   ret void
5465 ; }
5467 ; define void @vec512_i16_widen_to_i256_factor16_broadcast_to_v2i256_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
5468 ;   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5469 ;   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5470 ;   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5471 ;   %in.vec.cast = bitcast <64 x i8> %in.vec to <32 x i16>
5472 ;   %broadcast.of.aextinreg = shufflevector <32 x i16> %in.vec.cast, <32 x i16> poison, <32 x i32> <i32 0, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 0, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63>
5473 ;   %out.bytevec = bitcast <32 x i16> %broadcast.of.aextinreg to <64 x i8>
5474 ;   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5475 ;   %out.vec = add <64 x i8> %out.bytevec, %out.vec.bias
5476 ;   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5477 ;   ret void
5478 ; }
5480 ; define void @vec512_i32_widen_to_i64_factor2_broadcast_to_v8i64_factor8(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
5481 ;   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5482 ;   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5483 ;   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5484 ;   %in.vec.cast = bitcast <64 x i8> %in.vec to <16 x i32>
5485 ;   %broadcast.of.aextinreg = shufflevector <16 x i32> %in.vec.cast, <16 x i32> poison, <16 x i32> <i32 0, i32 17, i32 0, i32 19, i32 0, i32 21, i32 0, i32 23, i32 0, i32 25, i32 0, i32 27, i32 0, i32 29, i32 0, i32 31>
5486 ;   %out.bytevec = bitcast <16 x i32> %broadcast.of.aextinreg to <64 x i8>
5487 ;   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5488 ;   %out.vec = add <64 x i8> %out.bytevec, %out.vec.bias
5489 ;   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5490 ;   ret void
5491 ; }
5493 ; define void @vec512_i32_widen_to_i128_factor4_broadcast_to_v4i128_factor4(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
5494 ;   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5495 ;   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5496 ;   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5497 ;   %in.vec.cast = bitcast <64 x i8> %in.vec to <16 x i32>
5498 ;   %broadcast.of.aextinreg = shufflevector <16 x i32> %in.vec.cast, <16 x i32> poison, <16 x i32> <i32 0, i32 17, i32 18, i32 19, i32 0, i32 21, i32 22, i32 23, i32 0, i32 25, i32 26, i32 27, i32 0, i32 29, i32 30, i32 31>
5499 ;   %out.bytevec = bitcast <16 x i32> %broadcast.of.aextinreg to <64 x i8>
5500 ;   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5501 ;   %out.vec = add <64 x i8> %out.bytevec, %out.vec.bias
5502 ;   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5503 ;   ret void
5504 ; }
5506 ; define void @vec512_i32_widen_to_i256_factor8_broadcast_to_v2i256_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
5507 ;   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5508 ;   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5509 ;   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5510 ;   %in.vec.cast = bitcast <64 x i8> %in.vec to <16 x i32>
5511 ;   %broadcast.of.aextinreg = shufflevector <16 x i32> %in.vec.cast, <16 x i32> poison, <16 x i32> <i32 0, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 0, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
5512 ;   %out.bytevec = bitcast <16 x i32> %broadcast.of.aextinreg to <64 x i8>
5513 ;   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5514 ;   %out.vec = add <64 x i8> %out.bytevec, %out.vec.bias
5515 ;   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5516 ;   ret void
5517 ; }
5519 ; define void @vec512_i64_widen_to_i128_factor2_broadcast_to_v4i128_factor4(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
5520 ;   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5521 ;   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5522 ;   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5523 ;   %in.vec.cast = bitcast <64 x i8> %in.vec to <8 x i64>
5524 ;   %broadcast.of.aextinreg = shufflevector <8 x i64> %in.vec.cast, <8 x i64> poison, <8 x i32> <i32 0, i32 9, i32 0, i32 11, i32 0, i32 13, i32 0, i32 15>
5525 ;   %out.bytevec = bitcast <8 x i64> %broadcast.of.aextinreg to <64 x i8>
5526 ;   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5527 ;   %out.vec = add <64 x i8> %out.bytevec, %out.vec.bias
5528 ;   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5529 ;   ret void
5530 ; }
5532 ; define void @vec512_i64_widen_to_i256_factor4_broadcast_to_v2i256_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
5533 ;   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5534 ;   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5535 ;   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5536 ;   %in.vec.cast = bitcast <64 x i8> %in.vec to <8 x i64>
5537 ;   %broadcast.of.aextinreg = shufflevector <8 x i64> %in.vec.cast, <8 x i64> poison, <8 x i32> <i32 0, i32 9, i32 10, i32 11, i32 0, i32 13, i32 14, i32 15>
5538 ;   %out.bytevec = bitcast <8 x i64> %broadcast.of.aextinreg to <64 x i8>
5539 ;   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5540 ;   %out.vec = add <64 x i8> %out.bytevec, %out.vec.bias
5541 ;   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5542 ;   ret void
5543 ; }
5545 define void @vec512_i128_widen_to_i256_factor2_broadcast_to_v2i256_factor2(ptr %in.vec.base.ptr, ptr %in.vec.bias.ptr, ptr %out.vec.bias.ptr, ptr %out.vec.ptr) nounwind {
5546 ; SSE-LABEL: vec512_i128_widen_to_i256_factor2_broadcast_to_v2i256_factor2:
5547 ; SSE:       # %bb.0:
5548 ; SSE-NEXT:    movdqa (%rdi), %xmm0
5549 ; SSE-NEXT:    movdqa 16(%rdi), %xmm1
5550 ; SSE-NEXT:    paddb (%rsi), %xmm0
5551 ; SSE-NEXT:    paddb 16(%rsi), %xmm1
5552 ; SSE-NEXT:    movdqa 16(%rdx), %xmm2
5553 ; SSE-NEXT:    paddb %xmm1, %xmm2
5554 ; SSE-NEXT:    movdqa (%rdx), %xmm3
5555 ; SSE-NEXT:    paddb %xmm0, %xmm3
5556 ; SSE-NEXT:    paddb 48(%rdx), %xmm1
5557 ; SSE-NEXT:    paddb 32(%rdx), %xmm0
5558 ; SSE-NEXT:    movdqa %xmm0, 32(%rcx)
5559 ; SSE-NEXT:    movdqa %xmm1, 48(%rcx)
5560 ; SSE-NEXT:    movdqa %xmm3, (%rcx)
5561 ; SSE-NEXT:    movdqa %xmm2, 16(%rcx)
5562 ; SSE-NEXT:    retq
5564 ; AVX-LABEL: vec512_i128_widen_to_i256_factor2_broadcast_to_v2i256_factor2:
5565 ; AVX:       # %bb.0:
5566 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
5567 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
5568 ; AVX-NEXT:    vpaddb (%rsi), %xmm0, %xmm0
5569 ; AVX-NEXT:    vpaddb 16(%rsi), %xmm1, %xmm1
5570 ; AVX-NEXT:    vpaddb 48(%rdx), %xmm1, %xmm2
5571 ; AVX-NEXT:    vpaddb 32(%rdx), %xmm0, %xmm3
5572 ; AVX-NEXT:    vpaddb 16(%rdx), %xmm1, %xmm1
5573 ; AVX-NEXT:    vpaddb (%rdx), %xmm0, %xmm0
5574 ; AVX-NEXT:    vmovdqa %xmm0, (%rcx)
5575 ; AVX-NEXT:    vmovdqa %xmm1, 16(%rcx)
5576 ; AVX-NEXT:    vmovdqa %xmm3, 32(%rcx)
5577 ; AVX-NEXT:    vmovdqa %xmm2, 48(%rcx)
5578 ; AVX-NEXT:    retq
5580 ; AVX2-LABEL: vec512_i128_widen_to_i256_factor2_broadcast_to_v2i256_factor2:
5581 ; AVX2:       # %bb.0:
5582 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
5583 ; AVX2-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
5584 ; AVX2-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5585 ; AVX2-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5586 ; AVX2-NEXT:    vmovdqa %ymm0, (%rcx)
5587 ; AVX2-NEXT:    vmovdqa %ymm1, 32(%rcx)
5588 ; AVX2-NEXT:    vzeroupper
5589 ; AVX2-NEXT:    retq
5591 ; AVX512F-LABEL: vec512_i128_widen_to_i256_factor2_broadcast_to_v2i256_factor2:
5592 ; AVX512F:       # %bb.0:
5593 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
5594 ; AVX512F-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
5595 ; AVX512F-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5596 ; AVX512F-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5597 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rcx)
5598 ; AVX512F-NEXT:    vmovdqa %ymm1, 32(%rcx)
5599 ; AVX512F-NEXT:    vzeroupper
5600 ; AVX512F-NEXT:    retq
5602 ; AVX512DQ-LABEL: vec512_i128_widen_to_i256_factor2_broadcast_to_v2i256_factor2:
5603 ; AVX512DQ:       # %bb.0:
5604 ; AVX512DQ-NEXT:    vmovdqa (%rdi), %ymm0
5605 ; AVX512DQ-NEXT:    vpaddb (%rsi), %ymm0, %ymm0
5606 ; AVX512DQ-NEXT:    vpaddb 32(%rdx), %ymm0, %ymm1
5607 ; AVX512DQ-NEXT:    vpaddb (%rdx), %ymm0, %ymm0
5608 ; AVX512DQ-NEXT:    vmovdqa %ymm0, (%rcx)
5609 ; AVX512DQ-NEXT:    vmovdqa %ymm1, 32(%rcx)
5610 ; AVX512DQ-NEXT:    vzeroupper
5611 ; AVX512DQ-NEXT:    retq
5613 ; AVX512BW-LABEL: vec512_i128_widen_to_i256_factor2_broadcast_to_v2i256_factor2:
5614 ; AVX512BW:       # %bb.0:
5615 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
5616 ; AVX512BW-NEXT:    vpaddb (%rsi), %zmm0, %zmm0
5617 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
5618 ; AVX512BW-NEXT:    vpaddb (%rdx), %zmm0, %zmm0
5619 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rcx)
5620 ; AVX512BW-NEXT:    vzeroupper
5621 ; AVX512BW-NEXT:    retq
5622   %in.vec.base = load <64 x i8>, ptr %in.vec.base.ptr, align 64
5623   %in.vec.bias = load <64 x i8>, ptr %in.vec.bias.ptr, align 64
5624   %in.vec = add <64 x i8> %in.vec.base, %in.vec.bias
5625   %in.vec.cast = bitcast <64 x i8> %in.vec to <4 x i128>
5626   %broadcast.of.aextinreg = shufflevector <4 x i128> %in.vec.cast, <4 x i128> poison, <4 x i32> <i32 0, i32 5, i32 0, i32 7>
5627   %out.bytevec = bitcast <4 x i128> %broadcast.of.aextinreg to <64 x i8>
5628   %out.vec.bias = load <64 x i8>, ptr %out.vec.bias.ptr, align 64
5629   %out.vec = add <64 x i8> %out.bytevec, %out.vec.bias
5630   store <64 x i8> %out.vec, ptr %out.vec.ptr, align 64
5631   ret void
5633 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
5634 ; AVX1-ONLY: {{.*}}
5635 ; FALLBACK0: {{.*}}
5636 ; FALLBACK1: {{.*}}
5637 ; FALLBACK10: {{.*}}
5638 ; FALLBACK11: {{.*}}
5639 ; FALLBACK12: {{.*}}
5640 ; FALLBACK13: {{.*}}
5641 ; FALLBACK2: {{.*}}
5642 ; FALLBACK3: {{.*}}
5643 ; FALLBACK4: {{.*}}
5644 ; FALLBACK5: {{.*}}
5645 ; FALLBACK6: {{.*}}
5646 ; FALLBACK7: {{.*}}
5647 ; FALLBACK8: {{.*}}
5648 ; FALLBACK9: {{.*}}