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-prefix=SSE
3 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,NO-AVX10_2
4 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx10.2-256 | FileCheck %s --check-prefixes=AVX,AVX10_2
10 define i32 @test_x86_sse_comieq_ss(<4 x float> %a0, <4 x float> %a1, i32 %a2, i32 %a3) {
11 ; SSE-LABEL: test_x86_sse_comieq_ss:
13 ; SSE-NEXT: movl %edi, %eax
14 ; SSE-NEXT: comiss %xmm1, %xmm0
17 ; SSE-NEXT: testb %cl, %dl
18 ; SSE-NEXT: cmovnel %esi, %eax
21 ; NO-AVX10_2-LABEL: test_x86_sse_comieq_ss:
22 ; NO-AVX10_2: # %bb.0:
23 ; NO-AVX10_2-NEXT: movl %edi, %eax
24 ; NO-AVX10_2-NEXT: vcomiss %xmm1, %xmm0
25 ; NO-AVX10_2-NEXT: setnp %cl
26 ; NO-AVX10_2-NEXT: sete %dl
27 ; NO-AVX10_2-NEXT: testb %cl, %dl
28 ; NO-AVX10_2-NEXT: cmovnel %esi, %eax
29 ; NO-AVX10_2-NEXT: retq
31 ; AVX10_2-LABEL: test_x86_sse_comieq_ss:
33 ; AVX10_2-NEXT: movl %edi, %eax
34 ; AVX10_2-NEXT: vcomxss %xmm1, %xmm0
35 ; AVX10_2-NEXT: cmovel %esi, %eax
37 %call = call i32 @llvm.x86.sse.comieq.ss(<4 x float> %a0, <4 x float> %a1)
38 %cmp = icmp eq i32 %call, 0
39 %res = select i1 %cmp, i32 %a2, i32 %a3
42 declare i32 @llvm.x86.sse.comieq.ss(<4 x float>, <4 x float>) nounwind readnone
44 define i32 @test_x86_sse_comige_ss(<4 x float> %a0, <4 x float> %a1, i32 %a2, i32 %a3) {
45 ; SSE-LABEL: test_x86_sse_comige_ss:
47 ; SSE-NEXT: movl %edi, %eax
48 ; SSE-NEXT: comiss %xmm1, %xmm0
49 ; SSE-NEXT: cmovbl %esi, %eax
52 ; AVX-LABEL: test_x86_sse_comige_ss:
54 ; AVX-NEXT: movl %edi, %eax
55 ; AVX-NEXT: vcomiss %xmm1, %xmm0
56 ; AVX-NEXT: cmovbl %esi, %eax
58 %call = call i32 @llvm.x86.sse.comige.ss(<4 x float> %a0, <4 x float> %a1)
59 %cmp = icmp ne i32 %call, 0
60 %res = select i1 %cmp, i32 %a2, i32 %a3
63 declare i32 @llvm.x86.sse.comige.ss(<4 x float>, <4 x float>) nounwind readnone
65 define i32 @test_x86_sse_comigt_ss(<4 x float> %a0, <4 x float> %a1, i32 %a2, i32 %a3) {
66 ; SSE-LABEL: test_x86_sse_comigt_ss:
68 ; SSE-NEXT: movl %edi, %eax
69 ; SSE-NEXT: comiss %xmm1, %xmm0
70 ; SSE-NEXT: cmoval %esi, %eax
73 ; AVX-LABEL: test_x86_sse_comigt_ss:
75 ; AVX-NEXT: movl %edi, %eax
76 ; AVX-NEXT: vcomiss %xmm1, %xmm0
77 ; AVX-NEXT: cmoval %esi, %eax
79 %call = call i32 @llvm.x86.sse.comigt.ss(<4 x float> %a0, <4 x float> %a1)
80 %cmp = icmp eq i32 %call, 0
81 %res = select i1 %cmp, i32 %a2, i32 %a3
84 declare i32 @llvm.x86.sse.comigt.ss(<4 x float>, <4 x float>) nounwind readnone
86 define i32 @test_x86_sse_comile_ss(<4 x float> %a0, <4 x float> %a1, i32 %a2, i32 %a3) {
87 ; SSE-LABEL: test_x86_sse_comile_ss:
89 ; SSE-NEXT: movl %edi, %eax
90 ; SSE-NEXT: comiss %xmm0, %xmm1
91 ; SSE-NEXT: cmovbl %esi, %eax
94 ; AVX-LABEL: test_x86_sse_comile_ss:
96 ; AVX-NEXT: movl %edi, %eax
97 ; AVX-NEXT: vcomiss %xmm0, %xmm1
98 ; AVX-NEXT: cmovbl %esi, %eax
100 %call = call i32 @llvm.x86.sse.comile.ss(<4 x float> %a0, <4 x float> %a1)
101 %cmp = icmp ne i32 %call, 0
102 %res = select i1 %cmp, i32 %a2, i32 %a3
105 declare i32 @llvm.x86.sse.comile.ss(<4 x float>, <4 x float>) nounwind readnone
107 define i32 @test_x86_sse_comilt_ss(<4 x float> %a0, <4 x float> %a1, i32 %a2, i32 %a3) {
108 ; SSE-LABEL: test_x86_sse_comilt_ss:
110 ; SSE-NEXT: movl %edi, %eax
111 ; SSE-NEXT: comiss %xmm0, %xmm1
112 ; SSE-NEXT: cmoval %esi, %eax
115 ; AVX-LABEL: test_x86_sse_comilt_ss:
117 ; AVX-NEXT: movl %edi, %eax
118 ; AVX-NEXT: vcomiss %xmm0, %xmm1
119 ; AVX-NEXT: cmoval %esi, %eax
121 %call = call i32 @llvm.x86.sse.comilt.ss(<4 x float> %a0, <4 x float> %a1)
122 %cmp = icmp eq i32 %call, 0
123 %res = select i1 %cmp, i32 %a2, i32 %a3
126 declare i32 @llvm.x86.sse.comilt.ss(<4 x float>, <4 x float>) nounwind readnone
128 define i32 @test_x86_sse_comineq_ss(<4 x float> %a0, <4 x float> %a1, i32 %a2, i32 %a3) {
129 ; SSE-LABEL: test_x86_sse_comineq_ss:
131 ; SSE-NEXT: movl %esi, %eax
132 ; SSE-NEXT: comiss %xmm1, %xmm0
133 ; SSE-NEXT: cmovnel %edi, %eax
134 ; SSE-NEXT: cmovpl %edi, %eax
137 ; NO-AVX10_2-LABEL: test_x86_sse_comineq_ss:
138 ; NO-AVX10_2: # %bb.0:
139 ; NO-AVX10_2-NEXT: movl %esi, %eax
140 ; NO-AVX10_2-NEXT: vcomiss %xmm1, %xmm0
141 ; NO-AVX10_2-NEXT: cmovnel %edi, %eax
142 ; NO-AVX10_2-NEXT: cmovpl %edi, %eax
143 ; NO-AVX10_2-NEXT: retq
145 ; AVX10_2-LABEL: test_x86_sse_comineq_ss:
147 ; AVX10_2-NEXT: movl %edi, %eax
148 ; AVX10_2-NEXT: vcomxss %xmm1, %xmm0
149 ; AVX10_2-NEXT: cmovel %esi, %eax
151 %call = call i32 @llvm.x86.sse.comineq.ss(<4 x float> %a0, <4 x float> %a1)
152 %cmp = icmp ne i32 %call, 0
153 %res = select i1 %cmp, i32 %a2, i32 %a3
156 declare i32 @llvm.x86.sse.comineq.ss(<4 x float>, <4 x float>) nounwind readnone
158 define i32 @test_x86_sse_ucomieq_ss(<4 x float> %a0, <4 x float> %a1, i32 %a2, i32 %a3) {
159 ; SSE-LABEL: test_x86_sse_ucomieq_ss:
161 ; SSE-NEXT: movl %edi, %eax
162 ; SSE-NEXT: ucomiss %xmm1, %xmm0
163 ; SSE-NEXT: setnp %cl
165 ; SSE-NEXT: testb %cl, %dl
166 ; SSE-NEXT: cmovnel %esi, %eax
169 ; NO-AVX10_2-LABEL: test_x86_sse_ucomieq_ss:
170 ; NO-AVX10_2: # %bb.0:
171 ; NO-AVX10_2-NEXT: movl %edi, %eax
172 ; NO-AVX10_2-NEXT: vucomiss %xmm1, %xmm0
173 ; NO-AVX10_2-NEXT: setnp %cl
174 ; NO-AVX10_2-NEXT: sete %dl
175 ; NO-AVX10_2-NEXT: testb %cl, %dl
176 ; NO-AVX10_2-NEXT: cmovnel %esi, %eax
177 ; NO-AVX10_2-NEXT: retq
179 ; AVX10_2-LABEL: test_x86_sse_ucomieq_ss:
181 ; AVX10_2-NEXT: movl %edi, %eax
182 ; AVX10_2-NEXT: vucomxss %xmm1, %xmm0
183 ; AVX10_2-NEXT: cmovel %esi, %eax
185 %call = call i32 @llvm.x86.sse.ucomieq.ss(<4 x float> %a0, <4 x float> %a1)
186 %cmp = icmp eq i32 %call, 0
187 %res = select i1 %cmp, i32 %a2, i32 %a3
190 declare i32 @llvm.x86.sse.ucomieq.ss(<4 x float>, <4 x float>) nounwind readnone
192 define i32 @test_x86_sse_ucomige_ss(<4 x float> %a0, <4 x float> %a1, i32 %a2, i32 %a3) {
193 ; SSE-LABEL: test_x86_sse_ucomige_ss:
195 ; SSE-NEXT: movl %edi, %eax
196 ; SSE-NEXT: ucomiss %xmm1, %xmm0
197 ; SSE-NEXT: cmovbl %esi, %eax
200 ; AVX-LABEL: test_x86_sse_ucomige_ss:
202 ; AVX-NEXT: movl %edi, %eax
203 ; AVX-NEXT: vucomiss %xmm1, %xmm0
204 ; AVX-NEXT: cmovbl %esi, %eax
206 %call = call i32 @llvm.x86.sse.ucomige.ss(<4 x float> %a0, <4 x float> %a1)
207 %cmp = icmp ne i32 %call, 0
208 %res = select i1 %cmp, i32 %a2, i32 %a3
211 declare i32 @llvm.x86.sse.ucomige.ss(<4 x float>, <4 x float>) nounwind readnone
213 define i32 @test_x86_sse_ucomigt_ss(<4 x float> %a0, <4 x float> %a1, i32 %a2, i32 %a3) {
214 ; SSE-LABEL: test_x86_sse_ucomigt_ss:
216 ; SSE-NEXT: movl %edi, %eax
217 ; SSE-NEXT: ucomiss %xmm1, %xmm0
218 ; SSE-NEXT: cmoval %esi, %eax
221 ; AVX-LABEL: test_x86_sse_ucomigt_ss:
223 ; AVX-NEXT: movl %edi, %eax
224 ; AVX-NEXT: vucomiss %xmm1, %xmm0
225 ; AVX-NEXT: cmoval %esi, %eax
227 %call = call i32 @llvm.x86.sse.ucomigt.ss(<4 x float> %a0, <4 x float> %a1)
228 %cmp = icmp eq i32 %call, 0
229 %res = select i1 %cmp, i32 %a2, i32 %a3
232 declare i32 @llvm.x86.sse.ucomigt.ss(<4 x float>, <4 x float>) nounwind readnone
234 define i32 @test_x86_sse_ucomile_ss(<4 x float> %a0, <4 x float> %a1, i32 %a2, i32 %a3) {
235 ; SSE-LABEL: test_x86_sse_ucomile_ss:
237 ; SSE-NEXT: movl %edi, %eax
238 ; SSE-NEXT: ucomiss %xmm0, %xmm1
239 ; SSE-NEXT: cmovbl %esi, %eax
242 ; AVX-LABEL: test_x86_sse_ucomile_ss:
244 ; AVX-NEXT: movl %edi, %eax
245 ; AVX-NEXT: vucomiss %xmm0, %xmm1
246 ; AVX-NEXT: cmovbl %esi, %eax
248 %call = call i32 @llvm.x86.sse.ucomile.ss(<4 x float> %a0, <4 x float> %a1)
249 %cmp = icmp ne i32 %call, 0
250 %res = select i1 %cmp, i32 %a2, i32 %a3
253 declare i32 @llvm.x86.sse.ucomile.ss(<4 x float>, <4 x float>) nounwind readnone
255 define i32 @test_x86_sse_ucomilt_ss(<4 x float> %a0, <4 x float> %a1, i32 %a2, i32 %a3) {
256 ; SSE-LABEL: test_x86_sse_ucomilt_ss:
258 ; SSE-NEXT: movl %edi, %eax
259 ; SSE-NEXT: ucomiss %xmm0, %xmm1
260 ; SSE-NEXT: cmoval %esi, %eax
263 ; AVX-LABEL: test_x86_sse_ucomilt_ss:
265 ; AVX-NEXT: movl %edi, %eax
266 ; AVX-NEXT: vucomiss %xmm0, %xmm1
267 ; AVX-NEXT: cmoval %esi, %eax
269 %call = call i32 @llvm.x86.sse.ucomilt.ss(<4 x float> %a0, <4 x float> %a1)
270 %cmp = icmp eq i32 %call, 0
271 %res = select i1 %cmp, i32 %a2, i32 %a3
274 declare i32 @llvm.x86.sse.ucomilt.ss(<4 x float>, <4 x float>) nounwind readnone
276 define i32 @test_x86_sse_ucomineq_ss(<4 x float> %a0, <4 x float> %a1, i32 %a2, i32 %a3) {
277 ; SSE-LABEL: test_x86_sse_ucomineq_ss:
279 ; SSE-NEXT: movl %esi, %eax
280 ; SSE-NEXT: ucomiss %xmm1, %xmm0
281 ; SSE-NEXT: cmovnel %edi, %eax
282 ; SSE-NEXT: cmovpl %edi, %eax
285 ; NO-AVX10_2-LABEL: test_x86_sse_ucomineq_ss:
286 ; NO-AVX10_2: # %bb.0:
287 ; NO-AVX10_2-NEXT: movl %esi, %eax
288 ; NO-AVX10_2-NEXT: vucomiss %xmm1, %xmm0
289 ; NO-AVX10_2-NEXT: cmovnel %edi, %eax
290 ; NO-AVX10_2-NEXT: cmovpl %edi, %eax
291 ; NO-AVX10_2-NEXT: retq
293 ; AVX10_2-LABEL: test_x86_sse_ucomineq_ss:
295 ; AVX10_2-NEXT: movl %edi, %eax
296 ; AVX10_2-NEXT: vucomxss %xmm1, %xmm0
297 ; AVX10_2-NEXT: cmovel %esi, %eax
299 %call = call i32 @llvm.x86.sse.ucomineq.ss(<4 x float> %a0, <4 x float> %a1)
300 %cmp = icmp ne i32 %call, 0
301 %res = select i1 %cmp, i32 %a2, i32 %a3
304 declare i32 @llvm.x86.sse.ucomineq.ss(<4 x float>, <4 x float>) nounwind readnone
310 define i32 @test_x86_sse2_comieq_sd(<2 x double> %a0, <2 x double> %a1, i32 %a2, i32 %a3) {
311 ; SSE-LABEL: test_x86_sse2_comieq_sd:
313 ; SSE-NEXT: movl %edi, %eax
314 ; SSE-NEXT: comisd %xmm1, %xmm0
315 ; SSE-NEXT: setnp %cl
317 ; SSE-NEXT: testb %cl, %dl
318 ; SSE-NEXT: cmovnel %esi, %eax
321 ; NO-AVX10_2-LABEL: test_x86_sse2_comieq_sd:
322 ; NO-AVX10_2: # %bb.0:
323 ; NO-AVX10_2-NEXT: movl %edi, %eax
324 ; NO-AVX10_2-NEXT: vcomisd %xmm1, %xmm0
325 ; NO-AVX10_2-NEXT: setnp %cl
326 ; NO-AVX10_2-NEXT: sete %dl
327 ; NO-AVX10_2-NEXT: testb %cl, %dl
328 ; NO-AVX10_2-NEXT: cmovnel %esi, %eax
329 ; NO-AVX10_2-NEXT: retq
331 ; AVX10_2-LABEL: test_x86_sse2_comieq_sd:
333 ; AVX10_2-NEXT: movl %edi, %eax
334 ; AVX10_2-NEXT: vcomxsd %xmm1, %xmm0
335 ; AVX10_2-NEXT: cmovel %esi, %eax
337 %call = call i32 @llvm.x86.sse2.comieq.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
338 %cmp = icmp eq i32 %call, 0
339 %res = select i1 %cmp, i32 %a2, i32 %a3
342 declare i32 @llvm.x86.sse2.comieq.sd(<2 x double>, <2 x double>) nounwind readnone
344 define i32 @test_x86_sse2_comige_sd(<2 x double> %a0, <2 x double> %a1, i32 %a2, i32 %a3) {
345 ; SSE-LABEL: test_x86_sse2_comige_sd:
347 ; SSE-NEXT: movl %edi, %eax
348 ; SSE-NEXT: comisd %xmm1, %xmm0
349 ; SSE-NEXT: cmovbl %esi, %eax
352 ; AVX-LABEL: test_x86_sse2_comige_sd:
354 ; AVX-NEXT: movl %edi, %eax
355 ; AVX-NEXT: vcomisd %xmm1, %xmm0
356 ; AVX-NEXT: cmovbl %esi, %eax
358 %call = call i32 @llvm.x86.sse2.comige.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
359 %cmp = icmp ne i32 %call, 0
360 %res = select i1 %cmp, i32 %a2, i32 %a3
363 declare i32 @llvm.x86.sse2.comige.sd(<2 x double>, <2 x double>) nounwind readnone
365 define i32 @test_x86_sse2_comigt_sd(<2 x double> %a0, <2 x double> %a1, i32 %a2, i32 %a3) {
366 ; SSE-LABEL: test_x86_sse2_comigt_sd:
368 ; SSE-NEXT: movl %edi, %eax
369 ; SSE-NEXT: comisd %xmm1, %xmm0
370 ; SSE-NEXT: cmoval %esi, %eax
373 ; AVX-LABEL: test_x86_sse2_comigt_sd:
375 ; AVX-NEXT: movl %edi, %eax
376 ; AVX-NEXT: vcomisd %xmm1, %xmm0
377 ; AVX-NEXT: cmoval %esi, %eax
379 %call = call i32 @llvm.x86.sse2.comigt.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
380 %cmp = icmp eq i32 %call, 0
381 %res = select i1 %cmp, i32 %a2, i32 %a3
384 declare i32 @llvm.x86.sse2.comigt.sd(<2 x double>, <2 x double>) nounwind readnone
386 define i32 @test_x86_sse2_comile_sd(<2 x double> %a0, <2 x double> %a1, i32 %a2, i32 %a3) {
387 ; SSE-LABEL: test_x86_sse2_comile_sd:
389 ; SSE-NEXT: movl %edi, %eax
390 ; SSE-NEXT: comisd %xmm0, %xmm1
391 ; SSE-NEXT: cmovbl %esi, %eax
394 ; AVX-LABEL: test_x86_sse2_comile_sd:
396 ; AVX-NEXT: movl %edi, %eax
397 ; AVX-NEXT: vcomisd %xmm0, %xmm1
398 ; AVX-NEXT: cmovbl %esi, %eax
400 %call = call i32 @llvm.x86.sse2.comile.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
401 %cmp = icmp ne i32 %call, 0
402 %res = select i1 %cmp, i32 %a2, i32 %a3
405 declare i32 @llvm.x86.sse2.comile.sd(<2 x double>, <2 x double>) nounwind readnone
407 define i32 @test_x86_sse2_comilt_sd(<2 x double> %a0, <2 x double> %a1, i32 %a2, i32 %a3) {
408 ; SSE-LABEL: test_x86_sse2_comilt_sd:
410 ; SSE-NEXT: movl %edi, %eax
411 ; SSE-NEXT: comisd %xmm0, %xmm1
412 ; SSE-NEXT: cmoval %esi, %eax
415 ; AVX-LABEL: test_x86_sse2_comilt_sd:
417 ; AVX-NEXT: movl %edi, %eax
418 ; AVX-NEXT: vcomisd %xmm0, %xmm1
419 ; AVX-NEXT: cmoval %esi, %eax
421 %call = call i32 @llvm.x86.sse2.comilt.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
422 %cmp = icmp eq i32 %call, 0
423 %res = select i1 %cmp, i32 %a2, i32 %a3
426 declare i32 @llvm.x86.sse2.comilt.sd(<2 x double>, <2 x double>) nounwind readnone
428 define i32 @test_x86_sse2_comineq_sd(<2 x double> %a0, <2 x double> %a1, i32 %a2, i32 %a3) {
429 ; SSE-LABEL: test_x86_sse2_comineq_sd:
431 ; SSE-NEXT: movl %esi, %eax
432 ; SSE-NEXT: comisd %xmm1, %xmm0
433 ; SSE-NEXT: cmovnel %edi, %eax
434 ; SSE-NEXT: cmovpl %edi, %eax
437 ; NO-AVX10_2-LABEL: test_x86_sse2_comineq_sd:
438 ; NO-AVX10_2: # %bb.0:
439 ; NO-AVX10_2-NEXT: movl %esi, %eax
440 ; NO-AVX10_2-NEXT: vcomisd %xmm1, %xmm0
441 ; NO-AVX10_2-NEXT: cmovnel %edi, %eax
442 ; NO-AVX10_2-NEXT: cmovpl %edi, %eax
443 ; NO-AVX10_2-NEXT: retq
445 ; AVX10_2-LABEL: test_x86_sse2_comineq_sd:
447 ; AVX10_2-NEXT: movl %edi, %eax
448 ; AVX10_2-NEXT: vcomxsd %xmm1, %xmm0
449 ; AVX10_2-NEXT: cmovel %esi, %eax
451 %call = call i32 @llvm.x86.sse2.comineq.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
452 %cmp = icmp ne i32 %call, 0
453 %res = select i1 %cmp, i32 %a2, i32 %a3
456 declare i32 @llvm.x86.sse2.comineq.sd(<2 x double>, <2 x double>) nounwind readnone
458 define i32 @test_x86_sse2_ucomieq_sd(<2 x double> %a0, <2 x double> %a1, i32 %a2, i32 %a3) {
459 ; SSE-LABEL: test_x86_sse2_ucomieq_sd:
461 ; SSE-NEXT: movl %edi, %eax
462 ; SSE-NEXT: ucomisd %xmm1, %xmm0
463 ; SSE-NEXT: setnp %cl
465 ; SSE-NEXT: testb %cl, %dl
466 ; SSE-NEXT: cmovnel %esi, %eax
469 ; NO-AVX10_2-LABEL: test_x86_sse2_ucomieq_sd:
470 ; NO-AVX10_2: # %bb.0:
471 ; NO-AVX10_2-NEXT: movl %edi, %eax
472 ; NO-AVX10_2-NEXT: vucomisd %xmm1, %xmm0
473 ; NO-AVX10_2-NEXT: setnp %cl
474 ; NO-AVX10_2-NEXT: sete %dl
475 ; NO-AVX10_2-NEXT: testb %cl, %dl
476 ; NO-AVX10_2-NEXT: cmovnel %esi, %eax
477 ; NO-AVX10_2-NEXT: retq
479 ; AVX10_2-LABEL: test_x86_sse2_ucomieq_sd:
481 ; AVX10_2-NEXT: movl %edi, %eax
482 ; AVX10_2-NEXT: vucomxsd %xmm1, %xmm0
483 ; AVX10_2-NEXT: cmovel %esi, %eax
485 %call = call i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
486 %cmp = icmp eq i32 %call, 0
487 %res = select i1 %cmp, i32 %a2, i32 %a3
490 declare i32 @llvm.x86.sse2.ucomieq.sd(<2 x double>, <2 x double>) nounwind readnone
492 define i32 @test_x86_sse2_ucomige_sd(<2 x double> %a0, <2 x double> %a1, i32 %a2, i32 %a3) {
493 ; SSE-LABEL: test_x86_sse2_ucomige_sd:
495 ; SSE-NEXT: movl %edi, %eax
496 ; SSE-NEXT: ucomisd %xmm1, %xmm0
497 ; SSE-NEXT: cmovbl %esi, %eax
500 ; AVX-LABEL: test_x86_sse2_ucomige_sd:
502 ; AVX-NEXT: movl %edi, %eax
503 ; AVX-NEXT: vucomisd %xmm1, %xmm0
504 ; AVX-NEXT: cmovbl %esi, %eax
506 %call = call i32 @llvm.x86.sse2.ucomige.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
507 %cmp = icmp ne i32 %call, 0
508 %res = select i1 %cmp, i32 %a2, i32 %a3
511 declare i32 @llvm.x86.sse2.ucomige.sd(<2 x double>, <2 x double>) nounwind readnone
513 define i32 @test_x86_sse2_ucomigt_sd(<2 x double> %a0, <2 x double> %a1, i32 %a2, i32 %a3) {
514 ; SSE-LABEL: test_x86_sse2_ucomigt_sd:
516 ; SSE-NEXT: movl %edi, %eax
517 ; SSE-NEXT: ucomisd %xmm1, %xmm0
518 ; SSE-NEXT: cmoval %esi, %eax
521 ; AVX-LABEL: test_x86_sse2_ucomigt_sd:
523 ; AVX-NEXT: movl %edi, %eax
524 ; AVX-NEXT: vucomisd %xmm1, %xmm0
525 ; AVX-NEXT: cmoval %esi, %eax
527 %call = call i32 @llvm.x86.sse2.ucomigt.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
528 %cmp = icmp eq i32 %call, 0
529 %res = select i1 %cmp, i32 %a2, i32 %a3
532 declare i32 @llvm.x86.sse2.ucomigt.sd(<2 x double>, <2 x double>) nounwind readnone
534 define i32 @test_x86_sse2_ucomile_sd(<2 x double> %a0, <2 x double> %a1, i32 %a2, i32 %a3) {
535 ; SSE-LABEL: test_x86_sse2_ucomile_sd:
537 ; SSE-NEXT: movl %edi, %eax
538 ; SSE-NEXT: ucomisd %xmm0, %xmm1
539 ; SSE-NEXT: cmovbl %esi, %eax
542 ; AVX-LABEL: test_x86_sse2_ucomile_sd:
544 ; AVX-NEXT: movl %edi, %eax
545 ; AVX-NEXT: vucomisd %xmm0, %xmm1
546 ; AVX-NEXT: cmovbl %esi, %eax
548 %call = call i32 @llvm.x86.sse2.ucomile.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
549 %cmp = icmp ne i32 %call, 0
550 %res = select i1 %cmp, i32 %a2, i32 %a3
553 declare i32 @llvm.x86.sse2.ucomile.sd(<2 x double>, <2 x double>) nounwind readnone
555 define i32 @test_x86_sse2_ucomilt_sd(<2 x double> %a0, <2 x double> %a1, i32 %a2, i32 %a3) {
556 ; SSE-LABEL: test_x86_sse2_ucomilt_sd:
558 ; SSE-NEXT: movl %edi, %eax
559 ; SSE-NEXT: ucomisd %xmm0, %xmm1
560 ; SSE-NEXT: cmoval %esi, %eax
563 ; AVX-LABEL: test_x86_sse2_ucomilt_sd:
565 ; AVX-NEXT: movl %edi, %eax
566 ; AVX-NEXT: vucomisd %xmm0, %xmm1
567 ; AVX-NEXT: cmoval %esi, %eax
569 %call = call i32 @llvm.x86.sse2.ucomilt.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
570 %cmp = icmp eq i32 %call, 0
571 %res = select i1 %cmp, i32 %a2, i32 %a3
574 declare i32 @llvm.x86.sse2.ucomilt.sd(<2 x double>, <2 x double>) nounwind readnone
576 define i32 @test_x86_sse2_ucomineq_sd(<2 x double> %a0, <2 x double> %a1, i32 %a2, i32 %a3) {
577 ; SSE-LABEL: test_x86_sse2_ucomineq_sd:
579 ; SSE-NEXT: movl %esi, %eax
580 ; SSE-NEXT: ucomisd %xmm1, %xmm0
581 ; SSE-NEXT: cmovnel %edi, %eax
582 ; SSE-NEXT: cmovpl %edi, %eax
585 ; NO-AVX10_2-LABEL: test_x86_sse2_ucomineq_sd:
586 ; NO-AVX10_2: # %bb.0:
587 ; NO-AVX10_2-NEXT: movl %esi, %eax
588 ; NO-AVX10_2-NEXT: vucomisd %xmm1, %xmm0
589 ; NO-AVX10_2-NEXT: cmovnel %edi, %eax
590 ; NO-AVX10_2-NEXT: cmovpl %edi, %eax
591 ; NO-AVX10_2-NEXT: retq
593 ; AVX10_2-LABEL: test_x86_sse2_ucomineq_sd:
595 ; AVX10_2-NEXT: movl %edi, %eax
596 ; AVX10_2-NEXT: vucomxsd %xmm1, %xmm0
597 ; AVX10_2-NEXT: cmovel %esi, %eax
599 %call = call i32 @llvm.x86.sse2.ucomineq.sd(<2 x double> %a0, <2 x double> %a1) ; <i32> [#uses=1]
600 %cmp = icmp ne i32 %call, 0
601 %res = select i1 %cmp, i32 %a2, i32 %a3
604 declare i32 @llvm.x86.sse2.ucomineq.sd(<2 x double>, <2 x double>) nounwind readnone
606 define void @PR38960_eq(<4 x float> %A, <4 x float> %B) {
607 ; SSE-LABEL: PR38960_eq:
608 ; SSE: # %bb.0: # %entry
609 ; SSE-NEXT: comiss %xmm1, %xmm0
610 ; SSE-NEXT: setnp %al
612 ; SSE-NEXT: testb %al, %cl
613 ; SSE-NEXT: jne foo@PLT # TAILCALL
614 ; SSE-NEXT: # %bb.1: # %if.end
617 ; NO-AVX10_2-LABEL: PR38960_eq:
618 ; NO-AVX10_2: # %bb.0: # %entry
619 ; NO-AVX10_2-NEXT: vcomiss %xmm1, %xmm0
620 ; NO-AVX10_2-NEXT: setnp %al
621 ; NO-AVX10_2-NEXT: sete %cl
622 ; NO-AVX10_2-NEXT: testb %al, %cl
623 ; NO-AVX10_2-NEXT: jne foo@PLT # TAILCALL
624 ; NO-AVX10_2-NEXT: # %bb.1: # %if.end
625 ; NO-AVX10_2-NEXT: retq
627 ; AVX10_2-LABEL: PR38960_eq:
628 ; AVX10_2: # %bb.0: # %entry
629 ; AVX10_2-NEXT: vcomxss %xmm1, %xmm0
630 ; AVX10_2-NEXT: je foo@PLT # TAILCALL
631 ; AVX10_2-NEXT: # %bb.1: # %if.end
634 %call = tail call i32 @llvm.x86.sse.comieq.ss(<4 x float> %A, <4 x float> %B) #3
635 %cmp = icmp eq i32 %call, 0
636 br i1 %cmp, label %if.end, label %if.then
639 tail call void @foo()
646 define void @PR38960_neq(<4 x float> %A, <4 x float> %B) {
647 ; SSE-LABEL: PR38960_neq:
648 ; SSE: # %bb.0: # %entry
649 ; SSE-NEXT: comiss %xmm1, %xmm0
651 ; SSE-NEXT: setne %cl
652 ; SSE-NEXT: orb %al, %cl
653 ; SSE-NEXT: jne foo@PLT # TAILCALL
654 ; SSE-NEXT: # %bb.1: # %if.end
657 ; NO-AVX10_2-LABEL: PR38960_neq:
658 ; NO-AVX10_2: # %bb.0: # %entry
659 ; NO-AVX10_2-NEXT: vcomiss %xmm1, %xmm0
660 ; NO-AVX10_2-NEXT: setp %al
661 ; NO-AVX10_2-NEXT: setne %cl
662 ; NO-AVX10_2-NEXT: orb %al, %cl
663 ; NO-AVX10_2-NEXT: jne foo@PLT # TAILCALL
664 ; NO-AVX10_2-NEXT: # %bb.1: # %if.end
665 ; NO-AVX10_2-NEXT: retq
667 ; AVX10_2-LABEL: PR38960_neq:
668 ; AVX10_2: # %bb.0: # %entry
669 ; AVX10_2-NEXT: vcomxss %xmm1, %xmm0
670 ; AVX10_2-NEXT: jne foo@PLT # TAILCALL
671 ; AVX10_2-NEXT: # %bb.1: # %if.end
674 %call = tail call i32 @llvm.x86.sse.comineq.ss(<4 x float> %A, <4 x float> %B) #3
675 %cmp = icmp eq i32 %call, 0
676 br i1 %cmp, label %if.end, label %if.then
679 tail call void @foo()