]> git.lizzy.rs Git - rust.git/blob - tests/codegen/wasm_casts_trapping.rs
Rollup merge of #107555 - edward-shen:edward-shen/dup-trait-suggestion, r=compiler...
[rust.git] / tests / codegen / wasm_casts_trapping.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-NOT: fptosi double {{.*}} to i64
9     // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
10     // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i64.f64{{.*}}
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: fptosi double {{.*}} to i32
18     // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
19     // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i32.f64{{.*}}
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: fptosi float {{.*}} to i64
27     // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
28     // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i64.f32{{.*}}
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: fptosi float {{.*}} to i32
36     // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
37     // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i32.f32{{.*}}
38     a as _
39 }
40
41 // CHECK-LABEL: @cast_f64_u64
42 #[no_mangle]
43 pub fn cast_f64_u64(a: f64) -> u64 {
44     // CHECK-NOT: fptoui double {{.*}} to i64
45     // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
46     // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i64.f64{{.*}}
47     a as _
48 }
49
50 // CHECK-LABEL: @cast_f64_u32
51 #[no_mangle]
52 pub fn cast_f64_u32(a: f64) -> u32 {
53     // CHECK-NOT: fptoui double {{.*}} to i32
54     // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
55     // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i32.f64{{.*}}
56     a as _
57 }
58
59 // CHECK-LABEL: @cast_f32_u64
60 #[no_mangle]
61 pub fn cast_f32_u64(a: f32) -> u64 {
62     // CHECK-NOT: fptoui float {{.*}} to i64
63     // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
64     // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i64.f32{{.*}}
65     a as _
66 }
67
68 // CHECK-LABEL: @cast_f32_u32
69 #[no_mangle]
70 pub fn cast_f32_u32(a: f32) -> u32 {
71     // CHECK-NOT: fptoui float {{.*}} to i32
72     // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
73     // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i32.f32{{.*}}
74     a as _
75 }
76
77 // CHECK-LABEL: @cast_f32_u8
78 #[no_mangle]
79 pub fn cast_f32_u8(a: f32) -> u8 {
80     // CHECK-NOT: fptoui float {{.*}} to i8
81     // CHECK-NOT: select i1 {{.*}}, i8 {{.*}}, i8 {{.*}}
82     // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i8.f32{{.*}}
83     a as _
84 }
85
86 // CHECK-LABEL: @cast_unchecked_f64_i64
87 #[no_mangle]
88 pub unsafe fn cast_unchecked_f64_i64(a: f64) -> i64 {
89     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
90     // CHECK-NEXT: ret i64 {{.*}}
91     a.to_int_unchecked()
92 }
93
94 // CHECK-LABEL: @cast_unchecked_f64_i32
95 #[no_mangle]
96 pub unsafe fn cast_unchecked_f64_i32(a: f64) -> i32 {
97     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
98     // CHECK-NEXT: ret i32 {{.*}}
99     a.to_int_unchecked()
100 }
101
102 // CHECK-LABEL: @cast_unchecked_f32_i64
103 #[no_mangle]
104 pub unsafe fn cast_unchecked_f32_i64(a: f32) -> i64 {
105     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
106     // CHECK-NEXT: ret i64 {{.*}}
107     a.to_int_unchecked()
108 }
109
110 // CHECK-LABEL: @cast_unchecked_f32_i32
111 #[no_mangle]
112 pub unsafe fn cast_unchecked_f32_i32(a: f32) -> i32 {
113     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
114     // CHECK-NEXT: ret i32 {{.*}}
115     a.to_int_unchecked()
116 }
117
118 // CHECK-LABEL: @cast_unchecked_f64_u64
119 #[no_mangle]
120 pub unsafe fn cast_unchecked_f64_u64(a: f64) -> u64 {
121     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
122     // CHECK-NEXT: ret i64 {{.*}}
123     a.to_int_unchecked()
124 }
125
126 // CHECK-LABEL: @cast_unchecked_f64_u32
127 #[no_mangle]
128 pub unsafe fn cast_unchecked_f64_u32(a: f64) -> u32 {
129     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
130     // CHECK-NEXT: ret i32 {{.*}}
131     a.to_int_unchecked()
132 }
133
134 // CHECK-LABEL: @cast_unchecked_f32_u64
135 #[no_mangle]
136 pub unsafe fn cast_unchecked_f32_u64(a: f32) -> u64 {
137     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
138     // CHECK-NEXT: ret i64 {{.*}}
139     a.to_int_unchecked()
140 }
141
142 // CHECK-LABEL: @cast_unchecked_f32_u32
143 #[no_mangle]
144 pub unsafe fn cast_unchecked_f32_u32(a: f32) -> u32 {
145     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
146     // CHECK-NEXT: ret i32 {{.*}}
147     a.to_int_unchecked()
148 }
149
150 // CHECK-LABEL: @cast_unchecked_f32_u8
151 #[no_mangle]
152 pub unsafe fn cast_unchecked_f32_u8(a: f32) -> u8 {
153     // CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
154     // CHECK: fptoui float {{.*}} to i8
155     // CHECK-NEXT: ret i8 {{.*}}
156     a.to_int_unchecked()
157 }