asmkit/core/
support.rs

1pub const fn lsb_mask_usize(n: usize) -> usize {
2    if n != 0 {
3        usize::MAX >> (size_of::<usize>() * 8 - n)
4    } else {
5        0
6    }
7}
8
9pub const fn lsb_mask32(n: u32) -> usize {
10    if size_of::<u32>() < size_of::<usize>() {
11        (1 << n as usize) - 1
12    } else {
13        if n != 0 {
14            u32::MAX as usize >> (size_of::<u32>() * 8 - n as usize)
15        } else {
16            0
17        }
18    }
19}
20
21pub const fn lsb_mask64(n: u64) -> usize {
22    if size_of::<u64>() < size_of::<usize>() {
23        (1 << n as usize) - 1
24    } else {
25        if n != 0 {
26            u64::MAX as usize >> (size_of::<u64>() * 8 - n as usize)
27        } else {
28            0
29        }
30    }
31}
32
33pub fn bitmask_from_bool(src: bool) -> u32 {
34    0u32.wrapping_sub(src as u32)
35}
36
37pub fn align_up_usize(addr: usize, align: usize) -> usize {
38    let mask = align - 1;
39    (addr + mask) & !mask
40}
41
42pub fn is_between<T>(x: T, a: T, b: T) -> bool
43where
44    T: PartialOrd + Ord,
45{
46    x >= a && x <= b
47}
48
49#[cfg(not(windows))]
50pub fn lookup_with_dlsym(name: &str) -> *const u8 {
51    use alloc::ffi::CString;
52    use core::ptr::null;
53
54    let c_str = CString::new(name).unwrap();
55    let c_str_ptr = c_str.as_ptr();
56    let sym = unsafe { libc::dlsym(libc::RTLD_DEFAULT, c_str_ptr) };
57    if sym.is_null() {
58        null()
59    } else {
60        sym as *const u8
61    }
62}