Skip to content

Commit 7e99beb

Browse files
committed
memcpy: Create separate fallback.rs file
Signed-off-by: Joe Richey <[email protected]>
1 parent 99e9a2c commit 7e99beb

File tree

2 files changed

+65
-59
lines changed

2 files changed

+65
-59
lines changed

src/mem/fallback.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use super::c_int;
2+
3+
#[cfg_attr(all(feature = "mem", not(feature = "mangled-names")), no_mangle)]
4+
pub unsafe extern "C" fn memcpy(dest: *mut u8, src: *const u8, n: usize) -> *mut u8 {
5+
let mut i = 0;
6+
while i < n {
7+
*dest.offset(i as isize) = *src.offset(i as isize);
8+
i += 1;
9+
}
10+
dest
11+
}
12+
13+
#[cfg_attr(all(feature = "mem", not(feature = "mangled-names")), no_mangle)]
14+
pub unsafe extern "C" fn memmove(dest: *mut u8, src: *const u8, n: usize) -> *mut u8 {
15+
if src < dest as *const u8 {
16+
// copy from end
17+
let mut i = n;
18+
while i != 0 {
19+
i -= 1;
20+
*dest.offset(i as isize) = *src.offset(i as isize);
21+
}
22+
} else {
23+
// copy from beginning
24+
let mut i = 0;
25+
while i < n {
26+
*dest.offset(i as isize) = *src.offset(i as isize);
27+
i += 1;
28+
}
29+
}
30+
dest
31+
}
32+
33+
#[cfg_attr(all(feature = "mem", not(feature = "mangled-names")), no_mangle)]
34+
pub unsafe extern "C" fn memset(s: *mut u8, c: c_int, n: usize) -> *mut u8 {
35+
let mut i = 0;
36+
while i < n {
37+
*s.offset(i as isize) = c as u8;
38+
i += 1;
39+
}
40+
s
41+
}
42+
43+
#[cfg_attr(all(feature = "mem", not(feature = "mangled-names")), no_mangle)]
44+
pub unsafe extern "C" fn memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 {
45+
let mut i = 0;
46+
while i < n {
47+
let a = *s1.offset(i as isize);
48+
let b = *s2.offset(i as isize);
49+
if a != b {
50+
return a as i32 - b as i32;
51+
}
52+
i += 1;
53+
}
54+
0
55+
}
56+
57+
#[cfg_attr(all(feature = "mem", not(feature = "mangled-names")), no_mangle)]
58+
pub unsafe extern "C" fn bcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 {
59+
memcmp(s1, s2, n)
60+
}

src/mem/mod.rs

Lines changed: 5 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -5,69 +5,15 @@ type c_int = i16;
55
#[cfg(not(target_pointer_width = "16"))]
66
type c_int = i32;
77

8+
// memcpy and friends have optimized implementations on some architectures
9+
#[path = "fallback.rs"]
10+
mod memcpy;
11+
pub use self::memcpy::*;
12+
813
use core::intrinsics::{atomic_load_unordered, atomic_store_unordered, exact_div};
914
use core::mem;
1015
use core::ops::{BitOr, Shl};
1116

12-
#[cfg_attr(all(feature = "mem", not(feature = "mangled-names")), no_mangle)]
13-
pub unsafe extern "C" fn memcpy(dest: *mut u8, src: *const u8, n: usize) -> *mut u8 {
14-
let mut i = 0;
15-
while i < n {
16-
*dest.offset(i as isize) = *src.offset(i as isize);
17-
i += 1;
18-
}
19-
dest
20-
}
21-
22-
#[cfg_attr(all(feature = "mem", not(feature = "mangled-names")), no_mangle)]
23-
pub unsafe extern "C" fn memmove(dest: *mut u8, src: *const u8, n: usize) -> *mut u8 {
24-
if src < dest as *const u8 {
25-
// copy from end
26-
let mut i = n;
27-
while i != 0 {
28-
i -= 1;
29-
*dest.offset(i as isize) = *src.offset(i as isize);
30-
}
31-
} else {
32-
// copy from beginning
33-
let mut i = 0;
34-
while i < n {
35-
*dest.offset(i as isize) = *src.offset(i as isize);
36-
i += 1;
37-
}
38-
}
39-
dest
40-
}
41-
42-
#[cfg_attr(all(feature = "mem", not(feature = "mangled-names")), no_mangle)]
43-
pub unsafe extern "C" fn memset(s: *mut u8, c: c_int, n: usize) -> *mut u8 {
44-
let mut i = 0;
45-
while i < n {
46-
*s.offset(i as isize) = c as u8;
47-
i += 1;
48-
}
49-
s
50-
}
51-
52-
#[cfg_attr(all(feature = "mem", not(feature = "mangled-names")), no_mangle)]
53-
pub unsafe extern "C" fn memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 {
54-
let mut i = 0;
55-
while i < n {
56-
let a = *s1.offset(i as isize);
57-
let b = *s2.offset(i as isize);
58-
if a != b {
59-
return a as i32 - b as i32;
60-
}
61-
i += 1;
62-
}
63-
0
64-
}
65-
66-
#[cfg_attr(all(feature = "mem", not(feature = "mangled-names")), no_mangle)]
67-
pub unsafe extern "C" fn bcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 {
68-
memcmp(s1, s2, n)
69-
}
70-
7117
// `bytes` must be a multiple of `mem::size_of::<T>()`
7218
fn memcpy_element_unordered_atomic<T: Copy>(dest: *mut T, src: *const T, bytes: usize) {
7319
unsafe {

0 commit comments

Comments
 (0)