cosmopolitan/libc/tinymath/magicu.h

34 lines
909 B
C
Raw Normal View History

#ifndef COSMOPOLITAN_LIBC_TINYMATH_MAGICU_H_
#define COSMOPOLITAN_LIBC_TINYMATH_MAGICU_H_
COSMOPOLITAN_C_START_
struct magicu {
uint32_t M;
uint32_t s;
};
struct magicu __magicu_get(uint32_t);
/**
* Performs fast division using precomputed magic for constant divisor.
*
* @param x is unsigned integer that shall be divided
* @param d should be `__magicu_get(y)` if computing `x / y`
* @return result of unsigned integer division
*/
2023-05-15 23:32:10 +00:00
forceinline uint32_t __magicu_div(uint32_t x, struct magicu d) {
return ((((uint64_t)x * d.M) >> 32) + ((d.s & 64) ? x : 0)) >> (d.s & 63);
}
/**
* Checks if 𝑑 contains a valid initialized divisor.
*/
2023-11-16 04:57:18 +00:00
static inline bool32 __magicu_valid(struct magicu d) {
if (!d.M && !d.s) return false; /* uninitialized */
if (d.s & ~(64 | 63)) return false; /* corrupted */
return true;
}
COSMOPOLITAN_C_END_
#endif /* COSMOPOLITAN_LIBC_TINYMATH_MAGICU_H_ */