17bc5eaa0SNick Desaulniers //===-- Unittests for stdbit ----------------------------------------------===// 27bc5eaa0SNick Desaulniers // 37bc5eaa0SNick Desaulniers // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 47bc5eaa0SNick Desaulniers // See https://llvm.org/LICENSE.txt for license information. 5*1dbc9829SRoland McGrath // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 67bc5eaa0SNick Desaulniers // 77bc5eaa0SNick Desaulniers //===----------------------------------------------------------------------===// 87bc5eaa0SNick Desaulniers 97bc5eaa0SNick Desaulniers #include "test/UnitTest/Test.h" 107bc5eaa0SNick Desaulniers 117bc5eaa0SNick Desaulniers /* 127bc5eaa0SNick Desaulniers * The intent of this test is validate that: 13f883365cSNick Desaulniers * 1. We provide the definition of the various type generic macros of stdbit.h 14f883365cSNick Desaulniers * (the macros are transitively included from stdbit-macros.h by stdbit.h). 157bc5eaa0SNick Desaulniers * 2. It dispatches to the correct underlying function. 167bc5eaa0SNick Desaulniers * Because unit tests build without public packaging, the object files produced 177bc5eaa0SNick Desaulniers * do not contain non-namespaced symbols. 187bc5eaa0SNick Desaulniers */ 197bc5eaa0SNick Desaulniers 20f883365cSNick Desaulniers /* 21f883365cSNick Desaulniers * Declare these BEFORE including stdbit-macros.h so that this test may still be 22f883365cSNick Desaulniers * run even if a given target doesn't yet have these individual entrypoints 23f883365cSNick Desaulniers * enabled. 24f883365cSNick Desaulniers */ 25a25fa92dSlntue #include "stdbit_stub.h" 26f883365cSNick Desaulniers 2773aab2f6Slntue #include "include/llvm-libc-macros/stdbit-macros.h" 287bc5eaa0SNick Desaulniers 296a3fde6dSNick Desaulniers TEST(LlvmLibcStdbitTest, TypeGenericMacroLeadingZeros) { 30edbd93d3SNick Desaulniers EXPECT_EQ(stdc_leading_zeros(static_cast<unsigned char>(0U)), 0xAAU); 31edbd93d3SNick Desaulniers EXPECT_EQ(stdc_leading_zeros(static_cast<unsigned short>(0U)), 0xABU); 32edbd93d3SNick Desaulniers EXPECT_EQ(stdc_leading_zeros(0U), 0xACU); 33edbd93d3SNick Desaulniers EXPECT_EQ(stdc_leading_zeros(0UL), 0xADU); 3493e423f1SNick Desaulniers EXPECT_EQ(stdc_leading_zeros(0ULL), 0xAEU); 357bc5eaa0SNick Desaulniers } 366a3fde6dSNick Desaulniers 376a3fde6dSNick Desaulniers TEST(LlvmLibcStdbitTest, TypeGenericMacroLeadingOnes) { 38edbd93d3SNick Desaulniers EXPECT_EQ(stdc_leading_ones(static_cast<unsigned char>(0U)), 0xBAU); 39edbd93d3SNick Desaulniers EXPECT_EQ(stdc_leading_ones(static_cast<unsigned short>(0U)), 0xBBU); 40edbd93d3SNick Desaulniers EXPECT_EQ(stdc_leading_ones(0U), 0xBCU); 41edbd93d3SNick Desaulniers EXPECT_EQ(stdc_leading_ones(0UL), 0xBDU); 4293e423f1SNick Desaulniers EXPECT_EQ(stdc_leading_ones(0ULL), 0xBEU); 436a3fde6dSNick Desaulniers } 44d5a3de4aSNick Desaulniers 45d5a3de4aSNick Desaulniers TEST(LlvmLibcStdbitTest, TypeGenericMacroTrailingZeros) { 46d5a3de4aSNick Desaulniers EXPECT_EQ(stdc_trailing_zeros(static_cast<unsigned char>(0U)), 0xCAU); 47d5a3de4aSNick Desaulniers EXPECT_EQ(stdc_trailing_zeros(static_cast<unsigned short>(0U)), 0xCBU); 48d5a3de4aSNick Desaulniers EXPECT_EQ(stdc_trailing_zeros(0U), 0xCCU); 49d5a3de4aSNick Desaulniers EXPECT_EQ(stdc_trailing_zeros(0UL), 0xCDU); 5093e423f1SNick Desaulniers EXPECT_EQ(stdc_trailing_zeros(0ULL), 0xCEU); 51d5a3de4aSNick Desaulniers } 527760006dSNick Desaulniers 537760006dSNick Desaulniers TEST(LlvmLibcStdbitTest, TypeGenericMacroTrailingOnes) { 547760006dSNick Desaulniers EXPECT_EQ(stdc_trailing_ones(static_cast<unsigned char>(0U)), 0xDAU); 557760006dSNick Desaulniers EXPECT_EQ(stdc_trailing_ones(static_cast<unsigned short>(0U)), 0xDBU); 567760006dSNick Desaulniers EXPECT_EQ(stdc_trailing_ones(0U), 0xDCU); 577760006dSNick Desaulniers EXPECT_EQ(stdc_trailing_ones(0UL), 0xDDU); 5893e423f1SNick Desaulniers EXPECT_EQ(stdc_trailing_ones(0ULL), 0xDEU); 597760006dSNick Desaulniers } 60d2d6b368SNick Desaulniers 61d2d6b368SNick Desaulniers TEST(LlvmLibcStdbitTest, TypeGenericMacroFirstLeadingZero) { 62d2d6b368SNick Desaulniers EXPECT_EQ(stdc_first_leading_zero(static_cast<unsigned char>(0U)), 0xEAU); 63d2d6b368SNick Desaulniers EXPECT_EQ(stdc_first_leading_zero(static_cast<unsigned short>(0U)), 0xEBU); 64d2d6b368SNick Desaulniers EXPECT_EQ(stdc_first_leading_zero(0U), 0xECU); 65d2d6b368SNick Desaulniers EXPECT_EQ(stdc_first_leading_zero(0UL), 0xEDU); 6693e423f1SNick Desaulniers EXPECT_EQ(stdc_first_leading_zero(0ULL), 0xEEU); 67d2d6b368SNick Desaulniers } 6860596716SNick Desaulniers 6960596716SNick Desaulniers TEST(LlvmLibcStdbitTest, TypeGenericMacroFirstLeadingOne) { 7060596716SNick Desaulniers EXPECT_EQ(stdc_first_leading_one(static_cast<unsigned char>(0U)), 0xFAU); 7160596716SNick Desaulniers EXPECT_EQ(stdc_first_leading_one(static_cast<unsigned short>(0U)), 0xFBU); 7260596716SNick Desaulniers EXPECT_EQ(stdc_first_leading_one(0U), 0xFCU); 7360596716SNick Desaulniers EXPECT_EQ(stdc_first_leading_one(0UL), 0xFDU); 7493e423f1SNick Desaulniers EXPECT_EQ(stdc_first_leading_one(0ULL), 0xFEU); 7560596716SNick Desaulniers } 7616e7d684SNick Desaulniers 7716e7d684SNick Desaulniers TEST(LlvmLibcStdbitTest, TypeGenericMacroFirstTrailingZero) { 7816e7d684SNick Desaulniers EXPECT_EQ(stdc_first_trailing_zero(static_cast<unsigned char>(0U)), 0x0AU); 7916e7d684SNick Desaulniers EXPECT_EQ(stdc_first_trailing_zero(static_cast<unsigned short>(0U)), 0x0BU); 8016e7d684SNick Desaulniers EXPECT_EQ(stdc_first_trailing_zero(0U), 0x0CU); 8116e7d684SNick Desaulniers EXPECT_EQ(stdc_first_trailing_zero(0UL), 0x0DU); 8293e423f1SNick Desaulniers EXPECT_EQ(stdc_first_trailing_zero(0ULL), 0x0EU); 8316e7d684SNick Desaulniers } 846297479fSNick Desaulniers 856297479fSNick Desaulniers TEST(LlvmLibcStdbitTest, TypeGenericMacroFirstTrailingOne) { 866297479fSNick Desaulniers EXPECT_EQ(stdc_first_trailing_one(static_cast<unsigned char>(0U)), 0x1AU); 876297479fSNick Desaulniers EXPECT_EQ(stdc_first_trailing_one(static_cast<unsigned short>(0U)), 0x1BU); 886297479fSNick Desaulniers EXPECT_EQ(stdc_first_trailing_one(0U), 0x1CU); 896297479fSNick Desaulniers EXPECT_EQ(stdc_first_trailing_one(0UL), 0x1DU); 9093e423f1SNick Desaulniers EXPECT_EQ(stdc_first_trailing_one(0ULL), 0x1EU); 916297479fSNick Desaulniers } 92f70d5c0bSNick Desaulniers 93f70d5c0bSNick Desaulniers TEST(LlvmLibcStdbitTest, TypeGenericMacroCountZeros) { 94f70d5c0bSNick Desaulniers EXPECT_EQ(stdc_count_zeros(static_cast<unsigned char>(0U)), 0x2AU); 95f70d5c0bSNick Desaulniers EXPECT_EQ(stdc_count_zeros(static_cast<unsigned short>(0U)), 0x2BU); 96f70d5c0bSNick Desaulniers EXPECT_EQ(stdc_count_zeros(0U), 0x2CU); 97f70d5c0bSNick Desaulniers EXPECT_EQ(stdc_count_zeros(0UL), 0x2DU); 9893e423f1SNick Desaulniers EXPECT_EQ(stdc_count_zeros(0ULL), 0x2EU); 99f70d5c0bSNick Desaulniers } 100d8406d48SNick Desaulniers 101d8406d48SNick Desaulniers TEST(LlvmLibcStdbitTest, TypeGenericMacroCountOnes) { 102d8406d48SNick Desaulniers EXPECT_EQ(stdc_count_ones(static_cast<unsigned char>(0U)), 0x3AU); 103d8406d48SNick Desaulniers EXPECT_EQ(stdc_count_ones(static_cast<unsigned short>(0U)), 0x3BU); 104d8406d48SNick Desaulniers EXPECT_EQ(stdc_count_ones(0U), 0x3CU); 105d8406d48SNick Desaulniers EXPECT_EQ(stdc_count_ones(0UL), 0x3DU); 10693e423f1SNick Desaulniers EXPECT_EQ(stdc_count_ones(0ULL), 0x3EU); 107d8406d48SNick Desaulniers } 10806bcd9daSNick Desaulniers 10906bcd9daSNick Desaulniers TEST(LlvmLibcStdbitTest, TypeGenericMacroHasSingleBit) { 11006bcd9daSNick Desaulniers EXPECT_EQ(stdc_has_single_bit(static_cast<unsigned char>(1U)), false); 11106bcd9daSNick Desaulniers EXPECT_EQ(stdc_has_single_bit(static_cast<unsigned short>(1U)), false); 11206bcd9daSNick Desaulniers EXPECT_EQ(stdc_has_single_bit(1U), false); 11306bcd9daSNick Desaulniers EXPECT_EQ(stdc_has_single_bit(1UL), false); 11406bcd9daSNick Desaulniers EXPECT_EQ(stdc_has_single_bit(1ULL), false); 11506bcd9daSNick Desaulniers } 116041638c4SNick Desaulniers 117041638c4SNick Desaulniers TEST(LlvmLibcStdbitTest, TypeGenericMacroBitWidth) { 118041638c4SNick Desaulniers EXPECT_EQ(stdc_bit_width(static_cast<unsigned char>(1U)), 0x4AU); 119041638c4SNick Desaulniers EXPECT_EQ(stdc_bit_width(static_cast<unsigned short>(1U)), 0x4BU); 120041638c4SNick Desaulniers EXPECT_EQ(stdc_bit_width(1U), 0x4CU); 121041638c4SNick Desaulniers EXPECT_EQ(stdc_bit_width(1UL), 0x4DU); 122041638c4SNick Desaulniers EXPECT_EQ(stdc_bit_width(1ULL), 0x4EU); 123041638c4SNick Desaulniers } 124101a13dfSNick Desaulniers 125101a13dfSNick Desaulniers TEST(LlvmLibcStdbitTest, TypeGenericMacroBitFloor) { 126101a13dfSNick Desaulniers EXPECT_EQ(stdc_bit_floor(static_cast<unsigned char>(0U)), 127101a13dfSNick Desaulniers static_cast<unsigned char>(0x5AU)); 128101a13dfSNick Desaulniers EXPECT_EQ(stdc_bit_floor(static_cast<unsigned short>(0U)), 129101a13dfSNick Desaulniers static_cast<unsigned short>(0x5BU)); 130101a13dfSNick Desaulniers EXPECT_EQ(stdc_bit_floor(0U), 0x5CU); 131101a13dfSNick Desaulniers EXPECT_EQ(stdc_bit_floor(0UL), 0x5DUL); 132101a13dfSNick Desaulniers EXPECT_EQ(stdc_bit_floor(0ULL), 0x5EULL); 133101a13dfSNick Desaulniers } 13475b0d384SMichael Flanders 13575b0d384SMichael Flanders TEST(LlvmLibcStdbitTest, TypeGenericMacroBitCeil) { 13675b0d384SMichael Flanders EXPECT_EQ(stdc_bit_ceil(static_cast<unsigned char>(0U)), 13775b0d384SMichael Flanders static_cast<unsigned char>(0x6AU)); 13875b0d384SMichael Flanders EXPECT_EQ(stdc_bit_ceil(static_cast<unsigned short>(0U)), 13975b0d384SMichael Flanders static_cast<unsigned short>(0x6BU)); 14075b0d384SMichael Flanders EXPECT_EQ(stdc_bit_ceil(0U), 0x6CU); 14175b0d384SMichael Flanders EXPECT_EQ(stdc_bit_ceil(0UL), 0x6DUL); 14275b0d384SMichael Flanders EXPECT_EQ(stdc_bit_ceil(0ULL), 0x6EULL); 14375b0d384SMichael Flanders } 144f0c0ddaeSNick Desaulniers 145f0c0ddaeSNick Desaulniers TEST(LlvmLibcStdbitTest, VersionMacro) { 146f0c0ddaeSNick Desaulniers // 7.18.1p2 an integer constant expression with a value equivalent to 202311L. 147f0c0ddaeSNick Desaulniers EXPECT_EQ(__STDC_VERSION_STDBIT_H__, 202311L); 148f0c0ddaeSNick Desaulniers } 149f0c0ddaeSNick Desaulniers 150f0c0ddaeSNick Desaulniers TEST(LlvmLibcStdbitTest, EndianMacros) { 151f0c0ddaeSNick Desaulniers // 7.18.2p3 The values of the integer constant expressions for 152f0c0ddaeSNick Desaulniers // __STDC_ENDIAN_LITTLE__ and __STDC_ENDIAN_BIG__ are not equal. 153f0c0ddaeSNick Desaulniers EXPECT_NE(__STDC_ENDIAN_LITTLE__, __STDC_ENDIAN_BIG__); 154f0c0ddaeSNick Desaulniers // The standard does allow for __STDC_ENDIAN_NATIVE__ to be an integer 155f0c0ddaeSNick Desaulniers // constant expression with an implementation defined value for non-big or 156f0c0ddaeSNick Desaulniers // little endianness environments. I assert such machines are no longer 157f0c0ddaeSNick Desaulniers // relevant. 158f0c0ddaeSNick Desaulniers EXPECT_TRUE(__STDC_ENDIAN_NATIVE__ == __STDC_ENDIAN_LITTLE__ || 159f0c0ddaeSNick Desaulniers __STDC_ENDIAN_NATIVE__ == __STDC_ENDIAN_BIG__); 160f0c0ddaeSNick Desaulniers } 161