From ff2001040f06bda894fb512684e34ea12deade6e Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Fri, 2 Aug 2019 13:42:10 -0500 Subject: [PATCH 1/2] Add shim for ldexp --- src/shims/foreign_items.rs | 12 ++++++++++-- tests/run-pass/intrinsics-math.rs | 4 ++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/shims/foreign_items.rs b/src/shims/foreign_items.rs index bcfcda2fd01..33213294782 100644 --- a/src/shims/foreign_items.rs +++ b/src/shims/foreign_items.rs @@ -603,7 +603,15 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx }; this.write_scalar(Scalar::from_u64(n.to_bits()), dest)?; } - + // underscore case for windows + "_ldexp" | "ldexp" => { + // FIXME: Using host floats. + let x = f64::from_bits(this.read_scalar(args[0])?.to_u64()?); + let exp = this.read_scalar(args[1])?.to_i32()?; + // FIXME: We should use cmath if there are any imprecisions. + let n = x * 2.0f64.powi(exp); + this.write_scalar(Scalar::from_u64(n.to_bits()), dest)?; + } // Some things needed for `sys::thread` initialization to go through. "signal" | "sigaction" | "sigaltstack" => { this.write_scalar(Scalar::from_int(0, dest.layout.size), dest)?; @@ -973,4 +981,4 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx } return Ok(None); } -} \ No newline at end of file +} diff --git a/tests/run-pass/intrinsics-math.rs b/tests/run-pass/intrinsics-math.rs index 20c0f674948..9a7a70bd009 100644 --- a/tests/run-pass/intrinsics-math.rs +++ b/tests/run-pass/intrinsics-math.rs @@ -85,4 +85,8 @@ pub fn main() { assert_approx_eq!(1.0f32.tan(), 1.557408f32); assert_approx_eq!(1.0f64.tan(), 1.557408f64); + extern { + fn ldexp(x: f64, n: i32) -> f64; + } + unsafe { assert_approx_eq!(ldexp(0.65f64, 3i32), 5.2f64); } } From c4cea035e670eddc1afb0b78a6cdd37cb58c8fb7 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Sat, 3 Aug 2019 10:51:23 -0500 Subject: [PATCH 2/2] Formatting --- src/shims/foreign_items.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/shims/foreign_items.rs b/src/shims/foreign_items.rs index 33213294782..3e3266b74a0 100644 --- a/src/shims/foreign_items.rs +++ b/src/shims/foreign_items.rs @@ -612,6 +612,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx let n = x * 2.0f64.powi(exp); this.write_scalar(Scalar::from_u64(n.to_bits()), dest)?; } + // Some things needed for `sys::thread` initialization to go through. "signal" | "sigaction" | "sigaltstack" => { this.write_scalar(Scalar::from_int(0, dest.layout.size), dest)?;