]> git.lizzy.rs Git - rust.git/commitdiff
Implement min_align_of and a hacky mul_with_overflow.
authorScott Olson <scott@solson.me>
Sat, 19 Mar 2016 17:01:33 +0000 (11:01 -0600)
committerScott Olson <scott@solson.me>
Sat, 19 Mar 2016 17:01:33 +0000 (11:01 -0600)
src/interpreter.rs
src/lib.rs

index 73011886cdb0a2d91f787b1d1a83d39ffbe04c84..3f710ba2e2b23cdb0193189b54fe58864f9ce9d1 100644 (file)
@@ -339,6 +339,29 @@ fn call_intrinsic(&mut self, name: &str, substs: &'tcx Substs<'tcx>,
             // 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::<i64>(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;
index 8646db3c222fb0a33506accc00f10705254a707d..d231e6f1a6b3d9111701d99d6a91362a6883023b 100644 (file)
@@ -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;