Niels Möller nisse at
Tue Aug 25 07:20:39 UTC 2015

"Marco Bodrato" <bodrato at> writes:

> If you pass NULL, you'll not avoid any pesky branch :-D
> If you pass a static "1", and do not branch, you will end up allocating
> space and loosing time to multiply NUM(op1) by one...

Depends on whether or not we want to recognize the integer case also for
mpq_cmp. I think it would make some sense to do that. And if so, passing
a static "1" for mpq_cmp_z seems right, because then no additional
branch is needed for that case.

As I understand tail call machinery, to really get a tail call, the
calling functions (mpq_cmp and mpq_cmp_z) mustn't pass any
stack-allocated pointers to mpq_cmp_helper.

> If we want to share code and we don't want to penalise the _z flavour too
> much, some branches are needed.

Is there a lot shared logic? For the integer case, we compare A/B to C,
by first checking signs and sizes, and for close sizes, compare B*C to A
(or ideally, only one or two of the high limbs of the product).

While for the non-integer case, A/B vs C/D, it seems to me that sign
logic would be the same, but size comparisons are different (limb size
of A known exactly, while limb size of A*D has one unit of uncertainty).


Niels Möller. PGP-encrypted email is preferred. Keyid C0B98E26.
Internet email is subject to wholesale government surveillance.

More information about the gmp-devel mailing list