1 ; RUN: llc < %s -asm-verbose=false | FileCheck %s
3 ; Test that basic conversion operations assemble as expected.
5 target datalayout = "e-p:32:32-i64:64-n32:64-S128"
6 target triple = "wasm32-unknown-unknown"
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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