diff options
| author | bjorn3 <17426603+bjorn3@users.noreply.github.com> | 2022-08-04 18:48:09 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-04 18:48:09 +0200 |
| commit | 9e1aa9c5f7e9fe6969000101169e8d3773dab212 (patch) | |
| tree | 3214141cfc39aaa19b5b4508e72b85e2932bd449 | |
| parent | 0c5b61fca892bfa2cd032d28254aaf8acaa76d66 (diff) | |
| parent | 8c8fc6af33c0a10340535fb9eb6ab9b7648bf742 (diff) | |
| download | rust-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.rs | 33 |
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 |
