[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / midpoint-int-vec-128.ll
blob47c849264a9a5ab5b71e1ffe2e6e157ecc10ded5
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=ALL,SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=ALL,SSE,SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=ALL,AVX,AVX1,AVX1-FALLBACK
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX,AVX2,AVX2-FALLBACK
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop | FileCheck %s --check-prefixes=ALL,XOP,XOP-FALLBACK
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=ALL,XOP,AVX,AVX1,XOPAVX,XOPAVX1,XOPAVX1-FALLBACK
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=ALL,XOP,AVX,AVX2,XOPAVX,XOPAVX2,XOPAVX2-FALLBACK
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=ALL,AVX512,AVX512F
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=ALL,AVX512,AVX512VL,AVX512VL-FALLBACK
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=ALL,AVX512,AVX512BW,AVX512BW-FALLBACK
12 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw | FileCheck %s --check-prefixes=ALL,AVX512,AVX512VL,AVX512BW,AVX512VLBW
14 ; These test cases are inspired by C++2a std::midpoint().
15 ; See https://bugs.llvm.org/show_bug.cgi?id=40965
17 ; Using 128-bit vector regs.
19 ; ---------------------------------------------------------------------------- ;
20 ; 32-bit width. 128 / 32 = 4 elts.
21 ; ---------------------------------------------------------------------------- ;
23 ; Values come from regs
25 define <4 x i32> @vec128_i32_signed_reg_reg(<4 x i32> %a1, <4 x i32> %a2) nounwind {
26 ; SSE2-LABEL: vec128_i32_signed_reg_reg:
27 ; SSE2:       # %bb.0:
28 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
29 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
30 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1,1,1,1]
31 ; SSE2-NEXT:    por %xmm2, %xmm3
32 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
33 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
34 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
35 ; SSE2-NEXT:    pand %xmm4, %xmm5
36 ; SSE2-NEXT:    pandn %xmm1, %xmm4
37 ; SSE2-NEXT:    por %xmm5, %xmm4
38 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
39 ; SSE2-NEXT:    pand %xmm2, %xmm5
40 ; SSE2-NEXT:    pandn %xmm1, %xmm2
41 ; SSE2-NEXT:    por %xmm5, %xmm2
42 ; SSE2-NEXT:    psubd %xmm4, %xmm2
43 ; SSE2-NEXT:    psrld $1, %xmm2
44 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
45 ; SSE2-NEXT:    pmuludq %xmm3, %xmm2
46 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
47 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
48 ; SSE2-NEXT:    pmuludq %xmm1, %xmm3
49 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
50 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
51 ; SSE2-NEXT:    paddd %xmm2, %xmm0
52 ; SSE2-NEXT:    retq
54 ; SSE41-LABEL: vec128_i32_signed_reg_reg:
55 ; SSE41:       # %bb.0:
56 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
57 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm2
58 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm2
59 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
60 ; SSE41-NEXT:    pminsd %xmm1, %xmm3
61 ; SSE41-NEXT:    pmaxsd %xmm0, %xmm1
62 ; SSE41-NEXT:    psubd %xmm3, %xmm1
63 ; SSE41-NEXT:    psrld $1, %xmm1
64 ; SSE41-NEXT:    pmulld %xmm1, %xmm2
65 ; SSE41-NEXT:    paddd %xmm0, %xmm2
66 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
67 ; SSE41-NEXT:    retq
69 ; AVX1-FALLBACK-LABEL: vec128_i32_signed_reg_reg:
70 ; AVX1-FALLBACK:       # %bb.0:
71 ; AVX1-FALLBACK-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm2
72 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
73 ; AVX1-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
74 ; AVX1-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
75 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
76 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
77 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm2, %xmm1, %xmm1
78 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
79 ; AVX1-FALLBACK-NEXT:    retq
81 ; AVX2-FALLBACK-LABEL: vec128_i32_signed_reg_reg:
82 ; AVX2-FALLBACK:       # %bb.0:
83 ; AVX2-FALLBACK-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm2
84 ; AVX2-FALLBACK-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
85 ; AVX2-FALLBACK-NEXT:    vpor %xmm3, %xmm2, %xmm2
86 ; AVX2-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
87 ; AVX2-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
88 ; AVX2-FALLBACK-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
89 ; AVX2-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
90 ; AVX2-FALLBACK-NEXT:    vpmulld %xmm2, %xmm1, %xmm1
91 ; AVX2-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
92 ; AVX2-FALLBACK-NEXT:    retq
94 ; XOP-FALLBACK-LABEL: vec128_i32_signed_reg_reg:
95 ; XOP-FALLBACK:       # %bb.0:
96 ; XOP-FALLBACK-NEXT:    vpcomgtd %xmm1, %xmm0, %xmm2
97 ; XOP-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
98 ; XOP-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
99 ; XOP-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
100 ; XOP-FALLBACK-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
101 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
102 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm0, %xmm2, %xmm1, %xmm0
103 ; XOP-FALLBACK-NEXT:    retq
105 ; XOPAVX1-LABEL: vec128_i32_signed_reg_reg:
106 ; XOPAVX1:       # %bb.0:
107 ; XOPAVX1-NEXT:    vpcomgtd %xmm1, %xmm0, %xmm2
108 ; XOPAVX1-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
109 ; XOPAVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
110 ; XOPAVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
111 ; XOPAVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
112 ; XOPAVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
113 ; XOPAVX1-NEXT:    vpmacsdd %xmm0, %xmm2, %xmm1, %xmm0
114 ; XOPAVX1-NEXT:    retq
116 ; XOPAVX2-LABEL: vec128_i32_signed_reg_reg:
117 ; XOPAVX2:       # %bb.0:
118 ; XOPAVX2-NEXT:    vpcomgtd %xmm1, %xmm0, %xmm2
119 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
120 ; XOPAVX2-NEXT:    vpor %xmm3, %xmm2, %xmm2
121 ; XOPAVX2-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
122 ; XOPAVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
123 ; XOPAVX2-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
124 ; XOPAVX2-NEXT:    vpsrld $1, %xmm1, %xmm1
125 ; XOPAVX2-NEXT:    vpmacsdd %xmm0, %xmm2, %xmm1, %xmm0
126 ; XOPAVX2-NEXT:    retq
128 ; AVX512F-LABEL: vec128_i32_signed_reg_reg:
129 ; AVX512F:       # %bb.0:
130 ; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
131 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
132 ; AVX512F-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
133 ; AVX512F-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
134 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
135 ; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm3 {%k1}
136 ; AVX512F-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
137 ; AVX512F-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
138 ; AVX512F-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
139 ; AVX512F-NEXT:    vpsrld $1, %xmm1, %xmm1
140 ; AVX512F-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
141 ; AVX512F-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
142 ; AVX512F-NEXT:    vzeroupper
143 ; AVX512F-NEXT:    retq
145 ; AVX512VL-LABEL: vec128_i32_signed_reg_reg:
146 ; AVX512VL:       # %bb.0:
147 ; AVX512VL-NEXT:    vpcmpgtd %xmm1, %xmm0, %k1
148 ; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
149 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
150 ; AVX512VL-NEXT:    vmovdqa32 %xmm2, %xmm3 {%k1}
151 ; AVX512VL-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
152 ; AVX512VL-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
153 ; AVX512VL-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
154 ; AVX512VL-NEXT:    vpsrld $1, %xmm1, %xmm1
155 ; AVX512VL-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
156 ; AVX512VL-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
157 ; AVX512VL-NEXT:    retq
159 ; AVX512BW-FALLBACK-LABEL: vec128_i32_signed_reg_reg:
160 ; AVX512BW-FALLBACK:       # %bb.0:
161 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
162 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
163 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
164 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
165 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
166 ; AVX512BW-FALLBACK-NEXT:    vmovdqa32 %zmm2, %zmm3 {%k1}
167 ; AVX512BW-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
168 ; AVX512BW-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
169 ; AVX512BW-FALLBACK-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
170 ; AVX512BW-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
171 ; AVX512BW-FALLBACK-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
172 ; AVX512BW-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
173 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
174 ; AVX512BW-FALLBACK-NEXT:    retq
175   %t3 = icmp sgt <4 x i32> %a1, %a2 ; signed
176   %t4 = select <4 x i1> %t3, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
177   %t5 = select <4 x i1> %t3, <4 x i32> %a2, <4 x i32> %a1
178   %t6 = select <4 x i1> %t3, <4 x i32> %a1, <4 x i32> %a2
179   %t7 = sub <4 x i32> %t6, %t5
180   %t8 = lshr <4 x i32> %t7, <i32 1, i32 1, i32 1, i32 1>
181   %t9 = mul nsw <4 x i32> %t8, %t4 ; signed
182   %a10 = add nsw <4 x i32> %t9, %a1 ; signed
183   ret <4 x i32> %a10
186 define <4 x i32> @vec128_i32_unsigned_reg_reg(<4 x i32> %a1, <4 x i32> %a2) nounwind {
187 ; SSE2-LABEL: vec128_i32_unsigned_reg_reg:
188 ; SSE2:       # %bb.0:
189 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
190 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
191 ; SSE2-NEXT:    pxor %xmm2, %xmm3
192 ; SSE2-NEXT:    pxor %xmm0, %xmm2
193 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
194 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
195 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [1,1,1,1]
196 ; SSE2-NEXT:    por %xmm4, %xmm5
197 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
198 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
199 ; SSE2-NEXT:    pand %xmm3, %xmm2
200 ; SSE2-NEXT:    pandn %xmm1, %xmm3
201 ; SSE2-NEXT:    por %xmm2, %xmm3
202 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
203 ; SSE2-NEXT:    pand %xmm4, %xmm2
204 ; SSE2-NEXT:    pandn %xmm1, %xmm4
205 ; SSE2-NEXT:    por %xmm2, %xmm4
206 ; SSE2-NEXT:    psubd %xmm3, %xmm4
207 ; SSE2-NEXT:    psrld $1, %xmm4
208 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
209 ; SSE2-NEXT:    pmuludq %xmm5, %xmm4
210 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,2,2,3]
211 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]
212 ; SSE2-NEXT:    pmuludq %xmm1, %xmm3
213 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
214 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
215 ; SSE2-NEXT:    paddd %xmm2, %xmm0
216 ; SSE2-NEXT:    retq
218 ; SSE41-LABEL: vec128_i32_unsigned_reg_reg:
219 ; SSE41:       # %bb.0:
220 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
221 ; SSE41-NEXT:    pminud %xmm1, %xmm2
222 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
223 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm3
224 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
225 ; SSE41-NEXT:    pxor %xmm3, %xmm4
226 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm4
227 ; SSE41-NEXT:    pmaxud %xmm0, %xmm1
228 ; SSE41-NEXT:    psubd %xmm2, %xmm1
229 ; SSE41-NEXT:    psrld $1, %xmm1
230 ; SSE41-NEXT:    pmulld %xmm1, %xmm4
231 ; SSE41-NEXT:    paddd %xmm4, %xmm0
232 ; SSE41-NEXT:    retq
234 ; AVX1-FALLBACK-LABEL: vec128_i32_unsigned_reg_reg:
235 ; AVX1-FALLBACK:       # %bb.0:
236 ; AVX1-FALLBACK-NEXT:    vpminud %xmm1, %xmm0, %xmm2
237 ; AVX1-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm3
238 ; AVX1-FALLBACK-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
239 ; AVX1-FALLBACK-NEXT:    vpxor %xmm4, %xmm3, %xmm3
240 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm3, %xmm3
241 ; AVX1-FALLBACK-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
242 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
243 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
244 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
245 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
246 ; AVX1-FALLBACK-NEXT:    retq
248 ; AVX2-FALLBACK-LABEL: vec128_i32_unsigned_reg_reg:
249 ; AVX2-FALLBACK:       # %bb.0:
250 ; AVX2-FALLBACK-NEXT:    vpminud %xmm1, %xmm0, %xmm2
251 ; AVX2-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm3
252 ; AVX2-FALLBACK-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
253 ; AVX2-FALLBACK-NEXT:    vpxor %xmm4, %xmm3, %xmm3
254 ; AVX2-FALLBACK-NEXT:    vpbroadcastd {{.*#+}} xmm4 = [1,1,1,1]
255 ; AVX2-FALLBACK-NEXT:    vpor %xmm4, %xmm3, %xmm3
256 ; AVX2-FALLBACK-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
257 ; AVX2-FALLBACK-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
258 ; AVX2-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
259 ; AVX2-FALLBACK-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
260 ; AVX2-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
261 ; AVX2-FALLBACK-NEXT:    retq
263 ; XOP-FALLBACK-LABEL: vec128_i32_unsigned_reg_reg:
264 ; XOP-FALLBACK:       # %bb.0:
265 ; XOP-FALLBACK-NEXT:    vpcomgtud %xmm1, %xmm0, %xmm2
266 ; XOP-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
267 ; XOP-FALLBACK-NEXT:    vpminud %xmm1, %xmm0, %xmm3
268 ; XOP-FALLBACK-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
269 ; XOP-FALLBACK-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
270 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
271 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm0, %xmm2, %xmm1, %xmm0
272 ; XOP-FALLBACK-NEXT:    retq
274 ; XOPAVX1-LABEL: vec128_i32_unsigned_reg_reg:
275 ; XOPAVX1:       # %bb.0:
276 ; XOPAVX1-NEXT:    vpcomgtud %xmm1, %xmm0, %xmm2
277 ; XOPAVX1-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
278 ; XOPAVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm3
279 ; XOPAVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
280 ; XOPAVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
281 ; XOPAVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
282 ; XOPAVX1-NEXT:    vpmacsdd %xmm0, %xmm2, %xmm1, %xmm0
283 ; XOPAVX1-NEXT:    retq
285 ; XOPAVX2-LABEL: vec128_i32_unsigned_reg_reg:
286 ; XOPAVX2:       # %bb.0:
287 ; XOPAVX2-NEXT:    vpcomgtud %xmm1, %xmm0, %xmm2
288 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
289 ; XOPAVX2-NEXT:    vpor %xmm3, %xmm2, %xmm2
290 ; XOPAVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm3
291 ; XOPAVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
292 ; XOPAVX2-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
293 ; XOPAVX2-NEXT:    vpsrld $1, %xmm1, %xmm1
294 ; XOPAVX2-NEXT:    vpmacsdd %xmm0, %xmm2, %xmm1, %xmm0
295 ; XOPAVX2-NEXT:    retq
297 ; AVX512F-LABEL: vec128_i32_unsigned_reg_reg:
298 ; AVX512F:       # %bb.0:
299 ; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
300 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
301 ; AVX512F-NEXT:    vpcmpnleud %zmm1, %zmm0, %k1
302 ; AVX512F-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
303 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
304 ; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm3 {%k1}
305 ; AVX512F-NEXT:    vpminud %xmm1, %xmm0, %xmm2
306 ; AVX512F-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
307 ; AVX512F-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
308 ; AVX512F-NEXT:    vpsrld $1, %xmm1, %xmm1
309 ; AVX512F-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
310 ; AVX512F-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
311 ; AVX512F-NEXT:    vzeroupper
312 ; AVX512F-NEXT:    retq
314 ; AVX512VL-LABEL: vec128_i32_unsigned_reg_reg:
315 ; AVX512VL:       # %bb.0:
316 ; AVX512VL-NEXT:    vpcmpnleud %xmm1, %xmm0, %k1
317 ; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
318 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
319 ; AVX512VL-NEXT:    vmovdqa32 %xmm2, %xmm3 {%k1}
320 ; AVX512VL-NEXT:    vpminud %xmm1, %xmm0, %xmm2
321 ; AVX512VL-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
322 ; AVX512VL-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
323 ; AVX512VL-NEXT:    vpsrld $1, %xmm1, %xmm1
324 ; AVX512VL-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
325 ; AVX512VL-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
326 ; AVX512VL-NEXT:    retq
328 ; AVX512BW-FALLBACK-LABEL: vec128_i32_unsigned_reg_reg:
329 ; AVX512BW-FALLBACK:       # %bb.0:
330 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
331 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
332 ; AVX512BW-FALLBACK-NEXT:    vpcmpnleud %zmm1, %zmm0, %k1
333 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
334 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
335 ; AVX512BW-FALLBACK-NEXT:    vmovdqa32 %zmm2, %zmm3 {%k1}
336 ; AVX512BW-FALLBACK-NEXT:    vpminud %xmm1, %xmm0, %xmm2
337 ; AVX512BW-FALLBACK-NEXT:    vpmaxud %xmm1, %xmm0, %xmm1
338 ; AVX512BW-FALLBACK-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
339 ; AVX512BW-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
340 ; AVX512BW-FALLBACK-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
341 ; AVX512BW-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
342 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
343 ; AVX512BW-FALLBACK-NEXT:    retq
344   %t3 = icmp ugt <4 x i32> %a1, %a2
345   %t4 = select <4 x i1> %t3, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
346   %t5 = select <4 x i1> %t3, <4 x i32> %a2, <4 x i32> %a1
347   %t6 = select <4 x i1> %t3, <4 x i32> %a1, <4 x i32> %a2
348   %t7 = sub <4 x i32> %t6, %t5
349   %t8 = lshr <4 x i32> %t7, <i32 1, i32 1, i32 1, i32 1>
350   %t9 = mul <4 x i32> %t8, %t4
351   %a10 = add <4 x i32> %t9, %a1
352   ret <4 x i32> %a10
355 ; Values are loaded. Only check signed case.
357 define <4 x i32> @vec128_i32_signed_mem_reg(<4 x i32>* %a1_addr, <4 x i32> %a2) nounwind {
358 ; SSE2-LABEL: vec128_i32_signed_mem_reg:
359 ; SSE2:       # %bb.0:
360 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
361 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
362 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
363 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1,1,1,1]
364 ; SSE2-NEXT:    por %xmm2, %xmm3
365 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
366 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
367 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
368 ; SSE2-NEXT:    pand %xmm4, %xmm5
369 ; SSE2-NEXT:    pandn %xmm0, %xmm4
370 ; SSE2-NEXT:    por %xmm5, %xmm4
371 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
372 ; SSE2-NEXT:    pand %xmm2, %xmm5
373 ; SSE2-NEXT:    pandn %xmm0, %xmm2
374 ; SSE2-NEXT:    por %xmm5, %xmm2
375 ; SSE2-NEXT:    psubd %xmm4, %xmm2
376 ; SSE2-NEXT:    psrld $1, %xmm2
377 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
378 ; SSE2-NEXT:    pmuludq %xmm3, %xmm2
379 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
380 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
381 ; SSE2-NEXT:    pmuludq %xmm4, %xmm2
382 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
383 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
384 ; SSE2-NEXT:    paddd %xmm1, %xmm0
385 ; SSE2-NEXT:    retq
387 ; SSE41-LABEL: vec128_i32_signed_mem_reg:
388 ; SSE41:       # %bb.0:
389 ; SSE41-NEXT:    movdqa (%rdi), %xmm1
390 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
391 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
392 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm2
393 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
394 ; SSE41-NEXT:    pminsd %xmm0, %xmm3
395 ; SSE41-NEXT:    pmaxsd %xmm1, %xmm0
396 ; SSE41-NEXT:    psubd %xmm3, %xmm0
397 ; SSE41-NEXT:    psrld $1, %xmm0
398 ; SSE41-NEXT:    pmulld %xmm2, %xmm0
399 ; SSE41-NEXT:    paddd %xmm1, %xmm0
400 ; SSE41-NEXT:    retq
402 ; AVX1-FALLBACK-LABEL: vec128_i32_signed_mem_reg:
403 ; AVX1-FALLBACK:       # %bb.0:
404 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
405 ; AVX1-FALLBACK-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm2
406 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
407 ; AVX1-FALLBACK-NEXT:    vpminsd %xmm0, %xmm1, %xmm3
408 ; AVX1-FALLBACK-NEXT:    vpmaxsd %xmm0, %xmm1, %xmm0
409 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm3, %xmm0, %xmm0
410 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm0, %xmm0
411 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm2, %xmm0, %xmm0
412 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
413 ; AVX1-FALLBACK-NEXT:    retq
415 ; AVX2-FALLBACK-LABEL: vec128_i32_signed_mem_reg:
416 ; AVX2-FALLBACK:       # %bb.0:
417 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
418 ; AVX2-FALLBACK-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm2
419 ; AVX2-FALLBACK-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
420 ; AVX2-FALLBACK-NEXT:    vpor %xmm3, %xmm2, %xmm2
421 ; AVX2-FALLBACK-NEXT:    vpminsd %xmm0, %xmm1, %xmm3
422 ; AVX2-FALLBACK-NEXT:    vpmaxsd %xmm0, %xmm1, %xmm0
423 ; AVX2-FALLBACK-NEXT:    vpsubd %xmm3, %xmm0, %xmm0
424 ; AVX2-FALLBACK-NEXT:    vpsrld $1, %xmm0, %xmm0
425 ; AVX2-FALLBACK-NEXT:    vpmulld %xmm2, %xmm0, %xmm0
426 ; AVX2-FALLBACK-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
427 ; AVX2-FALLBACK-NEXT:    retq
429 ; XOP-FALLBACK-LABEL: vec128_i32_signed_mem_reg:
430 ; XOP-FALLBACK:       # %bb.0:
431 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
432 ; XOP-FALLBACK-NEXT:    vpcomgtd %xmm0, %xmm1, %xmm2
433 ; XOP-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
434 ; XOP-FALLBACK-NEXT:    vpminsd %xmm0, %xmm1, %xmm3
435 ; XOP-FALLBACK-NEXT:    vpmaxsd %xmm0, %xmm1, %xmm0
436 ; XOP-FALLBACK-NEXT:    vpsubd %xmm3, %xmm0, %xmm0
437 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm0, %xmm0
438 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm1, %xmm2, %xmm0, %xmm0
439 ; XOP-FALLBACK-NEXT:    retq
441 ; XOPAVX1-LABEL: vec128_i32_signed_mem_reg:
442 ; XOPAVX1:       # %bb.0:
443 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm1
444 ; XOPAVX1-NEXT:    vpcomgtd %xmm0, %xmm1, %xmm2
445 ; XOPAVX1-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
446 ; XOPAVX1-NEXT:    vpminsd %xmm0, %xmm1, %xmm3
447 ; XOPAVX1-NEXT:    vpmaxsd %xmm0, %xmm1, %xmm0
448 ; XOPAVX1-NEXT:    vpsubd %xmm3, %xmm0, %xmm0
449 ; XOPAVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
450 ; XOPAVX1-NEXT:    vpmacsdd %xmm1, %xmm2, %xmm0, %xmm0
451 ; XOPAVX1-NEXT:    retq
453 ; XOPAVX2-LABEL: vec128_i32_signed_mem_reg:
454 ; XOPAVX2:       # %bb.0:
455 ; XOPAVX2-NEXT:    vmovdqa (%rdi), %xmm1
456 ; XOPAVX2-NEXT:    vpcomgtd %xmm0, %xmm1, %xmm2
457 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
458 ; XOPAVX2-NEXT:    vpor %xmm3, %xmm2, %xmm2
459 ; XOPAVX2-NEXT:    vpminsd %xmm0, %xmm1, %xmm3
460 ; XOPAVX2-NEXT:    vpmaxsd %xmm0, %xmm1, %xmm0
461 ; XOPAVX2-NEXT:    vpsubd %xmm3, %xmm0, %xmm0
462 ; XOPAVX2-NEXT:    vpsrld $1, %xmm0, %xmm0
463 ; XOPAVX2-NEXT:    vpmacsdd %xmm1, %xmm2, %xmm0, %xmm0
464 ; XOPAVX2-NEXT:    retq
466 ; AVX512F-LABEL: vec128_i32_signed_mem_reg:
467 ; AVX512F:       # %bb.0:
468 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
469 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm1
470 ; AVX512F-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
471 ; AVX512F-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
472 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
473 ; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm3 {%k1}
474 ; AVX512F-NEXT:    vpminsd %xmm0, %xmm1, %xmm2
475 ; AVX512F-NEXT:    vpmaxsd %xmm0, %xmm1, %xmm0
476 ; AVX512F-NEXT:    vpsubd %xmm2, %xmm0, %xmm0
477 ; AVX512F-NEXT:    vpsrld $1, %xmm0, %xmm0
478 ; AVX512F-NEXT:    vpmulld %xmm3, %xmm0, %xmm0
479 ; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
480 ; AVX512F-NEXT:    vzeroupper
481 ; AVX512F-NEXT:    retq
483 ; AVX512VL-LABEL: vec128_i32_signed_mem_reg:
484 ; AVX512VL:       # %bb.0:
485 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm1
486 ; AVX512VL-NEXT:    vpcmpgtd %xmm0, %xmm1, %k1
487 ; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
488 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
489 ; AVX512VL-NEXT:    vmovdqa32 %xmm2, %xmm3 {%k1}
490 ; AVX512VL-NEXT:    vpminsd %xmm0, %xmm1, %xmm2
491 ; AVX512VL-NEXT:    vpmaxsd %xmm0, %xmm1, %xmm0
492 ; AVX512VL-NEXT:    vpsubd %xmm2, %xmm0, %xmm0
493 ; AVX512VL-NEXT:    vpsrld $1, %xmm0, %xmm0
494 ; AVX512VL-NEXT:    vpmulld %xmm3, %xmm0, %xmm0
495 ; AVX512VL-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
496 ; AVX512VL-NEXT:    retq
498 ; AVX512BW-FALLBACK-LABEL: vec128_i32_signed_mem_reg:
499 ; AVX512BW-FALLBACK:       # %bb.0:
500 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
501 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
502 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
503 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
504 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
505 ; AVX512BW-FALLBACK-NEXT:    vmovdqa32 %zmm2, %zmm3 {%k1}
506 ; AVX512BW-FALLBACK-NEXT:    vpminsd %xmm0, %xmm1, %xmm2
507 ; AVX512BW-FALLBACK-NEXT:    vpmaxsd %xmm0, %xmm1, %xmm0
508 ; AVX512BW-FALLBACK-NEXT:    vpsubd %xmm2, %xmm0, %xmm0
509 ; AVX512BW-FALLBACK-NEXT:    vpsrld $1, %xmm0, %xmm0
510 ; AVX512BW-FALLBACK-NEXT:    vpmulld %xmm3, %xmm0, %xmm0
511 ; AVX512BW-FALLBACK-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
512 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
513 ; AVX512BW-FALLBACK-NEXT:    retq
514   %a1 = load <4 x i32>, <4 x i32>* %a1_addr
515   %t3 = icmp sgt <4 x i32> %a1, %a2 ; signed
516   %t4 = select <4 x i1> %t3, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
517   %t5 = select <4 x i1> %t3, <4 x i32> %a2, <4 x i32> %a1
518   %t6 = select <4 x i1> %t3, <4 x i32> %a1, <4 x i32> %a2
519   %t7 = sub <4 x i32> %t6, %t5
520   %t8 = lshr <4 x i32> %t7, <i32 1, i32 1, i32 1, i32 1>
521   %t9 = mul nsw <4 x i32> %t8, %t4 ; signed
522   %a10 = add nsw <4 x i32> %t9, %a1 ; signed
523   ret <4 x i32> %a10
526 define <4 x i32> @vec128_i32_signed_reg_mem(<4 x i32> %a1, <4 x i32>* %a2_addr) nounwind {
527 ; SSE2-LABEL: vec128_i32_signed_reg_mem:
528 ; SSE2:       # %bb.0:
529 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
530 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
531 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
532 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1,1,1,1]
533 ; SSE2-NEXT:    por %xmm2, %xmm3
534 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
535 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
536 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
537 ; SSE2-NEXT:    pand %xmm4, %xmm5
538 ; SSE2-NEXT:    pandn %xmm1, %xmm4
539 ; SSE2-NEXT:    por %xmm5, %xmm4
540 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
541 ; SSE2-NEXT:    pand %xmm2, %xmm5
542 ; SSE2-NEXT:    pandn %xmm1, %xmm2
543 ; SSE2-NEXT:    por %xmm5, %xmm2
544 ; SSE2-NEXT:    psubd %xmm4, %xmm2
545 ; SSE2-NEXT:    psrld $1, %xmm2
546 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
547 ; SSE2-NEXT:    pmuludq %xmm3, %xmm2
548 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
549 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
550 ; SSE2-NEXT:    pmuludq %xmm1, %xmm3
551 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
552 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
553 ; SSE2-NEXT:    paddd %xmm2, %xmm0
554 ; SSE2-NEXT:    retq
556 ; SSE41-LABEL: vec128_i32_signed_reg_mem:
557 ; SSE41:       # %bb.0:
558 ; SSE41-NEXT:    movdqa (%rdi), %xmm2
559 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
560 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm1
561 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm1
562 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
563 ; SSE41-NEXT:    pminsd %xmm2, %xmm3
564 ; SSE41-NEXT:    pmaxsd %xmm0, %xmm2
565 ; SSE41-NEXT:    psubd %xmm3, %xmm2
566 ; SSE41-NEXT:    psrld $1, %xmm2
567 ; SSE41-NEXT:    pmulld %xmm2, %xmm1
568 ; SSE41-NEXT:    paddd %xmm0, %xmm1
569 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
570 ; SSE41-NEXT:    retq
572 ; AVX1-FALLBACK-LABEL: vec128_i32_signed_reg_mem:
573 ; AVX1-FALLBACK:       # %bb.0:
574 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
575 ; AVX1-FALLBACK-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm2
576 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
577 ; AVX1-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
578 ; AVX1-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
579 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
580 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
581 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm2, %xmm1, %xmm1
582 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
583 ; AVX1-FALLBACK-NEXT:    retq
585 ; AVX2-FALLBACK-LABEL: vec128_i32_signed_reg_mem:
586 ; AVX2-FALLBACK:       # %bb.0:
587 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
588 ; AVX2-FALLBACK-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm2
589 ; AVX2-FALLBACK-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
590 ; AVX2-FALLBACK-NEXT:    vpor %xmm3, %xmm2, %xmm2
591 ; AVX2-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
592 ; AVX2-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
593 ; AVX2-FALLBACK-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
594 ; AVX2-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
595 ; AVX2-FALLBACK-NEXT:    vpmulld %xmm2, %xmm1, %xmm1
596 ; AVX2-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
597 ; AVX2-FALLBACK-NEXT:    retq
599 ; XOP-FALLBACK-LABEL: vec128_i32_signed_reg_mem:
600 ; XOP-FALLBACK:       # %bb.0:
601 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
602 ; XOP-FALLBACK-NEXT:    vpcomgtd %xmm1, %xmm0, %xmm2
603 ; XOP-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
604 ; XOP-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
605 ; XOP-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
606 ; XOP-FALLBACK-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
607 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
608 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm0, %xmm2, %xmm1, %xmm0
609 ; XOP-FALLBACK-NEXT:    retq
611 ; XOPAVX1-LABEL: vec128_i32_signed_reg_mem:
612 ; XOPAVX1:       # %bb.0:
613 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm1
614 ; XOPAVX1-NEXT:    vpcomgtd %xmm1, %xmm0, %xmm2
615 ; XOPAVX1-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
616 ; XOPAVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
617 ; XOPAVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
618 ; XOPAVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
619 ; XOPAVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
620 ; XOPAVX1-NEXT:    vpmacsdd %xmm0, %xmm2, %xmm1, %xmm0
621 ; XOPAVX1-NEXT:    retq
623 ; XOPAVX2-LABEL: vec128_i32_signed_reg_mem:
624 ; XOPAVX2:       # %bb.0:
625 ; XOPAVX2-NEXT:    vmovdqa (%rdi), %xmm1
626 ; XOPAVX2-NEXT:    vpcomgtd %xmm1, %xmm0, %xmm2
627 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
628 ; XOPAVX2-NEXT:    vpor %xmm3, %xmm2, %xmm2
629 ; XOPAVX2-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
630 ; XOPAVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
631 ; XOPAVX2-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
632 ; XOPAVX2-NEXT:    vpsrld $1, %xmm1, %xmm1
633 ; XOPAVX2-NEXT:    vpmacsdd %xmm0, %xmm2, %xmm1, %xmm0
634 ; XOPAVX2-NEXT:    retq
636 ; AVX512F-LABEL: vec128_i32_signed_reg_mem:
637 ; AVX512F:       # %bb.0:
638 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
639 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm1
640 ; AVX512F-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
641 ; AVX512F-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
642 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
643 ; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm3 {%k1}
644 ; AVX512F-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
645 ; AVX512F-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
646 ; AVX512F-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
647 ; AVX512F-NEXT:    vpsrld $1, %xmm1, %xmm1
648 ; AVX512F-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
649 ; AVX512F-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
650 ; AVX512F-NEXT:    vzeroupper
651 ; AVX512F-NEXT:    retq
653 ; AVX512VL-LABEL: vec128_i32_signed_reg_mem:
654 ; AVX512VL:       # %bb.0:
655 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm1
656 ; AVX512VL-NEXT:    vpcmpgtd %xmm1, %xmm0, %k1
657 ; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
658 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
659 ; AVX512VL-NEXT:    vmovdqa32 %xmm2, %xmm3 {%k1}
660 ; AVX512VL-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
661 ; AVX512VL-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
662 ; AVX512VL-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
663 ; AVX512VL-NEXT:    vpsrld $1, %xmm1, %xmm1
664 ; AVX512VL-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
665 ; AVX512VL-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
666 ; AVX512VL-NEXT:    retq
668 ; AVX512BW-FALLBACK-LABEL: vec128_i32_signed_reg_mem:
669 ; AVX512BW-FALLBACK:       # %bb.0:
670 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
671 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
672 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
673 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
674 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
675 ; AVX512BW-FALLBACK-NEXT:    vmovdqa32 %zmm2, %zmm3 {%k1}
676 ; AVX512BW-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
677 ; AVX512BW-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
678 ; AVX512BW-FALLBACK-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
679 ; AVX512BW-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
680 ; AVX512BW-FALLBACK-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
681 ; AVX512BW-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
682 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
683 ; AVX512BW-FALLBACK-NEXT:    retq
684   %a2 = load <4 x i32>, <4 x i32>* %a2_addr
685   %t3 = icmp sgt <4 x i32> %a1, %a2 ; signed
686   %t4 = select <4 x i1> %t3, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
687   %t5 = select <4 x i1> %t3, <4 x i32> %a2, <4 x i32> %a1
688   %t6 = select <4 x i1> %t3, <4 x i32> %a1, <4 x i32> %a2
689   %t7 = sub <4 x i32> %t6, %t5
690   %t8 = lshr <4 x i32> %t7, <i32 1, i32 1, i32 1, i32 1>
691   %t9 = mul nsw <4 x i32> %t8, %t4 ; signed
692   %a10 = add nsw <4 x i32> %t9, %a1 ; signed
693   ret <4 x i32> %a10
696 define <4 x i32> @vec128_i32_signed_mem_mem(<4 x i32>* %a1_addr, <4 x i32>* %a2_addr) nounwind {
697 ; SSE2-LABEL: vec128_i32_signed_mem_mem:
698 ; SSE2:       # %bb.0:
699 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
700 ; SSE2-NEXT:    movdqa (%rsi), %xmm0
701 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
702 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
703 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1,1,1,1]
704 ; SSE2-NEXT:    por %xmm2, %xmm3
705 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
706 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
707 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
708 ; SSE2-NEXT:    pand %xmm4, %xmm5
709 ; SSE2-NEXT:    pandn %xmm0, %xmm4
710 ; SSE2-NEXT:    por %xmm5, %xmm4
711 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
712 ; SSE2-NEXT:    pand %xmm2, %xmm5
713 ; SSE2-NEXT:    pandn %xmm0, %xmm2
714 ; SSE2-NEXT:    por %xmm5, %xmm2
715 ; SSE2-NEXT:    psubd %xmm4, %xmm2
716 ; SSE2-NEXT:    psrld $1, %xmm2
717 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
718 ; SSE2-NEXT:    pmuludq %xmm3, %xmm2
719 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
720 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
721 ; SSE2-NEXT:    pmuludq %xmm4, %xmm2
722 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
723 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
724 ; SSE2-NEXT:    paddd %xmm1, %xmm0
725 ; SSE2-NEXT:    retq
727 ; SSE41-LABEL: vec128_i32_signed_mem_mem:
728 ; SSE41:       # %bb.0:
729 ; SSE41-NEXT:    movdqa (%rdi), %xmm1
730 ; SSE41-NEXT:    movdqa (%rsi), %xmm0
731 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
732 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
733 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm2
734 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
735 ; SSE41-NEXT:    pminsd %xmm0, %xmm3
736 ; SSE41-NEXT:    pmaxsd %xmm1, %xmm0
737 ; SSE41-NEXT:    psubd %xmm3, %xmm0
738 ; SSE41-NEXT:    psrld $1, %xmm0
739 ; SSE41-NEXT:    pmulld %xmm2, %xmm0
740 ; SSE41-NEXT:    paddd %xmm1, %xmm0
741 ; SSE41-NEXT:    retq
743 ; AVX1-FALLBACK-LABEL: vec128_i32_signed_mem_mem:
744 ; AVX1-FALLBACK:       # %bb.0:
745 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
746 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
747 ; AVX1-FALLBACK-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm2
748 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
749 ; AVX1-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
750 ; AVX1-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
751 ; AVX1-FALLBACK-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
752 ; AVX1-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
753 ; AVX1-FALLBACK-NEXT:    vpmulld %xmm2, %xmm1, %xmm1
754 ; AVX1-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
755 ; AVX1-FALLBACK-NEXT:    retq
757 ; AVX2-FALLBACK-LABEL: vec128_i32_signed_mem_mem:
758 ; AVX2-FALLBACK:       # %bb.0:
759 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
760 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
761 ; AVX2-FALLBACK-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm2
762 ; AVX2-FALLBACK-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
763 ; AVX2-FALLBACK-NEXT:    vpor %xmm3, %xmm2, %xmm2
764 ; AVX2-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
765 ; AVX2-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
766 ; AVX2-FALLBACK-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
767 ; AVX2-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
768 ; AVX2-FALLBACK-NEXT:    vpmulld %xmm2, %xmm1, %xmm1
769 ; AVX2-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
770 ; AVX2-FALLBACK-NEXT:    retq
772 ; XOP-FALLBACK-LABEL: vec128_i32_signed_mem_mem:
773 ; XOP-FALLBACK:       # %bb.0:
774 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
775 ; XOP-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
776 ; XOP-FALLBACK-NEXT:    vpcomgtd %xmm1, %xmm0, %xmm2
777 ; XOP-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
778 ; XOP-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
779 ; XOP-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
780 ; XOP-FALLBACK-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
781 ; XOP-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
782 ; XOP-FALLBACK-NEXT:    vpmacsdd %xmm0, %xmm2, %xmm1, %xmm0
783 ; XOP-FALLBACK-NEXT:    retq
785 ; XOPAVX1-LABEL: vec128_i32_signed_mem_mem:
786 ; XOPAVX1:       # %bb.0:
787 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm0
788 ; XOPAVX1-NEXT:    vmovdqa (%rsi), %xmm1
789 ; XOPAVX1-NEXT:    vpcomgtd %xmm1, %xmm0, %xmm2
790 ; XOPAVX1-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
791 ; XOPAVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
792 ; XOPAVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
793 ; XOPAVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
794 ; XOPAVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
795 ; XOPAVX1-NEXT:    vpmacsdd %xmm0, %xmm2, %xmm1, %xmm0
796 ; XOPAVX1-NEXT:    retq
798 ; XOPAVX2-LABEL: vec128_i32_signed_mem_mem:
799 ; XOPAVX2:       # %bb.0:
800 ; XOPAVX2-NEXT:    vmovdqa (%rdi), %xmm0
801 ; XOPAVX2-NEXT:    vmovdqa (%rsi), %xmm1
802 ; XOPAVX2-NEXT:    vpcomgtd %xmm1, %xmm0, %xmm2
803 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
804 ; XOPAVX2-NEXT:    vpor %xmm3, %xmm2, %xmm2
805 ; XOPAVX2-NEXT:    vpminsd %xmm1, %xmm0, %xmm3
806 ; XOPAVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
807 ; XOPAVX2-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
808 ; XOPAVX2-NEXT:    vpsrld $1, %xmm1, %xmm1
809 ; XOPAVX2-NEXT:    vpmacsdd %xmm0, %xmm2, %xmm1, %xmm0
810 ; XOPAVX2-NEXT:    retq
812 ; AVX512F-LABEL: vec128_i32_signed_mem_mem:
813 ; AVX512F:       # %bb.0:
814 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
815 ; AVX512F-NEXT:    vmovdqa (%rsi), %xmm1
816 ; AVX512F-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
817 ; AVX512F-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
818 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
819 ; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm3 {%k1}
820 ; AVX512F-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
821 ; AVX512F-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
822 ; AVX512F-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
823 ; AVX512F-NEXT:    vpsrld $1, %xmm1, %xmm1
824 ; AVX512F-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
825 ; AVX512F-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
826 ; AVX512F-NEXT:    vzeroupper
827 ; AVX512F-NEXT:    retq
829 ; AVX512VL-LABEL: vec128_i32_signed_mem_mem:
830 ; AVX512VL:       # %bb.0:
831 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
832 ; AVX512VL-NEXT:    vmovdqa (%rsi), %xmm1
833 ; AVX512VL-NEXT:    vpcmpgtd %xmm1, %xmm0, %k1
834 ; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
835 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
836 ; AVX512VL-NEXT:    vmovdqa32 %xmm2, %xmm3 {%k1}
837 ; AVX512VL-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
838 ; AVX512VL-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
839 ; AVX512VL-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
840 ; AVX512VL-NEXT:    vpsrld $1, %xmm1, %xmm1
841 ; AVX512VL-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
842 ; AVX512VL-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
843 ; AVX512VL-NEXT:    retq
845 ; AVX512BW-FALLBACK-LABEL: vec128_i32_signed_mem_mem:
846 ; AVX512BW-FALLBACK:       # %bb.0:
847 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
848 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
849 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
850 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
851 ; AVX512BW-FALLBACK-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [1,1,1,1]
852 ; AVX512BW-FALLBACK-NEXT:    vmovdqa32 %zmm2, %zmm3 {%k1}
853 ; AVX512BW-FALLBACK-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
854 ; AVX512BW-FALLBACK-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm1
855 ; AVX512BW-FALLBACK-NEXT:    vpsubd %xmm2, %xmm1, %xmm1
856 ; AVX512BW-FALLBACK-NEXT:    vpsrld $1, %xmm1, %xmm1
857 ; AVX512BW-FALLBACK-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
858 ; AVX512BW-FALLBACK-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
859 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
860 ; AVX512BW-FALLBACK-NEXT:    retq
861   %a1 = load <4 x i32>, <4 x i32>* %a1_addr
862   %a2 = load <4 x i32>, <4 x i32>* %a2_addr
863   %t3 = icmp sgt <4 x i32> %a1, %a2 ; signed
864   %t4 = select <4 x i1> %t3, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
865   %t5 = select <4 x i1> %t3, <4 x i32> %a2, <4 x i32> %a1
866   %t6 = select <4 x i1> %t3, <4 x i32> %a1, <4 x i32> %a2
867   %t7 = sub <4 x i32> %t6, %t5
868   %t8 = lshr <4 x i32> %t7, <i32 1, i32 1, i32 1, i32 1>
869   %t9 = mul nsw <4 x i32> %t8, %t4 ; signed
870   %a10 = add nsw <4 x i32> %t9, %a1 ; signed
871   ret <4 x i32> %a10
874 ; ---------------------------------------------------------------------------- ;
875 ; 64-bit width. 128 / 64 = 2 elts.
876 ; ---------------------------------------------------------------------------- ;
878 ; Values come from regs
880 define <2 x i64> @vec128_i64_signed_reg_reg(<2 x i64> %a1, <2 x i64> %a2) nounwind {
881 ; SSE2-LABEL: vec128_i64_signed_reg_reg:
882 ; SSE2:       # %bb.0:
883 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
884 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
885 ; SSE2-NEXT:    pxor %xmm4, %xmm5
886 ; SSE2-NEXT:    pxor %xmm0, %xmm4
887 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
888 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm2
889 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
890 ; SSE2-NEXT:    movdqa %xmm4, %xmm6
891 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
892 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
893 ; SSE2-NEXT:    pand %xmm6, %xmm3
894 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
895 ; SSE2-NEXT:    por %xmm3, %xmm2
896 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1,1]
897 ; SSE2-NEXT:    por %xmm2, %xmm3
898 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
899 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[0,0,2,2]
900 ; SSE2-NEXT:    pand %xmm6, %xmm4
901 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
902 ; SSE2-NEXT:    por %xmm4, %xmm5
903 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
904 ; SSE2-NEXT:    pand %xmm5, %xmm4
905 ; SSE2-NEXT:    pandn %xmm1, %xmm5
906 ; SSE2-NEXT:    por %xmm4, %xmm5
907 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
908 ; SSE2-NEXT:    pand %xmm2, %xmm4
909 ; SSE2-NEXT:    pandn %xmm1, %xmm2
910 ; SSE2-NEXT:    por %xmm4, %xmm2
911 ; SSE2-NEXT:    psubq %xmm5, %xmm2
912 ; SSE2-NEXT:    psrlq $1, %xmm2
913 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
914 ; SSE2-NEXT:    psrlq $32, %xmm4
915 ; SSE2-NEXT:    pmuludq %xmm2, %xmm4
916 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
917 ; SSE2-NEXT:    psrlq $32, %xmm1
918 ; SSE2-NEXT:    pmuludq %xmm3, %xmm1
919 ; SSE2-NEXT:    paddq %xmm4, %xmm1
920 ; SSE2-NEXT:    psllq $32, %xmm1
921 ; SSE2-NEXT:    pmuludq %xmm3, %xmm2
922 ; SSE2-NEXT:    paddq %xmm0, %xmm1
923 ; SSE2-NEXT:    paddq %xmm2, %xmm1
924 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
925 ; SSE2-NEXT:    retq
927 ; SSE41-LABEL: vec128_i64_signed_reg_reg:
928 ; SSE41:       # %bb.0:
929 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
930 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
931 ; SSE41-NEXT:    movdqa %xmm1, %xmm5
932 ; SSE41-NEXT:    pxor %xmm0, %xmm5
933 ; SSE41-NEXT:    pxor %xmm2, %xmm0
934 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
935 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm3
936 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
937 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
938 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm4
939 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
940 ; SSE41-NEXT:    pand %xmm7, %xmm6
941 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
942 ; SSE41-NEXT:    por %xmm6, %xmm4
943 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [1,1]
944 ; SSE41-NEXT:    por %xmm4, %xmm3
945 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
946 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
947 ; SSE41-NEXT:    pand %xmm7, %xmm0
948 ; SSE41-NEXT:    por %xmm5, %xmm0
949 ; SSE41-NEXT:    movdqa %xmm1, %xmm5
950 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
951 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
952 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
953 ; SSE41-NEXT:    psubq %xmm5, %xmm1
954 ; SSE41-NEXT:    psrlq $1, %xmm1
955 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
956 ; SSE41-NEXT:    psrlq $32, %xmm0
957 ; SSE41-NEXT:    pmuludq %xmm1, %xmm0
958 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
959 ; SSE41-NEXT:    psrlq $32, %xmm4
960 ; SSE41-NEXT:    pmuludq %xmm3, %xmm4
961 ; SSE41-NEXT:    paddq %xmm0, %xmm4
962 ; SSE41-NEXT:    psllq $32, %xmm4
963 ; SSE41-NEXT:    pmuludq %xmm1, %xmm3
964 ; SSE41-NEXT:    paddq %xmm2, %xmm4
965 ; SSE41-NEXT:    paddq %xmm4, %xmm3
966 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
967 ; SSE41-NEXT:    retq
969 ; AVX1-FALLBACK-LABEL: vec128_i64_signed_reg_reg:
970 ; AVX1-FALLBACK:       # %bb.0:
971 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
972 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm3
973 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm4
974 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm4
975 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
976 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm4, %xmm1, %xmm1
977 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
978 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm3, %xmm2
979 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
980 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm4
981 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
982 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
983 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
984 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
985 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
986 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
987 ; AVX1-FALLBACK-NEXT:    retq
989 ; AVX2-FALLBACK-LABEL: vec128_i64_signed_reg_reg:
990 ; AVX2-FALLBACK:       # %bb.0:
991 ; AVX2-FALLBACK-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
992 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm3
993 ; AVX2-FALLBACK-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm4
994 ; AVX2-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm4
995 ; AVX2-FALLBACK-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
996 ; AVX2-FALLBACK-NEXT:    vpsubq %xmm4, %xmm1, %xmm1
997 ; AVX2-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
998 ; AVX2-FALLBACK-NEXT:    vpsrlq $32, %xmm3, %xmm2
999 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
1000 ; AVX2-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm4
1001 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1002 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1003 ; AVX2-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
1004 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1005 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1006 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1007 ; AVX2-FALLBACK-NEXT:    retq
1009 ; XOP-LABEL: vec128_i64_signed_reg_reg:
1010 ; XOP:       # %bb.0:
1011 ; XOP-NEXT:    vpcomgtq %xmm1, %xmm0, %xmm2
1012 ; XOP-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm3
1013 ; XOP-NEXT:    vpcomltq %xmm1, %xmm0, %xmm4
1014 ; XOP-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm4
1015 ; XOP-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
1016 ; XOP-NEXT:    vpsubq %xmm4, %xmm1, %xmm1
1017 ; XOP-NEXT:    vpsrlq $1, %xmm1, %xmm1
1018 ; XOP-NEXT:    vpsrlq $32, %xmm3, %xmm2
1019 ; XOP-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
1020 ; XOP-NEXT:    vpsrlq $32, %xmm1, %xmm4
1021 ; XOP-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1022 ; XOP-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1023 ; XOP-NEXT:    vpsllq $32, %xmm2, %xmm2
1024 ; XOP-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1025 ; XOP-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1026 ; XOP-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1027 ; XOP-NEXT:    retq
1029 ; AVX512F-LABEL: vec128_i64_signed_reg_reg:
1030 ; AVX512F:       # %bb.0:
1031 ; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1032 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1033 ; AVX512F-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1034 ; AVX512F-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1035 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
1036 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1037 ; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
1038 ; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
1039 ; AVX512F-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1040 ; AVX512F-NEXT:    vpsrlq $1, %xmm1, %xmm1
1041 ; AVX512F-NEXT:    vpsrlq $32, %xmm1, %xmm2
1042 ; AVX512F-NEXT:    vpmuludq %xmm3, %xmm2, %xmm2
1043 ; AVX512F-NEXT:    vpsrlq $32, %xmm3, %xmm4
1044 ; AVX512F-NEXT:    vpmuludq %xmm4, %xmm1, %xmm4
1045 ; AVX512F-NEXT:    vpaddq %xmm2, %xmm4, %xmm2
1046 ; AVX512F-NEXT:    vpsllq $32, %xmm2, %xmm2
1047 ; AVX512F-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1048 ; AVX512F-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1049 ; AVX512F-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1050 ; AVX512F-NEXT:    vzeroupper
1051 ; AVX512F-NEXT:    retq
1053 ; AVX512VL-LABEL: vec128_i64_signed_reg_reg:
1054 ; AVX512VL:       # %bb.0:
1055 ; AVX512VL-NEXT:    vpcmpgtq %xmm1, %xmm0, %k1
1056 ; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1057 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
1058 ; AVX512VL-NEXT:    vmovdqa64 %xmm2, %xmm3 {%k1}
1059 ; AVX512VL-NEXT:    vpminsq %xmm1, %xmm0, %xmm2
1060 ; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm1
1061 ; AVX512VL-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1062 ; AVX512VL-NEXT:    vpsrlq $1, %xmm1, %xmm1
1063 ; AVX512VL-NEXT:    vpsrlq $32, %xmm3, %xmm2
1064 ; AVX512VL-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
1065 ; AVX512VL-NEXT:    vpsrlq $32, %xmm1, %xmm4
1066 ; AVX512VL-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1067 ; AVX512VL-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1068 ; AVX512VL-NEXT:    vpsllq $32, %xmm2, %xmm2
1069 ; AVX512VL-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1070 ; AVX512VL-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1071 ; AVX512VL-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1072 ; AVX512VL-NEXT:    retq
1074 ; AVX512BW-FALLBACK-LABEL: vec128_i64_signed_reg_reg:
1075 ; AVX512BW-FALLBACK:       # %bb.0:
1076 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1077 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1078 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1079 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1080 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
1081 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1082 ; AVX512BW-FALLBACK-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
1083 ; AVX512BW-FALLBACK-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
1084 ; AVX512BW-FALLBACK-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1085 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
1086 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm2
1087 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm2, %xmm2
1088 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %xmm3, %xmm4
1089 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm1, %xmm4
1090 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm2, %xmm4, %xmm2
1091 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
1092 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1093 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1094 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1095 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
1096 ; AVX512BW-FALLBACK-NEXT:    retq
1097   %t3 = icmp sgt <2 x i64> %a1, %a2 ; signed
1098   %t4 = select <2 x i1> %t3, <2 x i64> <i64 -1, i64 -1>, <2 x i64> <i64 1, i64 1>
1099   %t5 = select <2 x i1> %t3, <2 x i64> %a2, <2 x i64> %a1
1100   %t6 = select <2 x i1> %t3, <2 x i64> %a1, <2 x i64> %a2
1101   %t7 = sub <2 x i64> %t6, %t5
1102   %t8 = lshr <2 x i64> %t7, <i64 1, i64 1>
1103   %t9 = mul nsw <2 x i64> %t8, %t4 ; signed
1104   %a10 = add nsw <2 x i64> %t9, %a1 ; signed
1105   ret <2 x i64> %a10
1108 define <2 x i64> @vec128_i64_unsigned_reg_reg(<2 x i64> %a1, <2 x i64> %a2) nounwind {
1109 ; SSE2-LABEL: vec128_i64_unsigned_reg_reg:
1110 ; SSE2:       # %bb.0:
1111 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1112 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
1113 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1114 ; SSE2-NEXT:    pxor %xmm0, %xmm4
1115 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
1116 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm2
1117 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
1118 ; SSE2-NEXT:    movdqa %xmm4, %xmm6
1119 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
1120 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1121 ; SSE2-NEXT:    pand %xmm6, %xmm3
1122 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1123 ; SSE2-NEXT:    por %xmm3, %xmm2
1124 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1,1]
1125 ; SSE2-NEXT:    por %xmm2, %xmm3
1126 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
1127 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[0,0,2,2]
1128 ; SSE2-NEXT:    pand %xmm6, %xmm4
1129 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1130 ; SSE2-NEXT:    por %xmm4, %xmm5
1131 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
1132 ; SSE2-NEXT:    pand %xmm5, %xmm4
1133 ; SSE2-NEXT:    pandn %xmm1, %xmm5
1134 ; SSE2-NEXT:    por %xmm4, %xmm5
1135 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
1136 ; SSE2-NEXT:    pand %xmm2, %xmm4
1137 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1138 ; SSE2-NEXT:    por %xmm4, %xmm2
1139 ; SSE2-NEXT:    psubq %xmm5, %xmm2
1140 ; SSE2-NEXT:    psrlq $1, %xmm2
1141 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1142 ; SSE2-NEXT:    psrlq $32, %xmm4
1143 ; SSE2-NEXT:    pmuludq %xmm2, %xmm4
1144 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1145 ; SSE2-NEXT:    psrlq $32, %xmm1
1146 ; SSE2-NEXT:    pmuludq %xmm3, %xmm1
1147 ; SSE2-NEXT:    paddq %xmm4, %xmm1
1148 ; SSE2-NEXT:    psllq $32, %xmm1
1149 ; SSE2-NEXT:    pmuludq %xmm3, %xmm2
1150 ; SSE2-NEXT:    paddq %xmm0, %xmm1
1151 ; SSE2-NEXT:    paddq %xmm2, %xmm1
1152 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1153 ; SSE2-NEXT:    retq
1155 ; SSE41-LABEL: vec128_i64_unsigned_reg_reg:
1156 ; SSE41:       # %bb.0:
1157 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1158 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
1159 ; SSE41-NEXT:    movdqa %xmm1, %xmm5
1160 ; SSE41-NEXT:    pxor %xmm0, %xmm5
1161 ; SSE41-NEXT:    pxor %xmm2, %xmm0
1162 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
1163 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm3
1164 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
1165 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
1166 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm4
1167 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
1168 ; SSE41-NEXT:    pand %xmm7, %xmm6
1169 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
1170 ; SSE41-NEXT:    por %xmm6, %xmm4
1171 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [1,1]
1172 ; SSE41-NEXT:    por %xmm4, %xmm3
1173 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
1174 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1175 ; SSE41-NEXT:    pand %xmm7, %xmm0
1176 ; SSE41-NEXT:    por %xmm5, %xmm0
1177 ; SSE41-NEXT:    movdqa %xmm1, %xmm5
1178 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
1179 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1180 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
1181 ; SSE41-NEXT:    psubq %xmm5, %xmm1
1182 ; SSE41-NEXT:    psrlq $1, %xmm1
1183 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1184 ; SSE41-NEXT:    psrlq $32, %xmm0
1185 ; SSE41-NEXT:    pmuludq %xmm1, %xmm0
1186 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
1187 ; SSE41-NEXT:    psrlq $32, %xmm4
1188 ; SSE41-NEXT:    pmuludq %xmm3, %xmm4
1189 ; SSE41-NEXT:    paddq %xmm0, %xmm4
1190 ; SSE41-NEXT:    psllq $32, %xmm4
1191 ; SSE41-NEXT:    pmuludq %xmm1, %xmm3
1192 ; SSE41-NEXT:    paddq %xmm2, %xmm4
1193 ; SSE41-NEXT:    paddq %xmm4, %xmm3
1194 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1195 ; SSE41-NEXT:    retq
1197 ; AVX1-FALLBACK-LABEL: vec128_i64_unsigned_reg_reg:
1198 ; AVX1-FALLBACK:       # %bb.0:
1199 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1200 ; AVX1-FALLBACK-NEXT:    vpxor %xmm2, %xmm1, %xmm3
1201 ; AVX1-FALLBACK-NEXT:    vpxor %xmm2, %xmm0, %xmm2
1202 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm4
1203 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm4, %xmm5
1204 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
1205 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm2
1206 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm1
1207 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1208 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
1209 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm5, %xmm2
1210 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
1211 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm3
1212 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm3, %xmm3
1213 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
1214 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
1215 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
1216 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1217 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1218 ; AVX1-FALLBACK-NEXT:    retq
1220 ; AVX2-FALLBACK-LABEL: vec128_i64_unsigned_reg_reg:
1221 ; AVX2-FALLBACK:       # %bb.0:
1222 ; AVX2-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1223 ; AVX2-FALLBACK-NEXT:    vpxor %xmm2, %xmm1, %xmm3
1224 ; AVX2-FALLBACK-NEXT:    vpxor %xmm2, %xmm0, %xmm2
1225 ; AVX2-FALLBACK-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm4
1226 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm4, %xmm5
1227 ; AVX2-FALLBACK-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
1228 ; AVX2-FALLBACK-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm2
1229 ; AVX2-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm1
1230 ; AVX2-FALLBACK-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1231 ; AVX2-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
1232 ; AVX2-FALLBACK-NEXT:    vpsrlq $32, %xmm5, %xmm2
1233 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
1234 ; AVX2-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm3
1235 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm3, %xmm3
1236 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
1237 ; AVX2-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
1238 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
1239 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1240 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1241 ; AVX2-FALLBACK-NEXT:    retq
1243 ; XOP-LABEL: vec128_i64_unsigned_reg_reg:
1244 ; XOP:       # %bb.0:
1245 ; XOP-NEXT:    vpcomgtuq %xmm1, %xmm0, %xmm2
1246 ; XOP-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm3
1247 ; XOP-NEXT:    vpcomltuq %xmm1, %xmm0, %xmm4
1248 ; XOP-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm4
1249 ; XOP-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
1250 ; XOP-NEXT:    vpsubq %xmm4, %xmm1, %xmm1
1251 ; XOP-NEXT:    vpsrlq $1, %xmm1, %xmm1
1252 ; XOP-NEXT:    vpsrlq $32, %xmm3, %xmm2
1253 ; XOP-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
1254 ; XOP-NEXT:    vpsrlq $32, %xmm1, %xmm4
1255 ; XOP-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1256 ; XOP-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1257 ; XOP-NEXT:    vpsllq $32, %xmm2, %xmm2
1258 ; XOP-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1259 ; XOP-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1260 ; XOP-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1261 ; XOP-NEXT:    retq
1263 ; AVX512F-LABEL: vec128_i64_unsigned_reg_reg:
1264 ; AVX512F:       # %bb.0:
1265 ; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1266 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1267 ; AVX512F-NEXT:    vpcmpnleuq %zmm1, %zmm0, %k1
1268 ; AVX512F-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1269 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
1270 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1271 ; AVX512F-NEXT:    vpminuq %zmm1, %zmm0, %zmm2
1272 ; AVX512F-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm1
1273 ; AVX512F-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1274 ; AVX512F-NEXT:    vpsrlq $1, %xmm1, %xmm1
1275 ; AVX512F-NEXT:    vpsrlq $32, %xmm1, %xmm2
1276 ; AVX512F-NEXT:    vpmuludq %xmm3, %xmm2, %xmm2
1277 ; AVX512F-NEXT:    vpsrlq $32, %xmm3, %xmm4
1278 ; AVX512F-NEXT:    vpmuludq %xmm4, %xmm1, %xmm4
1279 ; AVX512F-NEXT:    vpaddq %xmm2, %xmm4, %xmm2
1280 ; AVX512F-NEXT:    vpsllq $32, %xmm2, %xmm2
1281 ; AVX512F-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1282 ; AVX512F-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1283 ; AVX512F-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1284 ; AVX512F-NEXT:    vzeroupper
1285 ; AVX512F-NEXT:    retq
1287 ; AVX512VL-LABEL: vec128_i64_unsigned_reg_reg:
1288 ; AVX512VL:       # %bb.0:
1289 ; AVX512VL-NEXT:    vpcmpnleuq %xmm1, %xmm0, %k1
1290 ; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1291 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
1292 ; AVX512VL-NEXT:    vmovdqa64 %xmm2, %xmm3 {%k1}
1293 ; AVX512VL-NEXT:    vpminuq %xmm1, %xmm0, %xmm2
1294 ; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm1
1295 ; AVX512VL-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1296 ; AVX512VL-NEXT:    vpsrlq $1, %xmm1, %xmm1
1297 ; AVX512VL-NEXT:    vpsrlq $32, %xmm3, %xmm2
1298 ; AVX512VL-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
1299 ; AVX512VL-NEXT:    vpsrlq $32, %xmm1, %xmm4
1300 ; AVX512VL-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1301 ; AVX512VL-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1302 ; AVX512VL-NEXT:    vpsllq $32, %xmm2, %xmm2
1303 ; AVX512VL-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1304 ; AVX512VL-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1305 ; AVX512VL-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1306 ; AVX512VL-NEXT:    retq
1308 ; AVX512BW-FALLBACK-LABEL: vec128_i64_unsigned_reg_reg:
1309 ; AVX512BW-FALLBACK:       # %bb.0:
1310 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1311 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1312 ; AVX512BW-FALLBACK-NEXT:    vpcmpnleuq %zmm1, %zmm0, %k1
1313 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1314 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
1315 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1316 ; AVX512BW-FALLBACK-NEXT:    vpminuq %zmm1, %zmm0, %zmm2
1317 ; AVX512BW-FALLBACK-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm1
1318 ; AVX512BW-FALLBACK-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1319 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
1320 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm2
1321 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm2, %xmm2
1322 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %xmm3, %xmm4
1323 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm1, %xmm4
1324 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm2, %xmm4, %xmm2
1325 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
1326 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1327 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1328 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1329 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
1330 ; AVX512BW-FALLBACK-NEXT:    retq
1331   %t3 = icmp ugt <2 x i64> %a1, %a2
1332   %t4 = select <2 x i1> %t3, <2 x i64> <i64 -1, i64 -1>, <2 x i64> <i64 1, i64 1>
1333   %t5 = select <2 x i1> %t3, <2 x i64> %a2, <2 x i64> %a1
1334   %t6 = select <2 x i1> %t3, <2 x i64> %a1, <2 x i64> %a2
1335   %t7 = sub <2 x i64> %t6, %t5
1336   %t8 = lshr <2 x i64> %t7, <i64 1, i64 1>
1337   %t9 = mul <2 x i64> %t8, %t4
1338   %a10 = add <2 x i64> %t9, %a1
1339   ret <2 x i64> %a10
1342 ; Values are loaded. Only check signed case.
1344 define <2 x i64> @vec128_i64_signed_mem_reg(<2 x i64>* %a1_addr, <2 x i64> %a2) nounwind {
1345 ; SSE2-LABEL: vec128_i64_signed_mem_reg:
1346 ; SSE2:       # %bb.0:
1347 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
1348 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
1349 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1350 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1351 ; SSE2-NEXT:    pxor %xmm1, %xmm4
1352 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
1353 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm2
1354 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
1355 ; SSE2-NEXT:    movdqa %xmm4, %xmm6
1356 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
1357 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1358 ; SSE2-NEXT:    pand %xmm6, %xmm3
1359 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1360 ; SSE2-NEXT:    por %xmm3, %xmm2
1361 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1,1]
1362 ; SSE2-NEXT:    por %xmm2, %xmm3
1363 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
1364 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[0,0,2,2]
1365 ; SSE2-NEXT:    pand %xmm6, %xmm4
1366 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1367 ; SSE2-NEXT:    por %xmm4, %xmm5
1368 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1369 ; SSE2-NEXT:    pand %xmm5, %xmm4
1370 ; SSE2-NEXT:    pandn %xmm0, %xmm5
1371 ; SSE2-NEXT:    por %xmm4, %xmm5
1372 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1373 ; SSE2-NEXT:    pand %xmm2, %xmm4
1374 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1375 ; SSE2-NEXT:    por %xmm4, %xmm2
1376 ; SSE2-NEXT:    psubq %xmm5, %xmm2
1377 ; SSE2-NEXT:    psrlq $1, %xmm2
1378 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1379 ; SSE2-NEXT:    psrlq $32, %xmm4
1380 ; SSE2-NEXT:    pmuludq %xmm2, %xmm4
1381 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1382 ; SSE2-NEXT:    psrlq $32, %xmm0
1383 ; SSE2-NEXT:    pmuludq %xmm3, %xmm0
1384 ; SSE2-NEXT:    paddq %xmm4, %xmm0
1385 ; SSE2-NEXT:    psllq $32, %xmm0
1386 ; SSE2-NEXT:    pmuludq %xmm3, %xmm2
1387 ; SSE2-NEXT:    paddq %xmm1, %xmm0
1388 ; SSE2-NEXT:    paddq %xmm2, %xmm0
1389 ; SSE2-NEXT:    retq
1391 ; SSE41-LABEL: vec128_i64_signed_mem_reg:
1392 ; SSE41:       # %bb.0:
1393 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1394 ; SSE41-NEXT:    movdqa (%rdi), %xmm3
1395 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
1396 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1397 ; SSE41-NEXT:    pxor %xmm3, %xmm5
1398 ; SSE41-NEXT:    movdqa %xmm5, %xmm2
1399 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
1400 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1401 ; SSE41-NEXT:    movdqa %xmm5, %xmm6
1402 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
1403 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1404 ; SSE41-NEXT:    pand %xmm6, %xmm4
1405 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1406 ; SSE41-NEXT:    por %xmm4, %xmm2
1407 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [1,1]
1408 ; SSE41-NEXT:    por %xmm2, %xmm4
1409 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm0
1410 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
1411 ; SSE41-NEXT:    pand %xmm6, %xmm5
1412 ; SSE41-NEXT:    por %xmm5, %xmm0
1413 ; SSE41-NEXT:    movdqa %xmm1, %xmm5
1414 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm5
1415 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1416 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
1417 ; SSE41-NEXT:    psubq %xmm5, %xmm1
1418 ; SSE41-NEXT:    psrlq $1, %xmm1
1419 ; SSE41-NEXT:    movdqa %xmm4, %xmm2
1420 ; SSE41-NEXT:    psrlq $32, %xmm2
1421 ; SSE41-NEXT:    pmuludq %xmm1, %xmm2
1422 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1423 ; SSE41-NEXT:    psrlq $32, %xmm0
1424 ; SSE41-NEXT:    pmuludq %xmm4, %xmm0
1425 ; SSE41-NEXT:    paddq %xmm2, %xmm0
1426 ; SSE41-NEXT:    psllq $32, %xmm0
1427 ; SSE41-NEXT:    pmuludq %xmm4, %xmm1
1428 ; SSE41-NEXT:    paddq %xmm3, %xmm0
1429 ; SSE41-NEXT:    paddq %xmm1, %xmm0
1430 ; SSE41-NEXT:    retq
1432 ; AVX1-FALLBACK-LABEL: vec128_i64_signed_mem_reg:
1433 ; AVX1-FALLBACK:       # %bb.0:
1434 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
1435 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1436 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm3
1437 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm4
1438 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm1, %xmm0, %xmm4
1439 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
1440 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm4, %xmm0, %xmm0
1441 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm0, %xmm0
1442 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm3, %xmm2
1443 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm2, %xmm0, %xmm2
1444 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm0, %xmm4
1445 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1446 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1447 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
1448 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm0, %xmm0
1449 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm1, %xmm2, %xmm1
1450 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1451 ; AVX1-FALLBACK-NEXT:    retq
1453 ; AVX2-FALLBACK-LABEL: vec128_i64_signed_mem_reg:
1454 ; AVX2-FALLBACK:       # %bb.0:
1455 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
1456 ; AVX2-FALLBACK-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1457 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm3
1458 ; AVX2-FALLBACK-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm4
1459 ; AVX2-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm1, %xmm0, %xmm4
1460 ; AVX2-FALLBACK-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
1461 ; AVX2-FALLBACK-NEXT:    vpsubq %xmm4, %xmm0, %xmm0
1462 ; AVX2-FALLBACK-NEXT:    vpsrlq $1, %xmm0, %xmm0
1463 ; AVX2-FALLBACK-NEXT:    vpsrlq $32, %xmm3, %xmm2
1464 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm2, %xmm0, %xmm2
1465 ; AVX2-FALLBACK-NEXT:    vpsrlq $32, %xmm0, %xmm4
1466 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1467 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1468 ; AVX2-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
1469 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm0, %xmm0
1470 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm1, %xmm2, %xmm1
1471 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1472 ; AVX2-FALLBACK-NEXT:    retq
1474 ; XOP-LABEL: vec128_i64_signed_mem_reg:
1475 ; XOP:       # %bb.0:
1476 ; XOP-NEXT:    vmovdqa (%rdi), %xmm1
1477 ; XOP-NEXT:    vpcomgtq %xmm0, %xmm1, %xmm2
1478 ; XOP-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm3
1479 ; XOP-NEXT:    vpcomltq %xmm0, %xmm1, %xmm4
1480 ; XOP-NEXT:    vblendvpd %xmm4, %xmm1, %xmm0, %xmm4
1481 ; XOP-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
1482 ; XOP-NEXT:    vpsubq %xmm4, %xmm0, %xmm0
1483 ; XOP-NEXT:    vpsrlq $1, %xmm0, %xmm0
1484 ; XOP-NEXT:    vpsrlq $32, %xmm3, %xmm2
1485 ; XOP-NEXT:    vpmuludq %xmm2, %xmm0, %xmm2
1486 ; XOP-NEXT:    vpsrlq $32, %xmm0, %xmm4
1487 ; XOP-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1488 ; XOP-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1489 ; XOP-NEXT:    vpsllq $32, %xmm2, %xmm2
1490 ; XOP-NEXT:    vpmuludq %xmm3, %xmm0, %xmm0
1491 ; XOP-NEXT:    vpaddq %xmm1, %xmm2, %xmm1
1492 ; XOP-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1493 ; XOP-NEXT:    retq
1495 ; AVX512F-LABEL: vec128_i64_signed_mem_reg:
1496 ; AVX512F:       # %bb.0:
1497 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1498 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm1
1499 ; AVX512F-NEXT:    vpcmpgtq %zmm0, %zmm1, %k1
1500 ; AVX512F-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1501 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
1502 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1503 ; AVX512F-NEXT:    vpminsq %zmm0, %zmm1, %zmm2
1504 ; AVX512F-NEXT:    vpmaxsq %zmm0, %zmm1, %zmm0
1505 ; AVX512F-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
1506 ; AVX512F-NEXT:    vpsrlq $1, %xmm0, %xmm0
1507 ; AVX512F-NEXT:    vpsrlq $32, %xmm0, %xmm2
1508 ; AVX512F-NEXT:    vpmuludq %xmm3, %xmm2, %xmm2
1509 ; AVX512F-NEXT:    vpsrlq $32, %xmm3, %xmm4
1510 ; AVX512F-NEXT:    vpmuludq %xmm4, %xmm0, %xmm4
1511 ; AVX512F-NEXT:    vpaddq %xmm2, %xmm4, %xmm2
1512 ; AVX512F-NEXT:    vpsllq $32, %xmm2, %xmm2
1513 ; AVX512F-NEXT:    vpmuludq %xmm3, %xmm0, %xmm0
1514 ; AVX512F-NEXT:    vpaddq %xmm1, %xmm2, %xmm1
1515 ; AVX512F-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1516 ; AVX512F-NEXT:    vzeroupper
1517 ; AVX512F-NEXT:    retq
1519 ; AVX512VL-LABEL: vec128_i64_signed_mem_reg:
1520 ; AVX512VL:       # %bb.0:
1521 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm1
1522 ; AVX512VL-NEXT:    vpcmpgtq %xmm0, %xmm1, %k1
1523 ; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1524 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
1525 ; AVX512VL-NEXT:    vmovdqa64 %xmm2, %xmm3 {%k1}
1526 ; AVX512VL-NEXT:    vpminsq %xmm0, %xmm1, %xmm2
1527 ; AVX512VL-NEXT:    vpmaxsq %xmm0, %xmm1, %xmm0
1528 ; AVX512VL-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
1529 ; AVX512VL-NEXT:    vpsrlq $1, %xmm0, %xmm0
1530 ; AVX512VL-NEXT:    vpsrlq $32, %xmm3, %xmm2
1531 ; AVX512VL-NEXT:    vpmuludq %xmm2, %xmm0, %xmm2
1532 ; AVX512VL-NEXT:    vpsrlq $32, %xmm0, %xmm4
1533 ; AVX512VL-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1534 ; AVX512VL-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1535 ; AVX512VL-NEXT:    vpsllq $32, %xmm2, %xmm2
1536 ; AVX512VL-NEXT:    vpmuludq %xmm3, %xmm0, %xmm0
1537 ; AVX512VL-NEXT:    vpaddq %xmm1, %xmm2, %xmm1
1538 ; AVX512VL-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1539 ; AVX512VL-NEXT:    retq
1541 ; AVX512BW-FALLBACK-LABEL: vec128_i64_signed_mem_reg:
1542 ; AVX512BW-FALLBACK:       # %bb.0:
1543 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1544 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
1545 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtq %zmm0, %zmm1, %k1
1546 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1547 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
1548 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1549 ; AVX512BW-FALLBACK-NEXT:    vpminsq %zmm0, %zmm1, %zmm2
1550 ; AVX512BW-FALLBACK-NEXT:    vpmaxsq %zmm0, %zmm1, %zmm0
1551 ; AVX512BW-FALLBACK-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
1552 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %xmm0, %xmm0
1553 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %xmm0, %xmm2
1554 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm2, %xmm2
1555 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %xmm3, %xmm4
1556 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm0, %xmm4
1557 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm2, %xmm4, %xmm2
1558 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
1559 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm0, %xmm0
1560 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm1, %xmm2, %xmm1
1561 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
1562 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
1563 ; AVX512BW-FALLBACK-NEXT:    retq
1564   %a1 = load <2 x i64>, <2 x i64>* %a1_addr
1565   %t3 = icmp sgt <2 x i64> %a1, %a2 ; signed
1566   %t4 = select <2 x i1> %t3, <2 x i64> <i64 -1, i64 -1>, <2 x i64> <i64 1, i64 1>
1567   %t5 = select <2 x i1> %t3, <2 x i64> %a2, <2 x i64> %a1
1568   %t6 = select <2 x i1> %t3, <2 x i64> %a1, <2 x i64> %a2
1569   %t7 = sub <2 x i64> %t6, %t5
1570   %t8 = lshr <2 x i64> %t7, <i64 1, i64 1>
1571   %t9 = mul nsw <2 x i64> %t8, %t4 ; signed
1572   %a10 = add nsw <2 x i64> %t9, %a1 ; signed
1573   ret <2 x i64> %a10
1576 define <2 x i64> @vec128_i64_signed_reg_mem(<2 x i64> %a1, <2 x i64>* %a2_addr) nounwind {
1577 ; SSE2-LABEL: vec128_i64_signed_reg_mem:
1578 ; SSE2:       # %bb.0:
1579 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
1580 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
1581 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1582 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1583 ; SSE2-NEXT:    pxor %xmm1, %xmm4
1584 ; SSE2-NEXT:    movdqa %xmm5, %xmm2
1585 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
1586 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
1587 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
1588 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm6
1589 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1590 ; SSE2-NEXT:    pand %xmm6, %xmm3
1591 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1592 ; SSE2-NEXT:    por %xmm3, %xmm2
1593 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1,1]
1594 ; SSE2-NEXT:    por %xmm2, %xmm3
1595 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
1596 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1597 ; SSE2-NEXT:    pand %xmm6, %xmm5
1598 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1599 ; SSE2-NEXT:    por %xmm5, %xmm4
1600 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1601 ; SSE2-NEXT:    pand %xmm4, %xmm5
1602 ; SSE2-NEXT:    pandn %xmm1, %xmm4
1603 ; SSE2-NEXT:    por %xmm5, %xmm4
1604 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1605 ; SSE2-NEXT:    pand %xmm2, %xmm5
1606 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1607 ; SSE2-NEXT:    por %xmm5, %xmm2
1608 ; SSE2-NEXT:    psubq %xmm4, %xmm2
1609 ; SSE2-NEXT:    psrlq $1, %xmm2
1610 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1611 ; SSE2-NEXT:    psrlq $32, %xmm4
1612 ; SSE2-NEXT:    pmuludq %xmm2, %xmm4
1613 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1614 ; SSE2-NEXT:    psrlq $32, %xmm1
1615 ; SSE2-NEXT:    pmuludq %xmm3, %xmm1
1616 ; SSE2-NEXT:    paddq %xmm4, %xmm1
1617 ; SSE2-NEXT:    psllq $32, %xmm1
1618 ; SSE2-NEXT:    pmuludq %xmm3, %xmm2
1619 ; SSE2-NEXT:    paddq %xmm0, %xmm1
1620 ; SSE2-NEXT:    paddq %xmm2, %xmm1
1621 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1622 ; SSE2-NEXT:    retq
1624 ; SSE41-LABEL: vec128_i64_signed_reg_mem:
1625 ; SSE41:       # %bb.0:
1626 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1627 ; SSE41-NEXT:    movdqa (%rdi), %xmm3
1628 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
1629 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1630 ; SSE41-NEXT:    pxor %xmm3, %xmm5
1631 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1632 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm2
1633 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1634 ; SSE41-NEXT:    movdqa %xmm0, %xmm6
1635 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm6
1636 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1637 ; SSE41-NEXT:    pand %xmm6, %xmm4
1638 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1639 ; SSE41-NEXT:    por %xmm4, %xmm2
1640 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [1,1]
1641 ; SSE41-NEXT:    por %xmm2, %xmm4
1642 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
1643 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1644 ; SSE41-NEXT:    pand %xmm6, %xmm0
1645 ; SSE41-NEXT:    por %xmm5, %xmm0
1646 ; SSE41-NEXT:    movdqa %xmm3, %xmm5
1647 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
1648 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1649 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
1650 ; SSE41-NEXT:    psubq %xmm5, %xmm3
1651 ; SSE41-NEXT:    psrlq $1, %xmm3
1652 ; SSE41-NEXT:    movdqa %xmm4, %xmm2
1653 ; SSE41-NEXT:    psrlq $32, %xmm2
1654 ; SSE41-NEXT:    pmuludq %xmm3, %xmm2
1655 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1656 ; SSE41-NEXT:    psrlq $32, %xmm0
1657 ; SSE41-NEXT:    pmuludq %xmm4, %xmm0
1658 ; SSE41-NEXT:    paddq %xmm2, %xmm0
1659 ; SSE41-NEXT:    psllq $32, %xmm0
1660 ; SSE41-NEXT:    pmuludq %xmm4, %xmm3
1661 ; SSE41-NEXT:    paddq %xmm1, %xmm0
1662 ; SSE41-NEXT:    paddq %xmm3, %xmm0
1663 ; SSE41-NEXT:    retq
1665 ; AVX1-FALLBACK-LABEL: vec128_i64_signed_reg_mem:
1666 ; AVX1-FALLBACK:       # %bb.0:
1667 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
1668 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1669 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm3
1670 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm4
1671 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm4
1672 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
1673 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm4, %xmm1, %xmm1
1674 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
1675 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm3, %xmm2
1676 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
1677 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm4
1678 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1679 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1680 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
1681 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1682 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1683 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1684 ; AVX1-FALLBACK-NEXT:    retq
1686 ; AVX2-FALLBACK-LABEL: vec128_i64_signed_reg_mem:
1687 ; AVX2-FALLBACK:       # %bb.0:
1688 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
1689 ; AVX2-FALLBACK-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1690 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm3
1691 ; AVX2-FALLBACK-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm4
1692 ; AVX2-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm4
1693 ; AVX2-FALLBACK-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
1694 ; AVX2-FALLBACK-NEXT:    vpsubq %xmm4, %xmm1, %xmm1
1695 ; AVX2-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
1696 ; AVX2-FALLBACK-NEXT:    vpsrlq $32, %xmm3, %xmm2
1697 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
1698 ; AVX2-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm4
1699 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1700 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1701 ; AVX2-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
1702 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1703 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1704 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1705 ; AVX2-FALLBACK-NEXT:    retq
1707 ; XOP-LABEL: vec128_i64_signed_reg_mem:
1708 ; XOP:       # %bb.0:
1709 ; XOP-NEXT:    vmovdqa (%rdi), %xmm1
1710 ; XOP-NEXT:    vpcomgtq %xmm1, %xmm0, %xmm2
1711 ; XOP-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm3
1712 ; XOP-NEXT:    vpcomltq %xmm1, %xmm0, %xmm4
1713 ; XOP-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm4
1714 ; XOP-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
1715 ; XOP-NEXT:    vpsubq %xmm4, %xmm1, %xmm1
1716 ; XOP-NEXT:    vpsrlq $1, %xmm1, %xmm1
1717 ; XOP-NEXT:    vpsrlq $32, %xmm3, %xmm2
1718 ; XOP-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
1719 ; XOP-NEXT:    vpsrlq $32, %xmm1, %xmm4
1720 ; XOP-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1721 ; XOP-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1722 ; XOP-NEXT:    vpsllq $32, %xmm2, %xmm2
1723 ; XOP-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1724 ; XOP-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1725 ; XOP-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1726 ; XOP-NEXT:    retq
1728 ; AVX512F-LABEL: vec128_i64_signed_reg_mem:
1729 ; AVX512F:       # %bb.0:
1730 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1731 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm1
1732 ; AVX512F-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1733 ; AVX512F-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1734 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
1735 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1736 ; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
1737 ; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
1738 ; AVX512F-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1739 ; AVX512F-NEXT:    vpsrlq $1, %xmm1, %xmm1
1740 ; AVX512F-NEXT:    vpsrlq $32, %xmm1, %xmm2
1741 ; AVX512F-NEXT:    vpmuludq %xmm3, %xmm2, %xmm2
1742 ; AVX512F-NEXT:    vpsrlq $32, %xmm3, %xmm4
1743 ; AVX512F-NEXT:    vpmuludq %xmm4, %xmm1, %xmm4
1744 ; AVX512F-NEXT:    vpaddq %xmm2, %xmm4, %xmm2
1745 ; AVX512F-NEXT:    vpsllq $32, %xmm2, %xmm2
1746 ; AVX512F-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1747 ; AVX512F-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1748 ; AVX512F-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1749 ; AVX512F-NEXT:    vzeroupper
1750 ; AVX512F-NEXT:    retq
1752 ; AVX512VL-LABEL: vec128_i64_signed_reg_mem:
1753 ; AVX512VL:       # %bb.0:
1754 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm1
1755 ; AVX512VL-NEXT:    vpcmpgtq %xmm1, %xmm0, %k1
1756 ; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1757 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
1758 ; AVX512VL-NEXT:    vmovdqa64 %xmm2, %xmm3 {%k1}
1759 ; AVX512VL-NEXT:    vpminsq %xmm1, %xmm0, %xmm2
1760 ; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm1
1761 ; AVX512VL-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1762 ; AVX512VL-NEXT:    vpsrlq $1, %xmm1, %xmm1
1763 ; AVX512VL-NEXT:    vpsrlq $32, %xmm3, %xmm2
1764 ; AVX512VL-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
1765 ; AVX512VL-NEXT:    vpsrlq $32, %xmm1, %xmm4
1766 ; AVX512VL-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1767 ; AVX512VL-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1768 ; AVX512VL-NEXT:    vpsllq $32, %xmm2, %xmm2
1769 ; AVX512VL-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1770 ; AVX512VL-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1771 ; AVX512VL-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1772 ; AVX512VL-NEXT:    retq
1774 ; AVX512BW-FALLBACK-LABEL: vec128_i64_signed_reg_mem:
1775 ; AVX512BW-FALLBACK:       # %bb.0:
1776 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1777 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
1778 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1779 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1780 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
1781 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1782 ; AVX512BW-FALLBACK-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
1783 ; AVX512BW-FALLBACK-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
1784 ; AVX512BW-FALLBACK-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1785 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
1786 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm2
1787 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm2, %xmm2
1788 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %xmm3, %xmm4
1789 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm1, %xmm4
1790 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm2, %xmm4, %xmm2
1791 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
1792 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1793 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1794 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1795 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
1796 ; AVX512BW-FALLBACK-NEXT:    retq
1797   %a2 = load <2 x i64>, <2 x i64>* %a2_addr
1798   %t3 = icmp sgt <2 x i64> %a1, %a2 ; signed
1799   %t4 = select <2 x i1> %t3, <2 x i64> <i64 -1, i64 -1>, <2 x i64> <i64 1, i64 1>
1800   %t5 = select <2 x i1> %t3, <2 x i64> %a2, <2 x i64> %a1
1801   %t6 = select <2 x i1> %t3, <2 x i64> %a1, <2 x i64> %a2
1802   %t7 = sub <2 x i64> %t6, %t5
1803   %t8 = lshr <2 x i64> %t7, <i64 1, i64 1>
1804   %t9 = mul nsw <2 x i64> %t8, %t4 ; signed
1805   %a10 = add nsw <2 x i64> %t9, %a1 ; signed
1806   ret <2 x i64> %a10
1809 define <2 x i64> @vec128_i64_signed_mem_mem(<2 x i64>* %a1_addr, <2 x i64>* %a2_addr) nounwind {
1810 ; SSE2-LABEL: vec128_i64_signed_mem_mem:
1811 ; SSE2:       # %bb.0:
1812 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
1813 ; SSE2-NEXT:    movdqa (%rsi), %xmm0
1814 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
1815 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1816 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1817 ; SSE2-NEXT:    pxor %xmm1, %xmm4
1818 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
1819 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm2
1820 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
1821 ; SSE2-NEXT:    movdqa %xmm4, %xmm6
1822 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
1823 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1824 ; SSE2-NEXT:    pand %xmm6, %xmm3
1825 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1826 ; SSE2-NEXT:    por %xmm3, %xmm2
1827 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1,1]
1828 ; SSE2-NEXT:    por %xmm2, %xmm3
1829 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
1830 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[0,0,2,2]
1831 ; SSE2-NEXT:    pand %xmm6, %xmm4
1832 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1833 ; SSE2-NEXT:    por %xmm4, %xmm5
1834 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1835 ; SSE2-NEXT:    pand %xmm5, %xmm4
1836 ; SSE2-NEXT:    pandn %xmm0, %xmm5
1837 ; SSE2-NEXT:    por %xmm4, %xmm5
1838 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1839 ; SSE2-NEXT:    pand %xmm2, %xmm4
1840 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1841 ; SSE2-NEXT:    por %xmm4, %xmm2
1842 ; SSE2-NEXT:    psubq %xmm5, %xmm2
1843 ; SSE2-NEXT:    psrlq $1, %xmm2
1844 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1845 ; SSE2-NEXT:    psrlq $32, %xmm4
1846 ; SSE2-NEXT:    pmuludq %xmm2, %xmm4
1847 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1848 ; SSE2-NEXT:    psrlq $32, %xmm0
1849 ; SSE2-NEXT:    pmuludq %xmm3, %xmm0
1850 ; SSE2-NEXT:    paddq %xmm4, %xmm0
1851 ; SSE2-NEXT:    psllq $32, %xmm0
1852 ; SSE2-NEXT:    pmuludq %xmm3, %xmm2
1853 ; SSE2-NEXT:    paddq %xmm1, %xmm0
1854 ; SSE2-NEXT:    paddq %xmm2, %xmm0
1855 ; SSE2-NEXT:    retq
1857 ; SSE41-LABEL: vec128_i64_signed_mem_mem:
1858 ; SSE41:       # %bb.0:
1859 ; SSE41-NEXT:    movdqa (%rdi), %xmm3
1860 ; SSE41-NEXT:    movdqa (%rsi), %xmm2
1861 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
1862 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
1863 ; SSE41-NEXT:    pxor %xmm0, %xmm5
1864 ; SSE41-NEXT:    pxor %xmm3, %xmm0
1865 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1866 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm1
1867 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
1868 ; SSE41-NEXT:    movdqa %xmm0, %xmm6
1869 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm6
1870 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1871 ; SSE41-NEXT:    pand %xmm6, %xmm4
1872 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1873 ; SSE41-NEXT:    por %xmm4, %xmm1
1874 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [1,1]
1875 ; SSE41-NEXT:    por %xmm1, %xmm4
1876 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
1877 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1878 ; SSE41-NEXT:    pand %xmm6, %xmm0
1879 ; SSE41-NEXT:    por %xmm5, %xmm0
1880 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
1881 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm5
1882 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1883 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
1884 ; SSE41-NEXT:    psubq %xmm5, %xmm2
1885 ; SSE41-NEXT:    psrlq $1, %xmm2
1886 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
1887 ; SSE41-NEXT:    psrlq $32, %xmm1
1888 ; SSE41-NEXT:    pmuludq %xmm2, %xmm1
1889 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1890 ; SSE41-NEXT:    psrlq $32, %xmm0
1891 ; SSE41-NEXT:    pmuludq %xmm4, %xmm0
1892 ; SSE41-NEXT:    paddq %xmm1, %xmm0
1893 ; SSE41-NEXT:    psllq $32, %xmm0
1894 ; SSE41-NEXT:    pmuludq %xmm4, %xmm2
1895 ; SSE41-NEXT:    paddq %xmm3, %xmm0
1896 ; SSE41-NEXT:    paddq %xmm2, %xmm0
1897 ; SSE41-NEXT:    retq
1899 ; AVX1-FALLBACK-LABEL: vec128_i64_signed_mem_mem:
1900 ; AVX1-FALLBACK:       # %bb.0:
1901 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
1902 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
1903 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1904 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm3
1905 ; AVX1-FALLBACK-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm4
1906 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm4
1907 ; AVX1-FALLBACK-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
1908 ; AVX1-FALLBACK-NEXT:    vpsubq %xmm4, %xmm1, %xmm1
1909 ; AVX1-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
1910 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm3, %xmm2
1911 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
1912 ; AVX1-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm4
1913 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1914 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1915 ; AVX1-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
1916 ; AVX1-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1917 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1918 ; AVX1-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1919 ; AVX1-FALLBACK-NEXT:    retq
1921 ; AVX2-FALLBACK-LABEL: vec128_i64_signed_mem_mem:
1922 ; AVX2-FALLBACK:       # %bb.0:
1923 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
1924 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
1925 ; AVX2-FALLBACK-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1926 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm3
1927 ; AVX2-FALLBACK-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm4
1928 ; AVX2-FALLBACK-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm4
1929 ; AVX2-FALLBACK-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
1930 ; AVX2-FALLBACK-NEXT:    vpsubq %xmm4, %xmm1, %xmm1
1931 ; AVX2-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
1932 ; AVX2-FALLBACK-NEXT:    vpsrlq $32, %xmm3, %xmm2
1933 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
1934 ; AVX2-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm4
1935 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1936 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1937 ; AVX2-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
1938 ; AVX2-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1939 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1940 ; AVX2-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1941 ; AVX2-FALLBACK-NEXT:    retq
1943 ; XOP-LABEL: vec128_i64_signed_mem_mem:
1944 ; XOP:       # %bb.0:
1945 ; XOP-NEXT:    vmovdqa (%rdi), %xmm0
1946 ; XOP-NEXT:    vmovdqa (%rsi), %xmm1
1947 ; XOP-NEXT:    vpcomgtq %xmm1, %xmm0, %xmm2
1948 ; XOP-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm3
1949 ; XOP-NEXT:    vpcomltq %xmm1, %xmm0, %xmm4
1950 ; XOP-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm4
1951 ; XOP-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
1952 ; XOP-NEXT:    vpsubq %xmm4, %xmm1, %xmm1
1953 ; XOP-NEXT:    vpsrlq $1, %xmm1, %xmm1
1954 ; XOP-NEXT:    vpsrlq $32, %xmm3, %xmm2
1955 ; XOP-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
1956 ; XOP-NEXT:    vpsrlq $32, %xmm1, %xmm4
1957 ; XOP-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
1958 ; XOP-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
1959 ; XOP-NEXT:    vpsllq $32, %xmm2, %xmm2
1960 ; XOP-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1961 ; XOP-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1962 ; XOP-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1963 ; XOP-NEXT:    retq
1965 ; AVX512F-LABEL: vec128_i64_signed_mem_mem:
1966 ; AVX512F:       # %bb.0:
1967 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
1968 ; AVX512F-NEXT:    vmovdqa (%rsi), %xmm1
1969 ; AVX512F-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
1970 ; AVX512F-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1971 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
1972 ; AVX512F-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
1973 ; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
1974 ; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
1975 ; AVX512F-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1976 ; AVX512F-NEXT:    vpsrlq $1, %xmm1, %xmm1
1977 ; AVX512F-NEXT:    vpsrlq $32, %xmm1, %xmm2
1978 ; AVX512F-NEXT:    vpmuludq %xmm3, %xmm2, %xmm2
1979 ; AVX512F-NEXT:    vpsrlq $32, %xmm3, %xmm4
1980 ; AVX512F-NEXT:    vpmuludq %xmm4, %xmm1, %xmm4
1981 ; AVX512F-NEXT:    vpaddq %xmm2, %xmm4, %xmm2
1982 ; AVX512F-NEXT:    vpsllq $32, %xmm2, %xmm2
1983 ; AVX512F-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
1984 ; AVX512F-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
1985 ; AVX512F-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
1986 ; AVX512F-NEXT:    vzeroupper
1987 ; AVX512F-NEXT:    retq
1989 ; AVX512VL-LABEL: vec128_i64_signed_mem_mem:
1990 ; AVX512VL:       # %bb.0:
1991 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
1992 ; AVX512VL-NEXT:    vmovdqa (%rsi), %xmm1
1993 ; AVX512VL-NEXT:    vpcmpgtq %xmm1, %xmm0, %k1
1994 ; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1995 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
1996 ; AVX512VL-NEXT:    vmovdqa64 %xmm2, %xmm3 {%k1}
1997 ; AVX512VL-NEXT:    vpminsq %xmm1, %xmm0, %xmm2
1998 ; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm1
1999 ; AVX512VL-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
2000 ; AVX512VL-NEXT:    vpsrlq $1, %xmm1, %xmm1
2001 ; AVX512VL-NEXT:    vpsrlq $32, %xmm3, %xmm2
2002 ; AVX512VL-NEXT:    vpmuludq %xmm2, %xmm1, %xmm2
2003 ; AVX512VL-NEXT:    vpsrlq $32, %xmm1, %xmm4
2004 ; AVX512VL-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
2005 ; AVX512VL-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
2006 ; AVX512VL-NEXT:    vpsllq $32, %xmm2, %xmm2
2007 ; AVX512VL-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
2008 ; AVX512VL-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
2009 ; AVX512VL-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
2010 ; AVX512VL-NEXT:    retq
2012 ; AVX512BW-FALLBACK-LABEL: vec128_i64_signed_mem_mem:
2013 ; AVX512BW-FALLBACK:       # %bb.0:
2014 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
2015 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
2016 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
2017 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2018 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
2019 ; AVX512BW-FALLBACK-NEXT:    vmovdqa64 %zmm2, %zmm3 {%k1}
2020 ; AVX512BW-FALLBACK-NEXT:    vpminsq %zmm1, %zmm0, %zmm2
2021 ; AVX512BW-FALLBACK-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm1
2022 ; AVX512BW-FALLBACK-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
2023 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $1, %xmm1, %xmm1
2024 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %xmm1, %xmm2
2025 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm2, %xmm2
2026 ; AVX512BW-FALLBACK-NEXT:    vpsrlq $32, %xmm3, %xmm4
2027 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm4, %xmm1, %xmm4
2028 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm2, %xmm4, %xmm2
2029 ; AVX512BW-FALLBACK-NEXT:    vpsllq $32, %xmm2, %xmm2
2030 ; AVX512BW-FALLBACK-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
2031 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
2032 ; AVX512BW-FALLBACK-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
2033 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
2034 ; AVX512BW-FALLBACK-NEXT:    retq
2035   %a1 = load <2 x i64>, <2 x i64>* %a1_addr
2036   %a2 = load <2 x i64>, <2 x i64>* %a2_addr
2037   %t3 = icmp sgt <2 x i64> %a1, %a2 ; signed
2038   %t4 = select <2 x i1> %t3, <2 x i64> <i64 -1, i64 -1>, <2 x i64> <i64 1, i64 1>
2039   %t5 = select <2 x i1> %t3, <2 x i64> %a2, <2 x i64> %a1
2040   %t6 = select <2 x i1> %t3, <2 x i64> %a1, <2 x i64> %a2
2041   %t7 = sub <2 x i64> %t6, %t5
2042   %t8 = lshr <2 x i64> %t7, <i64 1, i64 1>
2043   %t9 = mul nsw <2 x i64> %t8, %t4 ; signed
2044   %a10 = add nsw <2 x i64> %t9, %a1 ; signed
2045   ret <2 x i64> %a10
2048 ; ---------------------------------------------------------------------------- ;
2049 ; 16-bit width. 128 / 16 = 8 elts.
2050 ; ---------------------------------------------------------------------------- ;
2052 ; Values come from regs
2054 define <8 x i16> @vec128_i16_signed_reg_reg(<8 x i16> %a1, <8 x i16> %a2) nounwind {
2055 ; SSE-LABEL: vec128_i16_signed_reg_reg:
2056 ; SSE:       # %bb.0:
2057 ; SSE-NEXT:    movdqa %xmm0, %xmm2
2058 ; SSE-NEXT:    pcmpgtw %xmm1, %xmm2
2059 ; SSE-NEXT:    por {{.*}}(%rip), %xmm2
2060 ; SSE-NEXT:    movdqa %xmm0, %xmm3
2061 ; SSE-NEXT:    pminsw %xmm1, %xmm3
2062 ; SSE-NEXT:    pmaxsw %xmm0, %xmm1
2063 ; SSE-NEXT:    psubw %xmm3, %xmm1
2064 ; SSE-NEXT:    psrlw $1, %xmm1
2065 ; SSE-NEXT:    pmullw %xmm1, %xmm2
2066 ; SSE-NEXT:    paddw %xmm0, %xmm2
2067 ; SSE-NEXT:    movdqa %xmm2, %xmm0
2068 ; SSE-NEXT:    retq
2070 ; AVX1-FALLBACK-LABEL: vec128_i16_signed_reg_reg:
2071 ; AVX1-FALLBACK:       # %bb.0:
2072 ; AVX1-FALLBACK-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm2
2073 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2074 ; AVX1-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2075 ; AVX1-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2076 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2077 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2078 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2079 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2080 ; AVX1-FALLBACK-NEXT:    retq
2082 ; AVX2-FALLBACK-LABEL: vec128_i16_signed_reg_reg:
2083 ; AVX2-FALLBACK:       # %bb.0:
2084 ; AVX2-FALLBACK-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm2
2085 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2086 ; AVX2-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2087 ; AVX2-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2088 ; AVX2-FALLBACK-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2089 ; AVX2-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2090 ; AVX2-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2091 ; AVX2-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2092 ; AVX2-FALLBACK-NEXT:    retq
2094 ; XOP-LABEL: vec128_i16_signed_reg_reg:
2095 ; XOP:       # %bb.0:
2096 ; XOP-NEXT:    vpcomgtw %xmm1, %xmm0, %xmm2
2097 ; XOP-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2098 ; XOP-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2099 ; XOP-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2100 ; XOP-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2101 ; XOP-NEXT:    vpsrlw $1, %xmm1, %xmm1
2102 ; XOP-NEXT:    vpmacsww %xmm0, %xmm2, %xmm1, %xmm0
2103 ; XOP-NEXT:    retq
2105 ; AVX512F-LABEL: vec128_i16_signed_reg_reg:
2106 ; AVX512F:       # %bb.0:
2107 ; AVX512F-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm2
2108 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2109 ; AVX512F-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2110 ; AVX512F-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2111 ; AVX512F-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2112 ; AVX512F-NEXT:    vpsrlw $1, %xmm1, %xmm1
2113 ; AVX512F-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2114 ; AVX512F-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2115 ; AVX512F-NEXT:    retq
2117 ; AVX512VL-FALLBACK-LABEL: vec128_i16_signed_reg_reg:
2118 ; AVX512VL-FALLBACK:       # %bb.0:
2119 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm2
2120 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2121 ; AVX512VL-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2122 ; AVX512VL-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2123 ; AVX512VL-FALLBACK-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2124 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2125 ; AVX512VL-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2126 ; AVX512VL-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2127 ; AVX512VL-FALLBACK-NEXT:    retq
2129 ; AVX512BW-FALLBACK-LABEL: vec128_i16_signed_reg_reg:
2130 ; AVX512BW-FALLBACK:       # %bb.0:
2131 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2132 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2133 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtw %zmm1, %zmm0, %k1
2134 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2135 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1]
2136 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
2137 ; AVX512BW-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm2
2138 ; AVX512BW-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2139 ; AVX512BW-FALLBACK-NEXT:    vpsubw %xmm2, %xmm1, %xmm1
2140 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2141 ; AVX512BW-FALLBACK-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2142 ; AVX512BW-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2143 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
2144 ; AVX512BW-FALLBACK-NEXT:    retq
2146 ; AVX512VLBW-LABEL: vec128_i16_signed_reg_reg:
2147 ; AVX512VLBW:       # %bb.0:
2148 ; AVX512VLBW-NEXT:    vpcmpgtw %xmm1, %xmm0, %k1
2149 ; AVX512VLBW-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2150 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1]
2151 ; AVX512VLBW-NEXT:    vmovdqu16 %xmm2, %xmm3 {%k1}
2152 ; AVX512VLBW-NEXT:    vpminsw %xmm1, %xmm0, %xmm2
2153 ; AVX512VLBW-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2154 ; AVX512VLBW-NEXT:    vpsubw %xmm2, %xmm1, %xmm1
2155 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm1, %xmm1
2156 ; AVX512VLBW-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2157 ; AVX512VLBW-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2158 ; AVX512VLBW-NEXT:    retq
2159   %t3 = icmp sgt <8 x i16> %a1, %a2 ; signed
2160   %t4 = select <8 x i1> %t3, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
2161   %t5 = select <8 x i1> %t3, <8 x i16> %a2, <8 x i16> %a1
2162   %t6 = select <8 x i1> %t3, <8 x i16> %a1, <8 x i16> %a2
2163   %t7 = sub <8 x i16> %t6, %t5
2164   %t8 = lshr <8 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
2165   %t9 = mul nsw <8 x i16> %t8, %t4 ; signed
2166   %a10 = add nsw <8 x i16> %t9, %a1 ; signed
2167   ret <8 x i16> %a10
2170 define <8 x i16> @vec128_i16_unsigned_reg_reg(<8 x i16> %a1, <8 x i16> %a2) nounwind {
2171 ; SSE2-LABEL: vec128_i16_unsigned_reg_reg:
2172 ; SSE2:       # %bb.0:
2173 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768]
2174 ; SSE2-NEXT:    pxor %xmm3, %xmm1
2175 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2176 ; SSE2-NEXT:    pxor %xmm3, %xmm2
2177 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
2178 ; SSE2-NEXT:    pcmpgtw %xmm1, %xmm4
2179 ; SSE2-NEXT:    por {{.*}}(%rip), %xmm4
2180 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
2181 ; SSE2-NEXT:    pminsw %xmm1, %xmm5
2182 ; SSE2-NEXT:    pxor %xmm3, %xmm5
2183 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm2
2184 ; SSE2-NEXT:    pxor %xmm3, %xmm2
2185 ; SSE2-NEXT:    psubw %xmm5, %xmm2
2186 ; SSE2-NEXT:    psrlw $1, %xmm2
2187 ; SSE2-NEXT:    pmullw %xmm4, %xmm2
2188 ; SSE2-NEXT:    paddw %xmm0, %xmm2
2189 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
2190 ; SSE2-NEXT:    retq
2192 ; SSE41-LABEL: vec128_i16_unsigned_reg_reg:
2193 ; SSE41:       # %bb.0:
2194 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
2195 ; SSE41-NEXT:    pminuw %xmm1, %xmm2
2196 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
2197 ; SSE41-NEXT:    pcmpeqw %xmm2, %xmm3
2198 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
2199 ; SSE41-NEXT:    pxor %xmm3, %xmm4
2200 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm4
2201 ; SSE41-NEXT:    pmaxuw %xmm0, %xmm1
2202 ; SSE41-NEXT:    psubw %xmm2, %xmm1
2203 ; SSE41-NEXT:    psrlw $1, %xmm1
2204 ; SSE41-NEXT:    pmullw %xmm1, %xmm4
2205 ; SSE41-NEXT:    paddw %xmm4, %xmm0
2206 ; SSE41-NEXT:    retq
2208 ; AVX1-FALLBACK-LABEL: vec128_i16_unsigned_reg_reg:
2209 ; AVX1-FALLBACK:       # %bb.0:
2210 ; AVX1-FALLBACK-NEXT:    vpminuw %xmm1, %xmm0, %xmm2
2211 ; AVX1-FALLBACK-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm3
2212 ; AVX1-FALLBACK-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
2213 ; AVX1-FALLBACK-NEXT:    vpxor %xmm4, %xmm3, %xmm3
2214 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm3, %xmm3
2215 ; AVX1-FALLBACK-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
2216 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm2, %xmm1, %xmm1
2217 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2218 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2219 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2220 ; AVX1-FALLBACK-NEXT:    retq
2222 ; AVX2-FALLBACK-LABEL: vec128_i16_unsigned_reg_reg:
2223 ; AVX2-FALLBACK:       # %bb.0:
2224 ; AVX2-FALLBACK-NEXT:    vpminuw %xmm1, %xmm0, %xmm2
2225 ; AVX2-FALLBACK-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm3
2226 ; AVX2-FALLBACK-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
2227 ; AVX2-FALLBACK-NEXT:    vpxor %xmm4, %xmm3, %xmm3
2228 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm3, %xmm3
2229 ; AVX2-FALLBACK-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
2230 ; AVX2-FALLBACK-NEXT:    vpsubw %xmm2, %xmm1, %xmm1
2231 ; AVX2-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2232 ; AVX2-FALLBACK-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2233 ; AVX2-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2234 ; AVX2-FALLBACK-NEXT:    retq
2236 ; XOP-LABEL: vec128_i16_unsigned_reg_reg:
2237 ; XOP:       # %bb.0:
2238 ; XOP-NEXT:    vpcomgtuw %xmm1, %xmm0, %xmm2
2239 ; XOP-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2240 ; XOP-NEXT:    vpminuw %xmm1, %xmm0, %xmm3
2241 ; XOP-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
2242 ; XOP-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2243 ; XOP-NEXT:    vpsrlw $1, %xmm1, %xmm1
2244 ; XOP-NEXT:    vpmacsww %xmm0, %xmm2, %xmm1, %xmm0
2245 ; XOP-NEXT:    retq
2247 ; AVX512F-LABEL: vec128_i16_unsigned_reg_reg:
2248 ; AVX512F:       # %bb.0:
2249 ; AVX512F-NEXT:    vpminuw %xmm1, %xmm0, %xmm2
2250 ; AVX512F-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm3
2251 ; AVX512F-NEXT:    vpternlogq $15, %zmm3, %zmm3, %zmm3
2252 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm3, %xmm3
2253 ; AVX512F-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
2254 ; AVX512F-NEXT:    vpsubw %xmm2, %xmm1, %xmm1
2255 ; AVX512F-NEXT:    vpsrlw $1, %xmm1, %xmm1
2256 ; AVX512F-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2257 ; AVX512F-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2258 ; AVX512F-NEXT:    vzeroupper
2259 ; AVX512F-NEXT:    retq
2261 ; AVX512VL-FALLBACK-LABEL: vec128_i16_unsigned_reg_reg:
2262 ; AVX512VL-FALLBACK:       # %bb.0:
2263 ; AVX512VL-FALLBACK-NEXT:    vpminuw %xmm1, %xmm0, %xmm2
2264 ; AVX512VL-FALLBACK-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm3
2265 ; AVX512VL-FALLBACK-NEXT:    vpternlogq $15, %xmm3, %xmm3, %xmm3
2266 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm3, %xmm3
2267 ; AVX512VL-FALLBACK-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
2268 ; AVX512VL-FALLBACK-NEXT:    vpsubw %xmm2, %xmm1, %xmm1
2269 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2270 ; AVX512VL-FALLBACK-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2271 ; AVX512VL-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2272 ; AVX512VL-FALLBACK-NEXT:    retq
2274 ; AVX512BW-FALLBACK-LABEL: vec128_i16_unsigned_reg_reg:
2275 ; AVX512BW-FALLBACK:       # %bb.0:
2276 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2277 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2278 ; AVX512BW-FALLBACK-NEXT:    vpcmpnleuw %zmm1, %zmm0, %k1
2279 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2280 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1]
2281 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
2282 ; AVX512BW-FALLBACK-NEXT:    vpminuw %xmm1, %xmm0, %xmm2
2283 ; AVX512BW-FALLBACK-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
2284 ; AVX512BW-FALLBACK-NEXT:    vpsubw %xmm2, %xmm1, %xmm1
2285 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2286 ; AVX512BW-FALLBACK-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2287 ; AVX512BW-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2288 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
2289 ; AVX512BW-FALLBACK-NEXT:    retq
2291 ; AVX512VLBW-LABEL: vec128_i16_unsigned_reg_reg:
2292 ; AVX512VLBW:       # %bb.0:
2293 ; AVX512VLBW-NEXT:    vpcmpnleuw %xmm1, %xmm0, %k1
2294 ; AVX512VLBW-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2295 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1]
2296 ; AVX512VLBW-NEXT:    vmovdqu16 %xmm2, %xmm3 {%k1}
2297 ; AVX512VLBW-NEXT:    vpminuw %xmm1, %xmm0, %xmm2
2298 ; AVX512VLBW-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm1
2299 ; AVX512VLBW-NEXT:    vpsubw %xmm2, %xmm1, %xmm1
2300 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm1, %xmm1
2301 ; AVX512VLBW-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2302 ; AVX512VLBW-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2303 ; AVX512VLBW-NEXT:    retq
2304   %t3 = icmp ugt <8 x i16> %a1, %a2
2305   %t4 = select <8 x i1> %t3, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
2306   %t5 = select <8 x i1> %t3, <8 x i16> %a2, <8 x i16> %a1
2307   %t6 = select <8 x i1> %t3, <8 x i16> %a1, <8 x i16> %a2
2308   %t7 = sub <8 x i16> %t6, %t5
2309   %t8 = lshr <8 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
2310   %t9 = mul <8 x i16> %t8, %t4
2311   %a10 = add <8 x i16> %t9, %a1
2312   ret <8 x i16> %a10
2315 ; Values are loaded. Only check signed case.
2317 define <8 x i16> @vec128_i16_signed_mem_reg(<8 x i16>* %a1_addr, <8 x i16> %a2) nounwind {
2318 ; SSE-LABEL: vec128_i16_signed_mem_reg:
2319 ; SSE:       # %bb.0:
2320 ; SSE-NEXT:    movdqa (%rdi), %xmm1
2321 ; SSE-NEXT:    movdqa %xmm1, %xmm2
2322 ; SSE-NEXT:    pcmpgtw %xmm0, %xmm2
2323 ; SSE-NEXT:    por {{.*}}(%rip), %xmm2
2324 ; SSE-NEXT:    movdqa %xmm1, %xmm3
2325 ; SSE-NEXT:    pminsw %xmm0, %xmm3
2326 ; SSE-NEXT:    pmaxsw %xmm1, %xmm0
2327 ; SSE-NEXT:    psubw %xmm3, %xmm0
2328 ; SSE-NEXT:    psrlw $1, %xmm0
2329 ; SSE-NEXT:    pmullw %xmm2, %xmm0
2330 ; SSE-NEXT:    paddw %xmm1, %xmm0
2331 ; SSE-NEXT:    retq
2333 ; AVX1-FALLBACK-LABEL: vec128_i16_signed_mem_reg:
2334 ; AVX1-FALLBACK:       # %bb.0:
2335 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
2336 ; AVX1-FALLBACK-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm2
2337 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2338 ; AVX1-FALLBACK-NEXT:    vpminsw %xmm0, %xmm1, %xmm3
2339 ; AVX1-FALLBACK-NEXT:    vpmaxsw %xmm0, %xmm1, %xmm0
2340 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm3, %xmm0, %xmm0
2341 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm0, %xmm0
2342 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2343 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2344 ; AVX1-FALLBACK-NEXT:    retq
2346 ; AVX2-FALLBACK-LABEL: vec128_i16_signed_mem_reg:
2347 ; AVX2-FALLBACK:       # %bb.0:
2348 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
2349 ; AVX2-FALLBACK-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm2
2350 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2351 ; AVX2-FALLBACK-NEXT:    vpminsw %xmm0, %xmm1, %xmm3
2352 ; AVX2-FALLBACK-NEXT:    vpmaxsw %xmm0, %xmm1, %xmm0
2353 ; AVX2-FALLBACK-NEXT:    vpsubw %xmm3, %xmm0, %xmm0
2354 ; AVX2-FALLBACK-NEXT:    vpsrlw $1, %xmm0, %xmm0
2355 ; AVX2-FALLBACK-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2356 ; AVX2-FALLBACK-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2357 ; AVX2-FALLBACK-NEXT:    retq
2359 ; XOP-LABEL: vec128_i16_signed_mem_reg:
2360 ; XOP:       # %bb.0:
2361 ; XOP-NEXT:    vmovdqa (%rdi), %xmm1
2362 ; XOP-NEXT:    vpcomgtw %xmm0, %xmm1, %xmm2
2363 ; XOP-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2364 ; XOP-NEXT:    vpminsw %xmm0, %xmm1, %xmm3
2365 ; XOP-NEXT:    vpmaxsw %xmm0, %xmm1, %xmm0
2366 ; XOP-NEXT:    vpsubw %xmm3, %xmm0, %xmm0
2367 ; XOP-NEXT:    vpsrlw $1, %xmm0, %xmm0
2368 ; XOP-NEXT:    vpmacsww %xmm1, %xmm2, %xmm0, %xmm0
2369 ; XOP-NEXT:    retq
2371 ; AVX512F-LABEL: vec128_i16_signed_mem_reg:
2372 ; AVX512F:       # %bb.0:
2373 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm1
2374 ; AVX512F-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm2
2375 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2376 ; AVX512F-NEXT:    vpminsw %xmm0, %xmm1, %xmm3
2377 ; AVX512F-NEXT:    vpmaxsw %xmm0, %xmm1, %xmm0
2378 ; AVX512F-NEXT:    vpsubw %xmm3, %xmm0, %xmm0
2379 ; AVX512F-NEXT:    vpsrlw $1, %xmm0, %xmm0
2380 ; AVX512F-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2381 ; AVX512F-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2382 ; AVX512F-NEXT:    retq
2384 ; AVX512VL-FALLBACK-LABEL: vec128_i16_signed_mem_reg:
2385 ; AVX512VL-FALLBACK:       # %bb.0:
2386 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
2387 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm2
2388 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2389 ; AVX512VL-FALLBACK-NEXT:    vpminsw %xmm0, %xmm1, %xmm3
2390 ; AVX512VL-FALLBACK-NEXT:    vpmaxsw %xmm0, %xmm1, %xmm0
2391 ; AVX512VL-FALLBACK-NEXT:    vpsubw %xmm3, %xmm0, %xmm0
2392 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %xmm0, %xmm0
2393 ; AVX512VL-FALLBACK-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2394 ; AVX512VL-FALLBACK-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2395 ; AVX512VL-FALLBACK-NEXT:    retq
2397 ; AVX512BW-FALLBACK-LABEL: vec128_i16_signed_mem_reg:
2398 ; AVX512BW-FALLBACK:       # %bb.0:
2399 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2400 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
2401 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtw %zmm0, %zmm1, %k1
2402 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2403 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1]
2404 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
2405 ; AVX512BW-FALLBACK-NEXT:    vpminsw %xmm0, %xmm1, %xmm2
2406 ; AVX512BW-FALLBACK-NEXT:    vpmaxsw %xmm0, %xmm1, %xmm0
2407 ; AVX512BW-FALLBACK-NEXT:    vpsubw %xmm2, %xmm0, %xmm0
2408 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %xmm0, %xmm0
2409 ; AVX512BW-FALLBACK-NEXT:    vpmullw %xmm3, %xmm0, %xmm0
2410 ; AVX512BW-FALLBACK-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2411 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
2412 ; AVX512BW-FALLBACK-NEXT:    retq
2414 ; AVX512VLBW-LABEL: vec128_i16_signed_mem_reg:
2415 ; AVX512VLBW:       # %bb.0:
2416 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %xmm1
2417 ; AVX512VLBW-NEXT:    vpcmpgtw %xmm0, %xmm1, %k1
2418 ; AVX512VLBW-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2419 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1]
2420 ; AVX512VLBW-NEXT:    vmovdqu16 %xmm2, %xmm3 {%k1}
2421 ; AVX512VLBW-NEXT:    vpminsw %xmm0, %xmm1, %xmm2
2422 ; AVX512VLBW-NEXT:    vpmaxsw %xmm0, %xmm1, %xmm0
2423 ; AVX512VLBW-NEXT:    vpsubw %xmm2, %xmm0, %xmm0
2424 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm0, %xmm0
2425 ; AVX512VLBW-NEXT:    vpmullw %xmm3, %xmm0, %xmm0
2426 ; AVX512VLBW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2427 ; AVX512VLBW-NEXT:    retq
2428   %a1 = load <8 x i16>, <8 x i16>* %a1_addr
2429   %t3 = icmp sgt <8 x i16> %a1, %a2 ; signed
2430   %t4 = select <8 x i1> %t3, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
2431   %t5 = select <8 x i1> %t3, <8 x i16> %a2, <8 x i16> %a1
2432   %t6 = select <8 x i1> %t3, <8 x i16> %a1, <8 x i16> %a2
2433   %t7 = sub <8 x i16> %t6, %t5
2434   %t8 = lshr <8 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
2435   %t9 = mul nsw <8 x i16> %t8, %t4 ; signed
2436   %a10 = add nsw <8 x i16> %t9, %a1 ; signed
2437   ret <8 x i16> %a10
2440 define <8 x i16> @vec128_i16_signed_reg_mem(<8 x i16> %a1, <8 x i16>* %a2_addr) nounwind {
2441 ; SSE-LABEL: vec128_i16_signed_reg_mem:
2442 ; SSE:       # %bb.0:
2443 ; SSE-NEXT:    movdqa (%rdi), %xmm2
2444 ; SSE-NEXT:    movdqa %xmm0, %xmm1
2445 ; SSE-NEXT:    pcmpgtw %xmm2, %xmm1
2446 ; SSE-NEXT:    por {{.*}}(%rip), %xmm1
2447 ; SSE-NEXT:    movdqa %xmm0, %xmm3
2448 ; SSE-NEXT:    pminsw %xmm2, %xmm3
2449 ; SSE-NEXT:    pmaxsw %xmm0, %xmm2
2450 ; SSE-NEXT:    psubw %xmm3, %xmm2
2451 ; SSE-NEXT:    psrlw $1, %xmm2
2452 ; SSE-NEXT:    pmullw %xmm2, %xmm1
2453 ; SSE-NEXT:    paddw %xmm0, %xmm1
2454 ; SSE-NEXT:    movdqa %xmm1, %xmm0
2455 ; SSE-NEXT:    retq
2457 ; AVX1-FALLBACK-LABEL: vec128_i16_signed_reg_mem:
2458 ; AVX1-FALLBACK:       # %bb.0:
2459 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
2460 ; AVX1-FALLBACK-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm2
2461 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2462 ; AVX1-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2463 ; AVX1-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2464 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2465 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2466 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2467 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2468 ; AVX1-FALLBACK-NEXT:    retq
2470 ; AVX2-FALLBACK-LABEL: vec128_i16_signed_reg_mem:
2471 ; AVX2-FALLBACK:       # %bb.0:
2472 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
2473 ; AVX2-FALLBACK-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm2
2474 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2475 ; AVX2-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2476 ; AVX2-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2477 ; AVX2-FALLBACK-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2478 ; AVX2-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2479 ; AVX2-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2480 ; AVX2-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2481 ; AVX2-FALLBACK-NEXT:    retq
2483 ; XOP-LABEL: vec128_i16_signed_reg_mem:
2484 ; XOP:       # %bb.0:
2485 ; XOP-NEXT:    vmovdqa (%rdi), %xmm1
2486 ; XOP-NEXT:    vpcomgtw %xmm1, %xmm0, %xmm2
2487 ; XOP-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2488 ; XOP-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2489 ; XOP-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2490 ; XOP-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2491 ; XOP-NEXT:    vpsrlw $1, %xmm1, %xmm1
2492 ; XOP-NEXT:    vpmacsww %xmm0, %xmm2, %xmm1, %xmm0
2493 ; XOP-NEXT:    retq
2495 ; AVX512F-LABEL: vec128_i16_signed_reg_mem:
2496 ; AVX512F:       # %bb.0:
2497 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm1
2498 ; AVX512F-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm2
2499 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2500 ; AVX512F-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2501 ; AVX512F-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2502 ; AVX512F-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2503 ; AVX512F-NEXT:    vpsrlw $1, %xmm1, %xmm1
2504 ; AVX512F-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2505 ; AVX512F-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2506 ; AVX512F-NEXT:    retq
2508 ; AVX512VL-FALLBACK-LABEL: vec128_i16_signed_reg_mem:
2509 ; AVX512VL-FALLBACK:       # %bb.0:
2510 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
2511 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm2
2512 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2513 ; AVX512VL-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2514 ; AVX512VL-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2515 ; AVX512VL-FALLBACK-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2516 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2517 ; AVX512VL-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2518 ; AVX512VL-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2519 ; AVX512VL-FALLBACK-NEXT:    retq
2521 ; AVX512BW-FALLBACK-LABEL: vec128_i16_signed_reg_mem:
2522 ; AVX512BW-FALLBACK:       # %bb.0:
2523 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2524 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
2525 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtw %zmm1, %zmm0, %k1
2526 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2527 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1]
2528 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
2529 ; AVX512BW-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm2
2530 ; AVX512BW-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2531 ; AVX512BW-FALLBACK-NEXT:    vpsubw %xmm2, %xmm1, %xmm1
2532 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2533 ; AVX512BW-FALLBACK-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2534 ; AVX512BW-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2535 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
2536 ; AVX512BW-FALLBACK-NEXT:    retq
2538 ; AVX512VLBW-LABEL: vec128_i16_signed_reg_mem:
2539 ; AVX512VLBW:       # %bb.0:
2540 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %xmm1
2541 ; AVX512VLBW-NEXT:    vpcmpgtw %xmm1, %xmm0, %k1
2542 ; AVX512VLBW-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2543 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1]
2544 ; AVX512VLBW-NEXT:    vmovdqu16 %xmm2, %xmm3 {%k1}
2545 ; AVX512VLBW-NEXT:    vpminsw %xmm1, %xmm0, %xmm2
2546 ; AVX512VLBW-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2547 ; AVX512VLBW-NEXT:    vpsubw %xmm2, %xmm1, %xmm1
2548 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm1, %xmm1
2549 ; AVX512VLBW-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2550 ; AVX512VLBW-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2551 ; AVX512VLBW-NEXT:    retq
2552   %a2 = load <8 x i16>, <8 x i16>* %a2_addr
2553   %t3 = icmp sgt <8 x i16> %a1, %a2 ; signed
2554   %t4 = select <8 x i1> %t3, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
2555   %t5 = select <8 x i1> %t3, <8 x i16> %a2, <8 x i16> %a1
2556   %t6 = select <8 x i1> %t3, <8 x i16> %a1, <8 x i16> %a2
2557   %t7 = sub <8 x i16> %t6, %t5
2558   %t8 = lshr <8 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
2559   %t9 = mul nsw <8 x i16> %t8, %t4 ; signed
2560   %a10 = add nsw <8 x i16> %t9, %a1 ; signed
2561   ret <8 x i16> %a10
2564 define <8 x i16> @vec128_i16_signed_mem_mem(<8 x i16>* %a1_addr, <8 x i16>* %a2_addr) nounwind {
2565 ; SSE-LABEL: vec128_i16_signed_mem_mem:
2566 ; SSE:       # %bb.0:
2567 ; SSE-NEXT:    movdqa (%rdi), %xmm1
2568 ; SSE-NEXT:    movdqa (%rsi), %xmm0
2569 ; SSE-NEXT:    movdqa %xmm1, %xmm2
2570 ; SSE-NEXT:    pcmpgtw %xmm0, %xmm2
2571 ; SSE-NEXT:    por {{.*}}(%rip), %xmm2
2572 ; SSE-NEXT:    movdqa %xmm1, %xmm3
2573 ; SSE-NEXT:    pminsw %xmm0, %xmm3
2574 ; SSE-NEXT:    pmaxsw %xmm1, %xmm0
2575 ; SSE-NEXT:    psubw %xmm3, %xmm0
2576 ; SSE-NEXT:    psrlw $1, %xmm0
2577 ; SSE-NEXT:    pmullw %xmm2, %xmm0
2578 ; SSE-NEXT:    paddw %xmm1, %xmm0
2579 ; SSE-NEXT:    retq
2581 ; AVX1-FALLBACK-LABEL: vec128_i16_signed_mem_mem:
2582 ; AVX1-FALLBACK:       # %bb.0:
2583 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
2584 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
2585 ; AVX1-FALLBACK-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm2
2586 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2587 ; AVX1-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2588 ; AVX1-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2589 ; AVX1-FALLBACK-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2590 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2591 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2592 ; AVX1-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2593 ; AVX1-FALLBACK-NEXT:    retq
2595 ; AVX2-FALLBACK-LABEL: vec128_i16_signed_mem_mem:
2596 ; AVX2-FALLBACK:       # %bb.0:
2597 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
2598 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
2599 ; AVX2-FALLBACK-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm2
2600 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2601 ; AVX2-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2602 ; AVX2-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2603 ; AVX2-FALLBACK-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2604 ; AVX2-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2605 ; AVX2-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2606 ; AVX2-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2607 ; AVX2-FALLBACK-NEXT:    retq
2609 ; XOP-LABEL: vec128_i16_signed_mem_mem:
2610 ; XOP:       # %bb.0:
2611 ; XOP-NEXT:    vmovdqa (%rdi), %xmm0
2612 ; XOP-NEXT:    vmovdqa (%rsi), %xmm1
2613 ; XOP-NEXT:    vpcomgtw %xmm1, %xmm0, %xmm2
2614 ; XOP-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2615 ; XOP-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2616 ; XOP-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2617 ; XOP-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2618 ; XOP-NEXT:    vpsrlw $1, %xmm1, %xmm1
2619 ; XOP-NEXT:    vpmacsww %xmm0, %xmm2, %xmm1, %xmm0
2620 ; XOP-NEXT:    retq
2622 ; AVX512F-LABEL: vec128_i16_signed_mem_mem:
2623 ; AVX512F:       # %bb.0:
2624 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
2625 ; AVX512F-NEXT:    vmovdqa (%rsi), %xmm1
2626 ; AVX512F-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm2
2627 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2628 ; AVX512F-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2629 ; AVX512F-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2630 ; AVX512F-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2631 ; AVX512F-NEXT:    vpsrlw $1, %xmm1, %xmm1
2632 ; AVX512F-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2633 ; AVX512F-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2634 ; AVX512F-NEXT:    retq
2636 ; AVX512VL-FALLBACK-LABEL: vec128_i16_signed_mem_mem:
2637 ; AVX512VL-FALLBACK:       # %bb.0:
2638 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
2639 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
2640 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm2
2641 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2642 ; AVX512VL-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm3
2643 ; AVX512VL-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2644 ; AVX512VL-FALLBACK-NEXT:    vpsubw %xmm3, %xmm1, %xmm1
2645 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2646 ; AVX512VL-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2647 ; AVX512VL-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2648 ; AVX512VL-FALLBACK-NEXT:    retq
2650 ; AVX512BW-FALLBACK-LABEL: vec128_i16_signed_mem_mem:
2651 ; AVX512BW-FALLBACK:       # %bb.0:
2652 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
2653 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
2654 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtw %zmm1, %zmm0, %k1
2655 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2656 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1]
2657 ; AVX512BW-FALLBACK-NEXT:    vmovdqu16 %zmm2, %zmm3 {%k1}
2658 ; AVX512BW-FALLBACK-NEXT:    vpminsw %xmm1, %xmm0, %xmm2
2659 ; AVX512BW-FALLBACK-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2660 ; AVX512BW-FALLBACK-NEXT:    vpsubw %xmm2, %xmm1, %xmm1
2661 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2662 ; AVX512BW-FALLBACK-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2663 ; AVX512BW-FALLBACK-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2664 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
2665 ; AVX512BW-FALLBACK-NEXT:    retq
2667 ; AVX512VLBW-LABEL: vec128_i16_signed_mem_mem:
2668 ; AVX512VLBW:       # %bb.0:
2669 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %xmm0
2670 ; AVX512VLBW-NEXT:    vmovdqa (%rsi), %xmm1
2671 ; AVX512VLBW-NEXT:    vpcmpgtw %xmm1, %xmm0, %k1
2672 ; AVX512VLBW-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2673 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1]
2674 ; AVX512VLBW-NEXT:    vmovdqu16 %xmm2, %xmm3 {%k1}
2675 ; AVX512VLBW-NEXT:    vpminsw %xmm1, %xmm0, %xmm2
2676 ; AVX512VLBW-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm1
2677 ; AVX512VLBW-NEXT:    vpsubw %xmm2, %xmm1, %xmm1
2678 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm1, %xmm1
2679 ; AVX512VLBW-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2680 ; AVX512VLBW-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
2681 ; AVX512VLBW-NEXT:    retq
2682   %a1 = load <8 x i16>, <8 x i16>* %a1_addr
2683   %a2 = load <8 x i16>, <8 x i16>* %a2_addr
2684   %t3 = icmp sgt <8 x i16> %a1, %a2 ; signed
2685   %t4 = select <8 x i1> %t3, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
2686   %t5 = select <8 x i1> %t3, <8 x i16> %a2, <8 x i16> %a1
2687   %t6 = select <8 x i1> %t3, <8 x i16> %a1, <8 x i16> %a2
2688   %t7 = sub <8 x i16> %t6, %t5
2689   %t8 = lshr <8 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
2690   %t9 = mul nsw <8 x i16> %t8, %t4 ; signed
2691   %a10 = add nsw <8 x i16> %t9, %a1 ; signed
2692   ret <8 x i16> %a10
2695 ; ---------------------------------------------------------------------------- ;
2696 ; 8-bit width. 128 / 8 = 16 elts.
2697 ; ---------------------------------------------------------------------------- ;
2699 ; Values come from regs
2701 define <16 x i8> @vec128_i8_signed_reg_reg(<16 x i8> %a1, <16 x i8> %a2) nounwind {
2702 ; SSE2-LABEL: vec128_i8_signed_reg_reg:
2703 ; SSE2:       # %bb.0:
2704 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2705 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
2706 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2707 ; SSE2-NEXT:    por %xmm2, %xmm3
2708 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
2709 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm4
2710 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
2711 ; SSE2-NEXT:    pand %xmm4, %xmm5
2712 ; SSE2-NEXT:    pandn %xmm1, %xmm4
2713 ; SSE2-NEXT:    por %xmm5, %xmm4
2714 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
2715 ; SSE2-NEXT:    pand %xmm2, %xmm5
2716 ; SSE2-NEXT:    pandn %xmm1, %xmm2
2717 ; SSE2-NEXT:    por %xmm5, %xmm2
2718 ; SSE2-NEXT:    psubb %xmm4, %xmm2
2719 ; SSE2-NEXT:    psrlw $1, %xmm2
2720 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
2721 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
2722 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = 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]
2723 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
2724 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
2725 ; SSE2-NEXT:    pmullw %xmm1, %xmm4
2726 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
2727 ; SSE2-NEXT:    pand %xmm1, %xmm4
2728 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2729 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
2730 ; SSE2-NEXT:    pmullw %xmm3, %xmm2
2731 ; SSE2-NEXT:    pand %xmm1, %xmm2
2732 ; SSE2-NEXT:    packuswb %xmm4, %xmm2
2733 ; SSE2-NEXT:    paddb %xmm0, %xmm2
2734 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
2735 ; SSE2-NEXT:    retq
2737 ; SSE41-LABEL: vec128_i8_signed_reg_reg:
2738 ; SSE41:       # %bb.0:
2739 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
2740 ; SSE41-NEXT:    pcmpgtb %xmm1, %xmm2
2741 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm2
2742 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
2743 ; SSE41-NEXT:    pminsb %xmm1, %xmm3
2744 ; SSE41-NEXT:    pmaxsb %xmm0, %xmm1
2745 ; SSE41-NEXT:    psubb %xmm3, %xmm1
2746 ; SSE41-NEXT:    psrlw $1, %xmm1
2747 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
2748 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2749 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = 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]
2750 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2751 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = 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]
2752 ; SSE41-NEXT:    pmullw %xmm1, %xmm2
2753 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
2754 ; SSE41-NEXT:    pand %xmm1, %xmm2
2755 ; SSE41-NEXT:    pmullw %xmm4, %xmm3
2756 ; SSE41-NEXT:    pand %xmm1, %xmm3
2757 ; SSE41-NEXT:    packuswb %xmm2, %xmm3
2758 ; SSE41-NEXT:    paddb %xmm3, %xmm0
2759 ; SSE41-NEXT:    retq
2761 ; AVX1-FALLBACK-LABEL: vec128_i8_signed_reg_reg:
2762 ; AVX1-FALLBACK:       # %bb.0:
2763 ; AVX1-FALLBACK-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm2
2764 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2765 ; AVX1-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
2766 ; AVX1-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
2767 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
2768 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2769 ; AVX1-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
2770 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
2771 ; AVX1-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]
2772 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
2773 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
2774 ; AVX1-FALLBACK-NEXT:    vpand %xmm4, %xmm3, %xmm3
2775 ; 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
2776 ; 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
2777 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2778 ; AVX1-FALLBACK-NEXT:    vpand %xmm4, %xmm1, %xmm1
2779 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm3, %xmm1, %xmm1
2780 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2781 ; AVX1-FALLBACK-NEXT:    retq
2783 ; AVX2-FALLBACK-LABEL: vec128_i8_signed_reg_reg:
2784 ; AVX2-FALLBACK:       # %bb.0:
2785 ; AVX2-FALLBACK-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm2
2786 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2787 ; AVX2-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
2788 ; AVX2-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
2789 ; AVX2-FALLBACK-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
2790 ; AVX2-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2791 ; AVX2-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
2792 ; AVX2-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
2793 ; AVX2-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
2794 ; AVX2-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2795 ; AVX2-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2796 ; AVX2-FALLBACK-NEXT:    vextracti128 $1, %ymm1, %xmm2
2797 ; AVX2-FALLBACK-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
2798 ; AVX2-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2799 ; AVX2-FALLBACK-NEXT:    vzeroupper
2800 ; AVX2-FALLBACK-NEXT:    retq
2802 ; XOP-FALLBACK-LABEL: vec128_i8_signed_reg_reg:
2803 ; XOP-FALLBACK:       # %bb.0:
2804 ; XOP-FALLBACK-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm2
2805 ; XOP-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2806 ; XOP-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
2807 ; XOP-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
2808 ; XOP-FALLBACK-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
2809 ; XOP-FALLBACK-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
2810 ; XOP-FALLBACK-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
2811 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
2812 ; 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]
2813 ; XOP-FALLBACK-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
2814 ; 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
2815 ; 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
2816 ; XOP-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2817 ; XOP-FALLBACK-NEXT:    vpperm {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14],xmm3[0,2,4,6,8,10,12,14]
2818 ; XOP-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2819 ; XOP-FALLBACK-NEXT:    retq
2821 ; XOPAVX1-LABEL: vec128_i8_signed_reg_reg:
2822 ; XOPAVX1:       # %bb.0:
2823 ; XOPAVX1-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm2
2824 ; XOPAVX1-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2825 ; XOPAVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
2826 ; XOPAVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
2827 ; XOPAVX1-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
2828 ; XOPAVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
2829 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
2830 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
2831 ; 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]
2832 ; XOPAVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
2833 ; 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
2834 ; 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
2835 ; XOPAVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2836 ; XOPAVX1-NEXT:    vpperm {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14],xmm3[0,2,4,6,8,10,12,14]
2837 ; XOPAVX1-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2838 ; XOPAVX1-NEXT:    retq
2840 ; XOPAVX2-LABEL: vec128_i8_signed_reg_reg:
2841 ; XOPAVX2:       # %bb.0:
2842 ; XOPAVX2-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm2
2843 ; XOPAVX2-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2844 ; XOPAVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
2845 ; XOPAVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
2846 ; XOPAVX2-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
2847 ; XOPAVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
2848 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
2849 ; XOPAVX2-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
2850 ; XOPAVX2-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
2851 ; XOPAVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2852 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2853 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
2854 ; XOPAVX2-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
2855 ; XOPAVX2-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2856 ; XOPAVX2-NEXT:    vzeroupper
2857 ; XOPAVX2-NEXT:    retq
2859 ; AVX512F-LABEL: vec128_i8_signed_reg_reg:
2860 ; AVX512F:       # %bb.0:
2861 ; AVX512F-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm2
2862 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2863 ; AVX512F-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
2864 ; AVX512F-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
2865 ; AVX512F-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
2866 ; AVX512F-NEXT:    vpsrlw $1, %xmm1, %xmm1
2867 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
2868 ; AVX512F-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
2869 ; AVX512F-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
2870 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2871 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
2872 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
2873 ; AVX512F-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2874 ; AVX512F-NEXT:    vzeroupper
2875 ; AVX512F-NEXT:    retq
2877 ; AVX512VL-FALLBACK-LABEL: vec128_i8_signed_reg_reg:
2878 ; AVX512VL-FALLBACK:       # %bb.0:
2879 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm2
2880 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
2881 ; AVX512VL-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
2882 ; AVX512VL-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
2883 ; AVX512VL-FALLBACK-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
2884 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2885 ; AVX512VL-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
2886 ; AVX512VL-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
2887 ; AVX512VL-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
2888 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2889 ; AVX512VL-FALLBACK-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
2890 ; AVX512VL-FALLBACK-NEXT:    vpmovdb %zmm1, %xmm1
2891 ; AVX512VL-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2892 ; AVX512VL-FALLBACK-NEXT:    vzeroupper
2893 ; AVX512VL-FALLBACK-NEXT:    retq
2895 ; AVX512BW-FALLBACK-LABEL: vec128_i8_signed_reg_reg:
2896 ; AVX512BW-FALLBACK:       # %bb.0:
2897 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2898 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2899 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtb %zmm1, %zmm0, %k1
2900 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2901 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2902 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
2903 ; AVX512BW-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm2
2904 ; AVX512BW-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
2905 ; AVX512BW-FALLBACK-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
2906 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
2907 ; AVX512BW-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
2908 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
2909 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
2910 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2911 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm1, %ymm1
2912 ; AVX512BW-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2913 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
2914 ; AVX512BW-FALLBACK-NEXT:    retq
2916 ; AVX512VLBW-LABEL: vec128_i8_signed_reg_reg:
2917 ; AVX512VLBW:       # %bb.0:
2918 ; AVX512VLBW-NEXT:    vpcmpgtb %xmm1, %xmm0, %k1
2919 ; AVX512VLBW-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2920 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
2921 ; AVX512VLBW-NEXT:    vmovdqu8 %xmm2, %xmm3 {%k1}
2922 ; AVX512VLBW-NEXT:    vpminsb %xmm1, %xmm0, %xmm2
2923 ; AVX512VLBW-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
2924 ; AVX512VLBW-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
2925 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm1, %xmm1
2926 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
2927 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
2928 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
2929 ; AVX512VLBW-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2930 ; AVX512VLBW-NEXT:    vpmovwb %ymm1, %xmm1
2931 ; AVX512VLBW-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
2932 ; AVX512VLBW-NEXT:    vzeroupper
2933 ; AVX512VLBW-NEXT:    retq
2934   %t3 = icmp sgt <16 x i8> %a1, %a2 ; signed
2935   %t4 = select <16 x i1> %t3, <16 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>, <16 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>
2936   %t5 = select <16 x i1> %t3, <16 x i8> %a2, <16 x i8> %a1
2937   %t6 = select <16 x i1> %t3, <16 x i8> %a1, <16 x i8> %a2
2938   %t7 = sub <16 x i8> %t6, %t5
2939   %t8 = lshr <16 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>
2940   %t9 = mul nsw <16 x i8> %t8, %t4 ; signed
2941   %a10 = add nsw <16 x i8> %t9, %a1 ; signed
2942   ret <16 x i8> %a10
2945 define <16 x i8> @vec128_i8_unsigned_reg_reg(<16 x i8> %a1, <16 x i8> %a2) nounwind {
2946 ; SSE2-LABEL: vec128_i8_unsigned_reg_reg:
2947 ; SSE2:       # %bb.0:
2948 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
2949 ; SSE2-NEXT:    pminub %xmm1, %xmm3
2950 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
2951 ; SSE2-NEXT:    pcmpeqb %xmm3, %xmm4
2952 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
2953 ; SSE2-NEXT:    pxor %xmm4, %xmm2
2954 ; SSE2-NEXT:    por {{.*}}(%rip), %xmm2
2955 ; SSE2-NEXT:    pmaxub %xmm0, %xmm1
2956 ; SSE2-NEXT:    psubb %xmm3, %xmm1
2957 ; SSE2-NEXT:    psrlw $1, %xmm1
2958 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
2959 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
2960 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = 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]
2961 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
2962 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
2963 ; SSE2-NEXT:    pmullw %xmm3, %xmm4
2964 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2965 ; SSE2-NEXT:    pand %xmm3, %xmm4
2966 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2967 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2968 ; SSE2-NEXT:    pmullw %xmm1, %xmm2
2969 ; SSE2-NEXT:    pand %xmm3, %xmm2
2970 ; SSE2-NEXT:    packuswb %xmm4, %xmm2
2971 ; SSE2-NEXT:    paddb %xmm2, %xmm0
2972 ; SSE2-NEXT:    retq
2974 ; SSE41-LABEL: vec128_i8_unsigned_reg_reg:
2975 ; SSE41:       # %bb.0:
2976 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
2977 ; SSE41-NEXT:    pminub %xmm1, %xmm2
2978 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
2979 ; SSE41-NEXT:    pcmpeqb %xmm2, %xmm3
2980 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
2981 ; SSE41-NEXT:    pxor %xmm3, %xmm4
2982 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm4
2983 ; SSE41-NEXT:    pmaxub %xmm0, %xmm1
2984 ; SSE41-NEXT:    psubb %xmm2, %xmm1
2985 ; SSE41-NEXT:    psrlw $1, %xmm1
2986 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
2987 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2988 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = 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]
2989 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
2990 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
2991 ; SSE41-NEXT:    pmullw %xmm1, %xmm4
2992 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
2993 ; SSE41-NEXT:    pand %xmm1, %xmm4
2994 ; SSE41-NEXT:    pmullw %xmm3, %xmm2
2995 ; SSE41-NEXT:    pand %xmm1, %xmm2
2996 ; SSE41-NEXT:    packuswb %xmm4, %xmm2
2997 ; SSE41-NEXT:    paddb %xmm2, %xmm0
2998 ; SSE41-NEXT:    retq
3000 ; AVX1-FALLBACK-LABEL: vec128_i8_unsigned_reg_reg:
3001 ; AVX1-FALLBACK:       # %bb.0:
3002 ; AVX1-FALLBACK-NEXT:    vpminub %xmm1, %xmm0, %xmm2
3003 ; AVX1-FALLBACK-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm3
3004 ; AVX1-FALLBACK-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
3005 ; AVX1-FALLBACK-NEXT:    vpxor %xmm4, %xmm3, %xmm3
3006 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm3, %xmm3
3007 ; AVX1-FALLBACK-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
3008 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
3009 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
3010 ; AVX1-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3011 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm2 = 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]
3012 ; 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]
3013 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm4, %xmm2, %xmm2
3014 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
3015 ; AVX1-FALLBACK-NEXT:    vpand %xmm4, %xmm2, %xmm2
3016 ; 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
3017 ; 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
3018 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
3019 ; AVX1-FALLBACK-NEXT:    vpand %xmm4, %xmm1, %xmm1
3020 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
3021 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3022 ; AVX1-FALLBACK-NEXT:    retq
3024 ; AVX2-FALLBACK-LABEL: vec128_i8_unsigned_reg_reg:
3025 ; AVX2-FALLBACK:       # %bb.0:
3026 ; AVX2-FALLBACK-NEXT:    vpminub %xmm1, %xmm0, %xmm2
3027 ; AVX2-FALLBACK-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm3
3028 ; AVX2-FALLBACK-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
3029 ; AVX2-FALLBACK-NEXT:    vpxor %xmm4, %xmm3, %xmm3
3030 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm3, %xmm3
3031 ; AVX2-FALLBACK-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
3032 ; AVX2-FALLBACK-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
3033 ; AVX2-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
3034 ; AVX2-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3035 ; AVX2-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3036 ; AVX2-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
3037 ; AVX2-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3038 ; AVX2-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3039 ; AVX2-FALLBACK-NEXT:    vextracti128 $1, %ymm1, %xmm2
3040 ; AVX2-FALLBACK-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
3041 ; AVX2-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3042 ; AVX2-FALLBACK-NEXT:    vzeroupper
3043 ; AVX2-FALLBACK-NEXT:    retq
3045 ; XOP-FALLBACK-LABEL: vec128_i8_unsigned_reg_reg:
3046 ; XOP-FALLBACK:       # %bb.0:
3047 ; XOP-FALLBACK-NEXT:    vpcomgtub %xmm1, %xmm0, %xmm2
3048 ; XOP-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3049 ; XOP-FALLBACK-NEXT:    vpminub %xmm1, %xmm0, %xmm3
3050 ; XOP-FALLBACK-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
3051 ; XOP-FALLBACK-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3052 ; XOP-FALLBACK-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
3053 ; XOP-FALLBACK-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
3054 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
3055 ; 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]
3056 ; XOP-FALLBACK-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
3057 ; 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
3058 ; 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
3059 ; XOP-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
3060 ; XOP-FALLBACK-NEXT:    vpperm {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14],xmm3[0,2,4,6,8,10,12,14]
3061 ; XOP-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3062 ; XOP-FALLBACK-NEXT:    retq
3064 ; XOPAVX1-LABEL: vec128_i8_unsigned_reg_reg:
3065 ; XOPAVX1:       # %bb.0:
3066 ; XOPAVX1-NEXT:    vpcomgtub %xmm1, %xmm0, %xmm2
3067 ; XOPAVX1-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3068 ; XOPAVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm3
3069 ; XOPAVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
3070 ; XOPAVX1-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3071 ; XOPAVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
3072 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
3073 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
3074 ; 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]
3075 ; XOPAVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
3076 ; 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
3077 ; 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
3078 ; XOPAVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
3079 ; XOPAVX1-NEXT:    vpperm {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14],xmm3[0,2,4,6,8,10,12,14]
3080 ; XOPAVX1-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3081 ; XOPAVX1-NEXT:    retq
3083 ; XOPAVX2-LABEL: vec128_i8_unsigned_reg_reg:
3084 ; XOPAVX2:       # %bb.0:
3085 ; XOPAVX2-NEXT:    vpcomgtub %xmm1, %xmm0, %xmm2
3086 ; XOPAVX2-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3087 ; XOPAVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm3
3088 ; XOPAVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
3089 ; XOPAVX2-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3090 ; XOPAVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
3091 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
3092 ; XOPAVX2-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3093 ; XOPAVX2-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
3094 ; XOPAVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3095 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3096 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
3097 ; XOPAVX2-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
3098 ; XOPAVX2-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3099 ; XOPAVX2-NEXT:    vzeroupper
3100 ; XOPAVX2-NEXT:    retq
3102 ; AVX512F-LABEL: vec128_i8_unsigned_reg_reg:
3103 ; AVX512F:       # %bb.0:
3104 ; AVX512F-NEXT:    vpminub %xmm1, %xmm0, %xmm2
3105 ; AVX512F-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm3
3106 ; AVX512F-NEXT:    vpternlogq $15, %zmm3, %zmm3, %zmm3
3107 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm3, %xmm3
3108 ; AVX512F-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
3109 ; AVX512F-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
3110 ; AVX512F-NEXT:    vpsrlw $1, %xmm1, %xmm1
3111 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3112 ; AVX512F-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3113 ; AVX512F-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
3114 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3115 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
3116 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
3117 ; AVX512F-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3118 ; AVX512F-NEXT:    vzeroupper
3119 ; AVX512F-NEXT:    retq
3121 ; AVX512VL-FALLBACK-LABEL: vec128_i8_unsigned_reg_reg:
3122 ; AVX512VL-FALLBACK:       # %bb.0:
3123 ; AVX512VL-FALLBACK-NEXT:    vpminub %xmm1, %xmm0, %xmm2
3124 ; AVX512VL-FALLBACK-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm3
3125 ; AVX512VL-FALLBACK-NEXT:    vpternlogq $15, %xmm3, %xmm3, %xmm3
3126 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm3, %xmm3
3127 ; AVX512VL-FALLBACK-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
3128 ; AVX512VL-FALLBACK-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
3129 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
3130 ; AVX512VL-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3131 ; AVX512VL-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3132 ; AVX512VL-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
3133 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3134 ; AVX512VL-FALLBACK-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
3135 ; AVX512VL-FALLBACK-NEXT:    vpmovdb %zmm1, %xmm1
3136 ; AVX512VL-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3137 ; AVX512VL-FALLBACK-NEXT:    vzeroupper
3138 ; AVX512VL-FALLBACK-NEXT:    retq
3140 ; AVX512BW-FALLBACK-LABEL: vec128_i8_unsigned_reg_reg:
3141 ; AVX512BW-FALLBACK:       # %bb.0:
3142 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
3143 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
3144 ; AVX512BW-FALLBACK-NEXT:    vpcmpnleub %zmm1, %zmm0, %k1
3145 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
3146 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3147 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
3148 ; AVX512BW-FALLBACK-NEXT:    vpminub %xmm1, %xmm0, %xmm2
3149 ; AVX512BW-FALLBACK-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
3150 ; AVX512BW-FALLBACK-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
3151 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
3152 ; AVX512BW-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3153 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3154 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
3155 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3156 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm1, %ymm1
3157 ; AVX512BW-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3158 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
3159 ; AVX512BW-FALLBACK-NEXT:    retq
3161 ; AVX512VLBW-LABEL: vec128_i8_unsigned_reg_reg:
3162 ; AVX512VLBW:       # %bb.0:
3163 ; AVX512VLBW-NEXT:    vpcmpnleub %xmm1, %xmm0, %k1
3164 ; AVX512VLBW-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
3165 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3166 ; AVX512VLBW-NEXT:    vmovdqu8 %xmm2, %xmm3 {%k1}
3167 ; AVX512VLBW-NEXT:    vpminub %xmm1, %xmm0, %xmm2
3168 ; AVX512VLBW-NEXT:    vpmaxub %xmm1, %xmm0, %xmm1
3169 ; AVX512VLBW-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
3170 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm1, %xmm1
3171 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3172 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3173 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
3174 ; AVX512VLBW-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3175 ; AVX512VLBW-NEXT:    vpmovwb %ymm1, %xmm1
3176 ; AVX512VLBW-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3177 ; AVX512VLBW-NEXT:    vzeroupper
3178 ; AVX512VLBW-NEXT:    retq
3179   %t3 = icmp ugt <16 x i8> %a1, %a2
3180   %t4 = select <16 x i1> %t3, <16 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>, <16 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>
3181   %t5 = select <16 x i1> %t3, <16 x i8> %a2, <16 x i8> %a1
3182   %t6 = select <16 x i1> %t3, <16 x i8> %a1, <16 x i8> %a2
3183   %t7 = sub <16 x i8> %t6, %t5
3184   %t8 = lshr <16 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>
3185   %t9 = mul <16 x i8> %t8, %t4
3186   %a10 = add <16 x i8> %t9, %a1
3187   ret <16 x i8> %a10
3190 ; Values are loaded. Only check signed case.
3192 define <16 x i8> @vec128_i8_signed_mem_reg(<16 x i8>* %a1_addr, <16 x i8> %a2) nounwind {
3193 ; SSE2-LABEL: vec128_i8_signed_mem_reg:
3194 ; SSE2:       # %bb.0:
3195 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
3196 ; SSE2-NEXT:    movdqa (%rdi), %xmm2
3197 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
3198 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm3
3199 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3200 ; SSE2-NEXT:    por %xmm3, %xmm0
3201 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
3202 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm4
3203 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
3204 ; SSE2-NEXT:    pand %xmm4, %xmm5
3205 ; SSE2-NEXT:    pandn %xmm1, %xmm4
3206 ; SSE2-NEXT:    por %xmm5, %xmm4
3207 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
3208 ; SSE2-NEXT:    pand %xmm3, %xmm5
3209 ; SSE2-NEXT:    pandn %xmm1, %xmm3
3210 ; SSE2-NEXT:    por %xmm5, %xmm3
3211 ; SSE2-NEXT:    psubb %xmm4, %xmm3
3212 ; SSE2-NEXT:    psrlw $1, %xmm3
3213 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
3214 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
3215 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = 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]
3216 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
3217 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
3218 ; SSE2-NEXT:    pmullw %xmm1, %xmm4
3219 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
3220 ; SSE2-NEXT:    pand %xmm1, %xmm4
3221 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
3222 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3223 ; SSE2-NEXT:    pmullw %xmm3, %xmm0
3224 ; SSE2-NEXT:    pand %xmm1, %xmm0
3225 ; SSE2-NEXT:    packuswb %xmm4, %xmm0
3226 ; SSE2-NEXT:    paddb %xmm2, %xmm0
3227 ; SSE2-NEXT:    retq
3229 ; SSE41-LABEL: vec128_i8_signed_mem_reg:
3230 ; SSE41:       # %bb.0:
3231 ; SSE41-NEXT:    movdqa (%rdi), %xmm2
3232 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
3233 ; SSE41-NEXT:    pcmpgtb %xmm0, %xmm3
3234 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm3
3235 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
3236 ; SSE41-NEXT:    pminsb %xmm0, %xmm1
3237 ; SSE41-NEXT:    pmaxsb %xmm2, %xmm0
3238 ; SSE41-NEXT:    psubb %xmm1, %xmm0
3239 ; SSE41-NEXT:    psrlw $1, %xmm0
3240 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm0
3241 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
3242 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3243 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
3244 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = 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]
3245 ; SSE41-NEXT:    pmullw %xmm0, %xmm3
3246 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255]
3247 ; SSE41-NEXT:    pand %xmm0, %xmm3
3248 ; SSE41-NEXT:    pmullw %xmm4, %xmm1
3249 ; SSE41-NEXT:    pand %xmm0, %xmm1
3250 ; SSE41-NEXT:    packuswb %xmm3, %xmm1
3251 ; SSE41-NEXT:    paddb %xmm2, %xmm1
3252 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
3253 ; SSE41-NEXT:    retq
3255 ; AVX1-FALLBACK-LABEL: vec128_i8_signed_mem_reg:
3256 ; AVX1-FALLBACK:       # %bb.0:
3257 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
3258 ; AVX1-FALLBACK-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm2
3259 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3260 ; AVX1-FALLBACK-NEXT:    vpminsb %xmm0, %xmm1, %xmm3
3261 ; AVX1-FALLBACK-NEXT:    vpmaxsb %xmm0, %xmm1, %xmm0
3262 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm3, %xmm0, %xmm0
3263 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm0, %xmm0
3264 ; AVX1-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3265 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3266 ; AVX1-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]
3267 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
3268 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
3269 ; AVX1-FALLBACK-NEXT:    vpand %xmm4, %xmm3, %xmm3
3270 ; 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
3271 ; 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
3272 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
3273 ; AVX1-FALLBACK-NEXT:    vpand %xmm4, %xmm0, %xmm0
3274 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
3275 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
3276 ; AVX1-FALLBACK-NEXT:    retq
3278 ; AVX2-FALLBACK-LABEL: vec128_i8_signed_mem_reg:
3279 ; AVX2-FALLBACK:       # %bb.0:
3280 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
3281 ; AVX2-FALLBACK-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm2
3282 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3283 ; AVX2-FALLBACK-NEXT:    vpminsb %xmm0, %xmm1, %xmm3
3284 ; AVX2-FALLBACK-NEXT:    vpmaxsb %xmm0, %xmm1, %xmm0
3285 ; AVX2-FALLBACK-NEXT:    vpsubb %xmm3, %xmm0, %xmm0
3286 ; AVX2-FALLBACK-NEXT:    vpsrlw $1, %xmm0, %xmm0
3287 ; AVX2-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3288 ; AVX2-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
3289 ; AVX2-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
3290 ; AVX2-FALLBACK-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
3291 ; AVX2-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
3292 ; AVX2-FALLBACK-NEXT:    vextracti128 $1, %ymm0, %xmm2
3293 ; AVX2-FALLBACK-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
3294 ; AVX2-FALLBACK-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
3295 ; AVX2-FALLBACK-NEXT:    vzeroupper
3296 ; AVX2-FALLBACK-NEXT:    retq
3298 ; XOP-FALLBACK-LABEL: vec128_i8_signed_mem_reg:
3299 ; XOP-FALLBACK:       # %bb.0:
3300 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
3301 ; XOP-FALLBACK-NEXT:    vpcomgtb %xmm0, %xmm1, %xmm2
3302 ; XOP-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3303 ; XOP-FALLBACK-NEXT:    vpminsb %xmm0, %xmm1, %xmm3
3304 ; XOP-FALLBACK-NEXT:    vpmaxsb %xmm0, %xmm1, %xmm0
3305 ; XOP-FALLBACK-NEXT:    vpsubb %xmm3, %xmm0, %xmm0
3306 ; XOP-FALLBACK-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
3307 ; XOP-FALLBACK-NEXT:    vpshlb %xmm3, %xmm0, %xmm0
3308 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3309 ; 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]
3310 ; XOP-FALLBACK-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
3311 ; 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
3312 ; 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
3313 ; XOP-FALLBACK-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
3314 ; XOP-FALLBACK-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],xmm3[0,2,4,6,8,10,12,14]
3315 ; XOP-FALLBACK-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
3316 ; XOP-FALLBACK-NEXT:    retq
3318 ; XOPAVX1-LABEL: vec128_i8_signed_mem_reg:
3319 ; XOPAVX1:       # %bb.0:
3320 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm1
3321 ; XOPAVX1-NEXT:    vpcomgtb %xmm0, %xmm1, %xmm2
3322 ; XOPAVX1-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3323 ; XOPAVX1-NEXT:    vpminsb %xmm0, %xmm1, %xmm3
3324 ; XOPAVX1-NEXT:    vpmaxsb %xmm0, %xmm1, %xmm0
3325 ; XOPAVX1-NEXT:    vpsubb %xmm3, %xmm0, %xmm0
3326 ; XOPAVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
3327 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm0, %xmm0
3328 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3329 ; 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]
3330 ; XOPAVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
3331 ; 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
3332 ; 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
3333 ; XOPAVX1-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
3334 ; XOPAVX1-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],xmm3[0,2,4,6,8,10,12,14]
3335 ; XOPAVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
3336 ; XOPAVX1-NEXT:    retq
3338 ; XOPAVX2-LABEL: vec128_i8_signed_mem_reg:
3339 ; XOPAVX2:       # %bb.0:
3340 ; XOPAVX2-NEXT:    vmovdqa (%rdi), %xmm1
3341 ; XOPAVX2-NEXT:    vpcomgtb %xmm0, %xmm1, %xmm2
3342 ; XOPAVX2-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3343 ; XOPAVX2-NEXT:    vpminsb %xmm0, %xmm1, %xmm3
3344 ; XOPAVX2-NEXT:    vpmaxsb %xmm0, %xmm1, %xmm0
3345 ; XOPAVX2-NEXT:    vpsubb %xmm3, %xmm0, %xmm0
3346 ; XOPAVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
3347 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm0, %xmm0
3348 ; XOPAVX2-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
3349 ; XOPAVX2-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
3350 ; XOPAVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
3351 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
3352 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
3353 ; XOPAVX2-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
3354 ; XOPAVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
3355 ; XOPAVX2-NEXT:    vzeroupper
3356 ; XOPAVX2-NEXT:    retq
3358 ; AVX512F-LABEL: vec128_i8_signed_mem_reg:
3359 ; AVX512F:       # %bb.0:
3360 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm1
3361 ; AVX512F-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm2
3362 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3363 ; AVX512F-NEXT:    vpminsb %xmm0, %xmm1, %xmm3
3364 ; AVX512F-NEXT:    vpmaxsb %xmm0, %xmm1, %xmm0
3365 ; AVX512F-NEXT:    vpsubb %xmm3, %xmm0, %xmm0
3366 ; AVX512F-NEXT:    vpsrlw $1, %xmm0, %xmm0
3367 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3368 ; AVX512F-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
3369 ; AVX512F-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
3370 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
3371 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3372 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
3373 ; AVX512F-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
3374 ; AVX512F-NEXT:    vzeroupper
3375 ; AVX512F-NEXT:    retq
3377 ; AVX512VL-FALLBACK-LABEL: vec128_i8_signed_mem_reg:
3378 ; AVX512VL-FALLBACK:       # %bb.0:
3379 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
3380 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm2
3381 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3382 ; AVX512VL-FALLBACK-NEXT:    vpminsb %xmm0, %xmm1, %xmm3
3383 ; AVX512VL-FALLBACK-NEXT:    vpmaxsb %xmm0, %xmm1, %xmm0
3384 ; AVX512VL-FALLBACK-NEXT:    vpsubb %xmm3, %xmm0, %xmm0
3385 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %xmm0, %xmm0
3386 ; AVX512VL-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3387 ; AVX512VL-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
3388 ; AVX512VL-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
3389 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
3390 ; AVX512VL-FALLBACK-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3391 ; AVX512VL-FALLBACK-NEXT:    vpmovdb %zmm0, %xmm0
3392 ; AVX512VL-FALLBACK-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
3393 ; AVX512VL-FALLBACK-NEXT:    vzeroupper
3394 ; AVX512VL-FALLBACK-NEXT:    retq
3396 ; AVX512BW-FALLBACK-LABEL: vec128_i8_signed_mem_reg:
3397 ; AVX512BW-FALLBACK:       # %bb.0:
3398 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
3399 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
3400 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtb %zmm0, %zmm1, %k1
3401 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
3402 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3403 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
3404 ; AVX512BW-FALLBACK-NEXT:    vpminsb %xmm0, %xmm1, %xmm2
3405 ; AVX512BW-FALLBACK-NEXT:    vpmaxsb %xmm0, %xmm1, %xmm0
3406 ; AVX512BW-FALLBACK-NEXT:    vpsubb %xmm2, %xmm0, %xmm0
3407 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %xmm0, %xmm0
3408 ; AVX512BW-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3409 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
3410 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
3411 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
3412 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm0, %ymm0
3413 ; AVX512BW-FALLBACK-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
3414 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
3415 ; AVX512BW-FALLBACK-NEXT:    retq
3417 ; AVX512VLBW-LABEL: vec128_i8_signed_mem_reg:
3418 ; AVX512VLBW:       # %bb.0:
3419 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %xmm1
3420 ; AVX512VLBW-NEXT:    vpcmpgtb %xmm0, %xmm1, %k1
3421 ; AVX512VLBW-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
3422 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3423 ; AVX512VLBW-NEXT:    vmovdqu8 %xmm2, %xmm3 {%k1}
3424 ; AVX512VLBW-NEXT:    vpminsb %xmm0, %xmm1, %xmm2
3425 ; AVX512VLBW-NEXT:    vpmaxsb %xmm0, %xmm1, %xmm0
3426 ; AVX512VLBW-NEXT:    vpsubb %xmm2, %xmm0, %xmm0
3427 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm0, %xmm0
3428 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3429 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
3430 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
3431 ; AVX512VLBW-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
3432 ; AVX512VLBW-NEXT:    vpmovwb %ymm0, %xmm0
3433 ; AVX512VLBW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
3434 ; AVX512VLBW-NEXT:    vzeroupper
3435 ; AVX512VLBW-NEXT:    retq
3436   %a1 = load <16 x i8>, <16 x i8>* %a1_addr
3437   %t3 = icmp sgt <16 x i8> %a1, %a2 ; signed
3438   %t4 = select <16 x i1> %t3, <16 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>, <16 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>
3439   %t5 = select <16 x i1> %t3, <16 x i8> %a2, <16 x i8> %a1
3440   %t6 = select <16 x i1> %t3, <16 x i8> %a1, <16 x i8> %a2
3441   %t7 = sub <16 x i8> %t6, %t5
3442   %t8 = lshr <16 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>
3443   %t9 = mul nsw <16 x i8> %t8, %t4 ; signed
3444   %a10 = add nsw <16 x i8> %t9, %a1 ; signed
3445   ret <16 x i8> %a10
3448 define <16 x i8> @vec128_i8_signed_reg_mem(<16 x i8> %a1, <16 x i8>* %a2_addr) nounwind {
3449 ; SSE2-LABEL: vec128_i8_signed_reg_mem:
3450 ; SSE2:       # %bb.0:
3451 ; SSE2-NEXT:    movdqa (%rdi), %xmm3
3452 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
3453 ; SSE2-NEXT:    pcmpgtb %xmm3, %xmm1
3454 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3455 ; SSE2-NEXT:    por %xmm1, %xmm2
3456 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
3457 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm4
3458 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
3459 ; SSE2-NEXT:    pand %xmm4, %xmm5
3460 ; SSE2-NEXT:    pandn %xmm3, %xmm4
3461 ; SSE2-NEXT:    por %xmm5, %xmm4
3462 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
3463 ; SSE2-NEXT:    pand %xmm1, %xmm5
3464 ; SSE2-NEXT:    pandn %xmm3, %xmm1
3465 ; SSE2-NEXT:    por %xmm5, %xmm1
3466 ; SSE2-NEXT:    psubb %xmm4, %xmm1
3467 ; SSE2-NEXT:    psrlw $1, %xmm1
3468 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
3469 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
3470 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = 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]
3471 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
3472 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
3473 ; SSE2-NEXT:    pmullw %xmm3, %xmm4
3474 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
3475 ; SSE2-NEXT:    pand %xmm3, %xmm4
3476 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
3477 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
3478 ; SSE2-NEXT:    pmullw %xmm2, %xmm1
3479 ; SSE2-NEXT:    pand %xmm3, %xmm1
3480 ; SSE2-NEXT:    packuswb %xmm4, %xmm1
3481 ; SSE2-NEXT:    paddb %xmm0, %xmm1
3482 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
3483 ; SSE2-NEXT:    retq
3485 ; SSE41-LABEL: vec128_i8_signed_reg_mem:
3486 ; SSE41:       # %bb.0:
3487 ; SSE41-NEXT:    movdqa (%rdi), %xmm1
3488 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
3489 ; SSE41-NEXT:    pcmpgtb %xmm1, %xmm2
3490 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm2
3491 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
3492 ; SSE41-NEXT:    pminsb %xmm1, %xmm3
3493 ; SSE41-NEXT:    pmaxsb %xmm0, %xmm1
3494 ; SSE41-NEXT:    psubb %xmm3, %xmm1
3495 ; SSE41-NEXT:    psrlw $1, %xmm1
3496 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
3497 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
3498 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = 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]
3499 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
3500 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = 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]
3501 ; SSE41-NEXT:    pmullw %xmm1, %xmm2
3502 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
3503 ; SSE41-NEXT:    pand %xmm1, %xmm2
3504 ; SSE41-NEXT:    pmullw %xmm4, %xmm3
3505 ; SSE41-NEXT:    pand %xmm1, %xmm3
3506 ; SSE41-NEXT:    packuswb %xmm2, %xmm3
3507 ; SSE41-NEXT:    paddb %xmm3, %xmm0
3508 ; SSE41-NEXT:    retq
3510 ; AVX1-FALLBACK-LABEL: vec128_i8_signed_reg_mem:
3511 ; AVX1-FALLBACK:       # %bb.0:
3512 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
3513 ; AVX1-FALLBACK-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm2
3514 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3515 ; AVX1-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
3516 ; AVX1-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3517 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3518 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
3519 ; AVX1-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3520 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
3521 ; AVX1-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]
3522 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
3523 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
3524 ; AVX1-FALLBACK-NEXT:    vpand %xmm4, %xmm3, %xmm3
3525 ; 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
3526 ; 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
3527 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
3528 ; AVX1-FALLBACK-NEXT:    vpand %xmm4, %xmm1, %xmm1
3529 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm3, %xmm1, %xmm1
3530 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3531 ; AVX1-FALLBACK-NEXT:    retq
3533 ; AVX2-FALLBACK-LABEL: vec128_i8_signed_reg_mem:
3534 ; AVX2-FALLBACK:       # %bb.0:
3535 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
3536 ; AVX2-FALLBACK-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm2
3537 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3538 ; AVX2-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
3539 ; AVX2-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3540 ; AVX2-FALLBACK-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3541 ; AVX2-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
3542 ; AVX2-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3543 ; AVX2-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3544 ; AVX2-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
3545 ; AVX2-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3546 ; AVX2-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3547 ; AVX2-FALLBACK-NEXT:    vextracti128 $1, %ymm1, %xmm2
3548 ; AVX2-FALLBACK-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
3549 ; AVX2-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3550 ; AVX2-FALLBACK-NEXT:    vzeroupper
3551 ; AVX2-FALLBACK-NEXT:    retq
3553 ; XOP-FALLBACK-LABEL: vec128_i8_signed_reg_mem:
3554 ; XOP-FALLBACK:       # %bb.0:
3555 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
3556 ; XOP-FALLBACK-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm2
3557 ; XOP-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3558 ; XOP-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
3559 ; XOP-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3560 ; XOP-FALLBACK-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3561 ; XOP-FALLBACK-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
3562 ; XOP-FALLBACK-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
3563 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
3564 ; 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]
3565 ; XOP-FALLBACK-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
3566 ; 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
3567 ; 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
3568 ; XOP-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
3569 ; XOP-FALLBACK-NEXT:    vpperm {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14],xmm3[0,2,4,6,8,10,12,14]
3570 ; XOP-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3571 ; XOP-FALLBACK-NEXT:    retq
3573 ; XOPAVX1-LABEL: vec128_i8_signed_reg_mem:
3574 ; XOPAVX1:       # %bb.0:
3575 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm1
3576 ; XOPAVX1-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm2
3577 ; XOPAVX1-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3578 ; XOPAVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
3579 ; XOPAVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3580 ; XOPAVX1-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3581 ; XOPAVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
3582 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
3583 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
3584 ; 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]
3585 ; XOPAVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
3586 ; 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
3587 ; 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
3588 ; XOPAVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
3589 ; XOPAVX1-NEXT:    vpperm {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14],xmm3[0,2,4,6,8,10,12,14]
3590 ; XOPAVX1-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3591 ; XOPAVX1-NEXT:    retq
3593 ; XOPAVX2-LABEL: vec128_i8_signed_reg_mem:
3594 ; XOPAVX2:       # %bb.0:
3595 ; XOPAVX2-NEXT:    vmovdqa (%rdi), %xmm1
3596 ; XOPAVX2-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm2
3597 ; XOPAVX2-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3598 ; XOPAVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
3599 ; XOPAVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3600 ; XOPAVX2-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3601 ; XOPAVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
3602 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
3603 ; XOPAVX2-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3604 ; XOPAVX2-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
3605 ; XOPAVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3606 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3607 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
3608 ; XOPAVX2-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
3609 ; XOPAVX2-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3610 ; XOPAVX2-NEXT:    vzeroupper
3611 ; XOPAVX2-NEXT:    retq
3613 ; AVX512F-LABEL: vec128_i8_signed_reg_mem:
3614 ; AVX512F:       # %bb.0:
3615 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm1
3616 ; AVX512F-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm2
3617 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3618 ; AVX512F-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
3619 ; AVX512F-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3620 ; AVX512F-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3621 ; AVX512F-NEXT:    vpsrlw $1, %xmm1, %xmm1
3622 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3623 ; AVX512F-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3624 ; AVX512F-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
3625 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3626 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
3627 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
3628 ; AVX512F-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3629 ; AVX512F-NEXT:    vzeroupper
3630 ; AVX512F-NEXT:    retq
3632 ; AVX512VL-FALLBACK-LABEL: vec128_i8_signed_reg_mem:
3633 ; AVX512VL-FALLBACK:       # %bb.0:
3634 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
3635 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm2
3636 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3637 ; AVX512VL-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
3638 ; AVX512VL-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3639 ; AVX512VL-FALLBACK-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3640 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
3641 ; AVX512VL-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3642 ; AVX512VL-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3643 ; AVX512VL-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
3644 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3645 ; AVX512VL-FALLBACK-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
3646 ; AVX512VL-FALLBACK-NEXT:    vpmovdb %zmm1, %xmm1
3647 ; AVX512VL-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3648 ; AVX512VL-FALLBACK-NEXT:    vzeroupper
3649 ; AVX512VL-FALLBACK-NEXT:    retq
3651 ; AVX512BW-FALLBACK-LABEL: vec128_i8_signed_reg_mem:
3652 ; AVX512BW-FALLBACK:       # %bb.0:
3653 ; AVX512BW-FALLBACK-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
3654 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm1
3655 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtb %zmm1, %zmm0, %k1
3656 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
3657 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3658 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
3659 ; AVX512BW-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm2
3660 ; AVX512BW-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3661 ; AVX512BW-FALLBACK-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
3662 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
3663 ; AVX512BW-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3664 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3665 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
3666 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3667 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm1, %ymm1
3668 ; AVX512BW-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3669 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
3670 ; AVX512BW-FALLBACK-NEXT:    retq
3672 ; AVX512VLBW-LABEL: vec128_i8_signed_reg_mem:
3673 ; AVX512VLBW:       # %bb.0:
3674 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %xmm1
3675 ; AVX512VLBW-NEXT:    vpcmpgtb %xmm1, %xmm0, %k1
3676 ; AVX512VLBW-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
3677 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3678 ; AVX512VLBW-NEXT:    vmovdqu8 %xmm2, %xmm3 {%k1}
3679 ; AVX512VLBW-NEXT:    vpminsb %xmm1, %xmm0, %xmm2
3680 ; AVX512VLBW-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3681 ; AVX512VLBW-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
3682 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm1, %xmm1
3683 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3684 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3685 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
3686 ; AVX512VLBW-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3687 ; AVX512VLBW-NEXT:    vpmovwb %ymm1, %xmm1
3688 ; AVX512VLBW-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3689 ; AVX512VLBW-NEXT:    vzeroupper
3690 ; AVX512VLBW-NEXT:    retq
3691   %a2 = load <16 x i8>, <16 x i8>* %a2_addr
3692   %t3 = icmp sgt <16 x i8> %a1, %a2 ; signed
3693   %t4 = select <16 x i1> %t3, <16 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>, <16 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>
3694   %t5 = select <16 x i1> %t3, <16 x i8> %a2, <16 x i8> %a1
3695   %t6 = select <16 x i1> %t3, <16 x i8> %a1, <16 x i8> %a2
3696   %t7 = sub <16 x i8> %t6, %t5
3697   %t8 = lshr <16 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>
3698   %t9 = mul nsw <16 x i8> %t8, %t4 ; signed
3699   %a10 = add nsw <16 x i8> %t9, %a1 ; signed
3700   ret <16 x i8> %a10
3703 define <16 x i8> @vec128_i8_signed_mem_mem(<16 x i8>* %a1_addr, <16 x i8>* %a2_addr) nounwind {
3704 ; SSE2-LABEL: vec128_i8_signed_mem_mem:
3705 ; SSE2:       # %bb.0:
3706 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
3707 ; SSE2-NEXT:    movdqa (%rsi), %xmm3
3708 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
3709 ; SSE2-NEXT:    pcmpgtb %xmm3, %xmm2
3710 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3711 ; SSE2-NEXT:    por %xmm2, %xmm0
3712 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
3713 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm4
3714 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
3715 ; SSE2-NEXT:    pand %xmm4, %xmm5
3716 ; SSE2-NEXT:    pandn %xmm3, %xmm4
3717 ; SSE2-NEXT:    por %xmm5, %xmm4
3718 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
3719 ; SSE2-NEXT:    pand %xmm2, %xmm5
3720 ; SSE2-NEXT:    pandn %xmm3, %xmm2
3721 ; SSE2-NEXT:    por %xmm5, %xmm2
3722 ; SSE2-NEXT:    psubb %xmm4, %xmm2
3723 ; SSE2-NEXT:    psrlw $1, %xmm2
3724 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
3725 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
3726 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = 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]
3727 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
3728 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
3729 ; SSE2-NEXT:    pmullw %xmm3, %xmm4
3730 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
3731 ; SSE2-NEXT:    pand %xmm3, %xmm4
3732 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
3733 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3734 ; SSE2-NEXT:    pmullw %xmm2, %xmm0
3735 ; SSE2-NEXT:    pand %xmm3, %xmm0
3736 ; SSE2-NEXT:    packuswb %xmm4, %xmm0
3737 ; SSE2-NEXT:    paddb %xmm1, %xmm0
3738 ; SSE2-NEXT:    retq
3740 ; SSE41-LABEL: vec128_i8_signed_mem_mem:
3741 ; SSE41:       # %bb.0:
3742 ; SSE41-NEXT:    movdqa (%rdi), %xmm1
3743 ; SSE41-NEXT:    movdqa (%rsi), %xmm2
3744 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
3745 ; SSE41-NEXT:    pcmpgtb %xmm2, %xmm3
3746 ; SSE41-NEXT:    por {{.*}}(%rip), %xmm3
3747 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
3748 ; SSE41-NEXT:    pminsb %xmm2, %xmm0
3749 ; SSE41-NEXT:    pmaxsb %xmm1, %xmm2
3750 ; SSE41-NEXT:    psubb %xmm0, %xmm2
3751 ; SSE41-NEXT:    psrlw $1, %xmm2
3752 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
3753 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
3754 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = 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]
3755 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
3756 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = 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]
3757 ; SSE41-NEXT:    pmullw %xmm2, %xmm3
3758 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
3759 ; SSE41-NEXT:    pand %xmm2, %xmm3
3760 ; SSE41-NEXT:    pmullw %xmm4, %xmm0
3761 ; SSE41-NEXT:    pand %xmm2, %xmm0
3762 ; SSE41-NEXT:    packuswb %xmm3, %xmm0
3763 ; SSE41-NEXT:    paddb %xmm1, %xmm0
3764 ; SSE41-NEXT:    retq
3766 ; AVX1-FALLBACK-LABEL: vec128_i8_signed_mem_mem:
3767 ; AVX1-FALLBACK:       # %bb.0:
3768 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
3769 ; AVX1-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
3770 ; AVX1-FALLBACK-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm2
3771 ; AVX1-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3772 ; AVX1-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
3773 ; AVX1-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3774 ; AVX1-FALLBACK-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3775 ; AVX1-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
3776 ; AVX1-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3777 ; AVX1-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
3778 ; AVX1-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]
3779 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
3780 ; AVX1-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
3781 ; AVX1-FALLBACK-NEXT:    vpand %xmm4, %xmm3, %xmm3
3782 ; 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
3783 ; 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
3784 ; AVX1-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
3785 ; AVX1-FALLBACK-NEXT:    vpand %xmm4, %xmm1, %xmm1
3786 ; AVX1-FALLBACK-NEXT:    vpackuswb %xmm3, %xmm1, %xmm1
3787 ; AVX1-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3788 ; AVX1-FALLBACK-NEXT:    retq
3790 ; AVX2-FALLBACK-LABEL: vec128_i8_signed_mem_mem:
3791 ; AVX2-FALLBACK:       # %bb.0:
3792 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
3793 ; AVX2-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
3794 ; AVX2-FALLBACK-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm2
3795 ; AVX2-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3796 ; AVX2-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
3797 ; AVX2-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3798 ; AVX2-FALLBACK-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3799 ; AVX2-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
3800 ; AVX2-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3801 ; AVX2-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3802 ; AVX2-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
3803 ; AVX2-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3804 ; AVX2-FALLBACK-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3805 ; AVX2-FALLBACK-NEXT:    vextracti128 $1, %ymm1, %xmm2
3806 ; AVX2-FALLBACK-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
3807 ; AVX2-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3808 ; AVX2-FALLBACK-NEXT:    vzeroupper
3809 ; AVX2-FALLBACK-NEXT:    retq
3811 ; XOP-FALLBACK-LABEL: vec128_i8_signed_mem_mem:
3812 ; XOP-FALLBACK:       # %bb.0:
3813 ; XOP-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
3814 ; XOP-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
3815 ; XOP-FALLBACK-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm2
3816 ; XOP-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3817 ; XOP-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
3818 ; XOP-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3819 ; XOP-FALLBACK-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3820 ; XOP-FALLBACK-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
3821 ; XOP-FALLBACK-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
3822 ; XOP-FALLBACK-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
3823 ; 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]
3824 ; XOP-FALLBACK-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
3825 ; 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
3826 ; 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
3827 ; XOP-FALLBACK-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
3828 ; XOP-FALLBACK-NEXT:    vpperm {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14],xmm3[0,2,4,6,8,10,12,14]
3829 ; XOP-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3830 ; XOP-FALLBACK-NEXT:    retq
3832 ; XOPAVX1-LABEL: vec128_i8_signed_mem_mem:
3833 ; XOPAVX1:       # %bb.0:
3834 ; XOPAVX1-NEXT:    vmovdqa (%rdi), %xmm0
3835 ; XOPAVX1-NEXT:    vmovdqa (%rsi), %xmm1
3836 ; XOPAVX1-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm2
3837 ; XOPAVX1-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3838 ; XOPAVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
3839 ; XOPAVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3840 ; XOPAVX1-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3841 ; XOPAVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
3842 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
3843 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
3844 ; 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]
3845 ; XOPAVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
3846 ; 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
3847 ; 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
3848 ; XOPAVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
3849 ; XOPAVX1-NEXT:    vpperm {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14],xmm3[0,2,4,6,8,10,12,14]
3850 ; XOPAVX1-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3851 ; XOPAVX1-NEXT:    retq
3853 ; XOPAVX2-LABEL: vec128_i8_signed_mem_mem:
3854 ; XOPAVX2:       # %bb.0:
3855 ; XOPAVX2-NEXT:    vmovdqa (%rdi), %xmm0
3856 ; XOPAVX2-NEXT:    vmovdqa (%rsi), %xmm1
3857 ; XOPAVX2-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm2
3858 ; XOPAVX2-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3859 ; XOPAVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
3860 ; XOPAVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3861 ; XOPAVX2-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3862 ; XOPAVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
3863 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
3864 ; XOPAVX2-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3865 ; XOPAVX2-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
3866 ; XOPAVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3867 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
3868 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
3869 ; XOPAVX2-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
3870 ; XOPAVX2-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3871 ; XOPAVX2-NEXT:    vzeroupper
3872 ; XOPAVX2-NEXT:    retq
3874 ; AVX512F-LABEL: vec128_i8_signed_mem_mem:
3875 ; AVX512F:       # %bb.0:
3876 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
3877 ; AVX512F-NEXT:    vmovdqa (%rsi), %xmm1
3878 ; AVX512F-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm2
3879 ; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3880 ; AVX512F-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
3881 ; AVX512F-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3882 ; AVX512F-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3883 ; AVX512F-NEXT:    vpsrlw $1, %xmm1, %xmm1
3884 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3885 ; AVX512F-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3886 ; AVX512F-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
3887 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3888 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
3889 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
3890 ; AVX512F-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3891 ; AVX512F-NEXT:    vzeroupper
3892 ; AVX512F-NEXT:    retq
3894 ; AVX512VL-FALLBACK-LABEL: vec128_i8_signed_mem_mem:
3895 ; AVX512VL-FALLBACK:       # %bb.0:
3896 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
3897 ; AVX512VL-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
3898 ; AVX512VL-FALLBACK-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm2
3899 ; AVX512VL-FALLBACK-NEXT:    vpor {{.*}}(%rip), %xmm2, %xmm2
3900 ; AVX512VL-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm3
3901 ; AVX512VL-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3902 ; AVX512VL-FALLBACK-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
3903 ; AVX512VL-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
3904 ; AVX512VL-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3905 ; AVX512VL-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3906 ; AVX512VL-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
3907 ; AVX512VL-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3908 ; AVX512VL-FALLBACK-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
3909 ; AVX512VL-FALLBACK-NEXT:    vpmovdb %zmm1, %xmm1
3910 ; AVX512VL-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3911 ; AVX512VL-FALLBACK-NEXT:    vzeroupper
3912 ; AVX512VL-FALLBACK-NEXT:    retq
3914 ; AVX512BW-FALLBACK-LABEL: vec128_i8_signed_mem_mem:
3915 ; AVX512BW-FALLBACK:       # %bb.0:
3916 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rdi), %xmm0
3917 ; AVX512BW-FALLBACK-NEXT:    vmovdqa (%rsi), %xmm1
3918 ; AVX512BW-FALLBACK-NEXT:    vpcmpgtb %zmm1, %zmm0, %k1
3919 ; AVX512BW-FALLBACK-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
3920 ; AVX512BW-FALLBACK-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3921 ; AVX512BW-FALLBACK-NEXT:    vmovdqu8 %zmm2, %zmm3 {%k1}
3922 ; AVX512BW-FALLBACK-NEXT:    vpminsb %xmm1, %xmm0, %xmm2
3923 ; AVX512BW-FALLBACK-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3924 ; AVX512BW-FALLBACK-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
3925 ; AVX512BW-FALLBACK-NEXT:    vpsrlw $1, %xmm1, %xmm1
3926 ; AVX512BW-FALLBACK-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3927 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3928 ; AVX512BW-FALLBACK-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
3929 ; AVX512BW-FALLBACK-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3930 ; AVX512BW-FALLBACK-NEXT:    vpmovwb %zmm1, %ymm1
3931 ; AVX512BW-FALLBACK-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3932 ; AVX512BW-FALLBACK-NEXT:    vzeroupper
3933 ; AVX512BW-FALLBACK-NEXT:    retq
3935 ; AVX512VLBW-LABEL: vec128_i8_signed_mem_mem:
3936 ; AVX512VLBW:       # %bb.0:
3937 ; AVX512VLBW-NEXT:    vmovdqa (%rdi), %xmm0
3938 ; AVX512VLBW-NEXT:    vmovdqa (%rsi), %xmm1
3939 ; AVX512VLBW-NEXT:    vpcmpgtb %xmm1, %xmm0, %k1
3940 ; AVX512VLBW-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
3941 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3942 ; AVX512VLBW-NEXT:    vmovdqu8 %xmm2, %xmm3 {%k1}
3943 ; AVX512VLBW-NEXT:    vpminsb %xmm1, %xmm0, %xmm2
3944 ; AVX512VLBW-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm1
3945 ; AVX512VLBW-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
3946 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm1, %xmm1
3947 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
3948 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
3949 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
3950 ; AVX512VLBW-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
3951 ; AVX512VLBW-NEXT:    vpmovwb %ymm1, %xmm1
3952 ; AVX512VLBW-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
3953 ; AVX512VLBW-NEXT:    vzeroupper
3954 ; AVX512VLBW-NEXT:    retq
3955   %a1 = load <16 x i8>, <16 x i8>* %a1_addr
3956   %a2 = load <16 x i8>, <16 x i8>* %a2_addr
3957   %t3 = icmp sgt <16 x i8> %a1, %a2 ; signed
3958   %t4 = select <16 x i1> %t3, <16 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>, <16 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>
3959   %t5 = select <16 x i1> %t3, <16 x i8> %a2, <16 x i8> %a1
3960   %t6 = select <16 x i1> %t3, <16 x i8> %a1, <16 x i8> %a2
3961   %t7 = sub <16 x i8> %t6, %t5
3962   %t8 = lshr <16 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>
3963   %t9 = mul nsw <16 x i8> %t8, %t4 ; signed
3964   %a10 = add nsw <16 x i8> %t9, %a1 ; signed
3965   ret <16 x i8> %a10