WebAssembly: update syntax
[oota-llvm.git] / test / CodeGen / WebAssembly / conv.ll
1 ; RUN: llc < %s -asm-verbose=false | FileCheck %s
2
3 ; Test that basic conversion operations assemble as expected.
4
5 target datalayout = "e-p:32:32-i64:64-n32:64-S128"
6 target triple = "wasm32-unknown-unknown"
7
8 ; CHECK-LABEL: i32_wrap_i64:
9 ; CHECK-NEXT: .param i64{{$}}
10 ; CHECK-NEXT: .result i32{{$}}
11 ; CHECK-NEXT: .local i64, i32{{$}}
12 ; CHECK-NEXT: get_local 0{{$}}
13 ; CHECK-NEXT: set_local 1, pop{{$}}
14 ; CHECK-NEXT: i32_wrap (get_local 1){{$}}
15 ; CHECK-NEXT: set_local 2, pop{{$}}
16 ; CHECK-NEXT: return (get_local 2){{$}}
17 define i32 @i32_wrap_i64(i64 %x) {
18   %a = trunc i64 %x to i32
19   ret i32 %a
20 }
21
22 ; CHECK-LABEL: i64_extend_s_i32:
23 ; CHECK-NEXT: .param i32
24 ; CHECK-NEXT: .result i64
25 ; CHECK-NEXT: .local i32, i64{{$}}
26 ; CHECK-NEXT: get_local 0{{$}}
27 ; CHECK-NEXT: set_local 1, pop{{$}}
28 ; CHECK-NEXT: i64_extend_s (get_local 1){{$}}
29 ; CHECK-NEXT: set_local 2, pop{{$}}
30 ; CHECK-NEXT: return (get_local 2){{$}}
31 define i64 @i64_extend_s_i32(i32 %x) {
32   %a = sext i32 %x to i64
33   ret i64 %a
34 }
35
36 ; CHECK-LABEL: i64_extend_u_i32:
37 ; CHECK-NEXT: .param i32
38 ; CHECK-NEXT: .result i64
39 ; CHECK-NEXT: .local i32, i64{{$}}
40 ; CHECK-NEXT: get_local 0{{$}}
41 ; CHECK-NEXT: set_local 1, pop{{$}}
42 ; CHECK-NEXT: i64_extend_u (get_local 1){{$}}
43 ; CHECK-NEXT: set_local 2, pop{{$}}
44 ; CHECK-NEXT: return (get_local 2){{$}}
45 define i64 @i64_extend_u_i32(i32 %x) {
46   %a = zext i32 %x to i64
47   ret i64 %a
48 }
49
50 ; CHECK-LABEL: i32_trunc_s_f32:
51 ; CHECK-NEXT: .param f32
52 ; CHECK-NEXT: .result i32
53 ; CHECK-NEXT: .local f32, i32{{$}}
54 ; CHECK-NEXT: get_local 0{{$}}
55 ; CHECK-NEXT: set_local 1, pop{{$}}
56 ; CHECK-NEXT: i32_trunc_s (get_local 1){{$}}
57 ; CHECK-NEXT: set_local 2, pop{{$}}
58 ; CHECK-NEXT: return (get_local 2){{$}}
59 define i32 @i32_trunc_s_f32(float %x) {
60   %a = fptosi float %x to i32
61   ret i32 %a
62 }
63
64 ; CHECK-LABEL: i32_trunc_u_f32:
65 ; CHECK-NEXT: .param f32
66 ; CHECK-NEXT: .result i32
67 ; CHECK-NEXT: .local f32, i32{{$}}
68 ; CHECK-NEXT: get_local 0{{$}}
69 ; CHECK-NEXT: set_local 1, pop{{$}}
70 ; CHECK-NEXT: i32_trunc_u (get_local 1){{$}}
71 ; CHECK-NEXT: set_local 2, pop{{$}}
72 ; CHECK-NEXT: return (get_local 2){{$}}
73 define i32 @i32_trunc_u_f32(float %x) {
74   %a = fptoui float %x to i32
75   ret i32 %a
76 }
77
78 ; CHECK-LABEL: i32_trunc_s_f64:
79 ; CHECK-NEXT: .param f64
80 ; CHECK-NEXT: .result i32
81 ; CHECK-NEXT: .local f64, i32{{$}}
82 ; CHECK-NEXT: get_local 0{{$}}
83 ; CHECK-NEXT: set_local 1, pop{{$}}
84 ; CHECK-NEXT: i32_trunc_s (get_local 1){{$}}
85 ; CHECK-NEXT: set_local 2, pop{{$}}
86 ; CHECK-NEXT: return (get_local 2){{$}}
87 define i32 @i32_trunc_s_f64(double %x) {
88   %a = fptosi double %x to i32
89   ret i32 %a
90 }
91
92 ; CHECK-LABEL: i32_trunc_u_f64:
93 ; CHECK-NEXT: .param f64
94 ; CHECK-NEXT: .result i32
95 ; CHECK-NEXT: .local f64, i32{{$}}
96 ; CHECK-NEXT: get_local 0{{$}}
97 ; CHECK-NEXT: set_local 1, pop{{$}}
98 ; CHECK-NEXT: i32_trunc_u (get_local 1){{$}}
99 ; CHECK-NEXT: set_local 2, pop{{$}}
100 ; CHECK-NEXT: return (get_local 2){{$}}
101 define i32 @i32_trunc_u_f64(double %x) {
102   %a = fptoui double %x to i32
103   ret i32 %a
104 }
105
106 ; CHECK-LABEL: i64_trunc_s_f32:
107 ; CHECK-NEXT: .param f32
108 ; CHECK-NEXT: .result i64
109 ; CHECK-NEXT: .local f32, i64{{$}}
110 ; CHECK-NEXT: get_local 0{{$}}
111 ; CHECK-NEXT: set_local 1, pop{{$}}
112 ; CHECK-NEXT: i64_trunc_s (get_local 1){{$}}
113 ; CHECK-NEXT: set_local 2, pop{{$}}
114 ; CHECK-NEXT: return (get_local 2){{$}}
115 define i64 @i64_trunc_s_f32(float %x) {
116   %a = fptosi float %x to i64
117   ret i64 %a
118 }
119
120 ; CHECK-LABEL: i64_trunc_u_f32:
121 ; CHECK-NEXT: .param f32
122 ; CHECK-NEXT: .result i64
123 ; CHECK-NEXT: .local f32, i64{{$}}
124 ; CHECK-NEXT: get_local 0{{$}}
125 ; CHECK-NEXT: set_local 1, pop{{$}}
126 ; CHECK-NEXT: i64_trunc_u (get_local 1){{$}}
127 ; CHECK-NEXT: set_local 2, pop{{$}}
128 ; CHECK-NEXT: return (get_local 2){{$}}
129 define i64 @i64_trunc_u_f32(float %x) {
130   %a = fptoui float %x to i64
131   ret i64 %a
132 }
133
134 ; CHECK-LABEL: i64_trunc_s_f64:
135 ; CHECK-NEXT: .param f64
136 ; CHECK-NEXT: .result i64
137 ; CHECK-NEXT: .local f64, i64{{$}}
138 ; CHECK-NEXT: get_local 0{{$}}
139 ; CHECK-NEXT: set_local 1, pop{{$}}
140 ; CHECK-NEXT: i64_trunc_s (get_local 1){{$}}
141 ; CHECK-NEXT: set_local 2, pop{{$}}
142 ; CHECK-NEXT: return (get_local 2){{$}}
143 define i64 @i64_trunc_s_f64(double %x) {
144   %a = fptosi double %x to i64
145   ret i64 %a
146 }
147
148 ; CHECK-LABEL: i64_trunc_u_f64:
149 ; CHECK-NEXT: .param f64
150 ; CHECK-NEXT: .result i64
151 ; CHECK-NEXT: .local f64, i64{{$}}
152 ; CHECK-NEXT: get_local 0{{$}}
153 ; CHECK-NEXT: set_local 1, pop{{$}}
154 ; CHECK-NEXT: i64_trunc_u (get_local 1){{$}}
155 ; CHECK-NEXT: set_local 2, pop{{$}}
156 ; CHECK-NEXT: return (get_local 2){{$}}
157 define i64 @i64_trunc_u_f64(double %x) {
158   %a = fptoui double %x to i64
159   ret i64 %a
160 }
161
162 ; CHECK-LABEL: f32_convert_s_i32:
163 ; CHECK-NEXT: .param i32
164 ; CHECK-NEXT: .result f32
165 ; CHECK-NEXT: .local i32, f32{{$}}
166 ; CHECK-NEXT: get_local 0{{$}}
167 ; CHECK-NEXT: set_local 1, pop{{$}}
168 ; CHECK-NEXT: f32_convert_s (get_local 1){{$}}
169 ; CHECK-NEXT: set_local 2, pop{{$}}
170 ; CHECK-NEXT: return (get_local 2){{$}}
171 define float @f32_convert_s_i32(i32 %x) {
172   %a = sitofp i32 %x to float
173   ret float %a
174 }
175
176 ; CHECK-LABEL: f32_convert_u_i32:
177 ; CHECK-NEXT: .param i32
178 ; CHECK-NEXT: .result f32
179 ; CHECK-NEXT: .local i32, f32{{$}}
180 ; CHECK-NEXT: get_local 0{{$}}
181 ; CHECK-NEXT: set_local 1, pop{{$}}
182 ; CHECK-NEXT: f32_convert_u (get_local 1){{$}}
183 ; CHECK-NEXT: set_local 2, pop{{$}}
184 ; CHECK-NEXT: return (get_local 2){{$}}
185 define float @f32_convert_u_i32(i32 %x) {
186   %a = uitofp i32 %x to float
187   ret float %a
188 }
189
190 ; CHECK-LABEL: f64_convert_s_i32:
191 ; CHECK-NEXT: .param i32
192 ; CHECK-NEXT: .result f64
193 ; CHECK-NEXT: .local i32, f64{{$}}
194 ; CHECK-NEXT: get_local 0{{$}}
195 ; CHECK-NEXT: set_local 1, pop{{$}}
196 ; CHECK-NEXT: f64_convert_s (get_local 1){{$}}
197 ; CHECK-NEXT: set_local 2, pop{{$}}
198 ; CHECK-NEXT: return (get_local 2){{$}}
199 define double @f64_convert_s_i32(i32 %x) {
200   %a = sitofp i32 %x to double
201   ret double %a
202 }
203
204 ; CHECK-LABEL: f64_convert_u_i32:
205 ; CHECK-NEXT: .param i32
206 ; CHECK-NEXT: .result f64
207 ; CHECK-NEXT: .local i32, f64{{$}}
208 ; CHECK-NEXT: get_local 0{{$}}
209 ; CHECK-NEXT: set_local 1, pop{{$}}
210 ; CHECK-NEXT: f64_convert_u (get_local 1){{$}}
211 ; CHECK-NEXT: set_local 2, pop{{$}}
212 ; CHECK-NEXT: return (get_local 2){{$}}
213 define double @f64_convert_u_i32(i32 %x) {
214   %a = uitofp i32 %x to double
215   ret double %a
216 }
217
218 ; CHECK-LABEL: f32_convert_s_i64:
219 ; CHECK-NEXT: .param i64
220 ; CHECK-NEXT: .result f32
221 ; CHECK-NEXT: .local i64, f32{{$}}
222 ; CHECK-NEXT: get_local 0{{$}}
223 ; CHECK-NEXT: set_local 1, pop{{$}}
224 ; CHECK-NEXT: f32_convert_s (get_local 1){{$}}
225 ; CHECK-NEXT: set_local 2, pop{{$}}
226 ; CHECK-NEXT: return (get_local 2){{$}}
227 define float @f32_convert_s_i64(i64 %x) {
228   %a = sitofp i64 %x to float
229   ret float %a
230 }
231
232 ; CHECK-LABEL: f32_convert_u_i64:
233 ; CHECK-NEXT: .param i64
234 ; CHECK-NEXT: .result f32
235 ; CHECK-NEXT: .local i64, f32{{$}}
236 ; CHECK-NEXT: get_local 0{{$}}
237 ; CHECK-NEXT: set_local 1, pop{{$}}
238 ; CHECK-NEXT: f32_convert_u (get_local 1){{$}}
239 ; CHECK-NEXT: set_local 2, pop{{$}}
240 ; CHECK-NEXT: return (get_local 2){{$}}
241 define float @f32_convert_u_i64(i64 %x) {
242   %a = uitofp i64 %x to float
243   ret float %a
244 }
245
246 ; CHECK-LABEL: f64_convert_s_i64:
247 ; CHECK-NEXT: .param i64
248 ; CHECK-NEXT: .result f64
249 ; CHECK-NEXT: .local i64, f64{{$}}
250 ; CHECK-NEXT: get_local 0{{$}}
251 ; CHECK-NEXT: set_local 1, pop{{$}}
252 ; CHECK-NEXT: f64_convert_s (get_local 1){{$}}
253 ; CHECK-NEXT: set_local 2, pop{{$}}
254 ; CHECK-NEXT: return (get_local 2){{$}}
255 define double @f64_convert_s_i64(i64 %x) {
256   %a = sitofp i64 %x to double
257   ret double %a
258 }
259
260 ; CHECK-LABEL: f64_convert_u_i64:
261 ; CHECK-NEXT: .param i64
262 ; CHECK-NEXT: .result f64
263 ; CHECK-NEXT: .local i64, f64{{$}}
264 ; CHECK-NEXT: get_local 0{{$}}
265 ; CHECK-NEXT: set_local 1, pop{{$}}
266 ; CHECK-NEXT: f64_convert_u (get_local 1){{$}}
267 ; CHECK-NEXT: set_local 2, pop{{$}}
268 ; CHECK-NEXT: return (get_local 2){{$}}
269 define double @f64_convert_u_i64(i64 %x) {
270   %a = uitofp i64 %x to double
271   ret double %a
272 }
273
274 ; CHECK-LABEL: f64_promote_f32:
275 ; CHECK-NEXT: .param f32
276 ; CHECK-NEXT: .result f64
277 ; CHECK-NEXT: .local f32, f64{{$}}
278 ; CHECK-NEXT: get_local 0{{$}}
279 ; CHECK-NEXT: set_local 1, pop{{$}}
280 ; CHECK-NEXT: f64_promote (get_local 1){{$}}
281 ; CHECK-NEXT: set_local 2, pop{{$}}
282 ; CHECK-NEXT: return (get_local 2){{$}}
283 define double @f64_promote_f32(float %x) {
284   %a = fpext float %x to double
285   ret double %a
286 }
287
288 ; CHECK-LABEL: f32_demote_f64:
289 ; CHECK-NEXT: .param f64
290 ; CHECK-NEXT: .result f32
291 ; CHECK-NEXT: .local f64, f32{{$}}
292 ; CHECK-NEXT: get_local 0{{$}}
293 ; CHECK-NEXT: set_local 1, pop{{$}}
294 ; CHECK-NEXT: f32_demote (get_local 1){{$}}
295 ; CHECK-NEXT: set_local 2, pop{{$}}
296 ; CHECK-NEXT: return (get_local 2){{$}}
297 define float @f32_demote_f64(double %x) {
298   %a = fptrunc double %x to float
299   ret float %a
300 }