]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - lib/div64.c
math64: New div64_u64_rem helper
[karo-tx-linux.git] / lib / div64.c
index a163b6caef73fdc26e19f8d18ef66604a03b1cf8..3af5728d95fda3c2aa740deec3f6de69cc847e94 100644 (file)
@@ -79,9 +79,10 @@ EXPORT_SYMBOL(div_s64_rem);
 #endif
 
 /**
- * div64_u64 - unsigned 64bit divide with 64bit divisor
+ * div64_u64_rem - unsigned 64bit divide with 64bit divisor and 64bit remainder
  * @dividend:  64bit dividend
  * @divisor:   64bit divisor
+ * @remainder:  64bit remainder
  *
  * This implementation is a modified version of the algorithm proposed
  * by the book 'Hacker's Delight'.  The original source and full proof
@@ -89,27 +90,33 @@ EXPORT_SYMBOL(div_s64_rem);
  *
  * 'http://www.hackersdelight.org/HDcode/newCode/divDouble.c.txt'
  */
-#ifndef div64_u64
-u64 div64_u64(u64 dividend, u64 divisor)
+#ifndef div64_u64_rem
+u64 div64_u64_rem(u64 dividend, u64 divisor, u64 *remainder)
 {
        u32 high = divisor >> 32;
        u64 quot;
 
        if (high == 0) {
-               quot = div_u64(dividend, divisor);
+               u32 rem32;
+               quot = div_u64_rem(dividend, divisor, &rem32);
+               *remainder = rem32;
        } else {
                int n = 1 + fls(high);
                quot = div_u64(dividend >> n, divisor >> n);
 
                if (quot != 0)
                        quot--;
-               if ((dividend - quot * divisor) >= divisor)
+
+               *remainder = dividend - quot * divisor;
+               if (*remainder >= divisor) {
                        quot++;
+                       *remainder -= divisor;
+               }
        }
 
        return quot;
 }
-EXPORT_SYMBOL(div64_u64);
+EXPORT_SYMBOL(div64_u64_rem);
 #endif
 
 /**