xref: /aosp_15_r20/external/llvm-libc/test/include/stdbit_test.c (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
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 /*
10*71db0c75SAndroid Build Coastguard Worker  * The intent of this test is validate that:
11*71db0c75SAndroid Build Coastguard Worker  * 1. We provide the definition of the various type generic macros of stdbit.h
12*71db0c75SAndroid Build Coastguard Worker  * (the macros are transitively included from stdbit-macros.h by stdbit.h).
13*71db0c75SAndroid Build Coastguard Worker  * 2. It dispatches to the correct underlying function.
14*71db0c75SAndroid Build Coastguard Worker  * Because unit tests build without public packaging, the object files produced
15*71db0c75SAndroid Build Coastguard Worker  * do not contain non-namespaced symbols.
16*71db0c75SAndroid Build Coastguard Worker  */
17*71db0c75SAndroid Build Coastguard Worker 
18*71db0c75SAndroid Build Coastguard Worker /*
19*71db0c75SAndroid Build Coastguard Worker  * Declare these BEFORE including stdbit-macros.h so that this test may still be
20*71db0c75SAndroid Build Coastguard Worker  * run even if a given target doesn't yet have these individual entrypoints
21*71db0c75SAndroid Build Coastguard Worker  * enabled.
22*71db0c75SAndroid Build Coastguard Worker  */
23*71db0c75SAndroid Build Coastguard Worker #include "stdbit_stub.h"
24*71db0c75SAndroid Build Coastguard Worker 
25*71db0c75SAndroid Build Coastguard Worker #include "include/llvm-libc-macros/stdbit-macros.h"
26*71db0c75SAndroid Build Coastguard Worker 
27*71db0c75SAndroid Build Coastguard Worker #include <assert.h>
28*71db0c75SAndroid Build Coastguard Worker 
29*71db0c75SAndroid Build Coastguard Worker #define CHECK_FUNCTION(FUNC_NAME, VAL)                                         \
30*71db0c75SAndroid Build Coastguard Worker   do {                                                                         \
31*71db0c75SAndroid Build Coastguard Worker     assert(FUNC_NAME((unsigned char)0U) == VAL##AU);                           \
32*71db0c75SAndroid Build Coastguard Worker     assert(FUNC_NAME((unsigned short)0U) == VAL##BU);                          \
33*71db0c75SAndroid Build Coastguard Worker     assert(FUNC_NAME(0U) == VAL##CU);                                          \
34*71db0c75SAndroid Build Coastguard Worker     assert(FUNC_NAME(0UL) == VAL##DU);                                         \
35*71db0c75SAndroid Build Coastguard Worker     assert(FUNC_NAME(0ULL) == VAL##EU);                                        \
36*71db0c75SAndroid Build Coastguard Worker   } while (0)
37*71db0c75SAndroid Build Coastguard Worker 
main(void)38*71db0c75SAndroid Build Coastguard Worker int main(void) {
39*71db0c75SAndroid Build Coastguard Worker   CHECK_FUNCTION(stdc_leading_zeros, 0xA);
40*71db0c75SAndroid Build Coastguard Worker   CHECK_FUNCTION(stdc_leading_ones, 0xB);
41*71db0c75SAndroid Build Coastguard Worker   CHECK_FUNCTION(stdc_trailing_zeros, 0xC);
42*71db0c75SAndroid Build Coastguard Worker   CHECK_FUNCTION(stdc_trailing_ones, 0xD);
43*71db0c75SAndroid Build Coastguard Worker   CHECK_FUNCTION(stdc_first_leading_zero, 0xE);
44*71db0c75SAndroid Build Coastguard Worker   CHECK_FUNCTION(stdc_first_leading_one, 0xF);
45*71db0c75SAndroid Build Coastguard Worker   CHECK_FUNCTION(stdc_first_trailing_zero, 0x0);
46*71db0c75SAndroid Build Coastguard Worker   CHECK_FUNCTION(stdc_first_trailing_one, 0x1);
47*71db0c75SAndroid Build Coastguard Worker   CHECK_FUNCTION(stdc_count_zeros, 0x2);
48*71db0c75SAndroid Build Coastguard Worker   CHECK_FUNCTION(stdc_count_ones, 0x3);
49*71db0c75SAndroid Build Coastguard Worker 
50*71db0c75SAndroid Build Coastguard Worker   assert(!stdc_has_single_bit((unsigned char)1U));
51*71db0c75SAndroid Build Coastguard Worker   assert(!stdc_has_single_bit((unsigned short)1U));
52*71db0c75SAndroid Build Coastguard Worker   assert(!stdc_has_single_bit(1U));
53*71db0c75SAndroid Build Coastguard Worker   assert(!stdc_has_single_bit(1UL));
54*71db0c75SAndroid Build Coastguard Worker   assert(!stdc_has_single_bit(1ULL));
55*71db0c75SAndroid Build Coastguard Worker 
56*71db0c75SAndroid Build Coastguard Worker   CHECK_FUNCTION(stdc_bit_width, 0x4);
57*71db0c75SAndroid Build Coastguard Worker   CHECK_FUNCTION(stdc_bit_floor, 0x5);
58*71db0c75SAndroid Build Coastguard Worker   CHECK_FUNCTION(stdc_bit_ceil, 0x6);
59*71db0c75SAndroid Build Coastguard Worker 
60*71db0c75SAndroid Build Coastguard Worker   return 0;
61*71db0c75SAndroid Build Coastguard Worker }
62