mpz_{eq,lt,gt}_{ui,si}_p macros?

bodrato at mail.dm.unipi.it bodrato at mail.dm.unipi.it
Thu Feb 14 08:51:22 CET 2013


Ciao,

Il Mer, 13 Febbraio 2013 9:28 am, Marc Glisse ha scritto:
> On Wed, 13 Feb 2013, bodrato at mail.dm.unipi.it wrote:

>> Are inline functions as portable as macros?
>
> Not quite, but I don't know any current compiler that doesn't support
> them. Besides, I thought we were talking about __builtin_constant_p, and
> thus gcc (or compatible compilers).

If we define the symbols in gmp.h, we should also document them: functions
or macros?
In the #if GCC case, we can define the corresponding _mpz inline
functions; but I'd like to avoid adding function calls in the #else case.

>> Assume we write cmp_ui (z,limb) as gt()?1:lt()?-1:0

> I tested (i>0?1:i<0?-1:0)<0 (and >0 and ==0) and gcc optimized it to just
> i<0 (resp. i>0, i==0).

Great!
The problem arises if gt() and lt() are not so simple.

>>>> variants, I'm not sure I'm handling correctly the negative constants.

> If -(SI) is the only issue, then -(unsigned long)(SI) should work, no?

Maybe...

It is nearly unreadable...

#define mpz_lt_si_p(Z,SI)						\
  (__builtin_constant_p ((SI) >= 0) && (SI) >= 0			\
   ? mpz_lt_ui_p(Z, __GMP_CAST (unsigned long, SI))			\
   : __builtin_constant_p ((SI) <= 0 && -__GMP_CAST (unsigned long, SI) <=
GMP_NUMB_MAX)\
   && ((SI) <= 0 && -__GMP_CAST (unsigned long, SI) <= GMP_NUMB_MAX)	\
   ? (Z)->_mp_size < -((Z)->_mp_d[0] <=-__GMP_CAST (unsigned long, SI))	\
   : _mpz_cmp_si (Z,SI) < 0)

... and perhaps I should add one more cast to mp_limb_t before the
comparison with _mp_d[0]...

Regards,
m

-- 
http://bodrato.it/software/



More information about the gmp-devel mailing list