]> git.lizzy.rs Git - rust.git/blob - src/test/codegen/wasm_casts_nontrapping.rs
Rollup merge of #82296 - spastorino:pubrules, r=nikomatsakis
[rust.git] / src / test / codegen / wasm_casts_nontrapping.rs
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 }