From ca983f5f80c2e3c5cc54349276ccc8845063bf84 Mon Sep 17 00:00:00 2001 From: Steven Gu Date: Wed, 13 Nov 2019 10:14:13 +0800 Subject: [PATCH] Implments `intrinsics::copysignf32` and `intrinsics::copysignf64`. --- src/shims/intrinsics.rs | 22 ++++++++++++---------- tests/run-pass/floats.rs | 12 ++++++++++++ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/shims/intrinsics.rs b/src/shims/intrinsics.rs index 7470090f5208..34b8c483225b 100644 --- a/src/shims/intrinsics.rs +++ b/src/shims/intrinsics.rs @@ -291,24 +291,26 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx this.binop_ignore_overflow(op, a, b, dest)?; } - "minnumf32" | "maxnumf32" => { + "minnumf32" | "maxnumf32" | "copysignf32" => { let a = this.read_scalar(args[0])?.to_f32()?; let b = this.read_scalar(args[1])?.to_f32()?; - let res = if intrinsic_name.starts_with("min") { - a.min(b) - } else { - a.max(b) + let res = match intrinsic_name { + "minnumf32" => a.min(b), + "maxnumf32" => a.max(b), + "copysignf32" => a.copy_sign(b), + _ => bug!(), }; this.write_scalar(Scalar::from_f32(res), dest)?; } - "minnumf64" | "maxnumf64" => { + "minnumf64" | "maxnumf64" | "copysignf64" => { let a = this.read_scalar(args[0])?.to_f64()?; let b = this.read_scalar(args[1])?.to_f64()?; - let res = if intrinsic_name.starts_with("min") { - a.min(b) - } else { - a.max(b) + let res = match intrinsic_name { + "minnumf64" => a.min(b), + "maxnumf64" => a.max(b), + "copysignf64" => a.copy_sign(b), + _ => bug!(), }; this.write_scalar(Scalar::from_f64(res), dest)?; } diff --git a/tests/run-pass/floats.rs b/tests/run-pass/floats.rs index c1588dae249a..7577c48c5ae3 100644 --- a/tests/run-pass/floats.rs +++ b/tests/run-pass/floats.rs @@ -25,4 +25,16 @@ fn main() { assert_eq!(std::f64::NAN.max(-9.0), -9.0); assert_eq!((9.0 as f64).min(std::f64::NAN), 9.0); assert_eq!((-9.0 as f64).max(std::f64::NAN), -9.0); + + assert_eq!(3.5_f32.copysign(0.42), 3.5_f32); + assert_eq!(3.5_f32.copysign(-0.42), -3.5_f32); + assert_eq!((-3.5_f32).copysign(0.42), 3.5_f32); + assert_eq!((-3.5_f32).copysign(-0.42), -3.5_f32); + assert!(std::f32::NAN.copysign(1.0).is_nan()); + + assert_eq!(3.5_f64.copysign(0.42), 3.5_f64); + assert_eq!(3.5_f64.copysign(-0.42), -3.5_f64); + assert_eq!((-3.5_f64).copysign(0.42), 3.5_f64); + assert_eq!((-3.5_f64).copysign(-0.42), -3.5_f64); + assert!(std::f64::NAN.copysign(1.0).is_nan()); }