lib/int_sqrt.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/int_sqrt.c b/lib/int_sqrt.c index 1ef4cc344977..da3b3dabad8e 100644 --- a/lib/int_sqrt.c +++ b/lib/int_sqrt.c @@ -16,14 +16,22 @@ */ unsigned long int_sqrt(unsigned long x) { - unsigned long b, m, y = 0; + unsigned long m, y; if (x <= 1) return x; - m = 1UL << (BITS_PER_LONG - 2); - while (m != 0) { - b = y + m; + m = 64; + do { + unsigned long new_m = m << 2; + if (!new_m) + break; + m = new_m; + } while (m < x); + + y = 0; + do { + unsigned long b = y + m; y >>= 1; if (x >= b) { @@ -31,7 +39,7 @@ unsigned long int_sqrt(unsigned long x) y += m; } m >>= 2; - } + } while (m); return y; }