@@ -9,9 +9,14 @@ use super::c_int;
9
9
10
10
#[ cfg_attr( all( feature = "mem" , not( feature = "mangled-names" ) ) , no_mangle) ]
11
11
pub unsafe extern "C" fn memcpy ( dest : * mut u8 , src : * const u8 , count : usize ) -> * mut u8 {
12
+ let qword_count = count >> 3 ;
13
+ let byte_count = count & 0b111 ;
12
14
asm ! (
15
+ "rep movsq [rdi], [rsi]" ,
16
+ "mov ecx, {byte_count:e}" ,
13
17
"rep movsb [rdi], [rsi]" ,
14
- inout( "rcx" ) count => _,
18
+ byte_count = in( reg) byte_count,
19
+ inout( "rcx" ) qword_count => _,
15
20
inout( "rdi" ) dest => _,
16
21
inout( "rsi" ) src => _,
17
22
options( nostack, preserves_flags)
@@ -21,29 +26,43 @@ pub unsafe extern "C" fn memcpy(dest: *mut u8, src: *const u8, count: usize) ->
21
26
22
27
#[ cfg_attr( all( feature = "mem" , not( feature = "mangled-names" ) ) , no_mangle) ]
23
28
pub unsafe extern "C" fn memmove ( dest : * mut u8 , src : * const u8 , count : usize ) -> * mut u8 {
24
- if src >= dest as * const u8 {
29
+ let dest_end = dest. offset ( count as isize ) ;
30
+ let src_end = src. offset ( count as isize ) ;
31
+ if src >= dest as * const u8 || src_end <= dest as * const u8 {
25
32
return memcpy ( dest, src, count) ;
26
33
}
27
34
// copy backwards
35
+ let qword_count = count >> 3 ;
36
+ let byte_count = count & 0b111 ;
28
37
asm ! (
29
38
"std" ,
39
+ "rep movsq [rdi], [rsi]" ,
40
+ "mov ecx, {byte_count:e}" ,
41
+ "add rdi, 7" ,
42
+ "add rsi, 7" ,
30
43
"rep movsb [rdi], [rsi]" ,
31
44
"cld" ,
32
- inout( "rcx" ) count => _,
33
- inout( "rdi" ) dest. add( count) . sub( 1 ) => _,
34
- inout( "rsi" ) src. add( count) . sub( 1 ) => _,
45
+ byte_count = in( reg) byte_count,
46
+ inout( "rcx" ) qword_count => _,
47
+ inout( "rdi" ) dest_end. sub( 8 ) => _,
48
+ inout( "rsi" ) src_end. sub( 8 ) => _,
35
49
options( nostack, preserves_flags)
36
50
) ;
37
51
dest
38
52
}
39
53
40
54
#[ cfg_attr( all( feature = "mem" , not( feature = "mangled-names" ) ) , no_mangle) ]
41
55
pub unsafe extern "C" fn memset ( dest : * mut u8 , c : c_int , count : usize ) -> * mut u8 {
56
+ let qword_count = count >> 3 ;
57
+ let byte_count = count & 0b111 ;
42
58
asm ! (
59
+ "rep stosq [rdi], rax" ,
60
+ "mov ecx, {byte_count:e}" ,
43
61
"rep stosb [rdi], al" ,
44
- inout( "rcx" ) count => _,
62
+ byte_count = in( reg) byte_count,
63
+ inout( "rcx" ) qword_count => _,
45
64
inout( "rdi" ) dest => _,
46
- in( "al " ) c as u8 ,
65
+ in( "rax " ) ( c as u8 as u64 ) * 0b0101010101010101 ,
47
66
options( nostack, preserves_flags)
48
67
) ;
49
68
dest
0 commit comments