diff options
author | Milo Yip <miloyip@gmail.com> | 2020-08-07 05:12:21 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-07 05:12:21 +0300 |
commit | ce81bc9edfe773667a7a4454ba81dac72ed4364c (patch) | |
tree | 5b4b375c71de4567127fea284bfdd89956fceff6 | |
parent | f56928de85d56add3ca6ae7cf7f119a42ee1585b (diff) | |
parent | 5fbf8bf89cec8154c4b0be0c5c529694e8477bf2 (diff) |
Merge pull request #1760 from escherstair/fix_ce6_support
fix _BitScanReverse() usage for CE6
-rw-r--r-- | include/rapidjson/internal/clzll.h | 6 | ||||
-rw-r--r-- | test/unittest/CMakeLists.txt | 1 | ||||
-rw-r--r-- | test/unittest/clzlltest.cpp | 34 |
3 files changed, 38 insertions, 3 deletions
diff --git a/include/rapidjson/internal/clzll.h b/include/rapidjson/internal/clzll.h index 6cd79234..47bb7ab1 100644 --- a/include/rapidjson/internal/clzll.h +++ b/include/rapidjson/internal/clzll.h @@ -17,7 +17,7 @@ #include "../rapidjson.h" -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(UNDER_CE) #include <intrin.h> #if defined(_WIN64) #pragma intrinsic(_BitScanReverse64) @@ -34,7 +34,7 @@ inline uint32_t clzll(uint64_t x) { // infinite loop in the software implementation. RAPIDJSON_ASSERT(x != 0); -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(UNDER_CE) unsigned long r = 0; #if defined(_WIN64) _BitScanReverse64(&r, x); @@ -53,7 +53,7 @@ inline uint32_t clzll(uint64_t x) { return static_cast<uint32_t>(__builtin_clzll(x)); #else // naive version - uint32_t r; + uint32_t r = 0; while (!(x & (static_cast<uint64_t>(1) << 63))) { x <<= 1; ++r; diff --git a/test/unittest/CMakeLists.txt b/test/unittest/CMakeLists.txt index 072b7b15..fc8803ef 100644 --- a/test/unittest/CMakeLists.txt +++ b/test/unittest/CMakeLists.txt @@ -3,6 +3,7 @@ include(CheckCXXCompilerFlag) set(UNITTEST_SOURCES allocatorstest.cpp bigintegertest.cpp + clzlltest.cpp cursorstreamwrappertest.cpp documenttest.cpp dtoatest.cpp diff --git a/test/unittest/clzlltest.cpp b/test/unittest/clzlltest.cpp new file mode 100644 index 00000000..a5b3e2ef --- /dev/null +++ b/test/unittest/clzlltest.cpp @@ -0,0 +1,34 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#include "unittest.h" +#include "rapidjson/internal/clzll.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +#endif + +using namespace rapidjson::internal; + +TEST(clzll, normal) { + EXPECT_EQ(clzll(1), 63U); + EXPECT_EQ(clzll(2), 62U); + EXPECT_EQ(clzll(12), 60U); + EXPECT_EQ(clzll(0x0000000080000001UL), 32U); + EXPECT_EQ(clzll(0x8000000000000001UL), 0U); +} + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif |