cosmopolitan/libc/tinymath/magicu.h
Justine Tunney fa20edc44d
Reduce header complexity
- Remove most __ASSEMBLER__ __LINKER__ ifdefs
- Rename libc/intrin/bits.h to libc/serialize.h
- Block pthread cancelation in fchmodat() polyfill
- Remove `clang-format off` statements in third_party
2023-11-28 14:39:42 -08:00

33 lines
909 B
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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
*/
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.
*/
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_ */