Skip to content

Commit

Permalink
Resolves microsoft#1120
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexGuteniev committed Aug 8, 2020
1 parent e000d3f commit 602017f
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 0 deletions.
1 change: 1 addition & 0 deletions tests/std/test.lst
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ tests\GH_000890_pow_template
tests\GH_000940_missing_valarray_copy
tests\GH_001010_filesystem_error_encoding
tests\GH_001017_discrete_distribution_out_of_range
tests\GH_001103_countl_zero_correctness
tests\LWG2597_complex_branch_cut
tests\LWG3018_shared_ptr_function
tests\P0024R2_parallel_algorithms_adjacent_difference
Expand Down
4 changes: 4 additions & 0 deletions tests/std/tests/GH_001103_countl_zero_correctness/env.lst
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

RUNALL_INCLUDE ..\usual_latest_matrix.lst
44 changes: 44 additions & 0 deletions tests/std/tests/GH_001103_countl_zero_correctness/test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright (c) Microsoft Corporation.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#include <cassert>
#include <bit>

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

// Since the fallback intrinsic is available on ARM too, don't need to exclude ARM

// Currently need to test not only in C++20 mode,
// May update to loder C++ if the helper is used internally too, for example in <bitset>

using namespace std;

int main() {
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);
assert(_Countl_zero_bsr(static_cast<unsigned char>(0xF8)) == 0);

assert(_Countl_zero_bsr(static_cast<unsigned short>(0x0000)) == 16);
assert(_Countl_zero_bsr(static_cast<unsigned short>(0x0013)) == 11);
assert(_Countl_zero_bsr(static_cast<unsigned short>(0x8003)) == 0);
assert(_Countl_zero_bsr(static_cast<unsigned short>(0xF008)) == 0);

assert(_Countl_zero_bsr(static_cast<unsigned short>(0x0000)) == 16);
assert(_Countl_zero_bsr(static_cast<unsigned short>(0x0013)) == 11);
assert(_Countl_zero_bsr(static_cast<unsigned short>(0x8003)) == 0);
assert(_Countl_zero_bsr(static_cast<unsigned short>(0xF008)) == 0);

assert(_Countl_zero_bsr(static_cast<unsigned long>(0x0000'0000)) == 32);
assert(_Countl_zero_bsr(static_cast<unsigned long>(0x0000'0013)) == 27);
assert(_Countl_zero_bsr(static_cast<unsigned long>(0x8000'0003)) == 0);
assert(_Countl_zero_bsr(static_cast<unsigned long>(0xF000'0008)) == 0);

assert(_Countl_zero_bsr(static_cast<unsigned long long>(0x0000'0000'0000'0000)) == 64);
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);

return 0;
}

0 comments on commit 602017f

Please sign in to comment.