divremtest.c revision 1.1 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <fcntl.h>
5 #include <stdint.h>
6
7 #define IM(x) ((intmax_t)(x))
8 #define UIM(x) ((uintmax_t)(x))
9
10 #define TEST(id, a, b, c) \
11 if (b) { \
12 c = (a) / (b); \
13 printf(id "%16jx / %16jx => %16jx\n", UIM(a), UIM(b), UIM(c)); \
14 c = (a) % (b); \
15 printf(id "%16jx / %16jx => %16jx\n", UIM(a), UIM(b), UIM(c)); \
16 }
17
18
19 int main(int ac, char **av)
20 {
21 int32_t sr32;
22 uint32_t ur32;
23 intmax_t sr64;
24 uintmax_t ur64;
25 int i, j, k, l;
26
27 for(i = 0; i <= 31; ++i) {
28 for(j = 0; j <= 31; ++j) {
29 for(k = -1; k <= 1; ++k) {
30 for(l = -1; l <= 1; ++l) {
31 TEST("32 ", (1 << i) + k, (1 << j) + l, sr32);
32 TEST("32 ", (1 << i) + k, -(1 << j) + l, sr32);
33 TEST("32 ", -(1 << i) + k, (1 << j) + l, sr32);
34 TEST("32 ", -(1 << i) + k, -(1 << j) + l, sr32);
35 if (k < 0 && 1U << i < abs(k) ||
36 l < 0 && 1U << j < abs(l))
37 continue;
38 TEST("32U", (1U << i) + k, (1U << j) + l, ur32);
39 }
40 }
41 }
42 }
43 if (sizeof(intmax_t) == 4)
44 exit(0);
45 for(i = 0; i <= 63; ++i) {
46 for(j = 0; j <= 63; ++j) {
47 for(k = -1; k <= 1; ++k) {
48 for(l = -1; l <= 1; ++l) {
49 TEST("64 ", (IM(1) << i) + k, (IM(1) << j) + l, sr64);
50 TEST("64 ", (IM(1) << i) + k, -(IM(1) << j) + l, sr64);
51 TEST("64 ", -(IM(1) << i) + k, (IM(1) << j) + l, sr64);
52 TEST("64 ", -(IM(1) << i) + k, -(IM(1) << j) + l, sr64);
53 if (k < 0 && UIM(1U) << i < abs(k) ||
54 l < 0 && UIM(1U) << j < abs(l))
55 continue;
56 TEST("64U", (UIM(1U) << i) + k, (UIM(1U) << j) + l, ur64);
57 }
58 }
59 }
60 }
61 exit(0);
62 return 0;
63 }
64