211 lines
7.7 KiB
C++
211 lines
7.7 KiB
C++
// Copyright 2016, VIXL authors
|
|
// All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are met:
|
|
//
|
|
// * Redistributions of source code must retain the above copyright notice,
|
|
// this list of conditions and the following disclaimer.
|
|
// * Redistributions in binary form must reproduce the above copyright notice,
|
|
// this list of conditions and the following disclaimer in the documentation
|
|
// and/or other materials provided with the distribution.
|
|
// * Neither the name of ARM Limited nor the names of its contributors may be
|
|
// used to endorse or promote products derived from this software without
|
|
// specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
|
|
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
|
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
#include "test-runner.h"
|
|
|
|
#include "utils-vixl.h"
|
|
|
|
#define TEST(name) TEST_(API_##name)
|
|
|
|
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|
|
|
|
namespace vixl {
|
|
|
|
// Describe the result of a test. Should IsUintN() and IsIntN() return true or
|
|
// false for N and X?
|
|
template <typename T>
|
|
struct UintIntTest {
|
|
bool is_uintn;
|
|
bool is_intn;
|
|
unsigned n;
|
|
T x;
|
|
};
|
|
|
|
// Test IsUintN() and IsIntN() against various values and integral types.
|
|
TEST(IsUint_IsInt) {
|
|
UintIntTest<uint32_t> test_little_values_unsigned[] = {
|
|
{true, true, 1, UINT32_C(0x0)},
|
|
{true, false, 1, UINT32_C(0x1)},
|
|
{false, false, 1, UINT32_C(0x2)},
|
|
{false, false, 1, UINT32_C(0x3)},
|
|
{false, false, 1, UINT32_C(0x4)},
|
|
{false, false, 1, UINT32_C(0x5)},
|
|
{false, false, 1, UINT32_C(0x6)},
|
|
{false, false, 1, UINT32_C(0x7)},
|
|
{false, false, 1, UINT32_C(0x8)},
|
|
{false, false, 1, UINT32_C(0x9)},
|
|
{false, false, 1, UINT32_C(0xa)},
|
|
{false, false, 1, UINT32_C(0xb)},
|
|
{false, false, 1, UINT32_C(0xc)},
|
|
{false, false, 1, UINT32_C(0xd)},
|
|
{false, false, 1, UINT32_C(0xe)},
|
|
{false, false, 1, UINT32_C(0xf)},
|
|
|
|
{true, true, 2, UINT32_C(0x0)},
|
|
{true, true, 2, UINT32_C(0x1)},
|
|
{true, false, 2, UINT32_C(0x2)},
|
|
{true, false, 2, UINT32_C(0x3)},
|
|
{false, false, 2, UINT32_C(0x4)},
|
|
{false, false, 2, UINT32_C(0x5)},
|
|
{false, false, 2, UINT32_C(0x6)},
|
|
{false, false, 2, UINT32_C(0x7)},
|
|
{false, false, 2, UINT32_C(0x8)},
|
|
{false, false, 2, UINT32_C(0x9)},
|
|
{false, false, 2, UINT32_C(0xa)},
|
|
{false, false, 2, UINT32_C(0xb)},
|
|
{false, false, 2, UINT32_C(0xc)},
|
|
{false, false, 2, UINT32_C(0xd)},
|
|
{false, false, 2, UINT32_C(0xe)},
|
|
{false, false, 2, UINT32_C(0xf)},
|
|
};
|
|
|
|
UintIntTest<int32_t> test_little_values_signed[] = {
|
|
{true, true, 1, INT32_C(0)},
|
|
{true, false, 1, INT32_C(1)},
|
|
{false, false, 1, INT32_C(2)},
|
|
{false, false, 1, INT32_C(3)},
|
|
{false, false, 1, INT32_C(4)},
|
|
{false, false, 1, INT32_C(5)},
|
|
{false, false, 1, INT32_C(6)},
|
|
{false, false, 1, INT32_C(7)},
|
|
{false, true, 1, INT32_C(-1)},
|
|
{false, false, 1, INT32_C(-2)},
|
|
{false, false, 1, INT32_C(-3)},
|
|
{false, false, 1, INT32_C(-4)},
|
|
{false, false, 1, INT32_C(-5)},
|
|
{false, false, 1, INT32_C(-6)},
|
|
{false, false, 1, INT32_C(-7)},
|
|
{false, false, 1, INT32_C(-8)},
|
|
|
|
{true, true, 2, INT32_C(0)},
|
|
{true, true, 2, INT32_C(1)},
|
|
{true, false, 2, INT32_C(2)},
|
|
{true, false, 2, INT32_C(3)},
|
|
{false, false, 2, INT32_C(4)},
|
|
{false, false, 2, INT32_C(5)},
|
|
{false, false, 2, INT32_C(6)},
|
|
{false, false, 2, INT32_C(7)},
|
|
{false, true, 2, INT32_C(-1)},
|
|
{false, true, 2, INT32_C(-2)},
|
|
{false, false, 2, INT32_C(-3)},
|
|
{false, false, 2, INT32_C(-4)},
|
|
{false, false, 2, INT32_C(-5)},
|
|
{false, false, 2, INT32_C(-6)},
|
|
{false, false, 2, INT32_C(-7)},
|
|
{false, false, 2, INT32_C(-8)},
|
|
};
|
|
|
|
UintIntTest<uint32_t> test_u16[] = {
|
|
{true, true, 16, UINT32_C(0x0)},
|
|
{true, false, 16, UINT32_C(0xabcd)},
|
|
{true, false, 16, UINT32_C(0x8000)},
|
|
{true, false, 16, UINT32_C(0xffff)},
|
|
{false, false, 16, UINT32_C(0x10000)},
|
|
{false, false, 16, UINT32_C(0xffff0000)},
|
|
{false, false, 16, UINT32_C(0xffff8000)},
|
|
{false, false, 16, UINT32_C(0xffffffff)},
|
|
};
|
|
|
|
UintIntTest<int32_t> test_i16[] = {
|
|
{true, true, 16, INT32_C(0x0)},
|
|
{true, false, 16, INT32_C(0xabcd)},
|
|
{true, false, 16, INT32_C(0x8000)},
|
|
{true, false, 16, INT32_C(0xffff)},
|
|
{false, false, 16, INT32_C(0x10000)},
|
|
{true, true, 16, INT32_C(42)},
|
|
{false, true, 16, INT32_C(-42)},
|
|
{false, true, 16, INT32_C(-1)},
|
|
};
|
|
|
|
UintIntTest<uint64_t> test_u32[] = {
|
|
{true, true, 32, UINT64_C(0x0)},
|
|
{true, false, 32, UINT64_C(0xabcdabcd)},
|
|
{true, false, 32, UINT64_C(0x80000000)},
|
|
{true, false, 32, UINT64_C(0xffffffff)},
|
|
};
|
|
|
|
UintIntTest<int64_t> test_i32[] = {
|
|
{true, true, 32, INT64_C(0)},
|
|
{true, true, 32, INT64_C(42)},
|
|
{false, true, 32, INT64_C(-42)},
|
|
{false, true, 32, INT64_C(-1)},
|
|
{true, true, 32, INT64_C(2147483647)}, // (1 << (32 - 1)) - 1
|
|
{false, true, 32, INT64_C(-2147483648)}, // -(1 << (32 - 1))
|
|
};
|
|
|
|
UintIntTest<uint64_t> test_unsigned_higher_than_32[] = {
|
|
{false, false, 54, UINT64_C(0xabcdef9012345678)},
|
|
{true, false, 33, UINT64_C(0x100000000)},
|
|
{true, false, 62, UINT64_C(0x3fffffffffffffff)},
|
|
{true, false, 63, UINT64_C(0x7fffffffffffffff)},
|
|
};
|
|
|
|
UintIntTest<int64_t> test_signed_higher_than_32[] = {
|
|
{true, true, 54, INT64_C(9007199254740991)}, // (1 << (54 - 1)) - 1
|
|
{true, false, 54, INT64_C(9007199254740992)}, // 1 << (54 - 1)
|
|
{true, true, 33, INT64_C(4294967295)}, // (1 << (33 - 1) - 1)
|
|
{false, true, 33, INT64_C(-4294967296)}, // -(1 << (33 - 1))
|
|
};
|
|
|
|
#define TEST_LIST(M) \
|
|
M(test_little_values_unsigned) \
|
|
M(test_little_values_signed) \
|
|
M(test_u16) \
|
|
M(test_i16) \
|
|
M(test_u32) \
|
|
M(test_i32) \
|
|
M(test_unsigned_higher_than_32) \
|
|
M(test_signed_higher_than_32)
|
|
|
|
|
|
#define TEST_UINT(test_vector) \
|
|
for (unsigned i = 0; i < ARRAY_SIZE(test_vector); i++) { \
|
|
if (test_vector[i].is_uintn) { \
|
|
VIXL_CHECK(IsUintN(test_vector[i].n, test_vector[i].x)); \
|
|
} else { \
|
|
VIXL_CHECK(!IsUintN(test_vector[i].n, test_vector[i].x)); \
|
|
} \
|
|
}
|
|
|
|
#define TEST_INT(test_vector) \
|
|
for (unsigned i = 0; i < ARRAY_SIZE(test_vector); i++) { \
|
|
if (test_vector[i].is_intn) { \
|
|
VIXL_CHECK(IsIntN(test_vector[i].n, test_vector[i].x)); \
|
|
} else { \
|
|
VIXL_CHECK(!IsIntN(test_vector[i].n, test_vector[i].x)); \
|
|
} \
|
|
}
|
|
|
|
TEST_LIST(TEST_UINT)
|
|
TEST_LIST(TEST_INT)
|
|
|
|
#undef TEST_UINT
|
|
#undef TEST_INT
|
|
|
|
#undef TEST_LIST
|
|
}
|
|
|
|
} // namespace vixl
|