71 lines · 1.2 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0/* * Copyright (C) 2013 Davidlohr Bueso <davidlohr.bueso@hp.com> * *  Based on the shift-and-subtract algorithm for computing integer *  square root from Guy L. Steele. */ #include <linux/export.h>#include <linux/bitops.h>#include <linux/limits.h>#include <linux/math.h> /** * int_sqrt - computes the integer square root * @x: integer of which to calculate the sqrt * * Computes: floor(sqrt(x)) */unsigned long int_sqrt(unsigned long x){	unsigned long b, m, y = 0; 	if (x <= 1)		return x; 	m = 1UL << (__fls(x) & ~1UL);	while (m != 0) {		b = y + m;		y >>= 1; 		if (x >= b) {			x -= b;			y += m;		}		m >>= 2;	} 	return y;}EXPORT_SYMBOL(int_sqrt); #if BITS_PER_LONG < 64/** * int_sqrt64 - strongly typed int_sqrt function when minimum 64 bit input * is expected. * @x: 64bit integer of which to calculate the sqrt */u32 int_sqrt64(u64 x){	u64 b, m, y = 0; 	if (x <= ULONG_MAX)		return int_sqrt((unsigned long) x); 	m = 1ULL << ((fls64(x) - 1) & ~1ULL);	while (m != 0) {		b = y + m;		y >>= 1; 		if (x >= b) {			x -= b;			y += m;		}		m >>= 2;	} 	return y;}EXPORT_SYMBOL(int_sqrt64);#endif