A little warning in GMP.h
bhurt at spnz.org
Thu Sep 23 17:00:11 CEST 2004
On Thu, 23 Sep 2004, Patrick Pelissier wrote:
> > Anyway, I was wondering if just writing
> > return __gmp_l & (-(signed)(mp_limb_t) (__gmp_n != 0));
> > would work, since this would solve the problem with all compilers without
> > any option tweak....
> Some problems may occur if sizeof(int) != sizeof (mp_limb_t) (16 or 64 bits systems).
Can I ask a possibly stupid question: this rather confusing idiom is
trying to replace:
return (__gmp_n != 0)?__gmp_l:0;
with code that doesn't have the branch. Are there compilers that, given
the above code, don't produce the branchless versions? How widely used
are they? The advantage of the branched version is that it doesn't depend
upon the system being twos complement. And gcc (at least version 3.2.2)
emits branchless code using the sete instruction with just -O2.
Another alternative would be:
return __gmp_l & (((mp_limb_t) (__gmp_n == 0)) - 1u);
Another alternative would be to have a signed mp_limb_t type around.
"Usenet is like a herd of performing elephants with diarrhea -- massive,
difficult to redirect, awe-inspiring, entertaining, and a source of
mind-boggling amounts of excrement when you least expect it."
- Gene Spafford
More information about the gmp-discuss