#ifndef _RECIP_H_ #define _RECIP_H_ #include #include #include "helper.h" #include "div64.h" static inline uint32_t __attribute_const__ reciprocal_value_divide(uint32_t k) { uint64_t val = (INT64_C(1) << 32) + (k - 1); do_div(val, k); return (uint32_t)val; } static inline uint32_t __attribute_const__ reciprocal_value_remainder(uint32_t k) { uint64_t val = (INT64_C(1) << 32) - 1; do_div(val, k); return (uint32_t)val; } static inline uint32_t __attribute_const__ reciprocal_divide(uint32_t A, uint32_t R) { #if defined(__i386__) unsigned int edx, eax; asm volatile("mull %2":"=a" (eax), "=d" (edx):"rm" (R), "0" (A)); return edx; #else return (uint32_t)(((uint64_t)A * R) >> 32); #endif } static inline uint32_t __attribute_const__ reciprocal_remainder(uint32_t A, uint32_t B, uint32_t R) { uint32_t div, mod; div = reciprocal_divide(A, R); mod = A - (uint32_t) (div * B); if (mod >= B) mod -= B; return mod; } #endif