blob: 6d35274170bcd6c85fa56a0b92e5696d310f7273
1 | /* |
2 | * Copyright (C) 2013 Davidlohr Bueso <davidlohr.bueso@hp.com> |
3 | * |
4 | * Based on the shift-and-subtract algorithm for computing integer |
5 | * square root from Guy L. Steele. |
6 | */ |
7 | |
8 | #include <linux/kernel.h> |
9 | #include <linux/export.h> |
10 | #include <linux/bitops.h> |
11 | |
12 | /** |
13 | * int_sqrt - rough approximation to sqrt |
14 | * @x: integer of which to calculate the sqrt |
15 | * |
16 | * A very rough approximation to the sqrt() function. |
17 | */ |
18 | unsigned long int_sqrt(unsigned long x) |
19 | { |
20 | unsigned long b, m, y = 0; |
21 | |
22 | if (x <= 1) |
23 | return x; |
24 | |
25 | m = 1UL << (__fls(x) & ~1UL); |
26 | while (m != 0) { |
27 | b = y + m; |
28 | y >>= 1; |
29 | |
30 | if (x >= b) { |
31 | x -= b; |
32 | y += m; |
33 | } |
34 | m >>= 2; |
35 | } |
36 | |
37 | return y; |
38 | } |
39 | EXPORT_SYMBOL(int_sqrt); |
40 |