mdw_CHECK_MANYLIBS(socket, socket)
AC_CHECK_FUNCS(mlock)
+dnl --- Debugging things ---
+
+AC_ARG_ENABLE([mpw],
+ [AS_HELP_STRING([--enable-mpw],
+ [force small-width mp digits])],
+ [case "$enableval" in
+ y*|t*|short)
+ AC_DEFINE([FORCE_MPW_SHORT], [1],
+ [Define to force small-width mp digits.])
+ ;;
+ cussid)
+ AC_DEFINE([FORCE_MPW_CUSSID], [1],
+ [Define to force strange-width mp digits.])
+ ;;
+ esac])
+
dnl --- Done ---
mdw_MLIB(2.0.0)
unsigned long i;
gfreduce_instr *ip;
unsigned f = 0;
- size_t w, ww, wi, wl, ll;
+ size_t w, ww, wi, wl, ll, bb;
/* --- Sort out the easy stuff --- */
wi = DA_LEN(&iv);
f = 0;
ll = 0;
+ bb = MPW_BITS - dw;
for (i = 0, mp_scan(&sc, p); mp_step(&sc) && i < d; i++) {
if (!mp_bit(&sc))
continue;
w = ww;
wi = DA_LEN(&iv);
}
- INSTR(GFRI_LSL, (MPW_BITS + i - d)%MPW_BITS);
- if ((MPW_BITS + i - d)%MPW_BITS)
+ INSTR(GFRI_LSL, (bb + i)%MPW_BITS);
+ if ((bb + i)%MPW_BITS)
f |= f_lsr;
}
wl = DA_LEN(&iv);
ss = 0;
else {
mpw x = *v;
- mpw mask = MPW_MAX;
- unsigned z = MPW_BITS / 2;
+ unsigned z = MPW_P2;
+ mpw mask = ((mpw)1 << z) - 1;
while (z) {
- mask >>= z;
if (!(x & mask)) {
x >>= z;
ss += z;
}
z >>= 1;
+ mask >>= z;
}
}
instr_v iv = DA_INIT;
unsigned long d, i;
unsigned op;
- size_t w, b;
+ size_t w, b, bb;
/* --- Fill in the easy stuff --- */
st = Z;
#endif
+ bb = MPW_BITS - (d + 1)%MPW_BITS;
for (i = 0, mp_scan(&sc, p); i < d && mp_step(&sc); i++) {
switch (st | mp_bit(&sc)) {
case Z | 1: st = Z1; break;
case X0 | 0: st = Z; op = MPRI_SUB; goto instr;
instr:
w = (d - i)/MPW_BITS + 1;
- b = (MPW_BITS + i - d - 1)%MPW_BITS;
+ b = (bb + i)%MPW_BITS;
INSTR(op | !!b, w, b);
}
}
}
}
DA_DESTROY(&iv);
+
+#ifdef DEBUG
+ mpreduce_dump(r, stdout);
+#endif
return (0);
}
/*----- Header files ------------------------------------------------------*/
#define _GNU_SOURCE
+#include "config.h"
+
#include <stdio.h>
#include <limits.h>
#if __STDC_VERSION__ >= 199900l
itype *i;
itype *largest, *mpw, *mpd;
const static char *extstr = "CATACOMB_MPTYPES_EXTENSION ";
+ unsigned p2;
/* --- Find the bitcounts --- */
* which is twice as big as that one.
*/
+#if defined(FORCE_MPW_CUSSID)
+ largest = mpd = &tytab[3];
+ mpw = &tytab[2];
+ mpw->bits = 19; mpw->max = 0x7ffff;
+ mpd->bits = 38; mpd->max = 0x3fffffffffll;
+#elif defined(FORCE_MPW_SHORT)
+ largest = mpd = &tytab[2];
+ mpw = &tytab[1];
+ mpw->bits = 16; mpw->max = 0xffff;
+ mpd->bits = 32; mpd->max = 0xffffffff;
+#else
largest = tytab;
for (i = tytab; i->name; i++) {
if (i->bits > largest->bits)
d.bits = w.bits * 2; d.max = ~(~((umax)0) << d.bits);
mpw = &w; mpd = &d;
}
+#endif
+ for (p2 = 1; (p2 << 1) < mpw->bits; p2 <<= 1);
/* --- Output time --- */
printf("\
%stypedef %s mpw;\n\
#define MPW_BITS %u\n\
+#define MPW_P2 %u\n\
#define MPW_MAX %s%" P_UMAX "%s\n\
\n\
%stypedef %s mpd;\n\
#endif\n\
",
mpw->flags & f_ext ? extstr : "", mpw->name,
- mpw->bits,
+ mpw->bits, p2,
mpw->flags & f_ext ? extstr : "", mpw->max, mpw->suff,
mpd->flags & f_ext ? extstr : "", mpd->name,
mpd->bits,
while (avl > av) {
mpw t = *--avl;
- *--dvl = (t >> nr) | w;
+ *--dvl = MPW((t >> nr) | w);
w = t << nb;
}
- *--dvl = w;
+ *--dvl = MPW(w);
MPX_ZERO(dv, dvl);
}
while (avl > av) {
mpw t = *--avl;
- *--dvl = (t >> nr) | w;
+ *--dvl = MPW((t >> nr) | w);
w = t << nb;
}
- *--dvl = (MPW_MAX >> nr) | w;
+ *--dvl = MPW((MPW_MAX >> nr) | w);
MPX_ONE(dv, dvl);
}
a <<= o;
if (dv < dvl) {
- mpd x = (mpd)*dv - (mpd)a;
+ mpd x = (mpd)*dv - MPW(a);
*dv++ = MPW(x);
if (x >> MPW_BITS)
b++;
unsigned b;
d = dvl[-1];
- for (b = MPW_BITS / 2; b; b >>= 1) {
+ for (b = MPW_P2; b; b >>= 1) {
if (d <= (MPW_MAX >> b)) {
d <<= b;
norm += b;
else { \
unsigned long _b = MPW_BITS * (_vl - _v - 1) + 1; \
mpw _w = _vl[-1]; \
- unsigned _k = MPW_BITS / 2; \
+ unsigned _k = MPW_P2; \
while (_k) { \
if (_w >> _k) { \
_w >>= _k; \
0xc000 0x16cb3 0xacb3;
0x8000 0x345545 0x5545;
+ 0xfffef 0x100000 0x11;
+
+ 0x1ffffffe 0x26fc6567 0x6fc6569;
+ 0x3ffffffe 0x45445dc0 0x5445dc2;
+ 0x7ffffffe 0xd4827a70 0x54827a72;
+
0x72e2c37447f8bca34c4a39b130ea8e5c9a7d8b54564aa88ea773
0x367aa8f5ba9ac4e8e2ea198b8af2c3b3081deab392ffc05715783b245a62a6fa
0x08e8c03ebf398c63d71d8fd7ca4ece12367a8dde180ca650afb6;
ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff
7fffffffffffffffe487ed5110b4611a62633145c06e0e68948127044533e63a0105df531d89cd9128a5043cc71a026ef7ca8cd9e69d218d98158536f92f8a1ba7f09ab6b6a8e122f242dabb312f3f637a262174d31d1b107fffffffffffffff
02 01;
+
+ 26737e 0ffffc 02 067386;
}