use std::ptr;
#[inline(never)]
pub unsafe fn memset(start: *mut u8, val: u8, count: usize) {
let start = ptr::read_volatile(&start);
let val = ptr::read_volatile(&val);
let count = ptr::read_volatile(&count);
for i in 0..count {
ptr::write(start.add(i), val);
}
let _ = ptr::read_volatile(&start);
}
#[inline]
pub unsafe fn memzero(start: *mut u8, count: usize) {
memset(start, 0, count)
}
#[inline(never)]
pub unsafe fn memeq(x: *const u8, y: *const u8, count: usize) -> bool {
(0..count)
.map(|i| ptr::read_volatile(x.add(i)) ^ ptr::read_volatile(y.add(i)))
.fold(0, |acc, val| acc | val)
.eq(&0)
}
#[inline(never)]
pub unsafe fn memcmp(x: *const u8, y: *const u8, count: usize) -> i32 {
let mut res = 0;
for i in (0..count).rev() {
let diff =
i32::from(ptr::read_volatile(x.add(i))) - i32::from(ptr::read_volatile(y.add(i)));
res = (res & (((diff - 1) & !diff) >> 8)) | diff;
}
((res - 1) >> 8) + (res >> 8) + 1
}