#include #include #include #include #include "reciprocal_div64.h" int main(int argc, char *argv[]) { struct reciprocal_value64 recip; uint64_t dividend; uint64_t divisor; uint64_t ret; uint64_t retrecip; uint64_t i; if (argc != 4) _exit(1); dividend = atoll(argv[1]); divisor = atoll(argv[2]); if (divisor == 0) _exit(1); i = atoll(argv[3]); for (; i > 0; i--) { if (divisor == 0) continue; recip = reciprocal_value64(divisor); retrecip = reciprocal_divide64(dividend, recip); ret = dividend / divisor; if (ret != retrecip) { fprintf(stderr, "[div] dividend=%lu divisor=%lu recip={%lu, %u, %u}] %lu (correct: %lu)\n", dividend, divisor, recip.m, recip.sh1, recip.sh2, retrecip, ret); } recip = reciprocal_value64(divisor); retrecip = reciprocal_remainder64(dividend, divisor, recip); ret = dividend % divisor; if (ret != retrecip) { fprintf(stderr, "[mod] dividend=%lu divisor=%lu recip=%lu] %lu (correct: %lu)\n", dividend, divisor, recip.m, retrecip, ret); } #if 0 dividend++; #else divisor++; #endif } return 0; }