- mpx_umul(d->v, d->vl, a->v, a->vl, b->v, b->vl);
+ if (MP_LEN(a) <= KARATSUBA_CUTOFF || MP_LEN(b) <= KARATSUBA_CUTOFF)
+ mpx_umul(d->v, d->vl, a->v, a->vl, b->v, b->vl);
+ else {
+ size_t m = MAX(MP_LEN(a), MP_LEN(b)) * 2 + KARATSUBA_SLOP;
+ mpw *s;
+ m += 32;
+ s = MP_ALLOC(m);
+ mpx_kmul(d->v, d->vl, a->v, a->vl, b->v, b->vl, s, s + m);
+ MP_FREE(s);
+ }
+