diff options
Diffstat (limited to 'lib/div64.c')
-rw-r--r-- | lib/div64.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/div64.c b/lib/div64.c index bb5bd0c0f030..76c01542d3e1 100644 --- a/lib/div64.c +++ b/lib/div64.c | |||
@@ -98,3 +98,26 @@ EXPORT_SYMBOL(div64_u64); | |||
98 | #endif | 98 | #endif |
99 | 99 | ||
100 | #endif /* BITS_PER_LONG == 32 */ | 100 | #endif /* BITS_PER_LONG == 32 */ |
101 | |||
102 | /* | ||
103 | * Iterative div/mod for use when dividend is not expected to be much | ||
104 | * bigger than divisor. | ||
105 | */ | ||
106 | u32 iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder) | ||
107 | { | ||
108 | u32 ret = 0; | ||
109 | |||
110 | while (dividend >= divisor) { | ||
111 | /* The following asm() prevents the compiler from | ||
112 | optimising this loop into a modulo operation. */ | ||
113 | asm("" : "+rm"(dividend)); | ||
114 | |||
115 | dividend -= divisor; | ||
116 | ret++; | ||
117 | } | ||
118 | |||
119 | *remainder = dividend; | ||
120 | |||
121 | return ret; | ||
122 | } | ||
123 | EXPORT_SYMBOL(iter_div_u64_rem); | ||