123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #include "main.h"
- #include <Eigen/CXX11/Tensor>
- void test_signed_32bit()
- {
-
- const Eigen::internal::TensorIntDivisor<int32_t, false> div_by_one(1);
- for (int32_t j = 0; j < 25000; ++j) {
- const int32_t fast_div = j / div_by_one;
- const int32_t slow_div = j / 1;
- VERIFY_IS_EQUAL(fast_div, slow_div);
- }
-
- for (int32_t i = 2; i < 25000; ++i) {
- const Eigen::internal::TensorIntDivisor<int32_t, false> div(i);
- for (int32_t j = 0; j < 25000; ++j) {
- const int32_t fast_div = j / div;
- const int32_t slow_div = j / i;
- VERIFY_IS_EQUAL(fast_div, slow_div);
- }
- }
-
- for (int32_t i = 2; i < 25000; ++i) {
- const Eigen::internal::TensorIntDivisor<int32_t, true> div(i);
- for (int32_t j = 0; j < 25000; ++j) {
- const int32_t fast_div = j / div;
- const int32_t slow_div = j / i;
- VERIFY_IS_EQUAL(fast_div, slow_div);
- }
- }
- }
- void test_unsigned_32bit()
- {
- for (uint32_t i = 1; i < 25000; ++i) {
- const Eigen::internal::TensorIntDivisor<uint32_t> div(i);
- for (uint32_t j = 0; j < 25000; ++j) {
- const uint32_t fast_div = j / div;
- const uint32_t slow_div = j / i;
- VERIFY_IS_EQUAL(fast_div, slow_div);
- }
- }
- }
- void test_signed_64bit()
- {
- for (int64_t i = 1; i < 25000; ++i) {
- const Eigen::internal::TensorIntDivisor<int64_t> div(i);
- for (int64_t j = 0; j < 25000; ++j) {
- const int64_t fast_div = j / div;
- const int64_t slow_div = j / i;
- VERIFY_IS_EQUAL(fast_div, slow_div);
- }
- }
- }
- void test_unsigned_64bit()
- {
- for (uint64_t i = 1; i < 25000; ++i) {
- const Eigen::internal::TensorIntDivisor<uint64_t> div(i);
- for (uint64_t j = 0; j < 25000; ++j) {
- const uint64_t fast_div = j / div;
- const uint64_t slow_div = j / i;
- VERIFY_IS_EQUAL(fast_div, slow_div);
- }
- }
- }
- void test_powers_32bit() {
- for (int expon = 1; expon < 31; expon++) {
- int32_t div = (1 << expon);
- for (int num_expon = 0; num_expon < 32; num_expon++) {
- int32_t start_num = (1 << num_expon) - 100;
- int32_t end_num = (1 << num_expon) + 100;
- if (start_num < 0)
- start_num = 0;
- for (int32_t num = start_num; num < end_num; num++) {
- Eigen::internal::TensorIntDivisor<int32_t> divider =
- Eigen::internal::TensorIntDivisor<int32_t>(div);
- int32_t result = num/div;
- int32_t result_op = divider.divide(num);
- VERIFY_IS_EQUAL(result_op, result);
- }
- }
- }
- }
- void test_powers_64bit() {
- for (int expon = 0; expon < 63; expon++) {
- int64_t div = (1ull << expon);
- for (int num_expon = 0; num_expon < 63; num_expon++) {
- int64_t start_num = (1ull << num_expon) - 10;
- int64_t end_num = (1ull << num_expon) + 10;
- if (start_num < 0)
- start_num = 0;
- for (int64_t num = start_num; num < end_num; num++) {
- Eigen::internal::TensorIntDivisor<int64_t> divider(div);
- int64_t result = num/div;
- int64_t result_op = divider.divide(num);
- VERIFY_IS_EQUAL(result_op, result);
- }
- }
- }
- }
- void test_specific() {
-
- int64_t div = 209715200;
- int64_t num = 3238002688ll;
- Eigen::internal::TensorIntDivisor<int64_t> divider(div);
- int64_t result = num/div;
- int64_t result_op = divider.divide(num);
- VERIFY_IS_EQUAL(result, result_op);
- }
- EIGEN_DECLARE_TEST(cxx11_tensor_intdiv)
- {
- CALL_SUBTEST_1(test_signed_32bit());
- CALL_SUBTEST_2(test_unsigned_32bit());
- CALL_SUBTEST_3(test_signed_64bit());
- CALL_SUBTEST_4(test_unsigned_64bit());
- CALL_SUBTEST_5(test_powers_32bit());
- CALL_SUBTEST_6(test_powers_64bit());
- CALL_SUBTEST_7(test_specific());
- }
|