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