c700b05b51415fa9df7b57d522d1faf4a32fb676
[oota-llvm.git] / test / CodeGen / WebAssembly / comparisons_f32.ll
1 ; RUN: llc < %s -asm-verbose=false | FileCheck %s
2
3 ; Test that basic 32-bit floating-point comparison operations assemble as
4 ; expected.
5
6 target datalayout = "e-p:32:32-i64:64-n32:64-S128"
7 target triple = "wasm32-unknown-unknown"
8
9 ; CHECK-LABEL: ord_f32:
10 ; CHECK-NEXT: .param f32{{$}}
11 ; CHECK-NEXT: .param f32{{$}}
12 ; CHECK-NEXT: .result i32{{$}}
13 ; 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){{$}}
25 define 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
31 ; CHECK-LABEL: uno_f32:
32 ; CHECK-NEXT: .param f32{{$}}
33 ; CHECK-NEXT: .param f32{{$}}
34 ; CHECK-NEXT: .result i32{{$}}
35 ; 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: or (get_local 5), (get_local 4){{$}}
45 ; CHECK-NEXT: set_local 6, pop{{$}}
46 ; CHECK-NEXT: return (get_local 6){{$}}
47 define 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 }
52
53 ; CHECK-LABEL: oeq_f32:
54 ; CHECK-NEXT: .param f32{{$}}
55 ; CHECK-NEXT: .param f32{{$}}
56 ; CHECK-NEXT: .result i32{{$}}
57 ; 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){{$}}
65 define 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
71 ; CHECK-LABEL: une_f32:
72 ; CHECK: ne (get_local 3), (get_local 2){{$}}
73 ; CHECK-NEXT: set_local 4, pop{{$}}
74 define 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
80 ; CHECK-LABEL: olt_f32:
81 ; CHECK: lt (get_local 3), (get_local 2){{$}}
82 ; CHECK-NEXT: set_local 4, pop{{$}}
83 define 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
89 ; CHECK-LABEL: ole_f32:
90 ; CHECK: le (get_local 3), (get_local 2){{$}}
91 ; CHECK-NEXT: set_local 4, pop{{$}}
92 define 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
98 ; CHECK-LABEL: ogt_f32:
99 ; CHECK: gt (get_local 3), (get_local 2){{$}}
100 ; CHECK-NEXT: set_local 4, pop{{$}}
101 define 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
107 ; CHECK-LABEL: oge_f32:
108 ; CHECK: ge (get_local 3), (get_local 2){{$}}
109 ; CHECK-NEXT: set_local 4, pop{{$}}
110 define 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
116 ; Expanded comparisons, which also check for NaN.
117
118 ; CHECK-LABEL: ueq_f32:
119 ; CHECK-NEXT: .param f32{{$}}
120 ; CHECK-NEXT: .param f32{{$}}
121 ; CHECK-NEXT: .result i32{{$}}
122 ; 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: or (get_local 6), (get_local 5){{$}}
134 ; CHECK-NEXT: set_local 7, pop{{$}}
135 ; CHECK-NEXT: or (get_local 4), (get_local 7){{$}}
136 ; CHECK-NEXT: set_local 8, pop{{$}}
137 ; CHECK-NEXT: return (get_local 8){{$}}
138 define 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
144 ; CHECK-LABEL: one_f32:
145 ; CHECK: ne (get_local 3), (get_local 2){{$}}
146 ; CHECK-NEXT: set_local 4, pop{{$}}
147 define 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
153 ; CHECK-LABEL: ult_f32:
154 ; CHECK: lt (get_local 3), (get_local 2){{$}}
155 ; CHECK-NEXT: set_local 4, pop{{$}}
156 define 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
162 ; CHECK-LABEL: ule_f32:
163 ; CHECK: le (get_local 3), (get_local 2){{$}}
164 ; CHECK-NEXT: set_local 4, pop{{$}}
165 define 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
171 ; CHECK-LABEL: ugt_f32:
172 ; CHECK: gt (get_local 3), (get_local 2){{$}}
173 ; CHECK-NEXT: set_local 4, pop{{$}}
174 define 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
180 ; CHECK-LABEL: uge_f32:
181 ; CHECK: ge (get_local 3), (get_local 2){{$}}
182 ; CHECK-NEXT: set_local 4, pop{{$}}
183 define 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 }