| 1 | // Trying to satisfy clippy here is hopeless |
| 2 | #![allow (clippy::style)] |
| 3 | // FIXME(e2024): this eventually needs to be removed. |
| 4 | #![allow (unsafe_op_in_unsafe_fn)] |
| 5 | |
| 6 | #[allow (warnings)] |
| 7 | #[cfg (target_pointer_width = "16" )] |
| 8 | type c_int = i16; |
| 9 | #[allow (warnings)] |
| 10 | #[cfg (not(target_pointer_width = "16" ))] |
| 11 | type c_int = i32; |
| 12 | |
| 13 | // memcpy/memmove/memset have optimized implementations on some architectures |
| 14 | #[cfg_attr ( |
| 15 | all(not(feature = "no-asm" ), target_arch = "x86_64" ), |
| 16 | path = "x86_64.rs" |
| 17 | )] |
| 18 | mod impls; |
| 19 | |
| 20 | intrinsics! { |
| 21 | #[mem_builtin] |
| 22 | pub unsafe extern "C" fn memcpy(dest: *mut u8, src: *const u8, n: usize) -> *mut u8 { |
| 23 | impls::copy_forward(dest, src, n); |
| 24 | dest |
| 25 | } |
| 26 | |
| 27 | #[mem_builtin] |
| 28 | pub unsafe extern "C" fn memmove(dest: *mut u8, src: *const u8, n: usize) -> *mut u8 { |
| 29 | let delta = (dest as usize).wrapping_sub(src as usize); |
| 30 | if delta >= n { |
| 31 | // We can copy forwards because either dest is far enough ahead of src, |
| 32 | // or src is ahead of dest (and delta overflowed). |
| 33 | impls::copy_forward(dest, src, n); |
| 34 | } else { |
| 35 | impls::copy_backward(dest, src, n); |
| 36 | } |
| 37 | dest |
| 38 | } |
| 39 | |
| 40 | #[mem_builtin] |
| 41 | pub unsafe extern "C" fn memset(s: *mut u8, c: crate::mem::c_int, n: usize) -> *mut u8 { |
| 42 | impls::set_bytes(s, c as u8, n); |
| 43 | s |
| 44 | } |
| 45 | |
| 46 | #[mem_builtin] |
| 47 | pub unsafe extern "C" fn memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 { |
| 48 | impls::compare_bytes(s1, s2, n) |
| 49 | } |
| 50 | |
| 51 | #[mem_builtin] |
| 52 | pub unsafe extern "C" fn bcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 { |
| 53 | memcmp(s1, s2, n) |
| 54 | } |
| 55 | |
| 56 | #[mem_builtin] |
| 57 | pub unsafe extern "C" fn strlen(s: *const core::ffi::c_char) -> usize { |
| 58 | impls::c_string_length(s) |
| 59 | } |
| 60 | } |
| 61 | |