2 * Generate random test vectors for 64-bit operations.
4 * As an independent reference, we use the Catacomb multiprecision integer
10 #include <catacomb/mp.h>
11 #include <catacomb/mprand.h>
12 #include <catacomb/fibrand.h>
19 static mp
*mp_rol(mp
*d
, mp
*x
, unsigned s
)
21 mp
*l
= mp_lsl(MP_NEW
, x
, s
);
22 mp
*r
= mp_lsr(MP_NEW
, x
, 64 - s
);
29 static mp
*mp_ror(mp
*d
, mp
*x
, unsigned s
)
31 mp
*l
= mp_lsl(MP_NEW
, x
, 64 - s
);
32 mp
*r
= mp_lsr(MP_NEW
, x
, s
);
39 static void putmp(mp
*x
)
44 mp_storeb(x
, buf
, sizeof(buf
));
45 for (i
= 0; i
< sizeof(buf
); i
++)
46 printf("%02x", buf
[i
]);
49 #define GEN_SHIFT(op) \
51 static void gen_##op(void) \
54 fputs("\n" #op "64 {\n", stdout); \
55 for (i = 0; i < NVEC; i++) { \
56 mp *x = mprand_range(MP_NEW, m64, r, 0); \
57 unsigned s = r->ops->range(r, 70), ss = s & 63; \
58 mp *y = mp_##op(MP_NEW, x, ss); \
59 mp_div(0, &y, y, m64); \
62 putmp(x); printf(" %2u", s); putmp(y); \
63 fputs(";\n", stdout); \
64 mp_drop(x); mp_drop(y); \
66 for (i = 0; i < 4; i++) { \
67 mp *x = mprand_range(MP_NEW, m64, r, 0); \
68 mp *y = mp_##op(MP_NEW, x, 32); \
69 mp_div(0, &y, y, m64); \
72 putmp(x); printf(" 32"); putmp(y); \
73 fputs(";\n", stdout); \
74 mp_drop(x); mp_drop(y); \
76 fputs("}\n", stdout); \
79 #define GEN_ARITH(op) \
81 static void gen_##op(void) \
84 fputs("\n" #op "64 {\n", stdout); \
85 for (i = 0; i < NVEC; i++) { \
86 mp *x = mprand_range(MP_NEW, m64, r, 0); \
87 mp *y = mprand_range(MP_NEW, m64, r, 0); \
88 mp *z = mp_##op(MP_NEW, x, y); \
89 mp_div(0, &z, z, m64); \
92 putmp(x); putmp(y); putmp(z); \
93 fputs(";\n", stdout); \
94 mp_drop(x); mp_drop(y); mp_drop(z); \
96 fputs("}\n", stdout); \
108 m64
= mp_lsl(MP_NEW
, MP_ONE
, 64);
109 r
= fibrand_create(0);
110 fputs("# Test vectors for 64-bit operations [generated]\n", stdout
);