1fd4e5da5Sopenharmony_ci// Copyright (c) 2019 Google LLC
2fd4e5da5Sopenharmony_ci//
3fd4e5da5Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
4fd4e5da5Sopenharmony_ci// you may not use this file except in compliance with the License.
5fd4e5da5Sopenharmony_ci// You may obtain a copy of the License at
6fd4e5da5Sopenharmony_ci//
7fd4e5da5Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
8fd4e5da5Sopenharmony_ci//
9fd4e5da5Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
10fd4e5da5Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
11fd4e5da5Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fd4e5da5Sopenharmony_ci// See the License for the specific language governing permissions and
13fd4e5da5Sopenharmony_ci// limitations under the License.
14fd4e5da5Sopenharmony_ci
15fd4e5da5Sopenharmony_ci#include "source/opt/constants.h"
16fd4e5da5Sopenharmony_ci
17fd4e5da5Sopenharmony_ci#include <gtest/gtest-param-test.h>
18fd4e5da5Sopenharmony_ci
19fd4e5da5Sopenharmony_ci#include "gtest/gtest.h"
20fd4e5da5Sopenharmony_ci#include "source/opt/types.h"
21fd4e5da5Sopenharmony_ci
22fd4e5da5Sopenharmony_cinamespace spvtools {
23fd4e5da5Sopenharmony_cinamespace opt {
24fd4e5da5Sopenharmony_cinamespace analysis {
25fd4e5da5Sopenharmony_cinamespace {
26fd4e5da5Sopenharmony_ci
27fd4e5da5Sopenharmony_ciusing ConstantTest = ::testing::Test;
28fd4e5da5Sopenharmony_ciusing ::testing::ValuesIn;
29fd4e5da5Sopenharmony_ci
30fd4e5da5Sopenharmony_citemplate <typename T>
31fd4e5da5Sopenharmony_cistruct GetExtendedValueCase {
32fd4e5da5Sopenharmony_ci  bool is_signed;
33fd4e5da5Sopenharmony_ci  int width;
34fd4e5da5Sopenharmony_ci  std::vector<uint32_t> words;
35fd4e5da5Sopenharmony_ci  T expected_value;
36fd4e5da5Sopenharmony_ci};
37fd4e5da5Sopenharmony_ci
38fd4e5da5Sopenharmony_ciusing GetSignExtendedValueCase = GetExtendedValueCase<int64_t>;
39fd4e5da5Sopenharmony_ciusing GetZeroExtendedValueCase = GetExtendedValueCase<uint64_t>;
40fd4e5da5Sopenharmony_ci
41fd4e5da5Sopenharmony_ciusing GetSignExtendedValueTest =
42fd4e5da5Sopenharmony_ci    ::testing::TestWithParam<GetSignExtendedValueCase>;
43fd4e5da5Sopenharmony_ciusing GetZeroExtendedValueTest =
44fd4e5da5Sopenharmony_ci    ::testing::TestWithParam<GetZeroExtendedValueCase>;
45fd4e5da5Sopenharmony_ci
46fd4e5da5Sopenharmony_ciTEST_P(GetSignExtendedValueTest, Case) {
47fd4e5da5Sopenharmony_ci  Integer type(GetParam().width, GetParam().is_signed);
48fd4e5da5Sopenharmony_ci  IntConstant value(&type, GetParam().words);
49fd4e5da5Sopenharmony_ci
50fd4e5da5Sopenharmony_ci  EXPECT_EQ(GetParam().expected_value, value.GetSignExtendedValue());
51fd4e5da5Sopenharmony_ci}
52fd4e5da5Sopenharmony_ci
53fd4e5da5Sopenharmony_ciTEST_P(GetZeroExtendedValueTest, Case) {
54fd4e5da5Sopenharmony_ci  Integer type(GetParam().width, GetParam().is_signed);
55fd4e5da5Sopenharmony_ci  IntConstant value(&type, GetParam().words);
56fd4e5da5Sopenharmony_ci
57fd4e5da5Sopenharmony_ci  EXPECT_EQ(GetParam().expected_value, value.GetZeroExtendedValue());
58fd4e5da5Sopenharmony_ci}
59fd4e5da5Sopenharmony_ci
60fd4e5da5Sopenharmony_ciconst uint32_t k32ones = ~uint32_t(0);
61fd4e5da5Sopenharmony_ciconst uint64_t k64ones = ~uint64_t(0);
62fd4e5da5Sopenharmony_ciconst int64_t kSBillion = 1000 * 1000 * 1000;
63fd4e5da5Sopenharmony_ciconst uint64_t kUBillion = 1000 * 1000 * 1000;
64fd4e5da5Sopenharmony_ci
65fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AtMost32Bits, GetSignExtendedValueTest,
66fd4e5da5Sopenharmony_ci                         ValuesIn(std::vector<GetSignExtendedValueCase>{
67fd4e5da5Sopenharmony_ci                             // 4 bits
68fd4e5da5Sopenharmony_ci                             {false, 4, {0}, 0},
69fd4e5da5Sopenharmony_ci                             {false, 4, {7}, 7},
70fd4e5da5Sopenharmony_ci                             {false, 4, {15}, 15},
71fd4e5da5Sopenharmony_ci                             {true, 4, {0}, 0},
72fd4e5da5Sopenharmony_ci                             {true, 4, {7}, 7},
73fd4e5da5Sopenharmony_ci                             {true, 4, {0xfffffff8}, -8},
74fd4e5da5Sopenharmony_ci                             {true, 4, {k32ones}, -1},
75fd4e5da5Sopenharmony_ci                             // 16 bits
76fd4e5da5Sopenharmony_ci                             {false, 16, {0}, 0},
77fd4e5da5Sopenharmony_ci                             {false, 16, {32767}, 32767},
78fd4e5da5Sopenharmony_ci                             {false, 16, {32768}, 32768},
79fd4e5da5Sopenharmony_ci                             {false, 16, {65000}, 65000},
80fd4e5da5Sopenharmony_ci                             {true, 16, {0}, 0},
81fd4e5da5Sopenharmony_ci                             {true, 16, {32767}, 32767},
82fd4e5da5Sopenharmony_ci                             {true, 16, {0xfffffff8}, -8},
83fd4e5da5Sopenharmony_ci                             {true, 16, {k32ones}, -1},
84fd4e5da5Sopenharmony_ci                             // 32 bits
85fd4e5da5Sopenharmony_ci                             {false, 32, {0}, 0},
86fd4e5da5Sopenharmony_ci                             {false, 32, {1000000}, 1000000},
87fd4e5da5Sopenharmony_ci                             {true, 32, {0xfffffff8}, -8},
88fd4e5da5Sopenharmony_ci                             {true, 32, {k32ones}, -1},
89fd4e5da5Sopenharmony_ci                         }));
90fd4e5da5Sopenharmony_ci
91fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AtMost64Bits, GetSignExtendedValueTest,
92fd4e5da5Sopenharmony_ci                         ValuesIn(std::vector<GetSignExtendedValueCase>{
93fd4e5da5Sopenharmony_ci                             // 48 bits
94fd4e5da5Sopenharmony_ci                             {false, 48, {0, 0}, 0},
95fd4e5da5Sopenharmony_ci                             {false, 48, {5, 0}, 5},
96fd4e5da5Sopenharmony_ci                             {false, 48, {0xfffffff8, k32ones}, -8},
97fd4e5da5Sopenharmony_ci                             {false, 48, {k32ones, k32ones}, -1},
98fd4e5da5Sopenharmony_ci                             {false, 48, {0xdcd65000, 1}, 8 * kSBillion},
99fd4e5da5Sopenharmony_ci                             {true, 48, {0xfffffff8, k32ones}, -8},
100fd4e5da5Sopenharmony_ci                             {true, 48, {k32ones, k32ones}, -1},
101fd4e5da5Sopenharmony_ci                             {true, 48, {0xdcd65000, 1}, 8 * kSBillion},
102fd4e5da5Sopenharmony_ci
103fd4e5da5Sopenharmony_ci                             // 64 bits
104fd4e5da5Sopenharmony_ci                             {false, 64, {12, 0}, 12},
105fd4e5da5Sopenharmony_ci                             {false, 64, {0xdcd65000, 1}, 8 * kSBillion},
106fd4e5da5Sopenharmony_ci                             {false, 48, {0xfffffff8, k32ones}, -8},
107fd4e5da5Sopenharmony_ci                             {false, 64, {k32ones, k32ones}, -1},
108fd4e5da5Sopenharmony_ci                             {true, 64, {12, 0}, 12},
109fd4e5da5Sopenharmony_ci                             {true, 64, {0xdcd65000, 1}, 8 * kSBillion},
110fd4e5da5Sopenharmony_ci                             {true, 48, {0xfffffff8, k32ones}, -8},
111fd4e5da5Sopenharmony_ci                             {true, 64, {k32ones, k32ones}, -1},
112fd4e5da5Sopenharmony_ci                         }));
113fd4e5da5Sopenharmony_ci
114fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AtMost32Bits, GetZeroExtendedValueTest,
115fd4e5da5Sopenharmony_ci                         ValuesIn(std::vector<GetZeroExtendedValueCase>{
116fd4e5da5Sopenharmony_ci                             // 4 bits
117fd4e5da5Sopenharmony_ci                             {false, 4, {0}, 0},
118fd4e5da5Sopenharmony_ci                             {false, 4, {7}, 7},
119fd4e5da5Sopenharmony_ci                             {false, 4, {15}, 15},
120fd4e5da5Sopenharmony_ci                             {true, 4, {0}, 0},
121fd4e5da5Sopenharmony_ci                             {true, 4, {7}, 7},
122fd4e5da5Sopenharmony_ci                             {true, 4, {0xfffffff8}, 0xfffffff8},
123fd4e5da5Sopenharmony_ci                             {true, 4, {k32ones}, k32ones},
124fd4e5da5Sopenharmony_ci                             // 16 bits
125fd4e5da5Sopenharmony_ci                             {false, 16, {0}, 0},
126fd4e5da5Sopenharmony_ci                             {false, 16, {32767}, 32767},
127fd4e5da5Sopenharmony_ci                             {false, 16, {32768}, 32768},
128fd4e5da5Sopenharmony_ci                             {false, 16, {65000}, 65000},
129fd4e5da5Sopenharmony_ci                             {true, 16, {0}, 0},
130fd4e5da5Sopenharmony_ci                             {true, 16, {32767}, 32767},
131fd4e5da5Sopenharmony_ci                             {true, 16, {0xfffffff8}, 0xfffffff8},
132fd4e5da5Sopenharmony_ci                             {true, 16, {k32ones}, k32ones},
133fd4e5da5Sopenharmony_ci                             // 32 bits
134fd4e5da5Sopenharmony_ci                             {false, 32, {0}, 0},
135fd4e5da5Sopenharmony_ci                             {false, 32, {1000000}, 1000000},
136fd4e5da5Sopenharmony_ci                             {true, 32, {0xfffffff8}, 0xfffffff8},
137fd4e5da5Sopenharmony_ci                             {true, 32, {k32ones}, k32ones},
138fd4e5da5Sopenharmony_ci                         }));
139fd4e5da5Sopenharmony_ci
140fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AtMost64Bits, GetZeroExtendedValueTest,
141fd4e5da5Sopenharmony_ci                         ValuesIn(std::vector<GetZeroExtendedValueCase>{
142fd4e5da5Sopenharmony_ci                             // 48 bits
143fd4e5da5Sopenharmony_ci                             {false, 48, {0, 0}, 0},
144fd4e5da5Sopenharmony_ci                             {false, 48, {5, 0}, 5},
145fd4e5da5Sopenharmony_ci                             {false, 48, {0xfffffff8, k32ones}, uint64_t(-8)},
146fd4e5da5Sopenharmony_ci                             {false, 48, {k32ones, k32ones}, uint64_t(-1)},
147fd4e5da5Sopenharmony_ci                             {false, 48, {0xdcd65000, 1}, 8 * kUBillion},
148fd4e5da5Sopenharmony_ci                             {true, 48, {0xfffffff8, k32ones}, uint64_t(-8)},
149fd4e5da5Sopenharmony_ci                             {true, 48, {k32ones, k32ones}, uint64_t(-1)},
150fd4e5da5Sopenharmony_ci                             {true, 48, {0xdcd65000, 1}, 8 * kUBillion},
151fd4e5da5Sopenharmony_ci
152fd4e5da5Sopenharmony_ci                             // 64 bits
153fd4e5da5Sopenharmony_ci                             {false, 64, {12, 0}, 12},
154fd4e5da5Sopenharmony_ci                             {false, 64, {0xdcd65000, 1}, 8 * kUBillion},
155fd4e5da5Sopenharmony_ci                             {false, 48, {0xfffffff8, k32ones}, uint64_t(-8)},
156fd4e5da5Sopenharmony_ci                             {false, 64, {k32ones, k32ones}, k64ones},
157fd4e5da5Sopenharmony_ci                             {true, 64, {12, 0}, 12},
158fd4e5da5Sopenharmony_ci                             {true, 64, {0xdcd65000, 1}, 8 * kUBillion},
159fd4e5da5Sopenharmony_ci                             {true, 48, {0xfffffff8, k32ones}, uint64_t(-8)},
160fd4e5da5Sopenharmony_ci                             {true, 64, {k32ones, k32ones}, k64ones},
161fd4e5da5Sopenharmony_ci                         }));
162fd4e5da5Sopenharmony_ci
163fd4e5da5Sopenharmony_ci}  // namespace
164fd4e5da5Sopenharmony_ci}  // namespace analysis
165fd4e5da5Sopenharmony_ci}  // namespace opt
166fd4e5da5Sopenharmony_ci}  // namespace spvtools
167