+static mp *combine_mpw(mp *d, const mpw *v, size_t n, unsigned off)
+{
+ size_t i;
+ unsigned o;
+ mp m, *t = d;
+ mpw w[1];
+
+ d = MP_ZERO;
+ for (i = 0, o = 0; i < n; i++, o += off) {
+ w[0] = v[i]; mp_build(&m, w, w + 1);
+ t = mp_lsl(t, &m, o); d = mp_add(d, d, t);
+ }
+ mp_drop(t); return (d);
+}
+
+static mp *combine_mpd(mp *d, const mpd *v, size_t n, unsigned off)
+{
+ size_t i;
+ unsigned o;
+ mp m, *t = d;
+ mpw w[2];
+
+ d = MP_ZERO;
+ for (i = 0, o = 0; i < n; i++, o += off) {
+ w[0] = MPW(v[i]); w[1] = MPW(v[i] >> MPW_BITS); mp_build(&m, w, w + 2);
+ t = mp_lsl(t, &m, o); d = mp_add(d, d, t);
+ }
+ mp_drop(t); return (d);
+}
+
+#define DEFTYPE(ty, ld, st, nby, combfn, off) \