convert divmnu64.c tests to be easier to understand
authorJacob Lifshay <programmerjake@gmail.com>
Fri, 22 Apr 2022 03:02:50 +0000 (20:02 -0700)
committerJacob Lifshay <programmerjake@gmail.com>
Fri, 22 Apr 2022 03:02:50 +0000 (20:02 -0700)
openpower/sv/biginteger/divmnu64.c

index eb157139d6c6907c384f150ef5bde81e340f0efd..99aa20c561d7d34d01bb4b4130c0961e9c000d5c 100644 (file)
@@ -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);