Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / midpoint-int-vec-256.ll
blob4c605b10f66b6bffb82b1eabe557e5a143860b79
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop | FileCheck %s --check-prefixes=XOP
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=AVX2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL,AVX512VL-FALLBACK
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW-FALLBACK
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512VL,AVX512VLBW
12 ; These test cases are inspired by C++2a std::midpoint().
13 ; See https://bugs.llvm.org/show_bug.cgi?id=40965
15 ; Using 256-bit vector regs.
17 ; ---------------------------------------------------------------------------- ;
18 ; 32-bit width. 256 / 32 = 8 elts.
19 ; ---------------------------------------------------------------------------- ;
21 ; Values come from regs
23 define <8 x i32> @vec256_i32_signed_reg_reg(<8 x i32> %a1, <8 x i32> %a2) nounwind {
24 ; AVX1-LABEL: vec256_i32_signed_reg_reg:
25 ; AVX1:       # %bb.0:
26 ; AVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
27 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm3
28 ; AVX1-NEXT:    vpsubd %xmm2, %xmm3, %xmm2
29 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
30 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
31 ; AVX1-NEXT:    vpminsd %xmm1, %xmm3, %xmm4
32 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm3, %xmm1
33 ; AVX1-NEXT:    vpsubd %xmm4, %xmm1, %xmm1
34 ; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
35 ; AVX1-NEXT:    vpsrld $1, %xmm2, %xmm2
36 ; AVX1-NEXT:    vpmulld %xmm2, %xmm2, %xmm2
37 ; AVX1-NEXT:    vpmulld %xmm1, %xmm1, %xmm1
38 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
39 ; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm0
40 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
41 ; AVX1-NEXT:    retq
43 ; AVX2-LABEL: vec256_i32_signed_reg_reg:
44 ; AVX2:       # %bb.0:
45 ; AVX2-NEXT:    vpminsd %ymm1, %ymm0, %ymm2
46 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm1
47 ; AVX2-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
48 ; AVX2-NEXT:    vpsrld $1, %ymm1, %ymm1
49 ; AVX2-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
50 ; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
51 ; AVX2-NEXT:    retq
53 ; XOP-LABEL: vec256_i32_signed_reg_reg:
54 ; XOP:       # %bb.0:
55 ; XOP-NEXT:    vextractf128 $1, %ymm1, %xmm2
56 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm3
57 ; XOP-NEXT:    vpminsd %xmm2, %xmm3, %xmm4
58 ; XOP-NEXT:    vpmaxsd %xmm2, %xmm3, %xmm2
59 ; XOP-NEXT:    vpsubd %xmm4, %xmm2, %xmm2
60 ; XOP-NEXT:    vpminsd %xmm1, %xmm0, %xmm4
61 ; XOP-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
62 ; XOP-NEXT:    vpsubd %xmm4, %xmm1, %xmm1
63 ; XOP-NEXT:    vpsrld $1, %xmm1, %xmm1
64 ; XOP-NEXT:    vpsrld $1, %xmm2, %xmm2
65 ; XOP-NEXT:    vpmacsdd %xmm3, %xmm2, %xmm2, %xmm2
66 ; XOP-NEXT:    vpmacsdd %xmm0, %xmm1, %xmm1, %xmm0
67 ; XOP-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
68 ; XOP-NEXT:    retq
70 ; AVX512-LABEL: vec256_i32_signed_reg_reg:
71 ; AVX512:       # %bb.0:
72 ; AVX512-NEXT:    vpminsd %ymm1, %ymm0, %ymm2
73 ; AVX512-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm1
74 ; AVX512-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
75 ; AVX512-NEXT:    vpsrld $1, %ymm1, %ymm1
76 ; AVX512-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
77 ; AVX512-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
78 ; AVX512-NEXT:    retq
79   %t3 = icmp sgt <8 x i32> %a1, %a2 ; signed
80   %t4 = select <8 x i1> %t3, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
81   %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a1
82   %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a2
83   %t7 = sub <8 x i32> %t6, %t5
84   %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
85   %t9 = mul nsw <8 x i32> %t8, %t8 ; signed
86   %a10 = add nsw <8 x i32> %t9, %a1 ; signed
87   ret <8 x i32> %a10
90 define <8 x i32> @vec256_i32_unsigned_reg_reg(<8 x i32> %a1, <8 x i32> %a2) nounwind {
91 ; AVX1-LABEL: vec256_i32_unsigned_reg_reg:
92 ; AVX1:       # %bb.0:
93 ; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm2
94 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm3
95 ; AVX1-NEXT:    vpsubd %xmm2, %xmm3, %xmm2
96 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
97 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
98 ; AVX1-NEXT:    vpminud %xmm1, %xmm3, %xmm4
99 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm3, %xmm1
100 ; AVX1-NEXT:    vpsubd %xmm4, %xmm1, %xmm1
101 ; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
102 ; AVX1-NEXT:    vpsrld $1, %xmm2, %xmm2
103 ; AVX1-NEXT:    vpmulld %xmm2, %xmm2, %xmm2
104 ; AVX1-NEXT:    vpmulld %xmm1, %xmm1, %xmm1
105 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
106 ; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm0
107 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
108 ; AVX1-NEXT:    retq
110 ; AVX2-LABEL: vec256_i32_unsigned_reg_reg:
111 ; AVX2:       # %bb.0:
112 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm2
113 ; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm1
114 ; AVX2-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
115 ; AVX2-NEXT:    vpsrld $1, %ymm1, %ymm1
116 ; AVX2-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
117 ; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
118 ; AVX2-NEXT:    retq
120 ; XOP-LABEL: vec256_i32_unsigned_reg_reg:
121 ; XOP:       # %bb.0:
122 ; XOP-NEXT:    vextractf128 $1, %ymm1, %xmm2
123 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm3
124 ; XOP-NEXT:    vpminud %xmm2, %xmm3, %xmm4
125 ; XOP-NEXT:    vpmaxud %xmm2, %xmm3, %xmm2
126 ; XOP-NEXT:    vpsubd %xmm4, %xmm2, %xmm2
127 ; XOP-NEXT:    vpminud %xmm1, %xmm0, %xmm4
128 ; XOP-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
129 ; XOP-NEXT:    vpsubd %xmm4, %xmm1, %xmm1
130 ; XOP-NEXT:    vpsrld $1, %xmm1, %xmm1
131 ; XOP-NEXT:    vpsrld $1, %xmm2, %xmm2
132 ; XOP-NEXT:    vpmacsdd %xmm3, %xmm2, %xmm2, %xmm2
133 ; XOP-NEXT:    vpmacsdd %xmm0, %xmm1, %xmm1, %xmm0
134 ; XOP-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
135 ; XOP-NEXT:    retq
137 ; AVX512-LABEL: vec256_i32_unsigned_reg_reg:
138 ; AVX512:       # %bb.0:
139 ; AVX512-NEXT:    vpminud %ymm1, %ymm0, %ymm2
140 ; AVX512-NEXT:    vpmaxud %ymm1, %ymm0, %ymm1
141 ; AVX512-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
142 ; AVX512-NEXT:    vpsrld $1, %ymm1, %ymm1
143 ; AVX512-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
144 ; AVX512-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
145 ; AVX512-NEXT:    retq
146   %t3 = icmp ugt <8 x i32> %a1, %a2
147   %t4 = select <8 x i1> %t3, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
148   %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a1
149   %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a2
150   %t7 = sub <8 x i32> %t6, %t5
151   %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
152   %t9 = mul <8 x i32> %t8, %t8
153   %a10 = add <8 x i32> %t9, %a1
154   ret <8 x i32> %a10
157 ; Values are loaded. Only check signed case.
159 define <8 x i32> @vec256_i32_signed_mem_reg(ptr %a1_addr, <8 x i32> %a2) nounwind {
160 ; AVX1-LABEL: vec256_i32_signed_mem_reg:
161 ; AVX1:       # %bb.0:
162 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm1
163 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm2
164 ; AVX1-NEXT:    vpminsd %xmm0, %xmm1, %xmm3
165 ; AVX1-NEXT:    vpmaxsd %xmm0, %xmm1, %xmm4
166 ; AVX1-NEXT:    vpsubd %xmm3, %xmm4, %xmm3
167 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
168 ; AVX1-NEXT:    vpminsd %xmm0, %xmm2, %xmm4
169 ; AVX1-NEXT:    vpmaxsd %xmm0, %xmm2, %xmm0
170 ; AVX1-NEXT:    vpsubd %xmm4, %xmm0, %xmm0
171 ; AVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
172 ; AVX1-NEXT:    vpsrld $1, %xmm3, %xmm3
173 ; AVX1-NEXT:    vpmulld %xmm3, %xmm3, %xmm3
174 ; AVX1-NEXT:    vpmulld %xmm0, %xmm0, %xmm0
175 ; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0
176 ; AVX1-NEXT:    vpaddd %xmm1, %xmm3, %xmm1
177 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
178 ; AVX1-NEXT:    retq
180 ; AVX2-LABEL: vec256_i32_signed_mem_reg:
181 ; AVX2:       # %bb.0:
182 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
183 ; AVX2-NEXT:    vpminsd %ymm0, %ymm1, %ymm2
184 ; AVX2-NEXT:    vpmaxsd %ymm0, %ymm1, %ymm0
185 ; AVX2-NEXT:    vpsubd %ymm2, %ymm0, %ymm0
186 ; AVX2-NEXT:    vpsrld $1, %ymm0, %ymm0
187 ; AVX2-NEXT:    vpmulld %ymm0, %ymm0, %ymm0
188 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
189 ; AVX2-NEXT:    retq
191 ; XOP-LABEL: vec256_i32_signed_mem_reg:
192 ; XOP:       # %bb.0:
193 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm1
194 ; XOP-NEXT:    vmovdqa (%rdi), %xmm2
195 ; XOP-NEXT:    vmovdqa 16(%rdi), %xmm3
196 ; XOP-NEXT:    vpminsd %xmm1, %xmm3, %xmm4
197 ; XOP-NEXT:    vpmaxsd %xmm1, %xmm3, %xmm1
198 ; XOP-NEXT:    vpsubd %xmm4, %xmm1, %xmm1
199 ; XOP-NEXT:    vpminsd %xmm0, %xmm2, %xmm4
200 ; XOP-NEXT:    vpmaxsd %xmm0, %xmm2, %xmm0
201 ; XOP-NEXT:    vpsubd %xmm4, %xmm0, %xmm0
202 ; XOP-NEXT:    vpsrld $1, %xmm0, %xmm0
203 ; XOP-NEXT:    vpsrld $1, %xmm1, %xmm1
204 ; XOP-NEXT:    vpmacsdd %xmm3, %xmm1, %xmm1, %xmm1
205 ; XOP-NEXT:    vpmacsdd %xmm2, %xmm0, %xmm0, %xmm0
206 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
207 ; XOP-NEXT:    retq
209 ; AVX512-LABEL: vec256_i32_signed_mem_reg:
210 ; AVX512:       # %bb.0:
211 ; AVX512-NEXT:    vmovdqa (%rdi), %ymm1
212 ; AVX512-NEXT:    vpminsd %ymm0, %ymm1, %ymm2
213 ; AVX512-NEXT:    vpmaxsd %ymm0, %ymm1, %ymm0
214 ; AVX512-NEXT:    vpsubd %ymm2, %ymm0, %ymm0
215 ; AVX512-NEXT:    vpsrld $1, %ymm0, %ymm0
216 ; AVX512-NEXT:    vpmulld %ymm0, %ymm0, %ymm0
217 ; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
218 ; AVX512-NEXT:    retq
219   %a1 = load <8 x i32>, ptr %a1_addr
220   %t3 = icmp sgt <8 x i32> %a1, %a2 ; signed
221   %t4 = select <8 x i1> %t3, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
222   %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a1
223   %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a2
224   %t7 = sub <8 x i32> %t6, %t5
225   %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
226   %t9 = mul nsw <8 x i32> %t8, %t8 ; signed
227   %a10 = add nsw <8 x i32> %t9, %a1 ; signed
228   ret <8 x i32> %a10
231 define <8 x i32> @vec256_i32_signed_reg_mem(<8 x i32> %a1, ptr %a2_addr) nounwind {
232 ; AVX1-LABEL: vec256_i32_signed_reg_mem:
233 ; AVX1:       # %bb.0:
234 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm1
235 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm2
236 ; AVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
237 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
238 ; AVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
239 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
240 ; AVX1-NEXT:    vpminsd %xmm2, %xmm3, %xmm4
241 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm3, %xmm2
242 ; AVX1-NEXT:    vpsubd %xmm4, %xmm2, %xmm2
243 ; AVX1-NEXT:    vpsrld $1, %xmm2, %xmm2
244 ; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
245 ; AVX1-NEXT:    vpmulld %xmm1, %xmm1, %xmm1
246 ; AVX1-NEXT:    vpmulld %xmm2, %xmm2, %xmm2
247 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
248 ; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
249 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
250 ; AVX1-NEXT:    retq
252 ; AVX2-LABEL: vec256_i32_signed_reg_mem:
253 ; AVX2:       # %bb.0:
254 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
255 ; AVX2-NEXT:    vpminsd %ymm1, %ymm0, %ymm2
256 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm1
257 ; AVX2-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
258 ; AVX2-NEXT:    vpsrld $1, %ymm1, %ymm1
259 ; AVX2-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
260 ; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
261 ; AVX2-NEXT:    retq
263 ; XOP-LABEL: vec256_i32_signed_reg_mem:
264 ; XOP:       # %bb.0:
265 ; XOP-NEXT:    vmovdqa (%rdi), %xmm1
266 ; XOP-NEXT:    vmovdqa 16(%rdi), %xmm2
267 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm3
268 ; XOP-NEXT:    vpminsd %xmm2, %xmm3, %xmm4
269 ; XOP-NEXT:    vpmaxsd %xmm2, %xmm3, %xmm2
270 ; XOP-NEXT:    vpsubd %xmm4, %xmm2, %xmm2
271 ; XOP-NEXT:    vpminsd %xmm1, %xmm0, %xmm4
272 ; XOP-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
273 ; XOP-NEXT:    vpsubd %xmm4, %xmm1, %xmm1
274 ; XOP-NEXT:    vpsrld $1, %xmm1, %xmm1
275 ; XOP-NEXT:    vpsrld $1, %xmm2, %xmm2
276 ; XOP-NEXT:    vpmacsdd %xmm3, %xmm2, %xmm2, %xmm2
277 ; XOP-NEXT:    vpmacsdd %xmm0, %xmm1, %xmm1, %xmm0
278 ; XOP-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
279 ; XOP-NEXT:    retq
281 ; AVX512-LABEL: vec256_i32_signed_reg_mem:
282 ; AVX512:       # %bb.0:
283 ; AVX512-NEXT:    vmovdqa (%rdi), %ymm1
284 ; AVX512-NEXT:    vpminsd %ymm1, %ymm0, %ymm2
285 ; AVX512-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm1
286 ; AVX512-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
287 ; AVX512-NEXT:    vpsrld $1, %ymm1, %ymm1
288 ; AVX512-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
289 ; AVX512-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
290 ; AVX512-NEXT:    retq
291   %a2 = load <8 x i32>, ptr %a2_addr
292   %t3 = icmp sgt <8 x i32> %a1, %a2 ; signed
293   %t4 = select <8 x i1> %t3, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
294   %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a1
295   %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a2
296   %t7 = sub <8 x i32> %t6, %t5
297   %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
298   %t9 = mul nsw <8 x i32> %t8, %t8 ; signed
299   %a10 = add nsw <8 x i32> %t9, %a1 ; signed
300   ret <8 x i32> %a10
303 define <8 x i32> @vec256_i32_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind {
304 ; AVX1-LABEL: vec256_i32_signed_mem_mem:
305 ; AVX1:       # %bb.0:
306 ; AVX1-NEXT:    vmovdqa (%rsi), %xmm0
307 ; AVX1-NEXT:    vmovdqa 16(%rsi), %xmm1
308 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm2
309 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm3
310 ; AVX1-NEXT:    vpminsd %xmm0, %xmm2, %xmm4
311 ; AVX1-NEXT:    vpmaxsd %xmm0, %xmm2, %xmm0
312 ; AVX1-NEXT:    vpsubd %xmm4, %xmm0, %xmm0
313 ; AVX1-NEXT:    vpminsd %xmm1, %xmm3, %xmm4
314 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm3, %xmm1
315 ; AVX1-NEXT:    vpsubd %xmm4, %xmm1, %xmm1
316 ; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
317 ; AVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
318 ; AVX1-NEXT:    vpmulld %xmm0, %xmm0, %xmm0
319 ; AVX1-NEXT:    vpmulld %xmm1, %xmm1, %xmm1
320 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
321 ; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0
322 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
323 ; AVX1-NEXT:    retq
325 ; AVX2-LABEL: vec256_i32_signed_mem_mem:
326 ; AVX2:       # %bb.0:
327 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
328 ; AVX2-NEXT:    vmovdqa (%rsi), %ymm1
329 ; AVX2-NEXT:    vpminsd %ymm1, %ymm0, %ymm2
330 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm1
331 ; AVX2-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
332 ; AVX2-NEXT:    vpsrld $1, %ymm1, %ymm1
333 ; AVX2-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
334 ; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
335 ; AVX2-NEXT:    retq
337 ; XOP-LABEL: vec256_i32_signed_mem_mem:
338 ; XOP:       # %bb.0:
339 ; XOP-NEXT:    vmovdqa (%rsi), %xmm0
340 ; XOP-NEXT:    vmovdqa 16(%rsi), %xmm1
341 ; XOP-NEXT:    vmovdqa (%rdi), %xmm2
342 ; XOP-NEXT:    vmovdqa 16(%rdi), %xmm3
343 ; XOP-NEXT:    vpminsd %xmm1, %xmm3, %xmm4
344 ; XOP-NEXT:    vpmaxsd %xmm1, %xmm3, %xmm1
345 ; XOP-NEXT:    vpsubd %xmm4, %xmm1, %xmm1
346 ; XOP-NEXT:    vpminsd %xmm0, %xmm2, %xmm4
347 ; XOP-NEXT:    vpmaxsd %xmm0, %xmm2, %xmm0
348 ; XOP-NEXT:    vpsubd %xmm4, %xmm0, %xmm0
349 ; XOP-NEXT:    vpsrld $1, %xmm0, %xmm0
350 ; XOP-NEXT:    vpsrld $1, %xmm1, %xmm1
351 ; XOP-NEXT:    vpmacsdd %xmm3, %xmm1, %xmm1, %xmm1
352 ; XOP-NEXT:    vpmacsdd %xmm2, %xmm0, %xmm0, %xmm0
353 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
354 ; XOP-NEXT:    retq
356 ; AVX512-LABEL: vec256_i32_signed_mem_mem:
357 ; AVX512:       # %bb.0:
358 ; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
359 ; AVX512-NEXT:    vmovdqa (%rsi), %ymm1
360 ; AVX512-NEXT:    vpminsd %ymm1, %ymm0, %ymm2
361 ; AVX512-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm1
362 ; AVX512-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
363 ; AVX512-NEXT:    vpsrld $1, %ymm1, %ymm1
364 ; AVX512-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
365 ; AVX512-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
366 ; AVX512-NEXT:    retq
367   %a1 = load <8 x i32>, ptr %a1_addr
368   %a2 = load <8 x i32>, ptr %a2_addr
369   %t3 = icmp sgt <8 x i32> %a1, %a2 ; signed
370   %t4 = select <8 x i1> %t3, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
371   %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a1
372   %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a2
373   %t7 = sub <8 x i32> %t6, %t5
374   %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
375   %t9 = mul nsw <8 x i32> %t8, %t8 ; signed
376   %a10 = add nsw <8 x i32> %t9, %a1 ; signed
377   ret <8 x i32> %a10
380 ; ---------------------------------------------------------------------------- ;
381 ; 64-bit width. 256 / 64 = 4 elts.
382 ; ---------------------------------------------------------------------------- ;
384 ; Values come from regs
386 define <4 x i64> @vec256_i64_signed_reg_reg(<4 x i64> %a1, <4 x i64> %a2) nounwind {
387 ; AVX1-LABEL: vec256_i64_signed_reg_reg:
388 ; AVX1:       # %bb.0:
389 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
390 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
391 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm4
392 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm5
393 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm6
394 ; AVX1-NEXT:    vpsubq %xmm0, %xmm1, %xmm1
395 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm6, %xmm1, %xmm1
396 ; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm6
397 ; AVX1-NEXT:    vpsubq %xmm3, %xmm2, %xmm2
398 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm6, %xmm2, %xmm2
399 ; AVX1-NEXT:    vpsrlq $1, %xmm2, %xmm6
400 ; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm7
401 ; AVX1-NEXT:    vpsrlq $33, %xmm1, %xmm1
402 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm8 = [1,1]
403 ; AVX1-NEXT:    # xmm8 = mem[0,0]
404 ; AVX1-NEXT:    vpor %xmm5, %xmm8, %xmm5
405 ; AVX1-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
406 ; AVX1-NEXT:    vpsrlq $32, %xmm5, %xmm9
407 ; AVX1-NEXT:    vpmuludq %xmm7, %xmm9, %xmm9
408 ; AVX1-NEXT:    vpaddq %xmm1, %xmm9, %xmm1
409 ; AVX1-NEXT:    vpsllq $32, %xmm1, %xmm1
410 ; AVX1-NEXT:    vpmuludq %xmm5, %xmm7, %xmm5
411 ; AVX1-NEXT:    vpsrlq $33, %xmm2, %xmm2
412 ; AVX1-NEXT:    vpor %xmm4, %xmm8, %xmm4
413 ; AVX1-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
414 ; AVX1-NEXT:    vpsrlq $32, %xmm4, %xmm7
415 ; AVX1-NEXT:    vpmuludq %xmm7, %xmm6, %xmm7
416 ; AVX1-NEXT:    vpaddq %xmm2, %xmm7, %xmm2
417 ; AVX1-NEXT:    vpsllq $32, %xmm2, %xmm2
418 ; AVX1-NEXT:    vpmuludq %xmm4, %xmm6, %xmm4
419 ; AVX1-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
420 ; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
421 ; AVX1-NEXT:    vpaddq %xmm0, %xmm5, %xmm0
422 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
423 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
424 ; AVX1-NEXT:    retq
426 ; AVX2-LABEL: vec256_i64_signed_reg_reg:
427 ; AVX2:       # %bb.0:
428 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
429 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
430 ; AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm3
431 ; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm4
432 ; AVX2-NEXT:    vpsubq %ymm0, %ymm1, %ymm1
433 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm4, %ymm1, %ymm1
434 ; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm2
435 ; AVX2-NEXT:    vpsrlq $33, %ymm1, %ymm1
436 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
437 ; AVX2-NEXT:    vpsrlq $32, %ymm3, %ymm4
438 ; AVX2-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
439 ; AVX2-NEXT:    vpaddq %ymm1, %ymm4, %ymm1
440 ; AVX2-NEXT:    vpsllq $32, %ymm1, %ymm1
441 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
442 ; AVX2-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
443 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
444 ; AVX2-NEXT:    retq
446 ; XOP-LABEL: vec256_i64_signed_reg_reg:
447 ; XOP:       # %bb.0:
448 ; XOP-NEXT:    vextractf128 $1, %ymm1, %xmm2
449 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm3
450 ; XOP-NEXT:    vpcomgtq %xmm2, %xmm3, %xmm4
451 ; XOP-NEXT:    vpcomgtq %xmm1, %xmm0, %xmm5
452 ; XOP-NEXT:    vpsubq %xmm1, %xmm0, %xmm6
453 ; XOP-NEXT:    vpsubq %xmm0, %xmm1, %xmm1
454 ; XOP-NEXT:    vblendvpd %xmm5, %xmm6, %xmm1, %xmm1
455 ; XOP-NEXT:    vpsubq %xmm2, %xmm3, %xmm6
456 ; XOP-NEXT:    vpsubq %xmm3, %xmm2, %xmm2
457 ; XOP-NEXT:    vblendvpd %xmm4, %xmm6, %xmm2, %xmm2
458 ; XOP-NEXT:    vpsrlq $1, %xmm2, %xmm6
459 ; XOP-NEXT:    vpsrlq $1, %xmm1, %xmm7
460 ; XOP-NEXT:    vpsrlq $33, %xmm1, %xmm1
461 ; XOP-NEXT:    vmovddup {{.*#+}} xmm8 = [1,1]
462 ; XOP-NEXT:    # xmm8 = mem[0,0]
463 ; XOP-NEXT:    vpor %xmm5, %xmm8, %xmm5
464 ; XOP-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
465 ; XOP-NEXT:    vpsrlq $32, %xmm5, %xmm9
466 ; XOP-NEXT:    vpmuludq %xmm7, %xmm9, %xmm9
467 ; XOP-NEXT:    vpaddq %xmm1, %xmm9, %xmm1
468 ; XOP-NEXT:    vpsllq $32, %xmm1, %xmm1
469 ; XOP-NEXT:    vpmuludq %xmm5, %xmm7, %xmm5
470 ; XOP-NEXT:    vpsrlq $33, %xmm2, %xmm2
471 ; XOP-NEXT:    vpor %xmm4, %xmm8, %xmm4
472 ; XOP-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
473 ; XOP-NEXT:    vpsrlq $32, %xmm4, %xmm7
474 ; XOP-NEXT:    vpmuludq %xmm7, %xmm6, %xmm7
475 ; XOP-NEXT:    vpaddq %xmm2, %xmm7, %xmm2
476 ; XOP-NEXT:    vpsllq $32, %xmm2, %xmm2
477 ; XOP-NEXT:    vpmuludq %xmm4, %xmm6, %xmm4
478 ; XOP-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
479 ; XOP-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
480 ; XOP-NEXT:    vpaddq %xmm0, %xmm5, %xmm0
481 ; XOP-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
482 ; XOP-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
483 ; XOP-NEXT:    retq
485 ; AVX512F-LABEL: vec256_i64_signed_reg_reg:
486 ; AVX512F:       # %bb.0:
487 ; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
488 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
489 ; AVX512F-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
490 ; AVX512F-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
491 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
492 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
493 ; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
494 ; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
495 ; AVX512F-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
496 ; AVX512F-NEXT:    vpsrlq $1, %ymm1, %ymm2
497 ; AVX512F-NEXT:    vpsrlq $33, %ymm1, %ymm1
498 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
499 ; AVX512F-NEXT:    vpsrlq $32, %ymm3, %ymm4
500 ; AVX512F-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
501 ; AVX512F-NEXT:    vpaddq %ymm1, %ymm4, %ymm1
502 ; AVX512F-NEXT:    vpsllq $32, %ymm1, %ymm1
503 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
504 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
505 ; AVX512F-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
506 ; AVX512F-NEXT:    retq
508 ; AVX512VL-LABEL: vec256_i64_signed_reg_reg:
509 ; AVX512VL:       # %bb.0:
510 ; AVX512VL-NEXT:    vpcmpgtq %ymm1, %ymm0, %k1
511 ; AVX512VL-NEXT:    vpminsq %ymm1, %ymm0, %ymm2
512 ; AVX512VL-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm1
513 ; AVX512VL-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
514 ; AVX512VL-NEXT:    vpsrlq $1, %ymm1, %ymm1
515 ; AVX512VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
516 ; AVX512VL-NEXT:    vpsubq %ymm1, %ymm2, %ymm1 {%k1}
517 ; AVX512VL-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
518 ; AVX512VL-NEXT:    retq
520 ; AVX512BW-FALLBACK-LABEL: vec256_i64_signed_reg_reg:
521 ; AVX512BW-FALLBACK:       # %bb.0:
522 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
523 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
524 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
525 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
526 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
527 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
528 ; AVX512BW-FALLBACK-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
529 ; AVX512BW-FALLBACK-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
530 ; AVX512BW-FALLBACK-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
531 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %ymm1, %ymm2
532 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $33, %ymm1, %ymm1
533 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
534 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm3, %ymm4
535 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
536 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm1, %ymm4, %ymm1
537 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %ymm1, %ymm1
538 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
539 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
540 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
541 ; AVX512BW-FALLBACK-NEXT:    retq
542   %t3 = icmp sgt <4 x i64> %a1, %a2 ; signed
543   %t4 = select <4 x i1> %t3, <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>, <4 x i64> <i64 1, i64 1, i64 1, i64 1>
544   %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a1
545   %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a2
546   %t7 = sub <4 x i64> %t6, %t5
547   %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>
548   %t9 = mul nsw <4 x i64> %t8, %t4 ; signed
549   %a10 = add nsw <4 x i64> %t9, %a1 ; signed
550   ret <4 x i64> %a10
553 define <4 x i64> @vec256_i64_unsigned_reg_reg(<4 x i64> %a1, <4 x i64> %a2) nounwind {
554 ; AVX1-LABEL: vec256_i64_unsigned_reg_reg:
555 ; AVX1:       # %bb.0:
556 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
557 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
558 ; AVX1-NEXT:    # xmm4 = mem[0,0]
559 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm5
560 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
561 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm6
562 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
563 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm6
564 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm4
565 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm4, %xmm4
566 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm6
567 ; AVX1-NEXT:    vpsubq %xmm0, %xmm1, %xmm1
568 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm6, %xmm1, %xmm1
569 ; AVX1-NEXT:    vpsubq %xmm3, %xmm2, %xmm6
570 ; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm3
571 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm6, %xmm3, %xmm3
572 ; AVX1-NEXT:    vpsrlq $1, %xmm3, %xmm6
573 ; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm7
574 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm8 = [1,1]
575 ; AVX1-NEXT:    # xmm8 = mem[0,0]
576 ; AVX1-NEXT:    vpor %xmm4, %xmm8, %xmm4
577 ; AVX1-NEXT:    vpsrlq $33, %xmm1, %xmm1
578 ; AVX1-NEXT:    vpmuludq %xmm4, %xmm1, %xmm1
579 ; AVX1-NEXT:    vpsrlq $32, %xmm4, %xmm9
580 ; AVX1-NEXT:    vpmuludq %xmm7, %xmm9, %xmm9
581 ; AVX1-NEXT:    vpaddq %xmm1, %xmm9, %xmm1
582 ; AVX1-NEXT:    vpsllq $32, %xmm1, %xmm1
583 ; AVX1-NEXT:    vpmuludq %xmm4, %xmm7, %xmm4
584 ; AVX1-NEXT:    vpor %xmm5, %xmm8, %xmm5
585 ; AVX1-NEXT:    vpsrlq $33, %xmm3, %xmm3
586 ; AVX1-NEXT:    vpmuludq %xmm5, %xmm3, %xmm3
587 ; AVX1-NEXT:    vpsrlq $32, %xmm5, %xmm7
588 ; AVX1-NEXT:    vpmuludq %xmm7, %xmm6, %xmm7
589 ; AVX1-NEXT:    vpaddq %xmm3, %xmm7, %xmm3
590 ; AVX1-NEXT:    vpsllq $32, %xmm3, %xmm3
591 ; AVX1-NEXT:    vpmuludq %xmm5, %xmm6, %xmm5
592 ; AVX1-NEXT:    vpaddq %xmm2, %xmm5, %xmm2
593 ; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
594 ; AVX1-NEXT:    vpaddq %xmm0, %xmm4, %xmm0
595 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
596 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
597 ; AVX1-NEXT:    retq
599 ; AVX2-LABEL: vec256_i64_unsigned_reg_reg:
600 ; AVX2:       # %bb.0:
601 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
602 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm3
603 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
604 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
605 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
606 ; AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm3
607 ; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm4
608 ; AVX2-NEXT:    vpsubq %ymm0, %ymm1, %ymm1
609 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm4, %ymm1, %ymm1
610 ; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm2
611 ; AVX2-NEXT:    vpsrlq $33, %ymm1, %ymm1
612 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
613 ; AVX2-NEXT:    vpsrlq $32, %ymm3, %ymm4
614 ; AVX2-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
615 ; AVX2-NEXT:    vpaddq %ymm1, %ymm4, %ymm1
616 ; AVX2-NEXT:    vpsllq $32, %ymm1, %ymm1
617 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
618 ; AVX2-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
619 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
620 ; AVX2-NEXT:    retq
622 ; XOP-LABEL: vec256_i64_unsigned_reg_reg:
623 ; XOP:       # %bb.0:
624 ; XOP-NEXT:    vextractf128 $1, %ymm1, %xmm2
625 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm3
626 ; XOP-NEXT:    vpcomgtuq %xmm2, %xmm3, %xmm4
627 ; XOP-NEXT:    vpcomgtuq %xmm1, %xmm0, %xmm5
628 ; XOP-NEXT:    vpsubq %xmm1, %xmm0, %xmm6
629 ; XOP-NEXT:    vpsubq %xmm0, %xmm1, %xmm1
630 ; XOP-NEXT:    vblendvpd %xmm5, %xmm6, %xmm1, %xmm1
631 ; XOP-NEXT:    vpsubq %xmm2, %xmm3, %xmm6
632 ; XOP-NEXT:    vpsubq %xmm3, %xmm2, %xmm2
633 ; XOP-NEXT:    vblendvpd %xmm4, %xmm6, %xmm2, %xmm2
634 ; XOP-NEXT:    vpsrlq $1, %xmm2, %xmm6
635 ; XOP-NEXT:    vpsrlq $1, %xmm1, %xmm7
636 ; XOP-NEXT:    vpsrlq $33, %xmm1, %xmm1
637 ; XOP-NEXT:    vmovddup {{.*#+}} xmm8 = [1,1]
638 ; XOP-NEXT:    # xmm8 = mem[0,0]
639 ; XOP-NEXT:    vpor %xmm5, %xmm8, %xmm5
640 ; XOP-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
641 ; XOP-NEXT:    vpsrlq $32, %xmm5, %xmm9
642 ; XOP-NEXT:    vpmuludq %xmm7, %xmm9, %xmm9
643 ; XOP-NEXT:    vpaddq %xmm1, %xmm9, %xmm1
644 ; XOP-NEXT:    vpsllq $32, %xmm1, %xmm1
645 ; XOP-NEXT:    vpmuludq %xmm5, %xmm7, %xmm5
646 ; XOP-NEXT:    vpsrlq $33, %xmm2, %xmm2
647 ; XOP-NEXT:    vpor %xmm4, %xmm8, %xmm4
648 ; XOP-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
649 ; XOP-NEXT:    vpsrlq $32, %xmm4, %xmm7
650 ; XOP-NEXT:    vpmuludq %xmm7, %xmm6, %xmm7
651 ; XOP-NEXT:    vpaddq %xmm2, %xmm7, %xmm2
652 ; XOP-NEXT:    vpsllq $32, %xmm2, %xmm2
653 ; XOP-NEXT:    vpmuludq %xmm4, %xmm6, %xmm4
654 ; XOP-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
655 ; XOP-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
656 ; XOP-NEXT:    vpaddq %xmm0, %xmm5, %xmm0
657 ; XOP-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
658 ; XOP-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
659 ; XOP-NEXT:    retq
661 ; AVX512F-LABEL: vec256_i64_unsigned_reg_reg:
662 ; AVX512F:       # %bb.0:
663 ; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
664 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
665 ; AVX512F-NEXT:    vpcmpnleuq %zmm1, %zmm0, %k1
666 ; AVX512F-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
667 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
668 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
669 ; AVX512F-NEXT:    vpminuq %zmm1, %zmm0, %zmm2
670 ; AVX512F-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm1
671 ; AVX512F-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
672 ; AVX512F-NEXT:    vpsrlq $1, %ymm1, %ymm2
673 ; AVX512F-NEXT:    vpsrlq $33, %ymm1, %ymm1
674 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
675 ; AVX512F-NEXT:    vpsrlq $32, %ymm3, %ymm4
676 ; AVX512F-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
677 ; AVX512F-NEXT:    vpaddq %ymm1, %ymm4, %ymm1
678 ; AVX512F-NEXT:    vpsllq $32, %ymm1, %ymm1
679 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
680 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
681 ; AVX512F-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
682 ; AVX512F-NEXT:    retq
684 ; AVX512VL-LABEL: vec256_i64_unsigned_reg_reg:
685 ; AVX512VL:       # %bb.0:
686 ; AVX512VL-NEXT:    vpcmpnleuq %ymm1, %ymm0, %k1
687 ; AVX512VL-NEXT:    vpminuq %ymm1, %ymm0, %ymm2
688 ; AVX512VL-NEXT:    vpmaxuq %ymm1, %ymm0, %ymm1
689 ; AVX512VL-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
690 ; AVX512VL-NEXT:    vpsrlq $1, %ymm1, %ymm1
691 ; AVX512VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
692 ; AVX512VL-NEXT:    vpsubq %ymm1, %ymm2, %ymm1 {%k1}
693 ; AVX512VL-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
694 ; AVX512VL-NEXT:    retq
696 ; AVX512BW-FALLBACK-LABEL: vec256_i64_unsigned_reg_reg:
697 ; AVX512BW-FALLBACK:       # %bb.0:
698 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
699 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
700 ; AVX512BW-FALLBACK-NEXT:    vpcmpnleuq %zmm1, %zmm0, %k1
701 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
702 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
703 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
704 ; AVX512BW-FALLBACK-NEXT:    vpminuq %zmm1, %zmm0, %zmm2
705 ; AVX512BW-FALLBACK-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm1
706 ; AVX512BW-FALLBACK-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
707 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %ymm1, %ymm2
708 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $33, %ymm1, %ymm1
709 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
710 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm3, %ymm4
711 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
712 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm1, %ymm4, %ymm1
713 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %ymm1, %ymm1
714 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
715 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
716 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
717 ; AVX512BW-FALLBACK-NEXT:    retq
718   %t3 = icmp ugt <4 x i64> %a1, %a2
719   %t4 = select <4 x i1> %t3, <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>, <4 x i64> <i64 1, i64 1, i64 1, i64 1>
720   %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a1
721   %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a2
722   %t7 = sub <4 x i64> %t6, %t5
723   %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>
724   %t9 = mul <4 x i64> %t8, %t4
725   %a10 = add <4 x i64> %t9, %a1
726   ret <4 x i64> %a10
729 ; Values are loaded. Only check signed case.
731 define <4 x i64> @vec256_i64_signed_mem_reg(ptr %a1_addr, <4 x i64> %a2) nounwind {
732 ; AVX1-LABEL: vec256_i64_signed_mem_reg:
733 ; AVX1:       # %bb.0:
734 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
735 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm2
736 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm3
737 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm4
738 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm5
739 ; AVX1-NEXT:    vpsubq %xmm0, %xmm2, %xmm6
740 ; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
741 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm6, %xmm0, %xmm0
742 ; AVX1-NEXT:    vpsubq %xmm1, %xmm3, %xmm6
743 ; AVX1-NEXT:    vpsubq %xmm3, %xmm1, %xmm1
744 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm6, %xmm1, %xmm1
745 ; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm6
746 ; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm7
747 ; AVX1-NEXT:    vpsrlq $33, %xmm0, %xmm0
748 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm8 = [1,1]
749 ; AVX1-NEXT:    # xmm8 = mem[0,0]
750 ; AVX1-NEXT:    vpor %xmm5, %xmm8, %xmm5
751 ; AVX1-NEXT:    vpmuludq %xmm5, %xmm0, %xmm0
752 ; AVX1-NEXT:    vpsrlq $32, %xmm5, %xmm9
753 ; AVX1-NEXT:    vpmuludq %xmm7, %xmm9, %xmm9
754 ; AVX1-NEXT:    vpaddq %xmm0, %xmm9, %xmm0
755 ; AVX1-NEXT:    vpsllq $32, %xmm0, %xmm0
756 ; AVX1-NEXT:    vpmuludq %xmm5, %xmm7, %xmm5
757 ; AVX1-NEXT:    vpsrlq $33, %xmm1, %xmm1
758 ; AVX1-NEXT:    vpor %xmm4, %xmm8, %xmm4
759 ; AVX1-NEXT:    vpmuludq %xmm4, %xmm1, %xmm1
760 ; AVX1-NEXT:    vpsrlq $32, %xmm4, %xmm7
761 ; AVX1-NEXT:    vpmuludq %xmm7, %xmm6, %xmm7
762 ; AVX1-NEXT:    vpaddq %xmm1, %xmm7, %xmm1
763 ; AVX1-NEXT:    vpsllq $32, %xmm1, %xmm1
764 ; AVX1-NEXT:    vpmuludq %xmm4, %xmm6, %xmm4
765 ; AVX1-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
766 ; AVX1-NEXT:    vpaddq %xmm1, %xmm3, %xmm1
767 ; AVX1-NEXT:    vpaddq %xmm2, %xmm5, %xmm2
768 ; AVX1-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
769 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
770 ; AVX1-NEXT:    retq
772 ; AVX2-LABEL: vec256_i64_signed_mem_reg:
773 ; AVX2:       # %bb.0:
774 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
775 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
776 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
777 ; AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm3
778 ; AVX2-NEXT:    vpsubq %ymm0, %ymm1, %ymm4
779 ; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
780 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm4, %ymm0, %ymm0
781 ; AVX2-NEXT:    vpsrlq $1, %ymm0, %ymm2
782 ; AVX2-NEXT:    vpsrlq $33, %ymm0, %ymm0
783 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm0, %ymm0
784 ; AVX2-NEXT:    vpsrlq $32, %ymm3, %ymm4
785 ; AVX2-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
786 ; AVX2-NEXT:    vpaddq %ymm0, %ymm4, %ymm0
787 ; AVX2-NEXT:    vpsllq $32, %ymm0, %ymm0
788 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
789 ; AVX2-NEXT:    vpaddq %ymm1, %ymm2, %ymm1
790 ; AVX2-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
791 ; AVX2-NEXT:    retq
793 ; XOP-LABEL: vec256_i64_signed_mem_reg:
794 ; XOP:       # %bb.0:
795 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm1
796 ; XOP-NEXT:    vmovdqa (%rdi), %xmm2
797 ; XOP-NEXT:    vmovdqa 16(%rdi), %xmm3
798 ; XOP-NEXT:    vpcomgtq %xmm1, %xmm3, %xmm4
799 ; XOP-NEXT:    vpcomgtq %xmm0, %xmm2, %xmm5
800 ; XOP-NEXT:    vpsubq %xmm0, %xmm2, %xmm6
801 ; XOP-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
802 ; XOP-NEXT:    vblendvpd %xmm5, %xmm6, %xmm0, %xmm0
803 ; XOP-NEXT:    vpsubq %xmm1, %xmm3, %xmm6
804 ; XOP-NEXT:    vpsubq %xmm3, %xmm1, %xmm1
805 ; XOP-NEXT:    vblendvpd %xmm4, %xmm6, %xmm1, %xmm1
806 ; XOP-NEXT:    vpsrlq $1, %xmm1, %xmm6
807 ; XOP-NEXT:    vpsrlq $1, %xmm0, %xmm7
808 ; XOP-NEXT:    vpsrlq $33, %xmm0, %xmm0
809 ; XOP-NEXT:    vmovddup {{.*#+}} xmm8 = [1,1]
810 ; XOP-NEXT:    # xmm8 = mem[0,0]
811 ; XOP-NEXT:    vpor %xmm5, %xmm8, %xmm5
812 ; XOP-NEXT:    vpmuludq %xmm5, %xmm0, %xmm0
813 ; XOP-NEXT:    vpsrlq $32, %xmm5, %xmm9
814 ; XOP-NEXT:    vpmuludq %xmm7, %xmm9, %xmm9
815 ; XOP-NEXT:    vpaddq %xmm0, %xmm9, %xmm0
816 ; XOP-NEXT:    vpsllq $32, %xmm0, %xmm0
817 ; XOP-NEXT:    vpmuludq %xmm5, %xmm7, %xmm5
818 ; XOP-NEXT:    vpsrlq $33, %xmm1, %xmm1
819 ; XOP-NEXT:    vpor %xmm4, %xmm8, %xmm4
820 ; XOP-NEXT:    vpmuludq %xmm4, %xmm1, %xmm1
821 ; XOP-NEXT:    vpsrlq $32, %xmm4, %xmm7
822 ; XOP-NEXT:    vpmuludq %xmm7, %xmm6, %xmm7
823 ; XOP-NEXT:    vpaddq %xmm1, %xmm7, %xmm1
824 ; XOP-NEXT:    vpsllq $32, %xmm1, %xmm1
825 ; XOP-NEXT:    vpmuludq %xmm4, %xmm6, %xmm4
826 ; XOP-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
827 ; XOP-NEXT:    vpaddq %xmm1, %xmm3, %xmm1
828 ; XOP-NEXT:    vpaddq %xmm2, %xmm5, %xmm2
829 ; XOP-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
830 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
831 ; XOP-NEXT:    retq
833 ; AVX512F-LABEL: vec256_i64_signed_mem_reg:
834 ; AVX512F:       # %bb.0:
835 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
836 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm1
837 ; AVX512F-NEXT:    vpcmpgtq %zmm0, %zmm1, %k1
838 ; AVX512F-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
839 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
840 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
841 ; AVX512F-NEXT:    vpminsq %zmm0, %zmm1, %zmm2
842 ; AVX512F-NEXT:    vpmaxsq %zmm0, %zmm1, %zmm0
843 ; AVX512F-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
844 ; AVX512F-NEXT:    vpsrlq $1, %ymm0, %ymm2
845 ; AVX512F-NEXT:    vpsrlq $33, %ymm0, %ymm0
846 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm0, %ymm0
847 ; AVX512F-NEXT:    vpsrlq $32, %ymm3, %ymm4
848 ; AVX512F-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
849 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm4, %ymm0
850 ; AVX512F-NEXT:    vpsllq $32, %ymm0, %ymm0
851 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
852 ; AVX512F-NEXT:    vpaddq %ymm1, %ymm2, %ymm1
853 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
854 ; AVX512F-NEXT:    retq
856 ; AVX512VL-LABEL: vec256_i64_signed_mem_reg:
857 ; AVX512VL:       # %bb.0:
858 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm1
859 ; AVX512VL-NEXT:    vpcmpgtq %ymm0, %ymm1, %k1
860 ; AVX512VL-NEXT:    vpminsq %ymm0, %ymm1, %ymm2
861 ; AVX512VL-NEXT:    vpmaxsq %ymm0, %ymm1, %ymm0
862 ; AVX512VL-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
863 ; AVX512VL-NEXT:    vpsrlq $1, %ymm0, %ymm0
864 ; AVX512VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
865 ; AVX512VL-NEXT:    vpsubq %ymm0, %ymm2, %ymm0 {%k1}
866 ; AVX512VL-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
867 ; AVX512VL-NEXT:    retq
869 ; AVX512BW-FALLBACK-LABEL: vec256_i64_signed_mem_reg:
870 ; AVX512BW-FALLBACK:       # %bb.0:
871 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
872 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
873 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtq %zmm0, %zmm1, %k1
874 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
875 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
876 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
877 ; AVX512BW-FALLBACK-NEXT:    vpminsq %zmm0, %zmm1, %zmm2
878 ; AVX512BW-FALLBACK-NEXT:    vpmaxsq %zmm0, %zmm1, %zmm0
879 ; AVX512BW-FALLBACK-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
880 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %ymm0, %ymm2
881 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $33, %ymm0, %ymm0
882 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm0, %ymm0
883 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm3, %ymm4
884 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
885 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm0, %ymm4, %ymm0
886 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %ymm0, %ymm0
887 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
888 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm1, %ymm2, %ymm1
889 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
890 ; AVX512BW-FALLBACK-NEXT:    retq
891   %a1 = load <4 x i64>, ptr %a1_addr
892   %t3 = icmp sgt <4 x i64> %a1, %a2 ; signed
893   %t4 = select <4 x i1> %t3, <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>, <4 x i64> <i64 1, i64 1, i64 1, i64 1>
894   %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a1
895   %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a2
896   %t7 = sub <4 x i64> %t6, %t5
897   %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>
898   %t9 = mul nsw <4 x i64> %t8, %t4 ; signed
899   %a10 = add nsw <4 x i64> %t9, %a1 ; signed
900   ret <4 x i64> %a10
903 define <4 x i64> @vec256_i64_signed_reg_mem(<4 x i64> %a1, ptr %a2_addr) nounwind {
904 ; AVX1-LABEL: vec256_i64_signed_reg_mem:
905 ; AVX1:       # %bb.0:
906 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm1
907 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm2
908 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
909 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm4
910 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm5
911 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm6
912 ; AVX1-NEXT:    vpsubq %xmm0, %xmm1, %xmm1
913 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm6, %xmm1, %xmm1
914 ; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm6
915 ; AVX1-NEXT:    vpsubq %xmm3, %xmm2, %xmm2
916 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm6, %xmm2, %xmm2
917 ; AVX1-NEXT:    vpsrlq $1, %xmm2, %xmm6
918 ; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm7
919 ; AVX1-NEXT:    vpsrlq $33, %xmm1, %xmm1
920 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm8 = [1,1]
921 ; AVX1-NEXT:    # xmm8 = mem[0,0]
922 ; AVX1-NEXT:    vpor %xmm5, %xmm8, %xmm5
923 ; AVX1-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
924 ; AVX1-NEXT:    vpsrlq $32, %xmm5, %xmm9
925 ; AVX1-NEXT:    vpmuludq %xmm7, %xmm9, %xmm9
926 ; AVX1-NEXT:    vpaddq %xmm1, %xmm9, %xmm1
927 ; AVX1-NEXT:    vpsllq $32, %xmm1, %xmm1
928 ; AVX1-NEXT:    vpmuludq %xmm5, %xmm7, %xmm5
929 ; AVX1-NEXT:    vpsrlq $33, %xmm2, %xmm2
930 ; AVX1-NEXT:    vpor %xmm4, %xmm8, %xmm4
931 ; AVX1-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
932 ; AVX1-NEXT:    vpsrlq $32, %xmm4, %xmm7
933 ; AVX1-NEXT:    vpmuludq %xmm7, %xmm6, %xmm7
934 ; AVX1-NEXT:    vpaddq %xmm2, %xmm7, %xmm2
935 ; AVX1-NEXT:    vpsllq $32, %xmm2, %xmm2
936 ; AVX1-NEXT:    vpmuludq %xmm4, %xmm6, %xmm4
937 ; AVX1-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
938 ; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
939 ; AVX1-NEXT:    vpaddq %xmm0, %xmm5, %xmm0
940 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
941 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
942 ; AVX1-NEXT:    retq
944 ; AVX2-LABEL: vec256_i64_signed_reg_mem:
945 ; AVX2:       # %bb.0:
946 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
947 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
948 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
949 ; AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm3
950 ; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm4
951 ; AVX2-NEXT:    vpsubq %ymm0, %ymm1, %ymm1
952 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm4, %ymm1, %ymm1
953 ; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm2
954 ; AVX2-NEXT:    vpsrlq $33, %ymm1, %ymm1
955 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
956 ; AVX2-NEXT:    vpsrlq $32, %ymm3, %ymm4
957 ; AVX2-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
958 ; AVX2-NEXT:    vpaddq %ymm1, %ymm4, %ymm1
959 ; AVX2-NEXT:    vpsllq $32, %ymm1, %ymm1
960 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
961 ; AVX2-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
962 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
963 ; AVX2-NEXT:    retq
965 ; XOP-LABEL: vec256_i64_signed_reg_mem:
966 ; XOP:       # %bb.0:
967 ; XOP-NEXT:    vmovdqa (%rdi), %xmm1
968 ; XOP-NEXT:    vmovdqa 16(%rdi), %xmm2
969 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm3
970 ; XOP-NEXT:    vpcomgtq %xmm2, %xmm3, %xmm4
971 ; XOP-NEXT:    vpcomgtq %xmm1, %xmm0, %xmm5
972 ; XOP-NEXT:    vpsubq %xmm1, %xmm0, %xmm6
973 ; XOP-NEXT:    vpsubq %xmm0, %xmm1, %xmm1
974 ; XOP-NEXT:    vblendvpd %xmm5, %xmm6, %xmm1, %xmm1
975 ; XOP-NEXT:    vpsubq %xmm2, %xmm3, %xmm6
976 ; XOP-NEXT:    vpsubq %xmm3, %xmm2, %xmm2
977 ; XOP-NEXT:    vblendvpd %xmm4, %xmm6, %xmm2, %xmm2
978 ; XOP-NEXT:    vpsrlq $1, %xmm2, %xmm6
979 ; XOP-NEXT:    vpsrlq $1, %xmm1, %xmm7
980 ; XOP-NEXT:    vpsrlq $33, %xmm1, %xmm1
981 ; XOP-NEXT:    vmovddup {{.*#+}} xmm8 = [1,1]
982 ; XOP-NEXT:    # xmm8 = mem[0,0]
983 ; XOP-NEXT:    vpor %xmm5, %xmm8, %xmm5
984 ; XOP-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
985 ; XOP-NEXT:    vpsrlq $32, %xmm5, %xmm9
986 ; XOP-NEXT:    vpmuludq %xmm7, %xmm9, %xmm9
987 ; XOP-NEXT:    vpaddq %xmm1, %xmm9, %xmm1
988 ; XOP-NEXT:    vpsllq $32, %xmm1, %xmm1
989 ; XOP-NEXT:    vpmuludq %xmm5, %xmm7, %xmm5
990 ; XOP-NEXT:    vpsrlq $33, %xmm2, %xmm2
991 ; XOP-NEXT:    vpor %xmm4, %xmm8, %xmm4
992 ; XOP-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
993 ; XOP-NEXT:    vpsrlq $32, %xmm4, %xmm7
994 ; XOP-NEXT:    vpmuludq %xmm7, %xmm6, %xmm7
995 ; XOP-NEXT:    vpaddq %xmm2, %xmm7, %xmm2
996 ; XOP-NEXT:    vpsllq $32, %xmm2, %xmm2
997 ; XOP-NEXT:    vpmuludq %xmm4, %xmm6, %xmm4
998 ; XOP-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
999 ; XOP-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
1000 ; XOP-NEXT:    vpaddq %xmm0, %xmm5, %xmm0
1001 ; XOP-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1002 ; XOP-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1003 ; XOP-NEXT:    retq
1005 ; AVX512F-LABEL: vec256_i64_signed_reg_mem:
1006 ; AVX512F:       # %bb.0:
1007 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1008 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm1
1009 ; AVX512F-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1010 ; AVX512F-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1011 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1012 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1013 ; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
1014 ; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
1015 ; AVX512F-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
1016 ; AVX512F-NEXT:    vpsrlq $1, %ymm1, %ymm2
1017 ; AVX512F-NEXT:    vpsrlq $33, %ymm1, %ymm1
1018 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
1019 ; AVX512F-NEXT:    vpsrlq $32, %ymm3, %ymm4
1020 ; AVX512F-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
1021 ; AVX512F-NEXT:    vpaddq %ymm1, %ymm4, %ymm1
1022 ; AVX512F-NEXT:    vpsllq $32, %ymm1, %ymm1
1023 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
1024 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
1025 ; AVX512F-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1026 ; AVX512F-NEXT:    retq
1028 ; AVX512VL-LABEL: vec256_i64_signed_reg_mem:
1029 ; AVX512VL:       # %bb.0:
1030 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm1
1031 ; AVX512VL-NEXT:    vpcmpgtq %ymm1, %ymm0, %k1
1032 ; AVX512VL-NEXT:    vpminsq %ymm1, %ymm0, %ymm2
1033 ; AVX512VL-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm1
1034 ; AVX512VL-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
1035 ; AVX512VL-NEXT:    vpsrlq $1, %ymm1, %ymm1
1036 ; AVX512VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1037 ; AVX512VL-NEXT:    vpsubq %ymm1, %ymm2, %ymm1 {%k1}
1038 ; AVX512VL-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
1039 ; AVX512VL-NEXT:    retq
1041 ; AVX512BW-FALLBACK-LABEL: vec256_i64_signed_reg_mem:
1042 ; AVX512BW-FALLBACK:       # %bb.0:
1043 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1044 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
1045 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1046 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1047 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1048 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1049 ; AVX512BW-FALLBACK-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
1050 ; AVX512BW-FALLBACK-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
1051 ; AVX512BW-FALLBACK-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
1052 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %ymm1, %ymm2
1053 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $33, %ymm1, %ymm1
1054 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
1055 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm3, %ymm4
1056 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
1057 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm1, %ymm4, %ymm1
1058 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %ymm1, %ymm1
1059 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
1060 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
1061 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1062 ; AVX512BW-FALLBACK-NEXT:    retq
1063   %a2 = load <4 x i64>, ptr %a2_addr
1064   %t3 = icmp sgt <4 x i64> %a1, %a2 ; signed
1065   %t4 = select <4 x i1> %t3, <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>, <4 x i64> <i64 1, i64 1, i64 1, i64 1>
1066   %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a1
1067   %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a2
1068   %t7 = sub <4 x i64> %t6, %t5
1069   %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>
1070   %t9 = mul nsw <4 x i64> %t8, %t4 ; signed
1071   %a10 = add nsw <4 x i64> %t9, %a1 ; signed
1072   ret <4 x i64> %a10
1075 define <4 x i64> @vec256_i64_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind {
1076 ; AVX1-LABEL: vec256_i64_signed_mem_mem:
1077 ; AVX1:       # %bb.0:
1078 ; AVX1-NEXT:    vmovdqa (%rsi), %xmm0
1079 ; AVX1-NEXT:    vmovdqa 16(%rsi), %xmm1
1080 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm2
1081 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm3
1082 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm4
1083 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm5
1084 ; AVX1-NEXT:    vpsubq %xmm0, %xmm2, %xmm6
1085 ; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
1086 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm6, %xmm0, %xmm0
1087 ; AVX1-NEXT:    vpsubq %xmm1, %xmm3, %xmm6
1088 ; AVX1-NEXT:    vpsubq %xmm3, %xmm1, %xmm1
1089 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm6, %xmm1, %xmm1
1090 ; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm6
1091 ; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm7
1092 ; AVX1-NEXT:    vpsrlq $33, %xmm0, %xmm0
1093 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm8 = [1,1]
1094 ; AVX1-NEXT:    # xmm8 = mem[0,0]
1095 ; AVX1-NEXT:    vpor %xmm5, %xmm8, %xmm5
1096 ; AVX1-NEXT:    vpmuludq %xmm5, %xmm0, %xmm0
1097 ; AVX1-NEXT:    vpsrlq $32, %xmm5, %xmm9
1098 ; AVX1-NEXT:    vpmuludq %xmm7, %xmm9, %xmm9
1099 ; AVX1-NEXT:    vpaddq %xmm0, %xmm9, %xmm0
1100 ; AVX1-NEXT:    vpsllq $32, %xmm0, %xmm0
1101 ; AVX1-NEXT:    vpmuludq %xmm5, %xmm7, %xmm5
1102 ; AVX1-NEXT:    vpsrlq $33, %xmm1, %xmm1
1103 ; AVX1-NEXT:    vpor %xmm4, %xmm8, %xmm4
1104 ; AVX1-NEXT:    vpmuludq %xmm4, %xmm1, %xmm1
1105 ; AVX1-NEXT:    vpsrlq $32, %xmm4, %xmm7
1106 ; AVX1-NEXT:    vpmuludq %xmm7, %xmm6, %xmm7
1107 ; AVX1-NEXT:    vpaddq %xmm1, %xmm7, %xmm1
1108 ; AVX1-NEXT:    vpsllq $32, %xmm1, %xmm1
1109 ; AVX1-NEXT:    vpmuludq %xmm4, %xmm6, %xmm4
1110 ; AVX1-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
1111 ; AVX1-NEXT:    vpaddq %xmm1, %xmm3, %xmm1
1112 ; AVX1-NEXT:    vpaddq %xmm2, %xmm5, %xmm2
1113 ; AVX1-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1114 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1115 ; AVX1-NEXT:    retq
1117 ; AVX2-LABEL: vec256_i64_signed_mem_mem:
1118 ; AVX2:       # %bb.0:
1119 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
1120 ; AVX2-NEXT:    vmovdqa (%rsi), %ymm1
1121 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
1122 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1123 ; AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm3
1124 ; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm4
1125 ; AVX2-NEXT:    vpsubq %ymm0, %ymm1, %ymm1
1126 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm4, %ymm1, %ymm1
1127 ; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm2
1128 ; AVX2-NEXT:    vpsrlq $33, %ymm1, %ymm1
1129 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
1130 ; AVX2-NEXT:    vpsrlq $32, %ymm3, %ymm4
1131 ; AVX2-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
1132 ; AVX2-NEXT:    vpaddq %ymm1, %ymm4, %ymm1
1133 ; AVX2-NEXT:    vpsllq $32, %ymm1, %ymm1
1134 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
1135 ; AVX2-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
1136 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1137 ; AVX2-NEXT:    retq
1139 ; XOP-LABEL: vec256_i64_signed_mem_mem:
1140 ; XOP:       # %bb.0:
1141 ; XOP-NEXT:    vmovdqa (%rsi), %xmm0
1142 ; XOP-NEXT:    vmovdqa 16(%rsi), %xmm1
1143 ; XOP-NEXT:    vmovdqa (%rdi), %xmm2
1144 ; XOP-NEXT:    vmovdqa 16(%rdi), %xmm3
1145 ; XOP-NEXT:    vpcomgtq %xmm1, %xmm3, %xmm4
1146 ; XOP-NEXT:    vpcomgtq %xmm0, %xmm2, %xmm5
1147 ; XOP-NEXT:    vpsubq %xmm0, %xmm2, %xmm6
1148 ; XOP-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
1149 ; XOP-NEXT:    vblendvpd %xmm5, %xmm6, %xmm0, %xmm0
1150 ; XOP-NEXT:    vpsubq %xmm1, %xmm3, %xmm6
1151 ; XOP-NEXT:    vpsubq %xmm3, %xmm1, %xmm1
1152 ; XOP-NEXT:    vblendvpd %xmm4, %xmm6, %xmm1, %xmm1
1153 ; XOP-NEXT:    vpsrlq $1, %xmm1, %xmm6
1154 ; XOP-NEXT:    vpsrlq $1, %xmm0, %xmm7
1155 ; XOP-NEXT:    vpsrlq $33, %xmm0, %xmm0
1156 ; XOP-NEXT:    vmovddup {{.*#+}} xmm8 = [1,1]
1157 ; XOP-NEXT:    # xmm8 = mem[0,0]
1158 ; XOP-NEXT:    vpor %xmm5, %xmm8, %xmm5
1159 ; XOP-NEXT:    vpmuludq %xmm5, %xmm0, %xmm0
1160 ; XOP-NEXT:    vpsrlq $32, %xmm5, %xmm9
1161 ; XOP-NEXT:    vpmuludq %xmm7, %xmm9, %xmm9
1162 ; XOP-NEXT:    vpaddq %xmm0, %xmm9, %xmm0
1163 ; XOP-NEXT:    vpsllq $32, %xmm0, %xmm0
1164 ; XOP-NEXT:    vpmuludq %xmm5, %xmm7, %xmm5
1165 ; XOP-NEXT:    vpsrlq $33, %xmm1, %xmm1
1166 ; XOP-NEXT:    vpor %xmm4, %xmm8, %xmm4
1167 ; XOP-NEXT:    vpmuludq %xmm4, %xmm1, %xmm1
1168 ; XOP-NEXT:    vpsrlq $32, %xmm4, %xmm7
1169 ; XOP-NEXT:    vpmuludq %xmm7, %xmm6, %xmm7
1170 ; XOP-NEXT:    vpaddq %xmm1, %xmm7, %xmm1
1171 ; XOP-NEXT:    vpsllq $32, %xmm1, %xmm1
1172 ; XOP-NEXT:    vpmuludq %xmm4, %xmm6, %xmm4
1173 ; XOP-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
1174 ; XOP-NEXT:    vpaddq %xmm1, %xmm3, %xmm1
1175 ; XOP-NEXT:    vpaddq %xmm2, %xmm5, %xmm2
1176 ; XOP-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1177 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1178 ; XOP-NEXT:    retq
1180 ; AVX512F-LABEL: vec256_i64_signed_mem_mem:
1181 ; AVX512F:       # %bb.0:
1182 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
1183 ; AVX512F-NEXT:    vmovdqa (%rsi), %ymm1
1184 ; AVX512F-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1185 ; AVX512F-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1186 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1187 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1188 ; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
1189 ; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
1190 ; AVX512F-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
1191 ; AVX512F-NEXT:    vpsrlq $1, %ymm1, %ymm2
1192 ; AVX512F-NEXT:    vpsrlq $33, %ymm1, %ymm1
1193 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
1194 ; AVX512F-NEXT:    vpsrlq $32, %ymm3, %ymm4
1195 ; AVX512F-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
1196 ; AVX512F-NEXT:    vpaddq %ymm1, %ymm4, %ymm1
1197 ; AVX512F-NEXT:    vpsllq $32, %ymm1, %ymm1
1198 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
1199 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
1200 ; AVX512F-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1201 ; AVX512F-NEXT:    retq
1203 ; AVX512VL-LABEL: vec256_i64_signed_mem_mem:
1204 ; AVX512VL:       # %bb.0:
1205 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
1206 ; AVX512VL-NEXT:    vmovdqa (%rsi), %ymm1
1207 ; AVX512VL-NEXT:    vpcmpgtq %ymm1, %ymm0, %k1
1208 ; AVX512VL-NEXT:    vpminsq %ymm1, %ymm0, %ymm2
1209 ; AVX512VL-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm1
1210 ; AVX512VL-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
1211 ; AVX512VL-NEXT:    vpsrlq $1, %ymm1, %ymm1
1212 ; AVX512VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1213 ; AVX512VL-NEXT:    vpsubq %ymm1, %ymm2, %ymm1 {%k1}
1214 ; AVX512VL-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
1215 ; AVX512VL-NEXT:    retq
1217 ; AVX512BW-FALLBACK-LABEL: vec256_i64_signed_mem_mem:
1218 ; AVX512BW-FALLBACK:       # %bb.0:
1219 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm0
1220 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rsi), %ymm1
1221 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1222 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1223 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1224 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1225 ; AVX512BW-FALLBACK-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
1226 ; AVX512BW-FALLBACK-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
1227 ; AVX512BW-FALLBACK-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
1228 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %ymm1, %ymm2
1229 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $33, %ymm1, %ymm1
1230 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
1231 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm3, %ymm4
1232 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm4, %ymm2, %ymm4
1233 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm1, %ymm4, %ymm1
1234 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %ymm1, %ymm1
1235 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
1236 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
1237 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1238 ; AVX512BW-FALLBACK-NEXT:    retq
1239   %a1 = load <4 x i64>, ptr %a1_addr
1240   %a2 = load <4 x i64>, ptr %a2_addr
1241   %t3 = icmp sgt <4 x i64> %a1, %a2 ; signed
1242   %t4 = select <4 x i1> %t3, <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>, <4 x i64> <i64 1, i64 1, i64 1, i64 1>
1243   %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a1
1244   %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a2
1245   %t7 = sub <4 x i64> %t6, %t5
1246   %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>
1247   %t9 = mul nsw <4 x i64> %t8, %t4 ; signed
1248   %a10 = add nsw <4 x i64> %t9, %a1 ; signed
1249   ret <4 x i64> %a10
1252 ; ---------------------------------------------------------------------------- ;
1253 ; 16-bit width. 256 / 16 = 16 elts.
1254 ; ---------------------------------------------------------------------------- ;
1256 ; Values come from regs
1258 define <16 x i16> @vec256_i16_signed_reg_reg(<16 x i16> %a1, <16 x i16> %a2) nounwind {
1259 ; AVX1-LABEL: vec256_i16_signed_reg_reg:
1260 ; AVX1:       # %bb.0:
1261 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1262 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1263 ; AVX1-NEXT:    vpcmpgtw %xmm2, %xmm3, %xmm4
1264 ; AVX1-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm5
1265 ; AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm6
1266 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
1267 ; AVX1-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
1268 ; AVX1-NEXT:    vpminsw %xmm2, %xmm3, %xmm6
1269 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
1270 ; AVX1-NEXT:    vpsubw %xmm6, %xmm2, %xmm2
1271 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
1272 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
1273 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1274 ; AVX1-NEXT:    vpor %xmm6, %xmm5, %xmm5
1275 ; AVX1-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
1276 ; AVX1-NEXT:    vpor %xmm6, %xmm4, %xmm4
1277 ; AVX1-NEXT:    vpmullw %xmm4, %xmm2, %xmm2
1278 ; AVX1-NEXT:    vpaddw %xmm3, %xmm2, %xmm2
1279 ; AVX1-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
1280 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1281 ; AVX1-NEXT:    retq
1283 ; AVX2-LABEL: vec256_i16_signed_reg_reg:
1284 ; AVX2:       # %bb.0:
1285 ; AVX2-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
1286 ; AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1287 ; AVX2-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
1288 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1289 ; AVX2-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
1290 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
1291 ; AVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
1292 ; AVX2-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1293 ; AVX2-NEXT:    retq
1295 ; XOP-LABEL: vec256_i16_signed_reg_reg:
1296 ; XOP:       # %bb.0:
1297 ; XOP-NEXT:    vextractf128 $1, %ymm1, %xmm2
1298 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm3
1299 ; XOP-NEXT:    vpcomgtw %xmm2, %xmm3, %xmm4
1300 ; XOP-NEXT:    vpcomgtw %xmm1, %xmm0, %xmm5
1301 ; XOP-NEXT:    vpminsw %xmm2, %xmm3, %xmm6
1302 ; XOP-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
1303 ; XOP-NEXT:    vpsubw %xmm6, %xmm2, %xmm2
1304 ; XOP-NEXT:    vpminsw %xmm1, %xmm0, %xmm6
1305 ; XOP-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
1306 ; XOP-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
1307 ; XOP-NEXT:    vpsrlw $1, %xmm1, %xmm1
1308 ; XOP-NEXT:    vpsrlw $1, %xmm2, %xmm2
1309 ; XOP-NEXT:    vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1310 ; XOP-NEXT:    vpor %xmm6, %xmm5, %xmm5
1311 ; XOP-NEXT:    vpor %xmm6, %xmm4, %xmm4
1312 ; XOP-NEXT:    vpmacsww %xmm3, %xmm4, %xmm2, %xmm2
1313 ; XOP-NEXT:    vpmacsww %xmm0, %xmm5, %xmm1, %xmm0
1314 ; XOP-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1315 ; XOP-NEXT:    retq
1317 ; AVX512F-LABEL: vec256_i16_signed_reg_reg:
1318 ; AVX512F:       # %bb.0:
1319 ; AVX512F-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
1320 ; AVX512F-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1321 ; AVX512F-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
1322 ; AVX512F-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1323 ; AVX512F-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
1324 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
1325 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
1326 ; AVX512F-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1327 ; AVX512F-NEXT:    retq
1329 ; AVX512VL-FALLBACK-LABEL: vec256_i16_signed_reg_reg:
1330 ; AVX512VL-FALLBACK:       # %bb.0:
1331 ; AVX512VL-FALLBACK-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
1332 ; AVX512VL-FALLBACK-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm3
1333 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm2, %ymm3, %ymm2
1334 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm2, %ymm2
1335 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm1
1336 ; AVX512VL-FALLBACK-NEXT:    vpxor %ymm1, %ymm2, %ymm2
1337 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm1, %ymm2, %ymm1
1338 ; AVX512VL-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1339 ; AVX512VL-FALLBACK-NEXT:    retq
1341 ; AVX512BW-FALLBACK-LABEL: vec256_i16_signed_reg_reg:
1342 ; AVX512BW-FALLBACK:       # %bb.0:
1343 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1344 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1345 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtw %zmm1, %zmm0, %k1
1346 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1347 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastw {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1348 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
1349 ; AVX512BW-FALLBACK-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
1350 ; AVX512BW-FALLBACK-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1351 ; AVX512BW-FALLBACK-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1352 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
1353 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1354 ; AVX512BW-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1355 ; AVX512BW-FALLBACK-NEXT:    retq
1357 ; AVX512VLBW-LABEL: vec256_i16_signed_reg_reg:
1358 ; AVX512VLBW:       # %bb.0:
1359 ; AVX512VLBW-NEXT:    vpcmpgtw %ymm1, %ymm0, %k1
1360 ; AVX512VLBW-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
1361 ; AVX512VLBW-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1362 ; AVX512VLBW-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1363 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
1364 ; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1365 ; AVX512VLBW-NEXT:    vpsubw %ymm1, %ymm2, %ymm1 {%k1}
1366 ; AVX512VLBW-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1367 ; AVX512VLBW-NEXT:    retq
1368   %t3 = icmp sgt <16 x i16> %a1, %a2 ; signed
1369   %t4 = select <16 x i1> %t3, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1370   %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a1
1371   %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a2
1372   %t7 = sub <16 x i16> %t6, %t5
1373   %t16 = lshr <16 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1374   %t9 = mul nsw <16 x i16> %t16, %t4 ; signed
1375   %a10 = add nsw <16 x i16> %t9, %a1 ; signed
1376   ret <16 x i16> %a10
1379 define <16 x i16> @vec256_i16_unsigned_reg_reg(<16 x i16> %a1, <16 x i16> %a2) nounwind {
1380 ; AVX1-LABEL: vec256_i16_unsigned_reg_reg:
1381 ; AVX1:       # %bb.0:
1382 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1383 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1384 ; AVX1-NEXT:    vpminuw %xmm2, %xmm3, %xmm4
1385 ; AVX1-NEXT:    vpcmpeqw %xmm4, %xmm3, %xmm5
1386 ; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
1387 ; AVX1-NEXT:    vpxor %xmm6, %xmm5, %xmm5
1388 ; AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm7
1389 ; AVX1-NEXT:    vpcmpeqw %xmm7, %xmm0, %xmm8
1390 ; AVX1-NEXT:    vpxor %xmm6, %xmm8, %xmm6
1391 ; AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
1392 ; AVX1-NEXT:    vpsubw %xmm7, %xmm1, %xmm1
1393 ; AVX1-NEXT:    vpmaxuw %xmm2, %xmm3, %xmm2
1394 ; AVX1-NEXT:    vpsubw %xmm4, %xmm2, %xmm2
1395 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
1396 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
1397 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1]
1398 ; AVX1-NEXT:    vpor %xmm4, %xmm6, %xmm6
1399 ; AVX1-NEXT:    vpmullw %xmm6, %xmm1, %xmm1
1400 ; AVX1-NEXT:    vpor %xmm4, %xmm5, %xmm4
1401 ; AVX1-NEXT:    vpmullw %xmm4, %xmm2, %xmm2
1402 ; AVX1-NEXT:    vpaddw %xmm3, %xmm2, %xmm2
1403 ; AVX1-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
1404 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1405 ; AVX1-NEXT:    retq
1407 ; AVX2-LABEL: vec256_i16_unsigned_reg_reg:
1408 ; AVX2:       # %bb.0:
1409 ; AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm2
1410 ; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm3
1411 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
1412 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm3
1413 ; AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
1414 ; AVX2-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm1
1415 ; AVX2-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1416 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
1417 ; AVX2-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1418 ; AVX2-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1419 ; AVX2-NEXT:    retq
1421 ; XOP-LABEL: vec256_i16_unsigned_reg_reg:
1422 ; XOP:       # %bb.0:
1423 ; XOP-NEXT:    vextractf128 $1, %ymm1, %xmm2
1424 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm3
1425 ; XOP-NEXT:    vpcomgtuw %xmm2, %xmm3, %xmm4
1426 ; XOP-NEXT:    vpcomgtuw %xmm1, %xmm0, %xmm5
1427 ; XOP-NEXT:    vpminuw %xmm2, %xmm3, %xmm6
1428 ; XOP-NEXT:    vpmaxuw %xmm2, %xmm3, %xmm2
1429 ; XOP-NEXT:    vpsubw %xmm6, %xmm2, %xmm2
1430 ; XOP-NEXT:    vpminuw %xmm1, %xmm0, %xmm6
1431 ; XOP-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
1432 ; XOP-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
1433 ; XOP-NEXT:    vpsrlw $1, %xmm1, %xmm1
1434 ; XOP-NEXT:    vpsrlw $1, %xmm2, %xmm2
1435 ; XOP-NEXT:    vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1436 ; XOP-NEXT:    vpor %xmm6, %xmm5, %xmm5
1437 ; XOP-NEXT:    vpor %xmm6, %xmm4, %xmm4
1438 ; XOP-NEXT:    vpmacsww %xmm3, %xmm4, %xmm2, %xmm2
1439 ; XOP-NEXT:    vpmacsww %xmm0, %xmm5, %xmm1, %xmm0
1440 ; XOP-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1441 ; XOP-NEXT:    retq
1443 ; AVX512F-LABEL: vec256_i16_unsigned_reg_reg:
1444 ; AVX512F:       # %bb.0:
1445 ; AVX512F-NEXT:    vpminuw %ymm1, %ymm0, %ymm2
1446 ; AVX512F-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm3
1447 ; AVX512F-NEXT:    vpternlogq $15, %zmm3, %zmm3, %zmm3
1448 ; AVX512F-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
1449 ; AVX512F-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm1
1450 ; AVX512F-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1451 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
1452 ; AVX512F-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1453 ; AVX512F-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1454 ; AVX512F-NEXT:    retq
1456 ; AVX512VL-FALLBACK-LABEL: vec256_i16_unsigned_reg_reg:
1457 ; AVX512VL-FALLBACK:       # %bb.0:
1458 ; AVX512VL-FALLBACK-NEXT:    vpminuw %ymm1, %ymm0, %ymm2
1459 ; AVX512VL-FALLBACK-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm1
1460 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1461 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
1462 ; AVX512VL-FALLBACK-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm2
1463 ; AVX512VL-FALLBACK-NEXT:    vpternlogq $15, %ymm2, %ymm2, %ymm2
1464 ; AVX512VL-FALLBACK-NEXT:    vpxor %ymm2, %ymm1, %ymm1
1465 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1466 ; AVX512VL-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1467 ; AVX512VL-FALLBACK-NEXT:    retq
1469 ; AVX512BW-FALLBACK-LABEL: vec256_i16_unsigned_reg_reg:
1470 ; AVX512BW-FALLBACK:       # %bb.0:
1471 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1472 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1473 ; AVX512BW-FALLBACK-NEXT:    vpcmpnleuw %zmm1, %zmm0, %k1
1474 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1475 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastw {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1476 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
1477 ; AVX512BW-FALLBACK-NEXT:    vpminuw %ymm1, %ymm0, %ymm2
1478 ; AVX512BW-FALLBACK-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm1
1479 ; AVX512BW-FALLBACK-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1480 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
1481 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1482 ; AVX512BW-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1483 ; AVX512BW-FALLBACK-NEXT:    retq
1485 ; AVX512VLBW-LABEL: vec256_i16_unsigned_reg_reg:
1486 ; AVX512VLBW:       # %bb.0:
1487 ; AVX512VLBW-NEXT:    vpcmpnleuw %ymm1, %ymm0, %k1
1488 ; AVX512VLBW-NEXT:    vpminuw %ymm1, %ymm0, %ymm2
1489 ; AVX512VLBW-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm1
1490 ; AVX512VLBW-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1491 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
1492 ; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1493 ; AVX512VLBW-NEXT:    vpsubw %ymm1, %ymm2, %ymm1 {%k1}
1494 ; AVX512VLBW-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1495 ; AVX512VLBW-NEXT:    retq
1496   %t3 = icmp ugt <16 x i16> %a1, %a2
1497   %t4 = select <16 x i1> %t3, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1498   %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a1
1499   %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a2
1500   %t7 = sub <16 x i16> %t6, %t5
1501   %t16 = lshr <16 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1502   %t9 = mul <16 x i16> %t16, %t4
1503   %a10 = add <16 x i16> %t9, %a1
1504   ret <16 x i16> %a10
1507 ; Values are loaded. Only check signed case.
1509 define <16 x i16> @vec256_i16_signed_mem_reg(ptr %a1_addr, <16 x i16> %a2) nounwind {
1510 ; AVX1-LABEL: vec256_i16_signed_mem_reg:
1511 ; AVX1:       # %bb.0:
1512 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1513 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm2
1514 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm3
1515 ; AVX1-NEXT:    vpcmpgtw %xmm1, %xmm3, %xmm4
1516 ; AVX1-NEXT:    vpcmpgtw %xmm0, %xmm2, %xmm5
1517 ; AVX1-NEXT:    vpminsw %xmm0, %xmm2, %xmm6
1518 ; AVX1-NEXT:    vpmaxsw %xmm0, %xmm2, %xmm0
1519 ; AVX1-NEXT:    vpsubw %xmm6, %xmm0, %xmm0
1520 ; AVX1-NEXT:    vpminsw %xmm1, %xmm3, %xmm6
1521 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm3, %xmm1
1522 ; AVX1-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
1523 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
1524 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm0
1525 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1526 ; AVX1-NEXT:    vpor %xmm6, %xmm5, %xmm5
1527 ; AVX1-NEXT:    vpmullw %xmm5, %xmm0, %xmm0
1528 ; AVX1-NEXT:    vpor %xmm6, %xmm4, %xmm4
1529 ; AVX1-NEXT:    vpmullw %xmm4, %xmm1, %xmm1
1530 ; AVX1-NEXT:    vpaddw %xmm3, %xmm1, %xmm1
1531 ; AVX1-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
1532 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1533 ; AVX1-NEXT:    retq
1535 ; AVX2-LABEL: vec256_i16_signed_mem_reg:
1536 ; AVX2:       # %bb.0:
1537 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
1538 ; AVX2-NEXT:    vpcmpgtw %ymm0, %ymm1, %ymm2
1539 ; AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1540 ; AVX2-NEXT:    vpminsw %ymm0, %ymm1, %ymm3
1541 ; AVX2-NEXT:    vpmaxsw %ymm0, %ymm1, %ymm0
1542 ; AVX2-NEXT:    vpsubw %ymm3, %ymm0, %ymm0
1543 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm0
1544 ; AVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
1545 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
1546 ; AVX2-NEXT:    retq
1548 ; XOP-LABEL: vec256_i16_signed_mem_reg:
1549 ; XOP:       # %bb.0:
1550 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm1
1551 ; XOP-NEXT:    vmovdqa (%rdi), %xmm2
1552 ; XOP-NEXT:    vmovdqa 16(%rdi), %xmm3
1553 ; XOP-NEXT:    vpcomgtw %xmm1, %xmm3, %xmm4
1554 ; XOP-NEXT:    vpcomgtw %xmm0, %xmm2, %xmm5
1555 ; XOP-NEXT:    vpminsw %xmm1, %xmm3, %xmm6
1556 ; XOP-NEXT:    vpmaxsw %xmm1, %xmm3, %xmm1
1557 ; XOP-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
1558 ; XOP-NEXT:    vpminsw %xmm0, %xmm2, %xmm6
1559 ; XOP-NEXT:    vpmaxsw %xmm0, %xmm2, %xmm0
1560 ; XOP-NEXT:    vpsubw %xmm6, %xmm0, %xmm0
1561 ; XOP-NEXT:    vpsrlw $1, %xmm0, %xmm0
1562 ; XOP-NEXT:    vpsrlw $1, %xmm1, %xmm1
1563 ; XOP-NEXT:    vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1564 ; XOP-NEXT:    vpor %xmm6, %xmm5, %xmm5
1565 ; XOP-NEXT:    vpor %xmm6, %xmm4, %xmm4
1566 ; XOP-NEXT:    vpmacsww %xmm3, %xmm4, %xmm1, %xmm1
1567 ; XOP-NEXT:    vpmacsww %xmm2, %xmm5, %xmm0, %xmm0
1568 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1569 ; XOP-NEXT:    retq
1571 ; AVX512F-LABEL: vec256_i16_signed_mem_reg:
1572 ; AVX512F:       # %bb.0:
1573 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm1
1574 ; AVX512F-NEXT:    vpcmpgtw %ymm0, %ymm1, %ymm2
1575 ; AVX512F-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1576 ; AVX512F-NEXT:    vpminsw %ymm0, %ymm1, %ymm3
1577 ; AVX512F-NEXT:    vpmaxsw %ymm0, %ymm1, %ymm0
1578 ; AVX512F-NEXT:    vpsubw %ymm3, %ymm0, %ymm0
1579 ; AVX512F-NEXT:    vpsrlw $1, %ymm0, %ymm0
1580 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
1581 ; AVX512F-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
1582 ; AVX512F-NEXT:    retq
1584 ; AVX512VL-FALLBACK-LABEL: vec256_i16_signed_mem_reg:
1585 ; AVX512VL-FALLBACK:       # %bb.0:
1586 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
1587 ; AVX512VL-FALLBACK-NEXT:    vpminsw %ymm0, %ymm1, %ymm2
1588 ; AVX512VL-FALLBACK-NEXT:    vpmaxsw %ymm0, %ymm1, %ymm3
1589 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm2, %ymm3, %ymm2
1590 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm2, %ymm2
1591 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtw %ymm0, %ymm1, %ymm0
1592 ; AVX512VL-FALLBACK-NEXT:    vpxor %ymm0, %ymm2, %ymm2
1593 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm0, %ymm2, %ymm0
1594 ; AVX512VL-FALLBACK-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
1595 ; AVX512VL-FALLBACK-NEXT:    retq
1597 ; AVX512BW-FALLBACK-LABEL: vec256_i16_signed_mem_reg:
1598 ; AVX512BW-FALLBACK:       # %bb.0:
1599 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1600 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
1601 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtw %zmm0, %zmm1, %k1
1602 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1603 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastw {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1604 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
1605 ; AVX512BW-FALLBACK-NEXT:    vpminsw %ymm0, %ymm1, %ymm2
1606 ; AVX512BW-FALLBACK-NEXT:    vpmaxsw %ymm0, %ymm1, %ymm0
1607 ; AVX512BW-FALLBACK-NEXT:    vpsubw %ymm2, %ymm0, %ymm0
1608 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm0, %ymm0
1609 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm3, %ymm0, %ymm0
1610 ; AVX512BW-FALLBACK-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
1611 ; AVX512BW-FALLBACK-NEXT:    retq
1613 ; AVX512VLBW-LABEL: vec256_i16_signed_mem_reg:
1614 ; AVX512VLBW:       # %bb.0:
1615 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %ymm1
1616 ; AVX512VLBW-NEXT:    vpcmpgtw %ymm0, %ymm1, %k1
1617 ; AVX512VLBW-NEXT:    vpminsw %ymm0, %ymm1, %ymm2
1618 ; AVX512VLBW-NEXT:    vpmaxsw %ymm0, %ymm1, %ymm0
1619 ; AVX512VLBW-NEXT:    vpsubw %ymm2, %ymm0, %ymm0
1620 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm0, %ymm0
1621 ; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1622 ; AVX512VLBW-NEXT:    vpsubw %ymm0, %ymm2, %ymm0 {%k1}
1623 ; AVX512VLBW-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
1624 ; AVX512VLBW-NEXT:    retq
1625   %a1 = load <16 x i16>, ptr %a1_addr
1626   %t3 = icmp sgt <16 x i16> %a1, %a2 ; signed
1627   %t4 = select <16 x i1> %t3, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1628   %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a1
1629   %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a2
1630   %t7 = sub <16 x i16> %t6, %t5
1631   %t16 = lshr <16 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1632   %t9 = mul nsw <16 x i16> %t16, %t4 ; signed
1633   %a10 = add nsw <16 x i16> %t9, %a1 ; signed
1634   ret <16 x i16> %a10
1637 define <16 x i16> @vec256_i16_signed_reg_mem(<16 x i16> %a1, ptr %a2_addr) nounwind {
1638 ; AVX1-LABEL: vec256_i16_signed_reg_mem:
1639 ; AVX1:       # %bb.0:
1640 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm1
1641 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm2
1642 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1643 ; AVX1-NEXT:    vpcmpgtw %xmm2, %xmm3, %xmm4
1644 ; AVX1-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm5
1645 ; AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm6
1646 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
1647 ; AVX1-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
1648 ; AVX1-NEXT:    vpminsw %xmm2, %xmm3, %xmm6
1649 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
1650 ; AVX1-NEXT:    vpsubw %xmm6, %xmm2, %xmm2
1651 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
1652 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
1653 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1654 ; AVX1-NEXT:    vpor %xmm6, %xmm5, %xmm5
1655 ; AVX1-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
1656 ; AVX1-NEXT:    vpor %xmm6, %xmm4, %xmm4
1657 ; AVX1-NEXT:    vpmullw %xmm4, %xmm2, %xmm2
1658 ; AVX1-NEXT:    vpaddw %xmm3, %xmm2, %xmm2
1659 ; AVX1-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
1660 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1661 ; AVX1-NEXT:    retq
1663 ; AVX2-LABEL: vec256_i16_signed_reg_mem:
1664 ; AVX2:       # %bb.0:
1665 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
1666 ; AVX2-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
1667 ; AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1668 ; AVX2-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
1669 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1670 ; AVX2-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
1671 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
1672 ; AVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
1673 ; AVX2-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1674 ; AVX2-NEXT:    retq
1676 ; XOP-LABEL: vec256_i16_signed_reg_mem:
1677 ; XOP:       # %bb.0:
1678 ; XOP-NEXT:    vmovdqa (%rdi), %xmm1
1679 ; XOP-NEXT:    vmovdqa 16(%rdi), %xmm2
1680 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm3
1681 ; XOP-NEXT:    vpcomgtw %xmm2, %xmm3, %xmm4
1682 ; XOP-NEXT:    vpcomgtw %xmm1, %xmm0, %xmm5
1683 ; XOP-NEXT:    vpminsw %xmm2, %xmm3, %xmm6
1684 ; XOP-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
1685 ; XOP-NEXT:    vpsubw %xmm6, %xmm2, %xmm2
1686 ; XOP-NEXT:    vpminsw %xmm1, %xmm0, %xmm6
1687 ; XOP-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
1688 ; XOP-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
1689 ; XOP-NEXT:    vpsrlw $1, %xmm1, %xmm1
1690 ; XOP-NEXT:    vpsrlw $1, %xmm2, %xmm2
1691 ; XOP-NEXT:    vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1692 ; XOP-NEXT:    vpor %xmm6, %xmm5, %xmm5
1693 ; XOP-NEXT:    vpor %xmm6, %xmm4, %xmm4
1694 ; XOP-NEXT:    vpmacsww %xmm3, %xmm4, %xmm2, %xmm2
1695 ; XOP-NEXT:    vpmacsww %xmm0, %xmm5, %xmm1, %xmm0
1696 ; XOP-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1697 ; XOP-NEXT:    retq
1699 ; AVX512F-LABEL: vec256_i16_signed_reg_mem:
1700 ; AVX512F:       # %bb.0:
1701 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm1
1702 ; AVX512F-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
1703 ; AVX512F-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1704 ; AVX512F-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
1705 ; AVX512F-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1706 ; AVX512F-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
1707 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
1708 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
1709 ; AVX512F-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1710 ; AVX512F-NEXT:    retq
1712 ; AVX512VL-FALLBACK-LABEL: vec256_i16_signed_reg_mem:
1713 ; AVX512VL-FALLBACK:       # %bb.0:
1714 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
1715 ; AVX512VL-FALLBACK-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
1716 ; AVX512VL-FALLBACK-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm3
1717 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm2, %ymm3, %ymm2
1718 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm2, %ymm2
1719 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm1
1720 ; AVX512VL-FALLBACK-NEXT:    vpxor %ymm1, %ymm2, %ymm2
1721 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm1, %ymm2, %ymm1
1722 ; AVX512VL-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1723 ; AVX512VL-FALLBACK-NEXT:    retq
1725 ; AVX512BW-FALLBACK-LABEL: vec256_i16_signed_reg_mem:
1726 ; AVX512BW-FALLBACK:       # %bb.0:
1727 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1728 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
1729 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtw %zmm1, %zmm0, %k1
1730 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1731 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastw {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1732 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
1733 ; AVX512BW-FALLBACK-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
1734 ; AVX512BW-FALLBACK-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1735 ; AVX512BW-FALLBACK-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1736 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
1737 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1738 ; AVX512BW-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1739 ; AVX512BW-FALLBACK-NEXT:    retq
1741 ; AVX512VLBW-LABEL: vec256_i16_signed_reg_mem:
1742 ; AVX512VLBW:       # %bb.0:
1743 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %ymm1
1744 ; AVX512VLBW-NEXT:    vpcmpgtw %ymm1, %ymm0, %k1
1745 ; AVX512VLBW-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
1746 ; AVX512VLBW-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1747 ; AVX512VLBW-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1748 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
1749 ; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1750 ; AVX512VLBW-NEXT:    vpsubw %ymm1, %ymm2, %ymm1 {%k1}
1751 ; AVX512VLBW-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1752 ; AVX512VLBW-NEXT:    retq
1753   %a2 = load <16 x i16>, ptr %a2_addr
1754   %t3 = icmp sgt <16 x i16> %a1, %a2 ; signed
1755   %t4 = select <16 x i1> %t3, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1756   %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a1
1757   %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a2
1758   %t7 = sub <16 x i16> %t6, %t5
1759   %t16 = lshr <16 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1760   %t9 = mul nsw <16 x i16> %t16, %t4 ; signed
1761   %a10 = add nsw <16 x i16> %t9, %a1 ; signed
1762   ret <16 x i16> %a10
1765 define <16 x i16> @vec256_i16_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind {
1766 ; AVX1-LABEL: vec256_i16_signed_mem_mem:
1767 ; AVX1:       # %bb.0:
1768 ; AVX1-NEXT:    vmovdqa (%rsi), %xmm0
1769 ; AVX1-NEXT:    vmovdqa 16(%rsi), %xmm1
1770 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm2
1771 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm3
1772 ; AVX1-NEXT:    vpcmpgtw %xmm1, %xmm3, %xmm4
1773 ; AVX1-NEXT:    vpcmpgtw %xmm0, %xmm2, %xmm5
1774 ; AVX1-NEXT:    vpminsw %xmm0, %xmm2, %xmm6
1775 ; AVX1-NEXT:    vpmaxsw %xmm0, %xmm2, %xmm0
1776 ; AVX1-NEXT:    vpsubw %xmm6, %xmm0, %xmm0
1777 ; AVX1-NEXT:    vpminsw %xmm1, %xmm3, %xmm6
1778 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm3, %xmm1
1779 ; AVX1-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
1780 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
1781 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm0
1782 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1783 ; AVX1-NEXT:    vpor %xmm6, %xmm5, %xmm5
1784 ; AVX1-NEXT:    vpmullw %xmm5, %xmm0, %xmm0
1785 ; AVX1-NEXT:    vpor %xmm6, %xmm4, %xmm4
1786 ; AVX1-NEXT:    vpmullw %xmm4, %xmm1, %xmm1
1787 ; AVX1-NEXT:    vpaddw %xmm3, %xmm1, %xmm1
1788 ; AVX1-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
1789 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1790 ; AVX1-NEXT:    retq
1792 ; AVX2-LABEL: vec256_i16_signed_mem_mem:
1793 ; AVX2:       # %bb.0:
1794 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
1795 ; AVX2-NEXT:    vmovdqa (%rsi), %ymm1
1796 ; AVX2-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
1797 ; AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1798 ; AVX2-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
1799 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1800 ; AVX2-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
1801 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
1802 ; AVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
1803 ; AVX2-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1804 ; AVX2-NEXT:    retq
1806 ; XOP-LABEL: vec256_i16_signed_mem_mem:
1807 ; XOP:       # %bb.0:
1808 ; XOP-NEXT:    vmovdqa (%rsi), %xmm0
1809 ; XOP-NEXT:    vmovdqa 16(%rsi), %xmm1
1810 ; XOP-NEXT:    vmovdqa (%rdi), %xmm2
1811 ; XOP-NEXT:    vmovdqa 16(%rdi), %xmm3
1812 ; XOP-NEXT:    vpcomgtw %xmm1, %xmm3, %xmm4
1813 ; XOP-NEXT:    vpcomgtw %xmm0, %xmm2, %xmm5
1814 ; XOP-NEXT:    vpminsw %xmm1, %xmm3, %xmm6
1815 ; XOP-NEXT:    vpmaxsw %xmm1, %xmm3, %xmm1
1816 ; XOP-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
1817 ; XOP-NEXT:    vpminsw %xmm0, %xmm2, %xmm6
1818 ; XOP-NEXT:    vpmaxsw %xmm0, %xmm2, %xmm0
1819 ; XOP-NEXT:    vpsubw %xmm6, %xmm0, %xmm0
1820 ; XOP-NEXT:    vpsrlw $1, %xmm0, %xmm0
1821 ; XOP-NEXT:    vpsrlw $1, %xmm1, %xmm1
1822 ; XOP-NEXT:    vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1823 ; XOP-NEXT:    vpor %xmm6, %xmm5, %xmm5
1824 ; XOP-NEXT:    vpor %xmm6, %xmm4, %xmm4
1825 ; XOP-NEXT:    vpmacsww %xmm3, %xmm4, %xmm1, %xmm1
1826 ; XOP-NEXT:    vpmacsww %xmm2, %xmm5, %xmm0, %xmm0
1827 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1828 ; XOP-NEXT:    retq
1830 ; AVX512F-LABEL: vec256_i16_signed_mem_mem:
1831 ; AVX512F:       # %bb.0:
1832 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
1833 ; AVX512F-NEXT:    vmovdqa (%rsi), %ymm1
1834 ; AVX512F-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
1835 ; AVX512F-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1836 ; AVX512F-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
1837 ; AVX512F-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1838 ; AVX512F-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
1839 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
1840 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
1841 ; AVX512F-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1842 ; AVX512F-NEXT:    retq
1844 ; AVX512VL-FALLBACK-LABEL: vec256_i16_signed_mem_mem:
1845 ; AVX512VL-FALLBACK:       # %bb.0:
1846 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm0
1847 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rsi), %ymm1
1848 ; AVX512VL-FALLBACK-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
1849 ; AVX512VL-FALLBACK-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm3
1850 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm2, %ymm3, %ymm2
1851 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm2, %ymm2
1852 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm1
1853 ; AVX512VL-FALLBACK-NEXT:    vpxor %ymm1, %ymm2, %ymm2
1854 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm1, %ymm2, %ymm1
1855 ; AVX512VL-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1856 ; AVX512VL-FALLBACK-NEXT:    retq
1858 ; AVX512BW-FALLBACK-LABEL: vec256_i16_signed_mem_mem:
1859 ; AVX512BW-FALLBACK:       # %bb.0:
1860 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm0
1861 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rsi), %ymm1
1862 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtw %zmm1, %zmm0, %k1
1863 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1864 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastw {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1865 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
1866 ; AVX512BW-FALLBACK-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
1867 ; AVX512BW-FALLBACK-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1868 ; AVX512BW-FALLBACK-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1869 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
1870 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1871 ; AVX512BW-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1872 ; AVX512BW-FALLBACK-NEXT:    retq
1874 ; AVX512VLBW-LABEL: vec256_i16_signed_mem_mem:
1875 ; AVX512VLBW:       # %bb.0:
1876 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %ymm0
1877 ; AVX512VLBW-NEXT:    vmovdqa (%rsi), %ymm1
1878 ; AVX512VLBW-NEXT:    vpcmpgtw %ymm1, %ymm0, %k1
1879 ; AVX512VLBW-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
1880 ; AVX512VLBW-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1881 ; AVX512VLBW-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1882 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
1883 ; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1884 ; AVX512VLBW-NEXT:    vpsubw %ymm1, %ymm2, %ymm1 {%k1}
1885 ; AVX512VLBW-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1886 ; AVX512VLBW-NEXT:    retq
1887   %a1 = load <16 x i16>, ptr %a1_addr
1888   %a2 = load <16 x i16>, ptr %a2_addr
1889   %t3 = icmp sgt <16 x i16> %a1, %a2 ; signed
1890   %t4 = select <16 x i1> %t3, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1891   %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a1
1892   %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a2
1893   %t7 = sub <16 x i16> %t6, %t5
1894   %t16 = lshr <16 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1895   %t9 = mul nsw <16 x i16> %t16, %t4 ; signed
1896   %a10 = add nsw <16 x i16> %t9, %a1 ; signed
1897   ret <16 x i16> %a10
1900 ; ---------------------------------------------------------------------------- ;
1901 ; 8-bit width. 256 / 8 = 32 elts.
1902 ; ---------------------------------------------------------------------------- ;
1904 ; Values come from regs
1906 define <32 x i8> @vec256_i8_signed_reg_reg(<32 x i8> %a1, <32 x i8> %a2) nounwind {
1907 ; AVX1-LABEL: vec256_i8_signed_reg_reg:
1908 ; AVX1:       # %bb.0:
1909 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1910 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1911 ; AVX1-NEXT:    vpcmpgtb %xmm3, %xmm2, %xmm4
1912 ; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm5
1913 ; AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm6
1914 ; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
1915 ; AVX1-NEXT:    vpsubb %xmm6, %xmm1, %xmm1
1916 ; AVX1-NEXT:    vpminsb %xmm3, %xmm2, %xmm6
1917 ; AVX1-NEXT:    vpmaxsb %xmm3, %xmm2, %xmm3
1918 ; AVX1-NEXT:    vpsubb %xmm6, %xmm3, %xmm3
1919 ; AVX1-NEXT:    vpsrlw $1, %xmm3, %xmm3
1920 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
1921 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
1922 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
1923 ; AVX1-NEXT:    vpand %xmm6, %xmm1, %xmm1
1924 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1925 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1926 ; AVX1-NEXT:    vpor %xmm7, %xmm5, %xmm5
1927 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm8 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1928 ; AVX1-NEXT:    vpmullw %xmm6, %xmm8, %xmm6
1929 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]
1930 ; AVX1-NEXT:    vpand %xmm6, %xmm8, %xmm6
1931 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
1932 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
1933 ; AVX1-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
1934 ; AVX1-NEXT:    vpand %xmm1, %xmm8, %xmm1
1935 ; AVX1-NEXT:    vpackuswb %xmm6, %xmm1, %xmm1
1936 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1937 ; AVX1-NEXT:    vpor %xmm7, %xmm4, %xmm4
1938 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1939 ; AVX1-NEXT:    vpmullw %xmm6, %xmm5, %xmm5
1940 ; AVX1-NEXT:    vpand %xmm5, %xmm8, %xmm5
1941 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
1942 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
1943 ; AVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
1944 ; AVX1-NEXT:    vpand %xmm3, %xmm8, %xmm3
1945 ; AVX1-NEXT:    vpackuswb %xmm5, %xmm3, %xmm3
1946 ; AVX1-NEXT:    vpaddb %xmm2, %xmm3, %xmm2
1947 ; AVX1-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
1948 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1949 ; AVX1-NEXT:    retq
1951 ; AVX2-LABEL: vec256_i8_signed_reg_reg:
1952 ; AVX2:       # %bb.0:
1953 ; AVX2-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
1954 ; AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1955 ; AVX2-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
1956 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
1957 ; AVX2-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
1958 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
1959 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1960 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
1961 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
1962 ; AVX2-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
1963 ; AVX2-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1964 ; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm3
1965 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
1966 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
1967 ; AVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
1968 ; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1
1969 ; AVX2-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
1970 ; AVX2-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
1971 ; AVX2-NEXT:    retq
1973 ; XOP-LABEL: vec256_i8_signed_reg_reg:
1974 ; XOP:       # %bb.0:
1975 ; XOP-NEXT:    vextractf128 $1, %ymm1, %xmm2
1976 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm3
1977 ; XOP-NEXT:    vpcomgtb %xmm2, %xmm3, %xmm4
1978 ; XOP-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm5
1979 ; XOP-NEXT:    vpminsb %xmm1, %xmm0, %xmm6
1980 ; XOP-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
1981 ; XOP-NEXT:    vpsubb %xmm6, %xmm1, %xmm1
1982 ; XOP-NEXT:    vpminsb %xmm2, %xmm3, %xmm6
1983 ; XOP-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
1984 ; XOP-NEXT:    vpsubb %xmm6, %xmm2, %xmm2
1985 ; XOP-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
1986 ; XOP-NEXT:    vpshlb %xmm6, %xmm2, %xmm2
1987 ; XOP-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
1988 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1989 ; XOP-NEXT:    vbroadcastss {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1990 ; XOP-NEXT:    vpor %xmm7, %xmm5, %xmm5
1991 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm8 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1992 ; XOP-NEXT:    vpmullw %xmm6, %xmm8, %xmm6
1993 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
1994 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
1995 ; XOP-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
1996 ; XOP-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
1997 ; XOP-NEXT:    vpperm %xmm5, %xmm6, %xmm1, %xmm1
1998 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1999 ; XOP-NEXT:    vpor %xmm7, %xmm4, %xmm4
2000 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2001 ; XOP-NEXT:    vpmullw %xmm7, %xmm6, %xmm6
2002 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2003 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
2004 ; XOP-NEXT:    vpmullw %xmm4, %xmm2, %xmm2
2005 ; XOP-NEXT:    vpperm %xmm5, %xmm6, %xmm2, %xmm2
2006 ; XOP-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
2007 ; XOP-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2008 ; XOP-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2009 ; XOP-NEXT:    retq
2011 ; AVX512F-LABEL: vec256_i8_signed_reg_reg:
2012 ; AVX512F:       # %bb.0:
2013 ; AVX512F-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
2014 ; AVX512F-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
2015 ; AVX512F-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
2016 ; AVX512F-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2017 ; AVX512F-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
2018 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
2019 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2020 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2021 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2022 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
2023 ; AVX512F-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2024 ; AVX512F-NEXT:    vpand %ymm4, %ymm3, %ymm3
2025 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2026 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2027 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2028 ; AVX512F-NEXT:    vpand %ymm4, %ymm1, %ymm1
2029 ; AVX512F-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
2030 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2031 ; AVX512F-NEXT:    retq
2033 ; AVX512VL-FALLBACK-LABEL: vec256_i8_signed_reg_reg:
2034 ; AVX512VL-FALLBACK:       # %bb.0:
2035 ; AVX512VL-FALLBACK-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
2036 ; AVX512VL-FALLBACK-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm3
2037 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm2, %ymm3, %ymm2
2038 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm2, %ymm2
2039 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm1
2040 ; AVX512VL-FALLBACK-NEXT:    vpternlogd $108, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm2
2041 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm1, %ymm2, %ymm1
2042 ; AVX512VL-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2043 ; AVX512VL-FALLBACK-NEXT:    retq
2045 ; AVX512BW-FALLBACK-LABEL: vec256_i8_signed_reg_reg:
2046 ; AVX512BW-FALLBACK:       # %bb.0:
2047 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2048 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2049 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtb %zmm1, %zmm0, %k1
2050 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2051 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastb {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2052 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
2053 ; AVX512BW-FALLBACK-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
2054 ; AVX512BW-FALLBACK-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2055 ; AVX512BW-FALLBACK-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2056 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
2057 ; AVX512BW-FALLBACK-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2058 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
2059 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero,ymm3[16],zero,ymm3[17],zero,ymm3[18],zero,ymm3[19],zero,ymm3[20],zero,ymm3[21],zero,ymm3[22],zero,ymm3[23],zero,ymm3[24],zero,ymm3[25],zero,ymm3[26],zero,ymm3[27],zero,ymm3[28],zero,ymm3[29],zero,ymm3[30],zero,ymm3[31],zero
2060 ; AVX512BW-FALLBACK-NEXT:    vpmullw %zmm2, %zmm1, %zmm1
2061 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm1, %ymm1
2062 ; AVX512BW-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2063 ; AVX512BW-FALLBACK-NEXT:    retq
2065 ; AVX512VLBW-LABEL: vec256_i8_signed_reg_reg:
2066 ; AVX512VLBW:       # %bb.0:
2067 ; AVX512VLBW-NEXT:    vpcmpgtb %ymm1, %ymm0, %k1
2068 ; AVX512VLBW-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
2069 ; AVX512VLBW-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2070 ; AVX512VLBW-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2071 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
2072 ; AVX512VLBW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1
2073 ; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2074 ; AVX512VLBW-NEXT:    vpsubb %ymm1, %ymm2, %ymm1 {%k1}
2075 ; AVX512VLBW-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2076 ; AVX512VLBW-NEXT:    retq
2077   %t3 = icmp sgt <32 x i8> %a1, %a2 ; signed
2078   %t4 = select <32 x i1> %t3, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
2079   %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a1
2080   %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a2
2081   %t7 = sub <32 x i8> %t6, %t5
2082   %t8 = lshr <32 x i8> %t7, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
2083   %t9 = mul nsw <32 x i8> %t8, %t4 ; signed
2084   %a10 = add nsw <32 x i8> %t9, %a1 ; signed
2085   ret <32 x i8> %a10
2088 define <32 x i8> @vec256_i8_unsigned_reg_reg(<32 x i8> %a1, <32 x i8> %a2) nounwind {
2089 ; AVX1-LABEL: vec256_i8_unsigned_reg_reg:
2090 ; AVX1:       # %bb.0:
2091 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
2092 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2093 ; AVX1-NEXT:    vpminub %xmm3, %xmm2, %xmm4
2094 ; AVX1-NEXT:    vpcmpeqb %xmm4, %xmm2, %xmm5
2095 ; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
2096 ; AVX1-NEXT:    vpxor %xmm6, %xmm5, %xmm5
2097 ; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm7
2098 ; AVX1-NEXT:    vpcmpeqb %xmm7, %xmm0, %xmm8
2099 ; AVX1-NEXT:    vpxor %xmm6, %xmm8, %xmm6
2100 ; AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
2101 ; AVX1-NEXT:    vpsubb %xmm7, %xmm1, %xmm1
2102 ; AVX1-NEXT:    vpmaxub %xmm3, %xmm2, %xmm3
2103 ; AVX1-NEXT:    vpsubb %xmm4, %xmm3, %xmm3
2104 ; AVX1-NEXT:    vpsrlw $1, %xmm3, %xmm3
2105 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
2106 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
2107 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
2108 ; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
2109 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2110 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2111 ; AVX1-NEXT:    vpor %xmm7, %xmm6, %xmm6
2112 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm8 = xmm6[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2113 ; AVX1-NEXT:    vpmullw %xmm4, %xmm8, %xmm4
2114 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]
2115 ; AVX1-NEXT:    vpand %xmm4, %xmm8, %xmm4
2116 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2117 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm6 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero
2118 ; AVX1-NEXT:    vpmullw %xmm6, %xmm1, %xmm1
2119 ; AVX1-NEXT:    vpand %xmm1, %xmm8, %xmm1
2120 ; AVX1-NEXT:    vpackuswb %xmm4, %xmm1, %xmm1
2121 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2122 ; AVX1-NEXT:    vpor %xmm7, %xmm5, %xmm5
2123 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2124 ; AVX1-NEXT:    vpmullw %xmm6, %xmm4, %xmm4
2125 ; AVX1-NEXT:    vpand %xmm4, %xmm8, %xmm4
2126 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2127 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2128 ; AVX1-NEXT:    vpmullw %xmm5, %xmm3, %xmm3
2129 ; AVX1-NEXT:    vpand %xmm3, %xmm8, %xmm3
2130 ; AVX1-NEXT:    vpackuswb %xmm4, %xmm3, %xmm3
2131 ; AVX1-NEXT:    vpaddb %xmm2, %xmm3, %xmm2
2132 ; AVX1-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2133 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2134 ; AVX1-NEXT:    retq
2136 ; AVX2-LABEL: vec256_i8_unsigned_reg_reg:
2137 ; AVX2:       # %bb.0:
2138 ; AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm2
2139 ; AVX2-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm3
2140 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
2141 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm3
2142 ; AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
2143 ; AVX2-NEXT:    vpmaxub %ymm1, %ymm0, %ymm1
2144 ; AVX2-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2145 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
2146 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2147 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2148 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2149 ; AVX2-NEXT:    vpmullw %ymm4, %ymm2, %ymm2
2150 ; AVX2-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2151 ; AVX2-NEXT:    vpand %ymm4, %ymm2, %ymm2
2152 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2153 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2154 ; AVX2-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
2155 ; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1
2156 ; AVX2-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1
2157 ; AVX2-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2158 ; AVX2-NEXT:    retq
2160 ; XOP-LABEL: vec256_i8_unsigned_reg_reg:
2161 ; XOP:       # %bb.0:
2162 ; XOP-NEXT:    vextractf128 $1, %ymm1, %xmm2
2163 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm3
2164 ; XOP-NEXT:    vpcomgtub %xmm2, %xmm3, %xmm4
2165 ; XOP-NEXT:    vpcomgtub %xmm1, %xmm0, %xmm5
2166 ; XOP-NEXT:    vpminub %xmm1, %xmm0, %xmm6
2167 ; XOP-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
2168 ; XOP-NEXT:    vpsubb %xmm6, %xmm1, %xmm1
2169 ; XOP-NEXT:    vpminub %xmm2, %xmm3, %xmm6
2170 ; XOP-NEXT:    vpmaxub %xmm2, %xmm3, %xmm2
2171 ; XOP-NEXT:    vpsubb %xmm6, %xmm2, %xmm2
2172 ; XOP-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
2173 ; XOP-NEXT:    vpshlb %xmm6, %xmm2, %xmm2
2174 ; XOP-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
2175 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2176 ; XOP-NEXT:    vbroadcastss {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2177 ; XOP-NEXT:    vpor %xmm7, %xmm5, %xmm5
2178 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm8 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2179 ; XOP-NEXT:    vpmullw %xmm6, %xmm8, %xmm6
2180 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2181 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2182 ; XOP-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
2183 ; XOP-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
2184 ; XOP-NEXT:    vpperm %xmm5, %xmm6, %xmm1, %xmm1
2185 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2186 ; XOP-NEXT:    vpor %xmm7, %xmm4, %xmm4
2187 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2188 ; XOP-NEXT:    vpmullw %xmm7, %xmm6, %xmm6
2189 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2190 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
2191 ; XOP-NEXT:    vpmullw %xmm4, %xmm2, %xmm2
2192 ; XOP-NEXT:    vpperm %xmm5, %xmm6, %xmm2, %xmm2
2193 ; XOP-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
2194 ; XOP-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2195 ; XOP-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2196 ; XOP-NEXT:    retq
2198 ; AVX512F-LABEL: vec256_i8_unsigned_reg_reg:
2199 ; AVX512F:       # %bb.0:
2200 ; AVX512F-NEXT:    vpminub %ymm1, %ymm0, %ymm2
2201 ; AVX512F-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm3
2202 ; AVX512F-NEXT:    vpternlogq $15, %zmm3, %zmm3, %zmm3
2203 ; AVX512F-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
2204 ; AVX512F-NEXT:    vpmaxub %ymm1, %ymm0, %ymm1
2205 ; AVX512F-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2206 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
2207 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2208 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2209 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2210 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm2, %ymm2
2211 ; AVX512F-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2212 ; AVX512F-NEXT:    vpand %ymm4, %ymm2, %ymm2
2213 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2214 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2215 ; AVX512F-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
2216 ; AVX512F-NEXT:    vpand %ymm4, %ymm1, %ymm1
2217 ; AVX512F-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1
2218 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2219 ; AVX512F-NEXT:    retq
2221 ; AVX512VL-FALLBACK-LABEL: vec256_i8_unsigned_reg_reg:
2222 ; AVX512VL-FALLBACK:       # %bb.0:
2223 ; AVX512VL-FALLBACK-NEXT:    vpminub %ymm1, %ymm0, %ymm2
2224 ; AVX512VL-FALLBACK-NEXT:    vpmaxub %ymm1, %ymm0, %ymm1
2225 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2226 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
2227 ; AVX512VL-FALLBACK-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm2
2228 ; AVX512VL-FALLBACK-NEXT:    vpternlogq $15, %ymm2, %ymm2, %ymm2
2229 ; AVX512VL-FALLBACK-NEXT:    vpternlogd $108, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm1
2230 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2231 ; AVX512VL-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2232 ; AVX512VL-FALLBACK-NEXT:    retq
2234 ; AVX512BW-FALLBACK-LABEL: vec256_i8_unsigned_reg_reg:
2235 ; AVX512BW-FALLBACK:       # %bb.0:
2236 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2237 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2238 ; AVX512BW-FALLBACK-NEXT:    vpcmpnleub %zmm1, %zmm0, %k1
2239 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2240 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastb {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2241 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
2242 ; AVX512BW-FALLBACK-NEXT:    vpminub %ymm1, %ymm0, %ymm2
2243 ; AVX512BW-FALLBACK-NEXT:    vpmaxub %ymm1, %ymm0, %ymm1
2244 ; AVX512BW-FALLBACK-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2245 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
2246 ; AVX512BW-FALLBACK-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2247 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
2248 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero,ymm3[16],zero,ymm3[17],zero,ymm3[18],zero,ymm3[19],zero,ymm3[20],zero,ymm3[21],zero,ymm3[22],zero,ymm3[23],zero,ymm3[24],zero,ymm3[25],zero,ymm3[26],zero,ymm3[27],zero,ymm3[28],zero,ymm3[29],zero,ymm3[30],zero,ymm3[31],zero
2249 ; AVX512BW-FALLBACK-NEXT:    vpmullw %zmm2, %zmm1, %zmm1
2250 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm1, %ymm1
2251 ; AVX512BW-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2252 ; AVX512BW-FALLBACK-NEXT:    retq
2254 ; AVX512VLBW-LABEL: vec256_i8_unsigned_reg_reg:
2255 ; AVX512VLBW:       # %bb.0:
2256 ; AVX512VLBW-NEXT:    vpcmpnleub %ymm1, %ymm0, %k1
2257 ; AVX512VLBW-NEXT:    vpminub %ymm1, %ymm0, %ymm2
2258 ; AVX512VLBW-NEXT:    vpmaxub %ymm1, %ymm0, %ymm1
2259 ; AVX512VLBW-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2260 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
2261 ; AVX512VLBW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1
2262 ; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2263 ; AVX512VLBW-NEXT:    vpsubb %ymm1, %ymm2, %ymm1 {%k1}
2264 ; AVX512VLBW-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2265 ; AVX512VLBW-NEXT:    retq
2266   %t3 = icmp ugt <32 x i8> %a1, %a2
2267   %t4 = select <32 x i1> %t3, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
2268   %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a1
2269   %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a2
2270   %t7 = sub <32 x i8> %t6, %t5
2271   %t8 = lshr <32 x i8> %t7, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
2272   %t9 = mul <32 x i8> %t8, %t4
2273   %a10 = add <32 x i8> %t9, %a1
2274   ret <32 x i8> %a10
2277 ; Values are loaded. Only check signed case.
2279 define <32 x i8> @vec256_i8_signed_mem_reg(ptr %a1_addr, <32 x i8> %a2) nounwind {
2280 ; AVX1-LABEL: vec256_i8_signed_mem_reg:
2281 ; AVX1:       # %bb.0:
2282 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2283 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm1
2284 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm2
2285 ; AVX1-NEXT:    vpcmpgtb %xmm3, %xmm2, %xmm4
2286 ; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm5
2287 ; AVX1-NEXT:    vpminsb %xmm0, %xmm1, %xmm6
2288 ; AVX1-NEXT:    vpmaxsb %xmm0, %xmm1, %xmm0
2289 ; AVX1-NEXT:    vpsubb %xmm6, %xmm0, %xmm0
2290 ; AVX1-NEXT:    vpminsb %xmm3, %xmm2, %xmm6
2291 ; AVX1-NEXT:    vpmaxsb %xmm3, %xmm2, %xmm3
2292 ; AVX1-NEXT:    vpsubb %xmm6, %xmm3, %xmm3
2293 ; AVX1-NEXT:    vpsrlw $1, %xmm3, %xmm3
2294 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
2295 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
2296 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm0
2297 ; AVX1-NEXT:    vpand %xmm6, %xmm0, %xmm0
2298 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2299 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2300 ; AVX1-NEXT:    vpor %xmm7, %xmm5, %xmm5
2301 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm8 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2302 ; AVX1-NEXT:    vpmullw %xmm6, %xmm8, %xmm6
2303 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]
2304 ; AVX1-NEXT:    vpand %xmm6, %xmm8, %xmm6
2305 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2306 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2307 ; AVX1-NEXT:    vpmullw %xmm5, %xmm0, %xmm0
2308 ; AVX1-NEXT:    vpand %xmm0, %xmm8, %xmm0
2309 ; AVX1-NEXT:    vpackuswb %xmm6, %xmm0, %xmm0
2310 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2311 ; AVX1-NEXT:    vpor %xmm7, %xmm4, %xmm4
2312 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2313 ; AVX1-NEXT:    vpmullw %xmm6, %xmm5, %xmm5
2314 ; AVX1-NEXT:    vpand %xmm5, %xmm8, %xmm5
2315 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2316 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
2317 ; AVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
2318 ; AVX1-NEXT:    vpand %xmm3, %xmm8, %xmm3
2319 ; AVX1-NEXT:    vpackuswb %xmm5, %xmm3, %xmm3
2320 ; AVX1-NEXT:    vpaddb %xmm2, %xmm3, %xmm2
2321 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
2322 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2323 ; AVX1-NEXT:    retq
2325 ; AVX2-LABEL: vec256_i8_signed_mem_reg:
2326 ; AVX2:       # %bb.0:
2327 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
2328 ; AVX2-NEXT:    vpcmpgtb %ymm0, %ymm1, %ymm2
2329 ; AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
2330 ; AVX2-NEXT:    vpminsb %ymm0, %ymm1, %ymm3
2331 ; AVX2-NEXT:    vpmaxsb %ymm0, %ymm1, %ymm0
2332 ; AVX2-NEXT:    vpsubb %ymm3, %ymm0, %ymm0
2333 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm0
2334 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2335 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2336 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2337 ; AVX2-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
2338 ; AVX2-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2339 ; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm3
2340 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2341 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2342 ; AVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
2343 ; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
2344 ; AVX2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
2345 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
2346 ; AVX2-NEXT:    retq
2348 ; XOP-LABEL: vec256_i8_signed_mem_reg:
2349 ; XOP:       # %bb.0:
2350 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm2
2351 ; XOP-NEXT:    vmovdqa (%rdi), %xmm1
2352 ; XOP-NEXT:    vmovdqa 16(%rdi), %xmm3
2353 ; XOP-NEXT:    vpcomgtb %xmm2, %xmm3, %xmm4
2354 ; XOP-NEXT:    vpcomgtb %xmm0, %xmm1, %xmm5
2355 ; XOP-NEXT:    vpminsb %xmm0, %xmm1, %xmm6
2356 ; XOP-NEXT:    vpmaxsb %xmm0, %xmm1, %xmm0
2357 ; XOP-NEXT:    vpsubb %xmm6, %xmm0, %xmm0
2358 ; XOP-NEXT:    vpminsb %xmm2, %xmm3, %xmm6
2359 ; XOP-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
2360 ; XOP-NEXT:    vpsubb %xmm6, %xmm2, %xmm2
2361 ; XOP-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
2362 ; XOP-NEXT:    vpshlb %xmm6, %xmm2, %xmm2
2363 ; XOP-NEXT:    vpshlb %xmm6, %xmm0, %xmm0
2364 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2365 ; XOP-NEXT:    vbroadcastss {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2366 ; XOP-NEXT:    vpor %xmm7, %xmm5, %xmm5
2367 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm8 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2368 ; XOP-NEXT:    vpmullw %xmm6, %xmm8, %xmm6
2369 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2370 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2371 ; XOP-NEXT:    vpmullw %xmm5, %xmm0, %xmm0
2372 ; XOP-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
2373 ; XOP-NEXT:    vpperm %xmm5, %xmm6, %xmm0, %xmm0
2374 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2375 ; XOP-NEXT:    vpor %xmm7, %xmm4, %xmm4
2376 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2377 ; XOP-NEXT:    vpmullw %xmm7, %xmm6, %xmm6
2378 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2379 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
2380 ; XOP-NEXT:    vpmullw %xmm4, %xmm2, %xmm2
2381 ; XOP-NEXT:    vpperm %xmm5, %xmm6, %xmm2, %xmm2
2382 ; XOP-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
2383 ; XOP-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
2384 ; XOP-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2385 ; XOP-NEXT:    retq
2387 ; AVX512F-LABEL: vec256_i8_signed_mem_reg:
2388 ; AVX512F:       # %bb.0:
2389 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm1
2390 ; AVX512F-NEXT:    vpcmpgtb %ymm0, %ymm1, %ymm2
2391 ; AVX512F-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
2392 ; AVX512F-NEXT:    vpminsb %ymm0, %ymm1, %ymm3
2393 ; AVX512F-NEXT:    vpmaxsb %ymm0, %ymm1, %ymm0
2394 ; AVX512F-NEXT:    vpsubb %ymm3, %ymm0, %ymm0
2395 ; AVX512F-NEXT:    vpsrlw $1, %ymm0, %ymm0
2396 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2397 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2398 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2399 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
2400 ; AVX512F-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2401 ; AVX512F-NEXT:    vpand %ymm4, %ymm3, %ymm3
2402 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2403 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2404 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
2405 ; AVX512F-NEXT:    vpand %ymm4, %ymm0, %ymm0
2406 ; AVX512F-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
2407 ; AVX512F-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
2408 ; AVX512F-NEXT:    retq
2410 ; AVX512VL-FALLBACK-LABEL: vec256_i8_signed_mem_reg:
2411 ; AVX512VL-FALLBACK:       # %bb.0:
2412 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
2413 ; AVX512VL-FALLBACK-NEXT:    vpminsb %ymm0, %ymm1, %ymm2
2414 ; AVX512VL-FALLBACK-NEXT:    vpmaxsb %ymm0, %ymm1, %ymm3
2415 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm2, %ymm3, %ymm2
2416 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm2, %ymm2
2417 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtb %ymm0, %ymm1, %ymm0
2418 ; AVX512VL-FALLBACK-NEXT:    vpternlogd $108, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm2
2419 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm0, %ymm2, %ymm0
2420 ; AVX512VL-FALLBACK-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
2421 ; AVX512VL-FALLBACK-NEXT:    retq
2423 ; AVX512BW-FALLBACK-LABEL: vec256_i8_signed_mem_reg:
2424 ; AVX512BW-FALLBACK:       # %bb.0:
2425 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2426 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
2427 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtb %zmm0, %zmm1, %k1
2428 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2429 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastb {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2430 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
2431 ; AVX512BW-FALLBACK-NEXT:    vpminsb %ymm0, %ymm1, %ymm2
2432 ; AVX512BW-FALLBACK-NEXT:    vpmaxsb %ymm0, %ymm1, %ymm0
2433 ; AVX512BW-FALLBACK-NEXT:    vpsubb %ymm2, %ymm0, %ymm0
2434 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm0, %ymm0
2435 ; AVX512BW-FALLBACK-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2436 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
2437 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero,ymm3[16],zero,ymm3[17],zero,ymm3[18],zero,ymm3[19],zero,ymm3[20],zero,ymm3[21],zero,ymm3[22],zero,ymm3[23],zero,ymm3[24],zero,ymm3[25],zero,ymm3[26],zero,ymm3[27],zero,ymm3[28],zero,ymm3[29],zero,ymm3[30],zero,ymm3[31],zero
2438 ; AVX512BW-FALLBACK-NEXT:    vpmullw %zmm2, %zmm0, %zmm0
2439 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm0, %ymm0
2440 ; AVX512BW-FALLBACK-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
2441 ; AVX512BW-FALLBACK-NEXT:    retq
2443 ; AVX512VLBW-LABEL: vec256_i8_signed_mem_reg:
2444 ; AVX512VLBW:       # %bb.0:
2445 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %ymm1
2446 ; AVX512VLBW-NEXT:    vpcmpgtb %ymm0, %ymm1, %k1
2447 ; AVX512VLBW-NEXT:    vpminsb %ymm0, %ymm1, %ymm2
2448 ; AVX512VLBW-NEXT:    vpmaxsb %ymm0, %ymm1, %ymm0
2449 ; AVX512VLBW-NEXT:    vpsubb %ymm2, %ymm0, %ymm0
2450 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm0, %ymm0
2451 ; AVX512VLBW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
2452 ; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2453 ; AVX512VLBW-NEXT:    vpsubb %ymm0, %ymm2, %ymm0 {%k1}
2454 ; AVX512VLBW-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
2455 ; AVX512VLBW-NEXT:    retq
2456   %a1 = load <32 x i8>, ptr %a1_addr
2457   %t3 = icmp sgt <32 x i8> %a1, %a2 ; signed
2458   %t4 = select <32 x i1> %t3, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
2459   %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a1
2460   %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a2
2461   %t7 = sub <32 x i8> %t6, %t5
2462   %t8 = lshr <32 x i8> %t7, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
2463   %t9 = mul nsw <32 x i8> %t8, %t4 ; signed
2464   %a10 = add nsw <32 x i8> %t9, %a1 ; signed
2465   ret <32 x i8> %a10
2468 define <32 x i8> @vec256_i8_signed_reg_mem(<32 x i8> %a1, ptr %a2_addr) nounwind {
2469 ; AVX1-LABEL: vec256_i8_signed_reg_mem:
2470 ; AVX1:       # %bb.0:
2471 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm2
2472 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm3
2473 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2474 ; AVX1-NEXT:    vpcmpgtb %xmm3, %xmm1, %xmm4
2475 ; AVX1-NEXT:    vpcmpgtb %xmm2, %xmm0, %xmm5
2476 ; AVX1-NEXT:    vpminsb %xmm2, %xmm0, %xmm6
2477 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm0, %xmm2
2478 ; AVX1-NEXT:    vpsubb %xmm6, %xmm2, %xmm2
2479 ; AVX1-NEXT:    vpminsb %xmm3, %xmm1, %xmm6
2480 ; AVX1-NEXT:    vpmaxsb %xmm3, %xmm1, %xmm3
2481 ; AVX1-NEXT:    vpsubb %xmm6, %xmm3, %xmm3
2482 ; AVX1-NEXT:    vpsrlw $1, %xmm3, %xmm3
2483 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
2484 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
2485 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
2486 ; AVX1-NEXT:    vpand %xmm6, %xmm2, %xmm2
2487 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2488 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2489 ; AVX1-NEXT:    vpor %xmm7, %xmm5, %xmm5
2490 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm8 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2491 ; AVX1-NEXT:    vpmullw %xmm6, %xmm8, %xmm6
2492 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]
2493 ; AVX1-NEXT:    vpand %xmm6, %xmm8, %xmm6
2494 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2495 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2496 ; AVX1-NEXT:    vpmullw %xmm5, %xmm2, %xmm2
2497 ; AVX1-NEXT:    vpand %xmm2, %xmm8, %xmm2
2498 ; AVX1-NEXT:    vpackuswb %xmm6, %xmm2, %xmm2
2499 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2500 ; AVX1-NEXT:    vpor %xmm7, %xmm4, %xmm4
2501 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2502 ; AVX1-NEXT:    vpmullw %xmm6, %xmm5, %xmm5
2503 ; AVX1-NEXT:    vpand %xmm5, %xmm8, %xmm5
2504 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2505 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
2506 ; AVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
2507 ; AVX1-NEXT:    vpand %xmm3, %xmm8, %xmm3
2508 ; AVX1-NEXT:    vpackuswb %xmm5, %xmm3, %xmm3
2509 ; AVX1-NEXT:    vpaddb %xmm1, %xmm3, %xmm1
2510 ; AVX1-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
2511 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2512 ; AVX1-NEXT:    retq
2514 ; AVX2-LABEL: vec256_i8_signed_reg_mem:
2515 ; AVX2:       # %bb.0:
2516 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
2517 ; AVX2-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
2518 ; AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
2519 ; AVX2-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
2520 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2521 ; AVX2-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
2522 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
2523 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2524 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2525 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2526 ; AVX2-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
2527 ; AVX2-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2528 ; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm3
2529 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2530 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2531 ; AVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2532 ; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1
2533 ; AVX2-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
2534 ; AVX2-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2535 ; AVX2-NEXT:    retq
2537 ; XOP-LABEL: vec256_i8_signed_reg_mem:
2538 ; XOP:       # %bb.0:
2539 ; XOP-NEXT:    vmovdqa (%rdi), %xmm1
2540 ; XOP-NEXT:    vmovdqa 16(%rdi), %xmm2
2541 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm3
2542 ; XOP-NEXT:    vpcomgtb %xmm2, %xmm3, %xmm4
2543 ; XOP-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm5
2544 ; XOP-NEXT:    vpminsb %xmm1, %xmm0, %xmm6
2545 ; XOP-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
2546 ; XOP-NEXT:    vpsubb %xmm6, %xmm1, %xmm1
2547 ; XOP-NEXT:    vpminsb %xmm2, %xmm3, %xmm6
2548 ; XOP-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
2549 ; XOP-NEXT:    vpsubb %xmm6, %xmm2, %xmm2
2550 ; XOP-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
2551 ; XOP-NEXT:    vpshlb %xmm6, %xmm2, %xmm2
2552 ; XOP-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
2553 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2554 ; XOP-NEXT:    vbroadcastss {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2555 ; XOP-NEXT:    vpor %xmm7, %xmm5, %xmm5
2556 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm8 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2557 ; XOP-NEXT:    vpmullw %xmm6, %xmm8, %xmm6
2558 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2559 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2560 ; XOP-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
2561 ; XOP-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
2562 ; XOP-NEXT:    vpperm %xmm5, %xmm6, %xmm1, %xmm1
2563 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2564 ; XOP-NEXT:    vpor %xmm7, %xmm4, %xmm4
2565 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2566 ; XOP-NEXT:    vpmullw %xmm7, %xmm6, %xmm6
2567 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2568 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
2569 ; XOP-NEXT:    vpmullw %xmm4, %xmm2, %xmm2
2570 ; XOP-NEXT:    vpperm %xmm5, %xmm6, %xmm2, %xmm2
2571 ; XOP-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
2572 ; XOP-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2573 ; XOP-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2574 ; XOP-NEXT:    retq
2576 ; AVX512F-LABEL: vec256_i8_signed_reg_mem:
2577 ; AVX512F:       # %bb.0:
2578 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm1
2579 ; AVX512F-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
2580 ; AVX512F-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
2581 ; AVX512F-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
2582 ; AVX512F-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2583 ; AVX512F-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
2584 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
2585 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2586 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2587 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2588 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
2589 ; AVX512F-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2590 ; AVX512F-NEXT:    vpand %ymm4, %ymm3, %ymm3
2591 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2592 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2593 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2594 ; AVX512F-NEXT:    vpand %ymm4, %ymm1, %ymm1
2595 ; AVX512F-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
2596 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2597 ; AVX512F-NEXT:    retq
2599 ; AVX512VL-FALLBACK-LABEL: vec256_i8_signed_reg_mem:
2600 ; AVX512VL-FALLBACK:       # %bb.0:
2601 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
2602 ; AVX512VL-FALLBACK-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
2603 ; AVX512VL-FALLBACK-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm3
2604 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm2, %ymm3, %ymm2
2605 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm2, %ymm2
2606 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm1
2607 ; AVX512VL-FALLBACK-NEXT:    vpternlogd $108, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm2
2608 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm1, %ymm2, %ymm1
2609 ; AVX512VL-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2610 ; AVX512VL-FALLBACK-NEXT:    retq
2612 ; AVX512BW-FALLBACK-LABEL: vec256_i8_signed_reg_mem:
2613 ; AVX512BW-FALLBACK:       # %bb.0:
2614 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2615 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
2616 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtb %zmm1, %zmm0, %k1
2617 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2618 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastb {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2619 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
2620 ; AVX512BW-FALLBACK-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
2621 ; AVX512BW-FALLBACK-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2622 ; AVX512BW-FALLBACK-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2623 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
2624 ; AVX512BW-FALLBACK-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2625 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
2626 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero,ymm3[16],zero,ymm3[17],zero,ymm3[18],zero,ymm3[19],zero,ymm3[20],zero,ymm3[21],zero,ymm3[22],zero,ymm3[23],zero,ymm3[24],zero,ymm3[25],zero,ymm3[26],zero,ymm3[27],zero,ymm3[28],zero,ymm3[29],zero,ymm3[30],zero,ymm3[31],zero
2627 ; AVX512BW-FALLBACK-NEXT:    vpmullw %zmm2, %zmm1, %zmm1
2628 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm1, %ymm1
2629 ; AVX512BW-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2630 ; AVX512BW-FALLBACK-NEXT:    retq
2632 ; AVX512VLBW-LABEL: vec256_i8_signed_reg_mem:
2633 ; AVX512VLBW:       # %bb.0:
2634 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %ymm1
2635 ; AVX512VLBW-NEXT:    vpcmpgtb %ymm1, %ymm0, %k1
2636 ; AVX512VLBW-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
2637 ; AVX512VLBW-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2638 ; AVX512VLBW-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2639 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
2640 ; AVX512VLBW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1
2641 ; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2642 ; AVX512VLBW-NEXT:    vpsubb %ymm1, %ymm2, %ymm1 {%k1}
2643 ; AVX512VLBW-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2644 ; AVX512VLBW-NEXT:    retq
2645   %a2 = load <32 x i8>, ptr %a2_addr
2646   %t3 = icmp sgt <32 x i8> %a1, %a2 ; signed
2647   %t4 = select <32 x i1> %t3, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
2648   %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a1
2649   %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a2
2650   %t7 = sub <32 x i8> %t6, %t5
2651   %t8 = lshr <32 x i8> %t7, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
2652   %t9 = mul nsw <32 x i8> %t8, %t4 ; signed
2653   %a10 = add nsw <32 x i8> %t9, %a1 ; signed
2654   ret <32 x i8> %a10
2657 define <32 x i8> @vec256_i8_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind {
2658 ; AVX1-LABEL: vec256_i8_signed_mem_mem:
2659 ; AVX1:       # %bb.0:
2660 ; AVX1-NEXT:    vmovdqa (%rsi), %xmm2
2661 ; AVX1-NEXT:    vmovdqa 16(%rsi), %xmm3
2662 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
2663 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
2664 ; AVX1-NEXT:    vpcmpgtb %xmm3, %xmm1, %xmm4
2665 ; AVX1-NEXT:    vpcmpgtb %xmm2, %xmm0, %xmm5
2666 ; AVX1-NEXT:    vpminsb %xmm2, %xmm0, %xmm6
2667 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm0, %xmm2
2668 ; AVX1-NEXT:    vpsubb %xmm6, %xmm2, %xmm2
2669 ; AVX1-NEXT:    vpminsb %xmm3, %xmm1, %xmm6
2670 ; AVX1-NEXT:    vpmaxsb %xmm3, %xmm1, %xmm3
2671 ; AVX1-NEXT:    vpsubb %xmm6, %xmm3, %xmm3
2672 ; AVX1-NEXT:    vpsrlw $1, %xmm3, %xmm3
2673 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
2674 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
2675 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
2676 ; AVX1-NEXT:    vpand %xmm6, %xmm2, %xmm2
2677 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2678 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2679 ; AVX1-NEXT:    vpor %xmm7, %xmm5, %xmm5
2680 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm8 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2681 ; AVX1-NEXT:    vpmullw %xmm6, %xmm8, %xmm6
2682 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]
2683 ; AVX1-NEXT:    vpand %xmm6, %xmm8, %xmm6
2684 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2685 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2686 ; AVX1-NEXT:    vpmullw %xmm5, %xmm2, %xmm2
2687 ; AVX1-NEXT:    vpand %xmm2, %xmm8, %xmm2
2688 ; AVX1-NEXT:    vpackuswb %xmm6, %xmm2, %xmm2
2689 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2690 ; AVX1-NEXT:    vpor %xmm7, %xmm4, %xmm4
2691 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2692 ; AVX1-NEXT:    vpmullw %xmm6, %xmm5, %xmm5
2693 ; AVX1-NEXT:    vpand %xmm5, %xmm8, %xmm5
2694 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2695 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
2696 ; AVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
2697 ; AVX1-NEXT:    vpand %xmm3, %xmm8, %xmm3
2698 ; AVX1-NEXT:    vpackuswb %xmm5, %xmm3, %xmm3
2699 ; AVX1-NEXT:    vpaddb %xmm1, %xmm3, %xmm1
2700 ; AVX1-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
2701 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2702 ; AVX1-NEXT:    retq
2704 ; AVX2-LABEL: vec256_i8_signed_mem_mem:
2705 ; AVX2:       # %bb.0:
2706 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
2707 ; AVX2-NEXT:    vmovdqa (%rsi), %ymm1
2708 ; AVX2-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
2709 ; AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
2710 ; AVX2-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
2711 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2712 ; AVX2-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
2713 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
2714 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2715 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2716 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2717 ; AVX2-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
2718 ; AVX2-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2719 ; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm3
2720 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2721 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2722 ; AVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2723 ; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1
2724 ; AVX2-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
2725 ; AVX2-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2726 ; AVX2-NEXT:    retq
2728 ; XOP-LABEL: vec256_i8_signed_mem_mem:
2729 ; XOP:       # %bb.0:
2730 ; XOP-NEXT:    vmovdqa (%rsi), %xmm0
2731 ; XOP-NEXT:    vmovdqa 16(%rsi), %xmm1
2732 ; XOP-NEXT:    vmovdqa (%rdi), %xmm2
2733 ; XOP-NEXT:    vmovdqa 16(%rdi), %xmm3
2734 ; XOP-NEXT:    vpcomgtb %xmm1, %xmm3, %xmm4
2735 ; XOP-NEXT:    vpcomgtb %xmm0, %xmm2, %xmm5
2736 ; XOP-NEXT:    vpminsb %xmm0, %xmm2, %xmm6
2737 ; XOP-NEXT:    vpmaxsb %xmm0, %xmm2, %xmm0
2738 ; XOP-NEXT:    vpsubb %xmm6, %xmm0, %xmm0
2739 ; XOP-NEXT:    vpminsb %xmm1, %xmm3, %xmm6
2740 ; XOP-NEXT:    vpmaxsb %xmm1, %xmm3, %xmm1
2741 ; XOP-NEXT:    vpsubb %xmm6, %xmm1, %xmm1
2742 ; XOP-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
2743 ; XOP-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
2744 ; XOP-NEXT:    vpshlb %xmm6, %xmm0, %xmm0
2745 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2746 ; XOP-NEXT:    vbroadcastss {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2747 ; XOP-NEXT:    vpor %xmm7, %xmm5, %xmm5
2748 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm8 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2749 ; XOP-NEXT:    vpmullw %xmm6, %xmm8, %xmm6
2750 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2751 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2752 ; XOP-NEXT:    vpmullw %xmm5, %xmm0, %xmm0
2753 ; XOP-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
2754 ; XOP-NEXT:    vpperm %xmm5, %xmm6, %xmm0, %xmm0
2755 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2756 ; XOP-NEXT:    vpor %xmm7, %xmm4, %xmm4
2757 ; XOP-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2758 ; XOP-NEXT:    vpmullw %xmm7, %xmm6, %xmm6
2759 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2760 ; XOP-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
2761 ; XOP-NEXT:    vpmullw %xmm4, %xmm1, %xmm1
2762 ; XOP-NEXT:    vpperm %xmm5, %xmm6, %xmm1, %xmm1
2763 ; XOP-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
2764 ; XOP-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
2765 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2766 ; XOP-NEXT:    retq
2768 ; AVX512F-LABEL: vec256_i8_signed_mem_mem:
2769 ; AVX512F:       # %bb.0:
2770 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
2771 ; AVX512F-NEXT:    vmovdqa (%rsi), %ymm1
2772 ; AVX512F-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
2773 ; AVX512F-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
2774 ; AVX512F-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
2775 ; AVX512F-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2776 ; AVX512F-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
2777 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
2778 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2779 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2780 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2781 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
2782 ; AVX512F-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2783 ; AVX512F-NEXT:    vpand %ymm4, %ymm3, %ymm3
2784 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2785 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2786 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2787 ; AVX512F-NEXT:    vpand %ymm4, %ymm1, %ymm1
2788 ; AVX512F-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
2789 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2790 ; AVX512F-NEXT:    retq
2792 ; AVX512VL-FALLBACK-LABEL: vec256_i8_signed_mem_mem:
2793 ; AVX512VL-FALLBACK:       # %bb.0:
2794 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm0
2795 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rsi), %ymm1
2796 ; AVX512VL-FALLBACK-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
2797 ; AVX512VL-FALLBACK-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm3
2798 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm2, %ymm3, %ymm2
2799 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm2, %ymm2
2800 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm1
2801 ; AVX512VL-FALLBACK-NEXT:    vpternlogd $108, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm2
2802 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm1, %ymm2, %ymm1
2803 ; AVX512VL-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2804 ; AVX512VL-FALLBACK-NEXT:    retq
2806 ; AVX512BW-FALLBACK-LABEL: vec256_i8_signed_mem_mem:
2807 ; AVX512BW-FALLBACK:       # %bb.0:
2808 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm0
2809 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rsi), %ymm1
2810 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtb %zmm1, %zmm0, %k1
2811 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2812 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastb {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2813 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
2814 ; AVX512BW-FALLBACK-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
2815 ; AVX512BW-FALLBACK-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2816 ; AVX512BW-FALLBACK-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2817 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
2818 ; AVX512BW-FALLBACK-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2819 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
2820 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero,ymm3[16],zero,ymm3[17],zero,ymm3[18],zero,ymm3[19],zero,ymm3[20],zero,ymm3[21],zero,ymm3[22],zero,ymm3[23],zero,ymm3[24],zero,ymm3[25],zero,ymm3[26],zero,ymm3[27],zero,ymm3[28],zero,ymm3[29],zero,ymm3[30],zero,ymm3[31],zero
2821 ; AVX512BW-FALLBACK-NEXT:    vpmullw %zmm2, %zmm1, %zmm1
2822 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm1, %ymm1
2823 ; AVX512BW-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2824 ; AVX512BW-FALLBACK-NEXT:    retq
2826 ; AVX512VLBW-LABEL: vec256_i8_signed_mem_mem:
2827 ; AVX512VLBW:       # %bb.0:
2828 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %ymm0
2829 ; AVX512VLBW-NEXT:    vmovdqa (%rsi), %ymm1
2830 ; AVX512VLBW-NEXT:    vpcmpgtb %ymm1, %ymm0, %k1
2831 ; AVX512VLBW-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
2832 ; AVX512VLBW-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2833 ; AVX512VLBW-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2834 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
2835 ; AVX512VLBW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1
2836 ; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2837 ; AVX512VLBW-NEXT:    vpsubb %ymm1, %ymm2, %ymm1 {%k1}
2838 ; AVX512VLBW-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2839 ; AVX512VLBW-NEXT:    retq
2840   %a1 = load <32 x i8>, ptr %a1_addr
2841   %a2 = load <32 x i8>, ptr %a2_addr
2842   %t3 = icmp sgt <32 x i8> %a1, %a2 ; signed
2843   %t4 = select <32 x i1> %t3, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
2844   %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a1
2845   %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a2
2846   %t7 = sub <32 x i8> %t6, %t5
2847   %t8 = lshr <32 x i8> %t7, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
2848   %t9 = mul nsw <32 x i8> %t8, %t4 ; signed
2849   %a10 = add nsw <32 x i8> %t9, %a1 ; signed
2850   ret <32 x i8> %a10