]> git.lizzy.rs Git - rust.git/blob - src/test/codegen/wasm_casts_trapping.rs
Add 'library/portable-simd/' from commit '1ce1c645cf27c4acdefe6ec8a11d1f0491954a99'
[rust.git] / src / test / codegen / wasm_casts_trapping.rs
1 // only-wasm32
2 // compile-flags: -C target-feature=-nontrapping-fptoint
3 // min-llvm-version: 12.0
4 #![crate_type = "lib"]
5
6 // CHECK-LABEL: @cast_f64_i64
7 #[no_mangle]
8 pub fn cast_f64_i64(a: f64) -> i64 {
9     // CHECK-NOT: fptosi double {{.*}} to i64
10     // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
11     // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i64.f64{{.*}}
12     a as _
13 }
14
15 // CHECK-LABEL: @cast_f64_i32
16 #[no_mangle]
17 pub fn cast_f64_i32(a: f64) -> i32 {
18     // CHECK-NOT: fptosi double {{.*}} to i32
19     // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
20     // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i32.f64{{.*}}
21     a as _
22 }
23
24 // CHECK-LABEL: @cast_f32_i64
25 #[no_mangle]
26 pub fn cast_f32_i64(a: f32) -> i64 {
27     // CHECK-NOT: fptosi float {{.*}} to i64
28     // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
29     // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i64.f32{{.*}}
30     a as _
31 }
32
33 // CHECK-LABEL: @cast_f32_i32
34 #[no_mangle]
35 pub fn cast_f32_i32(a: f32) -> i32 {
36     // CHECK-NOT: fptosi float {{.*}} to i32
37     // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
38     // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i32.f32{{.*}}
39     a as _
40 }
41
42 // CHECK-LABEL: @cast_f64_u64
43 #[no_mangle]
44 pub fn cast_f64_u64(a: f64) -> u64 {
45     // CHECK-NOT: fptoui double {{.*}} to i64
46     // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
47     // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i64.f64{{.*}}
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: fptoui double {{.*}} to i32
55     // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
56     // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i32.f64{{.*}}
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: fptoui float {{.*}} to i64
64     // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
65     // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i64.f32{{.*}}
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: fptoui float {{.*}} to i32
73     // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
74     // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i32.f32{{.*}}
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: fptoui float {{.*}} to i8
82     // CHECK-NOT: select i1 {{.*}}, i8 {{.*}}, i8 {{.*}}
83     // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i8.f32{{.*}}
84     a as _
85 }
86
87 // CHECK-LABEL: @cast_unchecked_f64_i64
88 #[no_mangle]
89 pub unsafe fn cast_unchecked_f64_i64(a: f64) -> i64 {
90     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
91     // CHECK-NEXT: ret i64 {{.*}}
92     a.to_int_unchecked()
93 }
94
95 // CHECK-LABEL: @cast_unchecked_f64_i32
96 #[no_mangle]
97 pub unsafe fn cast_unchecked_f64_i32(a: f64) -> i32 {
98     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
99     // CHECK-NEXT: ret i32 {{.*}}
100     a.to_int_unchecked()
101 }
102
103 // CHECK-LABEL: @cast_unchecked_f32_i64
104 #[no_mangle]
105 pub unsafe fn cast_unchecked_f32_i64(a: f32) -> i64 {
106     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
107     // CHECK-NEXT: ret i64 {{.*}}
108     a.to_int_unchecked()
109 }
110
111 // CHECK-LABEL: @cast_unchecked_f32_i32
112 #[no_mangle]
113 pub unsafe fn cast_unchecked_f32_i32(a: f32) -> i32 {
114     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
115     // CHECK-NEXT: ret i32 {{.*}}
116     a.to_int_unchecked()
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: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
123     // CHECK-NEXT: ret i64 {{.*}}
124     a.to_int_unchecked()
125 }
126
127 // CHECK-LABEL: @cast_unchecked_f64_u32
128 #[no_mangle]
129 pub unsafe fn cast_unchecked_f64_u32(a: f64) -> u32 {
130     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
131     // CHECK-NEXT: ret i32 {{.*}}
132     a.to_int_unchecked()
133 }
134
135 // CHECK-LABEL: @cast_unchecked_f32_u64
136 #[no_mangle]
137 pub unsafe fn cast_unchecked_f32_u64(a: f32) -> u64 {
138     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
139     // CHECK-NEXT: ret i64 {{.*}}
140     a.to_int_unchecked()
141 }
142
143 // CHECK-LABEL: @cast_unchecked_f32_u32
144 #[no_mangle]
145 pub unsafe fn cast_unchecked_f32_u32(a: f32) -> u32 {
146     // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
147     // CHECK-NEXT: ret i32 {{.*}}
148     a.to_int_unchecked()
149 }
150
151 // CHECK-LABEL: @cast_unchecked_f32_u8
152 #[no_mangle]
153 pub unsafe fn cast_unchecked_f32_u8(a: f32) -> u8 {
154     // CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
155     // CHECK: fptoui float {{.*}} to i8
156     // CHECK-NEXT: ret i8 {{.*}}
157     a.to_int_unchecked()
158 }