blob: cd3633d5591fa3c71e8284dd59af353e6ebbd79a [file] [log] [blame]
JF Bastienda06bce2015-08-11 21:02:46 +00001; RUN: llc < %s -asm-verbose=false | FileCheck %s
2
3; Test that basic 32-bit floating-point comparison operations assemble as
4; expected.
5
Dan Gohmandde8dce2015-08-19 20:30:20 +00006target datalayout = "e-p:32:32-i64:64-n32:64-S128"
JF Bastienda06bce2015-08-11 21:02:46 +00007target triple = "wasm32-unknown-unknown"
8
Dan Gohmane51c0582015-10-06 00:27:55 +00009; CHECK-LABEL: ord_f32:
10; CHECK-NEXT: .param f32{{$}}
11; CHECK-NEXT: .param f32{{$}}
12; CHECK-NEXT: .result i32{{$}}
JF Bastien1d20a5e2015-10-16 00:53:49 +000013; CHECK-NEXT: .local f32, f32, i32, i32, i32{{$}}
14; CHECK-NEXT: get_local 0{{$}}
15; CHECK-NEXT: set_local 2, pop{{$}}
16; CHECK-NEXT: get_local 1{{$}}
17; CHECK-NEXT: set_local 3, pop{{$}}
18; CHECK-NEXT: eq (get_local 3), (get_local 3){{$}}
19; CHECK-NEXT: set_local 4, pop{{$}}
20; CHECK-NEXT: eq (get_local 2), (get_local 2){{$}}
21; CHECK-NEXT: set_local 5, pop{{$}}
22; CHECK-NEXT: and (get_local 5), (get_local 4){{$}}
23; CHECK-NEXT: set_local 6, pop{{$}}
24; CHECK-NEXT: return (get_local 6){{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +000025define i32 @ord_f32(float %x, float %y) {
26 %a = fcmp ord float %x, %y
27 %b = zext i1 %a to i32
28 ret i32 %b
29}
30
Dan Gohmane51c0582015-10-06 00:27:55 +000031; CHECK-LABEL: uno_f32:
32; CHECK-NEXT: .param f32{{$}}
33; CHECK-NEXT: .param f32{{$}}
34; CHECK-NEXT: .result i32{{$}}
JF Bastien1d20a5e2015-10-16 00:53:49 +000035; CHECK-NEXT: .local f32, f32, i32, i32, i32{{$}}
36; CHECK-NEXT: get_local 0{{$}}
37; CHECK-NEXT: set_local 2, pop{{$}}
38; CHECK-NEXT: get_local 1{{$}}
39; CHECK-NEXT: set_local 3, pop{{$}}
40; CHECK-NEXT: ne (get_local 3), (get_local 3){{$}}
41; CHECK-NEXT: set_local 4, pop{{$}}
42; CHECK-NEXT: ne (get_local 2), (get_local 2){{$}}
43; CHECK-NEXT: set_local 5, pop{{$}}
44; CHECK-NEXT: ior (get_local 5), (get_local 4){{$}}
45; CHECK-NEXT: set_local 6, pop{{$}}
46; CHECK-NEXT: return (get_local 6){{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +000047define i32 @uno_f32(float %x, float %y) {
48 %a = fcmp uno float %x, %y
49 %b = zext i1 %a to i32
50 ret i32 %b
51}
JF Bastienda06bce2015-08-11 21:02:46 +000052
Dan Gohmane51c0582015-10-06 00:27:55 +000053; CHECK-LABEL: oeq_f32:
54; CHECK-NEXT: .param f32{{$}}
55; CHECK-NEXT: .param f32{{$}}
56; CHECK-NEXT: .result i32{{$}}
JF Bastien1d20a5e2015-10-16 00:53:49 +000057; CHECK-NEXT: .local f32, f32, i32{{$}}
58; CHECK-NEXT: get_local 1{{$}}
59; CHECK-NEXT: set_local 2, pop{{$}}
60; CHECK-NEXT: get_local 0{{$}}
61; CHECK-NEXT: set_local 3, pop{{$}}
62; CHECK-NEXT: eq (get_local 3), (get_local 2){{$}}
63; CHECK-NEXT: set_local 4, pop{{$}}
64; CHECK-NEXT: return (get_local 4){{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000065define i32 @oeq_f32(float %x, float %y) {
66 %a = fcmp oeq float %x, %y
67 %b = zext i1 %a to i32
68 ret i32 %b
69}
70
Dan Gohmane51c0582015-10-06 00:27:55 +000071; CHECK-LABEL: une_f32:
JF Bastien1d20a5e2015-10-16 00:53:49 +000072; CHECK: ne (get_local 3), (get_local 2){{$}}
73; CHECK-NEXT: set_local 4, pop{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000074define i32 @une_f32(float %x, float %y) {
75 %a = fcmp une float %x, %y
76 %b = zext i1 %a to i32
77 ret i32 %b
78}
79
Dan Gohmane51c0582015-10-06 00:27:55 +000080; CHECK-LABEL: olt_f32:
JF Bastien1d20a5e2015-10-16 00:53:49 +000081; CHECK: lt (get_local 3), (get_local 2){{$}}
82; CHECK-NEXT: set_local 4, pop{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000083define i32 @olt_f32(float %x, float %y) {
84 %a = fcmp olt float %x, %y
85 %b = zext i1 %a to i32
86 ret i32 %b
87}
88
Dan Gohmane51c0582015-10-06 00:27:55 +000089; CHECK-LABEL: ole_f32:
JF Bastien1d20a5e2015-10-16 00:53:49 +000090; CHECK: le (get_local 3), (get_local 2){{$}}
91; CHECK-NEXT: set_local 4, pop{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000092define i32 @ole_f32(float %x, float %y) {
93 %a = fcmp ole float %x, %y
94 %b = zext i1 %a to i32
95 ret i32 %b
96}
97
Dan Gohmane51c0582015-10-06 00:27:55 +000098; CHECK-LABEL: ogt_f32:
JF Bastien1d20a5e2015-10-16 00:53:49 +000099; CHECK: gt (get_local 3), (get_local 2){{$}}
100; CHECK-NEXT: set_local 4, pop{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +0000101define i32 @ogt_f32(float %x, float %y) {
102 %a = fcmp ogt float %x, %y
103 %b = zext i1 %a to i32
104 ret i32 %b
105}
106
Dan Gohmane51c0582015-10-06 00:27:55 +0000107; CHECK-LABEL: oge_f32:
JF Bastien1d20a5e2015-10-16 00:53:49 +0000108; CHECK: ge (get_local 3), (get_local 2){{$}}
109; CHECK-NEXT: set_local 4, pop{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +0000110define i32 @oge_f32(float %x, float %y) {
111 %a = fcmp oge float %x, %y
112 %b = zext i1 %a to i32
113 ret i32 %b
114}
115
JF Bastien71d29ac2015-08-12 17:53:29 +0000116; Expanded comparisons, which also check for NaN.
117
Dan Gohmane51c0582015-10-06 00:27:55 +0000118; CHECK-LABEL: ueq_f32:
119; CHECK-NEXT: .param f32{{$}}
120; CHECK-NEXT: .param f32{{$}}
121; CHECK-NEXT: .result i32{{$}}
JF Bastien1d20a5e2015-10-16 00:53:49 +0000122; CHECK-NEXT: .local f32, f32, i32, i32, i32, i32, i32{{$}}
123; CHECK-NEXT: get_local 1{{$}}
124; CHECK-NEXT: set_local 2, pop{{$}}
125; CHECK-NEXT: get_local 0{{$}}
126; CHECK-NEXT: set_local 3, pop{{$}}
127; CHECK-NEXT: eq (get_local 3), (get_local 2){{$}}
128; CHECK-NEXT: set_local 4, pop{{$}}
129; CHECK-NEXT: ne (get_local 2), (get_local 2){{$}}
130; CHECK-NEXT: set_local 5, pop{{$}}
131; CHECK-NEXT: ne (get_local 3), (get_local 3){{$}}
132; CHECK-NEXT: set_local 6, pop{{$}}
133; CHECK-NEXT: ior (get_local 6), (get_local 5){{$}}
134; CHECK-NEXT: set_local 7, pop{{$}}
135; CHECK-NEXT: ior (get_local 4), (get_local 7){{$}}
136; CHECK-NEXT: set_local 8, pop{{$}}
137; CHECK-NEXT: return (get_local 8){{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000138define i32 @ueq_f32(float %x, float %y) {
139 %a = fcmp ueq float %x, %y
140 %b = zext i1 %a to i32
141 ret i32 %b
142}
143
Dan Gohmane51c0582015-10-06 00:27:55 +0000144; CHECK-LABEL: one_f32:
JF Bastien1d20a5e2015-10-16 00:53:49 +0000145; CHECK: ne (get_local 3), (get_local 2){{$}}
146; CHECK-NEXT: set_local 4, pop{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000147define i32 @one_f32(float %x, float %y) {
148 %a = fcmp one float %x, %y
149 %b = zext i1 %a to i32
150 ret i32 %b
151}
152
Dan Gohmane51c0582015-10-06 00:27:55 +0000153; CHECK-LABEL: ult_f32:
JF Bastien1d20a5e2015-10-16 00:53:49 +0000154; CHECK: lt (get_local 3), (get_local 2){{$}}
155; CHECK-NEXT: set_local 4, pop{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000156define i32 @ult_f32(float %x, float %y) {
157 %a = fcmp ult float %x, %y
158 %b = zext i1 %a to i32
159 ret i32 %b
160}
161
Dan Gohmane51c0582015-10-06 00:27:55 +0000162; CHECK-LABEL: ule_f32:
JF Bastien1d20a5e2015-10-16 00:53:49 +0000163; CHECK: le (get_local 3), (get_local 2){{$}}
164; CHECK-NEXT: set_local 4, pop{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000165define i32 @ule_f32(float %x, float %y) {
166 %a = fcmp ule float %x, %y
167 %b = zext i1 %a to i32
168 ret i32 %b
169}
170
Dan Gohmane51c0582015-10-06 00:27:55 +0000171; CHECK-LABEL: ugt_f32:
JF Bastien1d20a5e2015-10-16 00:53:49 +0000172; CHECK: gt (get_local 3), (get_local 2){{$}}
173; CHECK-NEXT: set_local 4, pop{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000174define i32 @ugt_f32(float %x, float %y) {
175 %a = fcmp ugt float %x, %y
176 %b = zext i1 %a to i32
177 ret i32 %b
178}
179
Dan Gohmane51c0582015-10-06 00:27:55 +0000180; CHECK-LABEL: uge_f32:
JF Bastien1d20a5e2015-10-16 00:53:49 +0000181; CHECK: ge (get_local 3), (get_local 2){{$}}
182; CHECK-NEXT: set_local 4, pop{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000183define i32 @uge_f32(float %x, float %y) {
184 %a = fcmp uge float %x, %y
185 %b = zext i1 %a to i32
186 ret i32 %b
187}