int main()
{
- static unsigned test[] = {
+ static struct
+ {
+ int m, n;
+ uint32_t u[10], v[10], cq[10], cr[10];
+ } test[] = {
// clang-format off
- // m, n, u..., v..., cq..., cr....
- 1, 1, 3, 0, 1, 1, // Error, divide by 0.
- 1, 2, 7, 1,3, 0, 7,0, // Error, n > m.
- 2, 2, 0,0, 1,0, 0, 0,0, // Error, incorrect remainder cr.
- 1, 1, 3, 2, 1, 1,
- 1, 1, 3, 3, 1, 0,
- 1, 1, 3, 4, 0, 3,
- 1, 1, 0, 0xffffffff, 0, 0,
- 1, 1, 0xffffffff, 1, 0xffffffff, 0,
- 1, 1, 0xffffffff, 0xffffffff, 1, 0,
- 1, 1, 0xffffffff, 3, 0x55555555, 0,
- 2, 1, 0xffffffff,0xffffffff, 1, 0xffffffff,0xffffffff, 0,
- 2, 1, 0xffffffff,0xffffffff, 0xffffffff, 1,1, 0,
- 2, 1, 0xffffffff,0xfffffffe, 0xffffffff, 0xffffffff,0, 0xfffffffe,
- 2, 1, 0x00005678,0x00001234, 0x00009abc, 0x1e1dba76,0, 0x6bd0,
- 2, 2, 0,0, 0,1, 0, 0,0,
- 2, 2, 0,7, 0,3, 2, 0,1,
- 2, 2, 5,7, 0,3, 2, 5,1,
- 2, 2, 0,6, 0,2, 3, 0,0,
- 1, 1, 0x80000000, 0x40000001, 0x00000001, 0x3fffffff,
- 2, 1, 0x00000000,0x80000000, 0x40000001, 0xfffffff8,0x00000001, 0x00000008,
- 2, 2, 0x00000000,0x80000000, 0x00000001,0x40000000, 0x00000001, 0xffffffff,0x3fffffff,
- 2, 2, 0x0000789a,0x0000bcde, 0x0000789a,0x0000bcde, 1, 0,0,
- 2, 2, 0x0000789b,0x0000bcde, 0x0000789a,0x0000bcde, 1, 1,0,
- 2, 2, 0x00007899,0x0000bcde, 0x0000789a,0x0000bcde, 0, 0x00007899,0x0000bcde,
- 2, 2, 0x0000ffff,0x0000ffff, 0x0000ffff,0x0000ffff, 1, 0,0,
- 2, 2, 0x0000ffff,0x0000ffff, 0x00000000,0x00000001, 0x0000ffff, 0x0000ffff,0,
- 3, 2, 0x000089ab,0x00004567,0x00000123, 0x00000000,0x00000001, 0x00004567,0x00000123, 0x000089ab,0,
- 3, 2, 0x00000000,0x0000fffe,0x00008000, 0x0000ffff,0x00008000, 0xffffffff,0x00000000, 0x0000ffff,0x00007fff, // Shows that first qhat can = b + 1.
- 3, 3, 0x00000003,0x00000000,0x80000000, 0x00000001,0x00000000,0x20000000, 0x00000003, 0,0,0x20000000, // Adding back step req'd.
- 3, 3, 0x00000003,0x00000000,0x00008000, 0x00000001,0x00000000,0x00002000, 0x00000003, 0,0,0x00002000, // Adding back step req'd.
- 4, 3, 0,0,0x00008000,0x00007fff, 1,0,0x00008000, 0xfffe0000,0, 0x00020000,0xffffffff,0x00007fff, // Add back req'd.
- 4, 3, 0,0x0000fffe,0,0x00008000, 0x0000ffff,0,0x00008000, 0xffffffff,0, 0x0000ffff,0xffffffff,0x00007fff, // Shows that mult-sub quantity cannot be treated as signed.
- 4, 3, 0,0xfffffffe,0,0x80000000, 0x0000ffff,0,0x80000000, 0x00000000,1, 0x00000000,0xfffeffff,0x00000000, // Shows that mult-sub quantity cannot be treated as signed.
- 4, 3, 0,0xfffffffe,0,0x80000000, 0xffffffff,0,0x80000000, 0xffffffff,0, 0xffffffff,0xffffffff,0x7fffffff, // Shows that mult-sub quantity cannot be treated as signed.
+ {.m=1, .n=1, .u={3}, .v={0}, .cq={1}, .cr={1}}, // Error, divide by 0.
+ {.m=1, .n=2, .u={7}, .v={1,3}, .cq={0}, .cr={7,0}}, // Error, n > m.
+ {.m=2, .n=2, .u={0,0}, .v={1,0}, .cq={0}, .cr={0,0}}, // Error, incorrect remainder cr.
+ {.m=1, .n=1, .u={3}, .v={2}, .cq={1}, .cr={1}},
+ {.m=1, .n=1, .u={3}, .v={3}, .cq={1}, .cr={0}},
+ {.m=1, .n=1, .u={3}, .v={4}, .cq={0}, .cr={3}},
+ {.m=1, .n=1, .u={0}, .v={0xffffffff}, .cq={0}, .cr={0}},
+ {.m=1, .n=1, .u={0xffffffff}, .v={1}, .cq={0xffffffff}, .cr={0}},
+ {.m=1, .n=1, .u={0xffffffff}, .v={0xffffffff}, .cq={1}, .cr={0}},
+ {.m=1, .n=1, .u={0xffffffff}, .v={3}, .cq={0x55555555}, .cr={0}},
+ {.m=2, .n=1, .u={0xffffffff,0xffffffff}, .v={1}, .cq={0xffffffff,0xffffffff}, .cr={0}},
+ {.m=2, .n=1, .u={0xffffffff,0xffffffff}, .v={0xffffffff}, .cq={1,1}, .cr={0}},
+ {.m=2, .n=1, .u={0xffffffff,0xfffffffe}, .v={0xffffffff}, .cq={0xffffffff,0}, .cr={0xfffffffe}},
+ {.m=2, .n=1, .u={0x00005678,0x00001234}, .v={0x00009abc}, .cq={0x1e1dba76,0}, .cr={0x6bd0}},
+ {.m=2, .n=2, .u={0,0}, .v={0,1}, .cq={0}, .cr={0,0}},
+ {.m=2, .n=2, .u={0,7}, .v={0,3}, .cq={2}, .cr={0,1}},
+ {.m=2, .n=2, .u={5,7}, .v={0,3}, .cq={2}, .cr={5,1}},
+ {.m=2, .n=2, .u={0,6}, .v={0,2}, .cq={3}, .cr={0,0}},
+ {.m=1, .n=1, .u={0x80000000}, .v={0x40000001}, .cq={0x00000001}, .cr={0x3fffffff}},
+ {.m=2, .n=1, .u={0x00000000,0x80000000}, .v={0x40000001}, .cq={0xfffffff8,0x00000001}, .cr={0x00000008}},
+ {.m=2, .n=2, .u={0x00000000,0x80000000}, .v={0x00000001,0x40000000}, .cq={0x00000001}, .cr={0xffffffff,0x3fffffff}},
+ {.m=2, .n=2, .u={0x0000789a,0x0000bcde}, .v={0x0000789a,0x0000bcde}, .cq={1}, .cr={0,0}},
+ {.m=2, .n=2, .u={0x0000789b,0x0000bcde}, .v={0x0000789a,0x0000bcde}, .cq={1}, .cr={1,0}},
+ {.m=2, .n=2, .u={0x00007899,0x0000bcde}, .v={0x0000789a,0x0000bcde}, .cq={0}, .cr={0x00007899,0x0000bcde}},
+ {.m=2, .n=2, .u={0x0000ffff,0x0000ffff}, .v={0x0000ffff,0x0000ffff}, .cq={1}, .cr={0,0}},
+ {.m=2, .n=2, .u={0x0000ffff,0x0000ffff}, .v={0x00000000,0x00000001}, .cq={0x0000ffff}, .cr={0x0000ffff,0}},
+ {.m=3, .n=2, .u={0x000089ab,0x00004567,0x00000123}, .v={0x00000000,0x00000001}, .cq={0x00004567,0x00000123}, .cr={0x000089ab,0}},
+ {.m=3, .n=2, .u={0x00000000,0x0000fffe,0x00008000}, .v={0x0000ffff,0x00008000}, .cq={0xffffffff,0x00000000}, .cr={0x0000ffff,0x00007fff}}, // Shows that first qhat can = b + 1.
+ {.m=3, .n=3, .u={0x00000003,0x00000000,0x80000000}, .v={0x00000001,0x00000000,0x20000000}, .cq={0x00000003}, .cr={0,0,0x20000000}}, // Adding back step req'd.
+ {.m=3, .n=3, .u={0x00000003,0x00000000,0x00008000}, .v={0x00000001,0x00000000,0x00002000}, .cq={0x00000003}, .cr={0,0,0x00002000}}, // Adding back step req'd.
+ {.m=4, .n=3, .u={0,0,0x00008000,0x00007fff}, .v={1,0,0x00008000}, .cq={0xfffe0000,0}, .cr={0x00020000,0xffffffff,0x00007fff}}, // Add back req'd.
+ {.m=4, .n=3, .u={0,0x0000fffe,0,0x00008000}, .v={0x0000ffff,0,0x00008000}, .cq={0xffffffff,0}, .cr={0x0000ffff,0xffffffff,0x00007fff}}, // Shows that mult-sub quantity cannot be treated as signed.
+ {.m=4, .n=3, .u={0,0xfffffffe,0,0x80000000}, .v={0x0000ffff,0,0x80000000}, .cq={0x00000000,1}, .cr={0x00000000,0xfffeffff,0x00000000}}, // Shows that mult-sub quantity cannot be treated as signed.
+ {.m=4, .n=3, .u={0,0xfffffffe,0,0x80000000}, .v={0xffffffff,0,0x80000000}, .cq={0xffffffff,0}, .cr={0xffffffff,0xffffffff,0x7fffffff}}, // Shows that mult-sub quantity cannot be treated as signed.
// clang-format on
};
- int i, n, m, ncases, f;
+ const int ncases = sizeof(test) / sizeof(test[0]);
unsigned q[10], r[10];
- unsigned *u, *v, *cq, *cr;
printf("divmnu:\n");
- i = 0;
- ncases = 0;
- while (i < sizeof(test) / 4)
+ for (int i = 0; i < ncases; i++)
{
- m = test[i];
- n = test[i + 1];
- u = &test[i + 2];
- v = &test[i + 2 + m];
- cq = &test[i + 2 + m + n];
- cr = &test[i + 2 + m + n + max(m - n + 1, 1)];
+ int m = test[i].m;
+ int n = test[i].n;
+ uint32_t *u = test[i].u;
+ uint32_t *v = test[i].v;
+ uint32_t *cq = test[i].cq;
+ uint32_t *cr = test[i].cr;
- f = divmnu(q, r, u, v, m, n);
+ int f = divmnu(q, r, u, v, m, n);
if (f)
{
dumpit("Error return code for dividend u =", m, u);
}
else
check(q, r, u, v, m, n, cq, cr);
- i = i + 2 + m + n + max(m - n + 1, 1) + n;
- ncases = ncases + 1;
}
printf("%d errors out of %d cases; there should be 3.\n", errors, ncases);