about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2019-06-09 00:51:47 +0200
committerRalf Jung <post@ralfj.de>2019-06-09 00:51:47 +0200
commit8316cecf697d106e0132081b7df5409faac5e4d4 (patch)
tree82e3e6b01b539ff8eddd526ed17946d5dc96f6c6
parent0012af695eb81f2ab5dfb787383df5415e8cfba1 (diff)
downloadrust-8316cecf697d106e0132081b7df5409faac5e4d4.tar.gz
rust-8316cecf697d106e0132081b7df5409faac5e4d4.zip
make unary float negation slightly nicer
-rw-r--r--src/librustc_mir/interpret/operator.rs8
1 files changed, 3 insertions, 5 deletions
diff --git a/src/librustc_mir/interpret/operator.rs b/src/librustc_mir/interpret/operator.rs
index dd04a8b3c30..eb45bb0e277 100644
--- a/src/librustc_mir/interpret/operator.rs
+++ b/src/librustc_mir/interpret/operator.rs
@@ -1,7 +1,6 @@
 use rustc::mir;
 use rustc::ty::{self, layout::TyLayout};
 use syntax::ast::FloatTy;
-use rustc_apfloat::ieee::{Double, Single};
 use rustc_apfloat::Float;
 use rustc::mir::interpret::{InterpResult, Scalar};
 
@@ -335,13 +334,12 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> InterpretCx<'a, 'mir, 'tcx, M>
                 Ok(Scalar::from_bool(res))
             }
             ty::Float(fty) => {
-                let val = val.to_bits(layout.size)?;
                 let res = match (un_op, fty) {
-                    (Neg, FloatTy::F32) => Single::to_bits(-Single::from_bits(val)),
-                    (Neg, FloatTy::F64) => Double::to_bits(-Double::from_bits(val)),
+                    (Neg, FloatTy::F32) => Scalar::from_f32(-val.to_f32()?),
+                    (Neg, FloatTy::F64) => Scalar::from_f64(-val.to_f64()?),
                     _ => bug!("Invalid float op {:?}", un_op)
                 };
-                Ok(Scalar::from_uint(res, layout.size))
+                Ok(res)
             }
             _ => {
                 assert!(layout.ty.is_integral());