Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(305)

Side by Side Diff: tests_lit/llvm2ice_tests/fp.pnacl.ll

Issue 1266263003: Add the ARM32 FP register table entries, simple arith, and args. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: format more Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 ; This tries to be a comprehensive test of f32 and f64 operations.
2 ; The CHECK lines are only checking for basic instruction patterns
3 ; that should be present regardless of the optimization level, so
4 ; there are no special OPTM1 match lines.
5
6 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 | FileCheck %s
7 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 | FileCheck %s
8
9 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4
10 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4
11 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8
12 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4
13
14 define internal i32 @doubleArgs(double %a, i32 %b, double %c) {
15 entry:
16 ret i32 %b
17 }
18 ; CHECK-LABEL: doubleArgs
19 ; CHECK: mov eax,DWORD PTR [esp+0xc]
20 ; CHECK-NEXT: ret
21
22 define internal i32 @floatArgs(float %a, i32 %b, float %c) {
23 entry:
24 ret i32 %b
25 }
26 ; CHECK-LABEL: floatArgs
27 ; CHECK: mov eax,DWORD PTR [esp+0x8]
28 ; CHECK-NEXT: ret
29
30 define internal i32 @passFpArgs(float %a, double %b, float %c, double %d, float %e, double %f) {
31 entry:
32 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double %b)
33 %call1 = call i32 @ignoreFpArgsNoInline(float %c, i32 123, double %d)
34 %call2 = call i32 @ignoreFpArgsNoInline(float %e, i32 123, double %f)
35 %add = add i32 %call1, %call
36 %add3 = add i32 %add, %call2
37 ret i32 %add3
38 }
39 ; CHECK-LABEL: passFpArgs
40 ; CHECK: mov DWORD PTR [esp+0x4],0x7b
41 ; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline
42 ; CHECK: mov DWORD PTR [esp+0x4],0x7b
43 ; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline
44 ; CHECK: mov DWORD PTR [esp+0x4],0x7b
45 ; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline
46
47 declare i32 @ignoreFpArgsNoInline(float %x, i32 %y, double %z)
48
49 define internal i32 @passFpConstArg(float %a, double %b) {
50 entry:
51 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double 2.340000e+00)
52 ret i32 %call
53 }
54 ; CHECK-LABEL: passFpConstArg
55 ; CHECK: mov DWORD PTR [esp+0x4],0x7b
56 ; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline
57
58 define internal i32 @passFp32ConstArg(float %a) {
59 entry:
60 %call = call i32 @ignoreFp32ArgsNoInline(float %a, i32 123, float 2.0)
61 ret i32 %call
62 }
63 ; CHECK-LABEL: passFp32ConstArg
64 ; CHECK: mov DWORD PTR [esp+0x4],0x7b
65 ; CHECK: movss DWORD PTR [esp+0x8]
66 ; CHECK: call {{.*}} R_{{.*}} ignoreFp32ArgsNoInline
67
68 declare i32 @ignoreFp32ArgsNoInline(float %x, i32 %y, float %z)
69
70 define internal float @returnFloatArg(float %a) {
71 entry:
72 ret float %a
73 }
74 ; CHECK-LABEL: returnFloatArg
75 ; CHECK: fld DWORD PTR [esp
76
77 define internal double @returnDoubleArg(double %a) {
78 entry:
79 ret double %a
80 }
81 ; CHECK-LABEL: returnDoubleArg
82 ; CHECK: fld QWORD PTR [esp
83
84 define internal float @returnFloatConst() {
85 entry:
86 ret float 0x3FF3AE1480000000
87 }
88 ; CHECK-LABEL: returnFloatConst
89 ; CHECK: fld
90
91 define internal double @returnDoubleConst() {
92 entry:
93 ret double 1.230000e+00
94 }
95 ; CHECK-LABEL: returnDoubleConst
96 ; CHECK: fld
97
98 define internal float @addFloat(float %a, float %b) {
99 entry:
100 %add = fadd float %a, %b
101 ret float %add
102 }
103 ; CHECK-LABEL: addFloat
104 ; CHECK: addss
105 ; CHECK: fld
106
107 define internal double @addDouble(double %a, double %b) {
108 entry:
109 %add = fadd double %a, %b
110 ret double %add
111 }
112 ; CHECK-LABEL: addDouble
113 ; CHECK: addsd
114 ; CHECK: fld
115
116 define internal float @subFloat(float %a, float %b) {
117 entry:
118 %sub = fsub float %a, %b
119 ret float %sub
120 }
121 ; CHECK-LABEL: subFloat
122 ; CHECK: subss
123 ; CHECK: fld
124
125 define internal double @subDouble(double %a, double %b) {
126 entry:
127 %sub = fsub double %a, %b
128 ret double %sub
129 }
130 ; CHECK-LABEL: subDouble
131 ; CHECK: subsd
132 ; CHECK: fld
133
134 define internal float @mulFloat(float %a, float %b) {
135 entry:
136 %mul = fmul float %a, %b
137 ret float %mul
138 }
139 ; CHECK-LABEL: mulFloat
140 ; CHECK: mulss
141 ; CHECK: fld
142
143 define internal double @mulDouble(double %a, double %b) {
144 entry:
145 %mul = fmul double %a, %b
146 ret double %mul
147 }
148 ; CHECK-LABEL: mulDouble
149 ; CHECK: mulsd
150 ; CHECK: fld
151
152 define internal float @divFloat(float %a, float %b) {
153 entry:
154 %div = fdiv float %a, %b
155 ret float %div
156 }
157 ; CHECK-LABEL: divFloat
158 ; CHECK: divss
159 ; CHECK: fld
160
161 define internal double @divDouble(double %a, double %b) {
162 entry:
163 %div = fdiv double %a, %b
164 ret double %div
165 }
166 ; CHECK-LABEL: divDouble
167 ; CHECK: divsd
168 ; CHECK: fld
169
170 define internal float @remFloat(float %a, float %b) {
171 entry:
172 %div = frem float %a, %b
173 ret float %div
174 }
175 ; CHECK-LABEL: remFloat
176 ; CHECK: call {{.*}} R_{{.*}} fmodf
177
178 define internal double @remDouble(double %a, double %b) {
179 entry:
180 %div = frem double %a, %b
181 ret double %div
182 }
183 ; CHECK-LABEL: remDouble
184 ; CHECK: call {{.*}} R_{{.*}} fmod
185
186 define internal float @fptrunc(double %a) {
187 entry:
188 %conv = fptrunc double %a to float
189 ret float %conv
190 }
191 ; CHECK-LABEL: fptrunc
192 ; CHECK: cvtsd2ss
193 ; CHECK: fld
194
195 define internal double @fpext(float %a) {
196 entry:
197 %conv = fpext float %a to double
198 ret double %conv
199 }
200 ; CHECK-LABEL: fpext
201 ; CHECK: cvtss2sd
202 ; CHECK: fld
203
204 define internal i64 @doubleToSigned64(double %a) {
205 entry:
206 %conv = fptosi double %a to i64
207 ret i64 %conv
208 }
209 ; CHECK-LABEL: doubleToSigned64
210 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptosi_f64_i64
211
212 define internal i64 @floatToSigned64(float %a) {
213 entry:
214 %conv = fptosi float %a to i64
215 ret i64 %conv
216 }
217 ; CHECK-LABEL: floatToSigned64
218 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptosi_f32_i64
219
220 define internal i64 @doubleToUnsigned64(double %a) {
221 entry:
222 %conv = fptoui double %a to i64
223 ret i64 %conv
224 }
225 ; CHECK-LABEL: doubleToUnsigned64
226 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f64_i64
227
228 define internal i64 @floatToUnsigned64(float %a) {
229 entry:
230 %conv = fptoui float %a to i64
231 ret i64 %conv
232 }
233 ; CHECK-LABEL: floatToUnsigned64
234 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f32_i64
235
236 define internal i32 @doubleToSigned32(double %a) {
237 entry:
238 %conv = fptosi double %a to i32
239 ret i32 %conv
240 }
241 ; CHECK-LABEL: doubleToSigned32
242 ; CHECK: cvttsd2si
243
244 define internal i32 @doubleToSigned32Const() {
245 entry:
246 %conv = fptosi double 867.5309 to i32
247 ret i32 %conv
248 }
249 ; CHECK-LABEL: doubleToSigned32Const
250 ; CHECK: cvttsd2si
251
252 define internal i32 @floatToSigned32(float %a) {
253 entry:
254 %conv = fptosi float %a to i32
255 ret i32 %conv
256 }
257 ; CHECK-LABEL: floatToSigned32
258 ; CHECK: cvttss2si
259
260 define internal i32 @doubleToUnsigned32(double %a) {
261 entry:
262 %conv = fptoui double %a to i32
263 ret i32 %conv
264 }
265 ; CHECK-LABEL: doubleToUnsigned32
266 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f64_i32
267
268 define internal i32 @floatToUnsigned32(float %a) {
269 entry:
270 %conv = fptoui float %a to i32
271 ret i32 %conv
272 }
273 ; CHECK-LABEL: floatToUnsigned32
274 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f32_i32
275
276 define internal i32 @doubleToSigned16(double %a) {
277 entry:
278 %conv = fptosi double %a to i16
279 %conv.ret_ext = sext i16 %conv to i32
280 ret i32 %conv.ret_ext
281 }
282 ; CHECK-LABEL: doubleToSigned16
283 ; CHECK: cvttsd2si
284 ; CHECK: movsx
285
286 define internal i32 @floatToSigned16(float %a) {
287 entry:
288 %conv = fptosi float %a to i16
289 %conv.ret_ext = sext i16 %conv to i32
290 ret i32 %conv.ret_ext
291 }
292 ; CHECK-LABEL: floatToSigned16
293 ; CHECK: cvttss2si
294 ; CHECK: movsx
295
296 define internal i32 @doubleToUnsigned16(double %a) {
297 entry:
298 %conv = fptoui double %a to i16
299 %conv.ret_ext = zext i16 %conv to i32
300 ret i32 %conv.ret_ext
301 }
302 ; CHECK-LABEL: doubleToUnsigned16
303 ; CHECK: cvttsd2si
304 ; CHECK: movzx
305
306 define internal i32 @floatToUnsigned16(float %a) {
307 entry:
308 %conv = fptoui float %a to i16
309 %conv.ret_ext = zext i16 %conv to i32
310 ret i32 %conv.ret_ext
311 }
312 ; CHECK-LABEL: floatToUnsigned16
313 ; CHECK: cvttss2si
314 ; CHECK: movzx
315
316 define internal i32 @doubleToSigned8(double %a) {
317 entry:
318 %conv = fptosi double %a to i8
319 %conv.ret_ext = sext i8 %conv to i32
320 ret i32 %conv.ret_ext
321 }
322 ; CHECK-LABEL: doubleToSigned8
323 ; CHECK: cvttsd2si
324 ; CHECK: movsx
325
326 define internal i32 @floatToSigned8(float %a) {
327 entry:
328 %conv = fptosi float %a to i8
329 %conv.ret_ext = sext i8 %conv to i32
330 ret i32 %conv.ret_ext
331 }
332 ; CHECK-LABEL: floatToSigned8
333 ; CHECK: cvttss2si
334 ; CHECK: movsx
335
336 define internal i32 @doubleToUnsigned8(double %a) {
337 entry:
338 %conv = fptoui double %a to i8
339 %conv.ret_ext = zext i8 %conv to i32
340 ret i32 %conv.ret_ext
341 }
342 ; CHECK-LABEL: doubleToUnsigned8
343 ; CHECK: cvttsd2si
344 ; CHECK: movzx
345
346 define internal i32 @floatToUnsigned8(float %a) {
347 entry:
348 %conv = fptoui float %a to i8
349 %conv.ret_ext = zext i8 %conv to i32
350 ret i32 %conv.ret_ext
351 }
352 ; CHECK-LABEL: floatToUnsigned8
353 ; CHECK: cvttss2si
354 ; CHECK: movzx
355
356 define internal i32 @doubleToUnsigned1(double %a) {
357 entry:
358 %tobool = fptoui double %a to i1
359 %tobool.ret_ext = zext i1 %tobool to i32
360 ret i32 %tobool.ret_ext
361 }
362 ; CHECK-LABEL: doubleToUnsigned1
363 ; CHECK: cvttsd2si
364 ; CHECK: and eax,0x1
365
366 define internal i32 @floatToUnsigned1(float %a) {
367 entry:
368 %tobool = fptoui float %a to i1
369 %tobool.ret_ext = zext i1 %tobool to i32
370 ret i32 %tobool.ret_ext
371 }
372 ; CHECK-LABEL: floatToUnsigned1
373 ; CHECK: cvttss2si
374 ; CHECK: and eax,0x1
375
376 define internal double @signed64ToDouble(i64 %a) {
377 entry:
378 %conv = sitofp i64 %a to double
379 ret double %conv
380 }
381 ; CHECK-LABEL: signed64ToDouble
382 ; CHECK: call {{.*}} R_{{.*}} __Sz_sitofp_i64_f64
383 ; CHECK: fstp QWORD
384
385 define internal float @signed64ToFloat(i64 %a) {
386 entry:
387 %conv = sitofp i64 %a to float
388 ret float %conv
389 }
390 ; CHECK-LABEL: signed64ToFloat
391 ; CHECK: call {{.*}} R_{{.*}} __Sz_sitofp_i64_f32
392 ; CHECK: fstp DWORD
393
394 define internal double @unsigned64ToDouble(i64 %a) {
395 entry:
396 %conv = uitofp i64 %a to double
397 ret double %conv
398 }
399 ; CHECK-LABEL: unsigned64ToDouble
400 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f64
401 ; CHECK: fstp
402
403 define internal float @unsigned64ToFloat(i64 %a) {
404 entry:
405 %conv = uitofp i64 %a to float
406 ret float %conv
407 }
408 ; CHECK-LABEL: unsigned64ToFloat
409 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f32
410 ; CHECK: fstp
411
412 define internal double @unsigned64ToDoubleConst() {
413 entry:
414 %conv = uitofp i64 12345678901234 to double
415 ret double %conv
416 }
417 ; CHECK-LABEL: unsigned64ToDouble
418 ; CHECK: mov DWORD PTR [esp+0x4],0xb3a
419 ; CHECK: mov DWORD PTR [esp],0x73ce2ff2
420 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f64
421 ; CHECK: fstp
422
423 define internal double @signed32ToDouble(i32 %a) {
424 entry:
425 %conv = sitofp i32 %a to double
426 ret double %conv
427 }
428 ; CHECK-LABEL: signed32ToDouble
429 ; CHECK: cvtsi2sd
430 ; CHECK: fld
431
432 define internal double @signed32ToDoubleConst() {
433 entry:
434 %conv = sitofp i32 123 to double
435 ret double %conv
436 }
437 ; CHECK-LABEL: signed32ToDoubleConst
438 ; CHECK: cvtsi2sd {{.*[^1]}}
439 ; CHECK: fld
440
441 define internal float @signed32ToFloat(i32 %a) {
442 entry:
443 %conv = sitofp i32 %a to float
444 ret float %conv
445 }
446 ; CHECK-LABEL: signed32ToFloat
447 ; CHECK: cvtsi2ss
448 ; CHECK: fld
449
450 define internal double @unsigned32ToDouble(i32 %a) {
451 entry:
452 %conv = uitofp i32 %a to double
453 ret double %conv
454 }
455 ; CHECK-LABEL: unsigned32ToDouble
456 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i32_f64
457 ; CHECK: fstp QWORD
458
459 define internal float @unsigned32ToFloat(i32 %a) {
460 entry:
461 %conv = uitofp i32 %a to float
462 ret float %conv
463 }
464 ; CHECK-LABEL: unsigned32ToFloat
465 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i32_f32
466 ; CHECK: fstp DWORD
467
468 define internal double @signed16ToDouble(i32 %a) {
469 entry:
470 %a.arg_trunc = trunc i32 %a to i16
471 %conv = sitofp i16 %a.arg_trunc to double
472 ret double %conv
473 }
474 ; CHECK-LABEL: signed16ToDouble
475 ; CHECK: cvtsi2sd
476 ; CHECK: fld QWORD
477
478 define internal float @signed16ToFloat(i32 %a) {
479 entry:
480 %a.arg_trunc = trunc i32 %a to i16
481 %conv = sitofp i16 %a.arg_trunc to float
482 ret float %conv
483 }
484 ; CHECK-LABEL: signed16ToFloat
485 ; CHECK: cvtsi2ss
486 ; CHECK: fld DWORD
487
488 define internal double @unsigned16ToDouble(i32 %a) {
489 entry:
490 %a.arg_trunc = trunc i32 %a to i16
491 %conv = uitofp i16 %a.arg_trunc to double
492 ret double %conv
493 }
494 ; CHECK-LABEL: unsigned16ToDouble
495 ; CHECK: cvtsi2sd
496 ; CHECK: fld
497
498 define internal double @unsigned16ToDoubleConst() {
499 entry:
500 %conv = uitofp i16 12345 to double
501 ret double %conv
502 }
503 ; CHECK-LABEL: unsigned16ToDoubleConst
504 ; CHECK: cvtsi2sd
505 ; CHECK: fld
506
507 define internal float @unsigned16ToFloat(i32 %a) {
508 entry:
509 %a.arg_trunc = trunc i32 %a to i16
510 %conv = uitofp i16 %a.arg_trunc to float
511 ret float %conv
512 }
513 ; CHECK-LABEL: unsigned16ToFloat
514 ; CHECK: cvtsi2ss
515 ; CHECK: fld
516
517 define internal double @signed8ToDouble(i32 %a) {
518 entry:
519 %a.arg_trunc = trunc i32 %a to i8
520 %conv = sitofp i8 %a.arg_trunc to double
521 ret double %conv
522 }
523 ; CHECK-LABEL: signed8ToDouble
524 ; CHECK: cvtsi2sd
525 ; CHECK: fld
526
527 define internal float @signed8ToFloat(i32 %a) {
528 entry:
529 %a.arg_trunc = trunc i32 %a to i8
530 %conv = sitofp i8 %a.arg_trunc to float
531 ret float %conv
532 }
533 ; CHECK-LABEL: signed8ToFloat
534 ; CHECK: cvtsi2ss
535 ; CHECK: fld
536
537 define internal double @unsigned8ToDouble(i32 %a) {
538 entry:
539 %a.arg_trunc = trunc i32 %a to i8
540 %conv = uitofp i8 %a.arg_trunc to double
541 ret double %conv
542 }
543 ; CHECK-LABEL: unsigned8ToDouble
544 ; CHECK: cvtsi2sd
545 ; CHECK: fld
546
547 define internal float @unsigned8ToFloat(i32 %a) {
548 entry:
549 %a.arg_trunc = trunc i32 %a to i8
550 %conv = uitofp i8 %a.arg_trunc to float
551 ret float %conv
552 }
553 ; CHECK-LABEL: unsigned8ToFloat
554 ; CHECK: cvtsi2ss
555 ; CHECK: fld
556
557 define internal double @unsigned1ToDouble(i32 %a) {
558 entry:
559 %a.arg_trunc = trunc i32 %a to i1
560 %conv = uitofp i1 %a.arg_trunc to double
561 ret double %conv
562 }
563 ; CHECK-LABEL: unsigned1ToDouble
564 ; CHECK: cvtsi2sd
565 ; CHECK: fld
566
567 define internal float @unsigned1ToFloat(i32 %a) {
568 entry:
569 %a.arg_trunc = trunc i32 %a to i1
570 %conv = uitofp i1 %a.arg_trunc to float
571 ret float %conv
572 }
573 ; CHECK-LABEL: unsigned1ToFloat
574 ; CHECK: cvtsi2ss
575 ; CHECK: fld
576
577 define internal float @int32BitcastToFloat(i32 %a) {
578 entry:
579 %conv = bitcast i32 %a to float
580 ret float %conv
581 }
582 ; CHECK-LABEL: int32BitcastToFloat
583 ; CHECK: mov
584
585 define internal float @int32BitcastToFloatConst() {
586 entry:
587 %conv = bitcast i32 8675309 to float
588 ret float %conv
589 }
590 ; CHECK-LABEL: int32BitcastToFloatConst
591 ; CHECK: mov
592
593 define internal double @int64BitcastToDouble(i64 %a) {
594 entry:
595 %conv = bitcast i64 %a to double
596 ret double %conv
597 }
598 ; CHECK-LABEL: int64BitcastToDouble
599 ; CHECK: mov
600
601 define internal double @int64BitcastToDoubleConst() {
602 entry:
603 %conv = bitcast i64 9035768 to double
604 ret double %conv
605 }
606 ; CHECK-LABEL: int64BitcastToDoubleConst
607 ; CHECK: mov
608
609 define internal void @fcmpEq(float %a, float %b, double %c, double %d) {
610 entry:
611 %cmp = fcmp oeq float %a, %b
612 br i1 %cmp, label %if.then, label %if.end
613
614 if.then: ; preds = %entry
615 call void @func()
616 br label %if.end
617
618 if.end: ; preds = %if.then, %entry
619 %cmp1 = fcmp oeq double %c, %d
620 br i1 %cmp1, label %if.then2, label %if.end3
621
622 if.then2: ; preds = %if.end
623 call void @func()
624 br label %if.end3
625
626 if.end3: ; preds = %if.then2, %if.end
627 ret void
628 }
629 ; CHECK-LABEL: fcmpEq
630 ; CHECK: ucomiss
631 ; CHECK: jne
632 ; CHECK-NEXT: jp
633 ; CHECK: call {{.*}} R_{{.*}} func
634 ; CHECK: ucomisd
635 ; CHECK: jne
636 ; CHECK-NEXT: jp
637 ; CHECK: call {{.*}} R_{{.*}} func
638
639 declare void @func()
640
641 define internal void @fcmpNe(float %a, float %b, double %c, double %d) {
642 entry:
643 %cmp = fcmp une float %a, %b
644 br i1 %cmp, label %if.then, label %if.end
645
646 if.then: ; preds = %entry
647 call void @func()
648 br label %if.end
649
650 if.end: ; preds = %if.then, %entry
651 %cmp1 = fcmp une double %c, %d
652 br i1 %cmp1, label %if.then2, label %if.end3
653
654 if.then2: ; preds = %if.end
655 call void @func()
656 br label %if.end3
657
658 if.end3: ; preds = %if.then2, %if.end
659 ret void
660 }
661 ; CHECK-LABEL: fcmpNe
662 ; CHECK: ucomiss
663 ; CHECK: jne
664 ; CHECK-NEXT: jp
665 ; CHECK: call {{.*}} R_{{.*}} func
666 ; CHECK: ucomisd
667 ; CHECK: jne
668 ; CHECK-NEXT: jp
669 ; CHECK: call {{.*}} R_{{.*}} func
670
671 define internal void @fcmpGt(float %a, float %b, double %c, double %d) {
672 entry:
673 %cmp = fcmp ogt float %a, %b
674 br i1 %cmp, label %if.then, label %if.end
675
676 if.then: ; preds = %entry
677 call void @func()
678 br label %if.end
679
680 if.end: ; preds = %if.then, %entry
681 %cmp1 = fcmp ogt double %c, %d
682 br i1 %cmp1, label %if.then2, label %if.end3
683
684 if.then2: ; preds = %if.end
685 call void @func()
686 br label %if.end3
687
688 if.end3: ; preds = %if.then2, %if.end
689 ret void
690 }
691 ; CHECK-LABEL: fcmpGt
692 ; CHECK: ucomiss
693 ; CHECK: seta
694 ; CHECK: call {{.*}} R_{{.*}} func
695 ; CHECK: ucomisd
696 ; CHECK: seta
697 ; CHECK: call {{.*}} R_{{.*}} func
698
699 define internal void @fcmpGe(float %a, float %b, double %c, double %d) {
700 entry:
701 %cmp = fcmp ult float %a, %b
702 br i1 %cmp, label %if.end, label %if.then
703
704 if.then: ; preds = %entry
705 call void @func()
706 br label %if.end
707
708 if.end: ; preds = %entry, %if.then
709 %cmp1 = fcmp ult double %c, %d
710 br i1 %cmp1, label %if.end3, label %if.then2
711
712 if.then2: ; preds = %if.end
713 call void @func()
714 br label %if.end3
715
716 if.end3: ; preds = %if.end, %if.then2
717 ret void
718 }
719 ; CHECK-LABEL: fcmpGe
720 ; CHECK: ucomiss
721 ; CHECK: setb
722 ; CHECK: call {{.*}} R_{{.*}} func
723 ; CHECK: ucomisd
724 ; CHECK: setb
725 ; CHECK: call {{.*}} R_{{.*}} func
726
727 define internal void @fcmpLt(float %a, float %b, double %c, double %d) {
728 entry:
729 %cmp = fcmp olt float %a, %b
730 br i1 %cmp, label %if.then, label %if.end
731
732 if.then: ; preds = %entry
733 call void @func()
734 br label %if.end
735
736 if.end: ; preds = %if.then, %entry
737 %cmp1 = fcmp olt double %c, %d
738 br i1 %cmp1, label %if.then2, label %if.end3
739
740 if.then2: ; preds = %if.end
741 call void @func()
742 br label %if.end3
743
744 if.end3: ; preds = %if.then2, %if.end
745 ret void
746 }
747 ; CHECK-LABEL: fcmpLt
748 ; CHECK: ucomiss
749 ; CHECK: seta
750 ; CHECK: call {{.*}} R_{{.*}} func
751 ; CHECK: ucomisd
752 ; CHECK: seta
753 ; CHECK: call {{.*}} R_{{.*}} func
754
755 define internal void @fcmpLe(float %a, float %b, double %c, double %d) {
756 entry:
757 %cmp = fcmp ugt float %a, %b
758 br i1 %cmp, label %if.end, label %if.then
759
760 if.then: ; preds = %entry
761 call void @func()
762 br label %if.end
763
764 if.end: ; preds = %entry, %if.then
765 %cmp1 = fcmp ugt double %c, %d
766 br i1 %cmp1, label %if.end3, label %if.then2
767
768 if.then2: ; preds = %if.end
769 call void @func()
770 br label %if.end3
771
772 if.end3: ; preds = %if.end, %if.then2
773 ret void
774 }
775 ; CHECK-LABEL: fcmpLe
776 ; CHECK: ucomiss
777 ; CHECK: setb
778 ; CHECK: call {{.*}} R_{{.*}} func
779 ; CHECK: ucomisd
780 ; CHECK: setb
781 ; CHECK: call {{.*}} R_{{.*}} func
782
783 define internal i32 @fcmpFalseFloat(float %a, float %b) {
784 entry:
785 %cmp = fcmp false float %a, %b
786 %cmp.ret_ext = zext i1 %cmp to i32
787 ret i32 %cmp.ret_ext
788 }
789 ; CHECK-LABEL: fcmpFalseFloat
790 ; CHECK: mov {{.*}},0x0
791
792 define internal i32 @fcmpFalseDouble(double %a, double %b) {
793 entry:
794 %cmp = fcmp false double %a, %b
795 %cmp.ret_ext = zext i1 %cmp to i32
796 ret i32 %cmp.ret_ext
797 }
798 ; CHECK-LABEL: fcmpFalseDouble
799 ; CHECK: mov {{.*}},0x0
800
801 define internal i32 @fcmpOeqFloat(float %a, float %b) {
802 entry:
803 %cmp = fcmp oeq float %a, %b
804 %cmp.ret_ext = zext i1 %cmp to i32
805 ret i32 %cmp.ret_ext
806 }
807 ; CHECK-LABEL: fcmpOeqFloat
808 ; CHECK: ucomiss
809 ; CHECK: jne
810 ; CHECK: jp
811
812 define internal i32 @fcmpOeqDouble(double %a, double %b) {
813 entry:
814 %cmp = fcmp oeq double %a, %b
815 %cmp.ret_ext = zext i1 %cmp to i32
816 ret i32 %cmp.ret_ext
817 }
818 ; CHECK-LABEL: fcmpOeqDouble
819 ; CHECK: ucomisd
820 ; CHECK: jne
821 ; CHECK: jp
822
823 define internal i32 @fcmpOgtFloat(float %a, float %b) {
824 entry:
825 %cmp = fcmp ogt float %a, %b
826 %cmp.ret_ext = zext i1 %cmp to i32
827 ret i32 %cmp.ret_ext
828 }
829 ; CHECK-LABEL: fcmpOgtFloat
830 ; CHECK: ucomiss
831 ; CHECK: seta
832
833 define internal i32 @fcmpOgtDouble(double %a, double %b) {
834 entry:
835 %cmp = fcmp ogt double %a, %b
836 %cmp.ret_ext = zext i1 %cmp to i32
837 ret i32 %cmp.ret_ext
838 }
839 ; CHECK-LABEL: fcmpOgtDouble
840 ; CHECK: ucomisd
841 ; CHECK: seta
842
843 define internal i32 @fcmpOgeFloat(float %a, float %b) {
844 entry:
845 %cmp = fcmp oge float %a, %b
846 %cmp.ret_ext = zext i1 %cmp to i32
847 ret i32 %cmp.ret_ext
848 }
849 ; CHECK-LABEL: fcmpOgeFloat
850 ; CHECK: ucomiss
851 ; CHECK: setae
852
853 define internal i32 @fcmpOgeDouble(double %a, double %b) {
854 entry:
855 %cmp = fcmp oge double %a, %b
856 %cmp.ret_ext = zext i1 %cmp to i32
857 ret i32 %cmp.ret_ext
858 }
859 ; CHECK-LABEL: fcmpOgeDouble
860 ; CHECK: ucomisd
861 ; CHECK: setae
862
863 define internal i32 @fcmpOltFloat(float %a, float %b) {
864 entry:
865 %cmp = fcmp olt float %a, %b
866 %cmp.ret_ext = zext i1 %cmp to i32
867 ret i32 %cmp.ret_ext
868 }
869 ; CHECK-LABEL: fcmpOltFloat
870 ; CHECK: ucomiss
871 ; CHECK: seta
872
873 define internal i32 @fcmpOltDouble(double %a, double %b) {
874 entry:
875 %cmp = fcmp olt double %a, %b
876 %cmp.ret_ext = zext i1 %cmp to i32
877 ret i32 %cmp.ret_ext
878 }
879 ; CHECK-LABEL: fcmpOltDouble
880 ; CHECK: ucomisd
881 ; CHECK: seta
882
883 define internal i32 @fcmpOleFloat(float %a, float %b) {
884 entry:
885 %cmp = fcmp ole float %a, %b
886 %cmp.ret_ext = zext i1 %cmp to i32
887 ret i32 %cmp.ret_ext
888 }
889 ; CHECK-LABEL: fcmpOleFloat
890 ; CHECK: ucomiss
891 ; CHECK: setae
892
893 define internal i32 @fcmpOleDouble(double %a, double %b) {
894 entry:
895 %cmp = fcmp ole double %a, %b
896 %cmp.ret_ext = zext i1 %cmp to i32
897 ret i32 %cmp.ret_ext
898 }
899 ; CHECK-LABEL: fcmpOleDouble
900 ; CHECK: ucomisd
901 ; CHECK: setae
902
903 define internal i32 @fcmpOneFloat(float %a, float %b) {
904 entry:
905 %cmp = fcmp one float %a, %b
906 %cmp.ret_ext = zext i1 %cmp to i32
907 ret i32 %cmp.ret_ext
908 }
909 ; CHECK-LABEL: fcmpOneFloat
910 ; CHECK: ucomiss
911 ; CHECK: setne
912
913 define internal i32 @fcmpOneDouble(double %a, double %b) {
914 entry:
915 %cmp = fcmp one double %a, %b
916 %cmp.ret_ext = zext i1 %cmp to i32
917 ret i32 %cmp.ret_ext
918 }
919 ; CHECK-LABEL: fcmpOneDouble
920 ; CHECK: ucomisd
921 ; CHECK: setne
922
923 define internal i32 @fcmpOrdFloat(float %a, float %b) {
924 entry:
925 %cmp = fcmp ord float %a, %b
926 %cmp.ret_ext = zext i1 %cmp to i32
927 ret i32 %cmp.ret_ext
928 }
929 ; CHECK-LABEL: fcmpOrdFloat
930 ; CHECK: ucomiss
931 ; CHECK: setnp
932
933 define internal i32 @fcmpOrdDouble(double %a, double %b) {
934 entry:
935 %cmp = fcmp ord double %a, %b
936 %cmp.ret_ext = zext i1 %cmp to i32
937 ret i32 %cmp.ret_ext
938 }
939 ; CHECK-LABEL: fcmpOrdDouble
940 ; CHECK: ucomisd
941 ; CHECK: setnp
942
943 define internal i32 @fcmpUeqFloat(float %a, float %b) {
944 entry:
945 %cmp = fcmp ueq float %a, %b
946 %cmp.ret_ext = zext i1 %cmp to i32
947 ret i32 %cmp.ret_ext
948 }
949 ; CHECK-LABEL: fcmpUeqFloat
950 ; CHECK: ucomiss
951 ; CHECK: sete
952
953 define internal i32 @fcmpUeqDouble(double %a, double %b) {
954 entry:
955 %cmp = fcmp ueq double %a, %b
956 %cmp.ret_ext = zext i1 %cmp to i32
957 ret i32 %cmp.ret_ext
958 }
959 ; CHECK-LABEL: fcmpUeqDouble
960 ; CHECK: ucomisd
961 ; CHECK: sete
962
963 define internal i32 @fcmpUgtFloat(float %a, float %b) {
964 entry:
965 %cmp = fcmp ugt float %a, %b
966 %cmp.ret_ext = zext i1 %cmp to i32
967 ret i32 %cmp.ret_ext
968 }
969 ; CHECK-LABEL: fcmpUgtFloat
970 ; CHECK: ucomiss
971 ; CHECK: setb
972
973 define internal i32 @fcmpUgtDouble(double %a, double %b) {
974 entry:
975 %cmp = fcmp ugt double %a, %b
976 %cmp.ret_ext = zext i1 %cmp to i32
977 ret i32 %cmp.ret_ext
978 }
979 ; CHECK-LABEL: fcmpUgtDouble
980 ; CHECK: ucomisd
981 ; CHECK: setb
982
983 define internal i32 @fcmpUgeFloat(float %a, float %b) {
984 entry:
985 %cmp = fcmp uge float %a, %b
986 %cmp.ret_ext = zext i1 %cmp to i32
987 ret i32 %cmp.ret_ext
988 }
989 ; CHECK-LABEL: fcmpUgeFloat
990 ; CHECK: ucomiss
991 ; CHECK: setbe
992
993 define internal i32 @fcmpUgeDouble(double %a, double %b) {
994 entry:
995 %cmp = fcmp uge double %a, %b
996 %cmp.ret_ext = zext i1 %cmp to i32
997 ret i32 %cmp.ret_ext
998 }
999 ; CHECK-LABEL: fcmpUgeDouble
1000 ; CHECK: ucomisd
1001 ; CHECK: setbe
1002
1003 define internal i32 @fcmpUltFloat(float %a, float %b) {
1004 entry:
1005 %cmp = fcmp ult float %a, %b
1006 %cmp.ret_ext = zext i1 %cmp to i32
1007 ret i32 %cmp.ret_ext
1008 }
1009 ; CHECK-LABEL: fcmpUltFloat
1010 ; CHECK: ucomiss
1011 ; CHECK: setb
1012
1013 define internal i32 @fcmpUltDouble(double %a, double %b) {
1014 entry:
1015 %cmp = fcmp ult double %a, %b
1016 %cmp.ret_ext = zext i1 %cmp to i32
1017 ret i32 %cmp.ret_ext
1018 }
1019 ; CHECK-LABEL: fcmpUltDouble
1020 ; CHECK: ucomisd
1021 ; CHECK: setb
1022
1023 define internal i32 @fcmpUleFloat(float %a, float %b) {
1024 entry:
1025 %cmp = fcmp ule float %a, %b
1026 %cmp.ret_ext = zext i1 %cmp to i32
1027 ret i32 %cmp.ret_ext
1028 }
1029 ; CHECK-LABEL: fcmpUleFloat
1030 ; CHECK: ucomiss
1031 ; CHECK: setbe
1032
1033 define internal i32 @fcmpUleDouble(double %a, double %b) {
1034 entry:
1035 %cmp = fcmp ule double %a, %b
1036 %cmp.ret_ext = zext i1 %cmp to i32
1037 ret i32 %cmp.ret_ext
1038 }
1039 ; CHECK-LABEL: fcmpUleDouble
1040 ; CHECK: ucomisd
1041 ; CHECK: setbe
1042
1043 define internal i32 @fcmpUneFloat(float %a, float %b) {
1044 entry:
1045 %cmp = fcmp une float %a, %b
1046 %cmp.ret_ext = zext i1 %cmp to i32
1047 ret i32 %cmp.ret_ext
1048 }
1049 ; CHECK-LABEL: fcmpUneFloat
1050 ; CHECK: ucomiss
1051 ; CHECK: jne
1052 ; CHECK: jp
1053
1054 define internal i32 @fcmpUneDouble(double %a, double %b) {
1055 entry:
1056 %cmp = fcmp une double %a, %b
1057 %cmp.ret_ext = zext i1 %cmp to i32
1058 ret i32 %cmp.ret_ext
1059 }
1060 ; CHECK-LABEL: fcmpUneDouble
1061 ; CHECK: ucomisd
1062 ; CHECK: jne
1063 ; CHECK: jp
1064
1065 define internal i32 @fcmpUnoFloat(float %a, float %b) {
1066 entry:
1067 %cmp = fcmp uno float %a, %b
1068 %cmp.ret_ext = zext i1 %cmp to i32
1069 ret i32 %cmp.ret_ext
1070 }
1071 ; CHECK-LABEL: fcmpUnoFloat
1072 ; CHECK: ucomiss
1073 ; CHECK: setp
1074
1075 define internal i32 @fcmpUnoDouble(double %a, double %b) {
1076 entry:
1077 %cmp = fcmp uno double %a, %b
1078 %cmp.ret_ext = zext i1 %cmp to i32
1079 ret i32 %cmp.ret_ext
1080 }
1081 ; CHECK-LABEL: fcmpUnoDouble
1082 ; CHECK: ucomisd
1083 ; CHECK: setp
1084
1085 define internal i32 @fcmpTrueFloat(float %a, float %b) {
1086 entry:
1087 %cmp = fcmp true float %a, %b
1088 %cmp.ret_ext = zext i1 %cmp to i32
1089 ret i32 %cmp.ret_ext
1090 }
1091 ; CHECK-LABEL: fcmpTrueFloat
1092 ; CHECK: mov {{.*}},0x1
1093
1094 define internal i32 @fcmpTrueDouble(double %a, double %b) {
1095 entry:
1096 %cmp = fcmp true double %a, %b
1097 %cmp.ret_ext = zext i1 %cmp to i32
1098 ret i32 %cmp.ret_ext
1099 }
1100 ; CHECK-LABEL: fcmpTrueDouble
1101 ; CHECK: mov {{.*}},0x1
1102
1103 define internal float @loadFloat(i32 %a) {
1104 entry:
1105 %__1 = inttoptr i32 %a to float*
1106 %v0 = load float, float* %__1, align 4
1107 ret float %v0
1108 }
1109 ; CHECK-LABEL: loadFloat
1110 ; CHECK: movss
1111 ; CHECK: fld
1112
1113 define internal double @loadDouble(i32 %a) {
1114 entry:
1115 %__1 = inttoptr i32 %a to double*
1116 %v0 = load double, double* %__1, align 8
1117 ret double %v0
1118 }
1119 ; CHECK-LABEL: loadDouble
1120 ; CHECK: movsd
1121 ; CHECK: fld
1122
1123 define internal void @storeFloat(i32 %a, float %value) {
1124 entry:
1125 %__2 = inttoptr i32 %a to float*
1126 store float %value, float* %__2, align 4
1127 ret void
1128 }
1129 ; CHECK-LABEL: storeFloat
1130 ; CHECK: movss
1131 ; CHECK: movss
1132
1133 define internal void @storeDouble(i32 %a, double %value) {
1134 entry:
1135 %__2 = inttoptr i32 %a to double*
1136 store double %value, double* %__2, align 8
1137 ret void
1138 }
1139 ; CHECK-LABEL: storeDouble
1140 ; CHECK: movsd
1141 ; CHECK: movsd
1142
1143 define internal void @storeFloatConst(i32 %a) {
1144 entry:
1145 %a.asptr = inttoptr i32 %a to float*
1146 store float 0x3FF3AE1480000000, float* %a.asptr, align 4
1147 ret void
1148 }
1149 ; CHECK-LABEL: storeFloatConst
1150 ; CHECK: movss
1151 ; CHECK: movss
1152
1153 define internal void @storeDoubleConst(i32 %a) {
1154 entry:
1155 %a.asptr = inttoptr i32 %a to double*
1156 store double 1.230000e+00, double* %a.asptr, align 8
1157 ret void
1158 }
1159 ; CHECK-LABEL: storeDoubleConst
1160 ; CHECK: movsd
1161 ; CHECK: movsd
1162
1163 define internal float @selectFloatVarVar(float %a, float %b) {
1164 entry:
1165 %cmp = fcmp olt float %a, %b
1166 %cond = select i1 %cmp, float %a, float %b
1167 ret float %cond
1168 }
1169 ; CHECK-LABEL: selectFloatVarVar
1170 ; CHECK: ucomiss
1171 ; CHECK: seta
1172 ; CHECK: fld
1173
1174 define internal double @selectDoubleVarVar(double %a, double %b) {
1175 entry:
1176 %cmp = fcmp olt double %a, %b
1177 %cond = select i1 %cmp, double %a, double %b
1178 ret double %cond
1179 }
1180 ; CHECK-LABEL: selectDoubleVarVar
1181 ; CHECK: ucomisd
1182 ; CHECK: seta
1183 ; CHECK: fld
OLDNEW
« no previous file with comments | « tests_lit/llvm2ice_tests/fp.load_store.ll ('k') | tests_lit/llvm2ice_tests/nacl-other-intrinsics.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698