Skip to main content
← PSoXide SDK guides and examples · SDK f2fec1c301f1 · All Cargo features enabled; check feature gates before use.

InvariantDivisor31

Struct InvariantDivisor31 

Source
pub struct InvariantDivisor31 { /* private fields */ }
Expand description

Exact n / d for 0 <= n < 2^31 by one multu and a shift, for a divisor that is fixed across many dividends.

Granlund and Montgomery, “Division by invariant integers using multiplication” (1994), theorem 4.2 with N = 31: for l = ceil(log2 d) and m = floor(2^(31+l) / d) + 1, floor(m * n / 2^(31+l)) equals floor(n / d) for every n < 2^31, and m fits 32 bits. The R3000A’s div interlocks the pipeline for about 35 cycles and multu for about 12 (fewer for small operands), so a per-model depth-slot divide that ran once per drawn face pays for its new after a handful of faces.

Implementations§

Source§

impl InvariantDivisor31

Source

pub const fn new(divisor: u32) -> Self

Prepare divisor, which must be at least one. This is the 32-step software divide, so prepare once where the divisor is decided (a depth range, a table size), not per use.

Source

pub fn divide(self, n: u32) -> u32

n / divisor for n < 2^31.

Trait Implementations§

Source§

impl Clone for InvariantDivisor31

Source§

fn clone(&self) -> InvariantDivisor31

Returns a duplicate of the value. Read more
1.0.0§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for InvariantDivisor31

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for InvariantDivisor31

Source§

fn eq(&self, other: &InvariantDivisor31) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for InvariantDivisor31

Source§

impl Eq for InvariantDivisor31

Source§

impl StructuralPartialEq for InvariantDivisor31

Auto Trait Implementations§

§

impl Freeze for InvariantDivisor31

§

impl RefUnwindSafe for InvariantDivisor31

§

impl Send for InvariantDivisor31

§

impl Sync for InvariantDivisor31

§

impl Unpin for InvariantDivisor31

§

impl UnsafeUnpin for InvariantDivisor31

§

impl UnwindSafe for InvariantDivisor31

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneToUninit for T
where T: Clone,

§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.