// 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