1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2013 Davidlohr Bueso <davidlohr.bueso@hp.com>
5 * Based on the shift-and-subtract algorithm for computing integer
6 * square root from Guy L. Steele.
9 #include <linux/export.h>
10 #include <linux/bitops.h>
11 #include <linux/limits.h>
12 #include <linux/math.h>
15 * int_sqrt - computes the integer square root
16 * @x: integer of which to calculate the sqrt
18 * Computes: floor(sqrt(x))
20 unsigned long int_sqrt(unsigned long x)
22 unsigned long b, m, y = 0;
27 m = 1UL << (__fls(x) & ~1UL);
41 EXPORT_SYMBOL(int_sqrt);
43 #if BITS_PER_LONG < 64
45 * int_sqrt64 - strongly typed int_sqrt function when minimum 64 bit input
47 * @x: 64bit integer of which to calculate the sqrt
54 return int_sqrt((unsigned long) x);
56 m = 1ULL << ((fls64(x) - 1) & ~1ULL);
70 EXPORT_SYMBOL(int_sqrt64);