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
);