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