open_pql/prim/
integer.rs

1use super::transmute;
2
3#[inline]
4pub const fn normalize_u64(c: u64) -> [u8; 8] {
5    // transmute is faster than calling to_le_bytes 4 times.
6    unsafe {
7        let [s, h, d, c]: [u16; 4] = transmute(c);
8
9        let has4 = s & h & d & c;
10        let has3 = s & h & d | s & h & c | s & d & c | h & d & c;
11
12        let has2 = s & h | s & d | s & c | h & d | h & c | d & c;
13        let has1 = s | h | d | c;
14
15        transmute([has1, has2, has3, has4])
16    }
17}
18
19const U16_D: u16 = 1 << 15;
20
21#[inline]
22pub const fn retain_leading_bit(v: u16) -> u16 {
23    if v == 0 {
24        0
25    } else {
26        U16_D >> v.leading_zeros()
27    }
28}
29
30#[inline]
31pub const fn retain_leading_2_bits(v: u16) -> u16 {
32    let mem = retain_leading_bit(v);
33
34    retain_leading_bit(v & !mem) | mem
35}
36
37#[inline]
38pub const fn retain_leading_3_bits(v: u16) -> u16 {
39    let mem = retain_leading_2_bits(v);
40
41    retain_leading_bit(v & !mem) | mem
42}
43
44#[inline]
45pub const fn retain_leading_4_bits(v: u16) -> u16 {
46    let mem = retain_leading_3_bits(v);
47
48    retain_leading_bit(v & !mem) | mem
49}
50
51#[inline]
52pub const fn retain_leading_5_bits(v: u16) -> u16 {
53    let mem = retain_leading_4_bits(v);
54
55    retain_leading_bit(v & !mem) | mem
56}