From c6307a2fa55c3d62c06b85b349257a8194093442 Mon Sep 17 00:00:00 2001 From: Djzin Date: Sat, 27 May 2017 14:29:41 +0100 Subject: [PATCH] copy tail bytes better for aligned types --- src/libcore/mem.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/libcore/mem.rs b/src/libcore/mem.rs index 87206152a0d2..2975d2e28dd3 100644 --- a/src/libcore/mem.rs +++ b/src/libcore/mem.rs @@ -479,6 +479,27 @@ pub fn swap(x: &mut T, y: &mut T) { ptr::copy_nonoverlapping(t, y.offset(i), block_size); i += block_size as isize; } + + // Swap remaining bytes 8 at a time if x & y are properly aligned + if align_of::() % 8 == 0 { + while i + 8 <= len as isize { + let t = *(x.offset(i) as *mut u64); + *(x.offset(i) as *mut u64) = *(y.offset(i) as *mut u64); + *(y.offset(i) as *mut u64) = t; + i += 8; + } + } + + // Swap remaining bytes 4 at a time if x & y are properly aligned + if align_of::() % 4 == 0 { + while i + 4 <= len as isize { + let t = *(x.offset(i) as *mut u32); + *(x.offset(i) as *mut u32) = *(y.offset(i) as *mut u32); + *(y.offset(i) as *mut u32) = t; + i += 4; + } + } + if i < len { // Swap any remaining bytes let mut t: UnalignedBlock = uninitialized();