3 * $Id: mpx-test.c,v 1.1 1999/11/13 01:50:04 mdw Exp $
10 #include <mLib/alloc.h>
11 #include <mLib/dstr.h>
12 #include <mLib/quis.h>
13 #include <mLib/testrig.h>
18 #define ALLOC(v, vl, sz) do { \
20 mpw *_vv = xmalloc(MPWS(_sz)); \
21 mpw *_vvl = _vv + _sz; \
26 #define LOAD(v, vl, d) do { \
27 const dstr *_d = (d); \
29 ALLOC(_v, _vl, MPW_RQ(_d->len)); \
30 mpx_loadb(_v, _vl, _d->buf, _d->len); \
35 #define MAX(x, y) ((x) > (y) ? (x) : (y))
37 static void dumpbits(const char *msg
, const void *pp
, size_t sz
)
42 fprintf(stderr
, " %02x", *p
++);
46 static void dumpmp(const char *msg
, const mpw
*v
, const mpw
*vl
)
51 fprintf(stderr
, " %08lx", (unsigned long)*--vl
);
55 static int chkscan(const mpw
*v
, const mpw
*vl
,
56 const void *pp
, size_t sz
, int step
)
63 mpscan_initx(&mps
, v
, vl
);
68 for (i
= 0; i
< 8 && MPSCAN_STEP(&mps
); i
++) {
69 if (MPSCAN_BIT(&mps
) != (x
& 1)) {
71 "\n*** error, step %i, bit %u, expected %u, found %u\n",
72 step
, bit
, x
& 1, MPSCAN_BIT(&mps
));
84 static int loadstore(dstr
*v
)
87 size_t sz
= MPW_RQ(v
->len
) * 2, diff
;
91 dstr_ensure(&d
, v
->len
);
92 m
= xmalloc(MPWS(sz
));
94 for (diff
= 0; diff
< sz
; diff
+= 5) {
99 mpx_loadl(m
, ml
, v
->buf
, v
->len
);
100 if (!chkscan(m
, ml
, v
->buf
, v
->len
, +1))
102 MPX_OCTETS(oct
, m
, ml
);
103 mpx_storel(m
, ml
, d
.buf
, d
.sz
);
104 if (memcmp(d
.buf
, v
->buf
, oct
) != 0) {
105 dumpbits("\n*** storel failed", d
.buf
, d
.sz
);
109 mpx_loadb(m
, ml
, v
->buf
, v
->len
);
110 if (!chkscan(m
, ml
, v
->buf
+ v
->len
- 1, v
->len
, -1))
112 MPX_OCTETS(oct
, m
, ml
);
113 mpx_storeb(m
, ml
, d
.buf
, d
.sz
);
114 if (memcmp(d
.buf
+ d
.sz
- oct
, v
->buf
+ v
->len
- oct
, oct
) != 0) {
115 dumpbits("\n*** storeb failed", d
.buf
, d
.sz
);
121 dumpbits("input data", v
->buf
, v
->len
);
128 static int lsl(dstr
*v
)
131 int n
= *(int *)v
[1].buf
;
138 ALLOC(d
, dl
, al
- a
+ (n
+ MPW_BITS
- 1) / MPW_BITS
);
140 mpx_lsl(d
, dl
, a
, al
, n
);
141 if (MPX_UCMP(d
, dl
, !=, c
, cl
)) {
142 fprintf(stderr
, "\n*** lsl(%i) failed\n", n
);
144 dumpmp("expected", c
, cl
);
145 dumpmp(" result", d
, dl
);
149 free(a
); free(c
); free(d
);
153 static int lsr(dstr
*v
)
156 int n
= *(int *)v
[1].buf
;
163 ALLOC(d
, dl
, al
- a
+ (n
+ MPW_BITS
- 1) / MPW_BITS
+ 1);
165 mpx_lsr(d
, dl
, a
, al
, n
);
166 if (MPX_UCMP(d
, dl
, !=, c
, cl
)) {
167 fprintf(stderr
, "\n*** lsr(%i) failed\n", n
);
169 dumpmp("expected", c
, cl
);
170 dumpmp(" result", d
, dl
);
174 free(a
); free(c
); free(d
);
178 static int uadd(dstr
*v
)
189 ALLOC(d
, dl
, MAX(al
- a
, bl
- b
) + 1);
191 mpx_uadd(d
, dl
, a
, al
, b
, bl
);
192 if (MPX_UCMP(d
, dl
, !=, c
, cl
)) {
193 fprintf(stderr
, "\n*** uadd failed\n");
196 dumpmp("expected", c
, cl
);
197 dumpmp(" result", d
, dl
);
201 free(a
); free(b
); free(c
); free(d
);
205 static int usub(dstr
*v
)
216 ALLOC(d
, dl
, al
- a
);
218 mpx_usub(d
, dl
, a
, al
, b
, bl
);
219 if (MPX_UCMP(d
, dl
, !=, c
, cl
)) {
220 fprintf(stderr
, "\n*** usub failed\n");
223 dumpmp("expected", c
, cl
);
224 dumpmp(" result", d
, dl
);
228 free(a
); free(b
); free(c
); free(d
);
232 static int umul(dstr
*v
)
243 ALLOC(d
, dl
, (al
- a
) + (bl
- b
));
245 mpx_umul(d
, dl
, a
, al
, b
, bl
);
246 if (MPX_UCMP(d
, dl
, !=, c
, cl
)) {
247 fprintf(stderr
, "\n*** umul failed\n");
250 dumpmp("expected", c
, cl
);
251 dumpmp(" result", d
, dl
);
255 free(a
); free(b
); free(c
); free(d
);
259 static int usqr(dstr
*v
)
268 ALLOC(d
, dl
, 2 * (al
- a
));
270 mpx_usqr(d
, dl
, a
, al
);
271 if (MPX_UCMP(d
, dl
, !=, c
, cl
)) {
272 fprintf(stderr
, "\n*** usqr failed\n");
274 dumpmp("expected", c
, cl
);
275 dumpmp(" result", d
, dl
);
279 free(a
); free(c
); free(d
);
283 static int udiv(dstr
*v
)
293 ALLOC(a
, al
, MPW_RQ(v
[0].len
) + 2); mpx_loadb(a
, al
, v
[0].buf
, v
[0].len
);
297 ALLOC(qq
, qql
, al
- a
);
298 ALLOC(s
, sl
, 2 * (bl
- b
) + 2);
300 mpx_udiv(qq
, qql
, a
, al
, b
, bl
, s
, sl
);
301 if (MPX_UCMP(qq
, qql
, !=, q
, ql
) ||
302 MPX_UCMP(a
, al
, !=, r
, rl
)) {
303 fprintf(stderr
, "\n*** udiv failed\n");
304 dumpmp(" divisor", b
, bl
);
305 dumpmp("expect r", r
, rl
);
306 dumpmp("result r", a
, al
);
307 dumpmp("expect q", q
, ql
);
308 dumpmp("result q", qq
, qql
);
312 free(a
); free(b
); free(r
); free(q
); free(s
); free(qq
);
316 static test_chunk defs
[] = {
317 { "load-store", loadstore
, { &type_hex
, 0 } },
318 { "lsl", lsl
, { &type_hex
, &type_int
, &type_hex
, 0 } },
319 { "lsr", lsr
, { &type_hex
, &type_int
, &type_hex
, 0 } },
320 { "uadd", uadd
, { &type_hex
, &type_hex
, &type_hex
, 0 } },
321 { "usub", usub
, { &type_hex
, &type_hex
, &type_hex
, 0 } },
322 { "umul", umul
, { &type_hex
, &type_hex
, &type_hex
, 0 } },
323 { "usqr", usqr
, { &type_hex
, &type_hex
, 0 } },
324 { "udiv", udiv
, { &type_hex
, &type_hex
, &type_hex
, &type_hex
, 0 } },
328 int main(int argc
, char *argv
[])
330 test_run(argc
, argv
, defs
, SRCDIR
"/tests/mpx");