From 20f152296ac397f900fc033587a231a3a3d2e4df Mon Sep 17 00:00:00 2001 From: Scott Olson Date: Sat, 19 Mar 2016 11:01:33 -0600 Subject: [PATCH] Implement min_align_of and a hacky mul_with_overflow. --- src/interpreter.rs | 23 +++++++++++++++++++++++ src/lib.rs | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/interpreter.rs b/src/interpreter.rs index 73011886cdb..3f710ba2e2b 100644 --- a/src/interpreter.rs +++ b/src/interpreter.rs @@ -339,6 +339,29 @@ impl<'a, 'tcx: 'a, 'arena> Interpreter<'a, 'tcx, 'arena> { // TODO(tsion): Mark as dropped? "forget" => {} + "min_align_of" => { + try!(self.memory.write_int(dest, 1, dest_size)); + } + + // FIXME(tsion): Handle different integer types correctly. + "mul_with_overflow" => { + let ty = *substs.types.get(subst::FnSpace, 0); + let size = self.ty_size(ty); + + let left_arg = try!(self.eval_operand(&args[0])); + let right_arg = try!(self.eval_operand(&args[1])); + + let left = try!(self.memory.read_int(left_arg, size)); + let right = try!(self.memory.read_int(right_arg, size)); + + let (n, overflowed) = unsafe { + ::std::intrinsics::mul_with_overflow::(left, right) + }; + + try!(self.memory.write_int(dest, n, size)); + try!(self.memory.write_bool(dest.offset(size as isize), overflowed)); + } + "offset" => { let pointee_ty = *substs.types.get(subst::FnSpace, 0); let pointee_size = self.ty_size(pointee_ty) as isize; diff --git a/src/lib.rs b/src/lib.rs index 8646db3c222..d231e6f1a6b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(btree_range, collections_bound, rustc_private)] +#![feature(btree_range, collections_bound, core_intrinsics, rustc_private)] // From rustc. extern crate arena;