mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-07 15:03:34 +00:00
1422e96b4e
There's a new program named ape/ape-m1.c which will be used to build an embeddable binary that can load ape and elf executables. The support is mostly working so far, but still chasing down ABI issues.
35 lines
992 B
C
35 lines
992 B
C
#ifndef COSMOPOLITAN_LIBC_TINYMATH_MAGICU_H_
|
||
#define COSMOPOLITAN_LIBC_TINYMATH_MAGICU_H_
|
||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||
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 bool __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 /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||
#endif /* COSMOPOLITAN_LIBC_TINYMATH_MAGICU_H_ */
|