Ciao,

Il 2019-08-27 16:35 t...@gmplib.org ha scritto:
I got something working.  It runs quite well, and seems to beat the

Great!

static inline void
mpn_gcd_NN (mp_limb_t *rp, mp_limb_t *up, mp_limb_t *vp, size_t N)

I see that your idea is to obtain a N-loop-unrolled version...

      if (UNLIKELY (cy))
        mpn_neg (up, up, N);

This is an unlikely branch, but I'd really suggest
 {mpn_neg (up, up, N -1); up[N-1] = 0;}
because mpn_neg is full of branches :-)

      if (UNLIKELY (up[0] == 0))
        {

This unlikely branch may end up with an odd up[0]...

        }
      int cnt;
      count_trailing_zeros (cnt, up[0]);
      mpn_rshift (up, up, N, cnt);

... and on some platform mpn_rshift may not support cnt==0.

Maybe (for the C version) we should duplicate the ctz/shift instruction, both inside the UNLIKELY (*up == 0) branch (deciding whether to shift or copy) and in an else (likely) branch.

m

--
http://bodrato.it/papers/
_______________________________________________
gmp-devel mailing list
gmp-devel@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-devel

Reply via email to