154 lines · cpp
1//===- bit-test.cpp -------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Tests for orc-rt's bit.h APIs.10//11//===----------------------------------------------------------------------===//12 13#include "orc-rt/bit.h"14#include "gtest/gtest.h"15 16#include <cstdint>17 18#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN19#define IS_BIG_ENDIAN20#elif defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && \21 BYTE_ORDER == LITTLE_ENDIAN22#define IS_LITTLE_ENDIAN23#endif24 25using namespace orc_rt;26 27TEST(BitTest, endian) {28#if defined(IS_BIG_ENDIAN)29 EXPECT_EQ(endian::native, endian::big);30#elif defined(IS_LITTLE_ENDIAN)31 EXPECT_EQ(endian::native, endian::little);32#else33 ADD_FAILURE() << "BYTE_ORDER is neither BIG_ENDIAN nor LITTLE_ENDIAN.";34#endif35}36 37TEST(BitTest, byte_swap_32) {38 unsigned char Seq[] = {0x01, 0x23, 0x45, 0x67};39 uint32_t X = 0;40 memcpy(&X, Seq, sizeof(X));41 auto Y = byteswap(X);42 43 static_assert(sizeof(Seq) == sizeof(X),44 "sizeof(char[4]) != sizeof(uint32_t) ?");45 static_assert(std::is_same_v<decltype(X), decltype(Y)>,46 "byte_swap return type doesn't match input");47 48#if defined(IS_BIG_ENDIAN)49 EXPECT_EQ(X, uint32_t(0x01234567));50 EXPECT_EQ(Y, uint32_t(0x67452301));51#elif defined(IS_LITTLE_ENDIAN)52 EXPECT_EQ(X, uint32_t(0x67452301));53 EXPECT_EQ(Y, uint32_t(0x01234567));54#else55 ADD_FAILURE() << "BYTE_ORDER is neither BIG_ENDIAN nor LITTLE_ENDIAN.";56#endif57}58 59TEST(BitTest, byte_swap_64) {60 unsigned char Seq[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};61 uint64_t X = 0;62 memcpy(&X, Seq, sizeof(X));63 auto Y = byteswap(X);64 65 static_assert(sizeof(Seq) == sizeof(X),66 "sizeof(char[8]) != sizeof(uint64_t) ?");67 static_assert(std::is_same_v<decltype(X), decltype(Y)>,68 "byte_swap return type doesn't match input");69 70#if defined(IS_BIG_ENDIAN)71 EXPECT_EQ(X, uint64_t(0x0123456789ABCDEF));72 EXPECT_EQ(Y, uint64_t(0xEFCDAB8967452301));73#elif defined(IS_LITTLE_ENDIAN)74 EXPECT_EQ(X, uint64_t(0xEFCDAB8967452301));75 EXPECT_EQ(Y, uint64_t(0x0123456789ABCDEF));76#else77 ADD_FAILURE() << "BYTE_ORDER is neither BIG_ENDIAN nor LITTLE_ENDIAN.";78#endif79}80 81TEST(BitTest, CountlZero) {82 uint8_t Z8 = 0;83 uint16_t Z16 = 0;84 uint32_t Z32 = 0;85 uint64_t Z64 = 0;86 EXPECT_EQ(8, llvm::countl_zero(Z8));87 EXPECT_EQ(16, llvm::countl_zero(Z16));88 EXPECT_EQ(32, llvm::countl_zero(Z32));89 EXPECT_EQ(64, llvm::countl_zero(Z64));90 91 uint8_t NZ8 = 42;92 uint16_t NZ16 = 42;93 uint32_t NZ32 = 42;94 uint64_t NZ64 = 42;95 EXPECT_EQ(2, llvm::countl_zero(NZ8));96 EXPECT_EQ(10, llvm::countl_zero(NZ16));97 EXPECT_EQ(26, llvm::countl_zero(NZ32));98 EXPECT_EQ(58, llvm::countl_zero(NZ64));99 100 EXPECT_EQ(8, llvm::countl_zero(0x00F000FFu));101 EXPECT_EQ(8, llvm::countl_zero(0x00F12345u));102 for (unsigned i = 0; i <= 30; ++i) {103 EXPECT_EQ(int(31 - i), llvm::countl_zero(1u << i));104 }105 106 EXPECT_EQ(8, llvm::countl_zero(0x00F1234500F12345ULL));107 EXPECT_EQ(1, llvm::countl_zero(1ULL << 62));108 for (unsigned i = 0; i <= 62; ++i) {109 EXPECT_EQ(int(63 - i), llvm::countl_zero(1ULL << i));110 }111}112 113TEST(BitTest, BitWidth) {114 EXPECT_EQ(0, llvm::bit_width(uint8_t(0)));115 EXPECT_EQ(0, llvm::bit_width(uint16_t(0)));116 EXPECT_EQ(0, llvm::bit_width(uint32_t(0)));117 EXPECT_EQ(0, llvm::bit_width(uint64_t(0)));118 119 EXPECT_EQ(1, llvm::bit_width(uint8_t(1)));120 EXPECT_EQ(1, llvm::bit_width(uint16_t(1)));121 EXPECT_EQ(1, llvm::bit_width(uint32_t(1)));122 EXPECT_EQ(1, llvm::bit_width(uint64_t(1)));123 124 EXPECT_EQ(2, llvm::bit_width(uint8_t(2)));125 EXPECT_EQ(2, llvm::bit_width(uint16_t(2)));126 EXPECT_EQ(2, llvm::bit_width(uint32_t(2)));127 EXPECT_EQ(2, llvm::bit_width(uint64_t(2)));128 129 EXPECT_EQ(2, llvm::bit_width(uint8_t(3)));130 EXPECT_EQ(2, llvm::bit_width(uint16_t(3)));131 EXPECT_EQ(2, llvm::bit_width(uint32_t(3)));132 EXPECT_EQ(2, llvm::bit_width(uint64_t(3)));133 134 EXPECT_EQ(3, llvm::bit_width(uint8_t(4)));135 EXPECT_EQ(3, llvm::bit_width(uint16_t(4)));136 EXPECT_EQ(3, llvm::bit_width(uint32_t(4)));137 EXPECT_EQ(3, llvm::bit_width(uint64_t(4)));138 139 EXPECT_EQ(7, llvm::bit_width(uint8_t(0x7f)));140 EXPECT_EQ(15, llvm::bit_width(uint16_t(0x7fff)));141 EXPECT_EQ(31, llvm::bit_width(uint32_t(0x7fffffffu)));142 EXPECT_EQ(63, llvm::bit_width(uint64_t(0x7fffffffffffffffull)));143 144 EXPECT_EQ(8, llvm::bit_width(uint8_t(0x80)));145 EXPECT_EQ(16, llvm::bit_width(uint16_t(0x8000)));146 EXPECT_EQ(32, llvm::bit_width(uint32_t(0x80000000u)));147 EXPECT_EQ(64, llvm::bit_width(uint64_t(0x8000000000000000ull)));148 149 EXPECT_EQ(8, llvm::bit_width(uint8_t(0xff)));150 EXPECT_EQ(16, llvm::bit_width(uint16_t(0xffff)));151 EXPECT_EQ(32, llvm::bit_width(uint32_t(0xffffffffu)));152 EXPECT_EQ(64, llvm::bit_width(uint64_t(0xffffffffffffffffull)));153}154