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