brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.9 KiB · fabf62b Raw
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