Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / sat-add.ll
blob78e4d5a4920edd7b19b579f323500c636f0b0d14
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:    movl %edi, %eax
14 ; ANY-NEXT:    cmpb $-43, %al
15 ; ANY-NEXT:    jb .LBB0_2
16 ; ANY-NEXT:  # %bb.1:
17 ; ANY-NEXT:    movb $-43, %al
18 ; ANY-NEXT:  .LBB0_2:
19 ; ANY-NEXT:    addb $42, %al
20 ; ANY-NEXT:    # kill: def $al killed $al killed $eax
21 ; ANY-NEXT:    retq
22   %c = icmp ult i8 %x, -43
23   %s = select i1 %c, i8 %x, i8 -43
24   %r = add i8 %s, 42
25   ret i8 %r
28 define i8 @unsigned_sat_constant_i8_using_cmp_sum(i8 %x) {
29 ; ANY-LABEL: unsigned_sat_constant_i8_using_cmp_sum:
30 ; ANY:       # %bb.0:
31 ; ANY-NEXT:    addb $42, %dil
32 ; ANY-NEXT:    movb $-1, %al
33 ; ANY-NEXT:    jb .LBB1_2
34 ; ANY-NEXT:  # %bb.1:
35 ; ANY-NEXT:    movl %edi, %eax
36 ; ANY-NEXT:  .LBB1_2:
37 ; ANY-NEXT:    retq
38   %a = add i8 %x, 42
39   %c = icmp ugt i8 %x, %a
40   %r = select i1 %c, i8 -1, i8 %a
41   ret i8 %r
44 define i8 @unsigned_sat_constant_i8_using_cmp_notval(i8 %x) {
45 ; ANY-LABEL: unsigned_sat_constant_i8_using_cmp_notval:
46 ; ANY:       # %bb.0:
47 ; ANY-NEXT:    addb $42, %dil
48 ; ANY-NEXT:    movb $-1, %al
49 ; ANY-NEXT:    jb .LBB2_2
50 ; ANY-NEXT:  # %bb.1:
51 ; ANY-NEXT:    movl %edi, %eax
52 ; ANY-NEXT:  .LBB2_2:
53 ; ANY-NEXT:    retq
54   %a = add i8 %x, 42
55   %c = icmp ugt i8 %x, -43
56   %r = select i1 %c, i8 -1, i8 %a
57   ret i8 %r
60 define i16 @unsigned_sat_constant_i16_using_min(i16 %x) {
61 ; ANY-LABEL: unsigned_sat_constant_i16_using_min:
62 ; ANY:       # %bb.0:
63 ; ANY-NEXT:    cmpw $-43, %di
64 ; ANY-NEXT:    movl $65493, %eax # imm = 0xFFD5
65 ; ANY-NEXT:    cmovbl %edi, %eax
66 ; ANY-NEXT:    addl $42, %eax
67 ; ANY-NEXT:    # kill: def $ax killed $ax killed $eax
68 ; ANY-NEXT:    retq
69   %c = icmp ult i16 %x, -43
70   %s = select i1 %c, i16 %x, i16 -43
71   %r = add i16 %s, 42
72   ret i16 %r
75 define i16 @unsigned_sat_constant_i16_using_cmp_sum(i16 %x) {
76 ; ANY-LABEL: unsigned_sat_constant_i16_using_cmp_sum:
77 ; ANY:       # %bb.0:
78 ; ANY-NEXT:    addw $42, %di
79 ; ANY-NEXT:    movl $65535, %eax # imm = 0xFFFF
80 ; ANY-NEXT:    cmovael %edi, %eax
81 ; ANY-NEXT:    # kill: def $ax killed $ax killed $eax
82 ; ANY-NEXT:    retq
83   %a = add i16 %x, 42
84   %c = icmp ugt i16 %x, %a
85   %r = select i1 %c, i16 -1, i16 %a
86   ret i16 %r
89 define i16 @unsigned_sat_constant_i16_using_cmp_notval(i16 %x) {
90 ; ANY-LABEL: unsigned_sat_constant_i16_using_cmp_notval:
91 ; ANY:       # %bb.0:
92 ; ANY-NEXT:    addw $42, %di
93 ; ANY-NEXT:    movl $65535, %eax # imm = 0xFFFF
94 ; ANY-NEXT:    cmovael %edi, %eax
95 ; ANY-NEXT:    # kill: def $ax killed $ax killed $eax
96 ; ANY-NEXT:    retq
97   %a = add i16 %x, 42
98   %c = icmp ugt i16 %x, -43
99   %r = select i1 %c, i16 -1, i16 %a
100   ret i16 %r
103 define i32 @unsigned_sat_constant_i32_using_min(i32 %x) {
104 ; ANY-LABEL: unsigned_sat_constant_i32_using_min:
105 ; ANY:       # %bb.0:
106 ; ANY-NEXT:    cmpl $-43, %edi
107 ; ANY-NEXT:    movl $-43, %eax
108 ; ANY-NEXT:    cmovbl %edi, %eax
109 ; ANY-NEXT:    addl $42, %eax
110 ; ANY-NEXT:    retq
111   %c = icmp ult i32 %x, -43
112   %s = select i1 %c, i32 %x, i32 -43
113   %r = add i32 %s, 42
114   ret i32 %r
117 define i32 @unsigned_sat_constant_i32_using_cmp_sum(i32 %x) {
118 ; ANY-LABEL: unsigned_sat_constant_i32_using_cmp_sum:
119 ; ANY:       # %bb.0:
120 ; ANY-NEXT:    addl $42, %edi
121 ; ANY-NEXT:    movl $-1, %eax
122 ; ANY-NEXT:    cmovael %edi, %eax
123 ; ANY-NEXT:    retq
124   %a = add i32 %x, 42
125   %c = icmp ugt i32 %x, %a
126   %r = select i1 %c, i32 -1, i32 %a
127   ret i32 %r
130 define i32 @unsigned_sat_constant_i32_using_cmp_notval(i32 %x) {
131 ; ANY-LABEL: unsigned_sat_constant_i32_using_cmp_notval:
132 ; ANY:       # %bb.0:
133 ; ANY-NEXT:    addl $42, %edi
134 ; ANY-NEXT:    movl $-1, %eax
135 ; ANY-NEXT:    cmovael %edi, %eax
136 ; ANY-NEXT:    retq
137   %a = add i32 %x, 42
138   %c = icmp ugt i32 %x, -43
139   %r = select i1 %c, i32 -1, i32 %a
140   ret i32 %r
143 define i64 @unsigned_sat_constant_i64_using_min(i64 %x) {
144 ; ANY-LABEL: unsigned_sat_constant_i64_using_min:
145 ; ANY:       # %bb.0:
146 ; ANY-NEXT:    cmpq $-43, %rdi
147 ; ANY-NEXT:    movq $-43, %rax
148 ; ANY-NEXT:    cmovbq %rdi, %rax
149 ; ANY-NEXT:    addq $42, %rax
150 ; ANY-NEXT:    retq
151   %c = icmp ult i64 %x, -43
152   %s = select i1 %c, i64 %x, i64 -43
153   %r = add i64 %s, 42
154   ret i64 %r
157 define i64 @unsigned_sat_constant_i64_using_cmp_sum(i64 %x) {
158 ; ANY-LABEL: unsigned_sat_constant_i64_using_cmp_sum:
159 ; ANY:       # %bb.0:
160 ; ANY-NEXT:    addq $42, %rdi
161 ; ANY-NEXT:    movq $-1, %rax
162 ; ANY-NEXT:    cmovaeq %rdi, %rax
163 ; ANY-NEXT:    retq
164   %a = add i64 %x, 42
165   %c = icmp ugt i64 %x, %a
166   %r = select i1 %c, i64 -1, i64 %a
167   ret i64 %r
170 define i64 @unsigned_sat_constant_i64_using_cmp_notval(i64 %x) {
171 ; ANY-LABEL: unsigned_sat_constant_i64_using_cmp_notval:
172 ; ANY:       # %bb.0:
173 ; ANY-NEXT:    addq $42, %rdi
174 ; ANY-NEXT:    movq $-1, %rax
175 ; ANY-NEXT:    cmovaeq %rdi, %rax
176 ; ANY-NEXT:    retq
177   %a = add i64 %x, 42
178   %c = icmp ugt i64 %x, -43
179   %r = select i1 %c, i64 -1, i64 %a
180   ret i64 %r
183 define i8 @unsigned_sat_variable_i8_using_min(i8 %x, i8 %y) {
184 ; ANY-LABEL: unsigned_sat_variable_i8_using_min:
185 ; ANY:       # %bb.0:
186 ; ANY-NEXT:    movl %edi, %eax
187 ; ANY-NEXT:    movl %esi, %ecx
188 ; ANY-NEXT:    notb %cl
189 ; ANY-NEXT:    cmpb %cl, %al
190 ; ANY-NEXT:    jb .LBB12_2
191 ; ANY-NEXT:  # %bb.1:
192 ; ANY-NEXT:    movl %ecx, %eax
193 ; ANY-NEXT:  .LBB12_2:
194 ; ANY-NEXT:    addb %sil, %al
195 ; ANY-NEXT:    # kill: def $al killed $al killed $eax
196 ; ANY-NEXT:    retq
197   %noty = xor i8 %y, -1
198   %c = icmp ult i8 %x, %noty
199   %s = select i1 %c, i8 %x, i8 %noty
200   %r = add i8 %s, %y
201   ret i8 %r
204 define i8 @unsigned_sat_variable_i8_using_cmp_sum(i8 %x, i8 %y) {
205 ; ANY-LABEL: unsigned_sat_variable_i8_using_cmp_sum:
206 ; ANY:       # %bb.0:
207 ; ANY-NEXT:    addb %sil, %dil
208 ; ANY-NEXT:    movb $-1, %al
209 ; ANY-NEXT:    jb .LBB13_2
210 ; ANY-NEXT:  # %bb.1:
211 ; ANY-NEXT:    movl %edi, %eax
212 ; ANY-NEXT:  .LBB13_2:
213 ; ANY-NEXT:    retq
214   %a = add i8 %x, %y
215   %c = icmp ugt i8 %x, %a
216   %r = select i1 %c, i8 -1, i8 %a
217   ret i8 %r
220 define i8 @unsigned_sat_variable_i8_using_cmp_notval(i8 %x, i8 %y) {
221 ; ANY-LABEL: unsigned_sat_variable_i8_using_cmp_notval:
222 ; ANY:       # %bb.0:
223 ; ANY-NEXT:    movl %esi, %eax
224 ; ANY-NEXT:    notb %al
225 ; ANY-NEXT:    cmpb %al, %dil
226 ; ANY-NEXT:    movb $-1, %al
227 ; ANY-NEXT:    ja .LBB14_2
228 ; ANY-NEXT:  # %bb.1:
229 ; ANY-NEXT:    addb %sil, %dil
230 ; ANY-NEXT:    movl %edi, %eax
231 ; ANY-NEXT:  .LBB14_2:
232 ; ANY-NEXT:    retq
233   %noty = xor i8 %y, -1
234   %a = add i8 %x, %y
235   %c = icmp ugt i8 %x, %noty
236   %r = select i1 %c, i8 -1, i8 %a
237   ret i8 %r
240 define i16 @unsigned_sat_variable_i16_using_min(i16 %x, i16 %y) {
241 ; ANY-LABEL: unsigned_sat_variable_i16_using_min:
242 ; ANY:       # %bb.0:
243 ; ANY-NEXT:    # kill: def $esi killed $esi def $rsi
244 ; ANY-NEXT:    movl %esi, %eax
245 ; ANY-NEXT:    notl %eax
246 ; ANY-NEXT:    cmpw %ax, %di
247 ; ANY-NEXT:    cmovbl %edi, %eax
248 ; ANY-NEXT:    leal (%rax,%rsi), %eax
249 ; ANY-NEXT:    # kill: def $ax killed $ax killed $eax
250 ; ANY-NEXT:    retq
251   %noty = xor i16 %y, -1
252   %c = icmp ult i16 %x, %noty
253   %s = select i1 %c, i16 %x, i16 %noty
254   %r = add i16 %s, %y
255   ret i16 %r
258 define i16 @unsigned_sat_variable_i16_using_cmp_sum(i16 %x, i16 %y) {
259 ; ANY-LABEL: unsigned_sat_variable_i16_using_cmp_sum:
260 ; ANY:       # %bb.0:
261 ; ANY-NEXT:    addw %si, %di
262 ; ANY-NEXT:    movl $65535, %eax # imm = 0xFFFF
263 ; ANY-NEXT:    cmovael %edi, %eax
264 ; ANY-NEXT:    # kill: def $ax killed $ax killed $eax
265 ; ANY-NEXT:    retq
266   %a = add i16 %x, %y
267   %c = icmp ugt i16 %x, %a
268   %r = select i1 %c, i16 -1, i16 %a
269   ret i16 %r
272 define i16 @unsigned_sat_variable_i16_using_cmp_notval(i16 %x, i16 %y) {
273 ; ANY-LABEL: unsigned_sat_variable_i16_using_cmp_notval:
274 ; ANY:       # %bb.0:
275 ; ANY-NEXT:    # kill: def $esi killed $esi def $rsi
276 ; ANY-NEXT:    # kill: def $edi killed $edi def $rdi
277 ; ANY-NEXT:    leal (%rdi,%rsi), %ecx
278 ; ANY-NEXT:    notl %esi
279 ; ANY-NEXT:    cmpw %si, %di
280 ; ANY-NEXT:    movl $65535, %eax # imm = 0xFFFF
281 ; ANY-NEXT:    cmovbel %ecx, %eax
282 ; ANY-NEXT:    # kill: def $ax killed $ax killed $eax
283 ; ANY-NEXT:    retq
284   %noty = xor i16 %y, -1
285   %a = add i16 %x, %y
286   %c = icmp ugt i16 %x, %noty
287   %r = select i1 %c, i16 -1, i16 %a
288   ret i16 %r
291 define i32 @unsigned_sat_variable_i32_using_min(i32 %x, i32 %y) {
292 ; ANY-LABEL: unsigned_sat_variable_i32_using_min:
293 ; ANY:       # %bb.0:
294 ; ANY-NEXT:    # kill: def $esi killed $esi def $rsi
295 ; ANY-NEXT:    movl %esi, %eax
296 ; ANY-NEXT:    notl %eax
297 ; ANY-NEXT:    cmpl %eax, %edi
298 ; ANY-NEXT:    cmovbl %edi, %eax
299 ; ANY-NEXT:    leal (%rax,%rsi), %eax
300 ; ANY-NEXT:    retq
301   %noty = xor i32 %y, -1
302   %c = icmp ult i32 %x, %noty
303   %s = select i1 %c, i32 %x, i32 %noty
304   %r = add i32 %s, %y
305   ret i32 %r
308 define i32 @unsigned_sat_variable_i32_using_cmp_sum(i32 %x, i32 %y) {
309 ; ANY-LABEL: unsigned_sat_variable_i32_using_cmp_sum:
310 ; ANY:       # %bb.0:
311 ; ANY-NEXT:    addl %esi, %edi
312 ; ANY-NEXT:    movl $-1, %eax
313 ; ANY-NEXT:    cmovael %edi, %eax
314 ; ANY-NEXT:    retq
315   %a = add i32 %x, %y
316   %c = icmp ugt i32 %x, %a
317   %r = select i1 %c, i32 -1, i32 %a
318   ret i32 %r
321 define i32 @unsigned_sat_variable_i32_using_cmp_notval(i32 %x, i32 %y) {
322 ; ANY-LABEL: unsigned_sat_variable_i32_using_cmp_notval:
323 ; ANY:       # %bb.0:
324 ; ANY-NEXT:    # kill: def $esi killed $esi def $rsi
325 ; ANY-NEXT:    # kill: def $edi killed $edi def $rdi
326 ; ANY-NEXT:    leal (%rdi,%rsi), %ecx
327 ; ANY-NEXT:    notl %esi
328 ; ANY-NEXT:    cmpl %esi, %edi
329 ; ANY-NEXT:    movl $-1, %eax
330 ; ANY-NEXT:    cmovbel %ecx, %eax
331 ; ANY-NEXT:    retq
332   %noty = xor i32 %y, -1
333   %a = add i32 %x, %y
334   %c = icmp ugt i32 %x, %noty
335   %r = select i1 %c, i32 -1, i32 %a
336   ret i32 %r
339 define i64 @unsigned_sat_variable_i64_using_min(i64 %x, i64 %y) {
340 ; ANY-LABEL: unsigned_sat_variable_i64_using_min:
341 ; ANY:       # %bb.0:
342 ; ANY-NEXT:    movq %rsi, %rax
343 ; ANY-NEXT:    notq %rax
344 ; ANY-NEXT:    cmpq %rax, %rdi
345 ; ANY-NEXT:    cmovbq %rdi, %rax
346 ; ANY-NEXT:    leaq (%rax,%rsi), %rax
347 ; ANY-NEXT:    retq
348   %noty = xor i64 %y, -1
349   %c = icmp ult i64 %x, %noty
350   %s = select i1 %c, i64 %x, i64 %noty
351   %r = add i64 %s, %y
352   ret i64 %r
355 define i64 @unsigned_sat_variable_i64_using_cmp_sum(i64 %x, i64 %y) {
356 ; ANY-LABEL: unsigned_sat_variable_i64_using_cmp_sum:
357 ; ANY:       # %bb.0:
358 ; ANY-NEXT:    addq %rsi, %rdi
359 ; ANY-NEXT:    movq $-1, %rax
360 ; ANY-NEXT:    cmovaeq %rdi, %rax
361 ; ANY-NEXT:    retq
362   %a = add i64 %x, %y
363   %c = icmp ugt i64 %x, %a
364   %r = select i1 %c, i64 -1, i64 %a
365   ret i64 %r
368 define i64 @unsigned_sat_variable_i64_using_cmp_notval(i64 %x, i64 %y) {
369 ; ANY-LABEL: unsigned_sat_variable_i64_using_cmp_notval:
370 ; ANY:       # %bb.0:
371 ; ANY-NEXT:    leaq (%rdi,%rsi), %rcx
372 ; ANY-NEXT:    notq %rsi
373 ; ANY-NEXT:    cmpq %rsi, %rdi
374 ; ANY-NEXT:    movq $-1, %rax
375 ; ANY-NEXT:    cmovbeq %rcx, %rax
376 ; ANY-NEXT:    retq
377   %noty = xor i64 %y, -1
378   %a = add i64 %x, %y
379   %c = icmp ugt i64 %x, %noty
380   %r = select i1 %c, i64 -1, i64 %a
381   ret i64 %r
384 define <16 x i8> @unsigned_sat_constant_v16i8_using_min(<16 x i8> %x) {
385 ; ANY-LABEL: unsigned_sat_constant_v16i8_using_min:
386 ; ANY:       # %bb.0:
387 ; ANY-NEXT:    pminub {{.*}}(%rip), %xmm0
388 ; ANY-NEXT:    paddb {{.*}}(%rip), %xmm0
389 ; ANY-NEXT:    retq
390   %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>
391   %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>
392   %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>
393   ret <16 x i8> %r
396 define <16 x i8> @unsigned_sat_constant_v16i8_using_cmp_sum(<16 x i8> %x) {
397 ; ANY-LABEL: unsigned_sat_constant_v16i8_using_cmp_sum:
398 ; ANY:       # %bb.0:
399 ; ANY-NEXT:    paddusb {{.*}}(%rip), %xmm0
400 ; ANY-NEXT:    retq
401   %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>
402   %c = icmp ugt <16 x i8> %x, %a
403   %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
404   ret <16 x i8> %r
407 define <16 x i8> @unsigned_sat_constant_v16i8_using_cmp_notval(<16 x i8> %x) {
408 ; ANY-LABEL: unsigned_sat_constant_v16i8_using_cmp_notval:
409 ; ANY:       # %bb.0:
410 ; ANY-NEXT:    paddusb {{.*}}(%rip), %xmm0
411 ; ANY-NEXT:    retq
412   %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>
413   %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>
414   %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
415   ret <16 x i8> %r
418 define <8 x i16> @unsigned_sat_constant_v8i16_using_min(<8 x i16> %x) {
419 ; SSE2-LABEL: unsigned_sat_constant_v8i16_using_min:
420 ; SSE2:       # %bb.0:
421 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768,32768,32768,32768,32768]
422 ; SSE2-NEXT:    pxor %xmm1, %xmm0
423 ; SSE2-NEXT:    pminsw {{.*}}(%rip), %xmm0
424 ; SSE2-NEXT:    pxor %xmm1, %xmm0
425 ; SSE2-NEXT:    paddw {{.*}}(%rip), %xmm0
426 ; SSE2-NEXT:    retq
428 ; SSE41-LABEL: unsigned_sat_constant_v8i16_using_min:
429 ; SSE41:       # %bb.0:
430 ; SSE41-NEXT:    pminuw {{.*}}(%rip), %xmm0
431 ; SSE41-NEXT:    paddw {{.*}}(%rip), %xmm0
432 ; SSE41-NEXT:    retq
433   %c = icmp ult <8 x i16> %x, <i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43>
434   %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>
435   %r = add <8 x i16> %s, <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42>
436   ret <8 x i16> %r
439 define <8 x i16> @unsigned_sat_constant_v8i16_using_cmp_sum(<8 x i16> %x) {
440 ; ANY-LABEL: unsigned_sat_constant_v8i16_using_cmp_sum:
441 ; ANY:       # %bb.0:
442 ; ANY-NEXT:    paddusw {{.*}}(%rip), %xmm0
443 ; ANY-NEXT:    retq
444   %a = add <8 x i16> %x, <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42>
445   %c = icmp ugt <8 x i16> %x, %a
446   %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
447   ret <8 x i16> %r
450 define <8 x i16> @unsigned_sat_constant_v8i16_using_cmp_notval(<8 x i16> %x) {
451 ; ANY-LABEL: unsigned_sat_constant_v8i16_using_cmp_notval:
452 ; ANY:       # %bb.0:
453 ; ANY-NEXT:    paddusw {{.*}}(%rip), %xmm0
454 ; ANY-NEXT:    retq
455   %a = add <8 x i16> %x, <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42>
456   %c = icmp ugt <8 x i16> %x, <i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43>
457   %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
458   ret <8 x i16> %r
461 define <4 x i32> @unsigned_sat_constant_v4i32_using_min(<4 x i32> %x) {
462 ; SSE2-LABEL: unsigned_sat_constant_v4i32_using_min:
463 ; SSE2:       # %bb.0:
464 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
465 ; SSE2-NEXT:    pxor %xmm0, %xmm1
466 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483605,2147483605,2147483605,2147483605]
467 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
468 ; SSE2-NEXT:    pand %xmm2, %xmm0
469 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
470 ; SSE2-NEXT:    por %xmm2, %xmm0
471 ; SSE2-NEXT:    paddd {{.*}}(%rip), %xmm0
472 ; SSE2-NEXT:    retq
474 ; SSE41-LABEL: unsigned_sat_constant_v4i32_using_min:
475 ; SSE41:       # %bb.0:
476 ; SSE41-NEXT:    pminud {{.*}}(%rip), %xmm0
477 ; SSE41-NEXT:    paddd {{.*}}(%rip), %xmm0
478 ; SSE41-NEXT:    retq
479   %c = icmp ult <4 x i32> %x, <i32 -43, i32 -43, i32 -43, i32 -43>
480   %s = select <4 x i1> %c, <4 x i32> %x, <4 x i32> <i32 -43, i32 -43, i32 -43, i32 -43>
481   %r = add <4 x i32> %s, <i32 42, i32 42, i32 42, i32 42>
482   ret <4 x i32> %r
485 define <4 x i32> @unsigned_sat_constant_v4i32_using_cmp_sum(<4 x i32> %x) {
486 ; SSE2-LABEL: unsigned_sat_constant_v4i32_using_cmp_sum:
487 ; SSE2:       # %bb.0:
488 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [42,42,42,42]
489 ; SSE2-NEXT:    paddd %xmm0, %xmm1
490 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
491 ; SSE2-NEXT:    pxor %xmm2, %xmm0
492 ; SSE2-NEXT:    pxor %xmm1, %xmm2
493 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
494 ; SSE2-NEXT:    por %xmm1, %xmm0
495 ; SSE2-NEXT:    retq
497 ; SSE41-LABEL: unsigned_sat_constant_v4i32_using_cmp_sum:
498 ; SSE41:       # %bb.0:
499 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [42,42,42,42]
500 ; SSE41-NEXT:    paddd %xmm0, %xmm2
501 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
502 ; SSE41-NEXT:    pminud %xmm2, %xmm1
503 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
504 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm0
505 ; SSE41-NEXT:    pxor %xmm0, %xmm1
506 ; SSE41-NEXT:    por %xmm2, %xmm1
507 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
508 ; SSE41-NEXT:    retq
509   %a = add <4 x i32> %x, <i32 42, i32 42, i32 42, i32 42>
510   %c = icmp ugt <4 x i32> %x, %a
511   %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a
512   ret <4 x i32> %r
515 define <4 x i32> @unsigned_sat_constant_v4i32_using_cmp_notval(<4 x i32> %x) {
516 ; SSE2-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval:
517 ; SSE2:       # %bb.0:
518 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [42,42,42,42]
519 ; SSE2-NEXT:    paddd %xmm0, %xmm1
520 ; SSE2-NEXT:    pxor {{.*}}(%rip), %xmm0
521 ; SSE2-NEXT:    pcmpgtd {{.*}}(%rip), %xmm0
522 ; SSE2-NEXT:    por %xmm1, %xmm0
523 ; SSE2-NEXT:    retq
525 ; SSE41-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval:
526 ; SSE41:       # %bb.0:
527 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [42,42,42,42]
528 ; SSE41-NEXT:    paddd %xmm0, %xmm1
529 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [4294967254,4294967254,4294967254,4294967254]
530 ; SSE41-NEXT:    pmaxud %xmm0, %xmm2
531 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
532 ; SSE41-NEXT:    por %xmm1, %xmm0
533 ; SSE41-NEXT:    retq
534   %a = add <4 x i32> %x, <i32 42, i32 42, i32 42, i32 42>
535   %c = icmp ugt <4 x i32> %x, <i32 -43, i32 -43, i32 -43, i32 -43>
536   %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a
537   ret <4 x i32> %r
540 define <4 x i32> @unsigned_sat_constant_v4i32_using_cmp_notval_nonsplat(<4 x i32> %x) {
541 ; SSE2-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval_nonsplat:
542 ; SSE2:       # %bb.0:
543 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [43,44,45,46]
544 ; SSE2-NEXT:    paddd %xmm0, %xmm1
545 ; SSE2-NEXT:    pxor {{.*}}(%rip), %xmm0
546 ; SSE2-NEXT:    pcmpgtd {{.*}}(%rip), %xmm0
547 ; SSE2-NEXT:    por %xmm1, %xmm0
548 ; SSE2-NEXT:    retq
550 ; SSE41-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval_nonsplat:
551 ; SSE41:       # %bb.0:
552 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [43,44,45,46]
553 ; SSE41-NEXT:    paddd %xmm0, %xmm1
554 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [4294967253,4294967252,4294967251,4294967250]
555 ; SSE41-NEXT:    pmaxud %xmm0, %xmm2
556 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
557 ; SSE41-NEXT:    por %xmm1, %xmm0
558 ; SSE41-NEXT:    retq
559   %a = add <4 x i32> %x, <i32 43, i32 44, i32 45, i32 46>
560   %c = icmp ugt <4 x i32> %x, <i32 -44, i32 -45, i32 -46, i32 -47>
561   %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a
562   ret <4 x i32> %r
565 define <2 x i64> @unsigned_sat_constant_v2i64_using_min(<2 x i64> %x) {
566 ; SSE2-LABEL: unsigned_sat_constant_v2i64_using_min:
567 ; SSE2:       # %bb.0:
568 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
569 ; SSE2-NEXT:    pxor %xmm0, %xmm1
570 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372034707292117,9223372034707292117]
571 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
572 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
573 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
574 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
575 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
576 ; SSE2-NEXT:    pand %xmm4, %xmm1
577 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
578 ; SSE2-NEXT:    por %xmm1, %xmm2
579 ; SSE2-NEXT:    pand %xmm2, %xmm0
580 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
581 ; SSE2-NEXT:    por %xmm2, %xmm0
582 ; SSE2-NEXT:    paddq {{.*}}(%rip), %xmm0
583 ; SSE2-NEXT:    retq
585 ; SSE41-LABEL: unsigned_sat_constant_v2i64_using_min:
586 ; SSE41:       # %bb.0:
587 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
588 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [18446744073709551573,18446744073709551573]
589 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
590 ; SSE41-NEXT:    pxor %xmm1, %xmm0
591 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372034707292117,9223372034707292117]
592 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
593 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
594 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
595 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
596 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
597 ; SSE41-NEXT:    pand %xmm5, %xmm0
598 ; SSE41-NEXT:    por %xmm4, %xmm0
599 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
600 ; SSE41-NEXT:    paddq {{.*}}(%rip), %xmm2
601 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
602 ; SSE41-NEXT:    retq
603   %c = icmp ult <2 x i64> %x, <i64 -43, i64 -43>
604   %s = select <2 x i1> %c, <2 x i64> %x, <2 x i64> <i64 -43, i64 -43>
605   %r = add <2 x i64> %s, <i64 42, i64 42>
606   ret <2 x i64> %r
609 define <2 x i64> @unsigned_sat_constant_v2i64_using_cmp_sum(<2 x i64> %x) {
610 ; ANY-LABEL: unsigned_sat_constant_v2i64_using_cmp_sum:
611 ; ANY:       # %bb.0:
612 ; ANY-NEXT:    movdqa {{.*#+}} xmm1 = [42,42]
613 ; ANY-NEXT:    paddq %xmm0, %xmm1
614 ; ANY-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
615 ; ANY-NEXT:    pxor %xmm2, %xmm0
616 ; ANY-NEXT:    pxor %xmm1, %xmm2
617 ; ANY-NEXT:    movdqa %xmm0, %xmm3
618 ; ANY-NEXT:    pcmpgtd %xmm2, %xmm3
619 ; ANY-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
620 ; ANY-NEXT:    pcmpeqd %xmm0, %xmm2
621 ; ANY-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
622 ; ANY-NEXT:    pand %xmm4, %xmm2
623 ; ANY-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
624 ; ANY-NEXT:    por %xmm1, %xmm0
625 ; ANY-NEXT:    por %xmm2, %xmm0
626 ; ANY-NEXT:    retq
627   %a = add <2 x i64> %x, <i64 42, i64 42>
628   %c = icmp ugt <2 x i64> %x, %a
629   %r = select <2 x i1> %c, <2 x i64> <i64 -1, i64 -1>, <2 x i64> %a
630   ret <2 x i64> %r
633 define <2 x i64> @unsigned_sat_constant_v2i64_using_cmp_notval(<2 x i64> %x) {
634 ; ANY-LABEL: unsigned_sat_constant_v2i64_using_cmp_notval:
635 ; ANY:       # %bb.0:
636 ; ANY-NEXT:    movdqa {{.*#+}} xmm1 = [42,42]
637 ; ANY-NEXT:    paddq %xmm0, %xmm1
638 ; ANY-NEXT:    pxor {{.*}}(%rip), %xmm0
639 ; ANY-NEXT:    movdqa {{.*#+}} xmm2 = [9223372034707292117,9223372034707292117]
640 ; ANY-NEXT:    movdqa %xmm0, %xmm3
641 ; ANY-NEXT:    pcmpgtd %xmm2, %xmm3
642 ; ANY-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
643 ; ANY-NEXT:    pcmpeqd %xmm2, %xmm0
644 ; ANY-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
645 ; ANY-NEXT:    pand %xmm4, %xmm2
646 ; ANY-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
647 ; ANY-NEXT:    por %xmm1, %xmm0
648 ; ANY-NEXT:    por %xmm2, %xmm0
649 ; ANY-NEXT:    retq
650   %a = add <2 x i64> %x, <i64 42, i64 42>
651   %c = icmp ugt <2 x i64> %x, <i64 -43, i64 -43>
652   %r = select <2 x i1> %c, <2 x i64> <i64 -1, i64 -1>, <2 x i64> %a
653   ret <2 x i64> %r
656 define <16 x i8> @unsigned_sat_variable_v16i8_using_min(<16 x i8> %x, <16 x i8> %y) {
657 ; ANY-LABEL: unsigned_sat_variable_v16i8_using_min:
658 ; ANY:       # %bb.0:
659 ; ANY-NEXT:    pcmpeqd %xmm2, %xmm2
660 ; ANY-NEXT:    pxor %xmm1, %xmm2
661 ; ANY-NEXT:    pminub %xmm2, %xmm0
662 ; ANY-NEXT:    paddb %xmm1, %xmm0
663 ; ANY-NEXT:    retq
664   %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>
665   %c = icmp ult <16 x i8> %x, %noty
666   %s = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %noty
667   %r = add <16 x i8> %s, %y
668   ret <16 x i8> %r
671 define <16 x i8> @unsigned_sat_variable_v16i8_using_cmp_sum(<16 x i8> %x, <16 x i8> %y) {
672 ; ANY-LABEL: unsigned_sat_variable_v16i8_using_cmp_sum:
673 ; ANY:       # %bb.0:
674 ; ANY-NEXT:    paddusb %xmm1, %xmm0
675 ; ANY-NEXT:    retq
676   %a = add <16 x i8> %x, %y
677   %c = icmp ugt <16 x i8> %x, %a
678   %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
679   ret <16 x i8> %r
682 define <16 x i8> @unsigned_sat_variable_v16i8_using_cmp_notval(<16 x i8> %x, <16 x i8> %y) {
683 ; ANY-LABEL: unsigned_sat_variable_v16i8_using_cmp_notval:
684 ; ANY:       # %bb.0:
685 ; ANY-NEXT:    pcmpeqd %xmm2, %xmm2
686 ; ANY-NEXT:    movdqa %xmm0, %xmm3
687 ; ANY-NEXT:    paddb %xmm1, %xmm3
688 ; ANY-NEXT:    pxor %xmm2, %xmm1
689 ; ANY-NEXT:    pminub %xmm0, %xmm1
690 ; ANY-NEXT:    pcmpeqb %xmm1, %xmm0
691 ; ANY-NEXT:    pxor %xmm2, %xmm0
692 ; ANY-NEXT:    por %xmm3, %xmm0
693 ; ANY-NEXT:    retq
694   %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>
695   %a = add <16 x i8> %x, %y
696   %c = icmp ugt <16 x i8> %x, %noty
697   %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
698   ret <16 x i8> %r
701 define <8 x i16> @unsigned_sat_variable_v8i16_using_min(<8 x i16> %x, <8 x i16> %y) {
702 ; SSE2-LABEL: unsigned_sat_variable_v8i16_using_min:
703 ; SSE2:       # %bb.0:
704 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
705 ; SSE2-NEXT:    pxor %xmm2, %xmm0
706 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [32767,32767,32767,32767,32767,32767,32767,32767]
707 ; SSE2-NEXT:    pxor %xmm1, %xmm3
708 ; SSE2-NEXT:    pminsw %xmm3, %xmm0
709 ; SSE2-NEXT:    pxor %xmm2, %xmm0
710 ; SSE2-NEXT:    paddw %xmm1, %xmm0
711 ; SSE2-NEXT:    retq
713 ; SSE41-LABEL: unsigned_sat_variable_v8i16_using_min:
714 ; SSE41:       # %bb.0:
715 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
716 ; SSE41-NEXT:    pxor %xmm1, %xmm2
717 ; SSE41-NEXT:    pminuw %xmm2, %xmm0
718 ; SSE41-NEXT:    paddw %xmm1, %xmm0
719 ; SSE41-NEXT:    retq
720   %noty = xor <8 x i16> %y, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
721   %c = icmp ult <8 x i16> %x, %noty
722   %s = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %noty
723   %r = add <8 x i16> %s, %y
724   ret <8 x i16> %r
727 define <8 x i16> @unsigned_sat_variable_v8i16_using_cmp_sum(<8 x i16> %x, <8 x i16> %y) {
728 ; ANY-LABEL: unsigned_sat_variable_v8i16_using_cmp_sum:
729 ; ANY:       # %bb.0:
730 ; ANY-NEXT:    paddusw %xmm1, %xmm0
731 ; ANY-NEXT:    retq
732   %a = add <8 x i16> %x, %y
733   %c = icmp ugt <8 x i16> %x, %a
734   %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
735   ret <8 x i16> %r
738 define <8 x i16> @unsigned_sat_variable_v8i16_using_cmp_notval(<8 x i16> %x, <8 x i16> %y) {
739 ; SSE2-LABEL: unsigned_sat_variable_v8i16_using_cmp_notval:
740 ; SSE2:       # %bb.0:
741 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
742 ; SSE2-NEXT:    paddw %xmm1, %xmm2
743 ; SSE2-NEXT:    pxor {{.*}}(%rip), %xmm1
744 ; SSE2-NEXT:    pxor {{.*}}(%rip), %xmm0
745 ; SSE2-NEXT:    pcmpgtw %xmm1, %xmm0
746 ; SSE2-NEXT:    por %xmm2, %xmm0
747 ; SSE2-NEXT:    retq
749 ; SSE41-LABEL: unsigned_sat_variable_v8i16_using_cmp_notval:
750 ; SSE41:       # %bb.0:
751 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
752 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
753 ; SSE41-NEXT:    paddw %xmm1, %xmm3
754 ; SSE41-NEXT:    pxor %xmm2, %xmm1
755 ; SSE41-NEXT:    pminuw %xmm0, %xmm1
756 ; SSE41-NEXT:    pcmpeqw %xmm1, %xmm0
757 ; SSE41-NEXT:    pxor %xmm2, %xmm0
758 ; SSE41-NEXT:    por %xmm3, %xmm0
759 ; SSE41-NEXT:    retq
760   %noty = xor <8 x i16> %y, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
761   %a = add <8 x i16> %x, %y
762   %c = icmp ugt <8 x i16> %x, %noty
763   %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
764   ret <8 x i16> %r
767 define <4 x i32> @unsigned_sat_variable_v4i32_using_min(<4 x i32> %x, <4 x i32> %y) {
768 ; SSE2-LABEL: unsigned_sat_variable_v4i32_using_min:
769 ; SSE2:       # %bb.0:
770 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
771 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
772 ; SSE2-NEXT:    pxor %xmm0, %xmm3
773 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483647,2147483647,2147483647,2147483647]
774 ; SSE2-NEXT:    pxor %xmm1, %xmm4
775 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
776 ; SSE2-NEXT:    pand %xmm4, %xmm0
777 ; SSE2-NEXT:    pxor %xmm2, %xmm4
778 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
779 ; SSE2-NEXT:    pandn %xmm4, %xmm2
780 ; SSE2-NEXT:    por %xmm2, %xmm0
781 ; SSE2-NEXT:    paddd %xmm1, %xmm0
782 ; SSE2-NEXT:    retq
784 ; SSE41-LABEL: unsigned_sat_variable_v4i32_using_min:
785 ; SSE41:       # %bb.0:
786 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
787 ; SSE41-NEXT:    pxor %xmm1, %xmm2
788 ; SSE41-NEXT:    pminud %xmm2, %xmm0
789 ; SSE41-NEXT:    paddd %xmm1, %xmm0
790 ; SSE41-NEXT:    retq
791   %noty = xor <4 x i32> %y, <i32 -1, i32 -1, i32 -1, i32 -1>
792   %c = icmp ult <4 x i32> %x, %noty
793   %s = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %noty
794   %r = add <4 x i32> %s, %y
795   ret <4 x i32> %r
798 define <4 x i32> @unsigned_sat_variable_v4i32_using_cmp_sum(<4 x i32> %x, <4 x i32> %y) {
799 ; SSE2-LABEL: unsigned_sat_variable_v4i32_using_cmp_sum:
800 ; SSE2:       # %bb.0:
801 ; SSE2-NEXT:    paddd %xmm0, %xmm1
802 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
803 ; SSE2-NEXT:    pxor %xmm2, %xmm0
804 ; SSE2-NEXT:    pxor %xmm1, %xmm2
805 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
806 ; SSE2-NEXT:    por %xmm1, %xmm0
807 ; SSE2-NEXT:    retq
809 ; SSE41-LABEL: unsigned_sat_variable_v4i32_using_cmp_sum:
810 ; SSE41:       # %bb.0:
811 ; SSE41-NEXT:    paddd %xmm0, %xmm1
812 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
813 ; SSE41-NEXT:    pminud %xmm1, %xmm2
814 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
815 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm0
816 ; SSE41-NEXT:    pxor %xmm0, %xmm2
817 ; SSE41-NEXT:    por %xmm1, %xmm2
818 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
819 ; SSE41-NEXT:    retq
820   %a = add <4 x i32> %x, %y
821   %c = icmp ugt <4 x i32> %x, %a
822   %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a
823   ret <4 x i32> %r
826 define <4 x i32> @unsigned_sat_variable_v4i32_using_cmp_notval(<4 x i32> %x, <4 x i32> %y) {
827 ; SSE2-LABEL: unsigned_sat_variable_v4i32_using_cmp_notval:
828 ; SSE2:       # %bb.0:
829 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
830 ; SSE2-NEXT:    paddd %xmm1, %xmm2
831 ; SSE2-NEXT:    pxor {{.*}}(%rip), %xmm1
832 ; SSE2-NEXT:    pxor {{.*}}(%rip), %xmm0
833 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
834 ; SSE2-NEXT:    por %xmm2, %xmm0
835 ; SSE2-NEXT:    retq
837 ; SSE41-LABEL: unsigned_sat_variable_v4i32_using_cmp_notval:
838 ; SSE41:       # %bb.0:
839 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
840 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
841 ; SSE41-NEXT:    paddd %xmm1, %xmm3
842 ; SSE41-NEXT:    pxor %xmm2, %xmm1
843 ; SSE41-NEXT:    pminud %xmm0, %xmm1
844 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
845 ; SSE41-NEXT:    pxor %xmm2, %xmm0
846 ; SSE41-NEXT:    por %xmm3, %xmm0
847 ; SSE41-NEXT:    retq
848   %noty = xor <4 x i32> %y, <i32 -1, i32 -1, i32 -1, i32 -1>
849   %a = add <4 x i32> %x, %y
850   %c = icmp ugt <4 x i32> %x, %noty
851   %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a
852   ret <4 x i32> %r
855 define <2 x i64> @unsigned_sat_variable_v2i64_using_min(<2 x i64> %x, <2 x i64> %y) {
856 ; SSE2-LABEL: unsigned_sat_variable_v2i64_using_min:
857 ; SSE2:       # %bb.0:
858 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
859 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
860 ; SSE2-NEXT:    pxor %xmm0, %xmm3
861 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372034707292159,9223372034707292159]
862 ; SSE2-NEXT:    pxor %xmm1, %xmm4
863 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
864 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
865 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
866 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
867 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
868 ; SSE2-NEXT:    pand %xmm6, %xmm3
869 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
870 ; SSE2-NEXT:    por %xmm3, %xmm4
871 ; SSE2-NEXT:    pand %xmm4, %xmm0
872 ; SSE2-NEXT:    pxor %xmm2, %xmm4
873 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
874 ; SSE2-NEXT:    pandn %xmm4, %xmm2
875 ; SSE2-NEXT:    por %xmm2, %xmm0
876 ; SSE2-NEXT:    paddq %xmm1, %xmm0
877 ; SSE2-NEXT:    retq
879 ; SSE41-LABEL: unsigned_sat_variable_v2i64_using_min:
880 ; SSE41:       # %bb.0:
881 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
882 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm3
883 ; SSE41-NEXT:    pxor %xmm1, %xmm3
884 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
885 ; SSE41-NEXT:    pxor %xmm2, %xmm0
886 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372034707292159,9223372034707292159]
887 ; SSE41-NEXT:    pxor %xmm1, %xmm4
888 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
889 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
890 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
891 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
892 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
893 ; SSE41-NEXT:    pand %xmm6, %xmm0
894 ; SSE41-NEXT:    por %xmm5, %xmm0
895 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
896 ; SSE41-NEXT:    paddq %xmm1, %xmm3
897 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
898 ; SSE41-NEXT:    retq
899   %noty = xor <2 x i64> %y, <i64 -1, i64 -1>
900   %c = icmp ult <2 x i64> %x, %noty
901   %s = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %noty
902   %r = add <2 x i64> %s, %y
903   ret <2 x i64> %r
906 define <2 x i64> @unsigned_sat_variable_v2i64_using_cmp_sum(<2 x i64> %x, <2 x i64> %y) {
907 ; ANY-LABEL: unsigned_sat_variable_v2i64_using_cmp_sum:
908 ; ANY:       # %bb.0:
909 ; ANY-NEXT:    paddq %xmm0, %xmm1
910 ; ANY-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
911 ; ANY-NEXT:    pxor %xmm2, %xmm0
912 ; ANY-NEXT:    pxor %xmm1, %xmm2
913 ; ANY-NEXT:    movdqa %xmm0, %xmm3
914 ; ANY-NEXT:    pcmpgtd %xmm2, %xmm3
915 ; ANY-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
916 ; ANY-NEXT:    pcmpeqd %xmm0, %xmm2
917 ; ANY-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
918 ; ANY-NEXT:    pand %xmm4, %xmm2
919 ; ANY-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
920 ; ANY-NEXT:    por %xmm1, %xmm0
921 ; ANY-NEXT:    por %xmm2, %xmm0
922 ; ANY-NEXT:    retq
923   %a = add <2 x i64> %x, %y
924   %c = icmp ugt <2 x i64> %x, %a
925   %r = select <2 x i1> %c, <2 x i64> <i64 -1, i64 -1>, <2 x i64> %a
926   ret <2 x i64> %r
929 define <2 x i64> @unsigned_sat_variable_v2i64_using_cmp_notval(<2 x i64> %x, <2 x i64> %y) {
930 ; ANY-LABEL: unsigned_sat_variable_v2i64_using_cmp_notval:
931 ; ANY:       # %bb.0:
932 ; ANY-NEXT:    movdqa %xmm0, %xmm2
933 ; ANY-NEXT:    paddq %xmm1, %xmm2
934 ; ANY-NEXT:    pxor {{.*}}(%rip), %xmm1
935 ; ANY-NEXT:    pxor {{.*}}(%rip), %xmm0
936 ; ANY-NEXT:    movdqa %xmm0, %xmm3
937 ; ANY-NEXT:    pcmpgtd %xmm1, %xmm3
938 ; ANY-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
939 ; ANY-NEXT:    pcmpeqd %xmm1, %xmm0
940 ; ANY-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
941 ; ANY-NEXT:    pand %xmm4, %xmm1
942 ; ANY-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
943 ; ANY-NEXT:    por %xmm2, %xmm0
944 ; ANY-NEXT:    por %xmm1, %xmm0
945 ; ANY-NEXT:    retq
946   %noty = xor <2 x i64> %y, <i64 -1, i64 -1>
947   %a = add <2 x i64> %x, %y
948   %c = icmp ugt <2 x i64> %x, %noty
949   %r = select <2 x i1> %c, <2 x i64> <i64 -1, i64 -1>, <2 x i64> %a
950   ret <2 x i64> %r