xref: /llvm-project/libc/test/include/stdbit_test.cpp (revision 1dbc98294adc06e409b1e0d44252826857ac2ec6)
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