+#if BIGNUM_INT_BITS == 64
+ /* ./contrib/make1305.py mul 64 */
+ BignumDblInt tmp;
+ BignumDblInt acclo;
+ BignumDblInt acchi;
+ BignumDblInt acc2lo;
+ acclo = 0;
+ acchi = 0;
+ tmp = (BignumDblInt)(a->w[0]) * (b->w[0]);
+ acclo += tmp & BIGNUM_INT_MASK;
+ acchi += tmp >> 64;
+ r->w[0] = acclo;
+ acclo = acchi + (acclo >> 64);
+ acchi = 0;
+ tmp = (BignumDblInt)(a->w[0]) * (b->w[1]);
+ acclo += tmp & BIGNUM_INT_MASK;
+ acchi += tmp >> 64;
+ tmp = (BignumDblInt)(a->w[1]) * (b->w[0]);
+ acclo += tmp & BIGNUM_INT_MASK;
+ acchi += tmp >> 64;
+ r->w[1] = acclo;
+ acclo = acchi + (acclo >> 64);
+ acchi = 0;
+ tmp = (BignumDblInt)(a->w[0]) * (b->w[2]);
+ acclo += tmp & BIGNUM_INT_MASK;
+ acchi += tmp >> 64;
+ tmp = (BignumDblInt)(a->w[1]) * (b->w[1]);
+ acclo += tmp & BIGNUM_INT_MASK;
+ acchi += tmp >> 64;
+ tmp = (BignumDblInt)(a->w[2]) * (b->w[0]);
+ acclo += tmp & BIGNUM_INT_MASK;
+ acchi += tmp >> 64;
+ r->w[2] = acclo & (((BignumInt)1 << 2)-1);
+ acc2lo = 0;
+ acc2lo += ((acclo >> 2) & (((BignumInt)1 << 62)-1)) * ((BignumDblInt)5 << 0);
+ acclo = acchi + (acclo >> 64);
+ acchi = 0;
+ tmp = (BignumDblInt)(a->w[1]) * (b->w[2]);
+ acclo += tmp & BIGNUM_INT_MASK;
+ acchi += tmp >> 64;
+ tmp = (BignumDblInt)(a->w[2]) * (b->w[1]);
+ acclo += tmp & BIGNUM_INT_MASK;
+ acchi += tmp >> 64;
+ acc2lo += (acclo & (((BignumInt)1 << 2)-1)) * ((BignumDblInt)5 << 62);
+ acc2lo += r->w[0];
+ r->w[0] = acc2lo;
+ acc2lo >>= 64;
+ acc2lo += ((acclo >> 2) & (((BignumInt)1 << 62)-1)) * ((BignumDblInt)5 << 0);
+ acclo = acchi + (acclo >> 64);
+ acchi = 0;
+ tmp = (BignumDblInt)(a->w[2]) * (b->w[2]);
+ acclo += tmp & BIGNUM_INT_MASK;
+ acchi += tmp >> 64;
+ acc2lo += (acclo & (((BignumInt)1 << 2)-1)) * ((BignumDblInt)5 << 62);
+ acc2lo += r->w[1];
+ r->w[1] = acc2lo;
+ acc2lo >>= 64;
+ acc2lo += ((acclo >> 2) & (((BignumInt)1 << 2)-1)) * ((BignumDblInt)5 << 0);
+ acc2lo += r->w[2];
+ r->w[2] = acc2lo;
+ acc2lo = 0;
+ acc2lo += ((acclo >> 4) & (((BignumInt)1 << 60)-1)) * ((BignumDblInt)25 << 0);
+ acclo = acchi + (acclo >> 64);
+ acchi = 0;
+ acc2lo += (acclo & (((BignumInt)1 << 4)-1)) * ((BignumDblInt)25 << 60);
+ acc2lo += r->w[0];
+ r->w[0] = acc2lo;
+ acc2lo >>= 64;
+ acc2lo += ((acclo >> 4) & (((BignumInt)1 << 60)-1)) * ((BignumDblInt)25 << 0);
+ acclo = acchi + (acclo >> 64);
+ acchi = 0;
+ acc2lo += r->w[1];
+ r->w[1] = acc2lo;
+ acc2lo >>= 64;
+ acc2lo += r->w[2];
+ r->w[2] = acc2lo;
+ acc2lo >>= 64;
+#elif BIGNUM_INT_BITS == 32