]> git.proxmox.com Git - rustc.git/blob - src/test/codegen/wasm_casts_nontrapping.rs
New upstream version 1.46.0~beta.2+dfsg1
[rustc.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 }