1; RUN: llc < %s -asm-verbose=false | FileCheck %s
2
3; Test that basic conversion operations assemble as expected.
4
5target datalayout = "e-p:32:32-i64:64-n32:64-S128"
6target 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{{$}}
16define 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{{$}}
29define 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{{$}}
42define 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{{$}}
55define 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{{$}}
68define 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{{$}}
81define 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{{$}}
94define 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{{$}}
107define 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{{$}}
120define 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{{$}}
133define 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{{$}}
146define 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{{$}}
159define 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{{$}}
172define 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{{$}}
185define 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{{$}}
198define 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{{$}}
211define 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{{$}}
224define 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{{$}}
237define 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{{$}}
250define 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{{$}}
263define 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{{$}}
276define float @f32_demote_f64(double %x) {
277  %a = fptrunc double %x to float
278  ret float %a
279}
280