Skip to content

Commit 9a68e74

Browse files
committed
Attempt to use intrinsics!
1 parent 2e8b854 commit 9a68e74

File tree

1 file changed

+50
-47
lines changed

1 file changed

+50
-47
lines changed

src/int/mod.rs

Lines changed: 50 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -301,64 +301,67 @@ macro_rules! impl_wide_int {
301301
impl_wide_int!(u32, u64, 32);
302302
impl_wide_int!(u64, u128, 64);
303303

304-
#[no_mangle]
305-
#[cfg(any(
306-
target_pointer_width = "16",
307-
target_pointer_width = "32",
308-
target_pointer_width = "64"
309-
))]
310-
pub extern "C" fn __clzsi2(mut x: usize) -> usize {
311-
// TODO: const this? Would require const-if
312-
let mut y: usize;
313-
let mut n: usize = {
304+
intrinsics! {
305+
#[cfg(any(
306+
target_pointer_width = "16",
307+
target_pointer_width = "32",
308+
target_pointer_width = "64"
309+
))]
310+
pub extern "C" fn __clzsi2(x: usize) -> usize {
311+
// TODO: const this? Would require const-if
312+
// Note(Lokathor): the `intrinsics!` macro can't process mut inputs
313+
let mut x = x;
314+
let mut y: usize;
315+
let mut n: usize = {
316+
#[cfg(target_pointer_width = "64")]
317+
{
318+
64
319+
}
320+
#[cfg(target_pointer_width = "32")]
321+
{
322+
32
323+
}
324+
#[cfg(target_pointer_width = "16")]
325+
{
326+
16
327+
}
328+
};
314329
#[cfg(target_pointer_width = "64")]
315330
{
316-
64
331+
y = x >> 32;
332+
if y != 0 {
333+
n -= 32;
334+
x = y;
335+
}
317336
}
318-
#[cfg(target_pointer_width = "32")]
337+
#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
319338
{
320-
32
339+
y = x >> 16;
340+
if y != 0 {
341+
n -= 16;
342+
x = y;
343+
}
321344
}
322-
#[cfg(target_pointer_width = "16")]
323-
{
324-
16
345+
y = x >> 8;
346+
if y != 0 {
347+
n -= 8;
348+
x = y;
325349
}
326-
};
327-
#[cfg(target_pointer_width = "64")]
328-
{
329-
y = x >> 32;
350+
y = x >> 4;
330351
if y != 0 {
331-
n -= 32;
352+
n -= 4;
332353
x = y;
333354
}
334-
}
335-
#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
336-
{
337-
y = x >> 16;
355+
y = x >> 2;
338356
if y != 0 {
339-
n -= 16;
357+
n -= 2;
340358
x = y;
341359
}
342-
}
343-
y = x >> 8;
344-
if y != 0 {
345-
n -= 8;
346-
x = y;
347-
}
348-
y = x >> 4;
349-
if y != 0 {
350-
n -= 4;
351-
x = y;
352-
}
353-
y = x >> 2;
354-
if y != 0 {
355-
n -= 2;
356-
x = y;
357-
}
358-
y = x >> 1;
359-
if y != 0 {
360-
n - 2
361-
} else {
362-
n - x
360+
y = x >> 1;
361+
if y != 0 {
362+
n - 2
363+
} else {
364+
n - x
365+
}
363366
}
364367
}

0 commit comments

Comments
 (0)