0b45cbe204a1e742273ea24341d676337085c870
[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) (result i32)
10 ; CHECK-NEXT: (set_local @0 (argument 0))
11 ; CHECK-NEXT: (set_local @1 (i32_wrap @0))
12 ; CHECK-NEXT: (return @1)
13 define i32 @i32_wrap_i64(i64 %x) {
14   %a = trunc i64 %x to i32
15   ret i32 %a
16 }
17
18 ; CHECK-LABEL: $i64_extend_s_i32
19 ; CHECK-NEXT: (param i32) (result i64)
20 ; CHECK-NEXT: (set_local @0 (argument 0))
21 ; CHECK-NEXT: (set_local @1 (i64_extend_s @0))
22 ; CHECK-NEXT: (return @1)
23 define i64 @i64_extend_s_i32(i32 %x) {
24   %a = sext i32 %x to i64
25   ret i64 %a
26 }
27
28 ; CHECK-LABEL: $i64_extend_u_i32
29 ; CHECK-NEXT: (param i32) (result i64)
30 ; CHECK-NEXT: (set_local @0 (argument 0))
31 ; CHECK-NEXT: (set_local @1 (i64_extend_u @0))
32 ; CHECK-NEXT: (return @1)
33 define i64 @i64_extend_u_i32(i32 %x) {
34   %a = zext i32 %x to i64
35   ret i64 %a
36 }
37
38 ; CHECK-LABEL: $i32_trunc_s_f32
39 ; CHECK-NEXT: (param f32) (result i32)
40 ; CHECK-NEXT: (set_local @0 (argument 0))
41 ; CHECK-NEXT: (set_local @1 (i32_trunc_s @0))
42 ; CHECK-NEXT: (return @1)
43 define i32 @i32_trunc_s_f32(float %x) {
44   %a = fptosi float %x to i32
45   ret i32 %a
46 }
47
48 ; CHECK-LABEL: $i32_trunc_u_f32
49 ; CHECK-NEXT: (param f32) (result i32)
50 ; CHECK-NEXT: (set_local @0 (argument 0))
51 ; CHECK-NEXT: (set_local @1 (i32_trunc_u @0))
52 ; CHECK-NEXT: (return @1)
53 define i32 @i32_trunc_u_f32(float %x) {
54   %a = fptoui float %x to i32
55   ret i32 %a
56 }
57
58 ; CHECK-LABEL: $i32_trunc_s_f64
59 ; CHECK-NEXT: (param f64) (result i32)
60 ; CHECK-NEXT: (set_local @0 (argument 0))
61 ; CHECK-NEXT: (set_local @1 (i32_trunc_s @0))
62 ; CHECK-NEXT: (return @1)
63 define i32 @i32_trunc_s_f64(double %x) {
64   %a = fptosi double %x to i32
65   ret i32 %a
66 }
67
68 ; CHECK-LABEL: $i32_trunc_u_f64
69 ; CHECK-NEXT: (param f64) (result i32)
70 ; CHECK-NEXT: (set_local @0 (argument 0))
71 ; CHECK-NEXT: (set_local @1 (i32_trunc_u @0))
72 ; CHECK-NEXT: (return @1)
73 define i32 @i32_trunc_u_f64(double %x) {
74   %a = fptoui double %x to i32
75   ret i32 %a
76 }
77
78 ; CHECK-LABEL: $i64_trunc_s_f32
79 ; CHECK-NEXT: (param f32) (result i64)
80 ; CHECK-NEXT: (set_local @0 (argument 0))
81 ; CHECK-NEXT: (set_local @1 (i64_trunc_s @0))
82 ; CHECK-NEXT: (return @1)
83 define i64 @i64_trunc_s_f32(float %x) {
84   %a = fptosi float %x to i64
85   ret i64 %a
86 }
87
88 ; CHECK-LABEL: $i64_trunc_u_f32
89 ; CHECK-NEXT: (param f32) (result i64)
90 ; CHECK-NEXT: (set_local @0 (argument 0))
91 ; CHECK-NEXT: (set_local @1 (i64_trunc_u @0))
92 ; CHECK-NEXT: (return @1)
93 define i64 @i64_trunc_u_f32(float %x) {
94   %a = fptoui float %x to i64
95   ret i64 %a
96 }
97
98 ; CHECK-LABEL: $i64_trunc_s_f64
99 ; CHECK-NEXT: (param f64) (result i64)
100 ; CHECK-NEXT: (set_local @0 (argument 0))
101 ; CHECK-NEXT: (set_local @1 (i64_trunc_s @0))
102 ; CHECK-NEXT: (return @1)
103 define i64 @i64_trunc_s_f64(double %x) {
104   %a = fptosi double %x to i64
105   ret i64 %a
106 }
107
108 ; CHECK-LABEL: $i64_trunc_u_f64
109 ; CHECK-NEXT: (param f64) (result i64)
110 ; CHECK-NEXT: (set_local @0 (argument 0))
111 ; CHECK-NEXT: (set_local @1 (i64_trunc_u @0))
112 ; CHECK-NEXT: (return @1)
113 define i64 @i64_trunc_u_f64(double %x) {
114   %a = fptoui double %x to i64
115   ret i64 %a
116 }
117
118 ; CHECK-LABEL: $f32_convert_s_i32
119 ; CHECK-NEXT: (param i32) (result f32)
120 ; CHECK-NEXT: (set_local @0 (argument 0))
121 ; CHECK-NEXT: (set_local @1 (f32_convert_s @0))
122 ; CHECK-NEXT: (return @1)
123 define float @f32_convert_s_i32(i32 %x) {
124   %a = sitofp i32 %x to float
125   ret float %a
126 }
127
128 ; CHECK-LABEL: $f32_convert_u_i32
129 ; CHECK-NEXT: (param i32) (result f32)
130 ; CHECK-NEXT: (set_local @0 (argument 0))
131 ; CHECK-NEXT: (set_local @1 (f32_convert_u @0))
132 ; CHECK-NEXT: (return @1)
133 define float @f32_convert_u_i32(i32 %x) {
134   %a = uitofp i32 %x to float
135   ret float %a
136 }
137
138 ; CHECK-LABEL: $f64_convert_s_i32
139 ; CHECK-NEXT: (param i32) (result f64)
140 ; CHECK-NEXT: (set_local @0 (argument 0))
141 ; CHECK-NEXT: (set_local @1 (f64_convert_s @0))
142 ; CHECK-NEXT: (return @1)
143 define double @f64_convert_s_i32(i32 %x) {
144   %a = sitofp i32 %x to double
145   ret double %a
146 }
147
148 ; CHECK-LABEL: $f64_convert_u_i32
149 ; CHECK-NEXT: (param i32) (result f64)
150 ; CHECK-NEXT: (set_local @0 (argument 0))
151 ; CHECK-NEXT: (set_local @1 (f64_convert_u @0))
152 ; CHECK-NEXT: (return @1)
153 define double @f64_convert_u_i32(i32 %x) {
154   %a = uitofp i32 %x to double
155   ret double %a
156 }
157
158 ; CHECK-LABEL: $f32_convert_s_i64
159 ; CHECK-NEXT: (param i64) (result f32)
160 ; CHECK-NEXT: (set_local @0 (argument 0))
161 ; CHECK-NEXT: (set_local @1 (f32_convert_s @0))
162 ; CHECK-NEXT: (return @1)
163 define float @f32_convert_s_i64(i64 %x) {
164   %a = sitofp i64 %x to float
165   ret float %a
166 }
167
168 ; CHECK-LABEL: $f32_convert_u_i64
169 ; CHECK-NEXT: (param i64) (result f32)
170 ; CHECK-NEXT: (set_local @0 (argument 0))
171 ; CHECK-NEXT: (set_local @1 (f32_convert_u @0))
172 ; CHECK-NEXT: (return @1)
173 define float @f32_convert_u_i64(i64 %x) {
174   %a = uitofp i64 %x to float
175   ret float %a
176 }
177
178 ; CHECK-LABEL: $f64_convert_s_i64
179 ; CHECK-NEXT: (param i64) (result f64)
180 ; CHECK-NEXT: (set_local @0 (argument 0))
181 ; CHECK-NEXT: (set_local @1 (f64_convert_s @0))
182 ; CHECK-NEXT: (return @1)
183 define double @f64_convert_s_i64(i64 %x) {
184   %a = sitofp i64 %x to double
185   ret double %a
186 }
187
188 ; CHECK-LABEL: $f64_convert_u_i64
189 ; CHECK-NEXT: (param i64) (result f64)
190 ; CHECK-NEXT: (set_local @0 (argument 0))
191 ; CHECK-NEXT: (set_local @1 (f64_convert_u @0))
192 ; CHECK-NEXT: (return @1)
193 define double @f64_convert_u_i64(i64 %x) {
194   %a = uitofp i64 %x to double
195   ret double %a
196 }
197
198 ; CHECK-LABEL: $f64_promote_f32
199 ; CHECK-NEXT: (param f32) (result f64)
200 ; CHECK-NEXT: (set_local @0 (argument 0))
201 ; CHECK-NEXT: (set_local @1 (f64_promote @0))
202 ; CHECK-NEXT: (return @1)
203 define double @f64_promote_f32(float %x) {
204   %a = fpext float %x to double
205   ret double %a
206 }
207
208 ; CHECK-LABEL: $f32_demote_f64
209 ; CHECK-NEXT: (param f64) (result f32)
210 ; CHECK-NEXT: (set_local @0 (argument 0))
211 ; CHECK-NEXT: (set_local @1 (f32_demote @0))
212 ; CHECK-NEXT: (return @1)
213 define float @f32_demote_f64(double %x) {
214   %a = fptrunc double %x to float
215   ret float %a
216 }