Hi, I had one idea which I wonder if it's useful on some architecture. I think all current variants of the binary gcd used for gcd_11 try to replace (a,b) with min(a,b), abs(a-b), and then take out powers of two.
One could get rid of the absolute value by letting one of the working values be negative. Something like this, in pseudo code b = - b while ( (sum = a + b) != 0) { if (sum > 0) a = sum; else b = sum; } Note that we always have a > 0 and b < 0, so one doesn't need to interpret high bit as a sign bit. I had a look at the current code for arm (v6t2) and x86_64 (core2), and there I don't see any clear improvement. For ARM, it would be something like neg v0 ... top: rbit t, s clz t, t lsr s, s, t movcs u0, s movcc v0, s adds s, u0, v0 bne L(top) I don't expect that to be faster than the current code (but I haven't tried it out). The current code does the absolute value neatly using rsbcc r3, r3, #0. For x86_64: neg v0 ... top: cmovc s, v0 cmovnc s, v0 lea (u0, v0), s bsf s, %rcx shr R8(%rcx), s mov u0, tmp add v0, tmp C For carry only jnz top That's one instruction less than the current code, but looks quite clumsy. It's annoying that bsf clobbers the carry flag. Since we can't use carry from the first addition anyway, we can use lea for that and save a mov. But then we still need a mov + add to get the carry later on; here negation works against us, since that makes the compare instruction useless. Maybe there's some other architecture where negation is a clear win? Regards, /Niels -- Niels Möller. PGP-encrypted email is preferred. Keyid 368C6677. Internet email is subject to wholesale government surveillance. _______________________________________________ gmp-devel mailing list gmp-devel@gmplib.org https://gmplib.org/mailman/listinfo/gmp-devel