pub struct LogosDivU64 { /* private fields */ }Expand description
Precomputed unsigned division by a loop-invariant runtime divisor — the
magic-multiply that replaces a hardware div/idiv once the divisor is
pinned. Codegen emits LogosDivU64::new(n) in a loop’s preheader (computed
ONCE) and rewrites each in-loop x % n / x / n to .rem(x) / .div(x),
turning a ~20–40-cycle division into a multiply-high plus a shift. gcc and
rustc both leave a runtime-invariant divisor as a real div (neither
synthesizes this), so it is a strict win over the C baseline on division-hot
loops (graph_bfs’s % n adjacency build).
The construction is the standard Granlund–Montgomery / libdivide unsigned
algorithm, exact for every divisor in 1..=u64::MAX (power-of-two fast path,
the 64-bit-magic path, and the 65-bit “add marker” path). Codegen only emits
it where the dividend is proven non-negative and n > 0 (the existing
positivity guard), so the i64→u64 reinterpretation is value-preserving.
Implementations§
Source§impl LogosDivU64
impl LogosDivU64
Sourcepub fn new(d: u64) -> Self
pub fn new(d: u64) -> Self
Build the magic numbers for divisor d (must be non-zero). Runs once per
loop in the preheader, so its cost (a single 128/64 division) amortizes
over the whole loop.
pub fn div(&self, numer: u64) -> u64
pub fn rem(&self, numer: u64) -> u64
Sourcepub fn parts(&self) -> (u64, u8)
pub fn parts(&self) -> (u64, u8)
The raw (magic, more) pair, for backends (the VM / JIT interpreter
tiers) that bake the precomputed constants into a single fused op instead
of holding a LogosDivU64 struct. The encoding of more is exactly the
one div/rem consume (low 6 bits = shift; 0x40 = the 65-bit
add-marker path; 0x80 = the pure-shift power-of-two path).
Trait Implementations§
Source§impl Clone for LogosDivU64
impl Clone for LogosDivU64
Source§fn clone(&self) -> LogosDivU64
fn clone(&self) -> LogosDivU64
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more