/src/test/codegen/wasm_casts_trapping.rs

https://gitlab.com/rust-lang/rust · Rust · 157 lines · 73 code · 18 blank · 66 comment · 0 complexity · 358a33b2624b230beae7bde49e109b38 MD5 · raw file

  1. // only-wasm32
  2. // compile-flags: -C target-feature=-nontrapping-fptoint
  3. #![crate_type = "lib"]
  4. // CHECK-LABEL: @cast_f64_i64
  5. #[no_mangle]
  6. pub fn cast_f64_i64(a: f64) -> i64 {
  7. // CHECK-NOT: fptosi double {{.*}} to i64
  8. // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
  9. // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i64.f64{{.*}}
  10. a as _
  11. }
  12. // CHECK-LABEL: @cast_f64_i32
  13. #[no_mangle]
  14. pub fn cast_f64_i32(a: f64) -> i32 {
  15. // CHECK-NOT: fptosi double {{.*}} to i32
  16. // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
  17. // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i32.f64{{.*}}
  18. a as _
  19. }
  20. // CHECK-LABEL: @cast_f32_i64
  21. #[no_mangle]
  22. pub fn cast_f32_i64(a: f32) -> i64 {
  23. // CHECK-NOT: fptosi float {{.*}} to i64
  24. // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
  25. // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i64.f32{{.*}}
  26. a as _
  27. }
  28. // CHECK-LABEL: @cast_f32_i32
  29. #[no_mangle]
  30. pub fn cast_f32_i32(a: f32) -> i32 {
  31. // CHECK-NOT: fptosi float {{.*}} to i32
  32. // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
  33. // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i32.f32{{.*}}
  34. a as _
  35. }
  36. // CHECK-LABEL: @cast_f64_u64
  37. #[no_mangle]
  38. pub fn cast_f64_u64(a: f64) -> u64 {
  39. // CHECK-NOT: fptoui double {{.*}} to i64
  40. // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
  41. // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i64.f64{{.*}}
  42. a as _
  43. }
  44. // CHECK-LABEL: @cast_f64_u32
  45. #[no_mangle]
  46. pub fn cast_f64_u32(a: f64) -> u32 {
  47. // CHECK-NOT: fptoui double {{.*}} to i32
  48. // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
  49. // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i32.f64{{.*}}
  50. a as _
  51. }
  52. // CHECK-LABEL: @cast_f32_u64
  53. #[no_mangle]
  54. pub fn cast_f32_u64(a: f32) -> u64 {
  55. // CHECK-NOT: fptoui float {{.*}} to i64
  56. // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}}
  57. // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i64.f32{{.*}}
  58. a as _
  59. }
  60. // CHECK-LABEL: @cast_f32_u32
  61. #[no_mangle]
  62. pub fn cast_f32_u32(a: f32) -> u32 {
  63. // CHECK-NOT: fptoui float {{.*}} to i32
  64. // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}}
  65. // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i32.f32{{.*}}
  66. a as _
  67. }
  68. // CHECK-LABEL: @cast_f32_u8
  69. #[no_mangle]
  70. pub fn cast_f32_u8(a: f32) -> u8 {
  71. // CHECK-NOT: fptoui float {{.*}} to i8
  72. // CHECK-NOT: select i1 {{.*}}, i8 {{.*}}, i8 {{.*}}
  73. // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i8.f32{{.*}}
  74. a as _
  75. }
  76. // CHECK-LABEL: @cast_unchecked_f64_i64
  77. #[no_mangle]
  78. pub unsafe fn cast_unchecked_f64_i64(a: f64) -> i64 {
  79. // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
  80. // CHECK-NEXT: ret i64 {{.*}}
  81. a.to_int_unchecked()
  82. }
  83. // CHECK-LABEL: @cast_unchecked_f64_i32
  84. #[no_mangle]
  85. pub unsafe fn cast_unchecked_f64_i32(a: f64) -> i32 {
  86. // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
  87. // CHECK-NEXT: ret i32 {{.*}}
  88. a.to_int_unchecked()
  89. }
  90. // CHECK-LABEL: @cast_unchecked_f32_i64
  91. #[no_mangle]
  92. pub unsafe fn cast_unchecked_f32_i64(a: f32) -> i64 {
  93. // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
  94. // CHECK-NEXT: ret i64 {{.*}}
  95. a.to_int_unchecked()
  96. }
  97. // CHECK-LABEL: @cast_unchecked_f32_i32
  98. #[no_mangle]
  99. pub unsafe fn cast_unchecked_f32_i32(a: f32) -> i32 {
  100. // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}}
  101. // CHECK-NEXT: ret i32 {{.*}}
  102. a.to_int_unchecked()
  103. }
  104. // CHECK-LABEL: @cast_unchecked_f64_u64
  105. #[no_mangle]
  106. pub unsafe fn cast_unchecked_f64_u64(a: f64) -> u64 {
  107. // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
  108. // CHECK-NEXT: ret i64 {{.*}}
  109. a.to_int_unchecked()
  110. }
  111. // CHECK-LABEL: @cast_unchecked_f64_u32
  112. #[no_mangle]
  113. pub unsafe fn cast_unchecked_f64_u32(a: f64) -> u32 {
  114. // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
  115. // CHECK-NEXT: ret i32 {{.*}}
  116. a.to_int_unchecked()
  117. }
  118. // CHECK-LABEL: @cast_unchecked_f32_u64
  119. #[no_mangle]
  120. pub unsafe fn cast_unchecked_f32_u64(a: f32) -> u64 {
  121. // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
  122. // CHECK-NEXT: ret i64 {{.*}}
  123. a.to_int_unchecked()
  124. }
  125. // CHECK-LABEL: @cast_unchecked_f32_u32
  126. #[no_mangle]
  127. pub unsafe fn cast_unchecked_f32_u32(a: f32) -> u32 {
  128. // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}}
  129. // CHECK-NEXT: ret i32 {{.*}}
  130. a.to_int_unchecked()
  131. }
  132. // CHECK-LABEL: @cast_unchecked_f32_u8
  133. #[no_mangle]
  134. pub unsafe fn cast_unchecked_f32_u8(a: f32) -> u8 {
  135. // CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}}
  136. // CHECK: fptoui float {{.*}} to i8
  137. // CHECK-NEXT: ret i8 {{.*}}
  138. a.to_int_unchecked()
  139. }