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 */ int_sqrt(unsigned long x)18unsigned 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