Re: [PATCH v10 1/3] lib: Add strongly typed 64bit int_sqrt
From: Crt Mori
Date: Thu Dec 21 2017 - 08:18:33 EST
On 21 December 2017 at 12:43, David Laight <David.Laight@xxxxxxxxxx> wrote:
> From: Crt Mori
>> Sent: 20 December 2017 17:30
>> I did a quick run through unit tests for the sensor and the results
>> are way off
>> ...
>
> Try this version instead:
> unsigned int sqrt64(unsigned long long x_in)
> {
> unsigned int x = x_in >> 32;
>
> unsigned int b = 0;
> unsigned int y = 0;
> unsigned int i;
i can be u8. And I will still use explicit typing.
>
> i = 31;
> if (!x) {
> x = x_in;
> i = 15;
> }
> if (!(x & 0xffff0000)) {
> x <<= 16;
> i -= 8;
> }
> if (!(x & 0xff000000)) {
> x <<= 8;
> i -= 4;
> }
> if (!(x & 0xf0000000)) {
> x <<= 4;
> i -= 2;
> }
>
This part above looks like FLS
> do {
> b <<= 2;
> b |= x >> 30;
> x <<= 2;
> if (i == 16)
> x = x_in;
> y <<= 1;
> if (b > y) {
> b -= ++y;
> y++;
> }
> } while (--i);
>
> /* 'b' becomes 33 bits if the input is greater than 2^62 */
> b <<= 1;
> b |= x >> 31;
> if (b > y || (b == y && x & (1u << 30)))
> y |= 1;
>
> return y;
> }
>
> I've tested that one with more values.
>
> David
>
This one indeed works. I did some more testing this morning and I am
fine with either.
So question is: Do I make change as per David's suggestion with his
sign-off, or leave the version it was before the change?