| 1 |
#include "catch.hpp" |
| 2 |
#include "DivModByConst.hh" |
| 3 |
#include "DivModBySame.hh" |
| 4 |
|
| 5 |
using namespace openmsx; |
| 6 |
|
| 7 |
template<uint32_t DIVISOR> |
| 8 |
static void test(const DivModByConst<DIVISOR>& c, const DivModBySame& s, |
| 9 |
uint64_t dividend) |
| 10 |
{ |
| 11 |
uint64_t rd = dividend / DIVISOR; |
| 12 |
if (uint32_t(rd) == rd) { |
| 13 |
CHECK(c.div(dividend) == (dividend / DIVISOR)); |
| 14 |
CHECK(s.div(dividend) == (dividend / DIVISOR)); |
| 15 |
CHECK(c.mod(dividend) == (dividend % DIVISOR)); |
| 16 |
CHECK(s.mod(dividend) == (dividend % DIVISOR)); |
| 17 |
} |
| 18 |
} |
| 19 |
|
| 20 |
template<uint32_t DIVISOR> |
| 21 |
static void test() |
| 22 |
{ |
| 23 |
DivModByConst<DIVISOR> c; |
| 24 |
DivModBySame s; s.setDivisor(DIVISOR); |
| 25 |
|
| 26 |
for (uint64_t dividend : {0ULL, 1ULL, 2ULL, 3ULL, 4ULL, 5ULL, 7ULL, |
| 27 |
100ULL, 10015ULL, 12410015ULL, 0x1234567890ULL, |
| 28 |
0x7FFFFFFFFFFFFFFFULL, 0x8000000000000000ULL, |
| 29 |
0xFFFFFFFF00000000ULL, 0xFFFFFFFFFFFFFFFFULL}) { |
| 30 |
test(c, s, dividend); |
| 31 |
} |
| 32 |
} |
| 33 |
|
| 34 |
TEST_CASE("DivModByConst, DivModBySame") |
| 35 |
{ |
| 36 |
test<1>(); |
| 37 |
test<2>(); |
| 38 |
test<3>(); |
| 39 |
test<4>(); |
| 40 |
test<5>(); |
| 41 |
test<7>(); |
| 42 |
test<10>(); |
| 43 |
test<128>(); |
| 44 |
test<1000>(); |
| 45 |
test<90000>(); |
| 46 |
test<90017>(); |
| 47 |
} |