about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbjorn3 <17426603+bjorn3@users.noreply.github.com>2022-08-04 18:48:09 +0200
committerGitHub <noreply@github.com>2022-08-04 18:48:09 +0200
commit9e1aa9c5f7e9fe6969000101169e8d3773dab212 (patch)
tree3214141cfc39aaa19b5b4508e72b85e2932bd449
parent0c5b61fca892bfa2cd032d28254aaf8acaa76d66 (diff)
parent8c8fc6af33c0a10340535fb9eb6ab9b7648bf742 (diff)
downloadrust-9e1aa9c5f7e9fe6969000101169e8d3773dab212.tar.gz
rust-9e1aa9c5f7e9fe6969000101169e8d3773dab212.zip
Merge pull request #1254 from afonso360/float-intrinsics-fix
Use native cranelift instructions when lowering float intrinsics
-rw-r--r--src/intrinsics/mod.rs33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/intrinsics/mod.rs b/src/intrinsics/mod.rs
index f552c13958d..77caf741acf 100644
--- a/src/intrinsics/mod.rs
+++ b/src/intrinsics/mod.rs
@@ -301,7 +301,38 @@ fn codegen_float_intrinsic_call<'tcx>(
         _ => unreachable!(),
     };
 
-    let res = fx.easy_call(name, &args, ty);
+    let layout = fx.layout_of(ty);
+    let res = match intrinsic {
+        sym::copysignf32 | sym::copysignf64 => {
+            let a = args[0].load_scalar(fx);
+            let b = args[1].load_scalar(fx);
+            CValue::by_val(fx.bcx.ins().fcopysign(a, b), layout)
+        }
+        sym::fabsf32
+        | sym::fabsf64
+        | sym::floorf32
+        | sym::floorf64
+        | sym::ceilf32
+        | sym::ceilf64
+        | sym::truncf32
+        | sym::truncf64 => {
+            let a = args[0].load_scalar(fx);
+
+            let val = match intrinsic {
+                sym::fabsf32 | sym::fabsf64 => fx.bcx.ins().fabs(a),
+                sym::floorf32 | sym::floorf64 => fx.bcx.ins().floor(a),
+                sym::ceilf32 | sym::ceilf64 => fx.bcx.ins().ceil(a),
+                sym::truncf32 | sym::truncf64 => fx.bcx.ins().trunc(a),
+                _ => unreachable!(),
+            };
+
+            CValue::by_val(val, layout)
+        }
+        // These intrinsics aren't supported natively by Cranelift.
+        // Lower them to a libcall.
+        _ => fx.easy_call(name, &args, ty),
+    };
+
     ret.write_cvalue(fx, res);
 
     true