factor: don't be too clever in isqrt - be small instead
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 10 Apr 2017 16:30:35 +0000 (18:30 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 10 Apr 2017 16:30:35 +0000 (18:30 +0200)
function                                             old     new   delta
isqrt_odd                                            111      70     -41

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/factor.c

index 7400174a7304d4c493bcebf64a0c5c9411fb141e..11097c12de046ff0080ab38c4b446c045e9204b2 100644 (file)
@@ -47,25 +47,27 @@ typedef unsigned long half_t;
 /* Returns such x that x+1 > sqrt(N) */
 static inline half_t isqrt(wide_t N)
 {
-       wide_t mask_2bits;
        half_t x;
 
-// Never called with N < 1
-//     if (N == 0)
-//             return 0;
+       // Never called with N < 1
+       //if (N == 0)
+       //      return 0;
 
+       x = HALF_MAX;
        /* First approximation of x+1 > sqrt(N) - all-ones, half as many bits:
         * 1xxxxx -> 111 (six bits to three)
         * 01xxxx -> 111
         * 001xxx -> 011
         * 0001xx -> 011 and so on.
         */
-       x = HALF_MAX;
-       mask_2bits = TOPMOST_WIDE_BIT | (TOPMOST_WIDE_BIT >> 1);
-       while (!(N & mask_2bits)) {
-               x >>= 1;
-               mask_2bits >>= 2;
-       }
+       // It is actually not performance-critical at all.
+       // Can simply start Newton loop with very conservative x=0xffffffff.
+       //wide_t mask_2bits;
+       //mask_2bits = TOPMOST_WIDE_BIT | (TOPMOST_WIDE_BIT >> 1);
+       //while (!(N & mask_2bits)) {
+       //      x >>= 1;
+       //      mask_2bits >>= 2;
+       //}
        dbg("x:%"HALF_FMT"x", x);
 
        for (;;) {