home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / reciprocal_div.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  846 b   |  33 lines

  1. #ifndef _LINUX_RECIPROCAL_DIV_H
  2. #define _LINUX_RECIPROCAL_DIV_H
  3.  
  4. #include <linux/types.h>
  5.  
  6. /*
  7.  * This file describes reciprocical division.
  8.  *
  9.  * This optimizes the (A/B) problem, when A and B are two u32
  10.  * and B is a known value (but not known at compile time)
  11.  *
  12.  * The math principle used is :
  13.  *   Let RECIPROCAL_VALUE(B) be (((1LL << 32) + (B - 1))/ B)
  14.  *   Then A / B = (u32)(((u64)(A) * (R)) >> 32)
  15.  *
  16.  * This replaces a divide by a multiply (and a shift), and
  17.  * is generally less expensive in CPU cycles.
  18.  */
  19.  
  20. /*
  21.  * Computes the reciprocal value (R) for the value B of the divisor.
  22.  * Should not be called before each reciprocal_divide(),
  23.  * or else the performance is slower than a normal divide.
  24.  */
  25. extern u32 reciprocal_value(u32 B);
  26.  
  27.  
  28. static inline u32 reciprocal_divide(u32 A, u32 R)
  29. {
  30.     return (u32)(((u64)A * R) >> 32);
  31. }
  32. #endif
  33.