12 #include <Eigen/CXX11/Tensor> 15 #if EIGEN_COMP_MSVC || !defined(__SIZEOF_INT128__) 16 #define EIGEN_NO_INT128 18 typedef __uint128_t uint128_t;
22 #ifndef EIGEN_NO_INT128 27 void VERIFY_EQUAL(TensorUInt128<uint64_t, uint64_t> actual, uint128_t
expected) {
29 bool matchh = actual.upper() ==
static_cast<uint64_t>(expected >> 64);
30 if (!matchl || !matchh) {
32 std::cerr <<
"Test " << testname <<
" failed in " << __FILE__
33 <<
" (" << __LINE__ <<
")" 41 uint64_t incr = internal::random<uint64_t>(1, 9999999999);
42 for (
uint64_t i1 = 0; i1 < 100; ++i1) {
43 for (
uint64_t i2 = 1; i2 < 100 * incr; i2 += incr) {
44 TensorUInt128<uint64_t, uint64_t>
i(i1, i2);
45 uint128_t
a = (
static_cast<uint128_t
>(i1) << 64) +
static_cast<uint128_t
>(i2);
46 for (
uint64_t j1 = 0; j1 < 100; ++j1) {
47 for (
uint64_t j2 = 1; j2 < 100 * incr; j2 += incr) {
48 TensorUInt128<uint64_t, uint64_t>
j(j1, j2);
49 uint128_t
b = (
static_cast<uint128_t
>(j1) << 64) +
static_cast<uint128_t
>(j2);
50 TensorUInt128<uint64_t, uint64_t> actual = i +
j;
52 VERIFY_EQUAL(actual, expected);
60 uint64_t incr = internal::random<uint64_t>(1, 9999999999);
61 for (
uint64_t i1 = 0; i1 < 100; ++i1) {
62 for (
uint64_t i2 = 1; i2 < 100 * incr; i2 += incr) {
63 TensorUInt128<uint64_t, uint64_t>
i(i1, i2);
64 uint128_t
a = (
static_cast<uint128_t
>(i1) << 64) +
static_cast<uint128_t
>(i2);
65 for (
uint64_t j1 = 0; j1 < 100; ++j1) {
66 for (
uint64_t j2 = 1; j2 < 100 * incr; j2 += incr) {
67 TensorUInt128<uint64_t, uint64_t>
j(j1, j2);
68 uint128_t
b = (
static_cast<uint128_t
>(j1) << 64) +
static_cast<uint128_t
>(j2);
69 TensorUInt128<uint64_t, uint64_t> actual = i -
j;
71 VERIFY_EQUAL(actual, expected);
79 uint64_t incr = internal::random<uint64_t>(1, 9999999999);
80 for (
uint64_t i1 = 0; i1 < 100; ++i1) {
81 for (
uint64_t i2 = 1; i2 < 100 * incr; i2 += incr) {
82 TensorUInt128<uint64_t, uint64_t>
i(i1, i2);
83 uint128_t
a = (
static_cast<uint128_t
>(i1) << 64) +
static_cast<uint128_t
>(i2);
84 for (
uint64_t j1 = 0; j1 < 100; ++j1) {
85 for (
uint64_t j2 = 1; j2 < 100 * incr; j2 += incr) {
86 TensorUInt128<uint64_t, uint64_t>
j(j1, j2);
87 uint128_t
b = (
static_cast<uint128_t
>(j1) << 64) +
static_cast<uint128_t
>(j2);
88 TensorUInt128<uint64_t, uint64_t> actual = i *
j;
90 VERIFY_EQUAL(actual, expected);
98 uint64_t incr = internal::random<uint64_t>(1, 9999999999);
99 for (
uint64_t i1 = 0; i1 < 100; ++i1) {
100 for (
uint64_t i2 = 1; i2 < 100 * incr; i2 += incr) {
101 TensorUInt128<uint64_t, uint64_t>
i(i1, i2);
102 uint128_t
a = (
static_cast<uint128_t
>(i1) << 64) +
static_cast<uint128_t
>(i2);
103 for (
uint64_t j1 = 0; j1 < 100; ++j1) {
104 for (
uint64_t j2 = 1; j2 < 100 * incr; j2 += incr) {
105 TensorUInt128<uint64_t, uint64_t>
j(j1, j2);
106 uint128_t
b = (
static_cast<uint128_t
>(j1) << 64) +
static_cast<uint128_t
>(j2);
107 TensorUInt128<uint64_t, uint64_t> actual = i /
j;
109 VERIFY_EQUAL(actual, expected);
117 uint64_t incr = internal::random<uint64_t>(1, 9999999999);
118 for (
uint64_t i2 = 1; i2 < 100 * incr; i2 += incr) {
119 TensorUInt128<static_val<0>,
uint64_t>
i(0, i2);
120 uint128_t
a =
static_cast<uint128_t
>(i2);
121 for (
uint64_t j2 = 1; j2 < 100 * incr; j2 += incr) {
122 TensorUInt128<static_val<0>,
uint64_t>
j(0, j2);
123 uint128_t
b =
static_cast<uint128_t
>(j2);
132 int64_t incr = internal::random<int64_t>(1, 100);
133 for (
int64_t log_div = 0; log_div < 63; ++log_div) {
134 for (
int64_t divider = 1; divider <= 1000000 * incr; divider += incr) {
135 uint64_t expected = (
static_cast<uint128_t
>(1) << (64+log_div)) / static_cast<uint128_t>(divider) - (
static_cast<uint128_t
>(1) << 64) + 1;
138 TensorUInt128<uint64_t, uint64_t>
result = (TensorUInt128<uint64_t, static_val<0> >(shift, 0) / TensorUInt128<static_val<0>,
uint64_t>(divider) - TensorUInt128<static_val<1>, static_val<0> >(1, 0) + TensorUInt128<static_val<0>, static_val<1> >(1));
149 #ifdef EIGEN_NO_INT128 #define CALL_SUBTEST_6(FUNC)
#define CALL_SUBTEST_4(FUNC)
EIGEN_DECLARE_TEST(cxx11_tensor_uint128)
#define CALL_SUBTEST_3(FUNC)
#define VERIFY_IS_EQUAL(a, b)
#define CALL_SUBTEST_1(FUNC)
unsigned __int64 uint64_t
#define CALL_SUBTEST_5(FUNC)
#define CALL_SUBTEST_2(FUNC)
static std::vector< std::string > g_test_stack