From 9165a03918ab72424239800a5825c16277b5ea37 Mon Sep 17 00:00:00 2001 From: Jacob Lifshay Date: Thu, 21 Apr 2022 20:02:50 -0700 Subject: [PATCH] convert divmnu64.c tests to be easier to understand --- openpower/sv/biginteger/divmnu64.c | 98 +++++++++++++++--------------- 1 file changed, 48 insertions(+), 50 deletions(-) diff --git a/openpower/sv/biginteger/divmnu64.c b/openpower/sv/biginteger/divmnu64.c index eb157139d..99aa20c56 100644 --- a/openpower/sv/biginteger/divmnu64.c +++ b/openpower/sv/biginteger/divmnu64.c @@ -381,62 +381,62 @@ void check(unsigned q[], unsigned r[], unsigned u[], unsigned v[], int m, 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); @@ -445,8 +445,6 @@ int main() } 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); -- 2.30.2