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")]
8type c_int = i16;
9#[allow(warnings)]
10#[cfg(not(target_pointer_width = "16"))]
11type 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)]
18mod impls;
19
20intrinsics! {
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