parent
adfb1ff851
commit
265939fc00
|
@ -1,10 +1,12 @@
|
||||||
#![allow(unused_features)]
|
#![allow(unused_features)]
|
||||||
#![feature(asm)]
|
#![feature(asm)]
|
||||||
#![feature(core_intrinsics)]
|
#![feature(core_intrinsics)]
|
||||||
|
#![feature(linkage)]
|
||||||
#![feature(naked_functions)]
|
#![feature(naked_functions)]
|
||||||
#![cfg_attr(not(test), no_std)]
|
#![cfg_attr(not(test), no_std)]
|
||||||
// TODO(rust-lang/rust#35021) uncomment when that PR lands
|
// TODO(rust-lang/rust#35021) uncomment when that PR lands
|
||||||
// #![feature(rustc_builtins)]
|
// #![feature(rustc_builtins)]
|
||||||
|
#![no_builtins]
|
||||||
|
|
||||||
// We disable #[no_mangle] for tests so that we can verify the test results
|
// We disable #[no_mangle] for tests so that we can verify the test results
|
||||||
// against the native compiler-rt implementations of the builtins.
|
// against the native compiler-rt implementations of the builtins.
|
||||||
|
@ -20,6 +22,7 @@ extern crate core;
|
||||||
pub mod arm;
|
pub mod arm;
|
||||||
|
|
||||||
pub mod udiv;
|
pub mod udiv;
|
||||||
|
pub mod mem;
|
||||||
pub mod mul;
|
pub mod mul;
|
||||||
pub mod shift;
|
pub mod shift;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
// NOTE Copied verbatim from the rlibc crate
|
||||||
|
// cf. https://crates.io/crates/rlibc
|
||||||
|
|
||||||
|
#[linkage = "weak"]
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn memcpy(dest: *mut u8, src: *const u8, n: usize) -> *mut u8 {
|
||||||
|
let mut i = 0;
|
||||||
|
while i < n {
|
||||||
|
*dest.offset(i as isize) = *src.offset(i as isize);
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
dest
|
||||||
|
}
|
||||||
|
|
||||||
|
#[linkage = "weak"]
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn memmove(dest: *mut u8, src: *const u8, n: usize) -> *mut u8 {
|
||||||
|
if src < dest as *const u8 {
|
||||||
|
// copy from end
|
||||||
|
let mut i = n;
|
||||||
|
while i != 0 {
|
||||||
|
i -= 1;
|
||||||
|
*dest.offset(i as isize) = *src.offset(i as isize);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// copy from beginning
|
||||||
|
let mut i = 0;
|
||||||
|
while i < n {
|
||||||
|
*dest.offset(i as isize) = *src.offset(i as isize);
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dest
|
||||||
|
}
|
||||||
|
|
||||||
|
#[linkage = "weak"]
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn memset(s: *mut u8, c: i32, n: usize) -> *mut u8 {
|
||||||
|
let mut i = 0;
|
||||||
|
while i < n {
|
||||||
|
*s.offset(i as isize) = c as u8;
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
s
|
||||||
|
}
|
||||||
|
|
||||||
|
#[linkage = "weak"]
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 {
|
||||||
|
let mut i = 0;
|
||||||
|
while i < n {
|
||||||
|
let a = *s1.offset(i as isize);
|
||||||
|
let b = *s2.offset(i as isize);
|
||||||
|
if a != b {
|
||||||
|
return a as i32 - b as i32;
|
||||||
|
}
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
0
|
||||||
|
}
|
Loading…
Reference in New Issue