aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-04-10 18:30:35 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2017-04-10 18:30:35 +0200
commitcc1f8ba489b809d2c859276ef10094df4bcc74ea (patch)
tree2781afa04988916cb29e8e4c310d38c0fdd86d76
parentad5394d591896fc1d025efff2fa6c8c580fb67e9 (diff)
downloadbusybox-w32-cc1f8ba489b809d2c859276ef10094df4bcc74ea.tar.gz
busybox-w32-cc1f8ba489b809d2c859276ef10094df4bcc74ea.tar.bz2
busybox-w32-cc1f8ba489b809d2c859276ef10094df4bcc74ea.zip
factor: don't be too clever in isqrt - be small instead
function old new delta isqrt_odd 111 70 -41 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--coreutils/factor.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/coreutils/factor.c b/coreutils/factor.c
index 7400174a7..11097c12d 100644
--- a/coreutils/factor.c
+++ b/coreutils/factor.c
@@ -47,25 +47,27 @@ typedef unsigned long half_t;
47/* Returns such x that x+1 > sqrt(N) */ 47/* Returns such x that x+1 > sqrt(N) */
48static inline half_t isqrt(wide_t N) 48static inline half_t isqrt(wide_t N)
49{ 49{
50 wide_t mask_2bits;
51 half_t x; 50 half_t x;
52 51
53// Never called with N < 1 52 // Never called with N < 1
54// if (N == 0) 53 //if (N == 0)
55// return 0; 54 // return 0;
56 55
56 x = HALF_MAX;
57 /* First approximation of x+1 > sqrt(N) - all-ones, half as many bits: 57 /* First approximation of x+1 > sqrt(N) - all-ones, half as many bits:
58 * 1xxxxx -> 111 (six bits to three) 58 * 1xxxxx -> 111 (six bits to three)
59 * 01xxxx -> 111 59 * 01xxxx -> 111
60 * 001xxx -> 011 60 * 001xxx -> 011
61 * 0001xx -> 011 and so on. 61 * 0001xx -> 011 and so on.
62 */ 62 */
63 x = HALF_MAX; 63 // It is actually not performance-critical at all.
64 mask_2bits = TOPMOST_WIDE_BIT | (TOPMOST_WIDE_BIT >> 1); 64 // Can simply start Newton loop with very conservative x=0xffffffff.
65 while (!(N & mask_2bits)) { 65 //wide_t mask_2bits;
66 x >>= 1; 66 //mask_2bits = TOPMOST_WIDE_BIT | (TOPMOST_WIDE_BIT >> 1);
67 mask_2bits >>= 2; 67 //while (!(N & mask_2bits)) {
68 } 68 // x >>= 1;
69 // mask_2bits >>= 2;
70 //}
69 dbg("x:%"HALF_FMT"x", x); 71 dbg("x:%"HALF_FMT"x", x);
70 72
71 for (;;) { 73 for (;;) {