datapath: Add support for kernel 3.14.
[sliver-openvswitch.git] / datapath / linux / compat / reciprocal_div.c
1 #include <linux/kernel.h>
2 #include <asm/div64.h>
3 #include <linux/reciprocal_div.h>
4
5 /*
6  * For a description of the algorithm please have a look at
7  * include/linux/reciprocal_div.h
8  */
9
10 struct reciprocal_value reciprocal_value(u32 d)
11 {
12         struct reciprocal_value R;
13         u64 m;
14         int l;
15
16         l = fls(d - 1);
17         m = ((1ULL << 32) * ((1ULL << l) - d));
18         do_div(m, d);
19         ++m;
20         R.m = (u32)m;
21         R.sh1 = min(l, 1);
22         R.sh2 = max(l - 1, 0);
23
24         return R;
25 }