1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ecmascript/base/bit_helper.h"
17 #include "ecmascript/tests/test_helper.h"
18
19 using namespace panda::ecmascript;
20 using namespace panda::ecmascript::base;
21
22 namespace panda::test {
23 class BitHelperTest : public BaseTestWithScope<false> {
24 protected:
25 template <class To, class From>
26 inline To MemoryCast(const From &src) noexcept
27 {
28 static_assert(sizeof(To) == sizeof(From), "size of the types must be equal");
29 To dst;
30 if (memcpy_s(&dst, sizeof(To), &src, sizeof(From)) != EOK) {
31 LOG_FULL(FATAL) << "memcpy_s failed";
32 UNREACHABLE();
33 }
34 return dst;
35 }
36 };
37
HWTEST_F_L0(BitHelperTest, CountLeadingZeros_CountTrailingZeros)38 HWTEST_F_L0(BitHelperTest, CountLeadingZeros_CountTrailingZeros)
39 {
40 uint8_t uint8MaxValue = std::numeric_limits<uint8_t>::max();
41 uint8_t uint8MinValue = std::numeric_limits<uint8_t>::min();
42 EXPECT_EQ(CountLeadingZeros<uint8_t>(uint8MaxValue), 0U);
43 EXPECT_EQ(CountLeadingZeros<uint8_t>(uint8MinValue), 8U);
44 EXPECT_EQ(CountTrailingZeros<uint8_t>(uint8MaxValue), 0U);
45 EXPECT_EQ(CountTrailingZeros<uint8_t>(uint8MinValue), 8U);
46
47 uint16_t uint16MaxValue = std::numeric_limits<uint16_t>::max();
48 uint16_t uint16MinValue = std::numeric_limits<uint16_t>::min();
49 EXPECT_EQ(CountLeadingZeros<uint16_t>(uint16MaxValue), 0U);
50 EXPECT_EQ(CountLeadingZeros<uint16_t>(uint16MinValue), 16U);
51 EXPECT_EQ(CountTrailingZeros<uint16_t>(uint16MaxValue), 0U);
52 EXPECT_EQ(CountTrailingZeros<uint16_t>(uint16MinValue), 16U);
53
54 uint32_t uint32MaxValue = std::numeric_limits<uint32_t>::max();
55 uint32_t uint32MinValue = std::numeric_limits<uint32_t>::min();
56 EXPECT_EQ(CountLeadingZeros<uint32_t>(uint32MaxValue), 0U);
57 EXPECT_EQ(CountLeadingZeros<uint32_t>(uint32MinValue), 32U);
58 EXPECT_EQ(CountTrailingZeros<uint32_t>(uint32MaxValue), 0U);
59 EXPECT_EQ(CountTrailingZeros<uint32_t>(uint32MinValue), 32U);
60
61 uint64_t uint64MaxValue = std::numeric_limits<uint64_t>::max();
62 uint64_t uint64MinValue = std::numeric_limits<uint64_t>::min();
63 EXPECT_EQ(CountLeadingZeros<uint64_t>(uint64MaxValue), 0U);
64 EXPECT_EQ(CountLeadingZeros<uint64_t>(uint64MinValue), 64U);
65 EXPECT_EQ(CountTrailingZeros<uint64_t>(uint64MaxValue), 0U);
66 EXPECT_EQ(CountTrailingZeros<uint64_t>(uint64MinValue), 64U);
67 }
68
HWTEST_F_L0(BitHelperTest, CountLeadingZeros32_CountLeadingOnes32)69 HWTEST_F_L0(BitHelperTest, CountLeadingZeros32_CountLeadingOnes32)
70 {
71 uint32_t uint32MaxValue = std::numeric_limits<uint32_t>::max();
72 uint32_t uint32CommonValue1 = std::numeric_limits<uint32_t>::max() >> 1;
73 uint32_t uint32CommonValue2 = std::numeric_limits<uint32_t>::max() >> 31; // 31 : right shift digit
74 uint32_t uint32MinValue = std::numeric_limits<uint32_t>::min();
75 EXPECT_EQ(CountLeadingZeros32(uint32MaxValue), 0U);
76 EXPECT_EQ(CountLeadingZeros32(uint32CommonValue1), 1U);
77 EXPECT_EQ(CountLeadingZeros32(uint32CommonValue2), 31U);
78 EXPECT_EQ(CountLeadingZeros32(uint32MinValue), 32U);
79 EXPECT_EQ(CountLeadingOnes32(uint32MaxValue), 32U);
80 EXPECT_EQ(CountLeadingOnes32(uint32CommonValue1), 0U);
81 EXPECT_EQ(CountLeadingOnes32(uint32CommonValue2), 0U);
82 EXPECT_EQ(CountLeadingOnes32(uint32MinValue), 0U);
83 }
84
HWTEST_F_L0(BitHelperTest, CountLeadingZeros64_CountLeadingOnes64)85 HWTEST_F_L0(BitHelperTest, CountLeadingZeros64_CountLeadingOnes64)
86 {
87 uint64_t uint64MaxValue = std::numeric_limits<uint64_t>::max();
88 uint64_t uint64CommonValue1 = std::numeric_limits<uint64_t>::max() >> 1;
89 uint64_t uint64CommonValue2 = std::numeric_limits<uint64_t>::max() >> 63; // 63 : right shift digit
90 uint64_t uint64MinValue = std::numeric_limits<uint64_t>::min();
91 EXPECT_EQ(CountLeadingZeros64(uint64MaxValue), 0U);
92 EXPECT_EQ(CountLeadingZeros64(uint64CommonValue1), 1U);
93 EXPECT_EQ(CountLeadingZeros64(uint64CommonValue2), 63U);
94 EXPECT_EQ(CountLeadingZeros64(uint64MinValue), 64U);
95 EXPECT_EQ(CountLeadingOnes64(uint64MaxValue), 64U);
96 EXPECT_EQ(CountLeadingOnes64(uint64CommonValue1), 0U);
97 EXPECT_EQ(CountLeadingOnes64(uint64CommonValue2), 0U);
98 EXPECT_EQ(CountLeadingOnes64(uint64MinValue), 0U);
99 }
100
HWTEST_F_L0(BitHelperTest, bit_cast)101 HWTEST_F_L0(BitHelperTest, bit_cast)
102 {
103 int8_t int8Value = -128;
104 uint8_t uint8Value = 255;
105 char char8Value = 127;
106 EXPECT_EQ(bit_cast<uint8_t>(int8Value), MemoryCast<uint8_t>(int8Value));
107 EXPECT_EQ(bit_cast<char>(int8Value), MemoryCast<char>(int8Value));
108 EXPECT_EQ(bit_cast<int8_t>(uint8Value), MemoryCast<int8_t>(uint8Value));
109 EXPECT_EQ(bit_cast<char>(uint8Value), MemoryCast<char>(uint8Value));
110 EXPECT_EQ(bit_cast<int8_t>(char8Value), MemoryCast<int8_t>(char8Value));
111 EXPECT_EQ(bit_cast<uint8_t>(char8Value), MemoryCast<uint8_t>(char8Value));
112
113 int16_t int16Value = -32768;
114 uint16_t uint16Value = 65535;
115 char16_t char16Value = 32767;
116 EXPECT_EQ(bit_cast<uint16_t>(int16Value), MemoryCast<uint16_t>(int16Value));
117 EXPECT_EQ(bit_cast<char16_t>(int16Value), MemoryCast<char16_t>(int16Value));
118 EXPECT_EQ(bit_cast<int16_t>(uint16Value), MemoryCast<int16_t>(uint16Value));
119 EXPECT_EQ(bit_cast<char16_t>(uint16Value), MemoryCast<char16_t>(uint16Value));
120 EXPECT_EQ(bit_cast<int16_t>(char16Value), MemoryCast<int16_t>(char16Value));
121 EXPECT_EQ(bit_cast<uint16_t>(char16Value), MemoryCast<uint16_t>(char16Value));
122
123 int32_t int32Value = -2147483648;
124 uint32_t uint32Value = 2147483648;
125 float floatValue = -13.569243f;
126 char32_t char32Value = 2147483648;
127 EXPECT_EQ(bit_cast<uint32_t>(int32Value), MemoryCast<uint32_t>(int32Value));
128 EXPECT_EQ(bit_cast<float>(int32Value), MemoryCast<float>(int32Value));
129 EXPECT_EQ(bit_cast<char32_t>(int32Value), MemoryCast<char32_t>(int32Value));
130 EXPECT_EQ(bit_cast<int32_t>(uint32Value), MemoryCast<int32_t>(uint32Value));
131 EXPECT_EQ(bit_cast<float>(uint32Value), MemoryCast<float>(uint32Value));
132 EXPECT_EQ(bit_cast<char32_t>(uint32Value), MemoryCast<char32_t>(uint32Value));
133 EXPECT_EQ(bit_cast<int32_t>(floatValue), MemoryCast<int32_t>(floatValue));
134 EXPECT_EQ(bit_cast<uint32_t>(floatValue), MemoryCast<uint32_t>(floatValue));
135 EXPECT_EQ(bit_cast<char32_t>(floatValue), MemoryCast<char32_t>(floatValue));
136 EXPECT_EQ(bit_cast<int32_t>(char32Value), MemoryCast<int32_t>(char32Value));
137 EXPECT_EQ(bit_cast<uint32_t>(char32Value), MemoryCast<uint32_t>(char32Value));
138 EXPECT_EQ(bit_cast<float>(char32Value), MemoryCast<float>(char32Value));
139
140 int64_t int64Value = -9223372036854775807LL;
141 uint64_t uint64Value = 9223372036854775808ULL;
142 double doubleValue = -257.93458301390463;
143 EXPECT_EQ(bit_cast<uint64_t>(int64Value), MemoryCast<uint64_t>(int64Value));
144 EXPECT_EQ(bit_cast<double>(int64Value), MemoryCast<double>(int64Value));
145 EXPECT_EQ(bit_cast<int64_t>(uint64Value), MemoryCast<int64_t>(uint64Value));
146 EXPECT_EQ(bit_cast<double>(uint64Value), MemoryCast<double>(uint64Value));
147 EXPECT_EQ(bit_cast<int64_t>(doubleValue), MemoryCast<int64_t>(doubleValue));
148 EXPECT_EQ(bit_cast<uint64_t>(doubleValue), MemoryCast<uint64_t>(doubleValue));
149 }
150 } // namespace panda::test
151