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