Skip to content

Commit aa75260

Browse files
committed
Use quad-word rep string instructions
Signed-off-by: Joe Richey <[email protected]>
1 parent 2a0132c commit aa75260

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

src/mem/x86_64.rs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,14 @@ use super::c_int;
1818

1919
#[cfg_attr(all(feature = "mem", not(feature = "mangled-names")), no_mangle)]
2020
pub unsafe extern "C" fn memcpy(dest: *mut u8, src: *const u8, count: usize) -> *mut u8 {
21+
let qword_count = count >> 3;
22+
let byte_count = count & 0b111;
2123
asm!(
24+
"rep movsq [rdi], [rsi]",
25+
"mov ecx, {byte_count:e}",
2226
"rep movsb [rdi], [rsi]",
23-
inout("rcx") count => _,
27+
byte_count = in(reg) byte_count,
28+
inout("rcx") qword_count => _,
2429
inout("rdi") dest => _,
2530
inout("rsi") src => _,
2631
options(nostack, preserves_flags)
@@ -37,25 +42,37 @@ pub unsafe extern "C" fn memmove(dest: *mut u8, src: *const u8, count: usize) ->
3742
return self::memcpy(dest, src, count);
3843
}
3944
// copy backwards
45+
let qword_count = count >> 3;
46+
let byte_count = count & 0b111;
4047
asm!(
4148
"std",
49+
"rep movsq [rdi], [rsi]",
50+
"mov ecx, {byte_count:e}",
51+
"add rdi, 7",
52+
"add rsi, 7",
4253
"rep movsb [rdi], [rsi]",
4354
"cld",
44-
inout("rcx") count => _,
45-
inout("rdi") dest.add(count).sub(1) => _,
46-
inout("rsi") src.add(count).sub(1) => _,
47-
options(nostack, preserves_flags)
55+
byte_count = in(reg) byte_count,
56+
inout("rcx") qword_count => _,
57+
inout("rdi") dest.offset(count as isize).wrapping_sub(8) => _,
58+
inout("rsi") src.offset(count as isize).wrapping_sub(8) => _,
59+
options(nostack)
4860
);
4961
dest
5062
}
5163

5264
#[cfg_attr(all(feature = "mem", not(feature = "mangled-names")), no_mangle)]
5365
pub unsafe extern "C" fn memset(dest: *mut u8, c: c_int, count: usize) -> *mut u8 {
66+
let qword_count = count >> 3;
67+
let byte_count = count & 0b111;
5468
asm!(
69+
"rep stosq [rdi], rax",
70+
"mov ecx, {byte_count:e}",
5571
"rep stosb [rdi], al",
56-
inout("rcx") count => _,
72+
byte_count = in(reg) byte_count,
73+
inout("rcx") qword_count => _,
5774
inout("rdi") dest => _,
58-
in("al") c as u8,
75+
in("rax") (c as u8 as u64) * 0x0101010101010101,
5976
options(nostack, preserves_flags)
6077
);
6178
dest

0 commit comments

Comments
 (0)