constants_test.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // Copyright (c) 2019 Google LLC
  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/opt/constants.h"
  15. #include <gtest/gtest-param-test.h>
  16. #include "gmock/gmock.h"
  17. #include "gtest/gtest.h"
  18. #include "source/opt/types.h"
  19. namespace spvtools {
  20. namespace opt {
  21. namespace analysis {
  22. namespace {
  23. using ConstantTest = ::testing::Test;
  24. using ::testing::ValuesIn;
  25. template <typename T>
  26. struct GetExtendedValueCase {
  27. bool is_signed;
  28. int width;
  29. std::vector<uint32_t> words;
  30. T expected_value;
  31. };
  32. using GetSignExtendedValueCase = GetExtendedValueCase<int64_t>;
  33. using GetZeroExtendedValueCase = GetExtendedValueCase<uint64_t>;
  34. using GetSignExtendedValueTest =
  35. ::testing::TestWithParam<GetSignExtendedValueCase>;
  36. using GetZeroExtendedValueTest =
  37. ::testing::TestWithParam<GetZeroExtendedValueCase>;
  38. TEST_P(GetSignExtendedValueTest, Case) {
  39. Integer type(GetParam().width, GetParam().is_signed);
  40. IntConstant value(&type, GetParam().words);
  41. EXPECT_EQ(GetParam().expected_value, value.GetSignExtendedValue());
  42. }
  43. TEST_P(GetZeroExtendedValueTest, Case) {
  44. Integer type(GetParam().width, GetParam().is_signed);
  45. IntConstant value(&type, GetParam().words);
  46. EXPECT_EQ(GetParam().expected_value, value.GetZeroExtendedValue());
  47. }
  48. const uint32_t k32ones = ~uint32_t(0);
  49. const uint64_t k64ones = ~uint64_t(0);
  50. const int64_t kSBillion = 1000 * 1000 * 1000;
  51. const uint64_t kUBillion = 1000 * 1000 * 1000;
  52. INSTANTIATE_TEST_SUITE_P(AtMost32Bits, GetSignExtendedValueTest,
  53. ValuesIn(std::vector<GetSignExtendedValueCase>{
  54. // 4 bits
  55. {false, 4, {0}, 0},
  56. {false, 4, {7}, 7},
  57. {false, 4, {15}, 15},
  58. {true, 4, {0}, 0},
  59. {true, 4, {7}, 7},
  60. {true, 4, {0xfffffff8}, -8},
  61. {true, 4, {k32ones}, -1},
  62. // 16 bits
  63. {false, 16, {0}, 0},
  64. {false, 16, {32767}, 32767},
  65. {false, 16, {32768}, 32768},
  66. {false, 16, {65000}, 65000},
  67. {true, 16, {0}, 0},
  68. {true, 16, {32767}, 32767},
  69. {true, 16, {0xfffffff8}, -8},
  70. {true, 16, {k32ones}, -1},
  71. // 32 bits
  72. {false, 32, {0}, 0},
  73. {false, 32, {1000000}, 1000000},
  74. {true, 32, {0xfffffff8}, -8},
  75. {true, 32, {k32ones}, -1},
  76. }));
  77. INSTANTIATE_TEST_SUITE_P(AtMost64Bits, GetSignExtendedValueTest,
  78. ValuesIn(std::vector<GetSignExtendedValueCase>{
  79. // 48 bits
  80. {false, 48, {0, 0}, 0},
  81. {false, 48, {5, 0}, 5},
  82. {false, 48, {0xfffffff8, k32ones}, -8},
  83. {false, 48, {k32ones, k32ones}, -1},
  84. {false, 48, {0xdcd65000, 1}, 8 * kSBillion},
  85. {true, 48, {0xfffffff8, k32ones}, -8},
  86. {true, 48, {k32ones, k32ones}, -1},
  87. {true, 48, {0xdcd65000, 1}, 8 * kSBillion},
  88. // 64 bits
  89. {false, 64, {12, 0}, 12},
  90. {false, 64, {0xdcd65000, 1}, 8 * kSBillion},
  91. {false, 48, {0xfffffff8, k32ones}, -8},
  92. {false, 64, {k32ones, k32ones}, -1},
  93. {true, 64, {12, 0}, 12},
  94. {true, 64, {0xdcd65000, 1}, 8 * kSBillion},
  95. {true, 48, {0xfffffff8, k32ones}, -8},
  96. {true, 64, {k32ones, k32ones}, -1},
  97. }));
  98. INSTANTIATE_TEST_SUITE_P(AtMost32Bits, GetZeroExtendedValueTest,
  99. ValuesIn(std::vector<GetZeroExtendedValueCase>{
  100. // 4 bits
  101. {false, 4, {0}, 0},
  102. {false, 4, {7}, 7},
  103. {false, 4, {15}, 15},
  104. {true, 4, {0}, 0},
  105. {true, 4, {7}, 7},
  106. {true, 4, {0xfffffff8}, 0xfffffff8},
  107. {true, 4, {k32ones}, k32ones},
  108. // 16 bits
  109. {false, 16, {0}, 0},
  110. {false, 16, {32767}, 32767},
  111. {false, 16, {32768}, 32768},
  112. {false, 16, {65000}, 65000},
  113. {true, 16, {0}, 0},
  114. {true, 16, {32767}, 32767},
  115. {true, 16, {0xfffffff8}, 0xfffffff8},
  116. {true, 16, {k32ones}, k32ones},
  117. // 32 bits
  118. {false, 32, {0}, 0},
  119. {false, 32, {1000000}, 1000000},
  120. {true, 32, {0xfffffff8}, 0xfffffff8},
  121. {true, 32, {k32ones}, k32ones},
  122. }));
  123. INSTANTIATE_TEST_SUITE_P(AtMost64Bits, GetZeroExtendedValueTest,
  124. ValuesIn(std::vector<GetZeroExtendedValueCase>{
  125. // 48 bits
  126. {false, 48, {0, 0}, 0},
  127. {false, 48, {5, 0}, 5},
  128. {false, 48, {0xfffffff8, k32ones}, uint64_t(-8)},
  129. {false, 48, {k32ones, k32ones}, uint64_t(-1)},
  130. {false, 48, {0xdcd65000, 1}, 8 * kUBillion},
  131. {true, 48, {0xfffffff8, k32ones}, uint64_t(-8)},
  132. {true, 48, {k32ones, k32ones}, uint64_t(-1)},
  133. {true, 48, {0xdcd65000, 1}, 8 * kUBillion},
  134. // 64 bits
  135. {false, 64, {12, 0}, 12},
  136. {false, 64, {0xdcd65000, 1}, 8 * kUBillion},
  137. {false, 48, {0xfffffff8, k32ones}, uint64_t(-8)},
  138. {false, 64, {k32ones, k32ones}, k64ones},
  139. {true, 64, {12, 0}, 12},
  140. {true, 64, {0xdcd65000, 1}, 8 * kUBillion},
  141. {true, 48, {0xfffffff8, k32ones}, uint64_t(-8)},
  142. {true, 64, {k32ones, k32ones}, k64ones},
  143. }));
  144. } // namespace
  145. } // namespace analysis
  146. } // namespace opt
  147. } // namespace spvtools