]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/select.ll
Vendor import of llvm trunk r351319 (just before the release_80 branch
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / select.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -mcpu=generic | FileCheck %s --check-prefix=CHECK --check-prefix=GENERIC
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -mcpu=atom    | FileCheck %s --check-prefix=CHECK --check-prefix=ATOM
4 ; RUN: llc < %s -mtriple=i386-apple-darwin10 -mcpu=athlon    | FileCheck %s --check-prefix=ATHLON
5 ; RUN: llc < %s -mtriple=i386-intel-elfiamcu                 | FileCheck %s --check-prefix=MCU
6
7 ; PR5757
8 %0 = type { i64, i32 }
9
10 define i32 @test1(%0* %p, %0* %q, i1 %r) nounwind {
11 ; CHECK-LABEL: test1:
12 ; CHECK:       ## %bb.0:
13 ; CHECK-NEXT:    addq $8, %rdi
14 ; CHECK-NEXT:    addq $8, %rsi
15 ; CHECK-NEXT:    testb $1, %dl
16 ; CHECK-NEXT:    cmovneq %rdi, %rsi
17 ; CHECK-NEXT:    movl (%rsi), %eax
18 ; CHECK-NEXT:    retq
19 ;
20 ; ATHLON-LABEL: test1:
21 ; ATHLON:       ## %bb.0:
22 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
23 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
24 ; ATHLON-NEXT:    addl $8, %ecx
25 ; ATHLON-NEXT:    addl $8, %eax
26 ; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
27 ; ATHLON-NEXT:    cmovnel %ecx, %eax
28 ; ATHLON-NEXT:    movl (%eax), %eax
29 ; ATHLON-NEXT:    retl
30 ;
31 ; MCU-LABEL: test1:
32 ; MCU:       # %bb.0:
33 ; MCU-NEXT:    testb $1, %cl
34 ; MCU-NEXT:    jne .LBB0_1
35 ; MCU-NEXT:  # %bb.2:
36 ; MCU-NEXT:    addl $8, %edx
37 ; MCU-NEXT:    movl (%edx), %eax
38 ; MCU-NEXT:    retl
39 ; MCU-NEXT:  .LBB0_1:
40 ; MCU-NEXT:    addl $8, %eax
41 ; MCU-NEXT:    movl (%eax), %eax
42 ; MCU-NEXT:    retl
43   %t0 = load %0, %0* %p
44   %t1 = load %0, %0* %q
45   %t4 = select i1 %r, %0 %t0, %0 %t1
46   %t5 = extractvalue %0 %t4, 1
47   ret i32 %t5
48 }
49
50 ; PR2139
51 define i32 @test2() nounwind {
52 ; GENERIC-LABEL: test2:
53 ; GENERIC:       ## %bb.0: ## %entry
54 ; GENERIC-NEXT:    pushq %rax
55 ; GENERIC-NEXT:    callq _return_false
56 ; GENERIC-NEXT:    xorl %ecx, %ecx
57 ; GENERIC-NEXT:    testb $1, %al
58 ; GENERIC-NEXT:    movl $-480, %eax ## imm = 0xFE20
59 ; GENERIC-NEXT:    cmovnel %ecx, %eax
60 ; GENERIC-NEXT:    shll $3, %eax
61 ; GENERIC-NEXT:    cmpl $32768, %eax ## imm = 0x8000
62 ; GENERIC-NEXT:    jge LBB1_1
63 ; GENERIC-NEXT:  ## %bb.2: ## %bb91
64 ; GENERIC-NEXT:    xorl %eax, %eax
65 ; GENERIC-NEXT:    popq %rcx
66 ; GENERIC-NEXT:    retq
67 ; GENERIC-NEXT:  LBB1_1: ## %bb90
68 ; GENERIC-NEXT:    ud2
69 ;
70 ; ATOM-LABEL: test2:
71 ; ATOM:       ## %bb.0: ## %entry
72 ; ATOM-NEXT:    pushq %rax
73 ; ATOM-NEXT:    callq _return_false
74 ; ATOM-NEXT:    xorl %ecx, %ecx
75 ; ATOM-NEXT:    movl $-480, %edx ## imm = 0xFE20
76 ; ATOM-NEXT:    testb $1, %al
77 ; ATOM-NEXT:    cmovnel %ecx, %edx
78 ; ATOM-NEXT:    shll $3, %edx
79 ; ATOM-NEXT:    cmpl $32768, %edx ## imm = 0x8000
80 ; ATOM-NEXT:    jge LBB1_1
81 ; ATOM-NEXT:  ## %bb.2: ## %bb91
82 ; ATOM-NEXT:    xorl %eax, %eax
83 ; ATOM-NEXT:    popq %rcx
84 ; ATOM-NEXT:    retq
85 ; ATOM-NEXT:  LBB1_1: ## %bb90
86 ; ATOM-NEXT:    ud2
87 ;
88 ; ATHLON-LABEL: test2:
89 ; ATHLON:       ## %bb.0: ## %entry
90 ; ATHLON-NEXT:    subl $12, %esp
91 ; ATHLON-NEXT:    calll _return_false
92 ; ATHLON-NEXT:    xorl %ecx, %ecx
93 ; ATHLON-NEXT:    testb $1, %al
94 ; ATHLON-NEXT:    movl $-480, %eax ## imm = 0xFE20
95 ; ATHLON-NEXT:    cmovnel %ecx, %eax
96 ; ATHLON-NEXT:    shll $3, %eax
97 ; ATHLON-NEXT:    cmpl $32768, %eax ## imm = 0x8000
98 ; ATHLON-NEXT:    jge LBB1_1
99 ; ATHLON-NEXT:  ## %bb.2: ## %bb91
100 ; ATHLON-NEXT:    xorl %eax, %eax
101 ; ATHLON-NEXT:    addl $12, %esp
102 ; ATHLON-NEXT:    retl
103 ; ATHLON-NEXT:  LBB1_1: ## %bb90
104 ; ATHLON-NEXT:    ud2
105 ;
106 ; MCU-LABEL: test2:
107 ; MCU:       # %bb.0: # %entry
108 ; MCU-NEXT:    calll return_false
109 ; MCU-NEXT:    xorl %ecx, %ecx
110 ; MCU-NEXT:    testb $1, %al
111 ; MCU-NEXT:    jne .LBB1_2
112 ; MCU-NEXT:  # %bb.1: # %entry
113 ; MCU-NEXT:    movl $-480, %ecx # imm = 0xFE20
114 ; MCU-NEXT:  .LBB1_2: # %entry
115 ; MCU-NEXT:    shll $3, %ecx
116 ; MCU-NEXT:    cmpl $32768, %ecx # imm = 0x8000
117 ; MCU-NEXT:    jge .LBB1_3
118 ; MCU-NEXT:  # %bb.4: # %bb91
119 ; MCU-NEXT:    xorl %eax, %eax
120 ; MCU-NEXT:    retl
121 ; MCU-NEXT:  .LBB1_3: # %bb90
122 entry:
123   %tmp73 = tail call i1 @return_false()
124   %g.0 = select i1 %tmp73, i16 0, i16 -480
125   %tmp7778 = sext i16 %g.0 to i32
126   %tmp80 = shl i32 %tmp7778, 3
127   %tmp87 = icmp sgt i32 %tmp80, 32767
128   br i1 %tmp87, label %bb90, label %bb91
129 bb90:
130   unreachable
131 bb91:
132   ret i32 0
133 }
134
135 declare i1 @return_false()
136
137 ;; Select between two floating point constants.
138 define float @test3(i32 %x) nounwind readnone {
139 ; GENERIC-LABEL: test3:
140 ; GENERIC:       ## %bb.0: ## %entry
141 ; GENERIC-NEXT:    xorl %eax, %eax
142 ; GENERIC-NEXT:    testl %edi, %edi
143 ; GENERIC-NEXT:    sete %al
144 ; GENERIC-NEXT:    leaq {{.*}}(%rip), %rcx
145 ; GENERIC-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
146 ; GENERIC-NEXT:    retq
147 ;
148 ; ATOM-LABEL: test3:
149 ; ATOM:       ## %bb.0: ## %entry
150 ; ATOM-NEXT:    xorl %eax, %eax
151 ; ATOM-NEXT:    leaq {{.*}}(%rip), %rcx
152 ; ATOM-NEXT:    testl %edi, %edi
153 ; ATOM-NEXT:    sete %al
154 ; ATOM-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
155 ; ATOM-NEXT:    retq
156 ;
157 ; ATHLON-LABEL: test3:
158 ; ATHLON:       ## %bb.0: ## %entry
159 ; ATHLON-NEXT:    xorl %eax, %eax
160 ; ATHLON-NEXT:    cmpl $0, {{[0-9]+}}(%esp)
161 ; ATHLON-NEXT:    sete %al
162 ; ATHLON-NEXT:    flds LCPI2_0(,%eax,4)
163 ; ATHLON-NEXT:    retl
164 ;
165 ; MCU-LABEL: test3:
166 ; MCU:       # %bb.0: # %entry
167 ; MCU-NEXT:    xorl %ecx, %ecx
168 ; MCU-NEXT:    testl %eax, %eax
169 ; MCU-NEXT:    sete %cl
170 ; MCU-NEXT:    flds {{\.LCPI.*}}(,%ecx,4)
171 ; MCU-NEXT:    retl
172 entry:
173   %0 = icmp eq i32 %x, 0
174   %iftmp.0.0 = select i1 %0, float 4.200000e+01, float 2.300000e+01
175   ret float %iftmp.0.0
176 }
177
178 define signext i8 @test4(i8* nocapture %P, double %F) nounwind readonly {
179 ; CHECK-LABEL: test4:
180 ; CHECK:       ## %bb.0: ## %entry
181 ; CHECK-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
182 ; CHECK-NEXT:    xorl %eax, %eax
183 ; CHECK-NEXT:    ucomisd %xmm0, %xmm1
184 ; CHECK-NEXT:    seta %al
185 ; CHECK-NEXT:    movsbl (%rdi,%rax,4), %eax
186 ; CHECK-NEXT:    retq
187 ;
188 ; ATHLON-LABEL: test4:
189 ; ATHLON:       ## %bb.0: ## %entry
190 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
191 ; ATHLON-NEXT:    fldl {{[0-9]+}}(%esp)
192 ; ATHLON-NEXT:    flds LCPI3_0
193 ; ATHLON-NEXT:    xorl %ecx, %ecx
194 ; ATHLON-NEXT:    fucompi %st(1)
195 ; ATHLON-NEXT:    fstp %st(0)
196 ; ATHLON-NEXT:    seta %cl
197 ; ATHLON-NEXT:    movsbl (%eax,%ecx,4), %eax
198 ; ATHLON-NEXT:    retl
199 ;
200 ; MCU-LABEL: test4:
201 ; MCU:       # %bb.0: # %entry
202 ; MCU-NEXT:    movl %eax, %ecx
203 ; MCU-NEXT:    fldl {{[0-9]+}}(%esp)
204 ; MCU-NEXT:    flds {{\.LCPI.*}}
205 ; MCU-NEXT:    fucompp
206 ; MCU-NEXT:    fnstsw %ax
207 ; MCU-NEXT:    xorl %edx, %edx
208 ; MCU-NEXT:    # kill: def $ah killed $ah killed $ax
209 ; MCU-NEXT:    sahf
210 ; MCU-NEXT:    seta %dl
211 ; MCU-NEXT:    movb (%ecx,%edx,4), %al
212 ; MCU-NEXT:    retl
213 entry:
214   %0 = fcmp olt double %F, 4.200000e+01
215   %iftmp.0.0 = select i1 %0, i32 4, i32 0
216   %1 = getelementptr i8, i8* %P, i32 %iftmp.0.0
217   %2 = load i8, i8* %1, align 1
218   ret i8 %2
219 }
220
221 define void @test5(i1 %c, <2 x i16> %a, <2 x i16> %b, <2 x i16>* %p) nounwind {
222 ; CHECK-LABEL: test5:
223 ; CHECK:       ## %bb.0:
224 ; CHECK-NEXT:    testb $1, %dil
225 ; CHECK-NEXT:    jne LBB4_2
226 ; CHECK-NEXT:  ## %bb.1:
227 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
228 ; CHECK-NEXT:  LBB4_2:
229 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
230 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
231 ; CHECK-NEXT:    movd %xmm0, (%rsi)
232 ; CHECK-NEXT:    retq
233 ;
234 ; ATHLON-LABEL: test5:
235 ; ATHLON:       ## %bb.0:
236 ; ATHLON-NEXT:    pushl %esi
237 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
238 ; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
239 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %ecx
240 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %edx
241 ; ATHLON-NEXT:    cmovnel %ecx, %edx
242 ; ATHLON-NEXT:    movzwl (%edx), %ecx
243 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %edx
244 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %esi
245 ; ATHLON-NEXT:    cmovnel %edx, %esi
246 ; ATHLON-NEXT:    movzwl (%esi), %edx
247 ; ATHLON-NEXT:    movw %dx, 2(%eax)
248 ; ATHLON-NEXT:    movw %cx, (%eax)
249 ; ATHLON-NEXT:    popl %esi
250 ; ATHLON-NEXT:    retl
251 ;
252 ; MCU-LABEL: test5:
253 ; MCU:       # %bb.0:
254 ; MCU-NEXT:    pushl %esi
255 ; MCU-NEXT:    movl {{[0-9]+}}(%esp), %esi
256 ; MCU-NEXT:    testb $1, %al
257 ; MCU-NEXT:    jne .LBB4_2
258 ; MCU-NEXT:  # %bb.1:
259 ; MCU-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
260 ; MCU-NEXT:    movzwl {{[0-9]+}}(%esp), %edx
261 ; MCU-NEXT:  .LBB4_2:
262 ; MCU-NEXT:    movw %cx, 2(%esi)
263 ; MCU-NEXT:    movw %dx, (%esi)
264 ; MCU-NEXT:    popl %esi
265 ; MCU-NEXT:    retl
266   %x = select i1 %c, <2 x i16> %a, <2 x i16> %b
267   store <2 x i16> %x, <2 x i16>* %p
268   ret void
269 }
270
271 ; Verify that the fmul gets sunk into the one part of the diamond where it is needed.
272 define void @test6(i32 %C, <4 x float>* %A, <4 x float>* %B) nounwind {
273 ; CHECK-LABEL: test6:
274 ; CHECK:       ## %bb.0:
275 ; CHECK-NEXT:    testl %edi, %edi
276 ; CHECK-NEXT:    je LBB5_1
277 ; CHECK-NEXT:  ## %bb.2:
278 ; CHECK-NEXT:    movaps (%rsi), %xmm0
279 ; CHECK-NEXT:    movaps %xmm0, (%rsi)
280 ; CHECK-NEXT:    retq
281 ; CHECK-NEXT:  LBB5_1:
282 ; CHECK-NEXT:    movaps (%rdx), %xmm0
283 ; CHECK-NEXT:    mulps %xmm0, %xmm0
284 ; CHECK-NEXT:    movaps %xmm0, (%rsi)
285 ; CHECK-NEXT:    retq
286 ;
287 ; ATHLON-LABEL: test6:
288 ; ATHLON:       ## %bb.0:
289 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
290 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
291 ; ATHLON-NEXT:    flds 12(%ecx)
292 ; ATHLON-NEXT:    flds 8(%ecx)
293 ; ATHLON-NEXT:    flds 4(%ecx)
294 ; ATHLON-NEXT:    flds (%ecx)
295 ; ATHLON-NEXT:    flds (%eax)
296 ; ATHLON-NEXT:    fmul %st(0), %st(0)
297 ; ATHLON-NEXT:    cmpl $0, {{[0-9]+}}(%esp)
298 ; ATHLON-NEXT:    fxch %st(1)
299 ; ATHLON-NEXT:    fcmove %st(1), %st(0)
300 ; ATHLON-NEXT:    fstp %st(1)
301 ; ATHLON-NEXT:    flds 4(%eax)
302 ; ATHLON-NEXT:    fmul %st(0), %st(0)
303 ; ATHLON-NEXT:    fxch %st(2)
304 ; ATHLON-NEXT:    fcmove %st(2), %st(0)
305 ; ATHLON-NEXT:    fstp %st(2)
306 ; ATHLON-NEXT:    flds 8(%eax)
307 ; ATHLON-NEXT:    fmul %st(0), %st(0)
308 ; ATHLON-NEXT:    fxch %st(3)
309 ; ATHLON-NEXT:    fcmove %st(3), %st(0)
310 ; ATHLON-NEXT:    fstp %st(3)
311 ; ATHLON-NEXT:    flds 12(%eax)
312 ; ATHLON-NEXT:    fmul %st(0), %st(0)
313 ; ATHLON-NEXT:    fxch %st(4)
314 ; ATHLON-NEXT:    fcmove %st(4), %st(0)
315 ; ATHLON-NEXT:    fstp %st(4)
316 ; ATHLON-NEXT:    fxch %st(3)
317 ; ATHLON-NEXT:    fstps 12(%ecx)
318 ; ATHLON-NEXT:    fxch %st(1)
319 ; ATHLON-NEXT:    fstps 8(%ecx)
320 ; ATHLON-NEXT:    fstps 4(%ecx)
321 ; ATHLON-NEXT:    fstps (%ecx)
322 ; ATHLON-NEXT:    retl
323 ;
324 ; MCU-LABEL: test6:
325 ; MCU:       # %bb.0:
326 ; MCU-NEXT:    pushl %eax
327 ; MCU-NEXT:    flds 12(%edx)
328 ; MCU-NEXT:    fstps (%esp) # 4-byte Folded Spill
329 ; MCU-NEXT:    flds 8(%edx)
330 ; MCU-NEXT:    flds 4(%edx)
331 ; MCU-NEXT:    flds (%ecx)
332 ; MCU-NEXT:    flds 4(%ecx)
333 ; MCU-NEXT:    flds 8(%ecx)
334 ; MCU-NEXT:    flds 12(%ecx)
335 ; MCU-NEXT:    fmul %st(0), %st(0)
336 ; MCU-NEXT:    fxch %st(1)
337 ; MCU-NEXT:    fmul %st(0), %st(0)
338 ; MCU-NEXT:    fxch %st(2)
339 ; MCU-NEXT:    fmul %st(0), %st(0)
340 ; MCU-NEXT:    fxch %st(3)
341 ; MCU-NEXT:    fmul %st(0), %st(0)
342 ; MCU-NEXT:    testl %eax, %eax
343 ; MCU-NEXT:    flds (%edx)
344 ; MCU-NEXT:    je .LBB5_2
345 ; MCU-NEXT:  # %bb.1:
346 ; MCU-NEXT:    fstp %st(1)
347 ; MCU-NEXT:    fstp %st(3)
348 ; MCU-NEXT:    fstp %st(1)
349 ; MCU-NEXT:    fstp %st(0)
350 ; MCU-NEXT:    flds (%esp) # 4-byte Folded Reload
351 ; MCU-NEXT:    fldz
352 ; MCU-NEXT:    fldz
353 ; MCU-NEXT:    fldz
354 ; MCU-NEXT:    fxch %st(1)
355 ; MCU-NEXT:    fxch %st(6)
356 ; MCU-NEXT:    fxch %st(1)
357 ; MCU-NEXT:    fxch %st(5)
358 ; MCU-NEXT:    fxch %st(4)
359 ; MCU-NEXT:    fxch %st(1)
360 ; MCU-NEXT:    fxch %st(3)
361 ; MCU-NEXT:    fxch %st(2)
362 ; MCU-NEXT:  .LBB5_2:
363 ; MCU-NEXT:    fstp %st(0)
364 ; MCU-NEXT:    fstp %st(5)
365 ; MCU-NEXT:    fstp %st(3)
366 ; MCU-NEXT:    fxch %st(2)
367 ; MCU-NEXT:    fstps 12(%edx)
368 ; MCU-NEXT:    fxch %st(1)
369 ; MCU-NEXT:    fstps 8(%edx)
370 ; MCU-NEXT:    fstps 4(%edx)
371 ; MCU-NEXT:    fstps (%edx)
372 ; MCU-NEXT:    popl %eax
373 ; MCU-NEXT:    retl
374   %tmp = load <4 x float>, <4 x float>* %A
375   %tmp3 = load <4 x float>, <4 x float>* %B
376   %tmp9 = fmul <4 x float> %tmp3, %tmp3
377   %tmp.upgrd.1 = icmp eq i32 %C, 0
378   %iftmp.38.0 = select i1 %tmp.upgrd.1, <4 x float> %tmp9, <4 x float> %tmp
379   store <4 x float> %iftmp.38.0, <4 x float>* %A
380   ret void
381 }
382
383 ; Select with fp80's
384 define x86_fp80 @test7(i32 %tmp8) nounwind {
385 ; GENERIC-LABEL: test7:
386 ; GENERIC:       ## %bb.0:
387 ; GENERIC-NEXT:    xorl %eax, %eax
388 ; GENERIC-NEXT:    testl %edi, %edi
389 ; GENERIC-NEXT:    setns %al
390 ; GENERIC-NEXT:    shlq $4, %rax
391 ; GENERIC-NEXT:    leaq {{.*}}(%rip), %rcx
392 ; GENERIC-NEXT:    fldt (%rax,%rcx)
393 ; GENERIC-NEXT:    retq
394 ;
395 ; ATOM-LABEL: test7:
396 ; ATOM:       ## %bb.0:
397 ; ATOM-NEXT:    xorl %eax, %eax
398 ; ATOM-NEXT:    leaq {{.*}}(%rip), %rcx
399 ; ATOM-NEXT:    testl %edi, %edi
400 ; ATOM-NEXT:    setns %al
401 ; ATOM-NEXT:    shlq $4, %rax
402 ; ATOM-NEXT:    fldt (%rax,%rcx)
403 ; ATOM-NEXT:    retq
404 ;
405 ; ATHLON-LABEL: test7:
406 ; ATHLON:       ## %bb.0:
407 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
408 ; ATHLON-NEXT:    notl %eax
409 ; ATHLON-NEXT:    shrl $27, %eax
410 ; ATHLON-NEXT:    andl $-16, %eax
411 ; ATHLON-NEXT:    fldt LCPI6_0(%eax)
412 ; ATHLON-NEXT:    retl
413 ;
414 ; MCU-LABEL: test7:
415 ; MCU:       # %bb.0:
416 ; MCU-NEXT:    notl %eax
417 ; MCU-NEXT:    shrl $27, %eax
418 ; MCU-NEXT:    andl $-16, %eax
419 ; MCU-NEXT:    fldt {{\.LCPI.*}}(%eax)
420 ; MCU-NEXT:    retl
421   %tmp9 = icmp sgt i32 %tmp8, -1
422   %retval = select i1 %tmp9, x86_fp80 0xK4005B400000000000000, x86_fp80 0xK40078700000000000000
423   ret x86_fp80 %retval
424 }
425
426 ; widening select v6i32 and then a sub
427 define void @test8(i1 %c, <6 x i32>* %dst.addr, <6 x i32> %src1,<6 x i32> %src2) nounwind {
428 ; GENERIC-LABEL: test8:
429 ; GENERIC:       ## %bb.0:
430 ; GENERIC-NEXT:    testb $1, %dil
431 ; GENERIC-NEXT:    jne LBB7_1
432 ; GENERIC-NEXT:  ## %bb.2:
433 ; GENERIC-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
434 ; GENERIC-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
435 ; GENERIC-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
436 ; GENERIC-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
437 ; GENERIC-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
438 ; GENERIC-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
439 ; GENERIC-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
440 ; GENERIC-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
441 ; GENERIC-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
442 ; GENERIC-NEXT:    jmp LBB7_3
443 ; GENERIC-NEXT:  LBB7_1:
444 ; GENERIC-NEXT:    movd %r9d, %xmm0
445 ; GENERIC-NEXT:    movd %r8d, %xmm1
446 ; GENERIC-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
447 ; GENERIC-NEXT:    movd %ecx, %xmm2
448 ; GENERIC-NEXT:    movd %edx, %xmm0
449 ; GENERIC-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
450 ; GENERIC-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
451 ; GENERIC-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
452 ; GENERIC-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
453 ; GENERIC-NEXT:  LBB7_3:
454 ; GENERIC-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
455 ; GENERIC-NEXT:    pcmpeqd %xmm2, %xmm2
456 ; GENERIC-NEXT:    paddd %xmm2, %xmm0
457 ; GENERIC-NEXT:    paddd %xmm2, %xmm1
458 ; GENERIC-NEXT:    movq %xmm1, 16(%rsi)
459 ; GENERIC-NEXT:    movdqa %xmm0, (%rsi)
460 ; GENERIC-NEXT:    retq
461 ;
462 ; ATOM-LABEL: test8:
463 ; ATOM:       ## %bb.0:
464 ; ATOM-NEXT:    testb $1, %dil
465 ; ATOM-NEXT:    jne LBB7_1
466 ; ATOM-NEXT:  ## %bb.2:
467 ; ATOM-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
468 ; ATOM-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
469 ; ATOM-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
470 ; ATOM-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
471 ; ATOM-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
472 ; ATOM-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
473 ; ATOM-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
474 ; ATOM-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
475 ; ATOM-NEXT:    jmp LBB7_3
476 ; ATOM-NEXT:  LBB7_1:
477 ; ATOM-NEXT:    movd %r9d, %xmm1
478 ; ATOM-NEXT:    movd %r8d, %xmm2
479 ; ATOM-NEXT:    movd %ecx, %xmm3
480 ; ATOM-NEXT:    movd %edx, %xmm0
481 ; ATOM-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
482 ; ATOM-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
483 ; ATOM-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
484 ; ATOM-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
485 ; ATOM-NEXT:  LBB7_3:
486 ; ATOM-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
487 ; ATOM-NEXT:    pcmpeqd %xmm2, %xmm2
488 ; ATOM-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
489 ; ATOM-NEXT:    paddd %xmm2, %xmm0
490 ; ATOM-NEXT:    paddd %xmm2, %xmm1
491 ; ATOM-NEXT:    movq %xmm1, 16(%rsi)
492 ; ATOM-NEXT:    movdqa %xmm0, (%rsi)
493 ; ATOM-NEXT:    retq
494 ;
495 ; ATHLON-LABEL: test8:
496 ; ATHLON:       ## %bb.0:
497 ; ATHLON-NEXT:    pushl %ebp
498 ; ATHLON-NEXT:    pushl %ebx
499 ; ATHLON-NEXT:    pushl %edi
500 ; ATHLON-NEXT:    pushl %esi
501 ; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
502 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %eax
503 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %ecx
504 ; ATHLON-NEXT:    cmovnel %eax, %ecx
505 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %eax
506 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %edx
507 ; ATHLON-NEXT:    cmovnel %eax, %edx
508 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %eax
509 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %esi
510 ; ATHLON-NEXT:    cmovnel %eax, %esi
511 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %eax
512 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %edi
513 ; ATHLON-NEXT:    cmovnel %eax, %edi
514 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %eax
515 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %ebx
516 ; ATHLON-NEXT:    cmovnel %eax, %ebx
517 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %eax
518 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %ebp
519 ; ATHLON-NEXT:    cmovnel %eax, %ebp
520 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
521 ; ATHLON-NEXT:    movl (%ecx), %ecx
522 ; ATHLON-NEXT:    movl (%edx), %edx
523 ; ATHLON-NEXT:    movl (%esi), %esi
524 ; ATHLON-NEXT:    movl (%edi), %edi
525 ; ATHLON-NEXT:    movl (%ebx), %ebx
526 ; ATHLON-NEXT:    movl (%ebp), %ebp
527 ; ATHLON-NEXT:    decl %ecx
528 ; ATHLON-NEXT:    movl %ecx, 20(%eax)
529 ; ATHLON-NEXT:    decl %edx
530 ; ATHLON-NEXT:    movl %edx, 16(%eax)
531 ; ATHLON-NEXT:    decl %esi
532 ; ATHLON-NEXT:    movl %esi, 12(%eax)
533 ; ATHLON-NEXT:    decl %edi
534 ; ATHLON-NEXT:    movl %edi, 8(%eax)
535 ; ATHLON-NEXT:    decl %ebx
536 ; ATHLON-NEXT:    movl %ebx, 4(%eax)
537 ; ATHLON-NEXT:    decl %ebp
538 ; ATHLON-NEXT:    movl %ebp, (%eax)
539 ; ATHLON-NEXT:    popl %esi
540 ; ATHLON-NEXT:    popl %edi
541 ; ATHLON-NEXT:    popl %ebx
542 ; ATHLON-NEXT:    popl %ebp
543 ; ATHLON-NEXT:    retl
544 ;
545 ; MCU-LABEL: test8:
546 ; MCU:       # %bb.0:
547 ; MCU-NEXT:    pushl %ebp
548 ; MCU-NEXT:    pushl %ebx
549 ; MCU-NEXT:    pushl %edi
550 ; MCU-NEXT:    pushl %esi
551 ; MCU-NEXT:    testb $1, %al
552 ; MCU-NEXT:    jne .LBB7_1
553 ; MCU-NEXT:  # %bb.2:
554 ; MCU-NEXT:    leal {{[0-9]+}}(%esp), %eax
555 ; MCU-NEXT:    movl (%eax), %eax
556 ; MCU-NEXT:    je .LBB7_5
557 ; MCU-NEXT:  .LBB7_4:
558 ; MCU-NEXT:    leal {{[0-9]+}}(%esp), %ecx
559 ; MCU-NEXT:    movl (%ecx), %ecx
560 ; MCU-NEXT:    je .LBB7_8
561 ; MCU-NEXT:  .LBB7_7:
562 ; MCU-NEXT:    leal {{[0-9]+}}(%esp), %esi
563 ; MCU-NEXT:    movl (%esi), %esi
564 ; MCU-NEXT:    je .LBB7_11
565 ; MCU-NEXT:  .LBB7_10:
566 ; MCU-NEXT:    leal {{[0-9]+}}(%esp), %edi
567 ; MCU-NEXT:    movl (%edi), %edi
568 ; MCU-NEXT:    je .LBB7_14
569 ; MCU-NEXT:  .LBB7_13:
570 ; MCU-NEXT:    leal {{[0-9]+}}(%esp), %ebx
571 ; MCU-NEXT:    movl (%ebx), %ebx
572 ; MCU-NEXT:    je .LBB7_17
573 ; MCU-NEXT:  .LBB7_16:
574 ; MCU-NEXT:    leal {{[0-9]+}}(%esp), %ebp
575 ; MCU-NEXT:    jmp .LBB7_18
576 ; MCU-NEXT:  .LBB7_1:
577 ; MCU-NEXT:    leal {{[0-9]+}}(%esp), %eax
578 ; MCU-NEXT:    movl (%eax), %eax
579 ; MCU-NEXT:    jne .LBB7_4
580 ; MCU-NEXT:  .LBB7_5:
581 ; MCU-NEXT:    leal {{[0-9]+}}(%esp), %ecx
582 ; MCU-NEXT:    movl (%ecx), %ecx
583 ; MCU-NEXT:    jne .LBB7_7
584 ; MCU-NEXT:  .LBB7_8:
585 ; MCU-NEXT:    leal {{[0-9]+}}(%esp), %esi
586 ; MCU-NEXT:    movl (%esi), %esi
587 ; MCU-NEXT:    jne .LBB7_10
588 ; MCU-NEXT:  .LBB7_11:
589 ; MCU-NEXT:    leal {{[0-9]+}}(%esp), %edi
590 ; MCU-NEXT:    movl (%edi), %edi
591 ; MCU-NEXT:    jne .LBB7_13
592 ; MCU-NEXT:  .LBB7_14:
593 ; MCU-NEXT:    leal {{[0-9]+}}(%esp), %ebx
594 ; MCU-NEXT:    movl (%ebx), %ebx
595 ; MCU-NEXT:    jne .LBB7_16
596 ; MCU-NEXT:  .LBB7_17:
597 ; MCU-NEXT:    leal {{[0-9]+}}(%esp), %ebp
598 ; MCU-NEXT:  .LBB7_18:
599 ; MCU-NEXT:    movl (%ebp), %ebp
600 ; MCU-NEXT:    decl %ebp
601 ; MCU-NEXT:    decl %ebx
602 ; MCU-NEXT:    decl %edi
603 ; MCU-NEXT:    decl %esi
604 ; MCU-NEXT:    decl %ecx
605 ; MCU-NEXT:    decl %eax
606 ; MCU-NEXT:    movl %eax, 20(%edx)
607 ; MCU-NEXT:    movl %ecx, 16(%edx)
608 ; MCU-NEXT:    movl %esi, 12(%edx)
609 ; MCU-NEXT:    movl %edi, 8(%edx)
610 ; MCU-NEXT:    movl %ebx, 4(%edx)
611 ; MCU-NEXT:    movl %ebp, (%edx)
612 ; MCU-NEXT:    popl %esi
613 ; MCU-NEXT:    popl %edi
614 ; MCU-NEXT:    popl %ebx
615 ; MCU-NEXT:    popl %ebp
616 ; MCU-NEXT:    retl
617   %x = select i1 %c, <6 x i32> %src1, <6 x i32> %src2
618   %val = sub <6 x i32> %x, < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 >
619   store <6 x i32> %val, <6 x i32>* %dst.addr
620   ret void
621 }
622
623
624 ;; Test integer select between values and constants.
625
626 define i64 @test9(i64 %x, i64 %y) nounwind readnone ssp noredzone {
627 ; CHECK-LABEL: test9:
628 ; CHECK:       ## %bb.0:
629 ; CHECK-NEXT:    xorl %eax, %eax
630 ; CHECK-NEXT:    cmpq $1, %rdi
631 ; CHECK-NEXT:    sbbq %rax, %rax
632 ; CHECK-NEXT:    orq %rsi, %rax
633 ; CHECK-NEXT:    retq
634 ;
635 ; ATHLON-LABEL: test9:
636 ; ATHLON:       ## %bb.0:
637 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
638 ; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %eax
639 ; ATHLON-NEXT:    movl $-1, %eax
640 ; ATHLON-NEXT:    movl $-1, %edx
641 ; ATHLON-NEXT:    je LBB8_2
642 ; ATHLON-NEXT:  ## %bb.1:
643 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
644 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %edx
645 ; ATHLON-NEXT:  LBB8_2:
646 ; ATHLON-NEXT:    retl
647 ;
648 ; MCU-LABEL: test9:
649 ; MCU:       # %bb.0:
650 ; MCU-NEXT:    orl %edx, %eax
651 ; MCU-NEXT:    jne .LBB8_1
652 ; MCU-NEXT:  # %bb.2:
653 ; MCU-NEXT:    movl $-1, %eax
654 ; MCU-NEXT:    movl $-1, %edx
655 ; MCU-NEXT:    retl
656 ; MCU-NEXT:  .LBB8_1:
657 ; MCU-NEXT:    movl {{[0-9]+}}(%esp), %eax
658 ; MCU-NEXT:    movl {{[0-9]+}}(%esp), %edx
659 ; MCU-NEXT:    retl
660   %cmp = icmp ne i64 %x, 0
661   %cond = select i1 %cmp, i64 %y, i64 -1
662   ret i64 %cond
663 }
664
665 ;; Same as test9
666 define i64 @test9a(i64 %x, i64 %y) nounwind readnone ssp noredzone {
667 ; CHECK-LABEL: test9a:
668 ; CHECK:       ## %bb.0:
669 ; CHECK-NEXT:    xorl %eax, %eax
670 ; CHECK-NEXT:    cmpq $1, %rdi
671 ; CHECK-NEXT:    sbbq %rax, %rax
672 ; CHECK-NEXT:    orq %rsi, %rax
673 ; CHECK-NEXT:    retq
674 ;
675 ; ATHLON-LABEL: test9a:
676 ; ATHLON:       ## %bb.0:
677 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
678 ; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %eax
679 ; ATHLON-NEXT:    movl $-1, %eax
680 ; ATHLON-NEXT:    movl $-1, %edx
681 ; ATHLON-NEXT:    je LBB9_2
682 ; ATHLON-NEXT:  ## %bb.1:
683 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
684 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %edx
685 ; ATHLON-NEXT:  LBB9_2:
686 ; ATHLON-NEXT:    retl
687 ;
688 ; MCU-LABEL: test9a:
689 ; MCU:       # %bb.0:
690 ; MCU-NEXT:    orl %edx, %eax
691 ; MCU-NEXT:    movl $-1, %eax
692 ; MCU-NEXT:    movl $-1, %edx
693 ; MCU-NEXT:    je .LBB9_2
694 ; MCU-NEXT:  # %bb.1:
695 ; MCU-NEXT:    movl {{[0-9]+}}(%esp), %eax
696 ; MCU-NEXT:    movl {{[0-9]+}}(%esp), %edx
697 ; MCU-NEXT:  .LBB9_2:
698 ; MCU-NEXT:    retl
699   %cmp = icmp eq i64 %x, 0
700   %cond = select i1 %cmp, i64 -1, i64 %y
701   ret i64 %cond
702 }
703
704 define i64 @test9b(i64 %x, i64 %y) nounwind readnone ssp noredzone {
705 ; GENERIC-LABEL: test9b:
706 ; GENERIC:       ## %bb.0:
707 ; GENERIC-NEXT:    cmpq $1, %rdi
708 ; GENERIC-NEXT:    sbbq %rax, %rax
709 ; GENERIC-NEXT:    orq %rsi, %rax
710 ; GENERIC-NEXT:    retq
711 ;
712 ; ATOM-LABEL: test9b:
713 ; ATOM:       ## %bb.0:
714 ; ATOM-NEXT:    cmpq $1, %rdi
715 ; ATOM-NEXT:    sbbq %rax, %rax
716 ; ATOM-NEXT:    orq %rsi, %rax
717 ; ATOM-NEXT:    nop
718 ; ATOM-NEXT:    nop
719 ; ATOM-NEXT:    retq
720 ;
721 ; ATHLON-LABEL: test9b:
722 ; ATHLON:       ## %bb.0:
723 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
724 ; ATHLON-NEXT:    xorl %edx, %edx
725 ; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %eax
726 ; ATHLON-NEXT:    sete %dl
727 ; ATHLON-NEXT:    negl %edx
728 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
729 ; ATHLON-NEXT:    orl %edx, %eax
730 ; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %edx
731 ; ATHLON-NEXT:    retl
732 ;
733 ; MCU-LABEL: test9b:
734 ; MCU:       # %bb.0:
735 ; MCU-NEXT:    movl %edx, %ecx
736 ; MCU-NEXT:    xorl %edx, %edx
737 ; MCU-NEXT:    orl %ecx, %eax
738 ; MCU-NEXT:    sete %dl
739 ; MCU-NEXT:    negl %edx
740 ; MCU-NEXT:    movl {{[0-9]+}}(%esp), %eax
741 ; MCU-NEXT:    orl %edx, %eax
742 ; MCU-NEXT:    orl {{[0-9]+}}(%esp), %edx
743 ; MCU-NEXT:    retl
744   %cmp = icmp eq i64 %x, 0
745   %A = sext i1 %cmp to i64
746   %cond = or i64 %y, %A
747   ret i64 %cond
748 }
749
750 ;; Select between -1 and 1.
751 define i64 @test10(i64 %x, i64 %y) nounwind readnone ssp noredzone {
752 ; CHECK-LABEL: test10:
753 ; CHECK:       ## %bb.0:
754 ; CHECK-NEXT:    xorl %eax, %eax
755 ; CHECK-NEXT:    testq %rdi, %rdi
756 ; CHECK-NEXT:    setne %al
757 ; CHECK-NEXT:    leaq -1(%rax,%rax), %rax
758 ; CHECK-NEXT:    retq
759 ;
760 ; ATHLON-LABEL: test10:
761 ; ATHLON:       ## %bb.0:
762 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
763 ; ATHLON-NEXT:    xorl %edx, %edx
764 ; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %eax
765 ; ATHLON-NEXT:    movl $-1, %ecx
766 ; ATHLON-NEXT:    movl $1, %eax
767 ; ATHLON-NEXT:    cmovel %ecx, %eax
768 ; ATHLON-NEXT:    cmovel %ecx, %edx
769 ; ATHLON-NEXT:    retl
770 ;
771 ; MCU-LABEL: test10:
772 ; MCU:       # %bb.0:
773 ; MCU-NEXT:    orl %edx, %eax
774 ; MCU-NEXT:    movl $-1, %eax
775 ; MCU-NEXT:    movl $-1, %edx
776 ; MCU-NEXT:    je .LBB11_2
777 ; MCU-NEXT:  # %bb.1:
778 ; MCU-NEXT:    xorl %edx, %edx
779 ; MCU-NEXT:    movl $1, %eax
780 ; MCU-NEXT:  .LBB11_2:
781 ; MCU-NEXT:    retl
782   %cmp = icmp eq i64 %x, 0
783   %cond = select i1 %cmp, i64 -1, i64 1
784   ret i64 %cond
785 }
786
787 define i64 @test11(i64 %x, i64 %y) nounwind readnone ssp noredzone {
788 ; CHECK-LABEL: test11:
789 ; CHECK:       ## %bb.0:
790 ; CHECK-NEXT:    xorl %eax, %eax
791 ; CHECK-NEXT:    cmpq $1, %rdi
792 ; CHECK-NEXT:    sbbq %rax, %rax
793 ; CHECK-NEXT:    notq %rax
794 ; CHECK-NEXT:    orq %rsi, %rax
795 ; CHECK-NEXT:    retq
796 ;
797 ; ATHLON-LABEL: test11:
798 ; ATHLON:       ## %bb.0:
799 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
800 ; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %eax
801 ; ATHLON-NEXT:    movl $-1, %eax
802 ; ATHLON-NEXT:    movl $-1, %edx
803 ; ATHLON-NEXT:    jne LBB12_2
804 ; ATHLON-NEXT:  ## %bb.1:
805 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
806 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %edx
807 ; ATHLON-NEXT:  LBB12_2:
808 ; ATHLON-NEXT:    retl
809 ;
810 ; MCU-LABEL: test11:
811 ; MCU:       # %bb.0:
812 ; MCU-NEXT:    orl %edx, %eax
813 ; MCU-NEXT:    je .LBB12_1
814 ; MCU-NEXT:  # %bb.2:
815 ; MCU-NEXT:    movl $-1, %eax
816 ; MCU-NEXT:    movl $-1, %edx
817 ; MCU-NEXT:    retl
818 ; MCU-NEXT:  .LBB12_1:
819 ; MCU-NEXT:    movl {{[0-9]+}}(%esp), %eax
820 ; MCU-NEXT:    movl {{[0-9]+}}(%esp), %edx
821 ; MCU-NEXT:    retl
822   %cmp = icmp eq i64 %x, 0
823   %cond = select i1 %cmp, i64 %y, i64 -1
824   ret i64 %cond
825 }
826
827 define i64 @test11a(i64 %x, i64 %y) nounwind readnone ssp noredzone {
828 ; CHECK-LABEL: test11a:
829 ; CHECK:       ## %bb.0:
830 ; CHECK-NEXT:    xorl %eax, %eax
831 ; CHECK-NEXT:    cmpq $1, %rdi
832 ; CHECK-NEXT:    sbbq %rax, %rax
833 ; CHECK-NEXT:    notq %rax
834 ; CHECK-NEXT:    orq %rsi, %rax
835 ; CHECK-NEXT:    retq
836 ;
837 ; ATHLON-LABEL: test11a:
838 ; ATHLON:       ## %bb.0:
839 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
840 ; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %eax
841 ; ATHLON-NEXT:    movl $-1, %eax
842 ; ATHLON-NEXT:    movl $-1, %edx
843 ; ATHLON-NEXT:    jne LBB13_2
844 ; ATHLON-NEXT:  ## %bb.1:
845 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
846 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %edx
847 ; ATHLON-NEXT:  LBB13_2:
848 ; ATHLON-NEXT:    retl
849 ;
850 ; MCU-LABEL: test11a:
851 ; MCU:       # %bb.0:
852 ; MCU-NEXT:    orl %edx, %eax
853 ; MCU-NEXT:    movl $-1, %eax
854 ; MCU-NEXT:    movl $-1, %edx
855 ; MCU-NEXT:    jne .LBB13_2
856 ; MCU-NEXT:  # %bb.1:
857 ; MCU-NEXT:    movl {{[0-9]+}}(%esp), %eax
858 ; MCU-NEXT:    movl {{[0-9]+}}(%esp), %edx
859 ; MCU-NEXT:  .LBB13_2:
860 ; MCU-NEXT:    retl
861   %cmp = icmp ne i64 %x, 0
862   %cond = select i1 %cmp, i64 -1, i64 %y
863   ret i64 %cond
864 }
865
866 define i32 @test13(i32 %a, i32 %b) nounwind {
867 ; GENERIC-LABEL: test13:
868 ; GENERIC:       ## %bb.0:
869 ; GENERIC-NEXT:    cmpl %esi, %edi
870 ; GENERIC-NEXT:    sbbl %eax, %eax
871 ; GENERIC-NEXT:    retq
872 ;
873 ; ATOM-LABEL: test13:
874 ; ATOM:       ## %bb.0:
875 ; ATOM-NEXT:    cmpl %esi, %edi
876 ; ATOM-NEXT:    sbbl %eax, %eax
877 ; ATOM-NEXT:    nop
878 ; ATOM-NEXT:    nop
879 ; ATOM-NEXT:    nop
880 ; ATOM-NEXT:    nop
881 ; ATOM-NEXT:    retq
882 ;
883 ; ATHLON-LABEL: test13:
884 ; ATHLON:       ## %bb.0:
885 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
886 ; ATHLON-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
887 ; ATHLON-NEXT:    sbbl %eax, %eax
888 ; ATHLON-NEXT:    retl
889 ;
890 ; MCU-LABEL: test13:
891 ; MCU:       # %bb.0:
892 ; MCU-NEXT:    cmpl %edx, %eax
893 ; MCU-NEXT:    sbbl %eax, %eax
894 ; MCU-NEXT:    retl
895   %c = icmp ult i32 %a, %b
896   %d = sext i1 %c to i32
897   ret i32 %d
898 }
899
900 define i32 @test14(i32 %a, i32 %b) nounwind {
901 ; CHECK-LABEL: test14:
902 ; CHECK:       ## %bb.0:
903 ; CHECK-NEXT:    xorl %eax, %eax
904 ; CHECK-NEXT:    cmpl %esi, %edi
905 ; CHECK-NEXT:    setae %al
906 ; CHECK-NEXT:    negl %eax
907 ; CHECK-NEXT:    retq
908 ;
909 ; ATHLON-LABEL: test14:
910 ; ATHLON:       ## %bb.0:
911 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
912 ; ATHLON-NEXT:    xorl %eax, %eax
913 ; ATHLON-NEXT:    cmpl {{[0-9]+}}(%esp), %ecx
914 ; ATHLON-NEXT:    setae %al
915 ; ATHLON-NEXT:    negl %eax
916 ; ATHLON-NEXT:    retl
917 ;
918 ; MCU-LABEL: test14:
919 ; MCU:       # %bb.0:
920 ; MCU-NEXT:    xorl %ecx, %ecx
921 ; MCU-NEXT:    cmpl %edx, %eax
922 ; MCU-NEXT:    setae %cl
923 ; MCU-NEXT:    negl %ecx
924 ; MCU-NEXT:    movl %ecx, %eax
925 ; MCU-NEXT:    retl
926   %c = icmp uge i32 %a, %b
927   %d = sext i1 %c to i32
928   ret i32 %d
929 }
930
931 ; rdar://10961709
932 define i32 @test15(i32 %x) nounwind {
933 ; GENERIC-LABEL: test15:
934 ; GENERIC:       ## %bb.0: ## %entry
935 ; GENERIC-NEXT:    negl %edi
936 ; GENERIC-NEXT:    sbbl %eax, %eax
937 ; GENERIC-NEXT:    retq
938 ;
939 ; ATOM-LABEL: test15:
940 ; ATOM:       ## %bb.0: ## %entry
941 ; ATOM-NEXT:    negl %edi
942 ; ATOM-NEXT:    sbbl %eax, %eax
943 ; ATOM-NEXT:    nop
944 ; ATOM-NEXT:    nop
945 ; ATOM-NEXT:    nop
946 ; ATOM-NEXT:    nop
947 ; ATOM-NEXT:    retq
948 ;
949 ; ATHLON-LABEL: test15:
950 ; ATHLON:       ## %bb.0: ## %entry
951 ; ATHLON-NEXT:    xorl %eax, %eax
952 ; ATHLON-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
953 ; ATHLON-NEXT:    sbbl %eax, %eax
954 ; ATHLON-NEXT:    retl
955 ;
956 ; MCU-LABEL: test15:
957 ; MCU:       # %bb.0: # %entry
958 ; MCU-NEXT:    negl %eax
959 ; MCU-NEXT:    sbbl %eax, %eax
960 ; MCU-NEXT:    retl
961 entry:
962   %cmp = icmp ne i32 %x, 0
963   %sub = sext i1 %cmp to i32
964   ret i32 %sub
965 }
966
967 define i64 @test16(i64 %x) nounwind uwtable readnone ssp {
968 ; GENERIC-LABEL: test16:
969 ; GENERIC:       ## %bb.0: ## %entry
970 ; GENERIC-NEXT:    negq %rdi
971 ; GENERIC-NEXT:    sbbq %rax, %rax
972 ; GENERIC-NEXT:    retq
973 ;
974 ; ATOM-LABEL: test16:
975 ; ATOM:       ## %bb.0: ## %entry
976 ; ATOM-NEXT:    negq %rdi
977 ; ATOM-NEXT:    sbbq %rax, %rax
978 ; ATOM-NEXT:    nop
979 ; ATOM-NEXT:    nop
980 ; ATOM-NEXT:    nop
981 ; ATOM-NEXT:    nop
982 ; ATOM-NEXT:    retq
983 ;
984 ; ATHLON-LABEL: test16:
985 ; ATHLON:       ## %bb.0: ## %entry
986 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
987 ; ATHLON-NEXT:    xorl %eax, %eax
988 ; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %ecx
989 ; ATHLON-NEXT:    setne %al
990 ; ATHLON-NEXT:    negl %eax
991 ; ATHLON-NEXT:    movl %eax, %edx
992 ; ATHLON-NEXT:    retl
993 ;
994 ; MCU-LABEL: test16:
995 ; MCU:       # %bb.0: # %entry
996 ; MCU-NEXT:    movl %eax, %ecx
997 ; MCU-NEXT:    xorl %eax, %eax
998 ; MCU-NEXT:    orl %edx, %ecx
999 ; MCU-NEXT:    setne %al
1000 ; MCU-NEXT:    negl %eax
1001 ; MCU-NEXT:    movl %eax, %edx
1002 ; MCU-NEXT:    retl
1003 entry:
1004   %cmp = icmp ne i64 %x, 0
1005   %conv1 = sext i1 %cmp to i64
1006   ret i64 %conv1
1007 }
1008
1009 define i16 @test17(i16 %x) nounwind {
1010 ; GENERIC-LABEL: test17:
1011 ; GENERIC:       ## %bb.0: ## %entry
1012 ; GENERIC-NEXT:    negw %di
1013 ; GENERIC-NEXT:    sbbl %eax, %eax
1014 ; GENERIC-NEXT:    ## kill: def $ax killed $ax killed $eax
1015 ; GENERIC-NEXT:    retq
1016 ;
1017 ; ATOM-LABEL: test17:
1018 ; ATOM:       ## %bb.0: ## %entry
1019 ; ATOM-NEXT:    negw %di
1020 ; ATOM-NEXT:    sbbl %eax, %eax
1021 ; ATOM-NEXT:    ## kill: def $ax killed $ax killed $eax
1022 ; ATOM-NEXT:    nop
1023 ; ATOM-NEXT:    nop
1024 ; ATOM-NEXT:    nop
1025 ; ATOM-NEXT:    nop
1026 ; ATOM-NEXT:    retq
1027 ;
1028 ; ATHLON-LABEL: test17:
1029 ; ATHLON:       ## %bb.0: ## %entry
1030 ; ATHLON-NEXT:    xorl %eax, %eax
1031 ; ATHLON-NEXT:    cmpw {{[0-9]+}}(%esp), %ax
1032 ; ATHLON-NEXT:    sbbl %eax, %eax
1033 ; ATHLON-NEXT:    ## kill: def $ax killed $ax killed $eax
1034 ; ATHLON-NEXT:    retl
1035 ;
1036 ; MCU-LABEL: test17:
1037 ; MCU:       # %bb.0: # %entry
1038 ; MCU-NEXT:    negw %ax
1039 ; MCU-NEXT:    sbbl %eax, %eax
1040 ; MCU-NEXT:    # kill: def $ax killed $ax killed $eax
1041 ; MCU-NEXT:    retl
1042 entry:
1043   %cmp = icmp ne i16 %x, 0
1044   %sub = sext i1 %cmp to i16
1045   ret i16 %sub
1046 }
1047
1048 define i8 @test18(i32 %x, i8 zeroext %a, i8 zeroext %b) nounwind {
1049 ; GENERIC-LABEL: test18:
1050 ; GENERIC:       ## %bb.0:
1051 ; GENERIC-NEXT:    movl %esi, %eax
1052 ; GENERIC-NEXT:    cmpl $15, %edi
1053 ; GENERIC-NEXT:    cmovgel %edx, %eax
1054 ; GENERIC-NEXT:    ## kill: def $al killed $al killed $eax
1055 ; GENERIC-NEXT:    retq
1056 ;
1057 ; ATOM-LABEL: test18:
1058 ; ATOM:       ## %bb.0:
1059 ; ATOM-NEXT:    movl %esi, %eax
1060 ; ATOM-NEXT:    cmpl $15, %edi
1061 ; ATOM-NEXT:    cmovgel %edx, %eax
1062 ; ATOM-NEXT:    ## kill: def $al killed $al killed $eax
1063 ; ATOM-NEXT:    nop
1064 ; ATOM-NEXT:    nop
1065 ; ATOM-NEXT:    retq
1066 ;
1067 ; ATHLON-LABEL: test18:
1068 ; ATHLON:       ## %bb.0:
1069 ; ATHLON-NEXT:    cmpl $15, {{[0-9]+}}(%esp)
1070 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %eax
1071 ; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %ecx
1072 ; ATHLON-NEXT:    cmovll %eax, %ecx
1073 ; ATHLON-NEXT:    movb (%ecx), %al
1074 ; ATHLON-NEXT:    retl
1075 ;
1076 ; MCU-LABEL: test18:
1077 ; MCU:       # %bb.0:
1078 ; MCU-NEXT:    cmpl $15, %eax
1079 ; MCU-NEXT:    jl .LBB19_2
1080 ; MCU-NEXT:  # %bb.1:
1081 ; MCU-NEXT:    movl %ecx, %edx
1082 ; MCU-NEXT:  .LBB19_2:
1083 ; MCU-NEXT:    movl %edx, %eax
1084 ; MCU-NEXT:    retl
1085   %cmp = icmp slt i32 %x, 15
1086   %sel = select i1 %cmp, i8 %a, i8 %b
1087   ret i8 %sel
1088 }
1089
1090 define i32 @trunc_select_miscompile(i32 %a, i1 zeroext %cc) {
1091 ; CHECK-LABEL: trunc_select_miscompile:
1092 ; CHECK:       ## %bb.0:
1093 ; CHECK-NEXT:    movl %esi, %ecx
1094 ; CHECK-NEXT:    movl %edi, %eax
1095 ; CHECK-NEXT:    orb $2, %cl
1096 ; CHECK-NEXT:    ## kill: def $cl killed $cl killed $ecx
1097 ; CHECK-NEXT:    shll %cl, %eax
1098 ; CHECK-NEXT:    retq
1099 ;
1100 ; ATHLON-LABEL: trunc_select_miscompile:
1101 ; ATHLON:       ## %bb.0:
1102 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1103 ; ATHLON-NEXT:    movb {{[0-9]+}}(%esp), %cl
1104 ; ATHLON-NEXT:    orb $2, %cl
1105 ; ATHLON-NEXT:    shll %cl, %eax
1106 ; ATHLON-NEXT:    retl
1107 ;
1108 ; MCU-LABEL: trunc_select_miscompile:
1109 ; MCU:       # %bb.0:
1110 ; MCU-NEXT:    movl %edx, %ecx
1111 ; MCU-NEXT:    orb $2, %cl
1112 ; MCU-NEXT:    # kill: def $cl killed $cl killed $ecx
1113 ; MCU-NEXT:    shll %cl, %eax
1114 ; MCU-NEXT:    retl
1115   %tmp1 = select i1 %cc, i32 3, i32 2
1116   %tmp2 = shl i32 %a, %tmp1
1117   ret i32 %tmp2
1118 }
1119
1120 ; reproducer for pr29002
1121 define void @clamp_i8(i32 %src, i8* %dst) {
1122 ; GENERIC-LABEL: clamp_i8:
1123 ; GENERIC:       ## %bb.0:
1124 ; GENERIC-NEXT:    cmpl $127, %edi
1125 ; GENERIC-NEXT:    movl $127, %eax
1126 ; GENERIC-NEXT:    cmovlel %edi, %eax
1127 ; GENERIC-NEXT:    cmpl $-128, %eax
1128 ; GENERIC-NEXT:    movb $-128, %cl
1129 ; GENERIC-NEXT:    jl LBB21_2
1130 ; GENERIC-NEXT:  ## %bb.1:
1131 ; GENERIC-NEXT:    movl %eax, %ecx
1132 ; GENERIC-NEXT:  LBB21_2:
1133 ; GENERIC-NEXT:    movb %cl, (%rsi)
1134 ; GENERIC-NEXT:    retq
1135 ;
1136 ; ATOM-LABEL: clamp_i8:
1137 ; ATOM:       ## %bb.0:
1138 ; ATOM-NEXT:    cmpl $127, %edi
1139 ; ATOM-NEXT:    movl $127, %eax
1140 ; ATOM-NEXT:    movb $-128, %cl
1141 ; ATOM-NEXT:    cmovlel %edi, %eax
1142 ; ATOM-NEXT:    cmpl $-128, %eax
1143 ; ATOM-NEXT:    jl LBB21_2
1144 ; ATOM-NEXT:  ## %bb.1:
1145 ; ATOM-NEXT:    movl %eax, %ecx
1146 ; ATOM-NEXT:  LBB21_2:
1147 ; ATOM-NEXT:    movb %cl, (%rsi)
1148 ; ATOM-NEXT:    retq
1149 ;
1150 ; ATHLON-LABEL: clamp_i8:
1151 ; ATHLON:       ## %bb.0:
1152 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1153 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %edx
1154 ; ATHLON-NEXT:    cmpl $127, %edx
1155 ; ATHLON-NEXT:    movl $127, %ecx
1156 ; ATHLON-NEXT:    cmovlel %edx, %ecx
1157 ; ATHLON-NEXT:    cmpl $-128, %ecx
1158 ; ATHLON-NEXT:    movb $-128, %dl
1159 ; ATHLON-NEXT:    jl LBB21_2
1160 ; ATHLON-NEXT:  ## %bb.1:
1161 ; ATHLON-NEXT:    movl %ecx, %edx
1162 ; ATHLON-NEXT:  LBB21_2:
1163 ; ATHLON-NEXT:    movb %dl, (%eax)
1164 ; ATHLON-NEXT:    retl
1165 ;
1166 ; MCU-LABEL: clamp_i8:
1167 ; MCU:       # %bb.0:
1168 ; MCU-NEXT:    cmpl $127, %eax
1169 ; MCU-NEXT:    movl $127, %ecx
1170 ; MCU-NEXT:    jg .LBB21_2
1171 ; MCU-NEXT:  # %bb.1:
1172 ; MCU-NEXT:    movl %eax, %ecx
1173 ; MCU-NEXT:  .LBB21_2:
1174 ; MCU-NEXT:    cmpl $-128, %ecx
1175 ; MCU-NEXT:    movb $-128, %al
1176 ; MCU-NEXT:    jl .LBB21_4
1177 ; MCU-NEXT:  # %bb.3:
1178 ; MCU-NEXT:    movl %ecx, %eax
1179 ; MCU-NEXT:  .LBB21_4:
1180 ; MCU-NEXT:    movb %al, (%edx)
1181 ; MCU-NEXT:    retl
1182   %cmp = icmp sgt i32 %src, 127
1183   %sel1 = select i1 %cmp, i32 127, i32 %src
1184   %cmp1 = icmp slt i32 %sel1, -128
1185   %sel2 = select i1 %cmp1, i32 -128, i32 %sel1
1186   %conv = trunc i32 %sel2 to i8
1187   store i8 %conv, i8* %dst, align 2
1188   ret void
1189 }
1190
1191 ; reproducer for pr29002
1192 define void @clamp(i32 %src, i16* %dst) {
1193 ; GENERIC-LABEL: clamp:
1194 ; GENERIC:       ## %bb.0:
1195 ; GENERIC-NEXT:    cmpl $32767, %edi ## imm = 0x7FFF
1196 ; GENERIC-NEXT:    movl $32767, %eax ## imm = 0x7FFF
1197 ; GENERIC-NEXT:    cmovlel %edi, %eax
1198 ; GENERIC-NEXT:    cmpl $-32768, %eax ## imm = 0x8000
1199 ; GENERIC-NEXT:    movl $32768, %ecx ## imm = 0x8000
1200 ; GENERIC-NEXT:    cmovgel %eax, %ecx
1201 ; GENERIC-NEXT:    movw %cx, (%rsi)
1202 ; GENERIC-NEXT:    retq
1203 ;
1204 ; ATOM-LABEL: clamp:
1205 ; ATOM:       ## %bb.0:
1206 ; ATOM-NEXT:    cmpl $32767, %edi ## imm = 0x7FFF
1207 ; ATOM-NEXT:    movl $32767, %eax ## imm = 0x7FFF
1208 ; ATOM-NEXT:    movl $32768, %ecx ## imm = 0x8000
1209 ; ATOM-NEXT:    cmovlel %edi, %eax
1210 ; ATOM-NEXT:    cmpl $-32768, %eax ## imm = 0x8000
1211 ; ATOM-NEXT:    cmovgel %eax, %ecx
1212 ; ATOM-NEXT:    movw %cx, (%rsi)
1213 ; ATOM-NEXT:    retq
1214 ;
1215 ; ATHLON-LABEL: clamp:
1216 ; ATHLON:       ## %bb.0:
1217 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1218 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1219 ; ATHLON-NEXT:    cmpl $32767, %ecx ## imm = 0x7FFF
1220 ; ATHLON-NEXT:    movl $32767, %edx ## imm = 0x7FFF
1221 ; ATHLON-NEXT:    cmovlel %ecx, %edx
1222 ; ATHLON-NEXT:    cmpl $-32768, %edx ## imm = 0x8000
1223 ; ATHLON-NEXT:    movl $32768, %ecx ## imm = 0x8000
1224 ; ATHLON-NEXT:    cmovgel %edx, %ecx
1225 ; ATHLON-NEXT:    movw %cx, (%eax)
1226 ; ATHLON-NEXT:    retl
1227 ;
1228 ; MCU-LABEL: clamp:
1229 ; MCU:       # %bb.0:
1230 ; MCU-NEXT:    cmpl $32767, %eax # imm = 0x7FFF
1231 ; MCU-NEXT:    movl $32767, %ecx # imm = 0x7FFF
1232 ; MCU-NEXT:    jg .LBB22_2
1233 ; MCU-NEXT:  # %bb.1:
1234 ; MCU-NEXT:    movl %eax, %ecx
1235 ; MCU-NEXT:  .LBB22_2:
1236 ; MCU-NEXT:    cmpl $-32768, %ecx # imm = 0x8000
1237 ; MCU-NEXT:    movl $32768, %eax # imm = 0x8000
1238 ; MCU-NEXT:    jl .LBB22_4
1239 ; MCU-NEXT:  # %bb.3:
1240 ; MCU-NEXT:    movl %ecx, %eax
1241 ; MCU-NEXT:  .LBB22_4:
1242 ; MCU-NEXT:    movw %ax, (%edx)
1243 ; MCU-NEXT:    retl
1244   %cmp = icmp sgt i32 %src, 32767
1245   %sel1 = select i1 %cmp, i32 32767, i32 %src
1246   %cmp1 = icmp slt i32 %sel1, -32768
1247   %sel2 = select i1 %cmp1, i32 -32768, i32 %sel1
1248   %conv = trunc i32 %sel2 to i16
1249   store i16 %conv, i16* %dst, align 2
1250   ret void
1251 }
1252
1253 define void @test19() {
1254 ; This is a massive reduction of an llvm-stress test case that generates
1255 ; interesting chains feeding setcc and eventually a f32 select operation. This
1256 ; is intended to exercise the SELECT formation in the DAG combine simplifying
1257 ; a simplified select_cc node. If it it regresses and is no longer triggering
1258 ; that code path, it can be deleted.
1259 ;
1260 ; CHECK-LABEL: test19:
1261 ; CHECK:       ## %bb.0: ## %BB
1262 ; CHECK-NEXT:    movl $-1, %eax
1263 ; CHECK-NEXT:    movb $1, %cl
1264 ; CHECK-NEXT:    .p2align 4, 0x90
1265 ; CHECK-NEXT:  LBB23_1: ## %CF
1266 ; CHECK-NEXT:    ## =>This Inner Loop Header: Depth=1
1267 ; CHECK-NEXT:    testb %cl, %cl
1268 ; CHECK-NEXT:    jne LBB23_1
1269 ; CHECK-NEXT:  ## %bb.2: ## %CF250
1270 ; CHECK-NEXT:    ## in Loop: Header=BB23_1 Depth=1
1271 ; CHECK-NEXT:    jne LBB23_1
1272 ; CHECK-NEXT:    .p2align 4, 0x90
1273 ; CHECK-NEXT:  LBB23_3: ## %CF242
1274 ; CHECK-NEXT:    ## =>This Inner Loop Header: Depth=1
1275 ; CHECK-NEXT:    cmpl %eax, %eax
1276 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0
1277 ; CHECK-NEXT:    jp LBB23_3
1278 ; CHECK-NEXT:  ## %bb.4: ## %CF244
1279 ; CHECK-NEXT:    retq
1280 ;
1281 ; ATHLON-LABEL: test19:
1282 ; ATHLON:       ## %bb.0: ## %BB
1283 ; ATHLON-NEXT:    movb $1, %al
1284 ; ATHLON-NEXT:    .p2align 4, 0x90
1285 ; ATHLON-NEXT:  LBB23_1: ## %CF
1286 ; ATHLON-NEXT:    ## =>This Inner Loop Header: Depth=1
1287 ; ATHLON-NEXT:    testb %al, %al
1288 ; ATHLON-NEXT:    jne LBB23_1
1289 ; ATHLON-NEXT:  ## %bb.2: ## %CF250
1290 ; ATHLON-NEXT:    ## in Loop: Header=BB23_1 Depth=1
1291 ; ATHLON-NEXT:    jne LBB23_1
1292 ; ATHLON-NEXT:  ## %bb.3: ## %CF242.preheader
1293 ; ATHLON-NEXT:    fldz
1294 ; ATHLON-NEXT:    .p2align 4, 0x90
1295 ; ATHLON-NEXT:  LBB23_4: ## %CF242
1296 ; ATHLON-NEXT:    ## =>This Inner Loop Header: Depth=1
1297 ; ATHLON-NEXT:    fucomi %st(0)
1298 ; ATHLON-NEXT:    jp LBB23_4
1299 ; ATHLON-NEXT:  ## %bb.5: ## %CF244
1300 ; ATHLON-NEXT:    fstp %st(0)
1301 ; ATHLON-NEXT:    retl
1302 ;
1303 ; MCU-LABEL: test19:
1304 ; MCU:       # %bb.0: # %BB
1305 ; MCU-NEXT:    movl $-1, %ecx
1306 ; MCU-NEXT:    movb $1, %al
1307 ; MCU-NEXT:    .p2align 4, 0x90
1308 ; MCU-NEXT:  .LBB23_1: # %CF
1309 ; MCU-NEXT:    # =>This Inner Loop Header: Depth=1
1310 ; MCU-NEXT:    testb %al, %al
1311 ; MCU-NEXT:    jne .LBB23_1
1312 ; MCU-NEXT:  # %bb.2: # %CF250
1313 ; MCU-NEXT:    # in Loop: Header=BB23_1 Depth=1
1314 ; MCU-NEXT:    jne .LBB23_1
1315 ; MCU-NEXT:  # %bb.3: # %CF242.preheader
1316 ; MCU-NEXT:    fldz
1317 ; MCU-NEXT:    .p2align 4, 0x90
1318 ; MCU-NEXT:  .LBB23_4: # %CF242
1319 ; MCU-NEXT:    # =>This Inner Loop Header: Depth=1
1320 ; MCU-NEXT:    cmpl %eax, %ecx
1321 ; MCU-NEXT:    fucom %st(0)
1322 ; MCU-NEXT:    fnstsw %ax
1323 ; MCU-NEXT:    # kill: def $ah killed $ah killed $ax
1324 ; MCU-NEXT:    sahf
1325 ; MCU-NEXT:    jp .LBB23_4
1326 ; MCU-NEXT:  # %bb.5: # %CF244
1327 ; MCU-NEXT:    fstp %st(0)
1328 ; MCU-NEXT:    retl
1329 BB:
1330   br label %CF
1331
1332 CF:
1333   %Cmp10 = icmp ule i8 undef, undef
1334   br i1 %Cmp10, label %CF, label %CF250
1335
1336 CF250:
1337   %E12 = extractelement <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, i32 2
1338   %Cmp32 = icmp ugt i1 %Cmp10, false
1339   br i1 %Cmp32, label %CF, label %CF242
1340
1341 CF242:
1342   %Cmp38 = icmp uge i32 %E12, undef
1343   %FC = uitofp i1 %Cmp38 to float
1344   %Sl59 = select i1 %Cmp32, float %FC, float undef
1345   %Cmp60 = fcmp ugt float undef, undef
1346   br i1 %Cmp60, label %CF242, label %CF244
1347
1348 CF244:
1349   %B122 = fadd float %Sl59, undef
1350   ret void
1351 }
1352
1353 define i16 @select_xor_1(i16 %A, i8 %cond) {
1354 ; CHECK-LABEL: select_xor_1:
1355 ; CHECK:       ## %bb.0: ## %entry
1356 ; CHECK-NEXT:    movl %edi, %eax
1357 ; CHECK-NEXT:    xorl $43, %eax
1358 ; CHECK-NEXT:    testb $1, %sil
1359 ; CHECK-NEXT:    cmovel %edi, %eax
1360 ; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
1361 ; CHECK-NEXT:    retq
1362 ;
1363 ; ATHLON-LABEL: select_xor_1:
1364 ; ATHLON:       ## %bb.0: ## %entry
1365 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1366 ; ATHLON-NEXT:    movl %ecx, %eax
1367 ; ATHLON-NEXT:    xorl $43, %eax
1368 ; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1369 ; ATHLON-NEXT:    cmovel %ecx, %eax
1370 ; ATHLON-NEXT:    ## kill: def $ax killed $ax killed $eax
1371 ; ATHLON-NEXT:    retl
1372 ;
1373 ; MCU-LABEL: select_xor_1:
1374 ; MCU:       # %bb.0: # %entry
1375 ; MCU-NEXT:    andl $1, %edx
1376 ; MCU-NEXT:    negl %edx
1377 ; MCU-NEXT:    andl $43, %edx
1378 ; MCU-NEXT:    xorl %edx, %eax
1379 ; MCU-NEXT:    # kill: def $ax killed $ax killed $eax
1380 ; MCU-NEXT:    retl
1381 entry:
1382  %and = and i8 %cond, 1
1383  %cmp10 = icmp eq i8 %and, 0
1384  %0 = xor i16 %A, 43
1385  %1 = select i1 %cmp10, i16 %A, i16 %0
1386  ret i16 %1
1387 }
1388
1389 ; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
1390 ; icmp eq (and %cond, 1), 0
1391 define i16 @select_xor_1b(i16 %A, i8 %cond) {
1392 ; CHECK-LABEL: select_xor_1b:
1393 ; CHECK:       ## %bb.0: ## %entry
1394 ; CHECK-NEXT:    movl %edi, %eax
1395 ; CHECK-NEXT:    xorl $43, %eax
1396 ; CHECK-NEXT:    testb $1, %sil
1397 ; CHECK-NEXT:    cmovel %edi, %eax
1398 ; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
1399 ; CHECK-NEXT:    retq
1400 ;
1401 ; ATHLON-LABEL: select_xor_1b:
1402 ; ATHLON:       ## %bb.0: ## %entry
1403 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1404 ; ATHLON-NEXT:    movl %ecx, %eax
1405 ; ATHLON-NEXT:    xorl $43, %eax
1406 ; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1407 ; ATHLON-NEXT:    cmovel %ecx, %eax
1408 ; ATHLON-NEXT:    ## kill: def $ax killed $ax killed $eax
1409 ; ATHLON-NEXT:    retl
1410 ;
1411 ; MCU-LABEL: select_xor_1b:
1412 ; MCU:       # %bb.0: # %entry
1413 ; MCU-NEXT:    testb $1, %dl
1414 ; MCU-NEXT:    je .LBB25_2
1415 ; MCU-NEXT:  # %bb.1:
1416 ; MCU-NEXT:    xorl $43, %eax
1417 ; MCU-NEXT:  .LBB25_2: # %entry
1418 ; MCU-NEXT:    # kill: def $ax killed $ax killed $eax
1419 ; MCU-NEXT:    retl
1420 entry:
1421  %and = and i8 %cond, 1
1422  %cmp10 = icmp ne i8 %and, 1
1423  %0 = xor i16 %A, 43
1424  %1 = select i1 %cmp10, i16 %A, i16 %0
1425  ret i16 %1
1426 }
1427
1428 define i32 @select_xor_2(i32 %A, i32 %B, i8 %cond) {
1429 ; CHECK-LABEL: select_xor_2:
1430 ; CHECK:       ## %bb.0: ## %entry
1431 ; CHECK-NEXT:    movl %esi, %eax
1432 ; CHECK-NEXT:    xorl %edi, %eax
1433 ; CHECK-NEXT:    testb $1, %dl
1434 ; CHECK-NEXT:    cmovel %edi, %eax
1435 ; CHECK-NEXT:    retq
1436 ;
1437 ; ATHLON-LABEL: select_xor_2:
1438 ; ATHLON:       ## %bb.0: ## %entry
1439 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1440 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1441 ; ATHLON-NEXT:    xorl %ecx, %eax
1442 ; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1443 ; ATHLON-NEXT:    cmovel %ecx, %eax
1444 ; ATHLON-NEXT:    retl
1445 ;
1446 ; MCU-LABEL: select_xor_2:
1447 ; MCU:       # %bb.0: # %entry
1448 ; MCU-NEXT:    andl $1, %ecx
1449 ; MCU-NEXT:    negl %ecx
1450 ; MCU-NEXT:    andl %edx, %ecx
1451 ; MCU-NEXT:    xorl %ecx, %eax
1452 ; MCU-NEXT:    retl
1453 entry:
1454  %and = and i8 %cond, 1
1455  %cmp10 = icmp eq i8 %and, 0
1456  %0 = xor i32 %B, %A
1457  %1 = select i1 %cmp10, i32 %A, i32 %0
1458  ret i32 %1
1459 }
1460
1461 ; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
1462 ; icmp eq (and %cond, 1), 0
1463 define i32 @select_xor_2b(i32 %A, i32 %B, i8 %cond) {
1464 ; CHECK-LABEL: select_xor_2b:
1465 ; CHECK:       ## %bb.0: ## %entry
1466 ; CHECK-NEXT:    movl %esi, %eax
1467 ; CHECK-NEXT:    xorl %edi, %eax
1468 ; CHECK-NEXT:    testb $1, %dl
1469 ; CHECK-NEXT:    cmovel %edi, %eax
1470 ; CHECK-NEXT:    retq
1471 ;
1472 ; ATHLON-LABEL: select_xor_2b:
1473 ; ATHLON:       ## %bb.0: ## %entry
1474 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1475 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1476 ; ATHLON-NEXT:    xorl %ecx, %eax
1477 ; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1478 ; ATHLON-NEXT:    cmovel %ecx, %eax
1479 ; ATHLON-NEXT:    retl
1480 ;
1481 ; MCU-LABEL: select_xor_2b:
1482 ; MCU:       # %bb.0: # %entry
1483 ; MCU-NEXT:    testb $1, %cl
1484 ; MCU-NEXT:    je .LBB27_2
1485 ; MCU-NEXT:  # %bb.1:
1486 ; MCU-NEXT:    xorl %edx, %eax
1487 ; MCU-NEXT:  .LBB27_2: # %entry
1488 ; MCU-NEXT:    retl
1489 entry:
1490  %and = and i8 %cond, 1
1491  %cmp10 = icmp ne i8 %and, 1
1492  %0 = xor i32 %B, %A
1493  %1 = select i1 %cmp10, i32 %A, i32 %0
1494  ret i32 %1
1495 }
1496
1497 define i32 @select_or(i32 %A, i32 %B, i8 %cond) {
1498 ; CHECK-LABEL: select_or:
1499 ; CHECK:       ## %bb.0: ## %entry
1500 ; CHECK-NEXT:    movl %esi, %eax
1501 ; CHECK-NEXT:    orl %edi, %eax
1502 ; CHECK-NEXT:    testb $1, %dl
1503 ; CHECK-NEXT:    cmovel %edi, %eax
1504 ; CHECK-NEXT:    retq
1505 ;
1506 ; ATHLON-LABEL: select_or:
1507 ; ATHLON:       ## %bb.0: ## %entry
1508 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1509 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1510 ; ATHLON-NEXT:    orl %ecx, %eax
1511 ; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1512 ; ATHLON-NEXT:    cmovel %ecx, %eax
1513 ; ATHLON-NEXT:    retl
1514 ;
1515 ; MCU-LABEL: select_or:
1516 ; MCU:       # %bb.0: # %entry
1517 ; MCU-NEXT:    andl $1, %ecx
1518 ; MCU-NEXT:    negl %ecx
1519 ; MCU-NEXT:    andl %edx, %ecx
1520 ; MCU-NEXT:    orl %ecx, %eax
1521 ; MCU-NEXT:    retl
1522 entry:
1523  %and = and i8 %cond, 1
1524  %cmp10 = icmp eq i8 %and, 0
1525  %0 = or i32 %B, %A
1526  %1 = select i1 %cmp10, i32 %A, i32 %0
1527  ret i32 %1
1528 }
1529
1530 ; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
1531 ; icmp eq (and %cond, 1), 0
1532 define i32 @select_or_b(i32 %A, i32 %B, i8 %cond) {
1533 ; CHECK-LABEL: select_or_b:
1534 ; CHECK:       ## %bb.0: ## %entry
1535 ; CHECK-NEXT:    movl %esi, %eax
1536 ; CHECK-NEXT:    orl %edi, %eax
1537 ; CHECK-NEXT:    testb $1, %dl
1538 ; CHECK-NEXT:    cmovel %edi, %eax
1539 ; CHECK-NEXT:    retq
1540 ;
1541 ; ATHLON-LABEL: select_or_b:
1542 ; ATHLON:       ## %bb.0: ## %entry
1543 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1544 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1545 ; ATHLON-NEXT:    orl %ecx, %eax
1546 ; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1547 ; ATHLON-NEXT:    cmovel %ecx, %eax
1548 ; ATHLON-NEXT:    retl
1549 ;
1550 ; MCU-LABEL: select_or_b:
1551 ; MCU:       # %bb.0: # %entry
1552 ; MCU-NEXT:    testb $1, %cl
1553 ; MCU-NEXT:    je .LBB29_2
1554 ; MCU-NEXT:  # %bb.1:
1555 ; MCU-NEXT:    orl %edx, %eax
1556 ; MCU-NEXT:  .LBB29_2: # %entry
1557 ; MCU-NEXT:    retl
1558 entry:
1559  %and = and i8 %cond, 1
1560  %cmp10 = icmp ne i8 %and, 1
1561  %0 = or i32 %B, %A
1562  %1 = select i1 %cmp10, i32 %A, i32 %0
1563  ret i32 %1
1564 }
1565
1566 define i32 @select_or_1(i32 %A, i32 %B, i32 %cond) {
1567 ; CHECK-LABEL: select_or_1:
1568 ; CHECK:       ## %bb.0: ## %entry
1569 ; CHECK-NEXT:    movl %esi, %eax
1570 ; CHECK-NEXT:    orl %edi, %eax
1571 ; CHECK-NEXT:    testb $1, %dl
1572 ; CHECK-NEXT:    cmovel %edi, %eax
1573 ; CHECK-NEXT:    retq
1574 ;
1575 ; ATHLON-LABEL: select_or_1:
1576 ; ATHLON:       ## %bb.0: ## %entry
1577 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1578 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1579 ; ATHLON-NEXT:    orl %ecx, %eax
1580 ; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1581 ; ATHLON-NEXT:    cmovel %ecx, %eax
1582 ; ATHLON-NEXT:    retl
1583 ;
1584 ; MCU-LABEL: select_or_1:
1585 ; MCU:       # %bb.0: # %entry
1586 ; MCU-NEXT:    andl $1, %ecx
1587 ; MCU-NEXT:    negl %ecx
1588 ; MCU-NEXT:    andl %edx, %ecx
1589 ; MCU-NEXT:    orl %ecx, %eax
1590 ; MCU-NEXT:    retl
1591 entry:
1592  %and = and i32 %cond, 1
1593  %cmp10 = icmp eq i32 %and, 0
1594  %0 = or i32 %B, %A
1595  %1 = select i1 %cmp10, i32 %A, i32 %0
1596  ret i32 %1
1597 }
1598
1599 ; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
1600 ; icmp eq (and %cond, 1), 0
1601 define i32 @select_or_1b(i32 %A, i32 %B, i32 %cond) {
1602 ; CHECK-LABEL: select_or_1b:
1603 ; CHECK:       ## %bb.0: ## %entry
1604 ; CHECK-NEXT:    movl %esi, %eax
1605 ; CHECK-NEXT:    orl %edi, %eax
1606 ; CHECK-NEXT:    testb $1, %dl
1607 ; CHECK-NEXT:    cmovel %edi, %eax
1608 ; CHECK-NEXT:    retq
1609 ;
1610 ; ATHLON-LABEL: select_or_1b:
1611 ; ATHLON:       ## %bb.0: ## %entry
1612 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1613 ; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1614 ; ATHLON-NEXT:    orl %ecx, %eax
1615 ; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1616 ; ATHLON-NEXT:    cmovel %ecx, %eax
1617 ; ATHLON-NEXT:    retl
1618 ;
1619 ; MCU-LABEL: select_or_1b:
1620 ; MCU:       # %bb.0: # %entry
1621 ; MCU-NEXT:    testb $1, %cl
1622 ; MCU-NEXT:    je .LBB31_2
1623 ; MCU-NEXT:  # %bb.1:
1624 ; MCU-NEXT:    orl %edx, %eax
1625 ; MCU-NEXT:  .LBB31_2: # %entry
1626 ; MCU-NEXT:    retl
1627 entry:
1628  %and = and i32 %cond, 1
1629  %cmp10 = icmp ne i32 %and, 1
1630  %0 = or i32 %B, %A
1631  %1 = select i1 %cmp10, i32 %A, i32 %0
1632  ret i32 %1
1633 }