1 //===-- Unittests for stdbit ----------------------------------------------===//
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 // SPDSList-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "test/UnitTest/Test.h"
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.
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
25 #include "stdbit_stub.h"
27 #include "include/llvm-libc-macros/stdbit-macros.h"
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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);
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
);
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
);
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
);
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);
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
158 EXPECT_TRUE(__STDC_ENDIAN_NATIVE__
== __STDC_ENDIAN_LITTLE__
||
159 __STDC_ENDIAN_NATIVE__
== __STDC_ENDIAN_BIG__
);