2
0

bitutils_test.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. // Copyright (c) 2019 Google Inc.
  2. //
  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. #include "source/util/bitutils.h"
  15. #include "gmock/gmock.h"
  16. namespace spvtools {
  17. namespace utils {
  18. namespace {
  19. using BitUtilsTest = ::testing::Test;
  20. TEST(BitUtilsTest, MutateBitsWholeWord) {
  21. const uint32_t zero_u32 = 0;
  22. const uint32_t max_u32 = ~0;
  23. EXPECT_EQ(MutateBits(zero_u32, 0, 0, false), zero_u32);
  24. EXPECT_EQ(MutateBits(max_u32, 0, 0, false), max_u32);
  25. EXPECT_EQ(MutateBits(zero_u32, 0, 32, false), zero_u32);
  26. EXPECT_EQ(MutateBits(zero_u32, 0, 32, true), max_u32);
  27. EXPECT_EQ(MutateBits(max_u32, 0, 32, true), max_u32);
  28. EXPECT_EQ(MutateBits(max_u32, 0, 32, false), zero_u32);
  29. }
  30. TEST(BitUtilsTest, MutateBitsLow) {
  31. const uint32_t zero_u32 = 0;
  32. const uint32_t one_u32 = 1;
  33. const uint32_t max_u32 = ~0;
  34. EXPECT_EQ(MutateBits(zero_u32, 0, 1, false), zero_u32);
  35. EXPECT_EQ(MutateBits(zero_u32, 0, 1, true), one_u32);
  36. EXPECT_EQ(MutateBits(max_u32, 0, 1, true), max_u32);
  37. EXPECT_EQ(MutateBits(one_u32, 0, 32, false), zero_u32);
  38. EXPECT_EQ(MutateBits(one_u32, 0, 1, true), one_u32);
  39. EXPECT_EQ(MutateBits(one_u32, 0, 1, false), zero_u32);
  40. EXPECT_EQ(MutateBits(zero_u32, 0, 3, true), uint32_t(7));
  41. EXPECT_EQ(MutateBits(uint32_t(7), 0, 2, false), uint32_t(4));
  42. }
  43. TEST(BitUtilsTest, MutateBitsHigh) {
  44. const uint8_t zero_u8 = 0;
  45. const uint8_t one_u8 = 1;
  46. const uint8_t max_u8 = 255;
  47. EXPECT_EQ(MutateBits(zero_u8, 7, 0, true), zero_u8);
  48. EXPECT_EQ(MutateBits(zero_u8, 7, 1, true), uint8_t(128));
  49. EXPECT_EQ(MutateBits(one_u8, 7, 1, true), uint8_t(129));
  50. EXPECT_EQ(MutateBits(max_u8, 7, 1, true), max_u8);
  51. EXPECT_EQ(MutateBits(max_u8, 7, 1, false), uint8_t(127));
  52. EXPECT_EQ(MutateBits(max_u8, 6, 2, true), max_u8);
  53. EXPECT_EQ(MutateBits(max_u8, 6, 2, false), uint8_t(63));
  54. }
  55. TEST(BitUtilsTest, MutateBitsUint8Mid) {
  56. const uint8_t zero_u8 = 0;
  57. const uint8_t max_u8 = 255;
  58. EXPECT_EQ(MutateBits(zero_u8, 1, 2, true), uint8_t(6));
  59. EXPECT_EQ(MutateBits(max_u8, 1, 2, true), max_u8);
  60. EXPECT_EQ(MutateBits(max_u8, 1, 2, false), uint8_t(0xF9));
  61. EXPECT_EQ(MutateBits(zero_u8, 2, 3, true), uint8_t(0x1C));
  62. }
  63. TEST(BitUtilsTest, MutateBitsUint64Mid) {
  64. const uint64_t zero_u64 = 0;
  65. const uint64_t max_u64 = ~zero_u64;
  66. EXPECT_EQ(MutateBits(zero_u64, 1, 2, true), uint64_t(6));
  67. EXPECT_EQ(MutateBits(max_u64, 1, 2, true), max_u64);
  68. EXPECT_EQ(MutateBits(max_u64, 1, 2, false), uint64_t(0xFFFFFFFFFFFFFFF9));
  69. EXPECT_EQ(MutateBits(zero_u64, 2, 3, true), uint64_t(0x000000000000001C));
  70. EXPECT_EQ(MutateBits(zero_u64, 2, 35, true), uint64_t(0x0000001FFFFFFFFC));
  71. EXPECT_EQ(MutateBits(zero_u64, 36, 4, true), uint64_t(0x000000F000000000));
  72. EXPECT_EQ(MutateBits(max_u64, 36, 4, false), uint64_t(0xFFFFFF0FFFFFFFFF));
  73. }
  74. TEST(BitUtilsTest, SetHighBitsUint32) {
  75. const uint32_t zero_u32 = 0;
  76. const uint32_t one_u32 = 1;
  77. const uint32_t max_u32 = ~zero_u32;
  78. EXPECT_EQ(SetHighBits(zero_u32, 0), zero_u32);
  79. EXPECT_EQ(SetHighBits(zero_u32, 1), 0x80000000);
  80. EXPECT_EQ(SetHighBits(one_u32, 1), 0x80000001);
  81. EXPECT_EQ(SetHighBits(one_u32, 2), 0xC0000001);
  82. EXPECT_EQ(SetHighBits(zero_u32, 31), 0xFFFFFFFE);
  83. EXPECT_EQ(SetHighBits(zero_u32, 32), max_u32);
  84. EXPECT_EQ(SetHighBits(max_u32, 32), max_u32);
  85. }
  86. TEST(BitUtilsTest, ClearHighBitsUint32) {
  87. const uint32_t zero_u32 = 0;
  88. const uint32_t one_u32 = 1;
  89. const uint32_t max_u32 = ~zero_u32;
  90. EXPECT_EQ(ClearHighBits(zero_u32, 0), zero_u32);
  91. EXPECT_EQ(ClearHighBits(zero_u32, 1), zero_u32);
  92. EXPECT_EQ(ClearHighBits(one_u32, 1), one_u32);
  93. EXPECT_EQ(ClearHighBits(one_u32, 31), one_u32);
  94. EXPECT_EQ(ClearHighBits(one_u32, 32), zero_u32);
  95. EXPECT_EQ(ClearHighBits(max_u32, 0), max_u32);
  96. EXPECT_EQ(ClearHighBits(max_u32, 1), 0x7FFFFFFF);
  97. EXPECT_EQ(ClearHighBits(max_u32, 2), 0x3FFFFFFF);
  98. EXPECT_EQ(ClearHighBits(max_u32, 31), one_u32);
  99. EXPECT_EQ(ClearHighBits(max_u32, 32), zero_u32);
  100. }
  101. TEST(BitUtilsTest, IsBitSetAtPositionZero) {
  102. const uint32_t zero_u32 = 0;
  103. for (size_t i = 0; i != 32; ++i) {
  104. EXPECT_FALSE(IsBitAtPositionSet(zero_u32, i));
  105. }
  106. const uint8_t zero_u8 = 0;
  107. for (size_t i = 0; i != 8; ++i) {
  108. EXPECT_FALSE(IsBitAtPositionSet(zero_u8, i));
  109. }
  110. const uint64_t zero_u64 = 0;
  111. for (size_t i = 0; i != 64; ++i) {
  112. EXPECT_FALSE(IsBitAtPositionSet(zero_u64, i));
  113. }
  114. }
  115. TEST(BitUtilsTest, IsBitSetAtPositionOne) {
  116. const uint32_t one_u32 = 1;
  117. for (size_t i = 0; i != 32; ++i) {
  118. if (i == 0) {
  119. EXPECT_TRUE(IsBitAtPositionSet(one_u32, i));
  120. } else {
  121. EXPECT_FALSE(IsBitAtPositionSet(one_u32, i));
  122. }
  123. }
  124. const uint32_t two_to_17_u32 = 1 << 17;
  125. for (size_t i = 0; i != 32; ++i) {
  126. if (i == 17) {
  127. EXPECT_TRUE(IsBitAtPositionSet(two_to_17_u32, i));
  128. } else {
  129. EXPECT_FALSE(IsBitAtPositionSet(two_to_17_u32, i));
  130. }
  131. }
  132. const uint8_t two_to_4_u8 = 1 << 4;
  133. for (size_t i = 0; i != 8; ++i) {
  134. if (i == 4) {
  135. EXPECT_TRUE(IsBitAtPositionSet(two_to_4_u8, i));
  136. } else {
  137. EXPECT_FALSE(IsBitAtPositionSet(two_to_4_u8, i));
  138. }
  139. }
  140. const uint64_t two_to_55_u64 = uint64_t(1) << 55;
  141. for (size_t i = 0; i != 64; ++i) {
  142. if (i == 55) {
  143. EXPECT_TRUE(IsBitAtPositionSet(two_to_55_u64, i));
  144. } else {
  145. EXPECT_FALSE(IsBitAtPositionSet(two_to_55_u64, i));
  146. }
  147. }
  148. }
  149. TEST(BitUtilsTest, IsBitSetAtPositionAll) {
  150. const uint32_t max_u32 = ~0;
  151. for (size_t i = 0; i != 32; ++i) {
  152. EXPECT_TRUE(IsBitAtPositionSet(max_u32, i));
  153. }
  154. const uint32_t max_u8 = ~uint8_t(0);
  155. for (size_t i = 0; i != 8; ++i) {
  156. EXPECT_TRUE(IsBitAtPositionSet(max_u8, i));
  157. }
  158. const uint64_t max_u64 = ~uint64_t(0);
  159. for (size_t i = 0; i != 64; ++i) {
  160. EXPECT_TRUE(IsBitAtPositionSet(max_u64, i));
  161. }
  162. }
  163. struct ExtendedValueTestCase {
  164. uint32_t input;
  165. uint32_t bit_width;
  166. uint32_t expected_result;
  167. };
  168. using SignExtendedValueTest = ::testing::TestWithParam<ExtendedValueTestCase>;
  169. TEST_P(SignExtendedValueTest, SignExtendValue) {
  170. const auto& tc = GetParam();
  171. auto result = SignExtendValue(tc.input, tc.bit_width);
  172. EXPECT_EQ(result, tc.expected_result);
  173. }
  174. INSTANTIATE_TEST_SUITE_P(
  175. SignExtendValue, SignExtendedValueTest,
  176. ::testing::Values(ExtendedValueTestCase{1, 1, 0xFFFFFFFF},
  177. ExtendedValueTestCase{1, 2, 0x1},
  178. ExtendedValueTestCase{2, 1, 0x0},
  179. ExtendedValueTestCase{0x8, 4, 0xFFFFFFF8},
  180. ExtendedValueTestCase{0x8765, 16, 0xFFFF8765},
  181. ExtendedValueTestCase{0x7765, 16, 0x7765},
  182. ExtendedValueTestCase{0xDEADBEEF, 32, 0xDEADBEEF}));
  183. using ZeroExtendedValueTest = ::testing::TestWithParam<ExtendedValueTestCase>;
  184. TEST_P(ZeroExtendedValueTest, ZeroExtendValue) {
  185. const auto& tc = GetParam();
  186. auto result = ZeroExtendValue(tc.input, tc.bit_width);
  187. EXPECT_EQ(result, tc.expected_result);
  188. }
  189. INSTANTIATE_TEST_SUITE_P(
  190. ZeroExtendValue, ZeroExtendedValueTest,
  191. ::testing::Values(ExtendedValueTestCase{1, 1, 0x1},
  192. ExtendedValueTestCase{1, 2, 0x1},
  193. ExtendedValueTestCase{2, 1, 0x0},
  194. ExtendedValueTestCase{0x8, 4, 0x8},
  195. ExtendedValueTestCase{0xFF8765, 16, 0x8765},
  196. ExtendedValueTestCase{0xDEADBEEF, 32, 0xDEADBEEF}));
  197. } // namespace
  198. } // namespace utils
  199. } // namespace spvtools