Move clzi2 into the int module
This commit is contained in:
parent
a74490a75b
commit
4e3fc640df
62
src/arm.rs
62
src/arm.rs
|
@ -233,65 +233,3 @@ pub unsafe extern "aapcs" fn __aeabi_memclr4(dest: *mut u8, n: usize) {
|
||||||
pub unsafe extern "aapcs" fn __aeabi_memclr8(dest: *mut u8, n: usize) {
|
pub unsafe extern "aapcs" fn __aeabi_memclr8(dest: *mut u8, n: usize) {
|
||||||
__aeabi_memset4(dest, n, 0);
|
__aeabi_memset4(dest, n, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
#[cfg(any(
|
|
||||||
target_pointer_width = "16",
|
|
||||||
target_pointer_width = "32",
|
|
||||||
target_pointer_width = "64"
|
|
||||||
))]
|
|
||||||
pub extern "C" fn __clzsi2(mut x: usize) -> usize {
|
|
||||||
// TODO: const this? Requires const if
|
|
||||||
let mut y: usize;
|
|
||||||
let mut n: usize = {
|
|
||||||
#[cfg(target_pointer_width = "64")]
|
|
||||||
{
|
|
||||||
64
|
|
||||||
}
|
|
||||||
#[cfg(target_pointer_width = "32")]
|
|
||||||
{
|
|
||||||
32
|
|
||||||
}
|
|
||||||
#[cfg(target_pointer_width = "16")]
|
|
||||||
{
|
|
||||||
16
|
|
||||||
}
|
|
||||||
};
|
|
||||||
#[cfg(target_pointer_width = "64")]
|
|
||||||
{
|
|
||||||
y = x >> 32;
|
|
||||||
if y != 0 {
|
|
||||||
n -= 32;
|
|
||||||
x = y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
|
|
||||||
{
|
|
||||||
y = x >> 16;
|
|
||||||
if y != 0 {
|
|
||||||
n -= 16;
|
|
||||||
x = y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
y = x >> 8;
|
|
||||||
if y != 0 {
|
|
||||||
n -= 8;
|
|
||||||
x = y;
|
|
||||||
}
|
|
||||||
y = x >> 4;
|
|
||||||
if y != 0 {
|
|
||||||
n -= 4;
|
|
||||||
x = y;
|
|
||||||
}
|
|
||||||
y = x >> 2;
|
|
||||||
if y != 0 {
|
|
||||||
n -= 2;
|
|
||||||
x = y;
|
|
||||||
}
|
|
||||||
y = x >> 1;
|
|
||||||
if y != 0 {
|
|
||||||
n - 2
|
|
||||||
} else {
|
|
||||||
n - x
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -300,3 +300,65 @@ macro_rules! impl_wide_int {
|
||||||
|
|
||||||
impl_wide_int!(u32, u64, 32);
|
impl_wide_int!(u32, u64, 32);
|
||||||
impl_wide_int!(u64, u128, 64);
|
impl_wide_int!(u64, u128, 64);
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
#[cfg(any(
|
||||||
|
target_pointer_width = "16",
|
||||||
|
target_pointer_width = "32",
|
||||||
|
target_pointer_width = "64"
|
||||||
|
))]
|
||||||
|
pub extern "C" fn __clzsi2(mut x: usize) -> usize {
|
||||||
|
// TODO: const this? Would require const-if
|
||||||
|
let mut y: usize;
|
||||||
|
let mut n: usize = {
|
||||||
|
#[cfg(target_pointer_width = "64")]
|
||||||
|
{
|
||||||
|
64
|
||||||
|
}
|
||||||
|
#[cfg(target_pointer_width = "32")]
|
||||||
|
{
|
||||||
|
32
|
||||||
|
}
|
||||||
|
#[cfg(target_pointer_width = "16")]
|
||||||
|
{
|
||||||
|
16
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#[cfg(target_pointer_width = "64")]
|
||||||
|
{
|
||||||
|
y = x >> 32;
|
||||||
|
if y != 0 {
|
||||||
|
n -= 32;
|
||||||
|
x = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
|
||||||
|
{
|
||||||
|
y = x >> 16;
|
||||||
|
if y != 0 {
|
||||||
|
n -= 16;
|
||||||
|
x = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
y = x >> 8;
|
||||||
|
if y != 0 {
|
||||||
|
n -= 8;
|
||||||
|
x = y;
|
||||||
|
}
|
||||||
|
y = x >> 4;
|
||||||
|
if y != 0 {
|
||||||
|
n -= 4;
|
||||||
|
x = y;
|
||||||
|
}
|
||||||
|
y = x >> 2;
|
||||||
|
if y != 0 {
|
||||||
|
n -= 2;
|
||||||
|
x = y;
|
||||||
|
}
|
||||||
|
y = x >> 1;
|
||||||
|
if y != 0 {
|
||||||
|
n - 2
|
||||||
|
} else {
|
||||||
|
n - x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue