1 //===-- Unittests for stdbit ----------------------------------------------===// 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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "test/UnitTest/Test.h" 10 11 /* 12 * The intent of this test is validate that: 13 * 1. We provide the definition of the various type generic macros of stdbit.h 14 * (the macros are transitively included from stdbit-macros.h by stdbit.h). 15 * 2. It dispatches to the correct underlying function. 16 * Because unit tests build without public packaging, the object files produced 17 * do not contain non-namespaced symbols. 18 */ 19 20 /* 21 * Declare these BEFORE including stdbit-macros.h so that this test may still be 22 * run even if a given target doesn't yet have these individual entrypoints 23 * enabled. 24 */ 25 #include "stdbit_stub.h" 26 27 #include "include/llvm-libc-macros/stdbit-macros.h" 28 29 TEST(LlvmLibcStdbitTest, TypeGenericMacroLeadingZeros) { 30 EXPECT_EQ(stdc_leading_zeros(static_cast<unsigned char>(0U)), 0xAAU); 31 EXPECT_EQ(stdc_leading_zeros(static_cast<unsigned short>(0U)), 0xABU); 32 EXPECT_EQ(stdc_leading_zeros(0U), 0xACU); 33 EXPECT_EQ(stdc_leading_zeros(0UL), 0xADU); 34 EXPECT_EQ(stdc_leading_zeros(0ULL), 0xAEU); 35 } 36 37 TEST(LlvmLibcStdbitTest, TypeGenericMacroLeadingOnes) { 38 EXPECT_EQ(stdc_leading_ones(static_cast<unsigned char>(0U)), 0xBAU); 39 EXPECT_EQ(stdc_leading_ones(static_cast<unsigned short>(0U)), 0xBBU); 40 EXPECT_EQ(stdc_leading_ones(0U), 0xBCU); 41 EXPECT_EQ(stdc_leading_ones(0UL), 0xBDU); 42 EXPECT_EQ(stdc_leading_ones(0ULL), 0xBEU); 43 } 44 45 TEST(LlvmLibcStdbitTest, TypeGenericMacroTrailingZeros) { 46 EXPECT_EQ(stdc_trailing_zeros(static_cast<unsigned char>(0U)), 0xCAU); 47 EXPECT_EQ(stdc_trailing_zeros(static_cast<unsigned short>(0U)), 0xCBU); 48 EXPECT_EQ(stdc_trailing_zeros(0U), 0xCCU); 49 EXPECT_EQ(stdc_trailing_zeros(0UL), 0xCDU); 50 EXPECT_EQ(stdc_trailing_zeros(0ULL), 0xCEU); 51 } 52 53 TEST(LlvmLibcStdbitTest, TypeGenericMacroTrailingOnes) { 54 EXPECT_EQ(stdc_trailing_ones(static_cast<unsigned char>(0U)), 0xDAU); 55 EXPECT_EQ(stdc_trailing_ones(static_cast<unsigned short>(0U)), 0xDBU); 56 EXPECT_EQ(stdc_trailing_ones(0U), 0xDCU); 57 EXPECT_EQ(stdc_trailing_ones(0UL), 0xDDU); 58 EXPECT_EQ(stdc_trailing_ones(0ULL), 0xDEU); 59 } 60 61 TEST(LlvmLibcStdbitTest, TypeGenericMacroFirstLeadingZero) { 62 EXPECT_EQ(stdc_first_leading_zero(static_cast<unsigned char>(0U)), 0xEAU); 63 EXPECT_EQ(stdc_first_leading_zero(static_cast<unsigned short>(0U)), 0xEBU); 64 EXPECT_EQ(stdc_first_leading_zero(0U), 0xECU); 65 EXPECT_EQ(stdc_first_leading_zero(0UL), 0xEDU); 66 EXPECT_EQ(stdc_first_leading_zero(0ULL), 0xEEU); 67 } 68 69 TEST(LlvmLibcStdbitTest, TypeGenericMacroFirstLeadingOne) { 70 EXPECT_EQ(stdc_first_leading_one(static_cast<unsigned char>(0U)), 0xFAU); 71 EXPECT_EQ(stdc_first_leading_one(static_cast<unsigned short>(0U)), 0xFBU); 72 EXPECT_EQ(stdc_first_leading_one(0U), 0xFCU); 73 EXPECT_EQ(stdc_first_leading_one(0UL), 0xFDU); 74 EXPECT_EQ(stdc_first_leading_one(0ULL), 0xFEU); 75 } 76 77 TEST(LlvmLibcStdbitTest, TypeGenericMacroFirstTrailingZero) { 78 EXPECT_EQ(stdc_first_trailing_zero(static_cast<unsigned char>(0U)), 0x0AU); 79 EXPECT_EQ(stdc_first_trailing_zero(static_cast<unsigned short>(0U)), 0x0BU); 80 EXPECT_EQ(stdc_first_trailing_zero(0U), 0x0CU); 81 EXPECT_EQ(stdc_first_trailing_zero(0UL), 0x0DU); 82 EXPECT_EQ(stdc_first_trailing_zero(0ULL), 0x0EU); 83 } 84 85 TEST(LlvmLibcStdbitTest, TypeGenericMacroFirstTrailingOne) { 86 EXPECT_EQ(stdc_first_trailing_one(static_cast<unsigned char>(0U)), 0x1AU); 87 EXPECT_EQ(stdc_first_trailing_one(static_cast<unsigned short>(0U)), 0x1BU); 88 EXPECT_EQ(stdc_first_trailing_one(0U), 0x1CU); 89 EXPECT_EQ(stdc_first_trailing_one(0UL), 0x1DU); 90 EXPECT_EQ(stdc_first_trailing_one(0ULL), 0x1EU); 91 } 92 93 TEST(LlvmLibcStdbitTest, TypeGenericMacroCountZeros) { 94 EXPECT_EQ(stdc_count_zeros(static_cast<unsigned char>(0U)), 0x2AU); 95 EXPECT_EQ(stdc_count_zeros(static_cast<unsigned short>(0U)), 0x2BU); 96 EXPECT_EQ(stdc_count_zeros(0U), 0x2CU); 97 EXPECT_EQ(stdc_count_zeros(0UL), 0x2DU); 98 EXPECT_EQ(stdc_count_zeros(0ULL), 0x2EU); 99 } 100 101 TEST(LlvmLibcStdbitTest, TypeGenericMacroCountOnes) { 102 EXPECT_EQ(stdc_count_ones(static_cast<unsigned char>(0U)), 0x3AU); 103 EXPECT_EQ(stdc_count_ones(static_cast<unsigned short>(0U)), 0x3BU); 104 EXPECT_EQ(stdc_count_ones(0U), 0x3CU); 105 EXPECT_EQ(stdc_count_ones(0UL), 0x3DU); 106 EXPECT_EQ(stdc_count_ones(0ULL), 0x3EU); 107 } 108 109 TEST(LlvmLibcStdbitTest, TypeGenericMacroHasSingleBit) { 110 EXPECT_EQ(stdc_has_single_bit(static_cast<unsigned char>(1U)), false); 111 EXPECT_EQ(stdc_has_single_bit(static_cast<unsigned short>(1U)), false); 112 EXPECT_EQ(stdc_has_single_bit(1U), false); 113 EXPECT_EQ(stdc_has_single_bit(1UL), false); 114 EXPECT_EQ(stdc_has_single_bit(1ULL), false); 115 } 116 117 TEST(LlvmLibcStdbitTest, TypeGenericMacroBitWidth) { 118 EXPECT_EQ(stdc_bit_width(static_cast<unsigned char>(1U)), 0x4AU); 119 EXPECT_EQ(stdc_bit_width(static_cast<unsigned short>(1U)), 0x4BU); 120 EXPECT_EQ(stdc_bit_width(1U), 0x4CU); 121 EXPECT_EQ(stdc_bit_width(1UL), 0x4DU); 122 EXPECT_EQ(stdc_bit_width(1ULL), 0x4EU); 123 } 124 125 TEST(LlvmLibcStdbitTest, TypeGenericMacroBitFloor) { 126 EXPECT_EQ(stdc_bit_floor(static_cast<unsigned char>(0U)), 127 static_cast<unsigned char>(0x5AU)); 128 EXPECT_EQ(stdc_bit_floor(static_cast<unsigned short>(0U)), 129 static_cast<unsigned short>(0x5BU)); 130 EXPECT_EQ(stdc_bit_floor(0U), 0x5CU); 131 EXPECT_EQ(stdc_bit_floor(0UL), 0x5DUL); 132 EXPECT_EQ(stdc_bit_floor(0ULL), 0x5EULL); 133 } 134 135 TEST(LlvmLibcStdbitTest, TypeGenericMacroBitCeil) { 136 EXPECT_EQ(stdc_bit_ceil(static_cast<unsigned char>(0U)), 137 static_cast<unsigned char>(0x6AU)); 138 EXPECT_EQ(stdc_bit_ceil(static_cast<unsigned short>(0U)), 139 static_cast<unsigned short>(0x6BU)); 140 EXPECT_EQ(stdc_bit_ceil(0U), 0x6CU); 141 EXPECT_EQ(stdc_bit_ceil(0UL), 0x6DUL); 142 EXPECT_EQ(stdc_bit_ceil(0ULL), 0x6EULL); 143 } 144 145 TEST(LlvmLibcStdbitTest, VersionMacro) { 146 // 7.18.1p2 an integer constant expression with a value equivalent to 202311L. 147 EXPECT_EQ(__STDC_VERSION_STDBIT_H__, 202311L); 148 } 149 150 TEST(LlvmLibcStdbitTest, EndianMacros) { 151 // 7.18.2p3 The values of the integer constant expressions for 152 // __STDC_ENDIAN_LITTLE__ and __STDC_ENDIAN_BIG__ are not equal. 153 EXPECT_NE(__STDC_ENDIAN_LITTLE__, __STDC_ENDIAN_BIG__); 154 // The standard does allow for __STDC_ENDIAN_NATIVE__ to be an integer 155 // constant expression with an implementation defined value for non-big or 156 // little endianness environments. I assert such machines are no longer 157 // relevant. 158 EXPECT_TRUE(__STDC_ENDIAN_NATIVE__ == __STDC_ENDIAN_LITTLE__ || 159 __STDC_ENDIAN_NATIVE__ == __STDC_ENDIAN_BIG__); 160 } 161