Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions tests/std/tests/GH_001103_countl_zero_correctness/test.cpp
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
// Copyright (c) Microsoft Corporation.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#include <bit>
#include <cassert>
#include <limits>
#if _HAS_CXX20
#include <bit>
#endif

// Indirectly test countl_zero on old x86/x64 processors by testing a private helper,
// Indirectly test countl_zero/countr_zero on old x86/x64 processors by testing a private helper,
// which is different from the usual branch.

// Currently need this test only in C++20 mode;
// may update to older C++ if the helper is used internally too, for example in <bitset>.

using namespace std;

int main() {
// This test is applicable only to x86 and x64 platforms
#if defined(_M_IX86) || defined(_M_X64)
#if _HAS_CXX20
assert(_Countl_zero_bsr(static_cast<unsigned char>(0x00)) == 8);
assert(_Countl_zero_bsr(static_cast<unsigned char>(0x13)) == 3);
assert(_Countl_zero_bsr(static_cast<unsigned char>(0x83)) == 0);
Expand All @@ -39,29 +40,35 @@ int main() {
assert(_Countl_zero_bsr(static_cast<unsigned long long>(0x0000'0000'0000'0013)) == 59);
assert(_Countl_zero_bsr(static_cast<unsigned long long>(0x8000'0000'0000'0003)) == 0);
assert(_Countl_zero_bsr(static_cast<unsigned long long>(0xF000'0000'0000'0008)) == 0);
#endif // ^^^ C++20 ^^^

assert(_Countr_zero_bsf(static_cast<unsigned char>(0x00)) == 8);
assert(_Countr_zero_bsf(static_cast<unsigned char>(0x13)) == 0);
assert(_Countr_zero_bsf(static_cast<unsigned char>(0x82)) == 1);
assert(_Countr_zero_bsf(static_cast<unsigned char>(0x80)) == 7);
assert(_Countr_zero_bsf(static_cast<unsigned char>(0xF8)) == 3);

assert(_Countr_zero_bsf(static_cast<unsigned short>(0x0000)) == 16);
assert(_Countr_zero_bsf(static_cast<unsigned short>(0x0013)) == 0);
assert(_Countr_zero_bsf(static_cast<unsigned short>(0x8002)) == 1);
assert(_Countr_zero_bsf(static_cast<unsigned short>(0x8000)) == 15);
assert(_Countr_zero_bsf(static_cast<unsigned short>(0xF008)) == 3);

assert(_Countr_zero_bsf(static_cast<unsigned int>(0x0000'0000)) == 32);
assert(_Countr_zero_bsf(static_cast<unsigned int>(0x0000'0013)) == 0);
assert(_Countr_zero_bsf(static_cast<unsigned int>(0x8000'0002)) == 1);
assert(_Countr_zero_bsf(static_cast<unsigned int>(0x8000'0000)) == 31);
assert(_Countr_zero_bsf(static_cast<unsigned int>(0xF000'0008)) == 3);

assert(_Countr_zero_bsf(static_cast<unsigned long>(0x0000'0000)) == 32);
assert(_Countr_zero_bsf(static_cast<unsigned long>(0x0000'0013)) == 0);
assert(_Countr_zero_bsf(static_cast<unsigned long>(0x8000'0002)) == 1);
assert(_Countr_zero_bsf(static_cast<unsigned long>(0x8000'0000)) == 31);
assert(_Countr_zero_bsf(static_cast<unsigned long>(0xF000'0008)) == 3);

assert(_Countr_zero_bsf(static_cast<unsigned long long>(0x0000'0000'0000'0000)) == 64);
assert(_Countr_zero_bsf(static_cast<unsigned long long>(0x0000'0000'0000'0013)) == 0);
assert(_Countr_zero_bsf(static_cast<unsigned long long>(0x8000'0000'0000'0002)) == 1);
assert(_Countr_zero_bsf(static_cast<unsigned long long>(0x8000'0000'0000'0000)) == 63);
assert(_Countr_zero_bsf(static_cast<unsigned long long>(0xF000'0000'0000'0008)) == 3);
#endif // ^^^ defined(_M_IX86) || defined(_M_X64) ^^^
Expand Down