Implement more intrinsics.

This commit is contained in:
Scott Olson 2016-03-18 11:52:28 -06:00
parent ee47ce3978
commit b1af71e217

View file

@ -315,12 +315,23 @@ impl<'a, 'tcx: 'a, 'arena> Interpreter<'a, 'tcx, 'arena> {
let dest_size = self.lvalue_repr(ret_ptr).size();
match name {
"size_of" => {
let ty = *substs.types.get(subst::FnSpace, 0);
let size = self.ty_size(ty) as u64;
try!(self.memory.write_uint(dest, size, dest_size));
"copy_nonoverlapping" => {
let elem_ty = *substs.types.get(subst::FnSpace, 0);
let elem_size = self.ty_size(elem_ty);
let src_arg = try!(self.eval_operand(&args[0]));
let dest_arg = try!(self.eval_operand(&args[1]));
let count_arg = try!(self.eval_operand(&args[2]));
let src = try!(self.memory.read_ptr(src_arg));
let dest = try!(self.memory.read_ptr(dest_arg));
let count = try!(self.memory.read_int(count_arg, self.memory.pointer_size));
try!(self.memory.copy(src, dest, count as usize * elem_size));
}
"forget" => {}
"offset" => {
let pointee_ty = *substs.types.get(subst::FnSpace, 0);
let pointee_size = self.ty_size(pointee_ty) as isize;
@ -332,6 +343,14 @@ impl<'a, 'tcx: 'a, 'arena> Interpreter<'a, 'tcx, 'arena> {
try!(self.memory.write_ptr(dest, result_ptr));
}
"size_of" => {
let ty = *substs.types.get(subst::FnSpace, 0);
let size = self.ty_size(ty) as u64;
try!(self.memory.write_uint(dest, size, dest_size));
}
"uninit" => {}
name => panic!("can't handle intrinsic: {}", name),
}