Marco Bodrato bodrato at
Wed Aug 26 18:13:52 UTC 2015


Il Mer, 26 Agosto 2015 6:26 pm, Torbjörn Granlund ha scritto:
> nisse at (Niels Möller) writes:
>   > (SIZ(den) | PTR(den)[0]) == 1
>   I think it is correct, assuming that at this point in the code it is
>   known that SIZ(den) != 0 (and that den is normalized, so that SIZ(den)

At any point in mpq code (we check in the _init functions, and we ASSERT
elsewhere) we assume denominator is strictly positive and mpz's are

> Indeed a clever condition, helping Marco's quest against branches, a
> condition which also depends on that we always allocate a limb at
> PTR(mpz).

It depends only on being able to _read_ PTR(mpz)[0].

If we change (I'd agree) mpz_init into

mpz_init (mpz_ptr x)
  ALLOC (x) = 0; /* ZERO, any MPZ_REALLOC will allocate */
  PTR (x) = & static_const_limb_shared_by_all_instances;
  SIZ (x) = 0;

(consequently we will have to change all functions that write a single
limb, pre-pending an MPZ_REALLOC(var,1) )

That condition will keep on being valid. The same holds for

#define mpz_odd_p(z) (((z)->_mp_size!=0)&__GMP_CAST(int,(z)->_mp_d[0]))

that we wrote a dozen years ago in .


More information about the gmp-devel mailing list