[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / midpoint-int-vec-256.ll
blob0d28d6145ceba614ebaaae7ab3a01a968f3761e9
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=ALL,AVX,AVX1,AVX1-FALLBACK
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX,AVX2,AVX2-FALLBACK
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop | FileCheck %s --check-prefixes=ALL,XOP,XOP-FALLBACK
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=ALL,XOP,AVX,AVX1,XOPAVX,XOPAVX1,XOPAVX1-FALLBACK
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=ALL,XOP,AVX,AVX2,XOPAVX,XOPAVX2,XOPAVX2-FALLBACK
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=ALL,AVX512,AVX512F
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=ALL,AVX512,AVX512VL,AVX512VL-FALLBACK
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=ALL,AVX512,AVX512BW,AVX512BW-FALLBACK
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw | FileCheck %s --check-prefixes=ALL,AVX512,AVX512VL,AVX512BW,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-FALLBACK-LABEL: vec256_i32_signed_reg_reg:
25 ; AVX1-FALLBACK:       # %bb.0:
26 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm2
27 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
28 ; AVX1-FALLBACK-NEXT:    vpminsd %xmm2, %xmm3, %xmm4
29 ; AVX1-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm5
30 ; AVX1-FALLBACK-NEXT:    vpmaxsd %xmm2, %xmm3, %xmm2
31 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm4, %xmm2, %xmm2
32 ; AVX1-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
33 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm5, %xmm1, %xmm1
34 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm2, %xmm2
35 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
36 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm1, %xmm1, %xmm1
37 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm2, %xmm2, %xmm2
38 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
39 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
40 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
41 ; AVX1-FALLBACK-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-FALLBACK-LABEL: vec256_i32_signed_reg_reg:
54 ; XOP-FALLBACK:       # %bb.0:
55 ; XOP-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
56 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm3
57 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm4
58 ; XOP-FALLBACK-NEXT:    vpminsd %xmm3, %xmm4, %xmm5
59 ; XOP-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
60 ; XOP-FALLBACK-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
61 ; XOP-FALLBACK-NEXT:    vpmaxsd %xmm3, %xmm4, %xmm2
62 ; XOP-FALLBACK-NEXT:    vpsubd %xmm5, %xmm2, %xmm2
63 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
64 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm2, %xmm2
65 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm4, %xmm2, %xmm2, %xmm2
66 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm0, %xmm1, %xmm1, %xmm0
67 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
68 ; XOP-FALLBACK-NEXT:    retq
70 ; XOPAVX1-LABEL: vec256_i32_signed_reg_reg:
71 ; XOPAVX1:       # %bb.0:
72 ; XOPAVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
73 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
74 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
75 ; XOPAVX1-NEXT:    vpminsd %xmm3, %xmm4, %xmm5
76 ; XOPAVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
77 ; XOPAVX1-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
78 ; XOPAVX1-NEXT:    vpmaxsd %xmm3, %xmm4, %xmm2
79 ; XOPAVX1-NEXT:    vpsubd %xmm5, %xmm2, %xmm2
80 ; XOPAVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
81 ; XOPAVX1-NEXT:    vpsrld $1, %xmm2, %xmm2
82 ; XOPAVX1-NEXT:    vpmacsdd %xmm4, %xmm2, %xmm2, %xmm2
83 ; XOPAVX1-NEXT:    vpmacsdd %xmm0, %xmm1, %xmm1, %xmm0
84 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
85 ; XOPAVX1-NEXT:    retq
87 ; AVX512-LABEL: vec256_i32_signed_reg_reg:
88 ; AVX512:       # %bb.0:
89 ; AVX512-NEXT:    vpminsd %ymm1, %ymm0, %ymm2
90 ; AVX512-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm1
91 ; AVX512-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
92 ; AVX512-NEXT:    vpsrld $1, %ymm1, %ymm1
93 ; AVX512-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
94 ; AVX512-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
95 ; AVX512-NEXT:    retq
96   %t3 = icmp sgt <8 x i32> %a1, %a2 ; signed
97   %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>
98   %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a1
99   %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a2
100   %t7 = sub <8 x i32> %t6, %t5
101   %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
102   %t9 = mul nsw <8 x i32> %t8, %t8 ; signed
103   %a10 = add nsw <8 x i32> %t9, %a1 ; signed
104   ret <8 x i32> %a10
107 define <8 x i32> @vec256_i32_unsigned_reg_reg(<8 x i32> %a1, <8 x i32> %a2) nounwind {
108 ; AVX1-FALLBACK-LABEL: vec256_i32_unsigned_reg_reg:
109 ; AVX1-FALLBACK:       # %bb.0:
110 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm2
111 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
112 ; AVX1-FALLBACK-NEXT:    vpminud %xmm2, %xmm3, %xmm4
113 ; AVX1-FALLBACK-NEXT:    vpminud %xmm1, %xmm0, %xmm5
114 ; AVX1-FALLBACK-NEXT:    vpmaxud %xmm2, %xmm3, %xmm2
115 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm4, %xmm2, %xmm2
116 ; AVX1-FALLBACK-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
117 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm5, %xmm1, %xmm1
118 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm2, %xmm2
119 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
120 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm1, %xmm1, %xmm1
121 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm2, %xmm2, %xmm2
122 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
123 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
124 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
125 ; AVX1-FALLBACK-NEXT:    retq
127 ; AVX2-LABEL: vec256_i32_unsigned_reg_reg:
128 ; AVX2:       # %bb.0:
129 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm2
130 ; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm1
131 ; AVX2-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
132 ; AVX2-NEXT:    vpsrld $1, %ymm1, %ymm1
133 ; AVX2-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
134 ; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
135 ; AVX2-NEXT:    retq
137 ; XOP-FALLBACK-LABEL: vec256_i32_unsigned_reg_reg:
138 ; XOP-FALLBACK:       # %bb.0:
139 ; XOP-FALLBACK-NEXT:    vpminud %xmm1, %xmm0, %xmm2
140 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm3
141 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm4
142 ; XOP-FALLBACK-NEXT:    vpminud %xmm3, %xmm4, %xmm5
143 ; XOP-FALLBACK-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
144 ; XOP-FALLBACK-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
145 ; XOP-FALLBACK-NEXT:    vpmaxud %xmm3, %xmm4, %xmm2
146 ; XOP-FALLBACK-NEXT:    vpsubd %xmm5, %xmm2, %xmm2
147 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
148 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm2, %xmm2
149 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm4, %xmm2, %xmm2, %xmm2
150 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm0, %xmm1, %xmm1, %xmm0
151 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
152 ; XOP-FALLBACK-NEXT:    retq
154 ; XOPAVX1-LABEL: vec256_i32_unsigned_reg_reg:
155 ; XOPAVX1:       # %bb.0:
156 ; XOPAVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm2
157 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
158 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
159 ; XOPAVX1-NEXT:    vpminud %xmm3, %xmm4, %xmm5
160 ; XOPAVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
161 ; XOPAVX1-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
162 ; XOPAVX1-NEXT:    vpmaxud %xmm3, %xmm4, %xmm2
163 ; XOPAVX1-NEXT:    vpsubd %xmm5, %xmm2, %xmm2
164 ; XOPAVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
165 ; XOPAVX1-NEXT:    vpsrld $1, %xmm2, %xmm2
166 ; XOPAVX1-NEXT:    vpmacsdd %xmm4, %xmm2, %xmm2, %xmm2
167 ; XOPAVX1-NEXT:    vpmacsdd %xmm0, %xmm1, %xmm1, %xmm0
168 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
169 ; XOPAVX1-NEXT:    retq
171 ; AVX512-LABEL: vec256_i32_unsigned_reg_reg:
172 ; AVX512:       # %bb.0:
173 ; AVX512-NEXT:    vpminud %ymm1, %ymm0, %ymm2
174 ; AVX512-NEXT:    vpmaxud %ymm1, %ymm0, %ymm1
175 ; AVX512-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
176 ; AVX512-NEXT:    vpsrld $1, %ymm1, %ymm1
177 ; AVX512-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
178 ; AVX512-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
179 ; AVX512-NEXT:    retq
180   %t3 = icmp ugt <8 x i32> %a1, %a2
181   %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>
182   %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a1
183   %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a2
184   %t7 = sub <8 x i32> %t6, %t5
185   %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
186   %t9 = mul <8 x i32> %t8, %t8
187   %a10 = add <8 x i32> %t9, %a1
188   ret <8 x i32> %a10
191 ; Values are loaded. Only check signed case.
193 define <8 x i32> @vec256_i32_signed_mem_reg(<8 x i32>* %a1_addr, <8 x i32> %a2) nounwind {
194 ; AVX1-FALLBACK-LABEL: vec256_i32_signed_mem_reg:
195 ; AVX1-FALLBACK:       # %bb.0:
196 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm1
197 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm2
198 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm3
199 ; AVX1-FALLBACK-NEXT:    vpminsd %xmm1, %xmm3, %xmm4
200 ; AVX1-FALLBACK-NEXT:    vpminsd %xmm0, %xmm2, %xmm5
201 ; AVX1-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm3, %xmm1
202 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm4, %xmm1, %xmm1
203 ; AVX1-FALLBACK-NEXT:    vpmaxsd %xmm0, %xmm2, %xmm0
204 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm5, %xmm0, %xmm0
205 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
206 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm0, %xmm0
207 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm0, %xmm0, %xmm0
208 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm1, %xmm1, %xmm1
209 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
210 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm2, %xmm0, %xmm0
211 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
212 ; AVX1-FALLBACK-NEXT:    retq
214 ; AVX2-LABEL: vec256_i32_signed_mem_reg:
215 ; AVX2:       # %bb.0:
216 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
217 ; AVX2-NEXT:    vpminsd %ymm0, %ymm1, %ymm2
218 ; AVX2-NEXT:    vpmaxsd %ymm0, %ymm1, %ymm0
219 ; AVX2-NEXT:    vpsubd %ymm2, %ymm0, %ymm0
220 ; AVX2-NEXT:    vpsrld $1, %ymm0, %ymm0
221 ; AVX2-NEXT:    vpmulld %ymm0, %ymm0, %ymm0
222 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
223 ; AVX2-NEXT:    retq
225 ; XOP-FALLBACK-LABEL: vec256_i32_signed_mem_reg:
226 ; XOP-FALLBACK:       # %bb.0:
227 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
228 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm2
229 ; XOP-FALLBACK-NEXT:    vpminsd %xmm0, %xmm1, %xmm3
230 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm4
231 ; XOP-FALLBACK-NEXT:    vpminsd %xmm4, %xmm2, %xmm5
232 ; XOP-FALLBACK-NEXT:    vpmaxsd %xmm0, %xmm1, %xmm0
233 ; XOP-FALLBACK-NEXT:    vpsubd %xmm3, %xmm0, %xmm0
234 ; XOP-FALLBACK-NEXT:    vpmaxsd %xmm4, %xmm2, %xmm3
235 ; XOP-FALLBACK-NEXT:    vpsubd %xmm5, %xmm3, %xmm3
236 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm0, %xmm0
237 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm3, %xmm3
238 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm2, %xmm3, %xmm3, %xmm2
239 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm1, %xmm0, %xmm0, %xmm0
240 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
241 ; XOP-FALLBACK-NEXT:    retq
243 ; XOPAVX1-LABEL: vec256_i32_signed_mem_reg:
244 ; XOPAVX1:       # %bb.0:
245 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm1
246 ; XOPAVX1-NEXT:    vmovdqa 16(%rdi), %xmm2
247 ; XOPAVX1-NEXT:    vpminsd %xmm0, %xmm1, %xmm3
248 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
249 ; XOPAVX1-NEXT:    vpminsd %xmm4, %xmm2, %xmm5
250 ; XOPAVX1-NEXT:    vpmaxsd %xmm0, %xmm1, %xmm0
251 ; XOPAVX1-NEXT:    vpsubd %xmm3, %xmm0, %xmm0
252 ; XOPAVX1-NEXT:    vpmaxsd %xmm4, %xmm2, %xmm3
253 ; XOPAVX1-NEXT:    vpsubd %xmm5, %xmm3, %xmm3
254 ; XOPAVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
255 ; XOPAVX1-NEXT:    vpsrld $1, %xmm3, %xmm3
256 ; XOPAVX1-NEXT:    vpmacsdd %xmm2, %xmm3, %xmm3, %xmm2
257 ; XOPAVX1-NEXT:    vpmacsdd %xmm1, %xmm0, %xmm0, %xmm0
258 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
259 ; XOPAVX1-NEXT:    retq
261 ; AVX512-LABEL: vec256_i32_signed_mem_reg:
262 ; AVX512:       # %bb.0:
263 ; AVX512-NEXT:    vmovdqa (%rdi), %ymm1
264 ; AVX512-NEXT:    vpminsd %ymm0, %ymm1, %ymm2
265 ; AVX512-NEXT:    vpmaxsd %ymm0, %ymm1, %ymm0
266 ; AVX512-NEXT:    vpsubd %ymm2, %ymm0, %ymm0
267 ; AVX512-NEXT:    vpsrld $1, %ymm0, %ymm0
268 ; AVX512-NEXT:    vpmulld %ymm0, %ymm0, %ymm0
269 ; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
270 ; AVX512-NEXT:    retq
271   %a1 = load <8 x i32>, <8 x i32>* %a1_addr
272   %t3 = icmp sgt <8 x i32> %a1, %a2 ; signed
273   %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>
274   %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a1
275   %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a2
276   %t7 = sub <8 x i32> %t6, %t5
277   %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
278   %t9 = mul nsw <8 x i32> %t8, %t8 ; signed
279   %a10 = add nsw <8 x i32> %t9, %a1 ; signed
280   ret <8 x i32> %a10
283 define <8 x i32> @vec256_i32_signed_reg_mem(<8 x i32> %a1, <8 x i32>* %a2_addr) nounwind {
284 ; AVX1-FALLBACK-LABEL: vec256_i32_signed_reg_mem:
285 ; AVX1-FALLBACK:       # %bb.0:
286 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
287 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm2
288 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
289 ; AVX1-FALLBACK-NEXT:    vpminsd %xmm2, %xmm3, %xmm4
290 ; AVX1-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm5
291 ; AVX1-FALLBACK-NEXT:    vpmaxsd %xmm2, %xmm3, %xmm2
292 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm4, %xmm2, %xmm2
293 ; AVX1-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
294 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm5, %xmm1, %xmm1
295 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm2, %xmm2
296 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
297 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm1, %xmm1, %xmm1
298 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm2, %xmm2, %xmm2
299 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
300 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
301 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
302 ; AVX1-FALLBACK-NEXT:    retq
304 ; AVX2-LABEL: vec256_i32_signed_reg_mem:
305 ; AVX2:       # %bb.0:
306 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
307 ; AVX2-NEXT:    vpminsd %ymm1, %ymm0, %ymm2
308 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm1
309 ; AVX2-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
310 ; AVX2-NEXT:    vpsrld $1, %ymm1, %ymm1
311 ; AVX2-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
312 ; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
313 ; AVX2-NEXT:    retq
315 ; XOP-FALLBACK-LABEL: vec256_i32_signed_reg_mem:
316 ; XOP-FALLBACK:       # %bb.0:
317 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
318 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm2
319 ; XOP-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
320 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm4
321 ; XOP-FALLBACK-NEXT:    vpminsd %xmm2, %xmm4, %xmm5
322 ; XOP-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
323 ; XOP-FALLBACK-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
324 ; XOP-FALLBACK-NEXT:    vpmaxsd %xmm2, %xmm4, %xmm2
325 ; XOP-FALLBACK-NEXT:    vpsubd %xmm5, %xmm2, %xmm2
326 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
327 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm2, %xmm2
328 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm4, %xmm2, %xmm2, %xmm2
329 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm0, %xmm1, %xmm1, %xmm0
330 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
331 ; XOP-FALLBACK-NEXT:    retq
333 ; XOPAVX1-LABEL: vec256_i32_signed_reg_mem:
334 ; XOPAVX1:       # %bb.0:
335 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm1
336 ; XOPAVX1-NEXT:    vmovdqa 16(%rdi), %xmm2
337 ; XOPAVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
338 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
339 ; XOPAVX1-NEXT:    vpminsd %xmm2, %xmm4, %xmm5
340 ; XOPAVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
341 ; XOPAVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
342 ; XOPAVX1-NEXT:    vpmaxsd %xmm2, %xmm4, %xmm2
343 ; XOPAVX1-NEXT:    vpsubd %xmm5, %xmm2, %xmm2
344 ; XOPAVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
345 ; XOPAVX1-NEXT:    vpsrld $1, %xmm2, %xmm2
346 ; XOPAVX1-NEXT:    vpmacsdd %xmm4, %xmm2, %xmm2, %xmm2
347 ; XOPAVX1-NEXT:    vpmacsdd %xmm0, %xmm1, %xmm1, %xmm0
348 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
349 ; XOPAVX1-NEXT:    retq
351 ; AVX512-LABEL: vec256_i32_signed_reg_mem:
352 ; AVX512:       # %bb.0:
353 ; AVX512-NEXT:    vmovdqa (%rdi), %ymm1
354 ; AVX512-NEXT:    vpminsd %ymm1, %ymm0, %ymm2
355 ; AVX512-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm1
356 ; AVX512-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
357 ; AVX512-NEXT:    vpsrld $1, %ymm1, %ymm1
358 ; AVX512-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
359 ; AVX512-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
360 ; AVX512-NEXT:    retq
361   %a2 = load <8 x i32>, <8 x i32>* %a2_addr
362   %t3 = icmp sgt <8 x i32> %a1, %a2 ; signed
363   %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>
364   %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a1
365   %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a2
366   %t7 = sub <8 x i32> %t6, %t5
367   %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
368   %t9 = mul nsw <8 x i32> %t8, %t8 ; signed
369   %a10 = add nsw <8 x i32> %t9, %a1 ; signed
370   ret <8 x i32> %a10
373 define <8 x i32> @vec256_i32_signed_mem_mem(<8 x i32>* %a1_addr, <8 x i32>* %a2_addr) nounwind {
374 ; AVX1-FALLBACK-LABEL: vec256_i32_signed_mem_mem:
375 ; AVX1-FALLBACK:       # %bb.0:
376 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm0
377 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rsi), %xmm1
378 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm2
379 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm3
380 ; AVX1-FALLBACK-NEXT:    vpminsd %xmm1, %xmm3, %xmm4
381 ; AVX1-FALLBACK-NEXT:    vpminsd %xmm0, %xmm2, %xmm5
382 ; AVX1-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm3, %xmm1
383 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm4, %xmm1, %xmm1
384 ; AVX1-FALLBACK-NEXT:    vpmaxsd %xmm0, %xmm2, %xmm0
385 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm5, %xmm0, %xmm0
386 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
387 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm0, %xmm0
388 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm0, %xmm0, %xmm0
389 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm1, %xmm1, %xmm1
390 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
391 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm2, %xmm0, %xmm0
392 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
393 ; AVX1-FALLBACK-NEXT:    retq
395 ; AVX2-LABEL: vec256_i32_signed_mem_mem:
396 ; AVX2:       # %bb.0:
397 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
398 ; AVX2-NEXT:    vmovdqa (%rsi), %ymm1
399 ; AVX2-NEXT:    vpminsd %ymm1, %ymm0, %ymm2
400 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm1
401 ; AVX2-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
402 ; AVX2-NEXT:    vpsrld $1, %ymm1, %ymm1
403 ; AVX2-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
404 ; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
405 ; AVX2-NEXT:    retq
407 ; XOP-FALLBACK-LABEL: vec256_i32_signed_mem_mem:
408 ; XOP-FALLBACK:       # %bb.0:
409 ; XOP-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm0
410 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rsi), %xmm1
411 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm2
412 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm3
413 ; XOP-FALLBACK-NEXT:    vpminsd %xmm0, %xmm2, %xmm4
414 ; XOP-FALLBACK-NEXT:    vpminsd %xmm1, %xmm3, %xmm5
415 ; XOP-FALLBACK-NEXT:    vpmaxsd %xmm0, %xmm2, %xmm0
416 ; XOP-FALLBACK-NEXT:    vpsubd %xmm4, %xmm0, %xmm0
417 ; XOP-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm3, %xmm1
418 ; XOP-FALLBACK-NEXT:    vpsubd %xmm5, %xmm1, %xmm1
419 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm0, %xmm0
420 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
421 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm3, %xmm1, %xmm1, %xmm1
422 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm2, %xmm0, %xmm0, %xmm0
423 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
424 ; XOP-FALLBACK-NEXT:    retq
426 ; XOPAVX1-LABEL: vec256_i32_signed_mem_mem:
427 ; XOPAVX1:       # %bb.0:
428 ; XOPAVX1-NEXT:    vmovdqa (%rsi), %xmm0
429 ; XOPAVX1-NEXT:    vmovdqa 16(%rsi), %xmm1
430 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm2
431 ; XOPAVX1-NEXT:    vmovdqa 16(%rdi), %xmm3
432 ; XOPAVX1-NEXT:    vpminsd %xmm0, %xmm2, %xmm4
433 ; XOPAVX1-NEXT:    vpminsd %xmm1, %xmm3, %xmm5
434 ; XOPAVX1-NEXT:    vpmaxsd %xmm0, %xmm2, %xmm0
435 ; XOPAVX1-NEXT:    vpsubd %xmm4, %xmm0, %xmm0
436 ; XOPAVX1-NEXT:    vpmaxsd %xmm1, %xmm3, %xmm1
437 ; XOPAVX1-NEXT:    vpsubd %xmm5, %xmm1, %xmm1
438 ; XOPAVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
439 ; XOPAVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
440 ; XOPAVX1-NEXT:    vpmacsdd %xmm3, %xmm1, %xmm1, %xmm1
441 ; XOPAVX1-NEXT:    vpmacsdd %xmm2, %xmm0, %xmm0, %xmm0
442 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
443 ; XOPAVX1-NEXT:    retq
445 ; AVX512-LABEL: vec256_i32_signed_mem_mem:
446 ; AVX512:       # %bb.0:
447 ; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
448 ; AVX512-NEXT:    vmovdqa (%rsi), %ymm1
449 ; AVX512-NEXT:    vpminsd %ymm1, %ymm0, %ymm2
450 ; AVX512-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm1
451 ; AVX512-NEXT:    vpsubd %ymm2, %ymm1, %ymm1
452 ; AVX512-NEXT:    vpsrld $1, %ymm1, %ymm1
453 ; AVX512-NEXT:    vpmulld %ymm1, %ymm1, %ymm1
454 ; AVX512-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
455 ; AVX512-NEXT:    retq
456   %a1 = load <8 x i32>, <8 x i32>* %a1_addr
457   %a2 = load <8 x i32>, <8 x i32>* %a2_addr
458   %t3 = icmp sgt <8 x i32> %a1, %a2 ; signed
459   %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>
460   %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a1
461   %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a2
462   %t7 = sub <8 x i32> %t6, %t5
463   %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
464   %t9 = mul nsw <8 x i32> %t8, %t8 ; signed
465   %a10 = add nsw <8 x i32> %t9, %a1 ; signed
466   ret <8 x i32> %a10
469 ; ---------------------------------------------------------------------------- ;
470 ; 64-bit width. 256 / 64 = 4 elts.
471 ; ---------------------------------------------------------------------------- ;
473 ; Values come from regs
475 define <4 x i64> @vec256_i64_signed_reg_reg(<4 x i64> %a1, <4 x i64> %a2) nounwind {
476 ; AVX1-FALLBACK-LABEL: vec256_i64_signed_reg_reg:
477 ; AVX1-FALLBACK:       # %bb.0:
478 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm2
479 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
480 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm4
481 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm5
482 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm6
483 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm7
484 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm7, %xmm0, %xmm1, %xmm7
485 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm1
486 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm7, %xmm1, %xmm1
487 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm6, %xmm3, %xmm2, %xmm6
488 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm2
489 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
490 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm2, %xmm2
491 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
492 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1]
493 ; AVX1-FALLBACK-NEXT:    vpor %xmm8, %xmm5, %xmm5
494 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm5, %xmm7
495 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm7, %xmm1, %xmm7
496 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm6
497 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm6, %xmm6
498 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
499 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm6, %xmm6
500 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
501 ; AVX1-FALLBACK-NEXT:    vpor %xmm8, %xmm4, %xmm4
502 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm4, %xmm5
503 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm2, %xmm5
504 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm2, %xmm7
505 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
506 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
507 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm5, %xmm5
508 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
509 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm3, %xmm5, %xmm3
510 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
511 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm6, %xmm0
512 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
513 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
514 ; AVX1-FALLBACK-NEXT:    retq
516 ; AVX2-LABEL: vec256_i64_signed_reg_reg:
517 ; AVX2:       # %bb.0:
518 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
519 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
520 ; AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm3
521 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm4
522 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm1, %ymm4
523 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm1
524 ; AVX2-NEXT:    vpsubq %ymm4, %ymm1, %ymm1
525 ; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm1
526 ; AVX2-NEXT:    vpsrlq $32, %ymm3, %ymm2
527 ; AVX2-NEXT:    vpmuludq %ymm2, %ymm1, %ymm2
528 ; AVX2-NEXT:    vpsrlq $32, %ymm1, %ymm4
529 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm4, %ymm4
530 ; AVX2-NEXT:    vpaddq %ymm4, %ymm2, %ymm2
531 ; AVX2-NEXT:    vpsllq $32, %ymm2, %ymm2
532 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
533 ; AVX2-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
534 ; AVX2-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
535 ; AVX2-NEXT:    retq
537 ; XOP-FALLBACK-LABEL: vec256_i64_signed_reg_reg:
538 ; XOP-FALLBACK:       # %bb.0:
539 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm2
540 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
541 ; XOP-FALLBACK-NEXT:    vpcomgtq %xmm2, %xmm3, %xmm4
542 ; XOP-FALLBACK-NEXT:    vpcomgtq %xmm1, %xmm0, %xmm5
543 ; XOP-FALLBACK-NEXT:    vpcomltq %xmm2, %xmm3, %xmm6
544 ; XOP-FALLBACK-NEXT:    vpcomltq %xmm1, %xmm0, %xmm7
545 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm7, %xmm0, %xmm1, %xmm7
546 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm1
547 ; XOP-FALLBACK-NEXT:    vpsubq %xmm7, %xmm1, %xmm1
548 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm6, %xmm3, %xmm2, %xmm6
549 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm2
550 ; XOP-FALLBACK-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
551 ; XOP-FALLBACK-NEXT:    vpsrlq $1, %xmm2, %xmm2
552 ; XOP-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
553 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1]
554 ; XOP-FALLBACK-NEXT:    vpor %xmm8, %xmm5, %xmm5
555 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm5, %xmm7
556 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm7, %xmm1, %xmm7
557 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm6
558 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm6, %xmm6
559 ; XOP-FALLBACK-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
560 ; XOP-FALLBACK-NEXT:    vpsllq $32, %xmm6, %xmm6
561 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
562 ; XOP-FALLBACK-NEXT:    vpor %xmm8, %xmm4, %xmm4
563 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm4, %xmm5
564 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm2, %xmm5
565 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm2, %xmm7
566 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
567 ; XOP-FALLBACK-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
568 ; XOP-FALLBACK-NEXT:    vpsllq $32, %xmm5, %xmm5
569 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
570 ; XOP-FALLBACK-NEXT:    vpaddq %xmm3, %xmm5, %xmm3
571 ; XOP-FALLBACK-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
572 ; XOP-FALLBACK-NEXT:    vpaddq %xmm0, %xmm6, %xmm0
573 ; XOP-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
574 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
575 ; XOP-FALLBACK-NEXT:    retq
577 ; XOPAVX1-LABEL: vec256_i64_signed_reg_reg:
578 ; XOPAVX1:       # %bb.0:
579 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
580 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
581 ; XOPAVX1-NEXT:    vpcomgtq %xmm2, %xmm3, %xmm4
582 ; XOPAVX1-NEXT:    vpcomgtq %xmm1, %xmm0, %xmm5
583 ; XOPAVX1-NEXT:    vpcomltq %xmm2, %xmm3, %xmm6
584 ; XOPAVX1-NEXT:    vpcomltq %xmm1, %xmm0, %xmm7
585 ; XOPAVX1-NEXT:    vblendvpd %xmm7, %xmm0, %xmm1, %xmm7
586 ; XOPAVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm1
587 ; XOPAVX1-NEXT:    vpsubq %xmm7, %xmm1, %xmm1
588 ; XOPAVX1-NEXT:    vblendvpd %xmm6, %xmm3, %xmm2, %xmm6
589 ; XOPAVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm2
590 ; XOPAVX1-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
591 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm2, %xmm2
592 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
593 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1]
594 ; XOPAVX1-NEXT:    vpor %xmm8, %xmm5, %xmm5
595 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm5, %xmm7
596 ; XOPAVX1-NEXT:    vpmuludq %xmm7, %xmm1, %xmm7
597 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm1, %xmm6
598 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm6, %xmm6
599 ; XOPAVX1-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
600 ; XOPAVX1-NEXT:    vpsllq $32, %xmm6, %xmm6
601 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
602 ; XOPAVX1-NEXT:    vpor %xmm8, %xmm4, %xmm4
603 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm4, %xmm5
604 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm2, %xmm5
605 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm2, %xmm7
606 ; XOPAVX1-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
607 ; XOPAVX1-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
608 ; XOPAVX1-NEXT:    vpsllq $32, %xmm5, %xmm5
609 ; XOPAVX1-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
610 ; XOPAVX1-NEXT:    vpaddq %xmm3, %xmm5, %xmm3
611 ; XOPAVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
612 ; XOPAVX1-NEXT:    vpaddq %xmm0, %xmm6, %xmm0
613 ; XOPAVX1-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
614 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
615 ; XOPAVX1-NEXT:    retq
617 ; AVX512F-LABEL: vec256_i64_signed_reg_reg:
618 ; AVX512F:       # %bb.0:
619 ; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
620 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
621 ; AVX512F-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
622 ; AVX512F-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
623 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
624 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
625 ; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
626 ; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
627 ; AVX512F-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
628 ; AVX512F-NEXT:    vpsrlq $1, %ymm1, %ymm1
629 ; AVX512F-NEXT:    vpsrlq $32, %ymm1, %ymm2
630 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
631 ; AVX512F-NEXT:    vpsrlq $32, %ymm3, %ymm4
632 ; AVX512F-NEXT:    vpmuludq %ymm4, %ymm1, %ymm4
633 ; AVX512F-NEXT:    vpaddq %ymm2, %ymm4, %ymm2
634 ; AVX512F-NEXT:    vpsllq $32, %ymm2, %ymm2
635 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
636 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
637 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
638 ; AVX512F-NEXT:    retq
640 ; AVX512VL-LABEL: vec256_i64_signed_reg_reg:
641 ; AVX512VL:       # %bb.0:
642 ; AVX512VL-NEXT:    vpcmpgtq %ymm1, %ymm0, %k1
643 ; AVX512VL-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
644 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
645 ; AVX512VL-NEXT:    vmovdqa64 %ymm2, %ymm3 {%k1}
646 ; AVX512VL-NEXT:    vpminsq %ymm1, %ymm0, %ymm2
647 ; AVX512VL-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm1
648 ; AVX512VL-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
649 ; AVX512VL-NEXT:    vpsrlq $1, %ymm1, %ymm1
650 ; AVX512VL-NEXT:    vpsrlq $32, %ymm3, %ymm2
651 ; AVX512VL-NEXT:    vpmuludq %ymm2, %ymm1, %ymm2
652 ; AVX512VL-NEXT:    vpsrlq $32, %ymm1, %ymm4
653 ; AVX512VL-NEXT:    vpmuludq %ymm3, %ymm4, %ymm4
654 ; AVX512VL-NEXT:    vpaddq %ymm4, %ymm2, %ymm2
655 ; AVX512VL-NEXT:    vpsllq $32, %ymm2, %ymm2
656 ; AVX512VL-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
657 ; AVX512VL-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
658 ; AVX512VL-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
659 ; AVX512VL-NEXT:    retq
661 ; AVX512BW-FALLBACK-LABEL: vec256_i64_signed_reg_reg:
662 ; AVX512BW-FALLBACK:       # %bb.0:
663 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
664 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
665 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
666 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
667 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
668 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
669 ; AVX512BW-FALLBACK-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
670 ; AVX512BW-FALLBACK-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
671 ; AVX512BW-FALLBACK-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
672 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %ymm1, %ymm1
673 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm1, %ymm2
674 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
675 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm3, %ymm4
676 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm4, %ymm1, %ymm4
677 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm2, %ymm4, %ymm2
678 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %ymm2, %ymm2
679 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
680 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
681 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
682 ; AVX512BW-FALLBACK-NEXT:    retq
683   %t3 = icmp sgt <4 x i64> %a1, %a2 ; signed
684   %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>
685   %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a1
686   %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a2
687   %t7 = sub <4 x i64> %t6, %t5
688   %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>
689   %t9 = mul nsw <4 x i64> %t8, %t4 ; signed
690   %a10 = add nsw <4 x i64> %t9, %a1 ; signed
691   ret <4 x i64> %a10
694 define <4 x i64> @vec256_i64_unsigned_reg_reg(<4 x i64> %a1, <4 x i64> %a2) nounwind {
695 ; AVX1-FALLBACK-LABEL: vec256_i64_unsigned_reg_reg:
696 ; AVX1-FALLBACK:       # %bb.0:
697 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm3
698 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
699 ; AVX1-FALLBACK-NEXT:    vpxor %xmm4, %xmm3, %xmm5
700 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm2
701 ; AVX1-FALLBACK-NEXT:    vpxor %xmm4, %xmm2, %xmm6
702 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm8
703 ; AVX1-FALLBACK-NEXT:    vpxor %xmm4, %xmm1, %xmm7
704 ; AVX1-FALLBACK-NEXT:    vpxor %xmm4, %xmm0, %xmm4
705 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm7, %xmm4, %xmm9
706 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm5
707 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm4, %xmm7, %xmm4
708 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm4
709 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm9, %xmm0, %xmm1, %xmm1
710 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm4, %xmm1, %xmm1
711 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm5, %xmm2, %xmm3, %xmm4
712 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm8, %xmm2, %xmm3, %xmm3
713 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm4, %xmm3, %xmm3
714 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm3, %xmm3
715 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
716 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,1]
717 ; AVX1-FALLBACK-NEXT:    vpor %xmm4, %xmm9, %xmm5
718 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm5, %xmm6
719 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm6, %xmm1, %xmm6
720 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm7
721 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm7, %xmm7
722 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm7, %xmm6, %xmm6
723 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm6, %xmm6
724 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
725 ; AVX1-FALLBACK-NEXT:    vpor %xmm4, %xmm8, %xmm4
726 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm4, %xmm5
727 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm3, %xmm5
728 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm3, %xmm7
729 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
730 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
731 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm5, %xmm5
732 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm3, %xmm3
733 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm2, %xmm5, %xmm2
734 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
735 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm6, %xmm0
736 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
737 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
738 ; AVX1-FALLBACK-NEXT:    retq
740 ; AVX2-LABEL: vec256_i64_unsigned_reg_reg:
741 ; AVX2:       # %bb.0:
742 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
743 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm3
744 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
745 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm4
746 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [1,1,1,1]
747 ; AVX2-NEXT:    vpor %ymm5, %ymm4, %ymm5
748 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
749 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm2
750 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm1, %ymm1
751 ; AVX2-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
752 ; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm1
753 ; AVX2-NEXT:    vpsrlq $32, %ymm5, %ymm2
754 ; AVX2-NEXT:    vpmuludq %ymm2, %ymm1, %ymm2
755 ; AVX2-NEXT:    vpsrlq $32, %ymm1, %ymm3
756 ; AVX2-NEXT:    vpmuludq %ymm5, %ymm3, %ymm3
757 ; AVX2-NEXT:    vpaddq %ymm3, %ymm2, %ymm2
758 ; AVX2-NEXT:    vpsllq $32, %ymm2, %ymm2
759 ; AVX2-NEXT:    vpmuludq %ymm5, %ymm1, %ymm1
760 ; AVX2-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
761 ; AVX2-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
762 ; AVX2-NEXT:    retq
764 ; XOP-FALLBACK-LABEL: vec256_i64_unsigned_reg_reg:
765 ; XOP-FALLBACK:       # %bb.0:
766 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm2
767 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
768 ; XOP-FALLBACK-NEXT:    vpcomgtuq %xmm2, %xmm3, %xmm4
769 ; XOP-FALLBACK-NEXT:    vpcomgtuq %xmm1, %xmm0, %xmm5
770 ; XOP-FALLBACK-NEXT:    vpcomltuq %xmm2, %xmm3, %xmm6
771 ; XOP-FALLBACK-NEXT:    vpcomltuq %xmm1, %xmm0, %xmm7
772 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm7, %xmm0, %xmm1, %xmm7
773 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm1
774 ; XOP-FALLBACK-NEXT:    vpsubq %xmm7, %xmm1, %xmm1
775 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm6, %xmm3, %xmm2, %xmm6
776 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm2
777 ; XOP-FALLBACK-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
778 ; XOP-FALLBACK-NEXT:    vpsrlq $1, %xmm2, %xmm2
779 ; XOP-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
780 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1]
781 ; XOP-FALLBACK-NEXT:    vpor %xmm8, %xmm5, %xmm5
782 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm5, %xmm7
783 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm7, %xmm1, %xmm7
784 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm6
785 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm6, %xmm6
786 ; XOP-FALLBACK-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
787 ; XOP-FALLBACK-NEXT:    vpsllq $32, %xmm6, %xmm6
788 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
789 ; XOP-FALLBACK-NEXT:    vpor %xmm8, %xmm4, %xmm4
790 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm4, %xmm5
791 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm2, %xmm5
792 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm2, %xmm7
793 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
794 ; XOP-FALLBACK-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
795 ; XOP-FALLBACK-NEXT:    vpsllq $32, %xmm5, %xmm5
796 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
797 ; XOP-FALLBACK-NEXT:    vpaddq %xmm3, %xmm5, %xmm3
798 ; XOP-FALLBACK-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
799 ; XOP-FALLBACK-NEXT:    vpaddq %xmm0, %xmm6, %xmm0
800 ; XOP-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
801 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
802 ; XOP-FALLBACK-NEXT:    retq
804 ; XOPAVX1-LABEL: vec256_i64_unsigned_reg_reg:
805 ; XOPAVX1:       # %bb.0:
806 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
807 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
808 ; XOPAVX1-NEXT:    vpcomgtuq %xmm2, %xmm3, %xmm4
809 ; XOPAVX1-NEXT:    vpcomgtuq %xmm1, %xmm0, %xmm5
810 ; XOPAVX1-NEXT:    vpcomltuq %xmm2, %xmm3, %xmm6
811 ; XOPAVX1-NEXT:    vpcomltuq %xmm1, %xmm0, %xmm7
812 ; XOPAVX1-NEXT:    vblendvpd %xmm7, %xmm0, %xmm1, %xmm7
813 ; XOPAVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm1
814 ; XOPAVX1-NEXT:    vpsubq %xmm7, %xmm1, %xmm1
815 ; XOPAVX1-NEXT:    vblendvpd %xmm6, %xmm3, %xmm2, %xmm6
816 ; XOPAVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm2
817 ; XOPAVX1-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
818 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm2, %xmm2
819 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
820 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1]
821 ; XOPAVX1-NEXT:    vpor %xmm8, %xmm5, %xmm5
822 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm5, %xmm7
823 ; XOPAVX1-NEXT:    vpmuludq %xmm7, %xmm1, %xmm7
824 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm1, %xmm6
825 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm6, %xmm6
826 ; XOPAVX1-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
827 ; XOPAVX1-NEXT:    vpsllq $32, %xmm6, %xmm6
828 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
829 ; XOPAVX1-NEXT:    vpor %xmm8, %xmm4, %xmm4
830 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm4, %xmm5
831 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm2, %xmm5
832 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm2, %xmm7
833 ; XOPAVX1-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
834 ; XOPAVX1-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
835 ; XOPAVX1-NEXT:    vpsllq $32, %xmm5, %xmm5
836 ; XOPAVX1-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
837 ; XOPAVX1-NEXT:    vpaddq %xmm3, %xmm5, %xmm3
838 ; XOPAVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
839 ; XOPAVX1-NEXT:    vpaddq %xmm0, %xmm6, %xmm0
840 ; XOPAVX1-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
841 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
842 ; XOPAVX1-NEXT:    retq
844 ; AVX512F-LABEL: vec256_i64_unsigned_reg_reg:
845 ; AVX512F:       # %bb.0:
846 ; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
847 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
848 ; AVX512F-NEXT:    vpcmpnleuq %zmm1, %zmm0, %k1
849 ; AVX512F-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
850 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
851 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
852 ; AVX512F-NEXT:    vpminuq %zmm1, %zmm0, %zmm2
853 ; AVX512F-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm1
854 ; AVX512F-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
855 ; AVX512F-NEXT:    vpsrlq $1, %ymm1, %ymm1
856 ; AVX512F-NEXT:    vpsrlq $32, %ymm1, %ymm2
857 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
858 ; AVX512F-NEXT:    vpsrlq $32, %ymm3, %ymm4
859 ; AVX512F-NEXT:    vpmuludq %ymm4, %ymm1, %ymm4
860 ; AVX512F-NEXT:    vpaddq %ymm2, %ymm4, %ymm2
861 ; AVX512F-NEXT:    vpsllq $32, %ymm2, %ymm2
862 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
863 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
864 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
865 ; AVX512F-NEXT:    retq
867 ; AVX512VL-LABEL: vec256_i64_unsigned_reg_reg:
868 ; AVX512VL:       # %bb.0:
869 ; AVX512VL-NEXT:    vpcmpnleuq %ymm1, %ymm0, %k1
870 ; AVX512VL-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
871 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
872 ; AVX512VL-NEXT:    vmovdqa64 %ymm2, %ymm3 {%k1}
873 ; AVX512VL-NEXT:    vpminuq %ymm1, %ymm0, %ymm2
874 ; AVX512VL-NEXT:    vpmaxuq %ymm1, %ymm0, %ymm1
875 ; AVX512VL-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
876 ; AVX512VL-NEXT:    vpsrlq $1, %ymm1, %ymm1
877 ; AVX512VL-NEXT:    vpsrlq $32, %ymm3, %ymm2
878 ; AVX512VL-NEXT:    vpmuludq %ymm2, %ymm1, %ymm2
879 ; AVX512VL-NEXT:    vpsrlq $32, %ymm1, %ymm4
880 ; AVX512VL-NEXT:    vpmuludq %ymm3, %ymm4, %ymm4
881 ; AVX512VL-NEXT:    vpaddq %ymm4, %ymm2, %ymm2
882 ; AVX512VL-NEXT:    vpsllq $32, %ymm2, %ymm2
883 ; AVX512VL-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
884 ; AVX512VL-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
885 ; AVX512VL-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
886 ; AVX512VL-NEXT:    retq
888 ; AVX512BW-FALLBACK-LABEL: vec256_i64_unsigned_reg_reg:
889 ; AVX512BW-FALLBACK:       # %bb.0:
890 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
891 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
892 ; AVX512BW-FALLBACK-NEXT:    vpcmpnleuq %zmm1, %zmm0, %k1
893 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
894 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
895 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
896 ; AVX512BW-FALLBACK-NEXT:    vpminuq %zmm1, %zmm0, %zmm2
897 ; AVX512BW-FALLBACK-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm1
898 ; AVX512BW-FALLBACK-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
899 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %ymm1, %ymm1
900 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm1, %ymm2
901 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
902 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm3, %ymm4
903 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm4, %ymm1, %ymm4
904 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm2, %ymm4, %ymm2
905 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %ymm2, %ymm2
906 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
907 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
908 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
909 ; AVX512BW-FALLBACK-NEXT:    retq
910   %t3 = icmp ugt <4 x i64> %a1, %a2
911   %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>
912   %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a1
913   %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a2
914   %t7 = sub <4 x i64> %t6, %t5
915   %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>
916   %t9 = mul <4 x i64> %t8, %t4
917   %a10 = add <4 x i64> %t9, %a1
918   ret <4 x i64> %a10
921 ; Values are loaded. Only check signed case.
923 define <4 x i64> @vec256_i64_signed_mem_reg(<4 x i64>* %a1_addr, <4 x i64> %a2) nounwind {
924 ; AVX1-FALLBACK-LABEL: vec256_i64_signed_mem_reg:
925 ; AVX1-FALLBACK:       # %bb.0:
926 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm2
927 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
928 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm3
929 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm4
930 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm5
931 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm6
932 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm7
933 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm7, %xmm1, %xmm0, %xmm7
934 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm5, %xmm1, %xmm0, %xmm0
935 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm7, %xmm0, %xmm0
936 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm6, %xmm3, %xmm2, %xmm6
937 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm2
938 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
939 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm2, %xmm2
940 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm0, %xmm0
941 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1]
942 ; AVX1-FALLBACK-NEXT:    vpor %xmm8, %xmm5, %xmm5
943 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm5, %xmm7
944 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm7, %xmm0, %xmm7
945 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm0, %xmm6
946 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm6, %xmm6
947 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
948 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm6, %xmm6
949 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm0, %xmm0
950 ; AVX1-FALLBACK-NEXT:    vpor %xmm8, %xmm4, %xmm4
951 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm4, %xmm5
952 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm2, %xmm5
953 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm2, %xmm7
954 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
955 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
956 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm5, %xmm5
957 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
958 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm3, %xmm5, %xmm3
959 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
960 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm1, %xmm6, %xmm1
961 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
962 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
963 ; AVX1-FALLBACK-NEXT:    retq
965 ; AVX2-LABEL: vec256_i64_signed_mem_reg:
966 ; AVX2:       # %bb.0:
967 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
968 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
969 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
970 ; AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm3
971 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm4
972 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm0, %ymm4
973 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
974 ; AVX2-NEXT:    vpsubq %ymm4, %ymm0, %ymm0
975 ; AVX2-NEXT:    vpsrlq $1, %ymm0, %ymm0
976 ; AVX2-NEXT:    vpsrlq $32, %ymm3, %ymm2
977 ; AVX2-NEXT:    vpmuludq %ymm2, %ymm0, %ymm2
978 ; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm4
979 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm4, %ymm4
980 ; AVX2-NEXT:    vpaddq %ymm4, %ymm2, %ymm2
981 ; AVX2-NEXT:    vpsllq $32, %ymm2, %ymm2
982 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm0, %ymm0
983 ; AVX2-NEXT:    vpaddq %ymm1, %ymm2, %ymm1
984 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
985 ; AVX2-NEXT:    retq
987 ; XOP-FALLBACK-LABEL: vec256_i64_signed_mem_reg:
988 ; XOP-FALLBACK:       # %bb.0:
989 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm2
990 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
991 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm3
992 ; XOP-FALLBACK-NEXT:    vpcomgtq %xmm2, %xmm3, %xmm4
993 ; XOP-FALLBACK-NEXT:    vpcomgtq %xmm0, %xmm1, %xmm5
994 ; XOP-FALLBACK-NEXT:    vpcomltq %xmm2, %xmm3, %xmm6
995 ; XOP-FALLBACK-NEXT:    vpcomltq %xmm0, %xmm1, %xmm7
996 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm7, %xmm1, %xmm0, %xmm7
997 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm5, %xmm1, %xmm0, %xmm0
998 ; XOP-FALLBACK-NEXT:    vpsubq %xmm7, %xmm0, %xmm0
999 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm6, %xmm3, %xmm2, %xmm6
1000 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm2
1001 ; XOP-FALLBACK-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
1002 ; XOP-FALLBACK-NEXT:    vpsrlq $1, %xmm2, %xmm2
1003 ; XOP-FALLBACK-NEXT:    vpsrlq $1, %xmm0, %xmm0
1004 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1]
1005 ; XOP-FALLBACK-NEXT:    vpor %xmm8, %xmm5, %xmm5
1006 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm5, %xmm7
1007 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm7, %xmm0, %xmm7
1008 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm0, %xmm6
1009 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm6, %xmm6
1010 ; XOP-FALLBACK-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
1011 ; XOP-FALLBACK-NEXT:    vpsllq $32, %xmm6, %xmm6
1012 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm0, %xmm0
1013 ; XOP-FALLBACK-NEXT:    vpor %xmm8, %xmm4, %xmm4
1014 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm4, %xmm5
1015 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm2, %xmm5
1016 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm2, %xmm7
1017 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
1018 ; XOP-FALLBACK-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
1019 ; XOP-FALLBACK-NEXT:    vpsllq $32, %xmm5, %xmm5
1020 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
1021 ; XOP-FALLBACK-NEXT:    vpaddq %xmm3, %xmm5, %xmm3
1022 ; XOP-FALLBACK-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
1023 ; XOP-FALLBACK-NEXT:    vpaddq %xmm1, %xmm6, %xmm1
1024 ; XOP-FALLBACK-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1025 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1026 ; XOP-FALLBACK-NEXT:    retq
1028 ; XOPAVX1-LABEL: vec256_i64_signed_mem_reg:
1029 ; XOPAVX1:       # %bb.0:
1030 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1031 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm1
1032 ; XOPAVX1-NEXT:    vmovdqa 16(%rdi), %xmm3
1033 ; XOPAVX1-NEXT:    vpcomgtq %xmm2, %xmm3, %xmm4
1034 ; XOPAVX1-NEXT:    vpcomgtq %xmm0, %xmm1, %xmm5
1035 ; XOPAVX1-NEXT:    vpcomltq %xmm2, %xmm3, %xmm6
1036 ; XOPAVX1-NEXT:    vpcomltq %xmm0, %xmm1, %xmm7
1037 ; XOPAVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm0, %xmm7
1038 ; XOPAVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm0, %xmm0
1039 ; XOPAVX1-NEXT:    vpsubq %xmm7, %xmm0, %xmm0
1040 ; XOPAVX1-NEXT:    vblendvpd %xmm6, %xmm3, %xmm2, %xmm6
1041 ; XOPAVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm2
1042 ; XOPAVX1-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
1043 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm2, %xmm2
1044 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
1045 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1]
1046 ; XOPAVX1-NEXT:    vpor %xmm8, %xmm5, %xmm5
1047 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm5, %xmm7
1048 ; XOPAVX1-NEXT:    vpmuludq %xmm7, %xmm0, %xmm7
1049 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm0, %xmm6
1050 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm6, %xmm6
1051 ; XOPAVX1-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
1052 ; XOPAVX1-NEXT:    vpsllq $32, %xmm6, %xmm6
1053 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm0, %xmm0
1054 ; XOPAVX1-NEXT:    vpor %xmm8, %xmm4, %xmm4
1055 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm4, %xmm5
1056 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm2, %xmm5
1057 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm2, %xmm7
1058 ; XOPAVX1-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
1059 ; XOPAVX1-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
1060 ; XOPAVX1-NEXT:    vpsllq $32, %xmm5, %xmm5
1061 ; XOPAVX1-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
1062 ; XOPAVX1-NEXT:    vpaddq %xmm3, %xmm5, %xmm3
1063 ; XOPAVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
1064 ; XOPAVX1-NEXT:    vpaddq %xmm1, %xmm6, %xmm1
1065 ; XOPAVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1066 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1067 ; XOPAVX1-NEXT:    retq
1069 ; AVX512F-LABEL: vec256_i64_signed_mem_reg:
1070 ; AVX512F:       # %bb.0:
1071 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1072 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm1
1073 ; AVX512F-NEXT:    vpcmpgtq %zmm0, %zmm1, %k1
1074 ; AVX512F-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1075 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1076 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1077 ; AVX512F-NEXT:    vpminsq %zmm0, %zmm1, %zmm2
1078 ; AVX512F-NEXT:    vpmaxsq %zmm0, %zmm1, %zmm0
1079 ; AVX512F-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
1080 ; AVX512F-NEXT:    vpsrlq $1, %ymm0, %ymm0
1081 ; AVX512F-NEXT:    vpsrlq $32, %ymm0, %ymm2
1082 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
1083 ; AVX512F-NEXT:    vpsrlq $32, %ymm3, %ymm4
1084 ; AVX512F-NEXT:    vpmuludq %ymm4, %ymm0, %ymm4
1085 ; AVX512F-NEXT:    vpaddq %ymm2, %ymm4, %ymm2
1086 ; AVX512F-NEXT:    vpsllq $32, %ymm2, %ymm2
1087 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm0, %ymm0
1088 ; AVX512F-NEXT:    vpaddq %ymm1, %ymm2, %ymm1
1089 ; AVX512F-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1090 ; AVX512F-NEXT:    retq
1092 ; AVX512VL-LABEL: vec256_i64_signed_mem_reg:
1093 ; AVX512VL:       # %bb.0:
1094 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm1
1095 ; AVX512VL-NEXT:    vpcmpgtq %ymm0, %ymm1, %k1
1096 ; AVX512VL-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1097 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1098 ; AVX512VL-NEXT:    vmovdqa64 %ymm2, %ymm3 {%k1}
1099 ; AVX512VL-NEXT:    vpminsq %ymm0, %ymm1, %ymm2
1100 ; AVX512VL-NEXT:    vpmaxsq %ymm0, %ymm1, %ymm0
1101 ; AVX512VL-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
1102 ; AVX512VL-NEXT:    vpsrlq $1, %ymm0, %ymm0
1103 ; AVX512VL-NEXT:    vpsrlq $32, %ymm3, %ymm2
1104 ; AVX512VL-NEXT:    vpmuludq %ymm2, %ymm0, %ymm2
1105 ; AVX512VL-NEXT:    vpsrlq $32, %ymm0, %ymm4
1106 ; AVX512VL-NEXT:    vpmuludq %ymm3, %ymm4, %ymm4
1107 ; AVX512VL-NEXT:    vpaddq %ymm4, %ymm2, %ymm2
1108 ; AVX512VL-NEXT:    vpsllq $32, %ymm2, %ymm2
1109 ; AVX512VL-NEXT:    vpmuludq %ymm3, %ymm0, %ymm0
1110 ; AVX512VL-NEXT:    vpaddq %ymm1, %ymm2, %ymm1
1111 ; AVX512VL-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1112 ; AVX512VL-NEXT:    retq
1114 ; AVX512BW-FALLBACK-LABEL: vec256_i64_signed_mem_reg:
1115 ; AVX512BW-FALLBACK:       # %bb.0:
1116 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1117 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
1118 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtq %zmm0, %zmm1, %k1
1119 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1120 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1121 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1122 ; AVX512BW-FALLBACK-NEXT:    vpminsq %zmm0, %zmm1, %zmm2
1123 ; AVX512BW-FALLBACK-NEXT:    vpmaxsq %zmm0, %zmm1, %zmm0
1124 ; AVX512BW-FALLBACK-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
1125 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %ymm0, %ymm0
1126 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm0, %ymm2
1127 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
1128 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm3, %ymm4
1129 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm4, %ymm0, %ymm4
1130 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm2, %ymm4, %ymm2
1131 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %ymm2, %ymm2
1132 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm0, %ymm0
1133 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm1, %ymm2, %ymm1
1134 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
1135 ; AVX512BW-FALLBACK-NEXT:    retq
1136   %a1 = load <4 x i64>, <4 x i64>* %a1_addr
1137   %t3 = icmp sgt <4 x i64> %a1, %a2 ; signed
1138   %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>
1139   %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a1
1140   %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a2
1141   %t7 = sub <4 x i64> %t6, %t5
1142   %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>
1143   %t9 = mul nsw <4 x i64> %t8, %t4 ; signed
1144   %a10 = add nsw <4 x i64> %t9, %a1 ; signed
1145   ret <4 x i64> %a10
1148 define <4 x i64> @vec256_i64_signed_reg_mem(<4 x i64> %a1, <4 x i64>* %a2_addr) nounwind {
1149 ; AVX1-FALLBACK-LABEL: vec256_i64_signed_reg_mem:
1150 ; AVX1-FALLBACK:       # %bb.0:
1151 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
1152 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm2
1153 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
1154 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm4
1155 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm5
1156 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm6
1157 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm7
1158 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm7, %xmm0, %xmm1, %xmm7
1159 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm1
1160 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm7, %xmm1, %xmm1
1161 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm6, %xmm3, %xmm2, %xmm6
1162 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm2
1163 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
1164 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm2, %xmm2
1165 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
1166 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1]
1167 ; AVX1-FALLBACK-NEXT:    vpor %xmm8, %xmm5, %xmm5
1168 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm5, %xmm7
1169 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm7, %xmm1, %xmm7
1170 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm6
1171 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm6, %xmm6
1172 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
1173 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm6, %xmm6
1174 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
1175 ; AVX1-FALLBACK-NEXT:    vpor %xmm8, %xmm4, %xmm4
1176 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm4, %xmm5
1177 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm2, %xmm5
1178 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm2, %xmm7
1179 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
1180 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
1181 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm5, %xmm5
1182 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
1183 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm3, %xmm5, %xmm3
1184 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
1185 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm6, %xmm0
1186 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1187 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1188 ; AVX1-FALLBACK-NEXT:    retq
1190 ; AVX2-LABEL: vec256_i64_signed_reg_mem:
1191 ; AVX2:       # %bb.0:
1192 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
1193 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
1194 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1195 ; AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm3
1196 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm4
1197 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm1, %ymm4
1198 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm1
1199 ; AVX2-NEXT:    vpsubq %ymm4, %ymm1, %ymm1
1200 ; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm1
1201 ; AVX2-NEXT:    vpsrlq $32, %ymm3, %ymm2
1202 ; AVX2-NEXT:    vpmuludq %ymm2, %ymm1, %ymm2
1203 ; AVX2-NEXT:    vpsrlq $32, %ymm1, %ymm4
1204 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm4, %ymm4
1205 ; AVX2-NEXT:    vpaddq %ymm4, %ymm2, %ymm2
1206 ; AVX2-NEXT:    vpsllq $32, %ymm2, %ymm2
1207 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
1208 ; AVX2-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
1209 ; AVX2-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
1210 ; AVX2-NEXT:    retq
1212 ; XOP-FALLBACK-LABEL: vec256_i64_signed_reg_mem:
1213 ; XOP-FALLBACK:       # %bb.0:
1214 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
1215 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm2
1216 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
1217 ; XOP-FALLBACK-NEXT:    vpcomgtq %xmm2, %xmm3, %xmm4
1218 ; XOP-FALLBACK-NEXT:    vpcomgtq %xmm1, %xmm0, %xmm5
1219 ; XOP-FALLBACK-NEXT:    vpcomltq %xmm2, %xmm3, %xmm6
1220 ; XOP-FALLBACK-NEXT:    vpcomltq %xmm1, %xmm0, %xmm7
1221 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm7, %xmm0, %xmm1, %xmm7
1222 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm1
1223 ; XOP-FALLBACK-NEXT:    vpsubq %xmm7, %xmm1, %xmm1
1224 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm6, %xmm3, %xmm2, %xmm6
1225 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm2
1226 ; XOP-FALLBACK-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
1227 ; XOP-FALLBACK-NEXT:    vpsrlq $1, %xmm2, %xmm2
1228 ; XOP-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
1229 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1]
1230 ; XOP-FALLBACK-NEXT:    vpor %xmm8, %xmm5, %xmm5
1231 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm5, %xmm7
1232 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm7, %xmm1, %xmm7
1233 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm6
1234 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm6, %xmm6
1235 ; XOP-FALLBACK-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
1236 ; XOP-FALLBACK-NEXT:    vpsllq $32, %xmm6, %xmm6
1237 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
1238 ; XOP-FALLBACK-NEXT:    vpor %xmm8, %xmm4, %xmm4
1239 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm4, %xmm5
1240 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm2, %xmm5
1241 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm2, %xmm7
1242 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
1243 ; XOP-FALLBACK-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
1244 ; XOP-FALLBACK-NEXT:    vpsllq $32, %xmm5, %xmm5
1245 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
1246 ; XOP-FALLBACK-NEXT:    vpaddq %xmm3, %xmm5, %xmm3
1247 ; XOP-FALLBACK-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
1248 ; XOP-FALLBACK-NEXT:    vpaddq %xmm0, %xmm6, %xmm0
1249 ; XOP-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1250 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1251 ; XOP-FALLBACK-NEXT:    retq
1253 ; XOPAVX1-LABEL: vec256_i64_signed_reg_mem:
1254 ; XOPAVX1:       # %bb.0:
1255 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm1
1256 ; XOPAVX1-NEXT:    vmovdqa 16(%rdi), %xmm2
1257 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1258 ; XOPAVX1-NEXT:    vpcomgtq %xmm2, %xmm3, %xmm4
1259 ; XOPAVX1-NEXT:    vpcomgtq %xmm1, %xmm0, %xmm5
1260 ; XOPAVX1-NEXT:    vpcomltq %xmm2, %xmm3, %xmm6
1261 ; XOPAVX1-NEXT:    vpcomltq %xmm1, %xmm0, %xmm7
1262 ; XOPAVX1-NEXT:    vblendvpd %xmm7, %xmm0, %xmm1, %xmm7
1263 ; XOPAVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm1
1264 ; XOPAVX1-NEXT:    vpsubq %xmm7, %xmm1, %xmm1
1265 ; XOPAVX1-NEXT:    vblendvpd %xmm6, %xmm3, %xmm2, %xmm6
1266 ; XOPAVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm2
1267 ; XOPAVX1-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
1268 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm2, %xmm2
1269 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
1270 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1]
1271 ; XOPAVX1-NEXT:    vpor %xmm8, %xmm5, %xmm5
1272 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm5, %xmm7
1273 ; XOPAVX1-NEXT:    vpmuludq %xmm7, %xmm1, %xmm7
1274 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm1, %xmm6
1275 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm6, %xmm6
1276 ; XOPAVX1-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
1277 ; XOPAVX1-NEXT:    vpsllq $32, %xmm6, %xmm6
1278 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
1279 ; XOPAVX1-NEXT:    vpor %xmm8, %xmm4, %xmm4
1280 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm4, %xmm5
1281 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm2, %xmm5
1282 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm2, %xmm7
1283 ; XOPAVX1-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
1284 ; XOPAVX1-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
1285 ; XOPAVX1-NEXT:    vpsllq $32, %xmm5, %xmm5
1286 ; XOPAVX1-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
1287 ; XOPAVX1-NEXT:    vpaddq %xmm3, %xmm5, %xmm3
1288 ; XOPAVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
1289 ; XOPAVX1-NEXT:    vpaddq %xmm0, %xmm6, %xmm0
1290 ; XOPAVX1-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1291 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1292 ; XOPAVX1-NEXT:    retq
1294 ; AVX512F-LABEL: vec256_i64_signed_reg_mem:
1295 ; AVX512F:       # %bb.0:
1296 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1297 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm1
1298 ; AVX512F-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1299 ; AVX512F-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1300 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1301 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1302 ; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
1303 ; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
1304 ; AVX512F-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
1305 ; AVX512F-NEXT:    vpsrlq $1, %ymm1, %ymm1
1306 ; AVX512F-NEXT:    vpsrlq $32, %ymm1, %ymm2
1307 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
1308 ; AVX512F-NEXT:    vpsrlq $32, %ymm3, %ymm4
1309 ; AVX512F-NEXT:    vpmuludq %ymm4, %ymm1, %ymm4
1310 ; AVX512F-NEXT:    vpaddq %ymm2, %ymm4, %ymm2
1311 ; AVX512F-NEXT:    vpsllq $32, %ymm2, %ymm2
1312 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
1313 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
1314 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
1315 ; AVX512F-NEXT:    retq
1317 ; AVX512VL-LABEL: vec256_i64_signed_reg_mem:
1318 ; AVX512VL:       # %bb.0:
1319 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm1
1320 ; AVX512VL-NEXT:    vpcmpgtq %ymm1, %ymm0, %k1
1321 ; AVX512VL-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1322 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1323 ; AVX512VL-NEXT:    vmovdqa64 %ymm2, %ymm3 {%k1}
1324 ; AVX512VL-NEXT:    vpminsq %ymm1, %ymm0, %ymm2
1325 ; AVX512VL-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm1
1326 ; AVX512VL-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
1327 ; AVX512VL-NEXT:    vpsrlq $1, %ymm1, %ymm1
1328 ; AVX512VL-NEXT:    vpsrlq $32, %ymm3, %ymm2
1329 ; AVX512VL-NEXT:    vpmuludq %ymm2, %ymm1, %ymm2
1330 ; AVX512VL-NEXT:    vpsrlq $32, %ymm1, %ymm4
1331 ; AVX512VL-NEXT:    vpmuludq %ymm3, %ymm4, %ymm4
1332 ; AVX512VL-NEXT:    vpaddq %ymm4, %ymm2, %ymm2
1333 ; AVX512VL-NEXT:    vpsllq $32, %ymm2, %ymm2
1334 ; AVX512VL-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
1335 ; AVX512VL-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
1336 ; AVX512VL-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
1337 ; AVX512VL-NEXT:    retq
1339 ; AVX512BW-FALLBACK-LABEL: vec256_i64_signed_reg_mem:
1340 ; AVX512BW-FALLBACK:       # %bb.0:
1341 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1342 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
1343 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1344 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1345 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1346 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1347 ; AVX512BW-FALLBACK-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
1348 ; AVX512BW-FALLBACK-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
1349 ; AVX512BW-FALLBACK-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
1350 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %ymm1, %ymm1
1351 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm1, %ymm2
1352 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
1353 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm3, %ymm4
1354 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm4, %ymm1, %ymm4
1355 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm2, %ymm4, %ymm2
1356 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %ymm2, %ymm2
1357 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
1358 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
1359 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
1360 ; AVX512BW-FALLBACK-NEXT:    retq
1361   %a2 = load <4 x i64>, <4 x i64>* %a2_addr
1362   %t3 = icmp sgt <4 x i64> %a1, %a2 ; signed
1363   %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>
1364   %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a1
1365   %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a2
1366   %t7 = sub <4 x i64> %t6, %t5
1367   %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>
1368   %t9 = mul nsw <4 x i64> %t8, %t4 ; signed
1369   %a10 = add nsw <4 x i64> %t9, %a1 ; signed
1370   ret <4 x i64> %a10
1373 define <4 x i64> @vec256_i64_signed_mem_mem(<4 x i64>* %a1_addr, <4 x i64>* %a2_addr) nounwind {
1374 ; AVX1-FALLBACK-LABEL: vec256_i64_signed_mem_mem:
1375 ; AVX1-FALLBACK:       # %bb.0:
1376 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
1377 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rsi), %xmm2
1378 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
1379 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm3
1380 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm4
1381 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm5
1382 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm6
1383 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm7
1384 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm7, %xmm0, %xmm1, %xmm7
1385 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm1
1386 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm7, %xmm1, %xmm1
1387 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm6, %xmm3, %xmm2, %xmm6
1388 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm2
1389 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
1390 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm2, %xmm2
1391 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
1392 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1]
1393 ; AVX1-FALLBACK-NEXT:    vpor %xmm8, %xmm5, %xmm5
1394 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm5, %xmm7
1395 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm7, %xmm1, %xmm7
1396 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm6
1397 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm6, %xmm6
1398 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
1399 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm6, %xmm6
1400 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
1401 ; AVX1-FALLBACK-NEXT:    vpor %xmm8, %xmm4, %xmm4
1402 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm4, %xmm5
1403 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm2, %xmm5
1404 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm2, %xmm7
1405 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
1406 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
1407 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm5, %xmm5
1408 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
1409 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm3, %xmm5, %xmm3
1410 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
1411 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm6, %xmm0
1412 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1413 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1414 ; AVX1-FALLBACK-NEXT:    retq
1416 ; AVX2-LABEL: vec256_i64_signed_mem_mem:
1417 ; AVX2:       # %bb.0:
1418 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
1419 ; AVX2-NEXT:    vmovdqa (%rsi), %ymm1
1420 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
1421 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1422 ; AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm3
1423 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm4
1424 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm1, %ymm4
1425 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm1
1426 ; AVX2-NEXT:    vpsubq %ymm4, %ymm1, %ymm1
1427 ; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm1
1428 ; AVX2-NEXT:    vpsrlq $32, %ymm3, %ymm2
1429 ; AVX2-NEXT:    vpmuludq %ymm2, %ymm1, %ymm2
1430 ; AVX2-NEXT:    vpsrlq $32, %ymm1, %ymm4
1431 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm4, %ymm4
1432 ; AVX2-NEXT:    vpaddq %ymm4, %ymm2, %ymm2
1433 ; AVX2-NEXT:    vpsllq $32, %ymm2, %ymm2
1434 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
1435 ; AVX2-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
1436 ; AVX2-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
1437 ; AVX2-NEXT:    retq
1439 ; XOP-FALLBACK-LABEL: vec256_i64_signed_mem_mem:
1440 ; XOP-FALLBACK:       # %bb.0:
1441 ; XOP-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
1442 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rsi), %xmm2
1443 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
1444 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm3
1445 ; XOP-FALLBACK-NEXT:    vpcomgtq %xmm2, %xmm3, %xmm4
1446 ; XOP-FALLBACK-NEXT:    vpcomgtq %xmm1, %xmm0, %xmm5
1447 ; XOP-FALLBACK-NEXT:    vpcomltq %xmm2, %xmm3, %xmm6
1448 ; XOP-FALLBACK-NEXT:    vpcomltq %xmm1, %xmm0, %xmm7
1449 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm7, %xmm0, %xmm1, %xmm7
1450 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm1
1451 ; XOP-FALLBACK-NEXT:    vpsubq %xmm7, %xmm1, %xmm1
1452 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm6, %xmm3, %xmm2, %xmm6
1453 ; XOP-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm2
1454 ; XOP-FALLBACK-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
1455 ; XOP-FALLBACK-NEXT:    vpsrlq $1, %xmm2, %xmm2
1456 ; XOP-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
1457 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1]
1458 ; XOP-FALLBACK-NEXT:    vpor %xmm8, %xmm5, %xmm5
1459 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm5, %xmm7
1460 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm7, %xmm1, %xmm7
1461 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm6
1462 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm6, %xmm6
1463 ; XOP-FALLBACK-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
1464 ; XOP-FALLBACK-NEXT:    vpsllq $32, %xmm6, %xmm6
1465 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
1466 ; XOP-FALLBACK-NEXT:    vpor %xmm8, %xmm4, %xmm4
1467 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm4, %xmm5
1468 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm2, %xmm5
1469 ; XOP-FALLBACK-NEXT:    vpsrlq $32, %xmm2, %xmm7
1470 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
1471 ; XOP-FALLBACK-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
1472 ; XOP-FALLBACK-NEXT:    vpsllq $32, %xmm5, %xmm5
1473 ; XOP-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
1474 ; XOP-FALLBACK-NEXT:    vpaddq %xmm3, %xmm5, %xmm3
1475 ; XOP-FALLBACK-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
1476 ; XOP-FALLBACK-NEXT:    vpaddq %xmm0, %xmm6, %xmm0
1477 ; XOP-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1478 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1479 ; XOP-FALLBACK-NEXT:    retq
1481 ; XOPAVX1-LABEL: vec256_i64_signed_mem_mem:
1482 ; XOPAVX1:       # %bb.0:
1483 ; XOPAVX1-NEXT:    vmovdqa (%rsi), %xmm1
1484 ; XOPAVX1-NEXT:    vmovdqa 16(%rsi), %xmm2
1485 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm0
1486 ; XOPAVX1-NEXT:    vmovdqa 16(%rdi), %xmm3
1487 ; XOPAVX1-NEXT:    vpcomgtq %xmm2, %xmm3, %xmm4
1488 ; XOPAVX1-NEXT:    vpcomgtq %xmm1, %xmm0, %xmm5
1489 ; XOPAVX1-NEXT:    vpcomltq %xmm2, %xmm3, %xmm6
1490 ; XOPAVX1-NEXT:    vpcomltq %xmm1, %xmm0, %xmm7
1491 ; XOPAVX1-NEXT:    vblendvpd %xmm7, %xmm0, %xmm1, %xmm7
1492 ; XOPAVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm1
1493 ; XOPAVX1-NEXT:    vpsubq %xmm7, %xmm1, %xmm1
1494 ; XOPAVX1-NEXT:    vblendvpd %xmm6, %xmm3, %xmm2, %xmm6
1495 ; XOPAVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm2
1496 ; XOPAVX1-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
1497 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm2, %xmm2
1498 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
1499 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1]
1500 ; XOPAVX1-NEXT:    vpor %xmm8, %xmm5, %xmm5
1501 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm5, %xmm7
1502 ; XOPAVX1-NEXT:    vpmuludq %xmm7, %xmm1, %xmm7
1503 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm1, %xmm6
1504 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm6, %xmm6
1505 ; XOPAVX1-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
1506 ; XOPAVX1-NEXT:    vpsllq $32, %xmm6, %xmm6
1507 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
1508 ; XOPAVX1-NEXT:    vpor %xmm8, %xmm4, %xmm4
1509 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm4, %xmm5
1510 ; XOPAVX1-NEXT:    vpmuludq %xmm5, %xmm2, %xmm5
1511 ; XOPAVX1-NEXT:    vpsrlq $32, %xmm2, %xmm7
1512 ; XOPAVX1-NEXT:    vpmuludq %xmm4, %xmm7, %xmm7
1513 ; XOPAVX1-NEXT:    vpaddq %xmm7, %xmm5, %xmm5
1514 ; XOPAVX1-NEXT:    vpsllq $32, %xmm5, %xmm5
1515 ; XOPAVX1-NEXT:    vpmuludq %xmm4, %xmm2, %xmm2
1516 ; XOPAVX1-NEXT:    vpaddq %xmm3, %xmm5, %xmm3
1517 ; XOPAVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
1518 ; XOPAVX1-NEXT:    vpaddq %xmm0, %xmm6, %xmm0
1519 ; XOPAVX1-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1520 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1521 ; XOPAVX1-NEXT:    retq
1523 ; AVX512F-LABEL: vec256_i64_signed_mem_mem:
1524 ; AVX512F:       # %bb.0:
1525 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
1526 ; AVX512F-NEXT:    vmovdqa (%rsi), %ymm1
1527 ; AVX512F-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1528 ; AVX512F-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1529 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1530 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1531 ; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
1532 ; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
1533 ; AVX512F-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
1534 ; AVX512F-NEXT:    vpsrlq $1, %ymm1, %ymm1
1535 ; AVX512F-NEXT:    vpsrlq $32, %ymm1, %ymm2
1536 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
1537 ; AVX512F-NEXT:    vpsrlq $32, %ymm3, %ymm4
1538 ; AVX512F-NEXT:    vpmuludq %ymm4, %ymm1, %ymm4
1539 ; AVX512F-NEXT:    vpaddq %ymm2, %ymm4, %ymm2
1540 ; AVX512F-NEXT:    vpsllq $32, %ymm2, %ymm2
1541 ; AVX512F-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
1542 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
1543 ; AVX512F-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
1544 ; AVX512F-NEXT:    retq
1546 ; AVX512VL-LABEL: vec256_i64_signed_mem_mem:
1547 ; AVX512VL:       # %bb.0:
1548 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
1549 ; AVX512VL-NEXT:    vmovdqa (%rsi), %ymm1
1550 ; AVX512VL-NEXT:    vpcmpgtq %ymm1, %ymm0, %k1
1551 ; AVX512VL-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1552 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1553 ; AVX512VL-NEXT:    vmovdqa64 %ymm2, %ymm3 {%k1}
1554 ; AVX512VL-NEXT:    vpminsq %ymm1, %ymm0, %ymm2
1555 ; AVX512VL-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm1
1556 ; AVX512VL-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
1557 ; AVX512VL-NEXT:    vpsrlq $1, %ymm1, %ymm1
1558 ; AVX512VL-NEXT:    vpsrlq $32, %ymm3, %ymm2
1559 ; AVX512VL-NEXT:    vpmuludq %ymm2, %ymm1, %ymm2
1560 ; AVX512VL-NEXT:    vpsrlq $32, %ymm1, %ymm4
1561 ; AVX512VL-NEXT:    vpmuludq %ymm3, %ymm4, %ymm4
1562 ; AVX512VL-NEXT:    vpaddq %ymm4, %ymm2, %ymm2
1563 ; AVX512VL-NEXT:    vpsllq $32, %ymm2, %ymm2
1564 ; AVX512VL-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
1565 ; AVX512VL-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
1566 ; AVX512VL-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
1567 ; AVX512VL-NEXT:    retq
1569 ; AVX512BW-FALLBACK-LABEL: vec256_i64_signed_mem_mem:
1570 ; AVX512BW-FALLBACK:       # %bb.0:
1571 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm0
1572 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rsi), %ymm1
1573 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1574 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1575 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]
1576 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1577 ; AVX512BW-FALLBACK-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
1578 ; AVX512BW-FALLBACK-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
1579 ; AVX512BW-FALLBACK-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
1580 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %ymm1, %ymm1
1581 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm1, %ymm2
1582 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
1583 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %ymm3, %ymm4
1584 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm4, %ymm1, %ymm4
1585 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm2, %ymm4, %ymm2
1586 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %ymm2, %ymm2
1587 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
1588 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
1589 ; AVX512BW-FALLBACK-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
1590 ; AVX512BW-FALLBACK-NEXT:    retq
1591   %a1 = load <4 x i64>, <4 x i64>* %a1_addr
1592   %a2 = load <4 x i64>, <4 x i64>* %a2_addr
1593   %t3 = icmp sgt <4 x i64> %a1, %a2 ; signed
1594   %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>
1595   %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a1
1596   %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a2
1597   %t7 = sub <4 x i64> %t6, %t5
1598   %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>
1599   %t9 = mul nsw <4 x i64> %t8, %t4 ; signed
1600   %a10 = add nsw <4 x i64> %t9, %a1 ; signed
1601   ret <4 x i64> %a10
1604 ; ---------------------------------------------------------------------------- ;
1605 ; 16-bit width. 256 / 16 = 16 elts.
1606 ; ---------------------------------------------------------------------------- ;
1608 ; Values come from regs
1610 define <16 x i16> @vec256_i16_signed_reg_reg(<16 x i16> %a1, <16 x i16> %a2) nounwind {
1611 ; AVX1-FALLBACK-LABEL: vec256_i16_signed_reg_reg:
1612 ; AVX1-FALLBACK:       # %bb.0:
1613 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm2
1614 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
1615 ; AVX1-FALLBACK-NEXT:    vpcmpgtw %xmm2, %xmm3, %xmm4
1616 ; AVX1-FALLBACK-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm5
1617 ; AVX1-FALLBACK-NEXT:    vpminsw %xmm2, %xmm3, %xmm6
1618 ; AVX1-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm7
1619 ; AVX1-FALLBACK-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
1620 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm6, %xmm2, %xmm2
1621 ; AVX1-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
1622 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm7, %xmm1, %xmm1
1623 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm2, %xmm2
1624 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
1625 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1626 ; AVX1-FALLBACK-NEXT:    vpor %xmm6, %xmm5, %xmm5
1627 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
1628 ; AVX1-FALLBACK-NEXT:    vpor %xmm6, %xmm4, %xmm4
1629 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm4, %xmm2, %xmm2
1630 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm3, %xmm2, %xmm2
1631 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
1632 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1633 ; AVX1-FALLBACK-NEXT:    retq
1635 ; AVX2-LABEL: vec256_i16_signed_reg_reg:
1636 ; AVX2:       # %bb.0:
1637 ; AVX2-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
1638 ; AVX2-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
1639 ; AVX2-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
1640 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1641 ; AVX2-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
1642 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
1643 ; AVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
1644 ; AVX2-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1645 ; AVX2-NEXT:    retq
1647 ; XOP-FALLBACK-LABEL: vec256_i16_signed_reg_reg:
1648 ; XOP-FALLBACK:       # %bb.0:
1649 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm2
1650 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
1651 ; XOP-FALLBACK-NEXT:    vpcomgtw %xmm2, %xmm3, %xmm4
1652 ; XOP-FALLBACK-NEXT:    vpcomgtw %xmm1, %xmm0, %xmm5
1653 ; XOP-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm6
1654 ; XOP-FALLBACK-NEXT:    vpminsw %xmm2, %xmm3, %xmm7
1655 ; XOP-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
1656 ; XOP-FALLBACK-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
1657 ; XOP-FALLBACK-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
1658 ; XOP-FALLBACK-NEXT:    vpsubw %xmm7, %xmm2, %xmm2
1659 ; XOP-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
1660 ; XOP-FALLBACK-NEXT:    vpsrlw $1, %xmm2, %xmm2
1661 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1662 ; XOP-FALLBACK-NEXT:    vpor %xmm6, %xmm5, %xmm5
1663 ; XOP-FALLBACK-NEXT:    vpor %xmm6, %xmm4, %xmm4
1664 ; XOP-FALLBACK-NEXT:    vpmacsww %xmm3, %xmm4, %xmm2, %xmm2
1665 ; XOP-FALLBACK-NEXT:    vpmacsww %xmm0, %xmm5, %xmm1, %xmm0
1666 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1667 ; XOP-FALLBACK-NEXT:    retq
1669 ; XOPAVX1-LABEL: vec256_i16_signed_reg_reg:
1670 ; XOPAVX1:       # %bb.0:
1671 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1672 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1673 ; XOPAVX1-NEXT:    vpcomgtw %xmm2, %xmm3, %xmm4
1674 ; XOPAVX1-NEXT:    vpcomgtw %xmm1, %xmm0, %xmm5
1675 ; XOPAVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm6
1676 ; XOPAVX1-NEXT:    vpminsw %xmm2, %xmm3, %xmm7
1677 ; XOPAVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
1678 ; XOPAVX1-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
1679 ; XOPAVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
1680 ; XOPAVX1-NEXT:    vpsubw %xmm7, %xmm2, %xmm2
1681 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
1682 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
1683 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1684 ; XOPAVX1-NEXT:    vpor %xmm6, %xmm5, %xmm5
1685 ; XOPAVX1-NEXT:    vpor %xmm6, %xmm4, %xmm4
1686 ; XOPAVX1-NEXT:    vpmacsww %xmm3, %xmm4, %xmm2, %xmm2
1687 ; XOPAVX1-NEXT:    vpmacsww %xmm0, %xmm5, %xmm1, %xmm0
1688 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1689 ; XOPAVX1-NEXT:    retq
1691 ; AVX512F-LABEL: vec256_i16_signed_reg_reg:
1692 ; AVX512F:       # %bb.0:
1693 ; AVX512F-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
1694 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
1695 ; AVX512F-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
1696 ; AVX512F-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1697 ; AVX512F-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
1698 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
1699 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
1700 ; AVX512F-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1701 ; AVX512F-NEXT:    retq
1703 ; AVX512VL-FALLBACK-LABEL: vec256_i16_signed_reg_reg:
1704 ; AVX512VL-FALLBACK:       # %bb.0:
1705 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
1706 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
1707 ; AVX512VL-FALLBACK-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
1708 ; AVX512VL-FALLBACK-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1709 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
1710 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
1711 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
1712 ; AVX512VL-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1713 ; AVX512VL-FALLBACK-NEXT:    retq
1715 ; AVX512BW-FALLBACK-LABEL: vec256_i16_signed_reg_reg:
1716 ; AVX512BW-FALLBACK:       # %bb.0:
1717 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1718 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1719 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtw %zmm1, %zmm0, %k1
1720 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1721 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1722 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
1723 ; AVX512BW-FALLBACK-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
1724 ; AVX512BW-FALLBACK-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1725 ; AVX512BW-FALLBACK-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1726 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
1727 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1728 ; AVX512BW-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1729 ; AVX512BW-FALLBACK-NEXT:    retq
1731 ; AVX512VLBW-LABEL: vec256_i16_signed_reg_reg:
1732 ; AVX512VLBW:       # %bb.0:
1733 ; AVX512VLBW-NEXT:    vpcmpgtw %ymm1, %ymm0, %k1
1734 ; AVX512VLBW-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1735 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1736 ; AVX512VLBW-NEXT:    vmovdqu16 %ymm2, %ymm3 {%k1}
1737 ; AVX512VLBW-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
1738 ; AVX512VLBW-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
1739 ; AVX512VLBW-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1740 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
1741 ; AVX512VLBW-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1742 ; AVX512VLBW-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1743 ; AVX512VLBW-NEXT:    retq
1744   %t3 = icmp sgt <16 x i16> %a1, %a2 ; signed
1745   %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>
1746   %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a1
1747   %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a2
1748   %t7 = sub <16 x i16> %t6, %t5
1749   %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>
1750   %t9 = mul nsw <16 x i16> %t16, %t4 ; signed
1751   %a10 = add nsw <16 x i16> %t9, %a1 ; signed
1752   ret <16 x i16> %a10
1755 define <16 x i16> @vec256_i16_unsigned_reg_reg(<16 x i16> %a1, <16 x i16> %a2) nounwind {
1756 ; AVX1-FALLBACK-LABEL: vec256_i16_unsigned_reg_reg:
1757 ; AVX1-FALLBACK:       # %bb.0:
1758 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm2
1759 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
1760 ; AVX1-FALLBACK-NEXT:    vpminuw %xmm2, %xmm3, %xmm4
1761 ; AVX1-FALLBACK-NEXT:    vpcmpeqw %xmm4, %xmm3, %xmm5
1762 ; AVX1-FALLBACK-NEXT:    vpcmpeqd %xmm8, %xmm8, %xmm8
1763 ; AVX1-FALLBACK-NEXT:    vpxor %xmm8, %xmm5, %xmm5
1764 ; AVX1-FALLBACK-NEXT:    vpminuw %xmm1, %xmm0, %xmm7
1765 ; AVX1-FALLBACK-NEXT:    vpcmpeqw %xmm7, %xmm0, %xmm6
1766 ; AVX1-FALLBACK-NEXT:    vpxor %xmm8, %xmm6, %xmm6
1767 ; AVX1-FALLBACK-NEXT:    vpmaxuw %xmm2, %xmm3, %xmm2
1768 ; AVX1-FALLBACK-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
1769 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm7, %xmm1, %xmm1
1770 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm4, %xmm2, %xmm2
1771 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm2, %xmm2
1772 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
1773 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1]
1774 ; AVX1-FALLBACK-NEXT:    vpor %xmm4, %xmm6, %xmm6
1775 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm6, %xmm1, %xmm1
1776 ; AVX1-FALLBACK-NEXT:    vpor %xmm4, %xmm5, %xmm4
1777 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm4, %xmm2, %xmm2
1778 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm3, %xmm2, %xmm2
1779 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
1780 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1781 ; AVX1-FALLBACK-NEXT:    retq
1783 ; AVX2-LABEL: vec256_i16_unsigned_reg_reg:
1784 ; AVX2:       # %bb.0:
1785 ; AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm2
1786 ; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm3
1787 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
1788 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm3
1789 ; AVX2-NEXT:    vpor {{.*}}(%rip), %ymm3, %ymm3
1790 ; AVX2-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm1
1791 ; AVX2-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1792 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
1793 ; AVX2-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1794 ; AVX2-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1795 ; AVX2-NEXT:    retq
1797 ; XOP-FALLBACK-LABEL: vec256_i16_unsigned_reg_reg:
1798 ; XOP-FALLBACK:       # %bb.0:
1799 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm2
1800 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
1801 ; XOP-FALLBACK-NEXT:    vpcomgtuw %xmm2, %xmm3, %xmm4
1802 ; XOP-FALLBACK-NEXT:    vpcomgtuw %xmm1, %xmm0, %xmm5
1803 ; XOP-FALLBACK-NEXT:    vpminuw %xmm1, %xmm0, %xmm6
1804 ; XOP-FALLBACK-NEXT:    vpminuw %xmm2, %xmm3, %xmm7
1805 ; XOP-FALLBACK-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
1806 ; XOP-FALLBACK-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
1807 ; XOP-FALLBACK-NEXT:    vpmaxuw %xmm2, %xmm3, %xmm2
1808 ; XOP-FALLBACK-NEXT:    vpsubw %xmm7, %xmm2, %xmm2
1809 ; XOP-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
1810 ; XOP-FALLBACK-NEXT:    vpsrlw $1, %xmm2, %xmm2
1811 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1812 ; XOP-FALLBACK-NEXT:    vpor %xmm6, %xmm5, %xmm5
1813 ; XOP-FALLBACK-NEXT:    vpor %xmm6, %xmm4, %xmm4
1814 ; XOP-FALLBACK-NEXT:    vpmacsww %xmm3, %xmm4, %xmm2, %xmm2
1815 ; XOP-FALLBACK-NEXT:    vpmacsww %xmm0, %xmm5, %xmm1, %xmm0
1816 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1817 ; XOP-FALLBACK-NEXT:    retq
1819 ; XOPAVX1-LABEL: vec256_i16_unsigned_reg_reg:
1820 ; XOPAVX1:       # %bb.0:
1821 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1822 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1823 ; XOPAVX1-NEXT:    vpcomgtuw %xmm2, %xmm3, %xmm4
1824 ; XOPAVX1-NEXT:    vpcomgtuw %xmm1, %xmm0, %xmm5
1825 ; XOPAVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm6
1826 ; XOPAVX1-NEXT:    vpminuw %xmm2, %xmm3, %xmm7
1827 ; XOPAVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
1828 ; XOPAVX1-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
1829 ; XOPAVX1-NEXT:    vpmaxuw %xmm2, %xmm3, %xmm2
1830 ; XOPAVX1-NEXT:    vpsubw %xmm7, %xmm2, %xmm2
1831 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
1832 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
1833 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1834 ; XOPAVX1-NEXT:    vpor %xmm6, %xmm5, %xmm5
1835 ; XOPAVX1-NEXT:    vpor %xmm6, %xmm4, %xmm4
1836 ; XOPAVX1-NEXT:    vpmacsww %xmm3, %xmm4, %xmm2, %xmm2
1837 ; XOPAVX1-NEXT:    vpmacsww %xmm0, %xmm5, %xmm1, %xmm0
1838 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1839 ; XOPAVX1-NEXT:    retq
1841 ; AVX512F-LABEL: vec256_i16_unsigned_reg_reg:
1842 ; AVX512F:       # %bb.0:
1843 ; AVX512F-NEXT:    vpminuw %ymm1, %ymm0, %ymm2
1844 ; AVX512F-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm3
1845 ; AVX512F-NEXT:    vpternlogq $15, %zmm3, %zmm3, %zmm3
1846 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %ymm3, %ymm3
1847 ; AVX512F-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm1
1848 ; AVX512F-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1849 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
1850 ; AVX512F-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1851 ; AVX512F-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1852 ; AVX512F-NEXT:    retq
1854 ; AVX512VL-FALLBACK-LABEL: vec256_i16_unsigned_reg_reg:
1855 ; AVX512VL-FALLBACK:       # %bb.0:
1856 ; AVX512VL-FALLBACK-NEXT:    vpminuw %ymm1, %ymm0, %ymm2
1857 ; AVX512VL-FALLBACK-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm3
1858 ; AVX512VL-FALLBACK-NEXT:    vpternlogq $15, %ymm3, %ymm3, %ymm3
1859 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %ymm3, %ymm3
1860 ; AVX512VL-FALLBACK-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm1
1861 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1862 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
1863 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1864 ; AVX512VL-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1865 ; AVX512VL-FALLBACK-NEXT:    retq
1867 ; AVX512BW-FALLBACK-LABEL: vec256_i16_unsigned_reg_reg:
1868 ; AVX512BW-FALLBACK:       # %bb.0:
1869 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1870 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1871 ; AVX512BW-FALLBACK-NEXT:    vpcmpnleuw %zmm1, %zmm0, %k1
1872 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1873 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1874 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
1875 ; AVX512BW-FALLBACK-NEXT:    vpminuw %ymm1, %ymm0, %ymm2
1876 ; AVX512BW-FALLBACK-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm1
1877 ; AVX512BW-FALLBACK-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1878 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
1879 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1880 ; AVX512BW-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1881 ; AVX512BW-FALLBACK-NEXT:    retq
1883 ; AVX512VLBW-LABEL: vec256_i16_unsigned_reg_reg:
1884 ; AVX512VLBW:       # %bb.0:
1885 ; AVX512VLBW-NEXT:    vpcmpnleuw %ymm1, %ymm0, %k1
1886 ; AVX512VLBW-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1887 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1888 ; AVX512VLBW-NEXT:    vmovdqu16 %ymm2, %ymm3 {%k1}
1889 ; AVX512VLBW-NEXT:    vpminuw %ymm1, %ymm0, %ymm2
1890 ; AVX512VLBW-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm1
1891 ; AVX512VLBW-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
1892 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
1893 ; AVX512VLBW-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1894 ; AVX512VLBW-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
1895 ; AVX512VLBW-NEXT:    retq
1896   %t3 = icmp ugt <16 x i16> %a1, %a2
1897   %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>
1898   %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a1
1899   %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a2
1900   %t7 = sub <16 x i16> %t6, %t5
1901   %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>
1902   %t9 = mul <16 x i16> %t16, %t4
1903   %a10 = add <16 x i16> %t9, %a1
1904   ret <16 x i16> %a10
1907 ; Values are loaded. Only check signed case.
1909 define <16 x i16> @vec256_i16_signed_mem_reg(<16 x i16>* %a1_addr, <16 x i16> %a2) nounwind {
1910 ; AVX1-FALLBACK-LABEL: vec256_i16_signed_mem_reg:
1911 ; AVX1-FALLBACK:       # %bb.0:
1912 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm1
1913 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm2
1914 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm3
1915 ; AVX1-FALLBACK-NEXT:    vpcmpgtw %xmm1, %xmm3, %xmm4
1916 ; AVX1-FALLBACK-NEXT:    vpcmpgtw %xmm0, %xmm2, %xmm5
1917 ; AVX1-FALLBACK-NEXT:    vpminsw %xmm1, %xmm3, %xmm6
1918 ; AVX1-FALLBACK-NEXT:    vpminsw %xmm0, %xmm2, %xmm7
1919 ; AVX1-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm3, %xmm1
1920 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
1921 ; AVX1-FALLBACK-NEXT:    vpmaxsw %xmm0, %xmm2, %xmm0
1922 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm7, %xmm0, %xmm0
1923 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
1924 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm0, %xmm0
1925 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1926 ; AVX1-FALLBACK-NEXT:    vpor %xmm6, %xmm5, %xmm5
1927 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm5, %xmm0, %xmm0
1928 ; AVX1-FALLBACK-NEXT:    vpor %xmm6, %xmm4, %xmm4
1929 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm4, %xmm1, %xmm1
1930 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm3, %xmm1, %xmm1
1931 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
1932 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1933 ; AVX1-FALLBACK-NEXT:    retq
1935 ; AVX2-LABEL: vec256_i16_signed_mem_reg:
1936 ; AVX2:       # %bb.0:
1937 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
1938 ; AVX2-NEXT:    vpcmpgtw %ymm0, %ymm1, %ymm2
1939 ; AVX2-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
1940 ; AVX2-NEXT:    vpminsw %ymm0, %ymm1, %ymm3
1941 ; AVX2-NEXT:    vpmaxsw %ymm0, %ymm1, %ymm0
1942 ; AVX2-NEXT:    vpsubw %ymm3, %ymm0, %ymm0
1943 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm0
1944 ; AVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
1945 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
1946 ; AVX2-NEXT:    retq
1948 ; XOP-FALLBACK-LABEL: vec256_i16_signed_mem_reg:
1949 ; XOP-FALLBACK:       # %bb.0:
1950 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm1
1951 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm2
1952 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm3
1953 ; XOP-FALLBACK-NEXT:    vpcomgtw %xmm1, %xmm3, %xmm4
1954 ; XOP-FALLBACK-NEXT:    vpcomgtw %xmm0, %xmm2, %xmm5
1955 ; XOP-FALLBACK-NEXT:    vpminsw %xmm0, %xmm2, %xmm6
1956 ; XOP-FALLBACK-NEXT:    vpminsw %xmm1, %xmm3, %xmm7
1957 ; XOP-FALLBACK-NEXT:    vpmaxsw %xmm0, %xmm2, %xmm0
1958 ; XOP-FALLBACK-NEXT:    vpsubw %xmm6, %xmm0, %xmm0
1959 ; XOP-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm3, %xmm1
1960 ; XOP-FALLBACK-NEXT:    vpsubw %xmm7, %xmm1, %xmm1
1961 ; XOP-FALLBACK-NEXT:    vpsrlw $1, %xmm0, %xmm0
1962 ; XOP-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
1963 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1964 ; XOP-FALLBACK-NEXT:    vpor %xmm6, %xmm5, %xmm5
1965 ; XOP-FALLBACK-NEXT:    vpor %xmm6, %xmm4, %xmm4
1966 ; XOP-FALLBACK-NEXT:    vpmacsww %xmm3, %xmm4, %xmm1, %xmm1
1967 ; XOP-FALLBACK-NEXT:    vpmacsww %xmm2, %xmm5, %xmm0, %xmm0
1968 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1969 ; XOP-FALLBACK-NEXT:    retq
1971 ; XOPAVX1-LABEL: vec256_i16_signed_mem_reg:
1972 ; XOPAVX1:       # %bb.0:
1973 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1974 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm2
1975 ; XOPAVX1-NEXT:    vmovdqa 16(%rdi), %xmm3
1976 ; XOPAVX1-NEXT:    vpcomgtw %xmm1, %xmm3, %xmm4
1977 ; XOPAVX1-NEXT:    vpcomgtw %xmm0, %xmm2, %xmm5
1978 ; XOPAVX1-NEXT:    vpminsw %xmm0, %xmm2, %xmm6
1979 ; XOPAVX1-NEXT:    vpminsw %xmm1, %xmm3, %xmm7
1980 ; XOPAVX1-NEXT:    vpmaxsw %xmm0, %xmm2, %xmm0
1981 ; XOPAVX1-NEXT:    vpsubw %xmm6, %xmm0, %xmm0
1982 ; XOPAVX1-NEXT:    vpmaxsw %xmm1, %xmm3, %xmm1
1983 ; XOPAVX1-NEXT:    vpsubw %xmm7, %xmm1, %xmm1
1984 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm0, %xmm0
1985 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
1986 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
1987 ; XOPAVX1-NEXT:    vpor %xmm6, %xmm5, %xmm5
1988 ; XOPAVX1-NEXT:    vpor %xmm6, %xmm4, %xmm4
1989 ; XOPAVX1-NEXT:    vpmacsww %xmm3, %xmm4, %xmm1, %xmm1
1990 ; XOPAVX1-NEXT:    vpmacsww %xmm2, %xmm5, %xmm0, %xmm0
1991 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1992 ; XOPAVX1-NEXT:    retq
1994 ; AVX512F-LABEL: vec256_i16_signed_mem_reg:
1995 ; AVX512F:       # %bb.0:
1996 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm1
1997 ; AVX512F-NEXT:    vpcmpgtw %ymm0, %ymm1, %ymm2
1998 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
1999 ; AVX512F-NEXT:    vpminsw %ymm0, %ymm1, %ymm3
2000 ; AVX512F-NEXT:    vpmaxsw %ymm0, %ymm1, %ymm0
2001 ; AVX512F-NEXT:    vpsubw %ymm3, %ymm0, %ymm0
2002 ; AVX512F-NEXT:    vpsrlw $1, %ymm0, %ymm0
2003 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
2004 ; AVX512F-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
2005 ; AVX512F-NEXT:    retq
2007 ; AVX512VL-FALLBACK-LABEL: vec256_i16_signed_mem_reg:
2008 ; AVX512VL-FALLBACK:       # %bb.0:
2009 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
2010 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtw %ymm0, %ymm1, %ymm2
2011 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
2012 ; AVX512VL-FALLBACK-NEXT:    vpminsw %ymm0, %ymm1, %ymm3
2013 ; AVX512VL-FALLBACK-NEXT:    vpmaxsw %ymm0, %ymm1, %ymm0
2014 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm3, %ymm0, %ymm0
2015 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm0, %ymm0
2016 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
2017 ; AVX512VL-FALLBACK-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
2018 ; AVX512VL-FALLBACK-NEXT:    retq
2020 ; AVX512BW-FALLBACK-LABEL: vec256_i16_signed_mem_reg:
2021 ; AVX512BW-FALLBACK:       # %bb.0:
2022 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2023 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
2024 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtw %zmm0, %zmm1, %k1
2025 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2026 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2027 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
2028 ; AVX512BW-FALLBACK-NEXT:    vpminsw %ymm0, %ymm1, %ymm2
2029 ; AVX512BW-FALLBACK-NEXT:    vpmaxsw %ymm0, %ymm1, %ymm0
2030 ; AVX512BW-FALLBACK-NEXT:    vpsubw %ymm2, %ymm0, %ymm0
2031 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm0, %ymm0
2032 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm3, %ymm0, %ymm0
2033 ; AVX512BW-FALLBACK-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
2034 ; AVX512BW-FALLBACK-NEXT:    retq
2036 ; AVX512VLBW-LABEL: vec256_i16_signed_mem_reg:
2037 ; AVX512VLBW:       # %bb.0:
2038 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %ymm1
2039 ; AVX512VLBW-NEXT:    vpcmpgtw %ymm0, %ymm1, %k1
2040 ; AVX512VLBW-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2041 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2042 ; AVX512VLBW-NEXT:    vmovdqu16 %ymm2, %ymm3 {%k1}
2043 ; AVX512VLBW-NEXT:    vpminsw %ymm0, %ymm1, %ymm2
2044 ; AVX512VLBW-NEXT:    vpmaxsw %ymm0, %ymm1, %ymm0
2045 ; AVX512VLBW-NEXT:    vpsubw %ymm2, %ymm0, %ymm0
2046 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm0, %ymm0
2047 ; AVX512VLBW-NEXT:    vpmullw %ymm3, %ymm0, %ymm0
2048 ; AVX512VLBW-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
2049 ; AVX512VLBW-NEXT:    retq
2050   %a1 = load <16 x i16>, <16 x i16>* %a1_addr
2051   %t3 = icmp sgt <16 x i16> %a1, %a2 ; signed
2052   %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>
2053   %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a1
2054   %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a2
2055   %t7 = sub <16 x i16> %t6, %t5
2056   %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>
2057   %t9 = mul nsw <16 x i16> %t16, %t4 ; signed
2058   %a10 = add nsw <16 x i16> %t9, %a1 ; signed
2059   ret <16 x i16> %a10
2062 define <16 x i16> @vec256_i16_signed_reg_mem(<16 x i16> %a1, <16 x i16>* %a2_addr) nounwind {
2063 ; AVX1-FALLBACK-LABEL: vec256_i16_signed_reg_mem:
2064 ; AVX1-FALLBACK:       # %bb.0:
2065 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
2066 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm2
2067 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
2068 ; AVX1-FALLBACK-NEXT:    vpcmpgtw %xmm2, %xmm3, %xmm4
2069 ; AVX1-FALLBACK-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm5
2070 ; AVX1-FALLBACK-NEXT:    vpminsw %xmm2, %xmm3, %xmm6
2071 ; AVX1-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm7
2072 ; AVX1-FALLBACK-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
2073 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm6, %xmm2, %xmm2
2074 ; AVX1-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2075 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm7, %xmm1, %xmm1
2076 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm2, %xmm2
2077 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2078 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
2079 ; AVX1-FALLBACK-NEXT:    vpor %xmm6, %xmm5, %xmm5
2080 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
2081 ; AVX1-FALLBACK-NEXT:    vpor %xmm6, %xmm4, %xmm4
2082 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm4, %xmm2, %xmm2
2083 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm3, %xmm2, %xmm2
2084 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2085 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2086 ; AVX1-FALLBACK-NEXT:    retq
2088 ; AVX2-LABEL: vec256_i16_signed_reg_mem:
2089 ; AVX2:       # %bb.0:
2090 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
2091 ; AVX2-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
2092 ; AVX2-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
2093 ; AVX2-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
2094 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
2095 ; AVX2-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
2096 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
2097 ; AVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2098 ; AVX2-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
2099 ; AVX2-NEXT:    retq
2101 ; XOP-FALLBACK-LABEL: vec256_i16_signed_reg_mem:
2102 ; XOP-FALLBACK:       # %bb.0:
2103 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
2104 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm2
2105 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
2106 ; XOP-FALLBACK-NEXT:    vpcomgtw %xmm2, %xmm3, %xmm4
2107 ; XOP-FALLBACK-NEXT:    vpcomgtw %xmm1, %xmm0, %xmm5
2108 ; XOP-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm6
2109 ; XOP-FALLBACK-NEXT:    vpminsw %xmm2, %xmm3, %xmm7
2110 ; XOP-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2111 ; XOP-FALLBACK-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
2112 ; XOP-FALLBACK-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
2113 ; XOP-FALLBACK-NEXT:    vpsubw %xmm7, %xmm2, %xmm2
2114 ; XOP-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2115 ; XOP-FALLBACK-NEXT:    vpsrlw $1, %xmm2, %xmm2
2116 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
2117 ; XOP-FALLBACK-NEXT:    vpor %xmm6, %xmm5, %xmm5
2118 ; XOP-FALLBACK-NEXT:    vpor %xmm6, %xmm4, %xmm4
2119 ; XOP-FALLBACK-NEXT:    vpmacsww %xmm3, %xmm4, %xmm2, %xmm2
2120 ; XOP-FALLBACK-NEXT:    vpmacsww %xmm0, %xmm5, %xmm1, %xmm0
2121 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2122 ; XOP-FALLBACK-NEXT:    retq
2124 ; XOPAVX1-LABEL: vec256_i16_signed_reg_mem:
2125 ; XOPAVX1:       # %bb.0:
2126 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm1
2127 ; XOPAVX1-NEXT:    vmovdqa 16(%rdi), %xmm2
2128 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2129 ; XOPAVX1-NEXT:    vpcomgtw %xmm2, %xmm3, %xmm4
2130 ; XOPAVX1-NEXT:    vpcomgtw %xmm1, %xmm0, %xmm5
2131 ; XOPAVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm6
2132 ; XOPAVX1-NEXT:    vpminsw %xmm2, %xmm3, %xmm7
2133 ; XOPAVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2134 ; XOPAVX1-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
2135 ; XOPAVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
2136 ; XOPAVX1-NEXT:    vpsubw %xmm7, %xmm2, %xmm2
2137 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
2138 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
2139 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
2140 ; XOPAVX1-NEXT:    vpor %xmm6, %xmm5, %xmm5
2141 ; XOPAVX1-NEXT:    vpor %xmm6, %xmm4, %xmm4
2142 ; XOPAVX1-NEXT:    vpmacsww %xmm3, %xmm4, %xmm2, %xmm2
2143 ; XOPAVX1-NEXT:    vpmacsww %xmm0, %xmm5, %xmm1, %xmm0
2144 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2145 ; XOPAVX1-NEXT:    retq
2147 ; AVX512F-LABEL: vec256_i16_signed_reg_mem:
2148 ; AVX512F:       # %bb.0:
2149 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm1
2150 ; AVX512F-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
2151 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
2152 ; AVX512F-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
2153 ; AVX512F-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
2154 ; AVX512F-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
2155 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
2156 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2157 ; AVX512F-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
2158 ; AVX512F-NEXT:    retq
2160 ; AVX512VL-FALLBACK-LABEL: vec256_i16_signed_reg_mem:
2161 ; AVX512VL-FALLBACK:       # %bb.0:
2162 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
2163 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
2164 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
2165 ; AVX512VL-FALLBACK-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
2166 ; AVX512VL-FALLBACK-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
2167 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
2168 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
2169 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2170 ; AVX512VL-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
2171 ; AVX512VL-FALLBACK-NEXT:    retq
2173 ; AVX512BW-FALLBACK-LABEL: vec256_i16_signed_reg_mem:
2174 ; AVX512BW-FALLBACK:       # %bb.0:
2175 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2176 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
2177 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtw %zmm1, %zmm0, %k1
2178 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2179 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2180 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
2181 ; AVX512BW-FALLBACK-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
2182 ; AVX512BW-FALLBACK-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
2183 ; AVX512BW-FALLBACK-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
2184 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
2185 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
2186 ; AVX512BW-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
2187 ; AVX512BW-FALLBACK-NEXT:    retq
2189 ; AVX512VLBW-LABEL: vec256_i16_signed_reg_mem:
2190 ; AVX512VLBW:       # %bb.0:
2191 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %ymm1
2192 ; AVX512VLBW-NEXT:    vpcmpgtw %ymm1, %ymm0, %k1
2193 ; AVX512VLBW-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2194 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2195 ; AVX512VLBW-NEXT:    vmovdqu16 %ymm2, %ymm3 {%k1}
2196 ; AVX512VLBW-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
2197 ; AVX512VLBW-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
2198 ; AVX512VLBW-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
2199 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
2200 ; AVX512VLBW-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
2201 ; AVX512VLBW-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
2202 ; AVX512VLBW-NEXT:    retq
2203   %a2 = load <16 x i16>, <16 x i16>* %a2_addr
2204   %t3 = icmp sgt <16 x i16> %a1, %a2 ; signed
2205   %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>
2206   %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a1
2207   %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a2
2208   %t7 = sub <16 x i16> %t6, %t5
2209   %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>
2210   %t9 = mul nsw <16 x i16> %t16, %t4 ; signed
2211   %a10 = add nsw <16 x i16> %t9, %a1 ; signed
2212   ret <16 x i16> %a10
2215 define <16 x i16> @vec256_i16_signed_mem_mem(<16 x i16>* %a1_addr, <16 x i16>* %a2_addr) nounwind {
2216 ; AVX1-FALLBACK-LABEL: vec256_i16_signed_mem_mem:
2217 ; AVX1-FALLBACK:       # %bb.0:
2218 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm0
2219 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rsi), %xmm1
2220 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm2
2221 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm3
2222 ; AVX1-FALLBACK-NEXT:    vpcmpgtw %xmm1, %xmm3, %xmm4
2223 ; AVX1-FALLBACK-NEXT:    vpcmpgtw %xmm0, %xmm2, %xmm5
2224 ; AVX1-FALLBACK-NEXT:    vpminsw %xmm1, %xmm3, %xmm6
2225 ; AVX1-FALLBACK-NEXT:    vpminsw %xmm0, %xmm2, %xmm7
2226 ; AVX1-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm3, %xmm1
2227 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm6, %xmm1, %xmm1
2228 ; AVX1-FALLBACK-NEXT:    vpmaxsw %xmm0, %xmm2, %xmm0
2229 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm7, %xmm0, %xmm0
2230 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2231 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm0, %xmm0
2232 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
2233 ; AVX1-FALLBACK-NEXT:    vpor %xmm6, %xmm5, %xmm5
2234 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm5, %xmm0, %xmm0
2235 ; AVX1-FALLBACK-NEXT:    vpor %xmm6, %xmm4, %xmm4
2236 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm4, %xmm1, %xmm1
2237 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm3, %xmm1, %xmm1
2238 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
2239 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2240 ; AVX1-FALLBACK-NEXT:    retq
2242 ; AVX2-LABEL: vec256_i16_signed_mem_mem:
2243 ; AVX2:       # %bb.0:
2244 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
2245 ; AVX2-NEXT:    vmovdqa (%rsi), %ymm1
2246 ; AVX2-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
2247 ; AVX2-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
2248 ; AVX2-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
2249 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
2250 ; AVX2-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
2251 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
2252 ; AVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2253 ; AVX2-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
2254 ; AVX2-NEXT:    retq
2256 ; XOP-FALLBACK-LABEL: vec256_i16_signed_mem_mem:
2257 ; XOP-FALLBACK:       # %bb.0:
2258 ; XOP-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm0
2259 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rsi), %xmm1
2260 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm2
2261 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm3
2262 ; XOP-FALLBACK-NEXT:    vpcomgtw %xmm1, %xmm3, %xmm4
2263 ; XOP-FALLBACK-NEXT:    vpcomgtw %xmm0, %xmm2, %xmm5
2264 ; XOP-FALLBACK-NEXT:    vpminsw %xmm0, %xmm2, %xmm6
2265 ; XOP-FALLBACK-NEXT:    vpminsw %xmm1, %xmm3, %xmm7
2266 ; XOP-FALLBACK-NEXT:    vpmaxsw %xmm0, %xmm2, %xmm0
2267 ; XOP-FALLBACK-NEXT:    vpsubw %xmm6, %xmm0, %xmm0
2268 ; XOP-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm3, %xmm1
2269 ; XOP-FALLBACK-NEXT:    vpsubw %xmm7, %xmm1, %xmm1
2270 ; XOP-FALLBACK-NEXT:    vpsrlw $1, %xmm0, %xmm0
2271 ; XOP-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2272 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
2273 ; XOP-FALLBACK-NEXT:    vpor %xmm6, %xmm5, %xmm5
2274 ; XOP-FALLBACK-NEXT:    vpor %xmm6, %xmm4, %xmm4
2275 ; XOP-FALLBACK-NEXT:    vpmacsww %xmm3, %xmm4, %xmm1, %xmm1
2276 ; XOP-FALLBACK-NEXT:    vpmacsww %xmm2, %xmm5, %xmm0, %xmm0
2277 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2278 ; XOP-FALLBACK-NEXT:    retq
2280 ; XOPAVX1-LABEL: vec256_i16_signed_mem_mem:
2281 ; XOPAVX1:       # %bb.0:
2282 ; XOPAVX1-NEXT:    vmovdqa (%rsi), %xmm0
2283 ; XOPAVX1-NEXT:    vmovdqa 16(%rsi), %xmm1
2284 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm2
2285 ; XOPAVX1-NEXT:    vmovdqa 16(%rdi), %xmm3
2286 ; XOPAVX1-NEXT:    vpcomgtw %xmm1, %xmm3, %xmm4
2287 ; XOPAVX1-NEXT:    vpcomgtw %xmm0, %xmm2, %xmm5
2288 ; XOPAVX1-NEXT:    vpminsw %xmm0, %xmm2, %xmm6
2289 ; XOPAVX1-NEXT:    vpminsw %xmm1, %xmm3, %xmm7
2290 ; XOPAVX1-NEXT:    vpmaxsw %xmm0, %xmm2, %xmm0
2291 ; XOPAVX1-NEXT:    vpsubw %xmm6, %xmm0, %xmm0
2292 ; XOPAVX1-NEXT:    vpmaxsw %xmm1, %xmm3, %xmm1
2293 ; XOPAVX1-NEXT:    vpsubw %xmm7, %xmm1, %xmm1
2294 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm0, %xmm0
2295 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
2296 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]
2297 ; XOPAVX1-NEXT:    vpor %xmm6, %xmm5, %xmm5
2298 ; XOPAVX1-NEXT:    vpor %xmm6, %xmm4, %xmm4
2299 ; XOPAVX1-NEXT:    vpmacsww %xmm3, %xmm4, %xmm1, %xmm1
2300 ; XOPAVX1-NEXT:    vpmacsww %xmm2, %xmm5, %xmm0, %xmm0
2301 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2302 ; XOPAVX1-NEXT:    retq
2304 ; AVX512F-LABEL: vec256_i16_signed_mem_mem:
2305 ; AVX512F:       # %bb.0:
2306 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
2307 ; AVX512F-NEXT:    vmovdqa (%rsi), %ymm1
2308 ; AVX512F-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
2309 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
2310 ; AVX512F-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
2311 ; AVX512F-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
2312 ; AVX512F-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
2313 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
2314 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2315 ; AVX512F-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
2316 ; AVX512F-NEXT:    retq
2318 ; AVX512VL-FALLBACK-LABEL: vec256_i16_signed_mem_mem:
2319 ; AVX512VL-FALLBACK:       # %bb.0:
2320 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm0
2321 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rsi), %ymm1
2322 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm2
2323 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
2324 ; AVX512VL-FALLBACK-NEXT:    vpminsw %ymm1, %ymm0, %ymm3
2325 ; AVX512VL-FALLBACK-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
2326 ; AVX512VL-FALLBACK-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
2327 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
2328 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2329 ; AVX512VL-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
2330 ; AVX512VL-FALLBACK-NEXT:    retq
2332 ; AVX512BW-FALLBACK-LABEL: vec256_i16_signed_mem_mem:
2333 ; AVX512BW-FALLBACK:       # %bb.0:
2334 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm0
2335 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rsi), %ymm1
2336 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtw %zmm1, %zmm0, %k1
2337 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2338 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2339 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
2340 ; AVX512BW-FALLBACK-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
2341 ; AVX512BW-FALLBACK-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
2342 ; AVX512BW-FALLBACK-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
2343 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
2344 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
2345 ; AVX512BW-FALLBACK-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
2346 ; AVX512BW-FALLBACK-NEXT:    retq
2348 ; AVX512VLBW-LABEL: vec256_i16_signed_mem_mem:
2349 ; AVX512VLBW:       # %bb.0:
2350 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %ymm0
2351 ; AVX512VLBW-NEXT:    vmovdqa (%rsi), %ymm1
2352 ; AVX512VLBW-NEXT:    vpcmpgtw %ymm1, %ymm0, %k1
2353 ; AVX512VLBW-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2354 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2355 ; AVX512VLBW-NEXT:    vmovdqu16 %ymm2, %ymm3 {%k1}
2356 ; AVX512VLBW-NEXT:    vpminsw %ymm1, %ymm0, %ymm2
2357 ; AVX512VLBW-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm1
2358 ; AVX512VLBW-NEXT:    vpsubw %ymm2, %ymm1, %ymm1
2359 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
2360 ; AVX512VLBW-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
2361 ; AVX512VLBW-NEXT:    vpaddw %ymm0, %ymm1, %ymm0
2362 ; AVX512VLBW-NEXT:    retq
2363   %a1 = load <16 x i16>, <16 x i16>* %a1_addr
2364   %a2 = load <16 x i16>, <16 x i16>* %a2_addr
2365   %t3 = icmp sgt <16 x i16> %a1, %a2 ; signed
2366   %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>
2367   %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a1
2368   %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a2
2369   %t7 = sub <16 x i16> %t6, %t5
2370   %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>
2371   %t9 = mul nsw <16 x i16> %t16, %t4 ; signed
2372   %a10 = add nsw <16 x i16> %t9, %a1 ; signed
2373   ret <16 x i16> %a10
2376 ; ---------------------------------------------------------------------------- ;
2377 ; 8-bit width. 256 / 8 = 32 elts.
2378 ; ---------------------------------------------------------------------------- ;
2380 ; Values come from regs
2382 define <32 x i8> @vec256_i8_signed_reg_reg(<32 x i8> %a1, <32 x i8> %a2) nounwind {
2383 ; AVX1-FALLBACK-LABEL: vec256_i8_signed_reg_reg:
2384 ; AVX1-FALLBACK:       # %bb.0:
2385 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm3
2386 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm2
2387 ; AVX1-FALLBACK-NEXT:    vpcmpgtb %xmm3, %xmm2, %xmm8
2388 ; AVX1-FALLBACK-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm5
2389 ; AVX1-FALLBACK-NEXT:    vpminsb %xmm3, %xmm2, %xmm6
2390 ; AVX1-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm7
2391 ; AVX1-FALLBACK-NEXT:    vpmaxsb %xmm3, %xmm2, %xmm3
2392 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm6, %xmm3, %xmm3
2393 ; AVX1-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
2394 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm7, %xmm1, %xmm1
2395 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm3, %xmm3
2396 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
2397 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm3, %xmm3
2398 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2399 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm1, %xmm1
2400 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2401 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2402 ; AVX1-FALLBACK-NEXT:    vpor %xmm7, %xmm5, %xmm5
2403 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2404 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm4, %xmm6, %xmm4
2405 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255]
2406 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm4, %xmm4
2407 ; AVX1-FALLBACK-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
2408 ; AVX1-FALLBACK-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
2409 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
2410 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm1, %xmm1
2411 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm4, %xmm1, %xmm1
2412 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
2413 ; AVX1-FALLBACK-NEXT:    vpor %xmm7, %xmm8, %xmm5
2414 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2415 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
2416 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm4, %xmm4
2417 ; AVX1-FALLBACK-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
2418 ; AVX1-FALLBACK-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
2419 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm5, %xmm3, %xmm3
2420 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm3, %xmm3
2421 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm4, %xmm3, %xmm3
2422 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm2, %xmm3, %xmm2
2423 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2424 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2425 ; AVX1-FALLBACK-NEXT:    retq
2427 ; AVX2-LABEL: vec256_i8_signed_reg_reg:
2428 ; AVX2:       # %bb.0:
2429 ; AVX2-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
2430 ; AVX2-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
2431 ; AVX2-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
2432 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2433 ; AVX2-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
2434 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
2435 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2436 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
2437 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
2438 ; AVX2-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
2439 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2440 ; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm3
2441 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
2442 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
2443 ; AVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2444 ; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1
2445 ; AVX2-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
2446 ; AVX2-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2447 ; AVX2-NEXT:    retq
2449 ; XOP-FALLBACK-LABEL: vec256_i8_signed_reg_reg:
2450 ; XOP-FALLBACK:       # %bb.0:
2451 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm2
2452 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
2453 ; XOP-FALLBACK-NEXT:    vpcomgtb %xmm2, %xmm3, %xmm8
2454 ; XOP-FALLBACK-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm5
2455 ; XOP-FALLBACK-NEXT:    vpminsb %xmm2, %xmm3, %xmm6
2456 ; XOP-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm7
2457 ; XOP-FALLBACK-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
2458 ; XOP-FALLBACK-NEXT:    vpsubb %xmm6, %xmm2, %xmm2
2459 ; XOP-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
2460 ; XOP-FALLBACK-NEXT:    vpsubb %xmm7, %xmm1, %xmm1
2461 ; XOP-FALLBACK-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
2462 ; XOP-FALLBACK-NEXT:    vpshlb %xmm6, %xmm2, %xmm2
2463 ; XOP-FALLBACK-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
2464 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2465 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2466 ; XOP-FALLBACK-NEXT:    vpor %xmm7, %xmm5, %xmm5
2467 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2468 ; XOP-FALLBACK-NEXT:    vpmullw %xmm4, %xmm6, %xmm4
2469 ; XOP-FALLBACK-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
2470 ; XOP-FALLBACK-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
2471 ; XOP-FALLBACK-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
2472 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
2473 ; XOP-FALLBACK-NEXT:    vpperm %xmm5, %xmm4, %xmm1, %xmm1
2474 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2475 ; XOP-FALLBACK-NEXT:    vpor %xmm7, %xmm8, %xmm6
2476 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
2477 ; XOP-FALLBACK-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
2478 ; XOP-FALLBACK-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
2479 ; XOP-FALLBACK-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
2480 ; XOP-FALLBACK-NEXT:    vpmullw %xmm6, %xmm2, %xmm2
2481 ; XOP-FALLBACK-NEXT:    vpperm %xmm5, %xmm4, %xmm2, %xmm2
2482 ; XOP-FALLBACK-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
2483 ; XOP-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2484 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2485 ; XOP-FALLBACK-NEXT:    retq
2487 ; XOPAVX1-LABEL: vec256_i8_signed_reg_reg:
2488 ; XOPAVX1:       # %bb.0:
2489 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2490 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2491 ; XOPAVX1-NEXT:    vpcomgtb %xmm2, %xmm3, %xmm8
2492 ; XOPAVX1-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm5
2493 ; XOPAVX1-NEXT:    vpminsb %xmm2, %xmm3, %xmm6
2494 ; XOPAVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm7
2495 ; XOPAVX1-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
2496 ; XOPAVX1-NEXT:    vpsubb %xmm6, %xmm2, %xmm2
2497 ; XOPAVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
2498 ; XOPAVX1-NEXT:    vpsubb %xmm7, %xmm1, %xmm1
2499 ; XOPAVX1-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
2500 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm2, %xmm2
2501 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
2502 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2503 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2504 ; XOPAVX1-NEXT:    vpor %xmm7, %xmm5, %xmm5
2505 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2506 ; XOPAVX1-NEXT:    vpmullw %xmm4, %xmm6, %xmm4
2507 ; XOPAVX1-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
2508 ; XOPAVX1-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
2509 ; XOPAVX1-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
2510 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
2511 ; XOPAVX1-NEXT:    vpperm %xmm5, %xmm4, %xmm1, %xmm1
2512 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2513 ; XOPAVX1-NEXT:    vpor %xmm7, %xmm8, %xmm6
2514 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
2515 ; XOPAVX1-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
2516 ; XOPAVX1-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
2517 ; XOPAVX1-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
2518 ; XOPAVX1-NEXT:    vpmullw %xmm6, %xmm2, %xmm2
2519 ; XOPAVX1-NEXT:    vpperm %xmm5, %xmm4, %xmm2, %xmm2
2520 ; XOPAVX1-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
2521 ; XOPAVX1-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2522 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2523 ; XOPAVX1-NEXT:    retq
2525 ; AVX512F-LABEL: vec256_i8_signed_reg_reg:
2526 ; AVX512F:       # %bb.0:
2527 ; AVX512F-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
2528 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
2529 ; AVX512F-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
2530 ; AVX512F-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2531 ; AVX512F-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
2532 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
2533 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2534 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
2535 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
2536 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
2537 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2538 ; AVX512F-NEXT:    vpand %ymm4, %ymm3, %ymm3
2539 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
2540 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
2541 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2542 ; AVX512F-NEXT:    vpand %ymm4, %ymm1, %ymm1
2543 ; AVX512F-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
2544 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2545 ; AVX512F-NEXT:    retq
2547 ; AVX512VL-FALLBACK-LABEL: vec256_i8_signed_reg_reg:
2548 ; AVX512VL-FALLBACK:       # %bb.0:
2549 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
2550 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
2551 ; AVX512VL-FALLBACK-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
2552 ; AVX512VL-FALLBACK-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2553 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
2554 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
2555 ; AVX512VL-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2556 ; AVX512VL-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
2557 ; AVX512VL-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
2558 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
2559 ; AVX512VL-FALLBACK-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2560 ; AVX512VL-FALLBACK-NEXT:    vpand %ymm4, %ymm3, %ymm3
2561 ; AVX512VL-FALLBACK-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
2562 ; AVX512VL-FALLBACK-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
2563 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2564 ; AVX512VL-FALLBACK-NEXT:    vpand %ymm4, %ymm1, %ymm1
2565 ; AVX512VL-FALLBACK-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
2566 ; AVX512VL-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2567 ; AVX512VL-FALLBACK-NEXT:    retq
2569 ; AVX512BW-FALLBACK-LABEL: vec256_i8_signed_reg_reg:
2570 ; AVX512BW-FALLBACK:       # %bb.0:
2571 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2572 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2573 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtb %zmm1, %zmm0, %k1
2574 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2575 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} 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]
2576 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
2577 ; AVX512BW-FALLBACK-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
2578 ; AVX512BW-FALLBACK-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2579 ; AVX512BW-FALLBACK-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2580 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
2581 ; AVX512BW-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2582 ; 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
2583 ; 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
2584 ; AVX512BW-FALLBACK-NEXT:    vpmullw %zmm2, %zmm1, %zmm1
2585 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm1, %ymm1
2586 ; AVX512BW-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2587 ; AVX512BW-FALLBACK-NEXT:    retq
2589 ; AVX512VLBW-LABEL: vec256_i8_signed_reg_reg:
2590 ; AVX512VLBW:       # %bb.0:
2591 ; AVX512VLBW-NEXT:    vpcmpgtb %ymm1, %ymm0, %k1
2592 ; AVX512VLBW-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2593 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} 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]
2594 ; AVX512VLBW-NEXT:    vmovdqu8 %ymm2, %ymm3 {%k1}
2595 ; AVX512VLBW-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
2596 ; AVX512VLBW-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
2597 ; AVX512VLBW-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2598 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
2599 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2600 ; AVX512VLBW-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
2601 ; AVX512VLBW-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
2602 ; AVX512VLBW-NEXT:    vpmullw %zmm2, %zmm1, %zmm1
2603 ; AVX512VLBW-NEXT:    vpmovwb %zmm1, %ymm1
2604 ; AVX512VLBW-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2605 ; AVX512VLBW-NEXT:    retq
2606   %t3 = icmp sgt <32 x i8> %a1, %a2 ; signed
2607   %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>
2608   %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a1
2609   %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a2
2610   %t7 = sub <32 x i8> %t6, %t5
2611   %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>
2612   %t9 = mul nsw <32 x i8> %t8, %t4 ; signed
2613   %a10 = add nsw <32 x i8> %t9, %a1 ; signed
2614   ret <32 x i8> %a10
2617 define <32 x i8> @vec256_i8_unsigned_reg_reg(<32 x i8> %a1, <32 x i8> %a2) nounwind {
2618 ; AVX1-FALLBACK-LABEL: vec256_i8_unsigned_reg_reg:
2619 ; AVX1-FALLBACK:       # %bb.0:
2620 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm3
2621 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm2
2622 ; AVX1-FALLBACK-NEXT:    vpminub %xmm3, %xmm2, %xmm4
2623 ; AVX1-FALLBACK-NEXT:    vpcmpeqb %xmm4, %xmm2, %xmm5
2624 ; AVX1-FALLBACK-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
2625 ; AVX1-FALLBACK-NEXT:    vpxor %xmm6, %xmm5, %xmm8
2626 ; AVX1-FALLBACK-NEXT:    vpminub %xmm1, %xmm0, %xmm7
2627 ; AVX1-FALLBACK-NEXT:    vpcmpeqb %xmm7, %xmm0, %xmm5
2628 ; AVX1-FALLBACK-NEXT:    vpxor %xmm6, %xmm5, %xmm5
2629 ; AVX1-FALLBACK-NEXT:    vpmaxub %xmm3, %xmm2, %xmm3
2630 ; AVX1-FALLBACK-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
2631 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm7, %xmm1, %xmm1
2632 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm4, %xmm3, %xmm3
2633 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm3, %xmm3
2634 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
2635 ; AVX1-FALLBACK-NEXT:    vpand %xmm4, %xmm3, %xmm3
2636 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2637 ; AVX1-FALLBACK-NEXT:    vpand %xmm4, %xmm1, %xmm1
2638 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2639 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2640 ; AVX1-FALLBACK-NEXT:    vpor %xmm6, %xmm5, %xmm5
2641 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2642 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
2643 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm7 = [255,255,255,255,255,255,255,255]
2644 ; AVX1-FALLBACK-NEXT:    vpand %xmm7, %xmm4, %xmm4
2645 ; AVX1-FALLBACK-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
2646 ; AVX1-FALLBACK-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
2647 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
2648 ; AVX1-FALLBACK-NEXT:    vpand %xmm7, %xmm1, %xmm1
2649 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm4, %xmm1, %xmm1
2650 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
2651 ; AVX1-FALLBACK-NEXT:    vpor %xmm6, %xmm8, %xmm5
2652 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2653 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm6, %xmm4, %xmm4
2654 ; AVX1-FALLBACK-NEXT:    vpand %xmm7, %xmm4, %xmm4
2655 ; AVX1-FALLBACK-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
2656 ; AVX1-FALLBACK-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
2657 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm5, %xmm3, %xmm3
2658 ; AVX1-FALLBACK-NEXT:    vpand %xmm7, %xmm3, %xmm3
2659 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm4, %xmm3, %xmm3
2660 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm2, %xmm3, %xmm2
2661 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2662 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2663 ; AVX1-FALLBACK-NEXT:    retq
2665 ; AVX2-LABEL: vec256_i8_unsigned_reg_reg:
2666 ; AVX2:       # %bb.0:
2667 ; AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm2
2668 ; AVX2-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm3
2669 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
2670 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm3
2671 ; AVX2-NEXT:    vpor {{.*}}(%rip), %ymm3, %ymm3
2672 ; AVX2-NEXT:    vpmaxub %ymm1, %ymm0, %ymm1
2673 ; AVX2-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2674 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
2675 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2676 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
2677 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm3[8],ymm0[8],ymm3[9],ymm0[9],ymm3[10],ymm0[10],ymm3[11],ymm0[11],ymm3[12],ymm0[12],ymm3[13],ymm0[13],ymm3[14],ymm0[14],ymm3[15],ymm0[15],ymm3[24],ymm0[24],ymm3[25],ymm0[25],ymm3[26],ymm0[26],ymm3[27],ymm0[27],ymm3[28],ymm0[28],ymm3[29],ymm0[29],ymm3[30],ymm0[30],ymm3[31],ymm0[31]
2678 ; AVX2-NEXT:    vpmullw %ymm4, %ymm2, %ymm2
2679 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2680 ; AVX2-NEXT:    vpand %ymm4, %ymm2, %ymm2
2681 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
2682 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm3[0],ymm0[0],ymm3[1],ymm0[1],ymm3[2],ymm0[2],ymm3[3],ymm0[3],ymm3[4],ymm0[4],ymm3[5],ymm0[5],ymm3[6],ymm0[6],ymm3[7],ymm0[7],ymm3[16],ymm0[16],ymm3[17],ymm0[17],ymm3[18],ymm0[18],ymm3[19],ymm0[19],ymm3[20],ymm0[20],ymm3[21],ymm0[21],ymm3[22],ymm0[22],ymm3[23],ymm0[23]
2683 ; AVX2-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
2684 ; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1
2685 ; AVX2-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1
2686 ; AVX2-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2687 ; AVX2-NEXT:    retq
2689 ; XOP-FALLBACK-LABEL: vec256_i8_unsigned_reg_reg:
2690 ; XOP-FALLBACK:       # %bb.0:
2691 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm1, %xmm2
2692 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
2693 ; XOP-FALLBACK-NEXT:    vpcomgtub %xmm2, %xmm3, %xmm8
2694 ; XOP-FALLBACK-NEXT:    vpcomgtub %xmm1, %xmm0, %xmm5
2695 ; XOP-FALLBACK-NEXT:    vpminub %xmm2, %xmm3, %xmm6
2696 ; XOP-FALLBACK-NEXT:    vpminub %xmm1, %xmm0, %xmm7
2697 ; XOP-FALLBACK-NEXT:    vpmaxub %xmm2, %xmm3, %xmm2
2698 ; XOP-FALLBACK-NEXT:    vpsubb %xmm6, %xmm2, %xmm2
2699 ; XOP-FALLBACK-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
2700 ; XOP-FALLBACK-NEXT:    vpsubb %xmm7, %xmm1, %xmm1
2701 ; XOP-FALLBACK-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
2702 ; XOP-FALLBACK-NEXT:    vpshlb %xmm6, %xmm2, %xmm2
2703 ; XOP-FALLBACK-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
2704 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2705 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2706 ; XOP-FALLBACK-NEXT:    vpor %xmm7, %xmm5, %xmm5
2707 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2708 ; XOP-FALLBACK-NEXT:    vpmullw %xmm4, %xmm6, %xmm4
2709 ; XOP-FALLBACK-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
2710 ; XOP-FALLBACK-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
2711 ; XOP-FALLBACK-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
2712 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
2713 ; XOP-FALLBACK-NEXT:    vpperm %xmm5, %xmm4, %xmm1, %xmm1
2714 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2715 ; XOP-FALLBACK-NEXT:    vpor %xmm7, %xmm8, %xmm6
2716 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
2717 ; XOP-FALLBACK-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
2718 ; XOP-FALLBACK-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
2719 ; XOP-FALLBACK-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
2720 ; XOP-FALLBACK-NEXT:    vpmullw %xmm6, %xmm2, %xmm2
2721 ; XOP-FALLBACK-NEXT:    vpperm %xmm5, %xmm4, %xmm2, %xmm2
2722 ; XOP-FALLBACK-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
2723 ; XOP-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2724 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2725 ; XOP-FALLBACK-NEXT:    retq
2727 ; XOPAVX1-LABEL: vec256_i8_unsigned_reg_reg:
2728 ; XOPAVX1:       # %bb.0:
2729 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2730 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2731 ; XOPAVX1-NEXT:    vpcomgtub %xmm2, %xmm3, %xmm8
2732 ; XOPAVX1-NEXT:    vpcomgtub %xmm1, %xmm0, %xmm5
2733 ; XOPAVX1-NEXT:    vpminub %xmm2, %xmm3, %xmm6
2734 ; XOPAVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm7
2735 ; XOPAVX1-NEXT:    vpmaxub %xmm2, %xmm3, %xmm2
2736 ; XOPAVX1-NEXT:    vpsubb %xmm6, %xmm2, %xmm2
2737 ; XOPAVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
2738 ; XOPAVX1-NEXT:    vpsubb %xmm7, %xmm1, %xmm1
2739 ; XOPAVX1-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
2740 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm2, %xmm2
2741 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
2742 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2743 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2744 ; XOPAVX1-NEXT:    vpor %xmm7, %xmm5, %xmm5
2745 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2746 ; XOPAVX1-NEXT:    vpmullw %xmm4, %xmm6, %xmm4
2747 ; XOPAVX1-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
2748 ; XOPAVX1-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
2749 ; XOPAVX1-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
2750 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
2751 ; XOPAVX1-NEXT:    vpperm %xmm5, %xmm4, %xmm1, %xmm1
2752 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2753 ; XOPAVX1-NEXT:    vpor %xmm7, %xmm8, %xmm6
2754 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
2755 ; XOPAVX1-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
2756 ; XOPAVX1-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
2757 ; XOPAVX1-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
2758 ; XOPAVX1-NEXT:    vpmullw %xmm6, %xmm2, %xmm2
2759 ; XOPAVX1-NEXT:    vpperm %xmm5, %xmm4, %xmm2, %xmm2
2760 ; XOPAVX1-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
2761 ; XOPAVX1-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2762 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2763 ; XOPAVX1-NEXT:    retq
2765 ; AVX512F-LABEL: vec256_i8_unsigned_reg_reg:
2766 ; AVX512F:       # %bb.0:
2767 ; AVX512F-NEXT:    vpminub %ymm1, %ymm0, %ymm2
2768 ; AVX512F-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm3
2769 ; AVX512F-NEXT:    vpternlogq $15, %zmm3, %zmm3, %zmm3
2770 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %ymm3, %ymm3
2771 ; AVX512F-NEXT:    vpmaxub %ymm1, %ymm0, %ymm1
2772 ; AVX512F-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2773 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
2774 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2775 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
2776 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm3[8],ymm0[8],ymm3[9],ymm0[9],ymm3[10],ymm0[10],ymm3[11],ymm0[11],ymm3[12],ymm0[12],ymm3[13],ymm0[13],ymm3[14],ymm0[14],ymm3[15],ymm0[15],ymm3[24],ymm0[24],ymm3[25],ymm0[25],ymm3[26],ymm0[26],ymm3[27],ymm0[27],ymm3[28],ymm0[28],ymm3[29],ymm0[29],ymm3[30],ymm0[30],ymm3[31],ymm0[31]
2777 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm2, %ymm2
2778 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2779 ; AVX512F-NEXT:    vpand %ymm4, %ymm2, %ymm2
2780 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
2781 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm3[0],ymm0[0],ymm3[1],ymm0[1],ymm3[2],ymm0[2],ymm3[3],ymm0[3],ymm3[4],ymm0[4],ymm3[5],ymm0[5],ymm3[6],ymm0[6],ymm3[7],ymm0[7],ymm3[16],ymm0[16],ymm3[17],ymm0[17],ymm3[18],ymm0[18],ymm3[19],ymm0[19],ymm3[20],ymm0[20],ymm3[21],ymm0[21],ymm3[22],ymm0[22],ymm3[23],ymm0[23]
2782 ; AVX512F-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
2783 ; AVX512F-NEXT:    vpand %ymm4, %ymm1, %ymm1
2784 ; AVX512F-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1
2785 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2786 ; AVX512F-NEXT:    retq
2788 ; AVX512VL-FALLBACK-LABEL: vec256_i8_unsigned_reg_reg:
2789 ; AVX512VL-FALLBACK:       # %bb.0:
2790 ; AVX512VL-FALLBACK-NEXT:    vpminub %ymm1, %ymm0, %ymm2
2791 ; AVX512VL-FALLBACK-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm3
2792 ; AVX512VL-FALLBACK-NEXT:    vpternlogq $15, %ymm3, %ymm3, %ymm3
2793 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %ymm3, %ymm3
2794 ; AVX512VL-FALLBACK-NEXT:    vpmaxub %ymm1, %ymm0, %ymm1
2795 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2796 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
2797 ; AVX512VL-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2798 ; AVX512VL-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
2799 ; AVX512VL-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm3[8],ymm0[8],ymm3[9],ymm0[9],ymm3[10],ymm0[10],ymm3[11],ymm0[11],ymm3[12],ymm0[12],ymm3[13],ymm0[13],ymm3[14],ymm0[14],ymm3[15],ymm0[15],ymm3[24],ymm0[24],ymm3[25],ymm0[25],ymm3[26],ymm0[26],ymm3[27],ymm0[27],ymm3[28],ymm0[28],ymm3[29],ymm0[29],ymm3[30],ymm0[30],ymm3[31],ymm0[31]
2800 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm4, %ymm2, %ymm2
2801 ; AVX512VL-FALLBACK-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2802 ; AVX512VL-FALLBACK-NEXT:    vpand %ymm4, %ymm2, %ymm2
2803 ; AVX512VL-FALLBACK-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
2804 ; AVX512VL-FALLBACK-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm3[0],ymm0[0],ymm3[1],ymm0[1],ymm3[2],ymm0[2],ymm3[3],ymm0[3],ymm3[4],ymm0[4],ymm3[5],ymm0[5],ymm3[6],ymm0[6],ymm3[7],ymm0[7],ymm3[16],ymm0[16],ymm3[17],ymm0[17],ymm3[18],ymm0[18],ymm3[19],ymm0[19],ymm3[20],ymm0[20],ymm3[21],ymm0[21],ymm3[22],ymm0[22],ymm3[23],ymm0[23]
2805 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
2806 ; AVX512VL-FALLBACK-NEXT:    vpand %ymm4, %ymm1, %ymm1
2807 ; AVX512VL-FALLBACK-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1
2808 ; AVX512VL-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2809 ; AVX512VL-FALLBACK-NEXT:    retq
2811 ; AVX512BW-FALLBACK-LABEL: vec256_i8_unsigned_reg_reg:
2812 ; AVX512BW-FALLBACK:       # %bb.0:
2813 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2814 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2815 ; AVX512BW-FALLBACK-NEXT:    vpcmpnleub %zmm1, %zmm0, %k1
2816 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2817 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} 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]
2818 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
2819 ; AVX512BW-FALLBACK-NEXT:    vpminub %ymm1, %ymm0, %ymm2
2820 ; AVX512BW-FALLBACK-NEXT:    vpmaxub %ymm1, %ymm0, %ymm1
2821 ; AVX512BW-FALLBACK-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2822 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
2823 ; AVX512BW-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2824 ; 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
2825 ; 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
2826 ; AVX512BW-FALLBACK-NEXT:    vpmullw %zmm2, %zmm1, %zmm1
2827 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm1, %ymm1
2828 ; AVX512BW-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2829 ; AVX512BW-FALLBACK-NEXT:    retq
2831 ; AVX512VLBW-LABEL: vec256_i8_unsigned_reg_reg:
2832 ; AVX512VLBW:       # %bb.0:
2833 ; AVX512VLBW-NEXT:    vpcmpnleub %ymm1, %ymm0, %k1
2834 ; AVX512VLBW-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
2835 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} 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]
2836 ; AVX512VLBW-NEXT:    vmovdqu8 %ymm2, %ymm3 {%k1}
2837 ; AVX512VLBW-NEXT:    vpminub %ymm1, %ymm0, %ymm2
2838 ; AVX512VLBW-NEXT:    vpmaxub %ymm1, %ymm0, %ymm1
2839 ; AVX512VLBW-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
2840 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
2841 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2842 ; AVX512VLBW-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
2843 ; AVX512VLBW-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
2844 ; AVX512VLBW-NEXT:    vpmullw %zmm2, %zmm1, %zmm1
2845 ; AVX512VLBW-NEXT:    vpmovwb %zmm1, %ymm1
2846 ; AVX512VLBW-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
2847 ; AVX512VLBW-NEXT:    retq
2848   %t3 = icmp ugt <32 x i8> %a1, %a2
2849   %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>
2850   %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a1
2851   %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a2
2852   %t7 = sub <32 x i8> %t6, %t5
2853   %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>
2854   %t9 = mul <32 x i8> %t8, %t4
2855   %a10 = add <32 x i8> %t9, %a1
2856   ret <32 x i8> %a10
2859 ; Values are loaded. Only check signed case.
2861 define <32 x i8> @vec256_i8_signed_mem_reg(<32 x i8>* %a1_addr, <32 x i8> %a2) nounwind {
2862 ; AVX1-FALLBACK-LABEL: vec256_i8_signed_mem_reg:
2863 ; AVX1-FALLBACK:       # %bb.0:
2864 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
2865 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
2866 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm2
2867 ; AVX1-FALLBACK-NEXT:    vpcmpgtb %xmm3, %xmm2, %xmm8
2868 ; AVX1-FALLBACK-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm5
2869 ; AVX1-FALLBACK-NEXT:    vpminsb %xmm3, %xmm2, %xmm6
2870 ; AVX1-FALLBACK-NEXT:    vpminsb %xmm0, %xmm1, %xmm7
2871 ; AVX1-FALLBACK-NEXT:    vpmaxsb %xmm3, %xmm2, %xmm3
2872 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm6, %xmm3, %xmm3
2873 ; AVX1-FALLBACK-NEXT:    vpmaxsb %xmm0, %xmm1, %xmm0
2874 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm7, %xmm0, %xmm0
2875 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm3, %xmm3
2876 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
2877 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm3, %xmm3
2878 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm0, %xmm0
2879 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm0, %xmm0
2880 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2881 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2882 ; AVX1-FALLBACK-NEXT:    vpor %xmm7, %xmm5, %xmm5
2883 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2884 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm4, %xmm6, %xmm4
2885 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255]
2886 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm4, %xmm4
2887 ; AVX1-FALLBACK-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
2888 ; AVX1-FALLBACK-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
2889 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm5, %xmm0, %xmm0
2890 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm0, %xmm0
2891 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm4, %xmm0, %xmm0
2892 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
2893 ; AVX1-FALLBACK-NEXT:    vpor %xmm7, %xmm8, %xmm5
2894 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2895 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
2896 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm4, %xmm4
2897 ; AVX1-FALLBACK-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
2898 ; AVX1-FALLBACK-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
2899 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm5, %xmm3, %xmm3
2900 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm3, %xmm3
2901 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm4, %xmm3, %xmm3
2902 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm2, %xmm3, %xmm2
2903 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
2904 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2905 ; AVX1-FALLBACK-NEXT:    retq
2907 ; AVX2-LABEL: vec256_i8_signed_mem_reg:
2908 ; AVX2:       # %bb.0:
2909 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
2910 ; AVX2-NEXT:    vpcmpgtb %ymm0, %ymm1, %ymm2
2911 ; AVX2-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
2912 ; AVX2-NEXT:    vpminsb %ymm0, %ymm1, %ymm3
2913 ; AVX2-NEXT:    vpmaxsb %ymm0, %ymm1, %ymm0
2914 ; AVX2-NEXT:    vpsubb %ymm3, %ymm0, %ymm0
2915 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm0
2916 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
2917 ; 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]
2918 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
2919 ; AVX2-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
2920 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2921 ; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm3
2922 ; 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]
2923 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
2924 ; AVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
2925 ; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
2926 ; AVX2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
2927 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
2928 ; AVX2-NEXT:    retq
2930 ; XOP-FALLBACK-LABEL: vec256_i8_signed_mem_reg:
2931 ; XOP-FALLBACK:       # %bb.0:
2932 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm2
2933 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
2934 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm3
2935 ; XOP-FALLBACK-NEXT:    vpcomgtb %xmm2, %xmm3, %xmm8
2936 ; XOP-FALLBACK-NEXT:    vpcomgtb %xmm0, %xmm1, %xmm5
2937 ; XOP-FALLBACK-NEXT:    vpminsb %xmm2, %xmm3, %xmm6
2938 ; XOP-FALLBACK-NEXT:    vpminsb %xmm0, %xmm1, %xmm7
2939 ; XOP-FALLBACK-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
2940 ; XOP-FALLBACK-NEXT:    vpsubb %xmm6, %xmm2, %xmm2
2941 ; XOP-FALLBACK-NEXT:    vpmaxsb %xmm0, %xmm1, %xmm0
2942 ; XOP-FALLBACK-NEXT:    vpsubb %xmm7, %xmm0, %xmm0
2943 ; XOP-FALLBACK-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
2944 ; XOP-FALLBACK-NEXT:    vpshlb %xmm6, %xmm2, %xmm2
2945 ; XOP-FALLBACK-NEXT:    vpshlb %xmm6, %xmm0, %xmm0
2946 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2947 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2948 ; XOP-FALLBACK-NEXT:    vpor %xmm7, %xmm5, %xmm5
2949 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2950 ; XOP-FALLBACK-NEXT:    vpmullw %xmm4, %xmm6, %xmm4
2951 ; XOP-FALLBACK-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
2952 ; XOP-FALLBACK-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
2953 ; XOP-FALLBACK-NEXT:    vpmullw %xmm5, %xmm0, %xmm0
2954 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
2955 ; XOP-FALLBACK-NEXT:    vpperm %xmm5, %xmm4, %xmm0, %xmm0
2956 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2957 ; XOP-FALLBACK-NEXT:    vpor %xmm7, %xmm8, %xmm6
2958 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
2959 ; XOP-FALLBACK-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
2960 ; XOP-FALLBACK-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
2961 ; XOP-FALLBACK-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
2962 ; XOP-FALLBACK-NEXT:    vpmullw %xmm6, %xmm2, %xmm2
2963 ; XOP-FALLBACK-NEXT:    vpperm %xmm5, %xmm4, %xmm2, %xmm2
2964 ; XOP-FALLBACK-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
2965 ; XOP-FALLBACK-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
2966 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2967 ; XOP-FALLBACK-NEXT:    retq
2969 ; XOPAVX1-LABEL: vec256_i8_signed_mem_reg:
2970 ; XOPAVX1:       # %bb.0:
2971 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2972 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm1
2973 ; XOPAVX1-NEXT:    vmovdqa 16(%rdi), %xmm3
2974 ; XOPAVX1-NEXT:    vpcomgtb %xmm2, %xmm3, %xmm8
2975 ; XOPAVX1-NEXT:    vpcomgtb %xmm0, %xmm1, %xmm5
2976 ; XOPAVX1-NEXT:    vpminsb %xmm2, %xmm3, %xmm6
2977 ; XOPAVX1-NEXT:    vpminsb %xmm0, %xmm1, %xmm7
2978 ; XOPAVX1-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
2979 ; XOPAVX1-NEXT:    vpsubb %xmm6, %xmm2, %xmm2
2980 ; XOPAVX1-NEXT:    vpmaxsb %xmm0, %xmm1, %xmm0
2981 ; XOPAVX1-NEXT:    vpsubb %xmm7, %xmm0, %xmm0
2982 ; XOPAVX1-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
2983 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm2, %xmm2
2984 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm0, %xmm0
2985 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2986 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2987 ; XOPAVX1-NEXT:    vpor %xmm7, %xmm5, %xmm5
2988 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2989 ; XOPAVX1-NEXT:    vpmullw %xmm4, %xmm6, %xmm4
2990 ; XOPAVX1-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
2991 ; XOPAVX1-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
2992 ; XOPAVX1-NEXT:    vpmullw %xmm5, %xmm0, %xmm0
2993 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
2994 ; XOPAVX1-NEXT:    vpperm %xmm5, %xmm4, %xmm0, %xmm0
2995 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2996 ; XOPAVX1-NEXT:    vpor %xmm7, %xmm8, %xmm6
2997 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
2998 ; XOPAVX1-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
2999 ; XOPAVX1-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
3000 ; XOPAVX1-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
3001 ; XOPAVX1-NEXT:    vpmullw %xmm6, %xmm2, %xmm2
3002 ; XOPAVX1-NEXT:    vpperm %xmm5, %xmm4, %xmm2, %xmm2
3003 ; XOPAVX1-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
3004 ; XOPAVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
3005 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
3006 ; XOPAVX1-NEXT:    retq
3008 ; AVX512F-LABEL: vec256_i8_signed_mem_reg:
3009 ; AVX512F:       # %bb.0:
3010 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm1
3011 ; AVX512F-NEXT:    vpcmpgtb %ymm0, %ymm1, %ymm2
3012 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
3013 ; AVX512F-NEXT:    vpminsb %ymm0, %ymm1, %ymm3
3014 ; AVX512F-NEXT:    vpmaxsb %ymm0, %ymm1, %ymm0
3015 ; AVX512F-NEXT:    vpsubb %ymm3, %ymm0, %ymm0
3016 ; AVX512F-NEXT:    vpsrlw $1, %ymm0, %ymm0
3017 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
3018 ; 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]
3019 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
3020 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
3021 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3022 ; AVX512F-NEXT:    vpand %ymm4, %ymm3, %ymm3
3023 ; 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]
3024 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
3025 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
3026 ; AVX512F-NEXT:    vpand %ymm4, %ymm0, %ymm0
3027 ; AVX512F-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
3028 ; AVX512F-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
3029 ; AVX512F-NEXT:    retq
3031 ; AVX512VL-FALLBACK-LABEL: vec256_i8_signed_mem_reg:
3032 ; AVX512VL-FALLBACK:       # %bb.0:
3033 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
3034 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtb %ymm0, %ymm1, %ymm2
3035 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
3036 ; AVX512VL-FALLBACK-NEXT:    vpminsb %ymm0, %ymm1, %ymm3
3037 ; AVX512VL-FALLBACK-NEXT:    vpmaxsb %ymm0, %ymm1, %ymm0
3038 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm3, %ymm0, %ymm0
3039 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm0, %ymm0
3040 ; AVX512VL-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
3041 ; AVX512VL-FALLBACK-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]
3042 ; AVX512VL-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
3043 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
3044 ; AVX512VL-FALLBACK-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3045 ; AVX512VL-FALLBACK-NEXT:    vpand %ymm4, %ymm3, %ymm3
3046 ; AVX512VL-FALLBACK-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]
3047 ; AVX512VL-FALLBACK-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
3048 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
3049 ; AVX512VL-FALLBACK-NEXT:    vpand %ymm4, %ymm0, %ymm0
3050 ; AVX512VL-FALLBACK-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
3051 ; AVX512VL-FALLBACK-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
3052 ; AVX512VL-FALLBACK-NEXT:    retq
3054 ; AVX512BW-FALLBACK-LABEL: vec256_i8_signed_mem_reg:
3055 ; AVX512BW-FALLBACK:       # %bb.0:
3056 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3057 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
3058 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtb %zmm0, %zmm1, %k1
3059 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
3060 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} 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]
3061 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
3062 ; AVX512BW-FALLBACK-NEXT:    vpminsb %ymm0, %ymm1, %ymm2
3063 ; AVX512BW-FALLBACK-NEXT:    vpmaxsb %ymm0, %ymm1, %ymm0
3064 ; AVX512BW-FALLBACK-NEXT:    vpsubb %ymm2, %ymm0, %ymm0
3065 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm0, %ymm0
3066 ; AVX512BW-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
3067 ; 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
3068 ; 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
3069 ; AVX512BW-FALLBACK-NEXT:    vpmullw %zmm2, %zmm0, %zmm0
3070 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm0, %ymm0
3071 ; AVX512BW-FALLBACK-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
3072 ; AVX512BW-FALLBACK-NEXT:    retq
3074 ; AVX512VLBW-LABEL: vec256_i8_signed_mem_reg:
3075 ; AVX512VLBW:       # %bb.0:
3076 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %ymm1
3077 ; AVX512VLBW-NEXT:    vpcmpgtb %ymm0, %ymm1, %k1
3078 ; AVX512VLBW-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
3079 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} 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]
3080 ; AVX512VLBW-NEXT:    vmovdqu8 %ymm2, %ymm3 {%k1}
3081 ; AVX512VLBW-NEXT:    vpminsb %ymm0, %ymm1, %ymm2
3082 ; AVX512VLBW-NEXT:    vpmaxsb %ymm0, %ymm1, %ymm0
3083 ; AVX512VLBW-NEXT:    vpsubb %ymm2, %ymm0, %ymm0
3084 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm0, %ymm0
3085 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
3086 ; AVX512VLBW-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
3087 ; AVX512VLBW-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
3088 ; AVX512VLBW-NEXT:    vpmullw %zmm2, %zmm0, %zmm0
3089 ; AVX512VLBW-NEXT:    vpmovwb %zmm0, %ymm0
3090 ; AVX512VLBW-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
3091 ; AVX512VLBW-NEXT:    retq
3092   %a1 = load <32 x i8>, <32 x i8>* %a1_addr
3093   %t3 = icmp sgt <32 x i8> %a1, %a2 ; signed
3094   %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>
3095   %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a1
3096   %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a2
3097   %t7 = sub <32 x i8> %t6, %t5
3098   %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>
3099   %t9 = mul nsw <32 x i8> %t8, %t4 ; signed
3100   %a10 = add nsw <32 x i8> %t9, %a1 ; signed
3101   ret <32 x i8> %a10
3104 define <32 x i8> @vec256_i8_signed_reg_mem(<32 x i8> %a1, <32 x i8>* %a2_addr) nounwind {
3105 ; AVX1-FALLBACK-LABEL: vec256_i8_signed_reg_mem:
3106 ; AVX1-FALLBACK:       # %bb.0:
3107 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm2
3108 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm3
3109 ; AVX1-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm1
3110 ; AVX1-FALLBACK-NEXT:    vpcmpgtb %xmm3, %xmm1, %xmm8
3111 ; AVX1-FALLBACK-NEXT:    vpcmpgtb %xmm2, %xmm0, %xmm5
3112 ; AVX1-FALLBACK-NEXT:    vpminsb %xmm3, %xmm1, %xmm6
3113 ; AVX1-FALLBACK-NEXT:    vpminsb %xmm2, %xmm0, %xmm7
3114 ; AVX1-FALLBACK-NEXT:    vpmaxsb %xmm3, %xmm1, %xmm3
3115 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm6, %xmm3, %xmm3
3116 ; AVX1-FALLBACK-NEXT:    vpmaxsb %xmm2, %xmm0, %xmm2
3117 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm7, %xmm2, %xmm2
3118 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm3, %xmm3
3119 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
3120 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm3, %xmm3
3121 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm2, %xmm2
3122 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm2, %xmm2
3123 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
3124 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3125 ; AVX1-FALLBACK-NEXT:    vpor %xmm7, %xmm5, %xmm5
3126 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
3127 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm4, %xmm6, %xmm4
3128 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255]
3129 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm4, %xmm4
3130 ; AVX1-FALLBACK-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
3131 ; AVX1-FALLBACK-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
3132 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm5, %xmm2, %xmm2
3133 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm2, %xmm2
3134 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm4, %xmm2, %xmm2
3135 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
3136 ; AVX1-FALLBACK-NEXT:    vpor %xmm7, %xmm8, %xmm5
3137 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
3138 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
3139 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm4, %xmm4
3140 ; AVX1-FALLBACK-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
3141 ; AVX1-FALLBACK-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
3142 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm5, %xmm3, %xmm3
3143 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm3, %xmm3
3144 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm4, %xmm3, %xmm3
3145 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm1, %xmm3, %xmm1
3146 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
3147 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3148 ; AVX1-FALLBACK-NEXT:    retq
3150 ; AVX2-LABEL: vec256_i8_signed_reg_mem:
3151 ; AVX2:       # %bb.0:
3152 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm1
3153 ; AVX2-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
3154 ; AVX2-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
3155 ; AVX2-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
3156 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
3157 ; AVX2-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
3158 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
3159 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3160 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
3161 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
3162 ; AVX2-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
3163 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3164 ; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm3
3165 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
3166 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
3167 ; AVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3168 ; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1
3169 ; AVX2-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
3170 ; AVX2-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
3171 ; AVX2-NEXT:    retq
3173 ; XOP-FALLBACK-LABEL: vec256_i8_signed_reg_mem:
3174 ; XOP-FALLBACK:       # %bb.0:
3175 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
3176 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm2
3177 ; XOP-FALLBACK-NEXT:    vextractf128 $1, %ymm0, %xmm3
3178 ; XOP-FALLBACK-NEXT:    vpcomgtb %xmm2, %xmm3, %xmm8
3179 ; XOP-FALLBACK-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm5
3180 ; XOP-FALLBACK-NEXT:    vpminsb %xmm2, %xmm3, %xmm6
3181 ; XOP-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm7
3182 ; XOP-FALLBACK-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
3183 ; XOP-FALLBACK-NEXT:    vpsubb %xmm6, %xmm2, %xmm2
3184 ; XOP-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3185 ; XOP-FALLBACK-NEXT:    vpsubb %xmm7, %xmm1, %xmm1
3186 ; XOP-FALLBACK-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
3187 ; XOP-FALLBACK-NEXT:    vpshlb %xmm6, %xmm2, %xmm2
3188 ; XOP-FALLBACK-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
3189 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
3190 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3191 ; XOP-FALLBACK-NEXT:    vpor %xmm7, %xmm5, %xmm5
3192 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
3193 ; XOP-FALLBACK-NEXT:    vpmullw %xmm4, %xmm6, %xmm4
3194 ; XOP-FALLBACK-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
3195 ; XOP-FALLBACK-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
3196 ; XOP-FALLBACK-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
3197 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
3198 ; XOP-FALLBACK-NEXT:    vpperm %xmm5, %xmm4, %xmm1, %xmm1
3199 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
3200 ; XOP-FALLBACK-NEXT:    vpor %xmm7, %xmm8, %xmm6
3201 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
3202 ; XOP-FALLBACK-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
3203 ; XOP-FALLBACK-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
3204 ; XOP-FALLBACK-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
3205 ; XOP-FALLBACK-NEXT:    vpmullw %xmm6, %xmm2, %xmm2
3206 ; XOP-FALLBACK-NEXT:    vpperm %xmm5, %xmm4, %xmm2, %xmm2
3207 ; XOP-FALLBACK-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
3208 ; XOP-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3209 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
3210 ; XOP-FALLBACK-NEXT:    retq
3212 ; XOPAVX1-LABEL: vec256_i8_signed_reg_mem:
3213 ; XOPAVX1:       # %bb.0:
3214 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm1
3215 ; XOPAVX1-NEXT:    vmovdqa 16(%rdi), %xmm2
3216 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
3217 ; XOPAVX1-NEXT:    vpcomgtb %xmm2, %xmm3, %xmm8
3218 ; XOPAVX1-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm5
3219 ; XOPAVX1-NEXT:    vpminsb %xmm2, %xmm3, %xmm6
3220 ; XOPAVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm7
3221 ; XOPAVX1-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
3222 ; XOPAVX1-NEXT:    vpsubb %xmm6, %xmm2, %xmm2
3223 ; XOPAVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3224 ; XOPAVX1-NEXT:    vpsubb %xmm7, %xmm1, %xmm1
3225 ; XOPAVX1-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
3226 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm2, %xmm2
3227 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
3228 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
3229 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3230 ; XOPAVX1-NEXT:    vpor %xmm7, %xmm5, %xmm5
3231 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
3232 ; XOPAVX1-NEXT:    vpmullw %xmm4, %xmm6, %xmm4
3233 ; XOPAVX1-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
3234 ; XOPAVX1-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
3235 ; XOPAVX1-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
3236 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
3237 ; XOPAVX1-NEXT:    vpperm %xmm5, %xmm4, %xmm1, %xmm1
3238 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
3239 ; XOPAVX1-NEXT:    vpor %xmm7, %xmm8, %xmm6
3240 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
3241 ; XOPAVX1-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
3242 ; XOPAVX1-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
3243 ; XOPAVX1-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
3244 ; XOPAVX1-NEXT:    vpmullw %xmm6, %xmm2, %xmm2
3245 ; XOPAVX1-NEXT:    vpperm %xmm5, %xmm4, %xmm2, %xmm2
3246 ; XOPAVX1-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
3247 ; XOPAVX1-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3248 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
3249 ; XOPAVX1-NEXT:    retq
3251 ; AVX512F-LABEL: vec256_i8_signed_reg_mem:
3252 ; AVX512F:       # %bb.0:
3253 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm1
3254 ; AVX512F-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
3255 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
3256 ; AVX512F-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
3257 ; AVX512F-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
3258 ; AVX512F-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
3259 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
3260 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3261 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
3262 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
3263 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
3264 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3265 ; AVX512F-NEXT:    vpand %ymm4, %ymm3, %ymm3
3266 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
3267 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
3268 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3269 ; AVX512F-NEXT:    vpand %ymm4, %ymm1, %ymm1
3270 ; AVX512F-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
3271 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
3272 ; AVX512F-NEXT:    retq
3274 ; AVX512VL-FALLBACK-LABEL: vec256_i8_signed_reg_mem:
3275 ; AVX512VL-FALLBACK:       # %bb.0:
3276 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
3277 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
3278 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
3279 ; AVX512VL-FALLBACK-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
3280 ; AVX512VL-FALLBACK-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
3281 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
3282 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
3283 ; AVX512VL-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3284 ; AVX512VL-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
3285 ; AVX512VL-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
3286 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
3287 ; AVX512VL-FALLBACK-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3288 ; AVX512VL-FALLBACK-NEXT:    vpand %ymm4, %ymm3, %ymm3
3289 ; AVX512VL-FALLBACK-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
3290 ; AVX512VL-FALLBACK-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
3291 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3292 ; AVX512VL-FALLBACK-NEXT:    vpand %ymm4, %ymm1, %ymm1
3293 ; AVX512VL-FALLBACK-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
3294 ; AVX512VL-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
3295 ; AVX512VL-FALLBACK-NEXT:    retq
3297 ; AVX512BW-FALLBACK-LABEL: vec256_i8_signed_reg_mem:
3298 ; AVX512BW-FALLBACK:       # %bb.0:
3299 ; AVX512BW-FALLBACK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3300 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm1
3301 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtb %zmm1, %zmm0, %k1
3302 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
3303 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} 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]
3304 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
3305 ; AVX512BW-FALLBACK-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
3306 ; AVX512BW-FALLBACK-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
3307 ; AVX512BW-FALLBACK-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
3308 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
3309 ; AVX512BW-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3310 ; 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
3311 ; 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
3312 ; AVX512BW-FALLBACK-NEXT:    vpmullw %zmm2, %zmm1, %zmm1
3313 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm1, %ymm1
3314 ; AVX512BW-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
3315 ; AVX512BW-FALLBACK-NEXT:    retq
3317 ; AVX512VLBW-LABEL: vec256_i8_signed_reg_mem:
3318 ; AVX512VLBW:       # %bb.0:
3319 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %ymm1
3320 ; AVX512VLBW-NEXT:    vpcmpgtb %ymm1, %ymm0, %k1
3321 ; AVX512VLBW-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
3322 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} 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]
3323 ; AVX512VLBW-NEXT:    vmovdqu8 %ymm2, %ymm3 {%k1}
3324 ; AVX512VLBW-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
3325 ; AVX512VLBW-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
3326 ; AVX512VLBW-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
3327 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
3328 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3329 ; AVX512VLBW-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
3330 ; AVX512VLBW-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
3331 ; AVX512VLBW-NEXT:    vpmullw %zmm2, %zmm1, %zmm1
3332 ; AVX512VLBW-NEXT:    vpmovwb %zmm1, %ymm1
3333 ; AVX512VLBW-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
3334 ; AVX512VLBW-NEXT:    retq
3335   %a2 = load <32 x i8>, <32 x i8>* %a2_addr
3336   %t3 = icmp sgt <32 x i8> %a1, %a2 ; signed
3337   %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>
3338   %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a1
3339   %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a2
3340   %t7 = sub <32 x i8> %t6, %t5
3341   %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>
3342   %t9 = mul nsw <32 x i8> %t8, %t4 ; signed
3343   %a10 = add nsw <32 x i8> %t9, %a1 ; signed
3344   ret <32 x i8> %a10
3347 define <32 x i8> @vec256_i8_signed_mem_mem(<32 x i8>* %a1_addr, <32 x i8>* %a2_addr) nounwind {
3348 ; AVX1-FALLBACK-LABEL: vec256_i8_signed_mem_mem:
3349 ; AVX1-FALLBACK:       # %bb.0:
3350 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm2
3351 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rsi), %xmm3
3352 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
3353 ; AVX1-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm1
3354 ; AVX1-FALLBACK-NEXT:    vpcmpgtb %xmm3, %xmm1, %xmm8
3355 ; AVX1-FALLBACK-NEXT:    vpcmpgtb %xmm2, %xmm0, %xmm5
3356 ; AVX1-FALLBACK-NEXT:    vpminsb %xmm3, %xmm1, %xmm6
3357 ; AVX1-FALLBACK-NEXT:    vpminsb %xmm2, %xmm0, %xmm7
3358 ; AVX1-FALLBACK-NEXT:    vpmaxsb %xmm3, %xmm1, %xmm3
3359 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm6, %xmm3, %xmm3
3360 ; AVX1-FALLBACK-NEXT:    vpmaxsb %xmm2, %xmm0, %xmm2
3361 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm7, %xmm2, %xmm2
3362 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm3, %xmm3
3363 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
3364 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm3, %xmm3
3365 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm2, %xmm2
3366 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm2, %xmm2
3367 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
3368 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3369 ; AVX1-FALLBACK-NEXT:    vpor %xmm7, %xmm5, %xmm5
3370 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
3371 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm4, %xmm6, %xmm4
3372 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255]
3373 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm4, %xmm4
3374 ; AVX1-FALLBACK-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
3375 ; AVX1-FALLBACK-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
3376 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm5, %xmm2, %xmm2
3377 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm2, %xmm2
3378 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm4, %xmm2, %xmm2
3379 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
3380 ; AVX1-FALLBACK-NEXT:    vpor %xmm7, %xmm8, %xmm5
3381 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
3382 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
3383 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm4, %xmm4
3384 ; AVX1-FALLBACK-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
3385 ; AVX1-FALLBACK-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
3386 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm5, %xmm3, %xmm3
3387 ; AVX1-FALLBACK-NEXT:    vpand %xmm6, %xmm3, %xmm3
3388 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm4, %xmm3, %xmm3
3389 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm1, %xmm3, %xmm1
3390 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
3391 ; AVX1-FALLBACK-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3392 ; AVX1-FALLBACK-NEXT:    retq
3394 ; AVX2-LABEL: vec256_i8_signed_mem_mem:
3395 ; AVX2:       # %bb.0:
3396 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3397 ; AVX2-NEXT:    vmovdqa (%rsi), %ymm1
3398 ; AVX2-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
3399 ; AVX2-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
3400 ; AVX2-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
3401 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
3402 ; AVX2-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
3403 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
3404 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3405 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
3406 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
3407 ; AVX2-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
3408 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3409 ; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm3
3410 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
3411 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
3412 ; AVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3413 ; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1
3414 ; AVX2-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
3415 ; AVX2-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
3416 ; AVX2-NEXT:    retq
3418 ; XOP-FALLBACK-LABEL: vec256_i8_signed_mem_mem:
3419 ; XOP-FALLBACK:       # %bb.0:
3420 ; XOP-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm0
3421 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rsi), %xmm1
3422 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm2
3423 ; XOP-FALLBACK-NEXT:    vmovdqa 16(%rdi), %xmm3
3424 ; XOP-FALLBACK-NEXT:    vpcomgtb %xmm1, %xmm3, %xmm8
3425 ; XOP-FALLBACK-NEXT:    vpcomgtb %xmm0, %xmm2, %xmm5
3426 ; XOP-FALLBACK-NEXT:    vpminsb %xmm1, %xmm3, %xmm6
3427 ; XOP-FALLBACK-NEXT:    vpminsb %xmm0, %xmm2, %xmm7
3428 ; XOP-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm3, %xmm1
3429 ; XOP-FALLBACK-NEXT:    vpsubb %xmm6, %xmm1, %xmm1
3430 ; XOP-FALLBACK-NEXT:    vpmaxsb %xmm0, %xmm2, %xmm0
3431 ; XOP-FALLBACK-NEXT:    vpsubb %xmm7, %xmm0, %xmm0
3432 ; XOP-FALLBACK-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
3433 ; XOP-FALLBACK-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
3434 ; XOP-FALLBACK-NEXT:    vpshlb %xmm6, %xmm0, %xmm0
3435 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3436 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3437 ; XOP-FALLBACK-NEXT:    vpor %xmm7, %xmm5, %xmm5
3438 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
3439 ; XOP-FALLBACK-NEXT:    vpmullw %xmm4, %xmm6, %xmm4
3440 ; XOP-FALLBACK-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
3441 ; XOP-FALLBACK-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
3442 ; XOP-FALLBACK-NEXT:    vpmullw %xmm5, %xmm0, %xmm0
3443 ; XOP-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
3444 ; XOP-FALLBACK-NEXT:    vpperm %xmm5, %xmm4, %xmm0, %xmm0
3445 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
3446 ; XOP-FALLBACK-NEXT:    vpor %xmm7, %xmm8, %xmm6
3447 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
3448 ; XOP-FALLBACK-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
3449 ; XOP-FALLBACK-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
3450 ; XOP-FALLBACK-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
3451 ; XOP-FALLBACK-NEXT:    vpmullw %xmm6, %xmm1, %xmm1
3452 ; XOP-FALLBACK-NEXT:    vpperm %xmm5, %xmm4, %xmm1, %xmm1
3453 ; XOP-FALLBACK-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
3454 ; XOP-FALLBACK-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
3455 ; XOP-FALLBACK-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3456 ; XOP-FALLBACK-NEXT:    retq
3458 ; XOPAVX1-LABEL: vec256_i8_signed_mem_mem:
3459 ; XOPAVX1:       # %bb.0:
3460 ; XOPAVX1-NEXT:    vmovdqa (%rsi), %xmm0
3461 ; XOPAVX1-NEXT:    vmovdqa 16(%rsi), %xmm1
3462 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm2
3463 ; XOPAVX1-NEXT:    vmovdqa 16(%rdi), %xmm3
3464 ; XOPAVX1-NEXT:    vpcomgtb %xmm1, %xmm3, %xmm8
3465 ; XOPAVX1-NEXT:    vpcomgtb %xmm0, %xmm2, %xmm5
3466 ; XOPAVX1-NEXT:    vpminsb %xmm1, %xmm3, %xmm6
3467 ; XOPAVX1-NEXT:    vpminsb %xmm0, %xmm2, %xmm7
3468 ; XOPAVX1-NEXT:    vpmaxsb %xmm1, %xmm3, %xmm1
3469 ; XOPAVX1-NEXT:    vpsubb %xmm6, %xmm1, %xmm1
3470 ; XOPAVX1-NEXT:    vpmaxsb %xmm0, %xmm2, %xmm0
3471 ; XOPAVX1-NEXT:    vpsubb %xmm7, %xmm0, %xmm0
3472 ; XOPAVX1-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
3473 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
3474 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm0, %xmm0
3475 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3476 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3477 ; XOPAVX1-NEXT:    vpor %xmm7, %xmm5, %xmm5
3478 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
3479 ; XOPAVX1-NEXT:    vpmullw %xmm4, %xmm6, %xmm4
3480 ; XOPAVX1-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
3481 ; XOPAVX1-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
3482 ; XOPAVX1-NEXT:    vpmullw %xmm5, %xmm0, %xmm0
3483 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
3484 ; XOPAVX1-NEXT:    vpperm %xmm5, %xmm4, %xmm0, %xmm0
3485 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
3486 ; XOPAVX1-NEXT:    vpor %xmm7, %xmm8, %xmm6
3487 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
3488 ; XOPAVX1-NEXT:    vpmullw %xmm7, %xmm4, %xmm4
3489 ; XOPAVX1-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
3490 ; XOPAVX1-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
3491 ; XOPAVX1-NEXT:    vpmullw %xmm6, %xmm1, %xmm1
3492 ; XOPAVX1-NEXT:    vpperm %xmm5, %xmm4, %xmm1, %xmm1
3493 ; XOPAVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
3494 ; XOPAVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
3495 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3496 ; XOPAVX1-NEXT:    retq
3498 ; AVX512F-LABEL: vec256_i8_signed_mem_mem:
3499 ; AVX512F:       # %bb.0:
3500 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
3501 ; AVX512F-NEXT:    vmovdqa (%rsi), %ymm1
3502 ; AVX512F-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
3503 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
3504 ; AVX512F-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
3505 ; AVX512F-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
3506 ; AVX512F-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
3507 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
3508 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3509 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
3510 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
3511 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
3512 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3513 ; AVX512F-NEXT:    vpand %ymm4, %ymm3, %ymm3
3514 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
3515 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
3516 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3517 ; AVX512F-NEXT:    vpand %ymm4, %ymm1, %ymm1
3518 ; AVX512F-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
3519 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
3520 ; AVX512F-NEXT:    retq
3522 ; AVX512VL-FALLBACK-LABEL: vec256_i8_signed_mem_mem:
3523 ; AVX512VL-FALLBACK:       # %bb.0:
3524 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm0
3525 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rsi), %ymm1
3526 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm2
3527 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %ymm2, %ymm2
3528 ; AVX512VL-FALLBACK-NEXT:    vpminsb %ymm1, %ymm0, %ymm3
3529 ; AVX512VL-FALLBACK-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
3530 ; AVX512VL-FALLBACK-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
3531 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
3532 ; AVX512VL-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3533 ; AVX512VL-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
3534 ; AVX512VL-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
3535 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
3536 ; AVX512VL-FALLBACK-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3537 ; AVX512VL-FALLBACK-NEXT:    vpand %ymm4, %ymm3, %ymm3
3538 ; AVX512VL-FALLBACK-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
3539 ; AVX512VL-FALLBACK-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
3540 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3541 ; AVX512VL-FALLBACK-NEXT:    vpand %ymm4, %ymm1, %ymm1
3542 ; AVX512VL-FALLBACK-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
3543 ; AVX512VL-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
3544 ; AVX512VL-FALLBACK-NEXT:    retq
3546 ; AVX512BW-FALLBACK-LABEL: vec256_i8_signed_mem_mem:
3547 ; AVX512BW-FALLBACK:       # %bb.0:
3548 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %ymm0
3549 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rsi), %ymm1
3550 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtb %zmm1, %zmm0, %k1
3551 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
3552 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} 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]
3553 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
3554 ; AVX512BW-FALLBACK-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
3555 ; AVX512BW-FALLBACK-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
3556 ; AVX512BW-FALLBACK-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
3557 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %ymm1, %ymm1
3558 ; AVX512BW-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3559 ; 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
3560 ; 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
3561 ; AVX512BW-FALLBACK-NEXT:    vpmullw %zmm2, %zmm1, %zmm1
3562 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm1, %ymm1
3563 ; AVX512BW-FALLBACK-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
3564 ; AVX512BW-FALLBACK-NEXT:    retq
3566 ; AVX512VLBW-LABEL: vec256_i8_signed_mem_mem:
3567 ; AVX512VLBW:       # %bb.0:
3568 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %ymm0
3569 ; AVX512VLBW-NEXT:    vmovdqa (%rsi), %ymm1
3570 ; AVX512VLBW-NEXT:    vpcmpgtb %ymm1, %ymm0, %k1
3571 ; AVX512VLBW-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
3572 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} 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]
3573 ; AVX512VLBW-NEXT:    vmovdqu8 %ymm2, %ymm3 {%k1}
3574 ; AVX512VLBW-NEXT:    vpminsb %ymm1, %ymm0, %ymm2
3575 ; AVX512VLBW-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm1
3576 ; AVX512VLBW-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
3577 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
3578 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3579 ; AVX512VLBW-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
3580 ; AVX512VLBW-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
3581 ; AVX512VLBW-NEXT:    vpmullw %zmm2, %zmm1, %zmm1
3582 ; AVX512VLBW-NEXT:    vpmovwb %zmm1, %ymm1
3583 ; AVX512VLBW-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
3584 ; AVX512VLBW-NEXT:    retq
3585   %a1 = load <32 x i8>, <32 x i8>* %a1_addr
3586   %a2 = load <32 x i8>, <32 x i8>* %a2_addr
3587   %t3 = icmp sgt <32 x i8> %a1, %a2 ; signed
3588   %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>
3589   %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a1
3590   %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a2
3591   %t7 = sub <32 x i8> %t6, %t5
3592   %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>
3593   %t9 = mul nsw <32 x i8> %t8, %t4 ; signed
3594   %a10 = add nsw <32 x i8> %t9, %a1 ; signed
3595   ret <32 x i8> %a10