Home | History | Annotate | Line # | Download | only in divrem
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