Skip to content

Commit 212d6a2

Browse files
committed
auto merge of #6710 : thestinger/rust/swap, r=catamorphism
2 parents 7c0cc9c + 7bff028 commit 212d6a2

File tree

6 files changed

+210
-122
lines changed

6 files changed

+210
-122
lines changed

Diff for: src/librustc/middle/trans/foreign.rs

+20
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);

Diff for: src/librustc/middle/trans/type_use.rs

+1-1
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" |

Diff for: src/librustc/middle/typeck/check/mod.rs

+145-115
Original file line numberDiff line numberDiff line change
@@ -3451,122 +3451,152 @@ pub fn check_intrinsic_type(ccx: @mut CrateCtxt, it: @ast::foreign_item) {
34513451

34523452
let tcx = ccx.tcx;
34533453
let (n_tps, inputs, output) = match *ccx.tcx.sess.str_of(it.ident) {
3454-
~"size_of" |
3455-
~"pref_align_of" | ~"min_align_of" => (1u, ~[], ty::mk_uint()),
3456-
~"init" => (1u, ~[], param(ccx, 0u)),
3457-
~"uninit" => (1u, ~[], param(ccx, 0u)),
3458-
~"forget" => (1u, ~[ param(ccx, 0) ], ty::mk_nil()),
3459-
~"transmute" => (2, ~[ param(ccx, 0) ], param(ccx, 1)),
3460-
~"move_val" | ~"move_val_init" => {
3461-
(1u,
3454+
~"size_of" |
3455+
~"pref_align_of" | ~"min_align_of" => (1u, ~[], ty::mk_uint()),
3456+
~"init" => (1u, ~[], param(ccx, 0u)),
3457+
~"uninit" => (1u, ~[], param(ccx, 0u)),
3458+
~"forget" => (1u, ~[ param(ccx, 0) ], ty::mk_nil()),
3459+
~"transmute" => (2, ~[ param(ccx, 0) ], param(ccx, 1)),
3460+
~"move_val" | ~"move_val_init" => {
3461+
(1u,
3462+
~[
3463+
ty::mk_mut_rptr(tcx, ty::re_bound(ty::br_anon(0)), param(ccx, 0)),
3464+
param(ccx, 0u)
3465+
],
3466+
ty::mk_nil())
3467+
}
3468+
~"needs_drop" => (1u, ~[], ty::mk_bool()),
3469+
3470+
~"atomic_cxchg" | ~"atomic_cxchg_acq"| ~"atomic_cxchg_rel" => {
3471+
(0,
34623472
~[
3463-
ty::mk_mut_rptr(tcx, ty::re_bound(ty::br_anon(0)), param(ccx, 0)),
3464-
param(ccx, 0u)
3465-
],
3466-
ty::mk_nil())
3467-
}
3468-
~"needs_drop" => (1u, ~[], ty::mk_bool()),
3469-
3470-
~"atomic_cxchg" | ~"atomic_cxchg_acq"| ~"atomic_cxchg_rel" => {
3471-
(0,
3472-
~[
3473-
ty::mk_mut_rptr(tcx,
3474-
ty::re_bound(ty::br_anon(0)),
3475-
ty::mk_int()),
3476-
ty::mk_int(),
3477-
ty::mk_int()
3478-
],
3479-
ty::mk_int())
3480-
}
3481-
~"atomic_load" | ~"atomic_load_acq" => {
3482-
(0,
3483-
~[
3484-
ty::mk_imm_rptr(tcx, ty::re_bound(ty::br_anon(0)), ty::mk_int())
3485-
],
3486-
ty::mk_int())
3487-
}
3488-
~"atomic_store" | ~"atomic_store_rel" => {
3489-
(0,
3490-
~[
3491-
ty::mk_mut_rptr(tcx, ty::re_bound(ty::br_anon(0)), ty::mk_int()),
3492-
ty::mk_int()
3493-
],
3494-
ty::mk_nil())
3495-
}
3496-
~"atomic_xchg" | ~"atomic_xadd" | ~"atomic_xsub" |
3497-
~"atomic_xchg_acq" | ~"atomic_xadd_acq" | ~"atomic_xsub_acq" |
3498-
~"atomic_xchg_rel" | ~"atomic_xadd_rel" | ~"atomic_xsub_rel" => {
3499-
(0,
3500-
~[
3501-
ty::mk_mut_rptr(tcx, ty::re_bound(ty::br_anon(0)), ty::mk_int()),
3502-
ty::mk_int()
3503-
],
3504-
ty::mk_int())
3505-
}
3506-
3507-
~"get_tydesc" => {
3508-
// FIXME (#3730): return *intrinsic::tydesc, not *()
3509-
(1u, ~[], ty::mk_nil_ptr(ccx.tcx))
3510-
}
3511-
~"visit_tydesc" => {
3512-
let tydesc_name = special_idents::tydesc;
3513-
assert!(tcx.intrinsic_defs.contains_key(&tydesc_name));
3514-
let (_, tydesc_ty) = tcx.intrinsic_defs.get_copy(&tydesc_name);
3515-
let (_, visitor_object_ty) = ty::visitor_object_ty(tcx);
3516-
let td_ptr = ty::mk_ptr(ccx.tcx, ty::mt {
3517-
ty: tydesc_ty,
3518-
mutbl: ast::m_imm
3519-
});
3520-
(0, ~[ td_ptr, visitor_object_ty ], ty::mk_nil())
3521-
}
3522-
~"frame_address" => {
3523-
let fty = ty::mk_closure(ccx.tcx, ty::ClosureTy {
3524-
purity: ast::impure_fn,
3525-
sigil: ast::BorrowedSigil,
3526-
onceness: ast::Once,
3527-
region: ty::re_bound(ty::br_anon(0)),
3528-
bounds: ty::EmptyBuiltinBounds(),
3529-
sig: ty::FnSig {
3530-
bound_lifetime_names: opt_vec::Empty,
3531-
inputs: ~[ty::mk_imm_ptr(ccx.tcx, ty::mk_mach_uint(ast::ty_u8))],
3532-
output: ty::mk_nil()
3533-
}
3534-
});
3535-
(0u, ~[fty], ty::mk_nil())
3536-
}
3537-
~"morestack_addr" => {
3538-
(0u, ~[], ty::mk_nil_ptr(ccx.tcx))
3539-
}
3540-
~"memmove32" => {
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-
~"memmove64" => {
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-
}
3473+
ty::mk_mut_rptr(tcx,
3474+
ty::re_bound(ty::br_anon(0)),
3475+
ty::mk_int()),
3476+
ty::mk_int(),
3477+
ty::mk_int()
3478+
],
3479+
ty::mk_int())
3480+
}
3481+
~"atomic_load" | ~"atomic_load_acq" => {
3482+
(0,
3483+
~[
3484+
ty::mk_imm_rptr(tcx, ty::re_bound(ty::br_anon(0)), ty::mk_int())
3485+
],
3486+
ty::mk_int())
3487+
}
3488+
~"atomic_store" | ~"atomic_store_rel" => {
3489+
(0,
3490+
~[
3491+
ty::mk_mut_rptr(tcx, ty::re_bound(ty::br_anon(0)), ty::mk_int()),
3492+
ty::mk_int()
3493+
],
3494+
ty::mk_nil())
3495+
}
3496+
~"atomic_xchg" | ~"atomic_xadd" | ~"atomic_xsub" |
3497+
~"atomic_xchg_acq" | ~"atomic_xadd_acq" | ~"atomic_xsub_acq" |
3498+
~"atomic_xchg_rel" | ~"atomic_xadd_rel" | ~"atomic_xsub_rel" => {
3499+
(0,
3500+
~[
3501+
ty::mk_mut_rptr(tcx, ty::re_bound(ty::br_anon(0)), ty::mk_int()),
3502+
ty::mk_int()
3503+
],
3504+
ty::mk_int())
3505+
}
3506+
3507+
~"get_tydesc" => {
3508+
// FIXME (#3730): return *intrinsic::tydesc, not *()
3509+
(1u, ~[], ty::mk_nil_ptr(ccx.tcx))
3510+
}
3511+
~"visit_tydesc" => {
3512+
let tydesc_name = special_idents::tydesc;
3513+
assert!(tcx.intrinsic_defs.contains_key(&tydesc_name));
3514+
let (_, tydesc_ty) = tcx.intrinsic_defs.get_copy(&tydesc_name);
3515+
let (_, visitor_object_ty) = ty::visitor_object_ty(tcx);
3516+
let td_ptr = ty::mk_ptr(ccx.tcx, ty::mt {
3517+
ty: tydesc_ty,
3518+
mutbl: ast::m_imm
3519+
});
3520+
(0, ~[ td_ptr, visitor_object_ty ], ty::mk_nil())
3521+
}
3522+
~"frame_address" => {
3523+
let fty = ty::mk_closure(ccx.tcx, ty::ClosureTy {
3524+
purity: ast::impure_fn,
3525+
sigil: ast::BorrowedSigil,
3526+
onceness: ast::Once,
3527+
region: ty::re_bound(ty::br_anon(0)),
3528+
bounds: ty::EmptyBuiltinBounds(),
3529+
sig: ty::FnSig {
3530+
bound_lifetime_names: opt_vec::Empty,
3531+
inputs: ~[ty::mk_imm_ptr(ccx.tcx, ty::mk_mach_uint(ast::ty_u8))],
3532+
output: ty::mk_nil()
3533+
}
3534+
});
3535+
(0u, ~[fty], ty::mk_nil())
3536+
}
3537+
~"morestack_addr" => {
3538+
(0u, ~[], ty::mk_nil_ptr(ccx.tcx))
3539+
}
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+
}
3570+
~"memmove32" => {
3571+
(0,
3572+
~[
3573+
ty::mk_ptr(tcx, ty::mt {
3574+
ty: ty::mk_u8(),
3575+
mutbl: ast::m_mutbl
3576+
}),
3577+
ty::mk_ptr(tcx, ty::mt {
3578+
ty: ty::mk_u8(),
3579+
mutbl: ast::m_imm
3580+
}),
3581+
ty::mk_u32()
3582+
],
3583+
ty::mk_nil())
3584+
}
3585+
~"memmove64" => {
3586+
(0,
3587+
~[
3588+
ty::mk_ptr(tcx, ty::mt {
3589+
ty: ty::mk_u8(),
3590+
mutbl: ast::m_mutbl
3591+
}),
3592+
ty::mk_ptr(tcx, ty::mt {
3593+
ty: ty::mk_u8(),
3594+
mutbl: ast::m_imm
3595+
}),
3596+
ty::mk_u64()
3597+
],
3598+
ty::mk_nil())
3599+
}
35703600
~"sqrtf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()),
35713601
~"sqrtf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()),
35723602
~"powif32" => {

Diff for: src/libstd/ptr.rs

+23
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ pub unsafe fn copy_memory<T>(dst: *mut T, src: *const T, count: uint) {
103103
let n = count * sys::size_of::<T>();
104104
memmove32(dst as *mut u8, src as *u8, n as u32);
105105
}
106+
106107
#[inline(always)]
107108
#[cfg(target_word_size = "64")]
108109
pub unsafe fn copy_memory<T>(dst: *mut T, src: *const T, count: uint) {
@@ -111,6 +112,28 @@ pub unsafe fn copy_memory<T>(dst: *mut T, src: *const T, count: uint) {
111112
memmove64(dst as *mut u8, src as *u8, n as u64);
112113
}
113114

115+
#[inline(always)]
116+
#[cfg(target_word_size = "32")]
117+
pub unsafe fn copy_nonoverlapping_memory<T>(dst: *mut T, src: *const T, count: uint) {
118+
#[cfg(stage0)]
119+
use memcpy32 = unstable::intrinsics::memmove32;
120+
#[cfg(not(stage0))]
121+
use unstable::intrinsics::memcpy32;
122+
let n = count * sys::size_of::<T>();
123+
memcpy32(dst as *mut u8, src as *u8, n as u32);
124+
}
125+
126+
#[inline(always)]
127+
#[cfg(target_word_size = "64")]
128+
pub unsafe fn copy_nonoverlapping_memory<T>(dst: *mut T, src: *const T, count: uint) {
129+
#[cfg(stage0)]
130+
use memcpy64 = unstable::intrinsics::memmove64;
131+
#[cfg(not(stage0))]
132+
use unstable::intrinsics::memcpy64;
133+
let n = count * sys::size_of::<T>();
134+
memcpy64(dst as *mut u8, src as *u8, n as u64);
135+
}
136+
114137
#[inline(always)]
115138
pub unsafe fn set_memory<T>(dst: *mut T, c: int, count: uint) {
116139
let n = count * sys::size_of::<T>();

Diff for: src/libstd/unstable/intrinsics.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ A quick refresher on memory ordering:
3131
with atomic types and is equivalent to Java's `volatile`.
3232
3333
*/
34-
3534
#[abi = "rust-intrinsic"]
3635
pub extern "rust-intrinsic" {
3736

@@ -128,6 +127,13 @@ pub extern "rust-intrinsic" {
128127
/// Get the address of the `__morestack` stack growth function.
129128
pub fn morestack_addr() -> *();
130129

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

0 commit comments

Comments
 (0)