@@ -933,16 +933,18 @@ fn copy_intrinsic<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
let size = machine::llsize_of(ccx, lltp_ty);
let int_size = machine::llbitsize_of_real(ccx, ccx.int_type());
let name = if allow_overlap {
if int_size == 32 {
"llvm.memmove.p0i8.p0i8.i32"
} else {
"llvm.memmove.p0i8.p0i8.i64"
match int_size {
16 => "llvm.memmove.p0i8.p0i8.i16",
32 => "llvm.memmove.p0i8.p0i8.i32",
64 => "llvm.memmove.p0i8.p0i8.i64",
_ => unreachable!(),
}
} else {
if int_size == 32 {
"llvm.memcpy.p0i8.p0i8.i32"
} else {
"llvm.memcpy.p0i8.p0i8.i64"
match int_size {
16 => "llvm.memcpy.p0i8.p0i8.i16",
32 => "llvm.memcpy.p0i8.p0i8.i32",
64 => "llvm.memcpy.p0i8.p0i8.i64",
_ => unreachable!(),
}
};

@@ -973,10 +975,11 @@ fn memset_intrinsic<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
let lltp_ty = type_of::type_of(ccx, tp_ty);
let align = C_i32(ccx, type_of::align_of(ccx, tp_ty) as i32);
let size = machine::llsize_of(ccx, lltp_ty);
let name = if machine::llbitsize_of_real(ccx, ccx.int_type()) == 32 {
"llvm.memset.p0i8.i32"
} else {
"llvm.memset.p0i8.i64"
let name = match machine::llbitsize_of_real(ccx, ccx.int_type()) {
16 => "llvm.memset.p0i8.i16",
32 => "llvm.memset.p0i8.i32",
64 => "llvm.memset.p0i8.i64",
_ => unreachable!(),
};

let dst_ptr = PointerCast(bcx, dst, Type::i8p(ccx));
@@ -115,6 +115,7 @@ impl Type {

pub fn int(ccx: &CrateContext) -> Type {
match &ccx.tcx().sess.target.target.target_pointer_width[..] {
"16" => Type::i16(ccx),
"32" => Type::i32(ccx),
"64" => Type::i64(ccx),
tws => panic!("Unsupported target word size for int: {}", tws),