Attempt to use `intrinsics!`

master
Lokathor 2019-01-04 19:17:02 -07:00
parent 2e8b85439f
commit 9a68e74ebd
1 changed files with 51 additions and 48 deletions

View File

@ -301,64 +301,67 @@ 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] intrinsics! {
#[cfg(any( #[cfg(any(
target_pointer_width = "16", target_pointer_width = "16",
target_pointer_width = "32", target_pointer_width = "32",
target_pointer_width = "64" target_pointer_width = "64"
))] ))]
pub extern "C" fn __clzsi2(mut x: usize) -> usize { pub extern "C" fn __clzsi2(x: usize) -> usize {
// TODO: const this? Would require const-if // TODO: const this? Would require const-if
let mut y: usize; // Note(Lokathor): the `intrinsics!` macro can't process mut inputs
let mut n: usize = { let mut x = x;
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")] #[cfg(target_pointer_width = "64")]
{ {
64 y = x >> 32;
if y != 0 {
n -= 32;
x = y;
}
} }
#[cfg(target_pointer_width = "32")] #[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
{ {
32 y = x >> 16;
if y != 0 {
n -= 16;
x = y;
}
} }
#[cfg(target_pointer_width = "16")] y = x >> 8;
{
16
}
};
#[cfg(target_pointer_width = "64")]
{
y = x >> 32;
if y != 0 { if y != 0 {
n -= 32; n -= 8;
x = y; x = y;
} }
} y = x >> 4;
#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
{
y = x >> 16;
if y != 0 { if y != 0 {
n -= 16; n -= 4;
x = y; x = y;
} }
} y = x >> 2;
y = x >> 8; if y != 0 {
if y != 0 { n -= 2;
n -= 8; x = y;
x = y; }
} y = x >> 1;
y = x >> 4; if y != 0 {
if y != 0 { n - 2
n -= 4; } else {
x = y; n - x
} }
y = x >> 2;
if y != 0 {
n -= 2;
x = y;
}
y = x >> 1;
if y != 0 {
n - 2
} else {
n - x
} }
} }