Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
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
2 changes: 1 addition & 1 deletion tests/std/tests/GH_001103_countl_zero_correctness/env.lst
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

RUNALL_INCLUDE ..\usual_20_matrix.lst
RUNALL_INCLUDE ..\usual_matrix.lst
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