Skip to content

Commit 7d2f836

Browse files
committed
add memcpy intrinsic to mirror memmove
1 parent 5ba5865 commit 7d2f836

File tree

4 files changed

+58
-1
lines changed

4 files changed

+58
-1
lines changed

src/librustc/middle/trans/foreign.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,26 @@ pub fn trans_intrinsic(ccx: @CrateContext,
845845
T_ptr(T_nil()));
846846
Store(bcx, morestack_addr, fcx.llretptr.get());
847847
}
848+
~"memcpy32" => {
849+
let dst_ptr = get_param(decl, first_real_arg);
850+
let src_ptr = get_param(decl, first_real_arg + 1);
851+
let size = get_param(decl, first_real_arg + 2);
852+
let align = C_i32(1);
853+
let volatile = C_i1(false);
854+
let llfn = *bcx.ccx().intrinsics.get(
855+
&~"llvm.memcpy.p0i8.p0i8.i32");
856+
Call(bcx, llfn, [dst_ptr, src_ptr, size, align, volatile]);
857+
}
858+
~"memcpy64" => {
859+
let dst_ptr = get_param(decl, first_real_arg);
860+
let src_ptr = get_param(decl, first_real_arg + 1);
861+
let size = get_param(decl, first_real_arg + 2);
862+
let align = C_i32(1);
863+
let volatile = C_i1(false);
864+
let llfn = *bcx.ccx().intrinsics.get(
865+
&~"llvm.memcpy.p0i8.p0i8.i64");
866+
Call(bcx, llfn, [dst_ptr, src_ptr, size, align, volatile]);
867+
}
848868
~"memmove32" => {
849869
let dst_ptr = get_param(decl, first_real_arg);
850870
let src_ptr = get_param(decl, first_real_arg + 1);

src/librustc/middle/trans/type_use.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ pub fn type_uses_for(ccx: @CrateContext, fn_id: def_id, n_tps: uint)
135135
~"visit_tydesc" | ~"forget" | ~"frame_address" |
136136
~"morestack_addr" => 0,
137137

138-
~"memmove32" | ~"memmove64" => 0,
138+
~"memcpy32" | ~"memcpy64" | ~"memmove32" | ~"memmove64" => 0,
139139

140140
~"sqrtf32" | ~"sqrtf64" | ~"powif32" | ~"powif64" |
141141
~"sinf32" | ~"sinf64" | ~"cosf32" | ~"cosf64" |

src/librustc/middle/typeck/check/mod.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3537,6 +3537,36 @@ pub fn check_intrinsic_type(ccx: @mut CrateCtxt, it: @ast::foreign_item) {
35373537
~"morestack_addr" => {
35383538
(0u, ~[], ty::mk_nil_ptr(ccx.tcx))
35393539
}
3540+
~"memcpy32" => {
3541+
(0,
3542+
~[
3543+
ty::mk_ptr(tcx, ty::mt {
3544+
ty: ty::mk_u8(),
3545+
mutbl: ast::m_mutbl
3546+
}),
3547+
ty::mk_ptr(tcx, ty::mt {
3548+
ty: ty::mk_u8(),
3549+
mutbl: ast::m_imm
3550+
}),
3551+
ty::mk_u32()
3552+
],
3553+
ty::mk_nil())
3554+
}
3555+
~"memcpy64" => {
3556+
(0,
3557+
~[
3558+
ty::mk_ptr(tcx, ty::mt {
3559+
ty: ty::mk_u8(),
3560+
mutbl: ast::m_mutbl
3561+
}),
3562+
ty::mk_ptr(tcx, ty::mt {
3563+
ty: ty::mk_u8(),
3564+
mutbl: ast::m_imm
3565+
}),
3566+
ty::mk_u64()
3567+
],
3568+
ty::mk_nil())
3569+
}
35403570
~"memmove32" => {
35413571
(0,
35423572
~[

src/libstd/unstable/intrinsics.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,13 @@ pub extern "rust-intrinsic" {
128128
/// Get the address of the `__morestack` stack growth function.
129129
pub fn morestack_addr() -> *();
130130

131+
/// Equivalent to the `llvm.memcpy.p0i8.0i8.i32` intrinsic.
132+
#[cfg(not(stage0))]
133+
pub fn memcpy32(dst: *mut u8, src: *u8, size: u32);
134+
/// Equivalent to the `llvm.memcpy.p0i8.0i8.i64` intrinsic.
135+
#[cfg(not(stage0))]
136+
pub fn memcpy64(dst: *mut u8, src: *u8, size: u64);
137+
131138
/// Equivalent to the `llvm.memmove.p0i8.0i8.i32` intrinsic.
132139
pub fn memmove32(dst: *mut u8, src: *u8, size: u32);
133140
/// Equivalent to the `llvm.memmove.p0i8.0i8.i64` intrinsic.

0 commit comments

Comments
 (0)