[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / sat-add.ll
blob4f5ec6fbede8ac07244924dee2f2cc7060bdfe98
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2   | FileCheck %s --check-prefixes=ANY,SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=ANY,SSE,SSE41
5 ; There are at least 3 potential patterns corresponding to an unsigned saturated add: min, cmp with sum, cmp with not.
6 ; Test each of those patterns with i8/i16/i32/i64.
7 ; Test each of those with a constant operand and a variable operand.
8 ; Test each of those with a 128-bit vector type.
10 define i8 @unsigned_sat_constant_i8_using_min(i8 %x) {
11 ; ANY-LABEL: unsigned_sat_constant_i8_using_min:
12 ; ANY:       # %bb.0:
13 ; ANY-NEXT:    cmpb $-43, %dil
14 ; ANY-NEXT:    movl $213, %eax
15 ; ANY-NEXT:    cmovbl %edi, %eax
16 ; ANY-NEXT:    addb $42, %al
17 ; ANY-NEXT:    # kill: def $al killed $al killed $eax
18 ; ANY-NEXT:    retq
19   %c = icmp ult i8 %x, -43
20   %s = select i1 %c, i8 %x, i8 -43
21   %r = add i8 %s, 42
22   ret i8 %r
25 define i8 @unsigned_sat_constant_i8_using_cmp_sum(i8 %x) {
26 ; ANY-LABEL: unsigned_sat_constant_i8_using_cmp_sum:
27 ; ANY:       # %bb.0:
28 ; ANY-NEXT:    addb $42, %dil
29 ; ANY-NEXT:    movzbl %dil, %ecx
30 ; ANY-NEXT:    movl $255, %eax
31 ; ANY-NEXT:    cmovael %ecx, %eax
32 ; ANY-NEXT:    # kill: def $al killed $al killed $eax
33 ; ANY-NEXT:    retq
34   %a = add i8 %x, 42
35   %c = icmp ugt i8 %x, %a
36   %r = select i1 %c, i8 -1, i8 %a
37   ret i8 %r
40 define i8 @unsigned_sat_constant_i8_using_cmp_notval(i8 %x) {
41 ; ANY-LABEL: unsigned_sat_constant_i8_using_cmp_notval:
42 ; ANY:       # %bb.0:
43 ; ANY-NEXT:    addb $42, %dil
44 ; ANY-NEXT:    movzbl %dil, %ecx
45 ; ANY-NEXT:    movl $255, %eax
46 ; ANY-NEXT:    cmovael %ecx, %eax
47 ; ANY-NEXT:    # kill: def $al killed $al killed $eax
48 ; ANY-NEXT:    retq
49   %a = add i8 %x, 42
50   %c = icmp ugt i8 %x, -43
51   %r = select i1 %c, i8 -1, i8 %a
52   ret i8 %r
55 define i16 @unsigned_sat_constant_i16_using_min(i16 %x) {
56 ; ANY-LABEL: unsigned_sat_constant_i16_using_min:
57 ; ANY:       # %bb.0:
58 ; ANY-NEXT:    cmpw $-43, %di
59 ; ANY-NEXT:    movl $65493, %eax # imm = 0xFFD5
60 ; ANY-NEXT:    cmovbl %edi, %eax
61 ; ANY-NEXT:    addl $42, %eax
62 ; ANY-NEXT:    # kill: def $ax killed $ax killed $eax
63 ; ANY-NEXT:    retq
64   %c = icmp ult i16 %x, -43
65   %s = select i1 %c, i16 %x, i16 -43
66   %r = add i16 %s, 42
67   ret i16 %r
70 define i16 @unsigned_sat_constant_i16_using_cmp_sum(i16 %x) {
71 ; ANY-LABEL: unsigned_sat_constant_i16_using_cmp_sum:
72 ; ANY:       # %bb.0:
73 ; ANY-NEXT:    addw $42, %di
74 ; ANY-NEXT:    movl $65535, %eax # imm = 0xFFFF
75 ; ANY-NEXT:    cmovael %edi, %eax
76 ; ANY-NEXT:    # kill: def $ax killed $ax killed $eax
77 ; ANY-NEXT:    retq
78   %a = add i16 %x, 42
79   %c = icmp ugt i16 %x, %a
80   %r = select i1 %c, i16 -1, i16 %a
81   ret i16 %r
84 define i16 @unsigned_sat_constant_i16_using_cmp_notval(i16 %x) {
85 ; ANY-LABEL: unsigned_sat_constant_i16_using_cmp_notval:
86 ; ANY:       # %bb.0:
87 ; ANY-NEXT:    addw $42, %di
88 ; ANY-NEXT:    movl $65535, %eax # imm = 0xFFFF
89 ; ANY-NEXT:    cmovael %edi, %eax
90 ; ANY-NEXT:    # kill: def $ax killed $ax killed $eax
91 ; ANY-NEXT:    retq
92   %a = add i16 %x, 42
93   %c = icmp ugt i16 %x, -43
94   %r = select i1 %c, i16 -1, i16 %a
95   ret i16 %r
98 define i32 @unsigned_sat_constant_i32_using_min(i32 %x) {
99 ; ANY-LABEL: unsigned_sat_constant_i32_using_min:
100 ; ANY:       # %bb.0:
101 ; ANY-NEXT:    cmpl $-43, %edi
102 ; ANY-NEXT:    movl $-43, %eax
103 ; ANY-NEXT:    cmovbl %edi, %eax
104 ; ANY-NEXT:    addl $42, %eax
105 ; ANY-NEXT:    retq
106   %c = icmp ult i32 %x, -43
107   %s = select i1 %c, i32 %x, i32 -43
108   %r = add i32 %s, 42
109   ret i32 %r
112 define i32 @unsigned_sat_constant_i32_using_cmp_sum(i32 %x) {
113 ; ANY-LABEL: unsigned_sat_constant_i32_using_cmp_sum:
114 ; ANY:       # %bb.0:
115 ; ANY-NEXT:    addl $42, %edi
116 ; ANY-NEXT:    movl $-1, %eax
117 ; ANY-NEXT:    cmovael %edi, %eax
118 ; ANY-NEXT:    retq
119   %a = add i32 %x, 42
120   %c = icmp ugt i32 %x, %a
121   %r = select i1 %c, i32 -1, i32 %a
122   ret i32 %r
125 define i32 @unsigned_sat_constant_i32_using_cmp_notval(i32 %x) {
126 ; ANY-LABEL: unsigned_sat_constant_i32_using_cmp_notval:
127 ; ANY:       # %bb.0:
128 ; ANY-NEXT:    addl $42, %edi
129 ; ANY-NEXT:    movl $-1, %eax
130 ; ANY-NEXT:    cmovael %edi, %eax
131 ; ANY-NEXT:    retq
132   %a = add i32 %x, 42
133   %c = icmp ugt i32 %x, -43
134   %r = select i1 %c, i32 -1, i32 %a
135   ret i32 %r
138 define i64 @unsigned_sat_constant_i64_using_min(i64 %x) {
139 ; ANY-LABEL: unsigned_sat_constant_i64_using_min:
140 ; ANY:       # %bb.0:
141 ; ANY-NEXT:    cmpq $-43, %rdi
142 ; ANY-NEXT:    movq $-43, %rax
143 ; ANY-NEXT:    cmovbq %rdi, %rax
144 ; ANY-NEXT:    addq $42, %rax
145 ; ANY-NEXT:    retq
146   %c = icmp ult i64 %x, -43
147   %s = select i1 %c, i64 %x, i64 -43
148   %r = add i64 %s, 42
149   ret i64 %r
152 define i64 @unsigned_sat_constant_i64_using_cmp_sum(i64 %x) {
153 ; ANY-LABEL: unsigned_sat_constant_i64_using_cmp_sum:
154 ; ANY:       # %bb.0:
155 ; ANY-NEXT:    addq $42, %rdi
156 ; ANY-NEXT:    movq $-1, %rax
157 ; ANY-NEXT:    cmovaeq %rdi, %rax
158 ; ANY-NEXT:    retq
159   %a = add i64 %x, 42
160   %c = icmp ugt i64 %x, %a
161   %r = select i1 %c, i64 -1, i64 %a
162   ret i64 %r
165 define i64 @unsigned_sat_constant_i64_using_cmp_notval(i64 %x) {
166 ; ANY-LABEL: unsigned_sat_constant_i64_using_cmp_notval:
167 ; ANY:       # %bb.0:
168 ; ANY-NEXT:    addq $42, %rdi
169 ; ANY-NEXT:    movq $-1, %rax
170 ; ANY-NEXT:    cmovaeq %rdi, %rax
171 ; ANY-NEXT:    retq
172   %a = add i64 %x, 42
173   %c = icmp ugt i64 %x, -43
174   %r = select i1 %c, i64 -1, i64 %a
175   ret i64 %r
178 define i8 @unsigned_sat_variable_i8_using_min(i8 %x, i8 %y) {
179 ; ANY-LABEL: unsigned_sat_variable_i8_using_min:
180 ; ANY:       # %bb.0:
181 ; ANY-NEXT:    movl %esi, %eax
182 ; ANY-NEXT:    notb %al
183 ; ANY-NEXT:    cmpb %al, %dil
184 ; ANY-NEXT:    movzbl %al, %eax
185 ; ANY-NEXT:    cmovbl %edi, %eax
186 ; ANY-NEXT:    addb %sil, %al
187 ; ANY-NEXT:    # kill: def $al killed $al killed $eax
188 ; ANY-NEXT:    retq
189   %noty = xor i8 %y, -1
190   %c = icmp ult i8 %x, %noty
191   %s = select i1 %c, i8 %x, i8 %noty
192   %r = add i8 %s, %y
193   ret i8 %r
196 define i8 @unsigned_sat_variable_i8_using_cmp_sum(i8 %x, i8 %y) {
197 ; ANY-LABEL: unsigned_sat_variable_i8_using_cmp_sum:
198 ; ANY:       # %bb.0:
199 ; ANY-NEXT:    addb %sil, %dil
200 ; ANY-NEXT:    movzbl %dil, %ecx
201 ; ANY-NEXT:    movl $255, %eax
202 ; ANY-NEXT:    cmovael %ecx, %eax
203 ; ANY-NEXT:    # kill: def $al killed $al killed $eax
204 ; ANY-NEXT:    retq
205   %a = add i8 %x, %y
206   %c = icmp ugt i8 %x, %a
207   %r = select i1 %c, i8 -1, i8 %a
208   ret i8 %r
211 define i8 @unsigned_sat_variable_i8_using_cmp_notval(i8 %x, i8 %y) {
212 ; ANY-LABEL: unsigned_sat_variable_i8_using_cmp_notval:
213 ; ANY:       # %bb.0:
214 ; ANY-NEXT:    # kill: def $esi killed $esi def $rsi
215 ; ANY-NEXT:    # kill: def $edi killed $edi def $rdi
216 ; ANY-NEXT:    leal (%rdi,%rsi), %eax
217 ; ANY-NEXT:    notb %sil
218 ; ANY-NEXT:    cmpb %sil, %dil
219 ; ANY-NEXT:    movzbl %al, %ecx
220 ; ANY-NEXT:    movl $255, %eax
221 ; ANY-NEXT:    cmovbel %ecx, %eax
222 ; ANY-NEXT:    # kill: def $al killed $al killed $eax
223 ; ANY-NEXT:    retq
224   %noty = xor i8 %y, -1
225   %a = add i8 %x, %y
226   %c = icmp ugt i8 %x, %noty
227   %r = select i1 %c, i8 -1, i8 %a
228   ret i8 %r
231 define i16 @unsigned_sat_variable_i16_using_min(i16 %x, i16 %y) {
232 ; ANY-LABEL: unsigned_sat_variable_i16_using_min:
233 ; ANY:       # %bb.0:
234 ; ANY-NEXT:    # kill: def $esi killed $esi def $rsi
235 ; ANY-NEXT:    movl %esi, %eax
236 ; ANY-NEXT:    notl %eax
237 ; ANY-NEXT:    cmpw %ax, %di
238 ; ANY-NEXT:    cmovbl %edi, %eax
239 ; ANY-NEXT:    addl %esi, %eax
240 ; ANY-NEXT:    # kill: def $ax killed $ax killed $eax
241 ; ANY-NEXT:    retq
242   %noty = xor i16 %y, -1
243   %c = icmp ult i16 %x, %noty
244   %s = select i1 %c, i16 %x, i16 %noty
245   %r = add i16 %s, %y
246   ret i16 %r
249 define i16 @unsigned_sat_variable_i16_using_cmp_sum(i16 %x, i16 %y) {
250 ; ANY-LABEL: unsigned_sat_variable_i16_using_cmp_sum:
251 ; ANY:       # %bb.0:
252 ; ANY-NEXT:    addw %si, %di
253 ; ANY-NEXT:    movl $65535, %eax # imm = 0xFFFF
254 ; ANY-NEXT:    cmovael %edi, %eax
255 ; ANY-NEXT:    # kill: def $ax killed $ax killed $eax
256 ; ANY-NEXT:    retq
257   %a = add i16 %x, %y
258   %c = icmp ugt i16 %x, %a
259   %r = select i1 %c, i16 -1, i16 %a
260   ret i16 %r
263 define i16 @unsigned_sat_variable_i16_using_cmp_notval(i16 %x, i16 %y) {
264 ; ANY-LABEL: unsigned_sat_variable_i16_using_cmp_notval:
265 ; ANY:       # %bb.0:
266 ; ANY-NEXT:    # kill: def $esi killed $esi def $rsi
267 ; ANY-NEXT:    # kill: def $edi killed $edi def $rdi
268 ; ANY-NEXT:    leal (%rdi,%rsi), %ecx
269 ; ANY-NEXT:    notl %esi
270 ; ANY-NEXT:    cmpw %si, %di
271 ; ANY-NEXT:    movl $65535, %eax # imm = 0xFFFF
272 ; ANY-NEXT:    cmovbel %ecx, %eax
273 ; ANY-NEXT:    # kill: def $ax killed $ax killed $eax
274 ; ANY-NEXT:    retq
275   %noty = xor i16 %y, -1
276   %a = add i16 %x, %y
277   %c = icmp ugt i16 %x, %noty
278   %r = select i1 %c, i16 -1, i16 %a
279   ret i16 %r
282 define i32 @unsigned_sat_variable_i32_using_min(i32 %x, i32 %y) {
283 ; ANY-LABEL: unsigned_sat_variable_i32_using_min:
284 ; ANY:       # %bb.0:
285 ; ANY-NEXT:    # kill: def $esi killed $esi def $rsi
286 ; ANY-NEXT:    movl %esi, %eax
287 ; ANY-NEXT:    notl %eax
288 ; ANY-NEXT:    cmpl %eax, %edi
289 ; ANY-NEXT:    cmovbl %edi, %eax
290 ; ANY-NEXT:    addl %esi, %eax
291 ; ANY-NEXT:    retq
292   %noty = xor i32 %y, -1
293   %c = icmp ult i32 %x, %noty
294   %s = select i1 %c, i32 %x, i32 %noty
295   %r = add i32 %s, %y
296   ret i32 %r
299 define i32 @unsigned_sat_variable_i32_using_cmp_sum(i32 %x, i32 %y) {
300 ; ANY-LABEL: unsigned_sat_variable_i32_using_cmp_sum:
301 ; ANY:       # %bb.0:
302 ; ANY-NEXT:    addl %esi, %edi
303 ; ANY-NEXT:    movl $-1, %eax
304 ; ANY-NEXT:    cmovael %edi, %eax
305 ; ANY-NEXT:    retq
306   %a = add i32 %x, %y
307   %c = icmp ugt i32 %x, %a
308   %r = select i1 %c, i32 -1, i32 %a
309   ret i32 %r
312 define i32 @unsigned_sat_variable_i32_using_cmp_notval(i32 %x, i32 %y) {
313 ; ANY-LABEL: unsigned_sat_variable_i32_using_cmp_notval:
314 ; ANY:       # %bb.0:
315 ; ANY-NEXT:    # kill: def $esi killed $esi def $rsi
316 ; ANY-NEXT:    # kill: def $edi killed $edi def $rdi
317 ; ANY-NEXT:    leal (%rdi,%rsi), %ecx
318 ; ANY-NEXT:    notl %esi
319 ; ANY-NEXT:    cmpl %esi, %edi
320 ; ANY-NEXT:    movl $-1, %eax
321 ; ANY-NEXT:    cmovbel %ecx, %eax
322 ; ANY-NEXT:    retq
323   %noty = xor i32 %y, -1
324   %a = add i32 %x, %y
325   %c = icmp ugt i32 %x, %noty
326   %r = select i1 %c, i32 -1, i32 %a
327   ret i32 %r
330 define i64 @unsigned_sat_variable_i64_using_min(i64 %x, i64 %y) {
331 ; ANY-LABEL: unsigned_sat_variable_i64_using_min:
332 ; ANY:       # %bb.0:
333 ; ANY-NEXT:    movq %rsi, %rax
334 ; ANY-NEXT:    notq %rax
335 ; ANY-NEXT:    cmpq %rax, %rdi
336 ; ANY-NEXT:    cmovbq %rdi, %rax
337 ; ANY-NEXT:    addq %rsi, %rax
338 ; ANY-NEXT:    retq
339   %noty = xor i64 %y, -1
340   %c = icmp ult i64 %x, %noty
341   %s = select i1 %c, i64 %x, i64 %noty
342   %r = add i64 %s, %y
343   ret i64 %r
346 define i64 @unsigned_sat_variable_i64_using_cmp_sum(i64 %x, i64 %y) {
347 ; ANY-LABEL: unsigned_sat_variable_i64_using_cmp_sum:
348 ; ANY:       # %bb.0:
349 ; ANY-NEXT:    addq %rsi, %rdi
350 ; ANY-NEXT:    movq $-1, %rax
351 ; ANY-NEXT:    cmovaeq %rdi, %rax
352 ; ANY-NEXT:    retq
353   %a = add i64 %x, %y
354   %c = icmp ugt i64 %x, %a
355   %r = select i1 %c, i64 -1, i64 %a
356   ret i64 %r
359 define i64 @unsigned_sat_variable_i64_using_cmp_notval(i64 %x, i64 %y) {
360 ; ANY-LABEL: unsigned_sat_variable_i64_using_cmp_notval:
361 ; ANY:       # %bb.0:
362 ; ANY-NEXT:    leaq (%rdi,%rsi), %rcx
363 ; ANY-NEXT:    notq %rsi
364 ; ANY-NEXT:    cmpq %rsi, %rdi
365 ; ANY-NEXT:    movq $-1, %rax
366 ; ANY-NEXT:    cmovbeq %rcx, %rax
367 ; ANY-NEXT:    retq
368   %noty = xor i64 %y, -1
369   %a = add i64 %x, %y
370   %c = icmp ugt i64 %x, %noty
371   %r = select i1 %c, i64 -1, i64 %a
372   ret i64 %r
375 define <16 x i8> @unsigned_sat_constant_v16i8_using_min(<16 x i8> %x) {
376 ; ANY-LABEL: unsigned_sat_constant_v16i8_using_min:
377 ; ANY:       # %bb.0:
378 ; ANY-NEXT:    pminub {{.*}}(%rip), %xmm0
379 ; ANY-NEXT:    paddb {{.*}}(%rip), %xmm0
380 ; ANY-NEXT:    retq
381   %c = icmp ult <16 x i8> %x, <i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43>
382   %s = select <16 x i1> %c, <16 x i8> %x, <16 x i8> <i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43>
383   %r = add <16 x i8> %s, <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>
384   ret <16 x i8> %r
387 define <16 x i8> @unsigned_sat_constant_v16i8_using_cmp_sum(<16 x i8> %x) {
388 ; ANY-LABEL: unsigned_sat_constant_v16i8_using_cmp_sum:
389 ; ANY:       # %bb.0:
390 ; ANY-NEXT:    paddusb {{.*}}(%rip), %xmm0
391 ; ANY-NEXT:    retq
392   %a = add <16 x i8> %x, <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>
393   %c = icmp ugt <16 x i8> %x, %a
394   %r = select <16 x i1> %c, <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> %a
395   ret <16 x i8> %r
398 define <16 x i8> @unsigned_sat_constant_v16i8_using_cmp_notval(<16 x i8> %x) {
399 ; ANY-LABEL: unsigned_sat_constant_v16i8_using_cmp_notval:
400 ; ANY:       # %bb.0:
401 ; ANY-NEXT:    paddusb {{.*}}(%rip), %xmm0
402 ; ANY-NEXT:    retq
403   %a = add <16 x i8> %x, <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>
404   %c = icmp ugt <16 x i8> %x, <i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43>
405   %r = select <16 x i1> %c, <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> %a
406   ret <16 x i8> %r
409 define <8 x i16> @unsigned_sat_constant_v8i16_using_min(<8 x i16> %x) {
410 ; SSE2-LABEL: unsigned_sat_constant_v8i16_using_min:
411 ; SSE2:       # %bb.0:
412 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768,32768,32768,32768,32768]
413 ; SSE2-NEXT:    pxor %xmm1, %xmm0
414 ; SSE2-NEXT:    pminsw {{.*}}(%rip), %xmm0
415 ; SSE2-NEXT:    pxor %xmm1, %xmm0
416 ; SSE2-NEXT:    paddw {{.*}}(%rip), %xmm0
417 ; SSE2-NEXT:    retq
419 ; SSE41-LABEL: unsigned_sat_constant_v8i16_using_min:
420 ; SSE41:       # %bb.0:
421 ; SSE41-NEXT:    pminuw {{.*}}(%rip), %xmm0
422 ; SSE41-NEXT:    paddw {{.*}}(%rip), %xmm0
423 ; SSE41-NEXT:    retq
424   %c = icmp ult <8 x i16> %x, <i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43>
425   %s = select <8 x i1> %c, <8 x i16> %x, <8 x i16> <i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43>
426   %r = add <8 x i16> %s, <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42>
427   ret <8 x i16> %r
430 define <8 x i16> @unsigned_sat_constant_v8i16_using_cmp_sum(<8 x i16> %x) {
431 ; ANY-LABEL: unsigned_sat_constant_v8i16_using_cmp_sum:
432 ; ANY:       # %bb.0:
433 ; ANY-NEXT:    paddusw {{.*}}(%rip), %xmm0
434 ; ANY-NEXT:    retq
435   %a = add <8 x i16> %x, <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42>
436   %c = icmp ugt <8 x i16> %x, %a
437   %r = select <8 x i1> %c, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %a
438   ret <8 x i16> %r
441 define <8 x i16> @unsigned_sat_constant_v8i16_using_cmp_notval(<8 x i16> %x) {
442 ; ANY-LABEL: unsigned_sat_constant_v8i16_using_cmp_notval:
443 ; ANY:       # %bb.0:
444 ; ANY-NEXT:    paddusw {{.*}}(%rip), %xmm0
445 ; ANY-NEXT:    retq
446   %a = add <8 x i16> %x, <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42>
447   %c = icmp ugt <8 x i16> %x, <i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43>
448   %r = select <8 x i1> %c, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %a
449   ret <8 x i16> %r
452 define <4 x i32> @unsigned_sat_constant_v4i32_using_min(<4 x i32> %x) {
453 ; SSE2-LABEL: unsigned_sat_constant_v4i32_using_min:
454 ; SSE2:       # %bb.0:
455 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
456 ; SSE2-NEXT:    pxor %xmm0, %xmm1
457 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483605,2147483605,2147483605,2147483605]
458 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
459 ; SSE2-NEXT:    pand %xmm2, %xmm0
460 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
461 ; SSE2-NEXT:    por %xmm2, %xmm0
462 ; SSE2-NEXT:    paddd {{.*}}(%rip), %xmm0
463 ; SSE2-NEXT:    retq
465 ; SSE41-LABEL: unsigned_sat_constant_v4i32_using_min:
466 ; SSE41:       # %bb.0:
467 ; SSE41-NEXT:    pminud {{.*}}(%rip), %xmm0
468 ; SSE41-NEXT:    paddd {{.*}}(%rip), %xmm0
469 ; SSE41-NEXT:    retq
470   %c = icmp ult <4 x i32> %x, <i32 -43, i32 -43, i32 -43, i32 -43>
471   %s = select <4 x i1> %c, <4 x i32> %x, <4 x i32> <i32 -43, i32 -43, i32 -43, i32 -43>
472   %r = add <4 x i32> %s, <i32 42, i32 42, i32 42, i32 42>
473   ret <4 x i32> %r
476 define <4 x i32> @unsigned_sat_constant_v4i32_using_cmp_sum(<4 x i32> %x) {
477 ; SSE2-LABEL: unsigned_sat_constant_v4i32_using_cmp_sum:
478 ; SSE2:       # %bb.0:
479 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [42,42,42,42]
480 ; SSE2-NEXT:    paddd %xmm0, %xmm1
481 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
482 ; SSE2-NEXT:    pxor %xmm2, %xmm0
483 ; SSE2-NEXT:    pxor %xmm1, %xmm2
484 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
485 ; SSE2-NEXT:    por %xmm1, %xmm0
486 ; SSE2-NEXT:    retq
488 ; SSE41-LABEL: unsigned_sat_constant_v4i32_using_cmp_sum:
489 ; SSE41:       # %bb.0:
490 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [42,42,42,42]
491 ; SSE41-NEXT:    paddd %xmm0, %xmm2
492 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
493 ; SSE41-NEXT:    pminud %xmm2, %xmm1
494 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
495 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm0
496 ; SSE41-NEXT:    pxor %xmm0, %xmm1
497 ; SSE41-NEXT:    por %xmm2, %xmm1
498 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
499 ; SSE41-NEXT:    retq
500   %a = add <4 x i32> %x, <i32 42, i32 42, i32 42, i32 42>
501   %c = icmp ugt <4 x i32> %x, %a
502   %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a
503   ret <4 x i32> %r
506 define <4 x i32> @unsigned_sat_constant_v4i32_using_cmp_notval(<4 x i32> %x) {
507 ; SSE2-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval:
508 ; SSE2:       # %bb.0:
509 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [42,42,42,42]
510 ; SSE2-NEXT:    paddd %xmm0, %xmm1
511 ; SSE2-NEXT:    pxor {{.*}}(%rip), %xmm0
512 ; SSE2-NEXT:    pcmpgtd {{.*}}(%rip), %xmm0
513 ; SSE2-NEXT:    por %xmm1, %xmm0
514 ; SSE2-NEXT:    retq
516 ; SSE41-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval:
517 ; SSE41:       # %bb.0:
518 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [42,42,42,42]
519 ; SSE41-NEXT:    paddd %xmm0, %xmm1
520 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [4294967254,4294967254,4294967254,4294967254]
521 ; SSE41-NEXT:    pmaxud %xmm0, %xmm2
522 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
523 ; SSE41-NEXT:    por %xmm1, %xmm0
524 ; SSE41-NEXT:    retq
525   %a = add <4 x i32> %x, <i32 42, i32 42, i32 42, i32 42>
526   %c = icmp ugt <4 x i32> %x, <i32 -43, i32 -43, i32 -43, i32 -43>
527   %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a
528   ret <4 x i32> %r
531 define <4 x i32> @unsigned_sat_constant_v4i32_using_cmp_notval_nonsplat(<4 x i32> %x) {
532 ; SSE2-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval_nonsplat:
533 ; SSE2:       # %bb.0:
534 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [43,44,45,46]
535 ; SSE2-NEXT:    paddd %xmm0, %xmm1
536 ; SSE2-NEXT:    pxor {{.*}}(%rip), %xmm0
537 ; SSE2-NEXT:    pcmpgtd {{.*}}(%rip), %xmm0
538 ; SSE2-NEXT:    por %xmm1, %xmm0
539 ; SSE2-NEXT:    retq
541 ; SSE41-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval_nonsplat:
542 ; SSE41:       # %bb.0:
543 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [43,44,45,46]
544 ; SSE41-NEXT:    paddd %xmm0, %xmm1
545 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [4294967253,4294967252,4294967251,4294967250]
546 ; SSE41-NEXT:    pmaxud %xmm0, %xmm2
547 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
548 ; SSE41-NEXT:    por %xmm1, %xmm0
549 ; SSE41-NEXT:    retq
550   %a = add <4 x i32> %x, <i32 43, i32 44, i32 45, i32 46>
551   %c = icmp ugt <4 x i32> %x, <i32 -44, i32 -45, i32 -46, i32 -47>
552   %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a
553   ret <4 x i32> %r
556 define <2 x i64> @unsigned_sat_constant_v2i64_using_min(<2 x i64> %x) {
557 ; SSE2-LABEL: unsigned_sat_constant_v2i64_using_min:
558 ; SSE2:       # %bb.0:
559 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
560 ; SSE2-NEXT:    pxor %xmm0, %xmm1
561 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372034707292117,9223372034707292117]
562 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
563 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
564 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
565 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
566 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
567 ; SSE2-NEXT:    pand %xmm4, %xmm1
568 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
569 ; SSE2-NEXT:    por %xmm1, %xmm2
570 ; SSE2-NEXT:    pand %xmm2, %xmm0
571 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
572 ; SSE2-NEXT:    por %xmm2, %xmm0
573 ; SSE2-NEXT:    paddq {{.*}}(%rip), %xmm0
574 ; SSE2-NEXT:    retq
576 ; SSE41-LABEL: unsigned_sat_constant_v2i64_using_min:
577 ; SSE41:       # %bb.0:
578 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
579 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [18446744073709551573,18446744073709551573]
580 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
581 ; SSE41-NEXT:    pxor %xmm1, %xmm0
582 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372034707292117,9223372034707292117]
583 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
584 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
585 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
586 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
587 ; SSE41-NEXT:    pand %xmm4, %xmm0
588 ; SSE41-NEXT:    por %xmm3, %xmm0
589 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
590 ; SSE41-NEXT:    paddq {{.*}}(%rip), %xmm2
591 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
592 ; SSE41-NEXT:    retq
593   %c = icmp ult <2 x i64> %x, <i64 -43, i64 -43>
594   %s = select <2 x i1> %c, <2 x i64> %x, <2 x i64> <i64 -43, i64 -43>
595   %r = add <2 x i64> %s, <i64 42, i64 42>
596   ret <2 x i64> %r
599 define <2 x i64> @unsigned_sat_constant_v2i64_using_cmp_sum(<2 x i64> %x) {
600 ; ANY-LABEL: unsigned_sat_constant_v2i64_using_cmp_sum:
601 ; ANY:       # %bb.0:
602 ; ANY-NEXT:    movdqa {{.*#+}} xmm1 = [42,42]
603 ; ANY-NEXT:    paddq %xmm0, %xmm1
604 ; ANY-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
605 ; ANY-NEXT:    pxor %xmm2, %xmm0
606 ; ANY-NEXT:    pxor %xmm1, %xmm2
607 ; ANY-NEXT:    movdqa %xmm0, %xmm3
608 ; ANY-NEXT:    pcmpgtd %xmm2, %xmm3
609 ; ANY-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
610 ; ANY-NEXT:    pcmpeqd %xmm0, %xmm2
611 ; ANY-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
612 ; ANY-NEXT:    pand %xmm4, %xmm2
613 ; ANY-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
614 ; ANY-NEXT:    por %xmm1, %xmm0
615 ; ANY-NEXT:    por %xmm2, %xmm0
616 ; ANY-NEXT:    retq
617   %a = add <2 x i64> %x, <i64 42, i64 42>
618   %c = icmp ugt <2 x i64> %x, %a
619   %r = select <2 x i1> %c, <2 x i64> <i64 -1, i64 -1>, <2 x i64> %a
620   ret <2 x i64> %r
623 define <2 x i64> @unsigned_sat_constant_v2i64_using_cmp_notval(<2 x i64> %x) {
624 ; ANY-LABEL: unsigned_sat_constant_v2i64_using_cmp_notval:
625 ; ANY:       # %bb.0:
626 ; ANY-NEXT:    movdqa {{.*#+}} xmm1 = [42,42]
627 ; ANY-NEXT:    paddq %xmm0, %xmm1
628 ; ANY-NEXT:    pxor {{.*}}(%rip), %xmm0
629 ; ANY-NEXT:    movdqa {{.*#+}} xmm2 = [9223372034707292117,9223372034707292117]
630 ; ANY-NEXT:    movdqa %xmm0, %xmm3
631 ; ANY-NEXT:    pcmpgtd %xmm2, %xmm3
632 ; ANY-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
633 ; ANY-NEXT:    pcmpeqd %xmm2, %xmm0
634 ; ANY-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
635 ; ANY-NEXT:    pand %xmm4, %xmm2
636 ; ANY-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
637 ; ANY-NEXT:    por %xmm1, %xmm0
638 ; ANY-NEXT:    por %xmm2, %xmm0
639 ; ANY-NEXT:    retq
640   %a = add <2 x i64> %x, <i64 42, i64 42>
641   %c = icmp ugt <2 x i64> %x, <i64 -43, i64 -43>
642   %r = select <2 x i1> %c, <2 x i64> <i64 -1, i64 -1>, <2 x i64> %a
643   ret <2 x i64> %r
646 define <16 x i8> @unsigned_sat_variable_v16i8_using_min(<16 x i8> %x, <16 x i8> %y) {
647 ; ANY-LABEL: unsigned_sat_variable_v16i8_using_min:
648 ; ANY:       # %bb.0:
649 ; ANY-NEXT:    pcmpeqd %xmm2, %xmm2
650 ; ANY-NEXT:    pxor %xmm1, %xmm2
651 ; ANY-NEXT:    pminub %xmm2, %xmm0
652 ; ANY-NEXT:    paddb %xmm1, %xmm0
653 ; ANY-NEXT:    retq
654   %noty = xor <16 x i8> %y, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
655   %c = icmp ult <16 x i8> %x, %noty
656   %s = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %noty
657   %r = add <16 x i8> %s, %y
658   ret <16 x i8> %r
661 define <16 x i8> @unsigned_sat_variable_v16i8_using_cmp_sum(<16 x i8> %x, <16 x i8> %y) {
662 ; ANY-LABEL: unsigned_sat_variable_v16i8_using_cmp_sum:
663 ; ANY:       # %bb.0:
664 ; ANY-NEXT:    paddusb %xmm1, %xmm0
665 ; ANY-NEXT:    retq
666   %a = add <16 x i8> %x, %y
667   %c = icmp ugt <16 x i8> %x, %a
668   %r = select <16 x i1> %c, <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> %a
669   ret <16 x i8> %r
672 define <16 x i8> @unsigned_sat_variable_v16i8_using_cmp_notval(<16 x i8> %x, <16 x i8> %y) {
673 ; ANY-LABEL: unsigned_sat_variable_v16i8_using_cmp_notval:
674 ; ANY:       # %bb.0:
675 ; ANY-NEXT:    pcmpeqd %xmm2, %xmm2
676 ; ANY-NEXT:    movdqa %xmm0, %xmm3
677 ; ANY-NEXT:    paddb %xmm1, %xmm3
678 ; ANY-NEXT:    pxor %xmm2, %xmm1
679 ; ANY-NEXT:    pminub %xmm0, %xmm1
680 ; ANY-NEXT:    pcmpeqb %xmm1, %xmm0
681 ; ANY-NEXT:    pxor %xmm2, %xmm0
682 ; ANY-NEXT:    por %xmm3, %xmm0
683 ; ANY-NEXT:    retq
684   %noty = xor <16 x i8> %y, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
685   %a = add <16 x i8> %x, %y
686   %c = icmp ugt <16 x i8> %x, %noty
687   %r = select <16 x i1> %c, <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> %a
688   ret <16 x i8> %r
691 define <8 x i16> @unsigned_sat_variable_v8i16_using_min(<8 x i16> %x, <8 x i16> %y) {
692 ; SSE2-LABEL: unsigned_sat_variable_v8i16_using_min:
693 ; SSE2:       # %bb.0:
694 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
695 ; SSE2-NEXT:    pxor %xmm2, %xmm0
696 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [32767,32767,32767,32767,32767,32767,32767,32767]
697 ; SSE2-NEXT:    pxor %xmm1, %xmm3
698 ; SSE2-NEXT:    pminsw %xmm3, %xmm0
699 ; SSE2-NEXT:    pxor %xmm2, %xmm0
700 ; SSE2-NEXT:    paddw %xmm1, %xmm0
701 ; SSE2-NEXT:    retq
703 ; SSE41-LABEL: unsigned_sat_variable_v8i16_using_min:
704 ; SSE41:       # %bb.0:
705 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
706 ; SSE41-NEXT:    pxor %xmm1, %xmm2
707 ; SSE41-NEXT:    pminuw %xmm2, %xmm0
708 ; SSE41-NEXT:    paddw %xmm1, %xmm0
709 ; SSE41-NEXT:    retq
710   %noty = xor <8 x i16> %y, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
711   %c = icmp ult <8 x i16> %x, %noty
712   %s = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %noty
713   %r = add <8 x i16> %s, %y
714   ret <8 x i16> %r
717 define <8 x i16> @unsigned_sat_variable_v8i16_using_cmp_sum(<8 x i16> %x, <8 x i16> %y) {
718 ; ANY-LABEL: unsigned_sat_variable_v8i16_using_cmp_sum:
719 ; ANY:       # %bb.0:
720 ; ANY-NEXT:    paddusw %xmm1, %xmm0
721 ; ANY-NEXT:    retq
722   %a = add <8 x i16> %x, %y
723   %c = icmp ugt <8 x i16> %x, %a
724   %r = select <8 x i1> %c, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %a
725   ret <8 x i16> %r
728 define <8 x i16> @unsigned_sat_variable_v8i16_using_cmp_notval(<8 x i16> %x, <8 x i16> %y) {
729 ; SSE2-LABEL: unsigned_sat_variable_v8i16_using_cmp_notval:
730 ; SSE2:       # %bb.0:
731 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
732 ; SSE2-NEXT:    paddw %xmm1, %xmm2
733 ; SSE2-NEXT:    pxor {{.*}}(%rip), %xmm1
734 ; SSE2-NEXT:    pxor {{.*}}(%rip), %xmm0
735 ; SSE2-NEXT:    pcmpgtw %xmm1, %xmm0
736 ; SSE2-NEXT:    por %xmm2, %xmm0
737 ; SSE2-NEXT:    retq
739 ; SSE41-LABEL: unsigned_sat_variable_v8i16_using_cmp_notval:
740 ; SSE41:       # %bb.0:
741 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
742 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
743 ; SSE41-NEXT:    paddw %xmm1, %xmm3
744 ; SSE41-NEXT:    pxor %xmm2, %xmm1
745 ; SSE41-NEXT:    pminuw %xmm0, %xmm1
746 ; SSE41-NEXT:    pcmpeqw %xmm1, %xmm0
747 ; SSE41-NEXT:    pxor %xmm2, %xmm0
748 ; SSE41-NEXT:    por %xmm3, %xmm0
749 ; SSE41-NEXT:    retq
750   %noty = xor <8 x i16> %y, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
751   %a = add <8 x i16> %x, %y
752   %c = icmp ugt <8 x i16> %x, %noty
753   %r = select <8 x i1> %c, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %a
754   ret <8 x i16> %r
757 define <4 x i32> @unsigned_sat_variable_v4i32_using_min(<4 x i32> %x, <4 x i32> %y) {
758 ; SSE2-LABEL: unsigned_sat_variable_v4i32_using_min:
759 ; SSE2:       # %bb.0:
760 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
761 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
762 ; SSE2-NEXT:    pxor %xmm0, %xmm3
763 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483647,2147483647,2147483647,2147483647]
764 ; SSE2-NEXT:    pxor %xmm1, %xmm4
765 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
766 ; SSE2-NEXT:    pand %xmm4, %xmm0
767 ; SSE2-NEXT:    pxor %xmm2, %xmm4
768 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
769 ; SSE2-NEXT:    pandn %xmm4, %xmm2
770 ; SSE2-NEXT:    por %xmm2, %xmm0
771 ; SSE2-NEXT:    paddd %xmm1, %xmm0
772 ; SSE2-NEXT:    retq
774 ; SSE41-LABEL: unsigned_sat_variable_v4i32_using_min:
775 ; SSE41:       # %bb.0:
776 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
777 ; SSE41-NEXT:    pxor %xmm1, %xmm2
778 ; SSE41-NEXT:    pminud %xmm2, %xmm0
779 ; SSE41-NEXT:    paddd %xmm1, %xmm0
780 ; SSE41-NEXT:    retq
781   %noty = xor <4 x i32> %y, <i32 -1, i32 -1, i32 -1, i32 -1>
782   %c = icmp ult <4 x i32> %x, %noty
783   %s = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %noty
784   %r = add <4 x i32> %s, %y
785   ret <4 x i32> %r
788 define <4 x i32> @unsigned_sat_variable_v4i32_using_cmp_sum(<4 x i32> %x, <4 x i32> %y) {
789 ; SSE2-LABEL: unsigned_sat_variable_v4i32_using_cmp_sum:
790 ; SSE2:       # %bb.0:
791 ; SSE2-NEXT:    paddd %xmm0, %xmm1
792 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
793 ; SSE2-NEXT:    pxor %xmm2, %xmm0
794 ; SSE2-NEXT:    pxor %xmm1, %xmm2
795 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
796 ; SSE2-NEXT:    por %xmm1, %xmm0
797 ; SSE2-NEXT:    retq
799 ; SSE41-LABEL: unsigned_sat_variable_v4i32_using_cmp_sum:
800 ; SSE41:       # %bb.0:
801 ; SSE41-NEXT:    paddd %xmm0, %xmm1
802 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
803 ; SSE41-NEXT:    pminud %xmm1, %xmm2
804 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
805 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm0
806 ; SSE41-NEXT:    pxor %xmm0, %xmm2
807 ; SSE41-NEXT:    por %xmm1, %xmm2
808 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
809 ; SSE41-NEXT:    retq
810   %a = add <4 x i32> %x, %y
811   %c = icmp ugt <4 x i32> %x, %a
812   %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a
813   ret <4 x i32> %r
816 define <4 x i32> @unsigned_sat_variable_v4i32_using_cmp_notval(<4 x i32> %x, <4 x i32> %y) {
817 ; SSE2-LABEL: unsigned_sat_variable_v4i32_using_cmp_notval:
818 ; SSE2:       # %bb.0:
819 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
820 ; SSE2-NEXT:    paddd %xmm1, %xmm2
821 ; SSE2-NEXT:    pxor {{.*}}(%rip), %xmm1
822 ; SSE2-NEXT:    pxor {{.*}}(%rip), %xmm0
823 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
824 ; SSE2-NEXT:    por %xmm2, %xmm0
825 ; SSE2-NEXT:    retq
827 ; SSE41-LABEL: unsigned_sat_variable_v4i32_using_cmp_notval:
828 ; SSE41:       # %bb.0:
829 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
830 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
831 ; SSE41-NEXT:    paddd %xmm1, %xmm3
832 ; SSE41-NEXT:    pxor %xmm2, %xmm1
833 ; SSE41-NEXT:    pminud %xmm0, %xmm1
834 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
835 ; SSE41-NEXT:    pxor %xmm2, %xmm0
836 ; SSE41-NEXT:    por %xmm3, %xmm0
837 ; SSE41-NEXT:    retq
838   %noty = xor <4 x i32> %y, <i32 -1, i32 -1, i32 -1, i32 -1>
839   %a = add <4 x i32> %x, %y
840   %c = icmp ugt <4 x i32> %x, %noty
841   %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a
842   ret <4 x i32> %r
845 define <2 x i64> @unsigned_sat_variable_v2i64_using_min(<2 x i64> %x, <2 x i64> %y) {
846 ; SSE2-LABEL: unsigned_sat_variable_v2i64_using_min:
847 ; SSE2:       # %bb.0:
848 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
849 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
850 ; SSE2-NEXT:    pxor %xmm0, %xmm3
851 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372034707292159,9223372034707292159]
852 ; SSE2-NEXT:    pxor %xmm1, %xmm4
853 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
854 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
855 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
856 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
857 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
858 ; SSE2-NEXT:    pand %xmm6, %xmm3
859 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
860 ; SSE2-NEXT:    por %xmm3, %xmm4
861 ; SSE2-NEXT:    pand %xmm4, %xmm0
862 ; SSE2-NEXT:    pxor %xmm2, %xmm4
863 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
864 ; SSE2-NEXT:    pandn %xmm4, %xmm2
865 ; SSE2-NEXT:    por %xmm2, %xmm0
866 ; SSE2-NEXT:    paddq %xmm1, %xmm0
867 ; SSE2-NEXT:    retq
869 ; SSE41-LABEL: unsigned_sat_variable_v2i64_using_min:
870 ; SSE41:       # %bb.0:
871 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
872 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm3
873 ; SSE41-NEXT:    pxor %xmm1, %xmm3
874 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
875 ; SSE41-NEXT:    pxor %xmm2, %xmm0
876 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372034707292159,9223372034707292159]
877 ; SSE41-NEXT:    pxor %xmm1, %xmm4
878 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
879 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
880 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
881 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
882 ; SSE41-NEXT:    pand %xmm5, %xmm0
883 ; SSE41-NEXT:    por %xmm4, %xmm0
884 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
885 ; SSE41-NEXT:    paddq %xmm1, %xmm3
886 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
887 ; SSE41-NEXT:    retq
888   %noty = xor <2 x i64> %y, <i64 -1, i64 -1>
889   %c = icmp ult <2 x i64> %x, %noty
890   %s = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %noty
891   %r = add <2 x i64> %s, %y
892   ret <2 x i64> %r
895 define <2 x i64> @unsigned_sat_variable_v2i64_using_cmp_sum(<2 x i64> %x, <2 x i64> %y) {
896 ; ANY-LABEL: unsigned_sat_variable_v2i64_using_cmp_sum:
897 ; ANY:       # %bb.0:
898 ; ANY-NEXT:    paddq %xmm0, %xmm1
899 ; ANY-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
900 ; ANY-NEXT:    pxor %xmm2, %xmm0
901 ; ANY-NEXT:    pxor %xmm1, %xmm2
902 ; ANY-NEXT:    movdqa %xmm0, %xmm3
903 ; ANY-NEXT:    pcmpgtd %xmm2, %xmm3
904 ; ANY-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
905 ; ANY-NEXT:    pcmpeqd %xmm0, %xmm2
906 ; ANY-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
907 ; ANY-NEXT:    pand %xmm4, %xmm2
908 ; ANY-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
909 ; ANY-NEXT:    por %xmm1, %xmm0
910 ; ANY-NEXT:    por %xmm2, %xmm0
911 ; ANY-NEXT:    retq
912   %a = add <2 x i64> %x, %y
913   %c = icmp ugt <2 x i64> %x, %a
914   %r = select <2 x i1> %c, <2 x i64> <i64 -1, i64 -1>, <2 x i64> %a
915   ret <2 x i64> %r
918 define <2 x i64> @unsigned_sat_variable_v2i64_using_cmp_notval(<2 x i64> %x, <2 x i64> %y) {
919 ; ANY-LABEL: unsigned_sat_variable_v2i64_using_cmp_notval:
920 ; ANY:       # %bb.0:
921 ; ANY-NEXT:    movdqa %xmm0, %xmm2
922 ; ANY-NEXT:    paddq %xmm1, %xmm2
923 ; ANY-NEXT:    pxor {{.*}}(%rip), %xmm1
924 ; ANY-NEXT:    pxor {{.*}}(%rip), %xmm0
925 ; ANY-NEXT:    movdqa %xmm0, %xmm3
926 ; ANY-NEXT:    pcmpgtd %xmm1, %xmm3
927 ; ANY-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
928 ; ANY-NEXT:    pcmpeqd %xmm1, %xmm0
929 ; ANY-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
930 ; ANY-NEXT:    pand %xmm4, %xmm1
931 ; ANY-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
932 ; ANY-NEXT:    por %xmm2, %xmm0
933 ; ANY-NEXT:    por %xmm1, %xmm0
934 ; ANY-NEXT:    retq
935   %noty = xor <2 x i64> %y, <i64 -1, i64 -1>
936   %a = add <2 x i64> %x, %y
937   %c = icmp ugt <2 x i64> %x, %noty
938   %r = select <2 x i1> %c, <2 x i64> <i64 -1, i64 -1>, <2 x i64> %a
939   ret <2 x i64> %r