blob: 0742c55bb7abdd1c158b29307735ec29fdd1ecd0 [file] [log] [blame]
Dan Gohman311b4882015-09-15 00:55:19 +00001; 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
Dan Gohmane51c0582015-10-06 00:27:55 +00008; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +000016define i32 @i32_wrap_i64(i64 %x) {
Dan Gohman311b4882015-09-15 00:55:19 +000017 %a = trunc i64 %x to i32
18 ret i32 %a
19}
Dan Gohmandc51b962015-10-03 02:10:28 +000020
Dan Gohmane51c0582015-10-06 00:27:55 +000021; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +000029define i64 @i64_extend_s_i32(i32 %x) {
30 %a = sext i32 %x to i64
31 ret i64 %a
32}
33
Dan Gohmane51c0582015-10-06 00:27:55 +000034; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +000042define i64 @i64_extend_u_i32(i32 %x) {
43 %a = zext i32 %x to i64
44 ret i64 %a
45}
46
Dan Gohmane51c0582015-10-06 00:27:55 +000047; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +000055define i32 @i32_trunc_s_f32(float %x) {
56 %a = fptosi float %x to i32
57 ret i32 %a
58}
59
Dan Gohmane51c0582015-10-06 00:27:55 +000060; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +000068define i32 @i32_trunc_u_f32(float %x) {
69 %a = fptoui float %x to i32
70 ret i32 %a
71}
72
Dan Gohmane51c0582015-10-06 00:27:55 +000073; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +000081define i32 @i32_trunc_s_f64(double %x) {
82 %a = fptosi double %x to i32
83 ret i32 %a
84}
85
Dan Gohmane51c0582015-10-06 00:27:55 +000086; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +000094define i32 @i32_trunc_u_f64(double %x) {
95 %a = fptoui double %x to i32
96 ret i32 %a
97}
98
Dan Gohmane51c0582015-10-06 00:27:55 +000099; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +0000107define i64 @i64_trunc_s_f32(float %x) {
108 %a = fptosi float %x to i64
109 ret i64 %a
110}
111
Dan Gohmane51c0582015-10-06 00:27:55 +0000112; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +0000120define i64 @i64_trunc_u_f32(float %x) {
121 %a = fptoui float %x to i64
122 ret i64 %a
123}
124
Dan Gohmane51c0582015-10-06 00:27:55 +0000125; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +0000133define i64 @i64_trunc_s_f64(double %x) {
134 %a = fptosi double %x to i64
135 ret i64 %a
136}
137
Dan Gohmane51c0582015-10-06 00:27:55 +0000138; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +0000146define i64 @i64_trunc_u_f64(double %x) {
147 %a = fptoui double %x to i64
148 ret i64 %a
149}
150
Dan Gohmane51c0582015-10-06 00:27:55 +0000151; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +0000159define float @f32_convert_s_i32(i32 %x) {
160 %a = sitofp i32 %x to float
161 ret float %a
162}
163
Dan Gohmane51c0582015-10-06 00:27:55 +0000164; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +0000172define float @f32_convert_u_i32(i32 %x) {
173 %a = uitofp i32 %x to float
174 ret float %a
175}
176
Dan Gohmane51c0582015-10-06 00:27:55 +0000177; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +0000185define double @f64_convert_s_i32(i32 %x) {
186 %a = sitofp i32 %x to double
187 ret double %a
188}
189
Dan Gohmane51c0582015-10-06 00:27:55 +0000190; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +0000198define double @f64_convert_u_i32(i32 %x) {
199 %a = uitofp i32 %x to double
200 ret double %a
201}
202
Dan Gohmane51c0582015-10-06 00:27:55 +0000203; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +0000211define float @f32_convert_s_i64(i64 %x) {
212 %a = sitofp i64 %x to float
213 ret float %a
214}
215
Dan Gohmane51c0582015-10-06 00:27:55 +0000216; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +0000224define float @f32_convert_u_i64(i64 %x) {
225 %a = uitofp i64 %x to float
226 ret float %a
227}
228
Dan Gohmane51c0582015-10-06 00:27:55 +0000229; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +0000237define double @f64_convert_s_i64(i64 %x) {
238 %a = sitofp i64 %x to double
239 ret double %a
240}
241
Dan Gohmane51c0582015-10-06 00:27:55 +0000242; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +0000250define double @f64_convert_u_i64(i64 %x) {
251 %a = uitofp i64 %x to double
252 ret double %a
253}
254
Dan Gohmane51c0582015-10-06 00:27:55 +0000255; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +0000263define double @f64_promote_f32(float %x) {
264 %a = fpext float %x to double
265 ret double %a
266}
267
Dan Gohmane51c0582015-10-06 00:27:55 +0000268; 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{{$}}
Dan Gohmandc51b962015-10-03 02:10:28 +0000276define float @f32_demote_f64(double %x) {
277 %a = fptrunc double %x to float
278 ret float %a
279}