[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / X86 / comi-flags.ll
blob6f520aa57dcd0961a948148c72347154010a523a
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
7 ; SSE
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:
12 ; SSE:       # %bb.0:
13 ; SSE-NEXT:    movl %edi, %eax
14 ; SSE-NEXT:    comiss %xmm1, %xmm0
15 ; SSE-NEXT:    setnp %cl
16 ; SSE-NEXT:    sete %dl
17 ; SSE-NEXT:    testb %cl, %dl
18 ; SSE-NEXT:    cmovnel %esi, %eax
19 ; SSE-NEXT:    retq
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:
32 ; AVX10_2:       # %bb.0:
33 ; AVX10_2-NEXT:    movl %edi, %eax
34 ; AVX10_2-NEXT:    vcomxss %xmm1, %xmm0
35 ; AVX10_2-NEXT:    cmovel %esi, %eax
36 ; AVX10_2-NEXT:    retq
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
40   ret i32 %res
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:
46 ; SSE:       # %bb.0:
47 ; SSE-NEXT:    movl %edi, %eax
48 ; SSE-NEXT:    comiss %xmm1, %xmm0
49 ; SSE-NEXT:    cmovbl %esi, %eax
50 ; SSE-NEXT:    retq
52 ; AVX-LABEL: test_x86_sse_comige_ss:
53 ; AVX:       # %bb.0:
54 ; AVX-NEXT:    movl %edi, %eax
55 ; AVX-NEXT:    vcomiss %xmm1, %xmm0
56 ; AVX-NEXT:    cmovbl %esi, %eax
57 ; AVX-NEXT:    retq
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
61   ret i32 %res
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:
67 ; SSE:       # %bb.0:
68 ; SSE-NEXT:    movl %edi, %eax
69 ; SSE-NEXT:    comiss %xmm1, %xmm0
70 ; SSE-NEXT:    cmoval %esi, %eax
71 ; SSE-NEXT:    retq
73 ; AVX-LABEL: test_x86_sse_comigt_ss:
74 ; AVX:       # %bb.0:
75 ; AVX-NEXT:    movl %edi, %eax
76 ; AVX-NEXT:    vcomiss %xmm1, %xmm0
77 ; AVX-NEXT:    cmoval %esi, %eax
78 ; AVX-NEXT:    retq
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
82   ret i32 %res
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:
88 ; SSE:       # %bb.0:
89 ; SSE-NEXT:    movl %edi, %eax
90 ; SSE-NEXT:    comiss %xmm0, %xmm1
91 ; SSE-NEXT:    cmovbl %esi, %eax
92 ; SSE-NEXT:    retq
94 ; AVX-LABEL: test_x86_sse_comile_ss:
95 ; AVX:       # %bb.0:
96 ; AVX-NEXT:    movl %edi, %eax
97 ; AVX-NEXT:    vcomiss %xmm0, %xmm1
98 ; AVX-NEXT:    cmovbl %esi, %eax
99 ; AVX-NEXT:    retq
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
103   ret i32 %res
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:
109 ; SSE:       # %bb.0:
110 ; SSE-NEXT:    movl %edi, %eax
111 ; SSE-NEXT:    comiss %xmm0, %xmm1
112 ; SSE-NEXT:    cmoval %esi, %eax
113 ; SSE-NEXT:    retq
115 ; AVX-LABEL: test_x86_sse_comilt_ss:
116 ; AVX:       # %bb.0:
117 ; AVX-NEXT:    movl %edi, %eax
118 ; AVX-NEXT:    vcomiss %xmm0, %xmm1
119 ; AVX-NEXT:    cmoval %esi, %eax
120 ; AVX-NEXT:    retq
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
124   ret i32 %res
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:
130 ; SSE:       # %bb.0:
131 ; SSE-NEXT:    movl %esi, %eax
132 ; SSE-NEXT:    comiss %xmm1, %xmm0
133 ; SSE-NEXT:    cmovnel %edi, %eax
134 ; SSE-NEXT:    cmovpl %edi, %eax
135 ; SSE-NEXT:    retq
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:
146 ; AVX10_2:       # %bb.0:
147 ; AVX10_2-NEXT:    movl %edi, %eax
148 ; AVX10_2-NEXT:    vcomxss %xmm1, %xmm0
149 ; AVX10_2-NEXT:    cmovel %esi, %eax
150 ; AVX10_2-NEXT:    retq
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
154   ret i32 %res
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:
160 ; SSE:       # %bb.0:
161 ; SSE-NEXT:    movl %edi, %eax
162 ; SSE-NEXT:    ucomiss %xmm1, %xmm0
163 ; SSE-NEXT:    setnp %cl
164 ; SSE-NEXT:    sete %dl
165 ; SSE-NEXT:    testb %cl, %dl
166 ; SSE-NEXT:    cmovnel %esi, %eax
167 ; SSE-NEXT:    retq
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:
180 ; AVX10_2:       # %bb.0:
181 ; AVX10_2-NEXT:    movl %edi, %eax
182 ; AVX10_2-NEXT:    vucomxss %xmm1, %xmm0
183 ; AVX10_2-NEXT:    cmovel %esi, %eax
184 ; AVX10_2-NEXT:    retq
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
188   ret i32 %res
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:
194 ; SSE:       # %bb.0:
195 ; SSE-NEXT:    movl %edi, %eax
196 ; SSE-NEXT:    ucomiss %xmm1, %xmm0
197 ; SSE-NEXT:    cmovbl %esi, %eax
198 ; SSE-NEXT:    retq
200 ; AVX-LABEL: test_x86_sse_ucomige_ss:
201 ; AVX:       # %bb.0:
202 ; AVX-NEXT:    movl %edi, %eax
203 ; AVX-NEXT:    vucomiss %xmm1, %xmm0
204 ; AVX-NEXT:    cmovbl %esi, %eax
205 ; AVX-NEXT:    retq
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
209   ret i32 %res
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:
215 ; SSE:       # %bb.0:
216 ; SSE-NEXT:    movl %edi, %eax
217 ; SSE-NEXT:    ucomiss %xmm1, %xmm0
218 ; SSE-NEXT:    cmoval %esi, %eax
219 ; SSE-NEXT:    retq
221 ; AVX-LABEL: test_x86_sse_ucomigt_ss:
222 ; AVX:       # %bb.0:
223 ; AVX-NEXT:    movl %edi, %eax
224 ; AVX-NEXT:    vucomiss %xmm1, %xmm0
225 ; AVX-NEXT:    cmoval %esi, %eax
226 ; AVX-NEXT:    retq
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
230   ret i32 %res
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:
236 ; SSE:       # %bb.0:
237 ; SSE-NEXT:    movl %edi, %eax
238 ; SSE-NEXT:    ucomiss %xmm0, %xmm1
239 ; SSE-NEXT:    cmovbl %esi, %eax
240 ; SSE-NEXT:    retq
242 ; AVX-LABEL: test_x86_sse_ucomile_ss:
243 ; AVX:       # %bb.0:
244 ; AVX-NEXT:    movl %edi, %eax
245 ; AVX-NEXT:    vucomiss %xmm0, %xmm1
246 ; AVX-NEXT:    cmovbl %esi, %eax
247 ; AVX-NEXT:    retq
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
251   ret i32 %res
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:
257 ; SSE:       # %bb.0:
258 ; SSE-NEXT:    movl %edi, %eax
259 ; SSE-NEXT:    ucomiss %xmm0, %xmm1
260 ; SSE-NEXT:    cmoval %esi, %eax
261 ; SSE-NEXT:    retq
263 ; AVX-LABEL: test_x86_sse_ucomilt_ss:
264 ; AVX:       # %bb.0:
265 ; AVX-NEXT:    movl %edi, %eax
266 ; AVX-NEXT:    vucomiss %xmm0, %xmm1
267 ; AVX-NEXT:    cmoval %esi, %eax
268 ; AVX-NEXT:    retq
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
272   ret i32 %res
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:
278 ; SSE:       # %bb.0:
279 ; SSE-NEXT:    movl %esi, %eax
280 ; SSE-NEXT:    ucomiss %xmm1, %xmm0
281 ; SSE-NEXT:    cmovnel %edi, %eax
282 ; SSE-NEXT:    cmovpl %edi, %eax
283 ; SSE-NEXT:    retq
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:
294 ; AVX10_2:       # %bb.0:
295 ; AVX10_2-NEXT:    movl %edi, %eax
296 ; AVX10_2-NEXT:    vucomxss %xmm1, %xmm0
297 ; AVX10_2-NEXT:    cmovel %esi, %eax
298 ; AVX10_2-NEXT:    retq
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
302   ret i32 %res
304 declare i32 @llvm.x86.sse.ucomineq.ss(<4 x float>, <4 x float>) nounwind readnone
307 ; SSE2
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:
312 ; SSE:       # %bb.0:
313 ; SSE-NEXT:    movl %edi, %eax
314 ; SSE-NEXT:    comisd %xmm1, %xmm0
315 ; SSE-NEXT:    setnp %cl
316 ; SSE-NEXT:    sete %dl
317 ; SSE-NEXT:    testb %cl, %dl
318 ; SSE-NEXT:    cmovnel %esi, %eax
319 ; SSE-NEXT:    retq
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:
332 ; AVX10_2:       # %bb.0:
333 ; AVX10_2-NEXT:    movl %edi, %eax
334 ; AVX10_2-NEXT:    vcomxsd %xmm1, %xmm0
335 ; AVX10_2-NEXT:    cmovel %esi, %eax
336 ; AVX10_2-NEXT:    retq
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
340   ret i32 %res
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:
346 ; SSE:       # %bb.0:
347 ; SSE-NEXT:    movl %edi, %eax
348 ; SSE-NEXT:    comisd %xmm1, %xmm0
349 ; SSE-NEXT:    cmovbl %esi, %eax
350 ; SSE-NEXT:    retq
352 ; AVX-LABEL: test_x86_sse2_comige_sd:
353 ; AVX:       # %bb.0:
354 ; AVX-NEXT:    movl %edi, %eax
355 ; AVX-NEXT:    vcomisd %xmm1, %xmm0
356 ; AVX-NEXT:    cmovbl %esi, %eax
357 ; AVX-NEXT:    retq
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
361   ret i32 %res
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:
367 ; SSE:       # %bb.0:
368 ; SSE-NEXT:    movl %edi, %eax
369 ; SSE-NEXT:    comisd %xmm1, %xmm0
370 ; SSE-NEXT:    cmoval %esi, %eax
371 ; SSE-NEXT:    retq
373 ; AVX-LABEL: test_x86_sse2_comigt_sd:
374 ; AVX:       # %bb.0:
375 ; AVX-NEXT:    movl %edi, %eax
376 ; AVX-NEXT:    vcomisd %xmm1, %xmm0
377 ; AVX-NEXT:    cmoval %esi, %eax
378 ; AVX-NEXT:    retq
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
382   ret i32 %res
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:
388 ; SSE:       # %bb.0:
389 ; SSE-NEXT:    movl %edi, %eax
390 ; SSE-NEXT:    comisd %xmm0, %xmm1
391 ; SSE-NEXT:    cmovbl %esi, %eax
392 ; SSE-NEXT:    retq
394 ; AVX-LABEL: test_x86_sse2_comile_sd:
395 ; AVX:       # %bb.0:
396 ; AVX-NEXT:    movl %edi, %eax
397 ; AVX-NEXT:    vcomisd %xmm0, %xmm1
398 ; AVX-NEXT:    cmovbl %esi, %eax
399 ; AVX-NEXT:    retq
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
403   ret i32 %res
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:
409 ; SSE:       # %bb.0:
410 ; SSE-NEXT:    movl %edi, %eax
411 ; SSE-NEXT:    comisd %xmm0, %xmm1
412 ; SSE-NEXT:    cmoval %esi, %eax
413 ; SSE-NEXT:    retq
415 ; AVX-LABEL: test_x86_sse2_comilt_sd:
416 ; AVX:       # %bb.0:
417 ; AVX-NEXT:    movl %edi, %eax
418 ; AVX-NEXT:    vcomisd %xmm0, %xmm1
419 ; AVX-NEXT:    cmoval %esi, %eax
420 ; AVX-NEXT:    retq
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
424   ret i32 %res
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:
430 ; SSE:       # %bb.0:
431 ; SSE-NEXT:    movl %esi, %eax
432 ; SSE-NEXT:    comisd %xmm1, %xmm0
433 ; SSE-NEXT:    cmovnel %edi, %eax
434 ; SSE-NEXT:    cmovpl %edi, %eax
435 ; SSE-NEXT:    retq
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:
446 ; AVX10_2:       # %bb.0:
447 ; AVX10_2-NEXT:    movl %edi, %eax
448 ; AVX10_2-NEXT:    vcomxsd %xmm1, %xmm0
449 ; AVX10_2-NEXT:    cmovel %esi, %eax
450 ; AVX10_2-NEXT:    retq
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
454   ret i32 %res
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:
460 ; SSE:       # %bb.0:
461 ; SSE-NEXT:    movl %edi, %eax
462 ; SSE-NEXT:    ucomisd %xmm1, %xmm0
463 ; SSE-NEXT:    setnp %cl
464 ; SSE-NEXT:    sete %dl
465 ; SSE-NEXT:    testb %cl, %dl
466 ; SSE-NEXT:    cmovnel %esi, %eax
467 ; SSE-NEXT:    retq
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:
480 ; AVX10_2:       # %bb.0:
481 ; AVX10_2-NEXT:    movl %edi, %eax
482 ; AVX10_2-NEXT:    vucomxsd %xmm1, %xmm0
483 ; AVX10_2-NEXT:    cmovel %esi, %eax
484 ; AVX10_2-NEXT:    retq
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
488   ret i32 %res
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:
494 ; SSE:       # %bb.0:
495 ; SSE-NEXT:    movl %edi, %eax
496 ; SSE-NEXT:    ucomisd %xmm1, %xmm0
497 ; SSE-NEXT:    cmovbl %esi, %eax
498 ; SSE-NEXT:    retq
500 ; AVX-LABEL: test_x86_sse2_ucomige_sd:
501 ; AVX:       # %bb.0:
502 ; AVX-NEXT:    movl %edi, %eax
503 ; AVX-NEXT:    vucomisd %xmm1, %xmm0
504 ; AVX-NEXT:    cmovbl %esi, %eax
505 ; AVX-NEXT:    retq
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
509   ret i32 %res
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:
515 ; SSE:       # %bb.0:
516 ; SSE-NEXT:    movl %edi, %eax
517 ; SSE-NEXT:    ucomisd %xmm1, %xmm0
518 ; SSE-NEXT:    cmoval %esi, %eax
519 ; SSE-NEXT:    retq
521 ; AVX-LABEL: test_x86_sse2_ucomigt_sd:
522 ; AVX:       # %bb.0:
523 ; AVX-NEXT:    movl %edi, %eax
524 ; AVX-NEXT:    vucomisd %xmm1, %xmm0
525 ; AVX-NEXT:    cmoval %esi, %eax
526 ; AVX-NEXT:    retq
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
530   ret i32 %res
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:
536 ; SSE:       # %bb.0:
537 ; SSE-NEXT:    movl %edi, %eax
538 ; SSE-NEXT:    ucomisd %xmm0, %xmm1
539 ; SSE-NEXT:    cmovbl %esi, %eax
540 ; SSE-NEXT:    retq
542 ; AVX-LABEL: test_x86_sse2_ucomile_sd:
543 ; AVX:       # %bb.0:
544 ; AVX-NEXT:    movl %edi, %eax
545 ; AVX-NEXT:    vucomisd %xmm0, %xmm1
546 ; AVX-NEXT:    cmovbl %esi, %eax
547 ; AVX-NEXT:    retq
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
551   ret i32 %res
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:
557 ; SSE:       # %bb.0:
558 ; SSE-NEXT:    movl %edi, %eax
559 ; SSE-NEXT:    ucomisd %xmm0, %xmm1
560 ; SSE-NEXT:    cmoval %esi, %eax
561 ; SSE-NEXT:    retq
563 ; AVX-LABEL: test_x86_sse2_ucomilt_sd:
564 ; AVX:       # %bb.0:
565 ; AVX-NEXT:    movl %edi, %eax
566 ; AVX-NEXT:    vucomisd %xmm0, %xmm1
567 ; AVX-NEXT:    cmoval %esi, %eax
568 ; AVX-NEXT:    retq
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
572   ret i32 %res
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:
578 ; SSE:       # %bb.0:
579 ; SSE-NEXT:    movl %esi, %eax
580 ; SSE-NEXT:    ucomisd %xmm1, %xmm0
581 ; SSE-NEXT:    cmovnel %edi, %eax
582 ; SSE-NEXT:    cmovpl %edi, %eax
583 ; SSE-NEXT:    retq
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:
594 ; AVX10_2:       # %bb.0:
595 ; AVX10_2-NEXT:    movl %edi, %eax
596 ; AVX10_2-NEXT:    vucomxsd %xmm1, %xmm0
597 ; AVX10_2-NEXT:    cmovel %esi, %eax
598 ; AVX10_2-NEXT:    retq
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
602   ret i32 %res
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
611 ; SSE-NEXT:    sete %cl
612 ; SSE-NEXT:    testb %al, %cl
613 ; SSE-NEXT:    jne foo@PLT # TAILCALL
614 ; SSE-NEXT:  # %bb.1: # %if.end
615 ; SSE-NEXT:    retq
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
632 ; AVX10_2-NEXT:    retq
633 entry:
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
638 if.then:
639   tail call void @foo()
640   br label %if.end
642 if.end:
643   ret void
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
650 ; SSE-NEXT:    setp %al
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
655 ; SSE-NEXT:    retq
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
672 ; AVX10_2-NEXT:    retq
673 entry:
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
678 if.then:
679   tail call void @foo()
680   br label %if.end
682 if.end:
683   ret void
685 declare void @foo()