]>
Commit | Line | Data |
---|---|---|
6a2d7a95 ED |
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 |