diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index 75e39ae51fdb0..fc30bcf56665c 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -117,6 +117,11 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.stdbit.stdc_first_leading_zero_ui libc.src.stdbit.stdc_first_leading_zero_ul libc.src.stdbit.stdc_first_leading_zero_ull + libc.src.stdbit.stdc_first_leading_one_uc + libc.src.stdbit.stdc_first_leading_one_us + libc.src.stdbit.stdc_first_leading_one_ui + libc.src.stdbit.stdc_first_leading_one_ul + libc.src.stdbit.stdc_first_leading_one_ull # stdlib.h entrypoints libc.src.stdlib.abs diff --git a/libc/docs/stdbit.rst b/libc/docs/stdbit.rst index 4f242d21f8b84..5ff36dcb0f592 100644 --- a/libc/docs/stdbit.rst +++ b/libc/docs/stdbit.rst @@ -41,26 +41,26 @@ stdc_leading_ones_us |check| stdc_leading_ones_ui |check| stdc_leading_ones_ul |check| stdc_leading_ones_ull |check| -stdc_trailing_zeros_uc -stdc_trailing_zeros_us -stdc_trailing_zeros_ui -stdc_trailing_zeros_ul -stdc_trailing_zeros_ull -stdc_trailing_ones_uc -stdc_trailing_ones_us -stdc_trailing_ones_ui -stdc_trailing_ones_ul -stdc_trailing_ones_ull -stdc_first_leading_zero_uc -stdc_first_leading_zero_us -stdc_first_leading_zero_ui -stdc_first_leading_zero_ul -stdc_first_leading_zero_ull -stdc_first_leading_one_uc -stdc_first_leading_one_us -stdc_first_leading_one_ui -stdc_first_leading_one_ul -stdc_first_leading_one_ull +stdc_trailing_zeros_uc |check| +stdc_trailing_zeros_us |check| +stdc_trailing_zeros_ui |check| +stdc_trailing_zeros_ul |check| +stdc_trailing_zeros_ull |check| +stdc_trailing_ones_uc |check| +stdc_trailing_ones_us |check| +stdc_trailing_ones_ui |check| +stdc_trailing_ones_ul |check| +stdc_trailing_ones_ull |check| +stdc_first_leading_zero_uc |check| +stdc_first_leading_zero_us |check| +stdc_first_leading_zero_ui |check| +stdc_first_leading_zero_ul |check| +stdc_first_leading_zero_ull |check| +stdc_first_leading_one_uc |check| +stdc_first_leading_one_us |check| +stdc_first_leading_one_ui |check| +stdc_first_leading_one_ul |check| +stdc_first_leading_one_ull |check| stdc_first_trailing_zero_uc stdc_first_trailing_zero_us stdc_first_trailing_zero_ui @@ -116,10 +116,10 @@ __STDC_ENDIAN_BIG__ __STDC_ENDIAN_NATIVE__ stdc_leading_zeros |check| stdc_leading_ones |check| -stdc_trailing_zeros -stdc_trailing_ones -stdc_first_leading_zero -stdc_first_leading_one +stdc_trailing_zeros |check| +stdc_trailing_ones |check| +stdc_first_leading_zero |check| +stdc_first_leading_one |check| stdc_first_trailing_zero stdc_first_trailing_one stdc_count_zeros diff --git a/libc/include/llvm-libc-macros/stdbit-macros.h b/libc/include/llvm-libc-macros/stdbit-macros.h index 693a45e63419f..87c590e61e399 100644 --- a/libc/include/llvm-libc-macros/stdbit-macros.h +++ b/libc/include/llvm-libc-macros/stdbit-macros.h @@ -86,6 +86,21 @@ inline unsigned stdc_first_leading_zero(unsigned long x) { inline unsigned stdc_first_leading_zero(unsigned long long x) { return stdc_first_leading_zero_ull(x); } +inline unsigned stdc_first_leading_one(unsigned char x) { + return stdc_first_leading_one_uc(x); +} +inline unsigned stdc_first_leading_one(unsigned short x) { + return stdc_first_leading_one_us(x); +} +inline unsigned stdc_first_leading_one(unsigned x) { + return stdc_first_leading_one_ui(x); +} +inline unsigned stdc_first_leading_one(unsigned long x) { + return stdc_first_leading_one_ul(x); +} +inline unsigned stdc_first_leading_one(unsigned long long x) { + return stdc_first_leading_one_ull(x); +} #else #define stdc_leading_zeros(x) \ _Generic((x), \ @@ -122,6 +137,13 @@ inline unsigned stdc_first_leading_zero(unsigned long long x) { unsigned: stdc_first_leading_zero_ui, \ unsigned long: stdc_first_leading_zero_ul, \ unsigned long long: stdc_first_leading_zero_ull)(x) +#define stdc_first_leading_one(x) \ + _Generic((x), \ + unsigned char: stdc_first_leading_one_uc, \ + unsigned short: stdc_first_leading_one_us, \ + unsigned: stdc_first_leading_one_ui, \ + unsigned long: stdc_first_leading_one_ul, \ + unsigned long long: stdc_first_leading_one_ull)(x) #endif // __cplusplus #endif // __LLVM_LIBC_MACROS_STDBIT_MACROS_H diff --git a/libc/spec/stdc.td b/libc/spec/stdc.td index 1720a4a3c3aaf..5e87831b907fb 100644 --- a/libc/spec/stdc.td +++ b/libc/spec/stdc.td @@ -781,7 +781,8 @@ def StdC : StandardSpec<"stdc"> { Macro<"stdc_leading_ones">, Macro<"stdc_trailing_zeros">, Macro<"stdc_trailing_ones">, - Macro<"stdc_first_leading_zero"> + Macro<"stdc_first_leading_zero">, + Macro<"stdc_first_leading_one"> ], // Macros [], // Types [], // Enumerations @@ -810,7 +811,12 @@ def StdC : StandardSpec<"stdc"> { FunctionSpec<"stdc_first_leading_zero_us", RetValSpec, [ArgSpec]>, FunctionSpec<"stdc_first_leading_zero_ui", RetValSpec, [ArgSpec]>, FunctionSpec<"stdc_first_leading_zero_ul", RetValSpec, [ArgSpec]>, - FunctionSpec<"stdc_first_leading_zero_ull", RetValSpec, [ArgSpec]> + FunctionSpec<"stdc_first_leading_zero_ull", RetValSpec, [ArgSpec]>, + FunctionSpec<"stdc_first_leading_one_uc", RetValSpec, [ArgSpec]>, + FunctionSpec<"stdc_first_leading_one_us", RetValSpec, [ArgSpec]>, + FunctionSpec<"stdc_first_leading_one_ui", RetValSpec, [ArgSpec]>, + FunctionSpec<"stdc_first_leading_one_ul", RetValSpec, [ArgSpec]>, + FunctionSpec<"stdc_first_leading_one_ull", RetValSpec, [ArgSpec]> ] // Functions >; diff --git a/libc/src/__support/CPP/bit.h b/libc/src/__support/CPP/bit.h index 4115d67c7705c..23e305ab86219 100644 --- a/libc/src/__support/CPP/bit.h +++ b/libc/src/__support/CPP/bit.h @@ -231,6 +231,11 @@ template >> return value == cpp::numeric_limits::max() ? 0 : countl_one(value) + 1; } +template >> +[[nodiscard]] LIBC_INLINE constexpr int first_leading_one(T value) { + return first_leading_zero(static_cast(~value)); +} + } // namespace LIBC_NAMESPACE::cpp #endif // LLVM_LIBC_SRC___SUPPORT_CPP_BIT_H diff --git a/libc/src/stdbit/CMakeLists.txt b/libc/src/stdbit/CMakeLists.txt index 65d5f34430747..6ee93861b8db4 100644 --- a/libc/src/stdbit/CMakeLists.txt +++ b/libc/src/stdbit/CMakeLists.txt @@ -4,6 +4,7 @@ set(prefixes trailing_zeros trailing_ones first_leading_zero + first_leading_one ) set(suffixes c s i l ll) foreach(prefix IN LISTS prefixes) diff --git a/libc/src/stdbit/stdc_first_leading_one_uc.cpp b/libc/src/stdbit/stdc_first_leading_one_uc.cpp new file mode 100644 index 0000000000000..02871595fdb6b --- /dev/null +++ b/libc/src/stdbit/stdc_first_leading_one_uc.cpp @@ -0,0 +1,20 @@ +//===-- Implementation of stdc_first_leading_one_uc -----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/stdbit/stdc_first_leading_one_uc.h" + +#include "src/__support/CPP/bit.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_one_uc, (unsigned char value)) { + return static_cast(cpp::first_leading_one(value)); +} + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/stdbit/stdc_first_leading_one_uc.h b/libc/src/stdbit/stdc_first_leading_one_uc.h new file mode 100644 index 0000000000000..58892c3f0ff29 --- /dev/null +++ b/libc/src/stdbit/stdc_first_leading_one_uc.h @@ -0,0 +1,18 @@ +//===-- Implementation header for stdc_first_leading_one_uc -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_UC_H +#define LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_UC_H + +namespace LIBC_NAMESPACE { + +unsigned stdc_first_leading_one_uc(unsigned char value); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_UC_H diff --git a/libc/src/stdbit/stdc_first_leading_one_ui.cpp b/libc/src/stdbit/stdc_first_leading_one_ui.cpp new file mode 100644 index 0000000000000..a6c7ef5a83391 --- /dev/null +++ b/libc/src/stdbit/stdc_first_leading_one_ui.cpp @@ -0,0 +1,20 @@ +//===-- Implementation of stdc_first_leading_one_ui -----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/stdbit/stdc_first_leading_one_ui.h" + +#include "src/__support/CPP/bit.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_one_ui, (unsigned value)) { + return static_cast(cpp::first_leading_one(value)); +} + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/stdbit/stdc_first_leading_one_ui.h b/libc/src/stdbit/stdc_first_leading_one_ui.h new file mode 100644 index 0000000000000..613adf4e1ff76 --- /dev/null +++ b/libc/src/stdbit/stdc_first_leading_one_ui.h @@ -0,0 +1,18 @@ +//===-- Implementation header for stdc_first_leading_one_ui -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_UI_H +#define LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_UI_H + +namespace LIBC_NAMESPACE { + +unsigned stdc_first_leading_one_ui(unsigned value); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_UI_H diff --git a/libc/src/stdbit/stdc_first_leading_one_ul.cpp b/libc/src/stdbit/stdc_first_leading_one_ul.cpp new file mode 100644 index 0000000000000..d1bcab5dda02a --- /dev/null +++ b/libc/src/stdbit/stdc_first_leading_one_ul.cpp @@ -0,0 +1,20 @@ +//===-- Implementation of stdc_first_leading_one_ul -----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/stdbit/stdc_first_leading_one_ul.h" + +#include "src/__support/CPP/bit.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_one_ul, (unsigned long value)) { + return static_cast(cpp::first_leading_one(value)); +} + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/stdbit/stdc_first_leading_one_ul.h b/libc/src/stdbit/stdc_first_leading_one_ul.h new file mode 100644 index 0000000000000..47c179f3fbacd --- /dev/null +++ b/libc/src/stdbit/stdc_first_leading_one_ul.h @@ -0,0 +1,18 @@ +//===-- Implementation header for stdc_first_leading_one_ul -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_UL_H +#define LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_UL_H + +namespace LIBC_NAMESPACE { + +unsigned stdc_first_leading_one_ul(unsigned long value); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_UL_H diff --git a/libc/src/stdbit/stdc_first_leading_one_ull.cpp b/libc/src/stdbit/stdc_first_leading_one_ull.cpp new file mode 100644 index 0000000000000..7be8f1051ec23 --- /dev/null +++ b/libc/src/stdbit/stdc_first_leading_one_ull.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of stdc_first_leading_one_ull ----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/stdbit/stdc_first_leading_one_ull.h" + +#include "src/__support/CPP/bit.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_one_ull, + (unsigned long long value)) { + return static_cast(cpp::first_leading_one(value)); +} + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/stdbit/stdc_first_leading_one_ull.h b/libc/src/stdbit/stdc_first_leading_one_ull.h new file mode 100644 index 0000000000000..344d03f7100f4 --- /dev/null +++ b/libc/src/stdbit/stdc_first_leading_one_ull.h @@ -0,0 +1,18 @@ +//===-- Implementation header for stdc_first_leading_one_ull ----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_ULL_H +#define LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_ULL_H + +namespace LIBC_NAMESPACE { + +unsigned stdc_first_leading_one_ull(unsigned long long value); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_ULL_H diff --git a/libc/src/stdbit/stdc_first_leading_one_us.cpp b/libc/src/stdbit/stdc_first_leading_one_us.cpp new file mode 100644 index 0000000000000..7a4c7e673f367 --- /dev/null +++ b/libc/src/stdbit/stdc_first_leading_one_us.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of stdc_first_leading_one_us -----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/stdbit/stdc_first_leading_one_us.h" + +#include "src/__support/CPP/bit.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(unsigned, stdc_first_leading_one_us, + (unsigned short value)) { + return static_cast(cpp::first_leading_one(value)); +} + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/stdbit/stdc_first_leading_one_us.h b/libc/src/stdbit/stdc_first_leading_one_us.h new file mode 100644 index 0000000000000..9d5feaf1e92f0 --- /dev/null +++ b/libc/src/stdbit/stdc_first_leading_one_us.h @@ -0,0 +1,18 @@ +//===-- Implementation header for stdc_first_leading_one_us -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_US_H +#define LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_US_H + +namespace LIBC_NAMESPACE { + +unsigned stdc_first_leading_one_us(unsigned short value); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_STDBIT_STDC_FIRST_LEADING_ONE_US_H diff --git a/libc/test/include/stdbit_test.cpp b/libc/test/include/stdbit_test.cpp index 9a66a76de20bc..c2fbcb8ce2d32 100644 --- a/libc/test/include/stdbit_test.cpp +++ b/libc/test/include/stdbit_test.cpp @@ -50,6 +50,13 @@ unsigned stdc_first_leading_zero_ul(unsigned long) noexcept { return 0xEDU; } unsigned stdc_first_leading_zero_ull(unsigned long long) noexcept { return 0xEFU; } +unsigned stdc_first_leading_one_uc(unsigned char) noexcept { return 0xFAU; } +unsigned stdc_first_leading_one_us(unsigned short) noexcept { return 0xFBU; } +unsigned stdc_first_leading_one_ui(unsigned) noexcept { return 0xFCU; } +unsigned stdc_first_leading_one_ul(unsigned long) noexcept { return 0xFDU; } +unsigned stdc_first_leading_one_ull(unsigned long long) noexcept { + return 0xFFU; +} } #include "include/llvm-libc-macros/stdbit-macros.h" @@ -93,3 +100,11 @@ TEST(LlvmLibcStdbitTest, TypeGenericMacroFirstLeadingZero) { EXPECT_EQ(stdc_first_leading_zero(0UL), 0xEDU); EXPECT_EQ(stdc_first_leading_zero(0ULL), 0xEFU); } + +TEST(LlvmLibcStdbitTest, TypeGenericMacroFirstLeadingOne) { + EXPECT_EQ(stdc_first_leading_one(static_cast(0U)), 0xFAU); + EXPECT_EQ(stdc_first_leading_one(static_cast(0U)), 0xFBU); + EXPECT_EQ(stdc_first_leading_one(0U), 0xFCU); + EXPECT_EQ(stdc_first_leading_one(0UL), 0xFDU); + EXPECT_EQ(stdc_first_leading_one(0ULL), 0xFFU); +} diff --git a/libc/test/src/__support/CPP/bit_test.cpp b/libc/test/src/__support/CPP/bit_test.cpp index 00d8ca5d293ac..a70726d4feb24 100644 --- a/libc/test/src/__support/CPP/bit_test.cpp +++ b/libc/test/src/__support/CPP/bit_test.cpp @@ -213,4 +213,11 @@ TYPED_TEST(LlvmLibcBitTest, FirstLeadingZero, UnsignedTypes) { cpp::numeric_limits::digits - i); } +TYPED_TEST(LlvmLibcBitTest, FirstLeadingOne, UnsignedTypes) { + EXPECT_EQ(first_leading_one(static_cast(0)), 0); + for (int i = 0U; i != cpp::numeric_limits::digits; ++i) + EXPECT_EQ(first_leading_one(T(1) << i), + cpp::numeric_limits::digits - i); +} + } // namespace LIBC_NAMESPACE::cpp diff --git a/libc/test/src/stdbit/CMakeLists.txt b/libc/test/src/stdbit/CMakeLists.txt index bc7e49d186a0d..e32663f88e862 100644 --- a/libc/test/src/stdbit/CMakeLists.txt +++ b/libc/test/src/stdbit/CMakeLists.txt @@ -6,6 +6,7 @@ set(prefixes trailing_zeros trailing_ones first_leading_zero + first_leading_one ) set(suffixes c s i l ll) foreach(prefix IN LISTS prefixes) diff --git a/libc/test/src/stdbit/stdc_first_leading_one_uc_test.cpp b/libc/test/src/stdbit/stdc_first_leading_one_uc_test.cpp new file mode 100644 index 0000000000000..b8c8db587098e --- /dev/null +++ b/libc/test/src/stdbit/stdc_first_leading_one_uc_test.cpp @@ -0,0 +1,21 @@ +//===-- Unittests for stdc_first_leading_one_uc ---------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/__support/CPP/limits.h" +#include "src/stdbit/stdc_first_leading_one_uc.h" +#include "test/UnitTest/Test.h" + +TEST(LlvmLibcStdcFirstLeadingOneUcTest, Zero) { + EXPECT_EQ(LIBC_NAMESPACE::stdc_first_leading_one_uc(0U), 0U); +} + +TEST(LlvmLibcStdcFirstLeadingOneUcTest, OneHot) { + for (unsigned i = 0U; i != UCHAR_WIDTH; ++i) + EXPECT_EQ(LIBC_NAMESPACE::stdc_first_leading_one_uc(1U << i), + UCHAR_WIDTH - i); +} diff --git a/libc/test/src/stdbit/stdc_first_leading_one_ui_test.cpp b/libc/test/src/stdbit/stdc_first_leading_one_ui_test.cpp new file mode 100644 index 0000000000000..319d7482c50f9 --- /dev/null +++ b/libc/test/src/stdbit/stdc_first_leading_one_ui_test.cpp @@ -0,0 +1,21 @@ +//===-- Unittests for stdc_first_leading_one_ui ---------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/__support/CPP/limits.h" +#include "src/stdbit/stdc_first_leading_one_ui.h" +#include "test/UnitTest/Test.h" + +TEST(LlvmLibcStdcFirstLeadingOneUiTest, Zero) { + EXPECT_EQ(LIBC_NAMESPACE::stdc_first_leading_one_ui(0U), 0U); +} + +TEST(LlvmLibcStdcFirstLeadingOneUiTest, OneHot) { + for (unsigned i = 0U; i != UINT_WIDTH; ++i) + EXPECT_EQ(LIBC_NAMESPACE::stdc_first_leading_one_ui(1U << i), + UINT_WIDTH - i); +} diff --git a/libc/test/src/stdbit/stdc_first_leading_one_ul_test.cpp b/libc/test/src/stdbit/stdc_first_leading_one_ul_test.cpp new file mode 100644 index 0000000000000..5884cec418ce2 --- /dev/null +++ b/libc/test/src/stdbit/stdc_first_leading_one_ul_test.cpp @@ -0,0 +1,21 @@ +//===-- Unittests for stdc_first_leading_one_ul ---------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/__support/CPP/limits.h" +#include "src/stdbit/stdc_first_leading_one_ul.h" +#include "test/UnitTest/Test.h" + +TEST(LlvmLibcStdcFirstLeadingOneUlTest, Zero) { + EXPECT_EQ(LIBC_NAMESPACE::stdc_first_leading_one_ul(0UL), 0U); +} + +TEST(LlvmLibcStdcFirstLeadingOneUlTest, OneHot) { + for (unsigned i = 0U; i != ULONG_WIDTH; ++i) + EXPECT_EQ(LIBC_NAMESPACE::stdc_first_leading_one_ul(1UL << i), + ULONG_WIDTH - i); +} diff --git a/libc/test/src/stdbit/stdc_first_leading_one_ull_test.cpp b/libc/test/src/stdbit/stdc_first_leading_one_ull_test.cpp new file mode 100644 index 0000000000000..bf57f16c1dcaa --- /dev/null +++ b/libc/test/src/stdbit/stdc_first_leading_one_ull_test.cpp @@ -0,0 +1,21 @@ +//===-- Unittests for stdc_first_leading_one_ull --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/__support/CPP/limits.h" +#include "src/stdbit/stdc_first_leading_one_ull.h" +#include "test/UnitTest/Test.h" + +TEST(LlvmLibcStdcFirstLeadingOneUllTest, Zero) { + EXPECT_EQ(LIBC_NAMESPACE::stdc_first_leading_one_ull(0ULL), 0U); +} + +TEST(LlvmLibcStdcFirstLeadingOneUllTest, OneHot) { + for (unsigned i = 0U; i != ULLONG_WIDTH; ++i) + EXPECT_EQ(LIBC_NAMESPACE::stdc_first_leading_one_ull(1ULL << i), + ULLONG_WIDTH - i); +} diff --git a/libc/test/src/stdbit/stdc_first_leading_one_us_test.cpp b/libc/test/src/stdbit/stdc_first_leading_one_us_test.cpp new file mode 100644 index 0000000000000..e9488335d9b00 --- /dev/null +++ b/libc/test/src/stdbit/stdc_first_leading_one_us_test.cpp @@ -0,0 +1,21 @@ +//===-- Unittests for stdc_first_leading_one_us ---------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/__support/CPP/limits.h" +#include "src/stdbit/stdc_first_leading_one_us.h" +#include "test/UnitTest/Test.h" + +TEST(LlvmLibcStdcFirstLeadingOneUsTest, Zero) { + EXPECT_EQ(LIBC_NAMESPACE::stdc_first_leading_one_us(0U), 0U); +} + +TEST(LlvmLibcStdcFirstLeadingOneUsTest, OneHot) { + for (unsigned i = 0U; i != USHRT_WIDTH; ++i) + EXPECT_EQ(LIBC_NAMESPACE::stdc_first_leading_one_us(1U << i), + USHRT_WIDTH - i); +}