2 // compile-flags: -C target-feature=-nontrapping-fptoint
3 // min-llvm-version: 12.0
6 // CHECK-LABEL: @cast_f64_i64
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{{.*}}
15 // CHECK-LABEL: @cast_f64_i32
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{{.*}}
24 // CHECK-LABEL: @cast_f32_i64
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{{.*}}
33 // CHECK-LABEL: @cast_f32_i32
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{{.*}}
42 // CHECK-LABEL: @cast_f64_u64
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{{.*}}
51 // CHECK-LABEL: @cast_f64_u32
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{{.*}}
60 // CHECK-LABEL: @cast_f32_u64
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{{.*}}
69 // CHECK-LABEL: @cast_f32_u32
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{{.*}}
78 // CHECK-LABEL: @cast_f32_u8
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{{.*}}
87 // CHECK-LABEL: @cast_unchecked_f64_i64
89 pub unsafe fn cast_unchecked_f64_i64(a: f64) -> i64 {
90 // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
91 // CHECK-NEXT: ret i64 {{.*}}
95 // CHECK-LABEL: @cast_unchecked_f64_i32
97 pub unsafe fn cast_unchecked_f64_i32(a: f64) -> i32 {
98 // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
99 // CHECK-NEXT: ret i32 {{.*}}
103 // CHECK-LABEL: @cast_unchecked_f32_i64
105 pub unsafe fn cast_unchecked_f32_i64(a: f32) -> i64 {
106 // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
107 // CHECK-NEXT: ret i64 {{.*}}
111 // CHECK-LABEL: @cast_unchecked_f32_i32
113 pub unsafe fn cast_unchecked_f32_i32(a: f32) -> i32 {
114 // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
115 // CHECK-NEXT: ret i32 {{.*}}
119 // CHECK-LABEL: @cast_unchecked_f64_u64
121 pub unsafe fn cast_unchecked_f64_u64(a: f64) -> u64 {
122 // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
123 // CHECK-NEXT: ret i64 {{.*}}
127 // CHECK-LABEL: @cast_unchecked_f64_u32
129 pub unsafe fn cast_unchecked_f64_u32(a: f64) -> u32 {
130 // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
131 // CHECK-NEXT: ret i32 {{.*}}
135 // CHECK-LABEL: @cast_unchecked_f32_u64
137 pub unsafe fn cast_unchecked_f32_u64(a: f32) -> u64 {
138 // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
139 // CHECK-NEXT: ret i64 {{.*}}
143 // CHECK-LABEL: @cast_unchecked_f32_u32
145 pub unsafe fn cast_unchecked_f32_u32(a: f32) -> u32 {
146 // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
147 // CHECK-NEXT: ret i32 {{.*}}
151 // CHECK-LABEL: @cast_unchecked_f32_u8
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 {{.*}}