blob: 0b45cbe204a1e742273ea24341d676337085c870 [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 Gohmandc51b962015-10-03 02:10:28 +00008; CHECK-LABEL: $i32_wrap_i64
Dan Gohman311b4882015-09-15 00:55:19 +00009; CHECK-NEXT: (param i64) (result i32)
Dan Gohman6a050f32015-10-03 00:01:53 +000010; CHECK-NEXT: (set_local @0 (argument 0))
Dan Gohmandc51b962015-10-03 02:10:28 +000011; CHECK-NEXT: (set_local @1 (i32_wrap @0))
Dan Gohman311b4882015-09-15 00:55:19 +000012; CHECK-NEXT: (return @1)
Dan Gohmandc51b962015-10-03 02:10:28 +000013define i32 @i32_wrap_i64(i64 %x) {
Dan Gohman311b4882015-09-15 00:55:19 +000014 %a = trunc i64 %x to i32
15 ret i32 %a
16}
Dan Gohmandc51b962015-10-03 02:10:28 +000017
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)
23define 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)
33define 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)
43define 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)
53define 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)
63define 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)
73define 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)
83define 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)
93define 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)
103define 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)
113define 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)
123define 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)
133define 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)
143define 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)
153define 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)
163define 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)
173define 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)
183define 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)
193define 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)
203define 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)
213define float @f32_demote_f64(double %x) {
214 %a = fptrunc double %x to float
215 ret float %a
216}