Skip to content

Commit d1e6e17

Browse files
committed
Add codegen tests
1 parent 7f459ce commit d1e6e17

File tree

2 files changed

+331
-0
lines changed

2 files changed

+331
-0
lines changed
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
// only-wasm32
2+
// compile-flags: -C target-feature=+nontrapping-fptoint
3+
#![crate_type = "lib"]
4+
5+
// CHECK-LABEL: @cast_f64_i64
6+
#[no_mangle]
7+
pub fn cast_f64_i64(a: f64) -> i64 {
8+
// CHECK: tail call i64 @llvm.wasm.trunc.saturate.signed.i64.f64(double {{.*}})
9+
// CHECK-NEXT: ret i64 {{.*}}
10+
a as _
11+
}
12+
13+
// CHECK-LABEL: @cast_f64_i32
14+
#[no_mangle]
15+
pub fn cast_f64_i32(a: f64) -> i32 {
16+
// CHECK: tail call i32 @llvm.wasm.trunc.saturate.signed.i32.f64(double {{.*}})
17+
// CHECK-NEXT: ret i32 {{.*}}
18+
a as _
19+
}
20+
21+
// CHECK-LABEL: @cast_f32_i64
22+
#[no_mangle]
23+
pub fn cast_f32_i64(a: f32) -> i64 {
24+
// CHECK: tail call i64 @llvm.wasm.trunc.saturate.signed.i64.f32(float {{.*}})
25+
// CHECK-NEXT: ret i64 {{.*}}
26+
a as _
27+
}
28+
29+
// CHECK-LABEL: @cast_f32_i32
30+
#[no_mangle]
31+
pub fn cast_f32_i32(a: f32) -> i32 {
32+
// CHECK: tail call i32 @llvm.wasm.trunc.saturate.signed.i32.f32(float {{.*}})
33+
// CHECK-NEXT: ret i32 {{.*}}
34+
a as _
35+
}
36+
37+
38+
// CHECK-LABEL: @cast_f64_u64
39+
#[no_mangle]
40+
pub fn cast_f64_u64(a: f64) -> u64 {
41+
// CHECK: tail call i64 @llvm.wasm.trunc.saturate.unsigned.i64.f64(double {{.*}})
42+
// CHECK-NEXT: ret i64 {{.*}}
43+
a as _
44+
}
45+
46+
// CHECK-LABEL: @cast_f64_u32
47+
#[no_mangle]
48+
pub fn cast_f64_u32(a: f64) -> u32 {
49+
// CHECK: tail call i32 @llvm.wasm.trunc.saturate.unsigned.i32.f64(double {{.*}})
50+
// CHECK-NEXT: ret i32 {{.*}}
51+
a as _
52+
}
53+
54+
// CHECK-LABEL: @cast_f32_u64
55+
#[no_mangle]
56+
pub fn cast_f32_u64(a: f32) -> u64 {
57+
// CHECK: tail call i64 @llvm.wasm.trunc.saturate.unsigned.i64.f32(float {{.*}})
58+
// CHECK-NEXT: ret i64 {{.*}}
59+
a as _
60+
}
61+
62+
// CHECK-LABEL: @cast_f32_u32
63+
#[no_mangle]
64+
pub fn cast_f32_u32(a: f32) -> u32 {
65+
// CHECK: tail call i32 @llvm.wasm.trunc.saturate.unsigned.i32.f32(float {{.*}})
66+
// CHECK-NEXT: ret i32 {{.*}}
67+
a as _
68+
}
69+
70+
// CHECK-LABEL: @cast_f32_u8
71+
#[no_mangle]
72+
pub fn cast_f32_u8(a: f32) -> u8 {
73+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
74+
// CHECK: fptoui float {{.*}} to i8
75+
// CHECK-NEXT: select i1 {{.*}}, i8 {{.*}}, i8 {{.*}}
76+
// CHECK-NEXT: ret i8 {{.*}}
77+
a as _
78+
}
79+
80+
81+
82+
// CHECK-LABEL: @cast_unchecked_f64_i64
83+
#[no_mangle]
84+
pub unsafe fn cast_unchecked_f64_i64(a: f64) -> i64 {
85+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
86+
// CHECK: fptosi double {{.*}} to i64
87+
// CHECK-NEXT: ret i64 {{.*}}
88+
a.to_int_unchecked()
89+
}
90+
91+
// CHECK-LABEL: @cast_unchecked_f64_i32
92+
#[no_mangle]
93+
pub unsafe fn cast_unchecked_f64_i32(a: f64) -> i32 {
94+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
95+
// CHECK: fptosi double {{.*}} to i32
96+
// CHECK-NEXT: ret i32 {{.*}}
97+
a.to_int_unchecked()
98+
}
99+
100+
// CHECK-LABEL: @cast_unchecked_f32_i64
101+
#[no_mangle]
102+
pub unsafe fn cast_unchecked_f32_i64(a: f32) -> i64 {
103+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
104+
// CHECK: fptosi float {{.*}} to i64
105+
// CHECK-NEXT: ret i64 {{.*}}
106+
a.to_int_unchecked()
107+
}
108+
109+
// CHECK-LABEL: @cast_unchecked_f32_i32
110+
#[no_mangle]
111+
pub unsafe fn cast_unchecked_f32_i32(a: f32) -> i32 {
112+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
113+
// CHECK: fptosi float {{.*}} to i32
114+
// CHECK-NEXT: ret i32 {{.*}}
115+
a.to_int_unchecked()
116+
}
117+
118+
119+
// CHECK-LABEL: @cast_unchecked_f64_u64
120+
#[no_mangle]
121+
pub unsafe fn cast_unchecked_f64_u64(a: f64) -> u64 {
122+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
123+
// CHECK: fptoui double {{.*}} to i64
124+
// CHECK-NEXT: ret i64 {{.*}}
125+
a.to_int_unchecked()
126+
}
127+
128+
// CHECK-LABEL: @cast_unchecked_f64_u32
129+
#[no_mangle]
130+
pub unsafe fn cast_unchecked_f64_u32(a: f64) -> u32 {
131+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
132+
// CHECK: fptoui double {{.*}} to i32
133+
// CHECK-NEXT: ret i32 {{.*}}
134+
a.to_int_unchecked()
135+
}
136+
137+
// CHECK-LABEL: @cast_unchecked_f32_u64
138+
#[no_mangle]
139+
pub unsafe fn cast_unchecked_f32_u64(a: f32) -> u64 {
140+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
141+
// CHECK: fptoui float {{.*}} to i64
142+
// CHECK-NEXT: ret i64 {{.*}}
143+
a.to_int_unchecked()
144+
}
145+
146+
// CHECK-LABEL: @cast_unchecked_f32_u32
147+
#[no_mangle]
148+
pub unsafe fn cast_unchecked_f32_u32(a: f32) -> u32 {
149+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
150+
// CHECK: fptoui float {{.*}} to i32
151+
// CHECK-NEXT: ret i32 {{.*}}
152+
a.to_int_unchecked()
153+
}
154+
155+
// CHECK-LABEL: @cast_unchecked_f32_u8
156+
#[no_mangle]
157+
pub unsafe fn cast_unchecked_f32_u8(a: f32) -> u8 {
158+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
159+
// CHECK: fptoui float {{.*}} to i8
160+
// CHECK-NEXT: ret i8 {{.*}}
161+
a.to_int_unchecked()
162+
}
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
// only-wasm32
2+
// compile-flags: -C target-feature=-nontrapping-fptoint
3+
#![crate_type = "lib"]
4+
5+
// CHECK-LABEL: @cast_f64_i64
6+
#[no_mangle]
7+
pub fn cast_f64_i64(a: f64) -> i64 {
8+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
9+
// CHECK: fptosi double {{.*}} to i64
10+
// CHECK-NEXT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
11+
a as _
12+
}
13+
14+
// CHECK-LABEL: @cast_f64_i32
15+
#[no_mangle]
16+
pub fn cast_f64_i32(a: f64) -> i32 {
17+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
18+
// CHECK: fptosi double {{.*}} to i32
19+
// CHECK-NEXT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
20+
a as _
21+
}
22+
23+
// CHECK-LABEL: @cast_f32_i64
24+
#[no_mangle]
25+
pub fn cast_f32_i64(a: f32) -> i64 {
26+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
27+
// CHECK: fptosi float {{.*}} to i64
28+
// CHECK-NEXT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
29+
a as _
30+
}
31+
32+
// CHECK-LABEL: @cast_f32_i32
33+
#[no_mangle]
34+
pub fn cast_f32_i32(a: f32) -> i32 {
35+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
36+
// CHECK: fptosi float {{.*}} to i32
37+
// CHECK-NEXT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
38+
a as _
39+
}
40+
41+
42+
// CHECK-LABEL: @cast_f64_u64
43+
#[no_mangle]
44+
pub fn cast_f64_u64(a: f64) -> u64 {
45+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
46+
// CHECK: fptoui double {{.*}} to i64
47+
// CHECK-NEXT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
48+
a as _
49+
}
50+
51+
// CHECK-LABEL: @cast_f64_u32
52+
#[no_mangle]
53+
pub fn cast_f64_u32(a: f64) -> u32 {
54+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
55+
// CHECK: fptoui double {{.*}} to i32
56+
// CHECK-NEXT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
57+
a as _
58+
}
59+
60+
// CHECK-LABEL: @cast_f32_u64
61+
#[no_mangle]
62+
pub fn cast_f32_u64(a: f32) -> u64 {
63+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
64+
// CHECK: fptoui float {{.*}} to i64
65+
// CHECK-NEXT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
66+
a as _
67+
}
68+
69+
// CHECK-LABEL: @cast_f32_u32
70+
#[no_mangle]
71+
pub fn cast_f32_u32(a: f32) -> u32 {
72+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
73+
// CHECK: fptoui float {{.*}} to i32
74+
// CHECK-NEXT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
75+
a as _
76+
}
77+
78+
// CHECK-LABEL: @cast_f32_u8
79+
#[no_mangle]
80+
pub fn cast_f32_u8(a: f32) -> u8 {
81+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
82+
// CHECK: fptoui float {{.*}} to i8
83+
// CHECK-NEXT: select i1 {{.*}}, i8 {{.*}}, i8 {{.*}}
84+
a as _
85+
}
86+
87+
88+
89+
// CHECK-LABEL: @cast_unchecked_f64_i64
90+
#[no_mangle]
91+
pub unsafe fn cast_unchecked_f64_i64(a: f64) -> i64 {
92+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
93+
// CHECK: fptosi double {{.*}} to i64
94+
// CHECK-NEXT: ret i64 {{.*}}
95+
a.to_int_unchecked()
96+
}
97+
98+
// CHECK-LABEL: @cast_unchecked_f64_i32
99+
#[no_mangle]
100+
pub unsafe fn cast_unchecked_f64_i32(a: f64) -> i32 {
101+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
102+
// CHECK: fptosi double {{.*}} to i32
103+
// CHECK-NEXT: ret i32 {{.*}}
104+
a.to_int_unchecked()
105+
}
106+
107+
// CHECK-LABEL: @cast_unchecked_f32_i64
108+
#[no_mangle]
109+
pub unsafe fn cast_unchecked_f32_i64(a: f32) -> i64 {
110+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
111+
// CHECK: fptosi float {{.*}} to i64
112+
// CHECK-NEXT: ret i64 {{.*}}
113+
a.to_int_unchecked()
114+
}
115+
116+
// CHECK-LABEL: @cast_unchecked_f32_i32
117+
#[no_mangle]
118+
pub unsafe fn cast_unchecked_f32_i32(a: f32) -> i32 {
119+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
120+
// CHECK: fptosi float {{.*}} to i32
121+
// CHECK-NEXT: ret i32 {{.*}}
122+
a.to_int_unchecked()
123+
}
124+
125+
126+
// CHECK-LABEL: @cast_unchecked_f64_u64
127+
#[no_mangle]
128+
pub unsafe fn cast_unchecked_f64_u64(a: f64) -> u64 {
129+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
130+
// CHECK: fptoui double {{.*}} to i64
131+
// CHECK-NEXT: ret i64 {{.*}}
132+
a.to_int_unchecked()
133+
}
134+
135+
// CHECK-LABEL: @cast_unchecked_f64_u32
136+
#[no_mangle]
137+
pub unsafe fn cast_unchecked_f64_u32(a: f64) -> u32 {
138+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
139+
// CHECK: fptoui double {{.*}} to i32
140+
// CHECK-NEXT: ret i32 {{.*}}
141+
a.to_int_unchecked()
142+
}
143+
144+
// CHECK-LABEL: @cast_unchecked_f32_u64
145+
#[no_mangle]
146+
pub unsafe fn cast_unchecked_f32_u64(a: f32) -> u64 {
147+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
148+
// CHECK: fptoui float {{.*}} to i64
149+
// CHECK-NEXT: ret i64 {{.*}}
150+
a.to_int_unchecked()
151+
}
152+
153+
// CHECK-LABEL: @cast_unchecked_f32_u32
154+
#[no_mangle]
155+
pub unsafe fn cast_unchecked_f32_u32(a: f32) -> u32 {
156+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
157+
// CHECK: fptoui float {{.*}} to i32
158+
// CHECK-NEXT: ret i32 {{.*}}
159+
a.to_int_unchecked()
160+
}
161+
162+
// CHECK-LABEL: @cast_unchecked_f32_u8
163+
#[no_mangle]
164+
pub unsafe fn cast_unchecked_f32_u8(a: f32) -> u8 {
165+
// CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
166+
// CHECK: fptoui float {{.*}} to i8
167+
// CHECK-NEXT: ret i8 {{.*}}
168+
a.to_int_unchecked()
169+
}

0 commit comments

Comments
 (0)