1 /*
2 * Copyright (C) 2024 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "gtest/gtest.h"
18
19 #include <array>
20 #include <optional>
21 #include <tuple>
22
23 #include "berberis/assembler/rv32.h"
24 #include "berberis/assembler/rv64.h"
25
26 namespace berberis {
27
28 namespace {
29
30 class Riscv64ImmediatesTest : public ::testing::Test {
31 public:
Riscv64ImmediatesTest()32 Riscv64ImmediatesTest() {}
33
34 template <typename ImmediateType,
35 std::optional<ImmediateType> (*make_immediate_i8)(int8_t),
36 std::optional<ImmediateType> (*make_immediate_u8)(uint8_t),
37 std::optional<ImmediateType> (*make_immediate_i16)(int16_t),
38 std::optional<ImmediateType> (*make_immediate_u16)(uint16_t),
39 std::optional<ImmediateType> (*make_immediate_i32)(int32_t),
40 std::optional<ImmediateType> (*make_immediate_u32)(uint32_t),
41 std::optional<ImmediateType> (*make_immediate_i64)(int64_t),
42 std::optional<ImmediateType> (*make_immediate_u64)(uint64_t),
43 size_t size>
TestConversion(std::array<std::tuple<uint32_t,std::optional<uint32_t>>,size> test_cases)44 void TestConversion(std::array<std::tuple<uint32_t, std::optional<uint32_t>>, size> test_cases) {
45 for (const auto& test_case : test_cases) {
46 int32_t source = static_cast<int32_t>(std::get<0>(test_case));
47 std::optional<uint32_t> expected_result = std::get<1>(test_case);
48 auto CheckConversion =
49 [&source, &expected_result]<typename IntType,
50 std::optional<ImmediateType> (*make_immediate)(IntType)>() {
51 IntType typed_source = static_cast<IntType>(source);
52 // If source is not representable as IntType, then conversion check doesn't make sense.
53 // E.e. if our test is trying to encode 0x100 which, when converted to int8_t becomes 0,
54 // then, if immediate actually accepts 0x100 expected_result would be encoding 0x100 but
55 // result would encode 0 which is correct, but different from expected_result !
56 if (static_cast<int32_t>(typed_source) != source ||
57 (!std::is_signed_v<IntType> && source < 0)) {
58 return;
59 }
60 std::optional<ImmediateType> result = make_immediate(source);
61 EXPECT_EQ(result.has_value(), expected_result.has_value());
62 if (result.has_value()) {
63 if constexpr (std::is_same_v<ImmediateType, riscv::CsrImmediate> ||
64 std::is_same_v<ImmediateType, riscv::Shift32Immediate> ||
65 std::is_same_v<ImmediateType, riscv::Shift64Immediate> ||
66 (std::is_same_v<IntType, int16_t> &&
67 !std::is_same_v<ImmediateType, riscv::JImmediate> &&
68 !std::is_same_v<ImmediateType, riscv::UImmediate>) ||
69 (std::is_same_v<IntType, int32_t> ||
70 std::is_same_v<IntType, int64_t>)) {
71 CHECK_EQ(typed_source, static_cast<IntType>(*result));
72 }
73 uint32_t raw_immediate_value = result->EncodedValue();
74 // RISC-V I-ImmediateType and S-Immediate support the same set of values and could be
75 // converted from one to another, but other types of immediates are unique.
76 if constexpr (std::is_same_v<ImmediateType, rv64::Assembler::Immediate>) {
77 EXPECT_EQ(ImmediateType(rv64::Assembler::SImmediate(typed_source)), *result);
78 } else if constexpr (std::is_same_v<ImmediateType, rv64::Assembler::SImmediate>) {
79 EXPECT_EQ(ImmediateType(rv64::Assembler::Immediate(typed_source)), *result);
80 }
81 EXPECT_EQ(raw_immediate_value, *expected_result);
82 ImmediateType result = ImmediateType(source);
83 raw_immediate_value = result.EncodedValue();
84 EXPECT_EQ(raw_immediate_value, *expected_result);
85 }
86 };
87 CheckConversion.template operator()<int8_t, make_immediate_i8>();
88 CheckConversion.template operator()<uint8_t, make_immediate_u8>();
89 CheckConversion.template operator()<int16_t, make_immediate_i16>();
90 CheckConversion.template operator()<uint16_t, make_immediate_u16>();
91 CheckConversion.template operator()<int32_t, make_immediate_i32>();
92 CheckConversion.template operator()<uint32_t, make_immediate_u32>();
93 CheckConversion.template operator()<int64_t, make_immediate_i64>();
94 CheckConversion.template operator()<uint64_t, make_immediate_u64>();
95 }
96 }
97 };
98
TEST_F(Riscv64ImmediatesTest,TestBImmediate)99 TEST_F(Riscv64ImmediatesTest, TestBImmediate) {
100 using T = std::tuple<uint32_t, std::optional<uint32_t>>;
101 TestConversion<riscv::BImmediate,
102 riscv::MakeBImmediate,
103 riscv::MakeBImmediate,
104 riscv::MakeBImmediate,
105 riscv::MakeBImmediate,
106 riscv::MakeBImmediate,
107 riscv::MakeBImmediate,
108 riscv::MakeBImmediate,
109 riscv::MakeBImmediate>(std::array{
110 T{0b00000000000000000000'0'000000'0000'0, 0b0'000000'00000'00000'000'0000'0'0000000},
111 // 31 12 11 10 5 4 1 0 31 30 25 24 20 19 15 11 8 7 6 0
112 T{0b00000000000000000000'0'000000'0000'1, {}},
113 T{0b00000000000000000000'0'000000'0001'0, 0b0'000000'00000'00000'000'0001'0'0000000},
114 T{0b00000000000000000000'0'000000'0010'0, 0b0'000000'00000'00000'000'0010'0'0000000},
115 T{0b00000000000000000000'0'000000'0100'0, 0b0'000000'00000'00000'000'0100'0'0000000},
116 T{0b00000000000000000000'0'000000'1000'0, 0b0'000000'00000'00000'000'1000'0'0000000},
117 T{0b00000000000000000000'0'000001'0000'0, 0b0'000001'00000'00000'000'0000'0'0000000},
118 T{0b00000000000000000000'0'000010'0000'0, 0b0'000010'00000'00000'000'0000'0'0000000},
119 T{0b00000000000000000000'0'000100'0000'0, 0b0'000100'00000'00000'000'0000'0'0000000},
120 T{0b00000000000000000000'0'001000'0000'0, 0b0'001000'00000'00000'000'0000'0'0000000},
121 T{0b00000000000000000000'0'010000'0000'0, 0b0'010000'00000'00000'000'0000'0'0000000},
122 T{0b00000000000000000000'0'100000'0000'0, 0b0'100000'00000'00000'000'0000'0'0000000},
123 T{0b00000000000000000000'1'000000'0000'0, 0b0'000000'00000'00000'000'0000'1'0000000},
124 T{0b00000000000000000001'0'000000'0000'0, {}},
125 T{0b00000000000000000010'0'000000'0000'0, {}},
126 T{0b00000000000000000100'0'000000'0000'0, {}},
127 T{0b00000000000000001000'0'000000'0000'0, {}},
128 T{0b00000000000000010000'0'000000'0000'0, {}},
129 T{0b00000000000000100000'0'000000'0000'0, {}},
130 T{0b00000000000001000000'0'000000'0000'0, {}},
131 T{0b00000000000010000000'0'000000'0000'0, {}},
132 T{0b00000000000100000000'0'000000'0000'0, {}},
133 T{0b00000000001000000000'0'000000'0000'0, {}},
134 T{0b00000000010000000000'0'000000'0000'0, {}},
135 T{0b00000000100000000000'0'000000'0000'0, {}},
136 T{0b00000001000000000000'0'000000'0000'0, {}},
137 T{0b00000010000000000000'0'000000'0000'0, {}},
138 T{0b00000100000000000000'0'000000'0000'0, {}},
139 T{0b00001000000000000000'0'000000'0000'0, {}},
140 T{0b00010000000000000000'0'000000'0000'0, {}},
141 T{0b00100000000000000000'0'000000'0000'0, {}},
142 T{0b01000000000000000000'0'000000'0000'0, {}},
143 T{0b10000000000000000000'0'000000'0000'0, {}},
144 // 31 12 11 10 5 4 1 0 31 30 25 24 20 19 15 11 8 7 6 0
145 T{0b11111111111111111111'1'111111'1111'1, {}},
146 T{0b11111111111111111111'1'111111'1111'0, 0b1'111111'00000'00000'000'1111'1'0000000},
147 T{0b11111111111111111111'1'111111'1110'0, 0b1'111111'00000'00000'000'1110'1'0000000},
148 T{0b11111111111111111111'1'111111'1100'0, 0b1'111111'00000'00000'000'1100'1'0000000},
149 T{0b11111111111111111111'1'111111'1000'0, 0b1'111111'00000'00000'000'1000'1'0000000},
150 T{0b11111111111111111111'1'111111'0000'0, 0b1'111111'00000'00000'000'0000'1'0000000},
151 T{0b11111111111111111111'1'111110'0000'0, 0b1'111110'00000'00000'000'0000'1'0000000},
152 T{0b11111111111111111111'1'111100'0000'0, 0b1'111100'00000'00000'000'0000'1'0000000},
153 T{0b11111111111111111111'1'111000'0000'0, 0b1'111000'00000'00000'000'0000'1'0000000},
154 T{0b11111111111111111111'1'110000'0000'0, 0b1'110000'00000'00000'000'0000'1'0000000},
155 T{0b11111111111111111111'1'100000'0000'0, 0b1'100000'00000'00000'000'0000'1'0000000},
156 T{0b11111111111111111111'1'000000'0000'0, 0b1'000000'00000'00000'000'0000'1'0000000},
157 T{0b11111111111111111111'0'000000'0000'0, 0b1'000000'00000'00000'000'0000'0'0000000},
158 T{0b11111111111111111110'0'000000'0000'0, {}},
159 T{0b11111111111111111100'0'000000'0000'0, {}},
160 T{0b11111111111111111000'0'000000'0000'0, {}},
161 T{0b11111111111111110000'0'000000'0000'0, {}},
162 T{0b11111111111111100000'0'000000'0000'0, {}},
163 T{0b11111111111111000000'0'000000'0000'0, {}},
164 T{0b11111111111110000000'0'000000'0000'0, {}},
165 T{0b11111111111100000000'0'000000'0000'0, {}},
166 T{0b11111111111000000000'0'000000'0000'0, {}},
167 T{0b11111111110000000000'0'000000'0000'0, {}},
168 T{0b11111111100000000000'0'000000'0000'0, {}},
169 T{0b11111111000000000000'0'000000'0000'0, {}},
170 T{0b11111110000000000000'0'000000'0000'0, {}},
171 T{0b11111100000000000000'0'000000'0000'0, {}},
172 T{0b11111000000000000000'0'000000'0000'0, {}},
173 T{0b11110000000000000000'0'000000'0000'0, {}},
174 T{0b11100000000000000000'0'000000'0000'0, {}},
175 T{0b11000000000000000000'0'000000'0000'0, {}},
176 T{0b10000000000000000000'0'000000'0000'0, {}},
177 });
178 }
179
TEST_F(Riscv64ImmediatesTest,TestCsrImmediate)180 TEST_F(Riscv64ImmediatesTest, TestCsrImmediate) {
181 using T = std::tuple<uint32_t, std::optional<uint32_t>>;
182 TestConversion<riscv::CsrImmediate,
183 riscv::MakeCsrImmediate,
184 riscv::MakeCsrImmediate,
185 riscv::MakeCsrImmediate,
186 riscv::MakeCsrImmediate,
187 riscv::MakeCsrImmediate,
188 riscv::MakeCsrImmediate,
189 riscv::MakeCsrImmediate,
190 riscv::MakeCsrImmediate>(std::array{
191 T{0b000000000000000000000'000000'0000'0, 0b0'00000000000'00000'000'00000'0000000},
192 // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0
193 T{0b000000000000000000000'000000'0000'1, 0b0'00000000000'00001'000'00000'0000000},
194 T{0b000000000000000000000'000000'0001'0, 0b0'00000000000'00010'000'00000'0000000},
195 T{0b000000000000000000000'000000'0010'0, 0b0'00000000000'00100'000'00000'0000000},
196 T{0b000000000000000000000'000000'0100'0, 0b0'00000000000'01000'000'00000'0000000},
197 T{0b000000000000000000000'000000'1000'0, 0b0'00000000000'10000'000'00000'0000000},
198 T{0b000000000000000000000'000001'0000'0, {}},
199 T{0b000000000000000000000'000010'0000'0, {}},
200 T{0b000000000000000000000'000100'0000'0, {}},
201 T{0b000000000000000000000'001000'0000'0, {}},
202 T{0b000000000000000000000'010000'0000'0, {}},
203 T{0b000000000000000000000'100000'0000'0, {}},
204 T{0b000000000000000000001'000000'0000'0, {}},
205 T{0b000000000000000000010'000000'0000'0, {}},
206 T{0b000000000000000000100'000000'0000'0, {}},
207 T{0b000000000000000001000'000000'0000'0, {}},
208 T{0b000000000000000010000'000000'0000'0, {}},
209 T{0b000000000000000100000'000000'0000'0, {}},
210 T{0b000000000000001000000'000000'0000'0, {}},
211 T{0b000000000000010000000'000000'0000'0, {}},
212 T{0b000000000000100000000'000000'0000'0, {}},
213 T{0b000000000001000000000'000000'0000'0, {}},
214 T{0b000000000010000000000'000000'0000'0, {}},
215 T{0b000000000100000000000'000000'0000'0, {}},
216 T{0b000000001000000000000'000000'0000'0, {}},
217 T{0b000000010000000000000'000000'0000'0, {}},
218 T{0b000000100000000000000'000000'0000'0, {}},
219 T{0b000001000000000000000'000000'0000'0, {}},
220 T{0b000010000000000000000'000000'0000'0, {}},
221 T{0b000100000000000000000'000000'0000'0, {}},
222 T{0b001000000000000000000'000000'0000'0, {}},
223 T{0b010000000000000000000'000000'0000'0, {}},
224 T{0b100000000000000000000'000000'0000'0, {}},
225 // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0
226 T{0b111111111111111111111'111111'1111'1, {}},
227 T{0b111111111111111111111'111111'1111'0, {}},
228 T{0b111111111111111111111'111111'1110'0, {}},
229 T{0b111111111111111111111'111111'1100'0, {}},
230 T{0b111111111111111111111'111111'1000'0, {}},
231 T{0b111111111111111111111'111111'0000'0, {}},
232 T{0b111111111111111111111'111110'0000'0, {}},
233 T{0b111111111111111111111'111100'0000'0, {}},
234 T{0b111111111111111111111'111000'0000'0, {}},
235 T{0b111111111111111111111'110000'0000'0, {}},
236 T{0b111111111111111111111'100000'0000'0, {}},
237 T{0b111111111111111111111'000000'0000'0, {}},
238 T{0b111111111111111111110'000000'0000'0, {}},
239 T{0b111111111111111111100'000000'0000'0, {}},
240 T{0b111111111111111111000'000000'0000'0, {}},
241 T{0b111111111111111110000'000000'0000'0, {}},
242 T{0b111111111111111100000'000000'0000'0, {}},
243 T{0b111111111111111000000'000000'0000'0, {}},
244 T{0b111111111111110000000'000000'0000'0, {}},
245 T{0b111111111111100000000'000000'0000'0, {}},
246 T{0b111111111111000000000'000000'0000'0, {}},
247 T{0b111111111110000000000'000000'0000'0, {}},
248 T{0b111111111100000000000'000000'0000'0, {}},
249 T{0b111111111000000000000'000000'0000'0, {}},
250 T{0b111111110000000000000'000000'0000'0, {}},
251 T{0b111111100000000000000'000000'0000'0, {}},
252 T{0b111111000000000000000'000000'0000'0, {}},
253 T{0b111110000000000000000'000000'0000'0, {}},
254 T{0b111100000000000000000'000000'0000'0, {}},
255 T{0b111000000000000000000'000000'0000'0, {}},
256 T{0b110000000000000000000'000000'0000'0, {}},
257 T{0b100000000000000000000'000000'0000'0, {}},
258 });
259 }
260
TEST_F(Riscv64ImmediatesTest,TestIImmediate)261 TEST_F(Riscv64ImmediatesTest, TestIImmediate) {
262 using T = std::tuple<uint32_t, std::optional<uint32_t>>;
263 TestConversion<riscv::Immediate,
264 riscv::MakeImmediate,
265 riscv::MakeImmediate,
266 riscv::MakeImmediate,
267 riscv::MakeImmediate,
268 riscv::MakeImmediate,
269 riscv::MakeImmediate,
270 riscv::MakeImmediate,
271 riscv::MakeImmediate>(std::array{
272 T{0b000000000000000000000'000000'0000'0, 0b0'00000000000'00000'000'00000'0000000},
273 // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0
274 T{0b000000000000000000000'000000'0000'1, 0b0'00000000001'00000'000'00000'0000000},
275 T{0b000000000000000000000'000000'0001'0, 0b0'00000000010'00000'000'00000'0000000},
276 T{0b000000000000000000000'000000'0010'0, 0b0'00000000100'00000'000'00000'0000000},
277 T{0b000000000000000000000'000000'0100'0, 0b0'00000001000'00000'000'00000'0000000},
278 T{0b000000000000000000000'000000'1000'0, 0b0'00000010000'00000'000'00000'0000000},
279 T{0b000000000000000000000'000001'0000'0, 0b0'00000100000'00000'000'00000'0000000},
280 T{0b000000000000000000000'000010'0000'0, 0b0'00001000000'00000'000'00000'0000000},
281 T{0b000000000000000000000'000100'0000'0, 0b0'00010000000'00000'000'00000'0000000},
282 T{0b000000000000000000000'001000'0000'0, 0b0'00100000000'00000'000'00000'0000000},
283 T{0b000000000000000000000'010000'0000'0, 0b0'01000000000'00000'000'00000'0000000},
284 T{0b000000000000000000000'100000'0000'0, 0b0'10000000000'00000'000'00000'0000000},
285 T{0b000000000000000000001'000000'0000'0, {}},
286 T{0b000000000000000000010'000000'0000'0, {}},
287 T{0b000000000000000000100'000000'0000'0, {}},
288 T{0b000000000000000001000'000000'0000'0, {}},
289 T{0b000000000000000010000'000000'0000'0, {}},
290 T{0b000000000000000100000'000000'0000'0, {}},
291 T{0b000000000000001000000'000000'0000'0, {}},
292 T{0b000000000000010000000'000000'0000'0, {}},
293 T{0b000000000000100000000'000000'0000'0, {}},
294 T{0b000000000001000000000'000000'0000'0, {}},
295 T{0b000000000010000000000'000000'0000'0, {}},
296 T{0b000000000100000000000'000000'0000'0, {}},
297 T{0b000000001000000000000'000000'0000'0, {}},
298 T{0b000000010000000000000'000000'0000'0, {}},
299 T{0b000000100000000000000'000000'0000'0, {}},
300 T{0b000001000000000000000'000000'0000'0, {}},
301 T{0b000010000000000000000'000000'0000'0, {}},
302 T{0b000100000000000000000'000000'0000'0, {}},
303 T{0b001000000000000000000'000000'0000'0, {}},
304 T{0b010000000000000000000'000000'0000'0, {}},
305 T{0b100000000000000000000'000000'0000'0, {}},
306 // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0
307 T{0b111111111111111111111'111111'1111'1, 0b1'11111111111'00000'000'00000'0000000},
308 T{0b111111111111111111111'111111'1111'0, 0b1'11111111110'00000'000'00000'0000000},
309 T{0b111111111111111111111'111111'1110'0, 0b1'11111111100'00000'000'00000'0000000},
310 T{0b111111111111111111111'111111'1100'0, 0b1'11111111000'00000'000'00000'0000000},
311 T{0b111111111111111111111'111111'1000'0, 0b1'11111110000'00000'000'00000'0000000},
312 T{0b111111111111111111111'111111'0000'0, 0b1'11111100000'00000'000'00000'0000000},
313 T{0b111111111111111111111'111110'0000'0, 0b1'11111000000'00000'000'00000'0000000},
314 T{0b111111111111111111111'111100'0000'0, 0b1'11110000000'00000'000'00000'0000000},
315 T{0b111111111111111111111'111000'0000'0, 0b1'11100000000'00000'000'00000'0000000},
316 T{0b111111111111111111111'110000'0000'0, 0b1'11000000000'00000'000'00000'0000000},
317 T{0b111111111111111111111'100000'0000'0, 0b1'10000000000'00000'000'00000'0000000},
318 T{0b111111111111111111111'000000'0000'0, 0b1'00000000000'00000'000'00000'0000000},
319 T{0b111111111111111111110'000000'0000'0, {}},
320 T{0b111111111111111111100'000000'0000'0, {}},
321 T{0b111111111111111111000'000000'0000'0, {}},
322 T{0b111111111111111110000'000000'0000'0, {}},
323 T{0b111111111111111100000'000000'0000'0, {}},
324 T{0b111111111111111000000'000000'0000'0, {}},
325 T{0b111111111111110000000'000000'0000'0, {}},
326 T{0b111111111111100000000'000000'0000'0, {}},
327 T{0b111111111111000000000'000000'0000'0, {}},
328 T{0b111111111110000000000'000000'0000'0, {}},
329 T{0b111111111100000000000'000000'0000'0, {}},
330 T{0b111111111000000000000'000000'0000'0, {}},
331 T{0b111111110000000000000'000000'0000'0, {}},
332 T{0b111111100000000000000'000000'0000'0, {}},
333 T{0b111111000000000000000'000000'0000'0, {}},
334 T{0b111110000000000000000'000000'0000'0, {}},
335 T{0b111100000000000000000'000000'0000'0, {}},
336 T{0b111000000000000000000'000000'0000'0, {}},
337 T{0b110000000000000000000'000000'0000'0, {}},
338 T{0b100000000000000000000'000000'0000'0, {}},
339 });
340 }
341
TEST_F(Riscv64ImmediatesTest,TestJImmediate)342 TEST_F(Riscv64ImmediatesTest, TestJImmediate) {
343 using T = std::tuple<uint32_t, std::optional<uint32_t>>;
344 TestConversion<riscv::JImmediate,
345 riscv::MakeJImmediate,
346 riscv::MakeJImmediate,
347 riscv::MakeJImmediate,
348 riscv::MakeJImmediate,
349 riscv::MakeJImmediate,
350 riscv::MakeJImmediate,
351 riscv::MakeJImmediate,
352 riscv::MakeJImmediate>(std::array{
353 T{0b000000000000'00000000'0'0000000000'0, 0b0'0000000000'0'00000'000'0000'0'0000000},
354 // 31 20 19 12 11 10 5 4 1 0 31 30 21 20 19 15 11 8 7 6 0
355 T{0b000000000000'00000000'0'000000'0000'1, {}},
356 T{0b000000000000'00000000'0'000000'0001'0, 0b0'0000000001'0'00000'000'0000'0'0000000},
357 T{0b000000000000'00000000'0'000000'0010'0, 0b0'0000000010'0'00000'000'0000'0'0000000},
358 T{0b000000000000'00000000'0'000000'0100'0, 0b0'0000000100'0'00000'000'0000'0'0000000},
359 T{0b000000000000'00000000'0'000000'1000'0, 0b0'0000001000'0'00000'000'0000'0'0000000},
360 T{0b000000000000'00000000'0'000001'0000'0, 0b0'0000010000'0'00000'000'0000'0'0000000},
361 T{0b000000000000'00000000'0'000010'0000'0, 0b0'0000100000'0'00000'000'0000'0'0000000},
362 T{0b000000000000'00000000'0'000100'0000'0, 0b0'0001000000'0'00000'000'0000'0'0000000},
363 T{0b000000000000'00000000'0'001000'0000'0, 0b0'0010000000'0'00000'000'0000'0'0000000},
364 T{0b000000000000'00000000'0'010000'0000'0, 0b0'0100000000'0'00000'000'0000'0'0000000},
365 T{0b000000000000'00000000'0'100000'0000'0, 0b0'1000000000'0'00000'000'0000'0'0000000},
366 T{0b000000000000'00000000'1'000000'0000'0, 0b0'0000000000'1'00000'000'0000'0'0000000},
367 T{0b000000000000'00000001'0'000000'0000'0, 0b0'0000000000'0'00000'001'0000'0'0000000},
368 T{0b000000000000'00000010'0'000000'0000'0, 0b0'0000000000'0'00000'010'0000'0'0000000},
369 T{0b000000000000'00000100'0'000000'0000'0, 0b0'0000000000'0'00000'100'0000'0'0000000},
370 T{0b000000000000'00001000'0'000000'0000'0, 0b0'0000000000'0'00001'000'0000'0'0000000},
371 T{0b000000000000'00010000'0'000000'0000'0, 0b0'0000000000'0'00010'000'0000'0'0000000},
372 T{0b000000000000'00100000'0'000000'0000'0, 0b0'0000000000'0'00100'000'0000'0'0000000},
373 T{0b000000000000'01000000'0'000000'0000'0, 0b0'0000000000'0'01000'000'0000'0'0000000},
374 T{0b000000000000'10000000'0'000000'0000'0, 0b0'0000000000'0'10000'000'0000'0'0000000},
375 T{0b000000000001'00000000'0'000000'0000'0, {}},
376 T{0b000000000010'00000000'0'000000'0000'0, {}},
377 T{0b000000000100'00000000'0'000000'0000'0, {}},
378 T{0b000000001000'00000000'0'000000'0000'0, {}},
379 T{0b000000010000'00000000'0'000000'0000'0, {}},
380 T{0b000000100000'00000000'0'000000'0000'0, {}},
381 T{0b000001000000'00000000'0'000000'0000'0, {}},
382 T{0b000010000000'00000000'0'000000'0000'0, {}},
383 T{0b000100000000'00000000'0'000000'0000'0, {}},
384 T{0b001000000000'00000000'0'000000'0000'0, {}},
385 T{0b010000000000'00000000'0'000000'0000'0, {}},
386 T{0b100000000000'00000000'0'000000'0000'0, {}},
387 // 31 20 19 12 11 10 5 4 1 0 31 30 21 20 19 15 11 8 7 6 0
388 T{0b111111111111'11111111'1'111111'1111'1, {}},
389 T{0b111111111111'11111111'1'111111'1111'0, 0b1'1111111111'1'11111'111'0000'0'0000000},
390 T{0b111111111111'11111111'1'111111'1110'0, 0b1'1111111110'1'11111'111'0000'0'0000000},
391 T{0b111111111111'11111111'1'111111'1100'0, 0b1'1111111100'1'11111'111'0000'0'0000000},
392 T{0b111111111111'11111111'1'111111'1000'0, 0b1'1111111000'1'11111'111'0000'0'0000000},
393 T{0b111111111111'11111111'1'111111'0000'0, 0b1'1111110000'1'11111'111'0000'0'0000000},
394 T{0b111111111111'11111111'1'111110'0000'0, 0b1'1111100000'1'11111'111'0000'0'0000000},
395 T{0b111111111111'11111111'1'111100'0000'0, 0b1'1111000000'1'11111'111'0000'0'0000000},
396 T{0b111111111111'11111111'1'111000'0000'0, 0b1'1110000000'1'11111'111'0000'0'0000000},
397 T{0b111111111111'11111111'1'110000'0000'0, 0b1'1100000000'1'11111'111'0000'0'0000000},
398 T{0b111111111111'11111111'1'100000'0000'0, 0b1'1000000000'1'11111'111'0000'0'0000000},
399 T{0b111111111111'11111111'1'000000'0000'0, 0b1'0000000000'1'11111'111'0000'0'0000000},
400 T{0b111111111111'11111111'0'000000'0000'0, 0b1'0000000000'0'11111'111'0000'0'0000000},
401 T{0b111111111111'11111110'0'000000'0000'0, 0b1'0000000000'0'11111'110'0000'0'0000000},
402 T{0b111111111111'11111100'0'000000'0000'0, 0b1'0000000000'0'11111'100'0000'0'0000000},
403 T{0b111111111111'11111000'0'000000'0000'0, 0b1'0000000000'0'11111'000'0000'0'0000000},
404 T{0b111111111111'11110000'0'000000'0000'0, 0b1'0000000000'0'11110'000'0000'0'0000000},
405 T{0b111111111111'11100000'0'000000'0000'0, 0b1'0000000000'0'11100'000'0000'0'0000000},
406 T{0b111111111111'11000000'0'000000'0000'0, 0b1'0000000000'0'11000'000'0000'0'0000000},
407 T{0b111111111111'10000000'0'000000'0000'0, 0b1'0000000000'0'10000'000'0000'0'0000000},
408 T{0b111111111111'00000000'0'000000'0000'0, 0b1'0000000000'0'00000'000'0000'0'0000000},
409 T{0b111111111110'00000000'0'000000'0000'0, {}},
410 T{0b111111111100'00000000'0'000000'0000'0, {}},
411 T{0b111111111000'00000000'0'000000'0000'0, {}},
412 T{0b111111110000'00000000'0'000000'0000'0, {}},
413 T{0b111111100000'00000000'0'000000'0000'0, {}},
414 T{0b111111000000'00000000'0'000000'0000'0, {}},
415 T{0b111110000000'00000000'0'000000'0000'0, {}},
416 T{0b111100000000'00000000'0'000000'0000'0, {}},
417 T{0b111000000000'00000000'0'000000'0000'0, {}},
418 T{0b110000000000'00000000'0'000000'0000'0, {}},
419 T{0b100000000000'00000000'0'000000'0000'0, {}},
420 });
421 }
422
TEST_F(Riscv64ImmediatesTest,TestPImmediate)423 TEST_F(Riscv64ImmediatesTest, TestPImmediate) {
424 using T = std::tuple<uint32_t, std::optional<uint32_t>>;
425 TestConversion<riscv::PImmediate,
426 riscv::MakePImmediate,
427 riscv::MakePImmediate,
428 riscv::MakePImmediate,
429 riscv::MakePImmediate,
430 riscv::MakePImmediate,
431 riscv::MakePImmediate,
432 riscv::MakePImmediate,
433 riscv::MakePImmediate>(std::array{
434 T{0b000000000000000000000'000000'0000'0, 0b0'000000'00000'00000'000'00000'0000000},
435 // 31 11 10 5 4 1 0 31 30 25 24 20 19 15 11 7 6 0
436 T{0b000000000000000000000'000000'0000'1, {}},
437 T{0b000000000000000000000'000000'0001'0, {}},
438 T{0b000000000000000000000'000000'0010'0, {}},
439 T{0b000000000000000000000'000000'0100'0, {}},
440 T{0b000000000000000000000'000000'1000'0, {}},
441 T{0b000000000000000000000'000001'0000'0, 0b0'000001'00000'00000'000'00000'0000000},
442 T{0b000000000000000000000'000010'0000'0, 0b0'000010'00000'00000'000'00000'0000000},
443 T{0b000000000000000000000'000100'0000'0, 0b0'000100'00000'00000'000'00000'0000000},
444 T{0b000000000000000000000'001000'0000'0, 0b0'001000'00000'00000'000'00000'0000000},
445 T{0b000000000000000000000'010000'0000'0, 0b0'010000'00000'00000'000'00000'0000000},
446 T{0b000000000000000000000'100000'0000'0, 0b0'100000'00000'00000'000'00000'0000000},
447 T{0b000000000000000000001'000000'0000'0, {}},
448 T{0b000000000000000000010'000000'0000'0, {}},
449 T{0b000000000000000000100'000000'0000'0, {}},
450 T{0b000000000000000001000'000000'0000'0, {}},
451 T{0b000000000000000010000'000000'0000'0, {}},
452 T{0b000000000000000100000'000000'0000'0, {}},
453 T{0b000000000000001000000'000000'0000'0, {}},
454 T{0b000000000000010000000'000000'0000'0, {}},
455 T{0b000000000000100000000'000000'0000'0, {}},
456 T{0b000000000001000000000'000000'0000'0, {}},
457 T{0b000000000010000000000'000000'0000'0, {}},
458 T{0b000000000100000000000'000000'0000'0, {}},
459 T{0b000000001000000000000'000000'0000'0, {}},
460 T{0b000000010000000000000'000000'0000'0, {}},
461 T{0b000000100000000000000'000000'0000'0, {}},
462 T{0b000001000000000000000'000000'0000'0, {}},
463 T{0b000010000000000000000'000000'0000'0, {}},
464 T{0b000100000000000000000'000000'0000'0, {}},
465 T{0b001000000000000000000'000000'0000'0, {}},
466 T{0b010000000000000000000'000000'0000'0, {}},
467 T{0b100000000000000000000'000000'0000'0, {}},
468 // 31 11 10 5 4 1 0 31 30 25 24 20 19 15 11 7 6 0
469 T{0b111111111111111111111'111111'1111'1, {}},
470 T{0b111111111111111111111'111111'1111'0, {}},
471 T{0b111111111111111111111'111111'1110'0, {}},
472 T{0b111111111111111111111'111111'1100'0, {}},
473 T{0b111111111111111111111'111111'1000'0, {}},
474 T{0b111111111111111111111'111111'0000'0, 0b1'111111'00000'00000'000'00000'0000000},
475 T{0b111111111111111111111'111110'0000'0, 0b1'111110'00000'00000'000'00000'0000000},
476 T{0b111111111111111111111'111100'0000'0, 0b1'111100'00000'00000'000'00000'0000000},
477 T{0b111111111111111111111'111000'0000'0, 0b1'111000'00000'00000'000'00000'0000000},
478 T{0b111111111111111111111'110000'0000'0, 0b1'110000'00000'00000'000'00000'0000000},
479 T{0b111111111111111111111'100000'0000'0, 0b1'100000'00000'00000'000'00000'0000000},
480 T{0b111111111111111111111'000000'0000'0, 0b1'000000'00000'00000'000'00000'0000000},
481 T{0b111111111111111111110'000000'0000'0, {}},
482 T{0b111111111111111111100'000000'0000'0, {}},
483 T{0b111111111111111111000'000000'0000'0, {}},
484 T{0b111111111111111110000'000000'0000'0, {}},
485 T{0b111111111111111100000'000000'0000'0, {}},
486 T{0b111111111111111000000'000000'0000'0, {}},
487 T{0b111111111111110000000'000000'0000'0, {}},
488 T{0b111111111111100000000'000000'0000'0, {}},
489 T{0b111111111111000000000'000000'0000'0, {}},
490 T{0b111111111110000000000'000000'0000'0, {}},
491 T{0b111111111100000000000'000000'0000'0, {}},
492 T{0b111111111000000000000'000000'0000'0, {}},
493 T{0b111111110000000000000'000000'0000'0, {}},
494 T{0b111111100000000000000'000000'0000'0, {}},
495 T{0b111111000000000000000'000000'0000'0, {}},
496 T{0b111110000000000000000'000000'0000'0, {}},
497 T{0b111100000000000000000'000000'0000'0, {}},
498 T{0b111000000000000000000'000000'0000'0, {}},
499 T{0b110000000000000000000'000000'0000'0, {}},
500 T{0b100000000000000000000'000000'0000'0, {}},
501 });
502 }
503
TEST_F(Riscv64ImmediatesTest,TestShiftImmediate)504 TEST_F(Riscv64ImmediatesTest, TestShiftImmediate) {
505 using T = std::tuple<uint32_t, std::optional<uint32_t>>;
506 TestConversion<rv32::Assembler::ShiftImmediate,
507 rv32::Assembler::MakeShiftImmediate,
508 rv32::Assembler::MakeShiftImmediate,
509 rv32::Assembler::MakeShiftImmediate,
510 rv32::Assembler::MakeShiftImmediate,
511 rv32::Assembler::MakeShiftImmediate,
512 rv32::Assembler::MakeShiftImmediate,
513 rv32::Assembler::MakeShiftImmediate,
514 rv32::Assembler::MakeShiftImmediate>(std::array{
515 T{0b000000000000000000000'000000'0000'0, 0b0'00000000000'00000'000'00000'0000000},
516 // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0
517 T{0b000000000000000000000'000000'0000'1, 0b0'00000000001'00000'000'00000'0000000},
518 T{0b000000000000000000000'000000'0001'0, 0b0'00000000010'00000'000'00000'0000000},
519 T{0b000000000000000000000'000000'0010'0, 0b0'00000000100'00000'000'00000'0000000},
520 T{0b000000000000000000000'000000'0100'0, 0b0'00000001000'00000'000'00000'0000000},
521 T{0b000000000000000000000'000000'1000'0, 0b0'00000010000'00000'000'00000'0000000},
522 T{0b000000000000000000000'000001'0000'0, {}},
523 T{0b000000000000000000000'000010'0000'0, {}},
524 T{0b000000000000000000000'000100'0000'0, {}},
525 T{0b000000000000000000000'001000'0000'0, {}},
526 T{0b000000000000000000000'010000'0000'0, {}},
527 T{0b000000000000000000000'100000'0000'0, {}},
528 T{0b000000000000000000001'000000'0000'0, {}},
529 T{0b000000000000000000010'000000'0000'0, {}},
530 T{0b000000000000000000100'000000'0000'0, {}},
531 T{0b000000000000000001000'000000'0000'0, {}},
532 T{0b000000000000000010000'000000'0000'0, {}},
533 T{0b000000000000000100000'000000'0000'0, {}},
534 T{0b000000000000001000000'000000'0000'0, {}},
535 T{0b000000000000010000000'000000'0000'0, {}},
536 T{0b000000000000100000000'000000'0000'0, {}},
537 T{0b000000000001000000000'000000'0000'0, {}},
538 T{0b000000000010000000000'000000'0000'0, {}},
539 T{0b000000000100000000000'000000'0000'0, {}},
540 T{0b000000001000000000000'000000'0000'0, {}},
541 T{0b000000010000000000000'000000'0000'0, {}},
542 T{0b000000100000000000000'000000'0000'0, {}},
543 T{0b000001000000000000000'000000'0000'0, {}},
544 T{0b000010000000000000000'000000'0000'0, {}},
545 T{0b000100000000000000000'000000'0000'0, {}},
546 T{0b001000000000000000000'000000'0000'0, {}},
547 T{0b010000000000000000000'000000'0000'0, {}},
548 T{0b100000000000000000000'000000'0000'0, {}},
549 // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0
550 T{0b111111111111111111111'111111'1111'1, {}},
551 T{0b111111111111111111111'111111'1111'0, {}},
552 T{0b111111111111111111111'111111'1110'0, {}},
553 T{0b111111111111111111111'111111'1100'0, {}},
554 T{0b111111111111111111111'111111'1000'0, {}},
555 T{0b111111111111111111111'111111'0000'0, {}},
556 T{0b111111111111111111111'111110'0000'0, {}},
557 T{0b111111111111111111111'111100'0000'0, {}},
558 T{0b111111111111111111111'111000'0000'0, {}},
559 T{0b111111111111111111111'110000'0000'0, {}},
560 T{0b111111111111111111111'100000'0000'0, {}},
561 T{0b111111111111111111111'000000'0000'0, {}},
562 T{0b111111111111111111110'000000'0000'0, {}},
563 T{0b111111111111111111100'000000'0000'0, {}},
564 T{0b111111111111111111000'000000'0000'0, {}},
565 T{0b111111111111111110000'000000'0000'0, {}},
566 T{0b111111111111111100000'000000'0000'0, {}},
567 T{0b111111111111111000000'000000'0000'0, {}},
568 T{0b111111111111110000000'000000'0000'0, {}},
569 T{0b111111111111100000000'000000'0000'0, {}},
570 T{0b111111111111000000000'000000'0000'0, {}},
571 T{0b111111111110000000000'000000'0000'0, {}},
572 T{0b111111111100000000000'000000'0000'0, {}},
573 T{0b111111111000000000000'000000'0000'0, {}},
574 T{0b111111110000000000000'000000'0000'0, {}},
575 T{0b111111100000000000000'000000'0000'0, {}},
576 T{0b111111000000000000000'000000'0000'0, {}},
577 T{0b111110000000000000000'000000'0000'0, {}},
578 T{0b111100000000000000000'000000'0000'0, {}},
579 T{0b111000000000000000000'000000'0000'0, {}},
580 T{0b110000000000000000000'000000'0000'0, {}},
581 T{0b100000000000000000000'000000'0000'0, {}},
582 });
583 TestConversion<rv64::Assembler::ShiftImmediate,
584 rv64::Assembler::MakeShiftImmediate,
585 rv64::Assembler::MakeShiftImmediate,
586 rv64::Assembler::MakeShiftImmediate,
587 rv64::Assembler::MakeShiftImmediate,
588 rv64::Assembler::MakeShiftImmediate,
589 rv64::Assembler::MakeShiftImmediate,
590 rv64::Assembler::MakeShiftImmediate,
591 rv64::Assembler::MakeShiftImmediate>(std::array{
592 T{0b000000000000000000000'000000'0000'0, 0b0'00000000000'00000'000'00000'0000000},
593 // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0
594 T{0b000000000000000000000'000000'0000'1, 0b0'00000000001'00000'000'00000'0000000},
595 T{0b000000000000000000000'000000'0001'0, 0b0'00000000010'00000'000'00000'0000000},
596 T{0b000000000000000000000'000000'0010'0, 0b0'00000000100'00000'000'00000'0000000},
597 T{0b000000000000000000000'000000'0100'0, 0b0'00000001000'00000'000'00000'0000000},
598 T{0b000000000000000000000'000000'1000'0, 0b0'00000010000'00000'000'00000'0000000},
599 T{0b000000000000000000000'000001'0000'0, 0b0'00000100000'00000'000'00000'0000000},
600 T{0b000000000000000000000'000010'0000'0, {}},
601 T{0b000000000000000000000'000100'0000'0, {}},
602 T{0b000000000000000000000'001000'0000'0, {}},
603 T{0b000000000000000000000'010000'0000'0, {}},
604 T{0b000000000000000000000'100000'0000'0, {}},
605 T{0b000000000000000000001'000000'0000'0, {}},
606 T{0b000000000000000000010'000000'0000'0, {}},
607 T{0b000000000000000000100'000000'0000'0, {}},
608 T{0b000000000000000001000'000000'0000'0, {}},
609 T{0b000000000000000010000'000000'0000'0, {}},
610 T{0b000000000000000100000'000000'0000'0, {}},
611 T{0b000000000000001000000'000000'0000'0, {}},
612 T{0b000000000000010000000'000000'0000'0, {}},
613 T{0b000000000000100000000'000000'0000'0, {}},
614 T{0b000000000001000000000'000000'0000'0, {}},
615 T{0b000000000010000000000'000000'0000'0, {}},
616 T{0b000000000100000000000'000000'0000'0, {}},
617 T{0b000000001000000000000'000000'0000'0, {}},
618 T{0b000000010000000000000'000000'0000'0, {}},
619 T{0b000000100000000000000'000000'0000'0, {}},
620 T{0b000001000000000000000'000000'0000'0, {}},
621 T{0b000010000000000000000'000000'0000'0, {}},
622 T{0b000100000000000000000'000000'0000'0, {}},
623 T{0b001000000000000000000'000000'0000'0, {}},
624 T{0b010000000000000000000'000000'0000'0, {}},
625 T{0b100000000000000000000'000000'0000'0, {}},
626 // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0
627 T{0b111111111111111111111'111111'1111'1, {}},
628 T{0b111111111111111111111'111111'1111'0, {}},
629 T{0b111111111111111111111'111111'1110'0, {}},
630 T{0b111111111111111111111'111111'1100'0, {}},
631 T{0b111111111111111111111'111111'1000'0, {}},
632 T{0b111111111111111111111'111111'0000'0, {}},
633 T{0b111111111111111111111'111110'0000'0, {}},
634 T{0b111111111111111111111'111100'0000'0, {}},
635 T{0b111111111111111111111'111000'0000'0, {}},
636 T{0b111111111111111111111'110000'0000'0, {}},
637 T{0b111111111111111111111'100000'0000'0, {}},
638 T{0b111111111111111111111'000000'0000'0, {}},
639 T{0b111111111111111111110'000000'0000'0, {}},
640 T{0b111111111111111111100'000000'0000'0, {}},
641 T{0b111111111111111111000'000000'0000'0, {}},
642 T{0b111111111111111110000'000000'0000'0, {}},
643 T{0b111111111111111100000'000000'0000'0, {}},
644 T{0b111111111111111000000'000000'0000'0, {}},
645 T{0b111111111111110000000'000000'0000'0, {}},
646 T{0b111111111111100000000'000000'0000'0, {}},
647 T{0b111111111111000000000'000000'0000'0, {}},
648 T{0b111111111110000000000'000000'0000'0, {}},
649 T{0b111111111100000000000'000000'0000'0, {}},
650 T{0b111111111000000000000'000000'0000'0, {}},
651 T{0b111111110000000000000'000000'0000'0, {}},
652 T{0b111111100000000000000'000000'0000'0, {}},
653 T{0b111111000000000000000'000000'0000'0, {}},
654 T{0b111110000000000000000'000000'0000'0, {}},
655 T{0b111100000000000000000'000000'0000'0, {}},
656 T{0b111000000000000000000'000000'0000'0, {}},
657 T{0b110000000000000000000'000000'0000'0, {}},
658 T{0b100000000000000000000'000000'0000'0, {}},
659 });
660 }
661
TEST_F(Riscv64ImmediatesTest,TestShift32Immediate)662 TEST_F(Riscv64ImmediatesTest, TestShift32Immediate) {
663 using T = std::tuple<uint32_t, std::optional<uint32_t>>;
664 TestConversion<riscv::Shift32Immediate,
665 riscv::MakeShift32Immediate,
666 riscv::MakeShift32Immediate,
667 riscv::MakeShift32Immediate,
668 riscv::MakeShift32Immediate,
669 riscv::MakeShift32Immediate,
670 riscv::MakeShift32Immediate,
671 riscv::MakeShift32Immediate,
672 riscv::MakeShift32Immediate>(std::array{
673 T{0b000000000000000000000'000000'0000'0, 0b0'00000000000'00000'000'00000'0000000},
674 // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0
675 T{0b000000000000000000000'000000'0000'1, 0b0'00000000001'00000'000'00000'0000000},
676 T{0b000000000000000000000'000000'0001'0, 0b0'00000000010'00000'000'00000'0000000},
677 T{0b000000000000000000000'000000'0010'0, 0b0'00000000100'00000'000'00000'0000000},
678 T{0b000000000000000000000'000000'0100'0, 0b0'00000001000'00000'000'00000'0000000},
679 T{0b000000000000000000000'000000'1000'0, 0b0'00000010000'00000'000'00000'0000000},
680 T{0b000000000000000000000'000001'0000'0, {}},
681 T{0b000000000000000000000'000010'0000'0, {}},
682 T{0b000000000000000000000'000100'0000'0, {}},
683 T{0b000000000000000000000'001000'0000'0, {}},
684 T{0b000000000000000000000'010000'0000'0, {}},
685 T{0b000000000000000000000'100000'0000'0, {}},
686 T{0b000000000000000000001'000000'0000'0, {}},
687 T{0b000000000000000000010'000000'0000'0, {}},
688 T{0b000000000000000000100'000000'0000'0, {}},
689 T{0b000000000000000001000'000000'0000'0, {}},
690 T{0b000000000000000010000'000000'0000'0, {}},
691 T{0b000000000000000100000'000000'0000'0, {}},
692 T{0b000000000000001000000'000000'0000'0, {}},
693 T{0b000000000000010000000'000000'0000'0, {}},
694 T{0b000000000000100000000'000000'0000'0, {}},
695 T{0b000000000001000000000'000000'0000'0, {}},
696 T{0b000000000010000000000'000000'0000'0, {}},
697 T{0b000000000100000000000'000000'0000'0, {}},
698 T{0b000000001000000000000'000000'0000'0, {}},
699 T{0b000000010000000000000'000000'0000'0, {}},
700 T{0b000000100000000000000'000000'0000'0, {}},
701 T{0b000001000000000000000'000000'0000'0, {}},
702 T{0b000010000000000000000'000000'0000'0, {}},
703 T{0b000100000000000000000'000000'0000'0, {}},
704 T{0b001000000000000000000'000000'0000'0, {}},
705 T{0b010000000000000000000'000000'0000'0, {}},
706 T{0b100000000000000000000'000000'0000'0, {}},
707 // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0
708 T{0b111111111111111111111'111111'1111'1, {}},
709 T{0b111111111111111111111'111111'1111'0, {}},
710 T{0b111111111111111111111'111111'1110'0, {}},
711 T{0b111111111111111111111'111111'1100'0, {}},
712 T{0b111111111111111111111'111111'1000'0, {}},
713 T{0b111111111111111111111'111111'0000'0, {}},
714 T{0b111111111111111111111'111110'0000'0, {}},
715 T{0b111111111111111111111'111100'0000'0, {}},
716 T{0b111111111111111111111'111000'0000'0, {}},
717 T{0b111111111111111111111'110000'0000'0, {}},
718 T{0b111111111111111111111'100000'0000'0, {}},
719 T{0b111111111111111111111'000000'0000'0, {}},
720 T{0b111111111111111111110'000000'0000'0, {}},
721 T{0b111111111111111111100'000000'0000'0, {}},
722 T{0b111111111111111111000'000000'0000'0, {}},
723 T{0b111111111111111110000'000000'0000'0, {}},
724 T{0b111111111111111100000'000000'0000'0, {}},
725 T{0b111111111111111000000'000000'0000'0, {}},
726 T{0b111111111111110000000'000000'0000'0, {}},
727 T{0b111111111111100000000'000000'0000'0, {}},
728 T{0b111111111111000000000'000000'0000'0, {}},
729 T{0b111111111110000000000'000000'0000'0, {}},
730 T{0b111111111100000000000'000000'0000'0, {}},
731 T{0b111111111000000000000'000000'0000'0, {}},
732 T{0b111111110000000000000'000000'0000'0, {}},
733 T{0b111111100000000000000'000000'0000'0, {}},
734 T{0b111111000000000000000'000000'0000'0, {}},
735 T{0b111110000000000000000'000000'0000'0, {}},
736 T{0b111100000000000000000'000000'0000'0, {}},
737 T{0b111000000000000000000'000000'0000'0, {}},
738 T{0b110000000000000000000'000000'0000'0, {}},
739 T{0b100000000000000000000'000000'0000'0, {}},
740 });
741 }
742
TEST_F(Riscv64ImmediatesTest,TestShift64Immediate)743 TEST_F(Riscv64ImmediatesTest, TestShift64Immediate) {
744 using T = std::tuple<uint32_t, std::optional<uint32_t>>;
745 TestConversion<riscv::Shift64Immediate,
746 riscv::MakeShift64Immediate,
747 riscv::MakeShift64Immediate,
748 riscv::MakeShift64Immediate,
749 riscv::MakeShift64Immediate,
750 riscv::MakeShift64Immediate,
751 riscv::MakeShift64Immediate,
752 riscv::MakeShift64Immediate,
753 riscv::MakeShift64Immediate>(std::array{
754 T{0b000000000000000000000'000000'0000'0, 0b0'00000000000'00000'000'00000'0000000},
755 // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0
756 T{0b000000000000000000000'000000'0000'1, 0b0'00000000001'00000'000'00000'0000000},
757 T{0b000000000000000000000'000000'0001'0, 0b0'00000000010'00000'000'00000'0000000},
758 T{0b000000000000000000000'000000'0010'0, 0b0'00000000100'00000'000'00000'0000000},
759 T{0b000000000000000000000'000000'0100'0, 0b0'00000001000'00000'000'00000'0000000},
760 T{0b000000000000000000000'000000'1000'0, 0b0'00000010000'00000'000'00000'0000000},
761 T{0b000000000000000000000'000001'0000'0, 0b0'00000100000'00000'000'00000'0000000},
762 T{0b000000000000000000000'000010'0000'0, {}},
763 T{0b000000000000000000000'000100'0000'0, {}},
764 T{0b000000000000000000000'001000'0000'0, {}},
765 T{0b000000000000000000000'010000'0000'0, {}},
766 T{0b000000000000000000000'100000'0000'0, {}},
767 T{0b000000000000000000001'000000'0000'0, {}},
768 T{0b000000000000000000010'000000'0000'0, {}},
769 T{0b000000000000000000100'000000'0000'0, {}},
770 T{0b000000000000000001000'000000'0000'0, {}},
771 T{0b000000000000000010000'000000'0000'0, {}},
772 T{0b000000000000000100000'000000'0000'0, {}},
773 T{0b000000000000001000000'000000'0000'0, {}},
774 T{0b000000000000010000000'000000'0000'0, {}},
775 T{0b000000000000100000000'000000'0000'0, {}},
776 T{0b000000000001000000000'000000'0000'0, {}},
777 T{0b000000000010000000000'000000'0000'0, {}},
778 T{0b000000000100000000000'000000'0000'0, {}},
779 T{0b000000001000000000000'000000'0000'0, {}},
780 T{0b000000010000000000000'000000'0000'0, {}},
781 T{0b000000100000000000000'000000'0000'0, {}},
782 T{0b000001000000000000000'000000'0000'0, {}},
783 T{0b000010000000000000000'000000'0000'0, {}},
784 T{0b000100000000000000000'000000'0000'0, {}},
785 T{0b001000000000000000000'000000'0000'0, {}},
786 T{0b010000000000000000000'000000'0000'0, {}},
787 T{0b100000000000000000000'000000'0000'0, {}},
788 // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0
789 T{0b111111111111111111111'111111'1111'1, {}},
790 T{0b111111111111111111111'111111'1111'0, {}},
791 T{0b111111111111111111111'111111'1110'0, {}},
792 T{0b111111111111111111111'111111'1100'0, {}},
793 T{0b111111111111111111111'111111'1000'0, {}},
794 T{0b111111111111111111111'111111'0000'0, {}},
795 T{0b111111111111111111111'111110'0000'0, {}},
796 T{0b111111111111111111111'111100'0000'0, {}},
797 T{0b111111111111111111111'111000'0000'0, {}},
798 T{0b111111111111111111111'110000'0000'0, {}},
799 T{0b111111111111111111111'100000'0000'0, {}},
800 T{0b111111111111111111111'000000'0000'0, {}},
801 T{0b111111111111111111110'000000'0000'0, {}},
802 T{0b111111111111111111100'000000'0000'0, {}},
803 T{0b111111111111111111000'000000'0000'0, {}},
804 T{0b111111111111111110000'000000'0000'0, {}},
805 T{0b111111111111111100000'000000'0000'0, {}},
806 T{0b111111111111111000000'000000'0000'0, {}},
807 T{0b111111111111110000000'000000'0000'0, {}},
808 T{0b111111111111100000000'000000'0000'0, {}},
809 T{0b111111111111000000000'000000'0000'0, {}},
810 T{0b111111111110000000000'000000'0000'0, {}},
811 T{0b111111111100000000000'000000'0000'0, {}},
812 T{0b111111111000000000000'000000'0000'0, {}},
813 T{0b111111110000000000000'000000'0000'0, {}},
814 T{0b111111100000000000000'000000'0000'0, {}},
815 T{0b111111000000000000000'000000'0000'0, {}},
816 T{0b111110000000000000000'000000'0000'0, {}},
817 T{0b111100000000000000000'000000'0000'0, {}},
818 T{0b111000000000000000000'000000'0000'0, {}},
819 T{0b110000000000000000000'000000'0000'0, {}},
820 T{0b100000000000000000000'000000'0000'0, {}},
821 });
822 }
823
TEST_F(Riscv64ImmediatesTest,TestSImmediate)824 TEST_F(Riscv64ImmediatesTest, TestSImmediate) {
825 using T = std::tuple<uint32_t, std::optional<uint32_t>>;
826 TestConversion<riscv::SImmediate,
827 riscv::MakeSImmediate,
828 riscv::MakeSImmediate,
829 riscv::MakeSImmediate,
830 riscv::MakeSImmediate,
831 riscv::MakeSImmediate,
832 riscv::MakeSImmediate,
833 riscv::MakeSImmediate,
834 riscv::MakeSImmediate>(std::array{
835 T{0b000000000000000000000'000000'0000'0, 0b0'000000'00000'00000'000'00000'0000000},
836 // 31 11 10 5 4 1 0 31 30 25 24 20 19 15 11 7 6 0
837 T{0b000000000000000000000'000000'0000'1, 0b0'000000'00000'00000'000'00001'0000000},
838 T{0b000000000000000000000'000000'0001'0, 0b0'000000'00000'00000'000'00010'0000000},
839 T{0b000000000000000000000'000000'0010'0, 0b0'000000'00000'00000'000'00100'0000000},
840 T{0b000000000000000000000'000000'0100'0, 0b0'000000'00000'00000'000'01000'0000000},
841 T{0b000000000000000000000'000000'1000'0, 0b0'000000'00000'00000'000'10000'0000000},
842 T{0b000000000000000000000'000001'0000'0, 0b0'000001'00000'00000'000'00000'0000000},
843 T{0b000000000000000000000'000010'0000'0, 0b0'000010'00000'00000'000'00000'0000000},
844 T{0b000000000000000000000'000100'0000'0, 0b0'000100'00000'00000'000'00000'0000000},
845 T{0b000000000000000000000'001000'0000'0, 0b0'001000'00000'00000'000'00000'0000000},
846 T{0b000000000000000000000'010000'0000'0, 0b0'010000'00000'00000'000'00000'0000000},
847 T{0b000000000000000000000'100000'0000'0, 0b0'100000'00000'00000'000'00000'0000000},
848 T{0b000000000000000000001'000000'0000'0, {}},
849 T{0b000000000000000000010'000000'0000'0, {}},
850 T{0b000000000000000000100'000000'0000'0, {}},
851 T{0b000000000000000001000'000000'0000'0, {}},
852 T{0b000000000000000010000'000000'0000'0, {}},
853 T{0b000000000000000100000'000000'0000'0, {}},
854 T{0b000000000000001000000'000000'0000'0, {}},
855 T{0b000000000000010000000'000000'0000'0, {}},
856 T{0b000000000000100000000'000000'0000'0, {}},
857 T{0b000000000001000000000'000000'0000'0, {}},
858 T{0b000000000010000000000'000000'0000'0, {}},
859 T{0b000000000100000000000'000000'0000'0, {}},
860 T{0b000000001000000000000'000000'0000'0, {}},
861 T{0b000000010000000000000'000000'0000'0, {}},
862 T{0b000000100000000000000'000000'0000'0, {}},
863 T{0b000001000000000000000'000000'0000'0, {}},
864 T{0b000010000000000000000'000000'0000'0, {}},
865 T{0b000100000000000000000'000000'0000'0, {}},
866 T{0b001000000000000000000'000000'0000'0, {}},
867 T{0b010000000000000000000'000000'0000'0, {}},
868 T{0b100000000000000000000'000000'0000'0, {}},
869 // 31 11 10 5 4 1 0 31 30 25 24 20 19 15 11 7 6 0
870 T{0b111111111111111111111'111111'1111'1, 0b1'111111'00000'00000'000'11111'0000000},
871 T{0b111111111111111111111'111111'1111'0, 0b1'111111'00000'00000'000'11110'0000000},
872 T{0b111111111111111111111'111111'1110'0, 0b1'111111'00000'00000'000'11100'0000000},
873 T{0b111111111111111111111'111111'1100'0, 0b1'111111'00000'00000'000'11000'0000000},
874 T{0b111111111111111111111'111111'1000'0, 0b1'111111'00000'00000'000'10000'0000000},
875 T{0b111111111111111111111'111111'0000'0, 0b1'111111'00000'00000'000'00000'0000000},
876 T{0b111111111111111111111'111110'0000'0, 0b1'111110'00000'00000'000'00000'0000000},
877 T{0b111111111111111111111'111100'0000'0, 0b1'111100'00000'00000'000'00000'0000000},
878 T{0b111111111111111111111'111000'0000'0, 0b1'111000'00000'00000'000'00000'0000000},
879 T{0b111111111111111111111'110000'0000'0, 0b1'110000'00000'00000'000'00000'0000000},
880 T{0b111111111111111111111'100000'0000'0, 0b1'100000'00000'00000'000'00000'0000000},
881 T{0b111111111111111111111'000000'0000'0, 0b1'000000'00000'00000'000'00000'0000000},
882 T{0b111111111111111111110'000000'0000'0, {}},
883 T{0b111111111111111111100'000000'0000'0, {}},
884 T{0b111111111111111111000'000000'0000'0, {}},
885 T{0b111111111111111110000'000000'0000'0, {}},
886 T{0b111111111111111100000'000000'0000'0, {}},
887 T{0b111111111111111000000'000000'0000'0, {}},
888 T{0b111111111111110000000'000000'0000'0, {}},
889 T{0b111111111111100000000'000000'0000'0, {}},
890 T{0b111111111111000000000'000000'0000'0, {}},
891 T{0b111111111110000000000'000000'0000'0, {}},
892 T{0b111111111100000000000'000000'0000'0, {}},
893 T{0b111111111000000000000'000000'0000'0, {}},
894 T{0b111111110000000000000'000000'0000'0, {}},
895 T{0b111111100000000000000'000000'0000'0, {}},
896 T{0b111111000000000000000'000000'0000'0, {}},
897 T{0b111110000000000000000'000000'0000'0, {}},
898 T{0b111100000000000000000'000000'0000'0, {}},
899 T{0b111000000000000000000'000000'0000'0, {}},
900 T{0b110000000000000000000'000000'0000'0, {}},
901 T{0b100000000000000000000'000000'0000'0, {}},
902 });
903 }
904
TEST_F(Riscv64ImmediatesTest,TestUImmediate)905 TEST_F(Riscv64ImmediatesTest, TestUImmediate) {
906 using T = std::tuple<uint32_t, std::optional<uint32_t>>;
907 TestConversion<riscv::UImmediate,
908 riscv::MakeUImmediate,
909 riscv::MakeUImmediate,
910 riscv::MakeUImmediate,
911 riscv::MakeUImmediate,
912 riscv::MakeUImmediate,
913 riscv::MakeUImmediate,
914 riscv::MakeUImmediate,
915 riscv::MakeUImmediate>(std::array{
916 T{0b0'00000000000'00000000'000000000000, 0b00000000000000000000'00000'0000000},
917 // 31 30 20 19 12 11 0 31 12 11 7 6 0
918 T{0b0'00000000000'00000000'000000000001, {}},
919 T{0b0'00000000000'00000000'000000000010, {}},
920 T{0b0'00000000000'00000000'000000000100, {}},
921 T{0b0'00000000000'00000000'000000001000, {}},
922 T{0b0'00000000000'00000000'000000010000, {}},
923 T{0b0'00000000000'00000000'000000100000, {}},
924 T{0b0'00000000000'00000000'000001000000, {}},
925 T{0b0'00000000000'00000000'000010000000, {}},
926 T{0b0'00000000000'00000000'000100000000, {}},
927 T{0b0'00000000000'00000000'001000000000, {}},
928 T{0b0'00000000000'00000000'010000000000, {}},
929 T{0b0'00000000000'00000000'100000000000, {}},
930 T{0b0'00000000000'00000001'000000000000, 0b00000000000000000001'00000'0000000},
931 T{0b0'00000000000'00000010'000000000000, 0b00000000000000000010'00000'0000000},
932 T{0b0'00000000000'00000100'000000000000, 0b00000000000000000100'00000'0000000},
933 T{0b0'00000000000'00001000'000000000000, 0b00000000000000001000'00000'0000000},
934 T{0b0'00000000000'00010000'000000000000, 0b00000000000000010000'00000'0000000},
935 T{0b0'00000000000'00100000'000000000000, 0b00000000000000100000'00000'0000000},
936 T{0b0'00000000000'01000000'000000000000, 0b00000000000001000000'00000'0000000},
937 T{0b0'00000000000'10000000'000000000000, 0b00000000000010000000'00000'0000000},
938 T{0b0'00000000001'00000000'000000000000, 0b00000000000100000000'00000'0000000},
939 T{0b0'00000000010'00000000'000000000000, 0b00000000001000000000'00000'0000000},
940 T{0b0'00000000100'00000000'000000000000, 0b00000000010000000000'00000'0000000},
941 T{0b0'00000001000'00000000'000000000000, 0b00000000100000000000'00000'0000000},
942 T{0b0'00000010000'00000000'000000000000, 0b00000001000000000000'00000'0000000},
943 T{0b0'00000100000'00000000'000000000000, 0b00000010000000000000'00000'0000000},
944 T{0b0'00001000000'00000000'000000000000, 0b00000100000000000000'00000'0000000},
945 T{0b0'00010000000'00000000'000000000000, 0b00001000000000000000'00000'0000000},
946 T{0b0'00100000000'00000000'000000000000, 0b00010000000000000000'00000'0000000},
947 T{0b0'01000000000'00000000'000000000000, 0b00100000000000000000'00000'0000000},
948 T{0b0'10000000000'00000000'000000000000, 0b01000000000000000000'00000'0000000},
949 // 31 30 20 19 12 11 0 31 12 11 7 6 0
950 T{0b1'11111111111'11111111'111111111111, {}},
951 T{0b1'11111111111'11111111'111111111110, {}},
952 T{0b1'11111111111'11111111'111111111100, {}},
953 T{0b1'11111111111'11111111'111111111000, {}},
954 T{0b1'11111111111'11111111'111111110000, {}},
955 T{0b1'11111111111'11111111'111111100000, {}},
956 T{0b1'11111111111'11111111'111111000000, {}},
957 T{0b1'11111111111'11111111'111110000000, {}},
958 T{0b1'11111111111'11111111'111100000000, {}},
959 T{0b1'11111111111'11111111'111000000000, {}},
960 T{0b1'11111111111'11111111'110000000000, {}},
961 T{0b1'11111111111'11111111'100000000000, {}},
962 T{0b1'11111111111'11111111'000000000000, 0b11111111111111111111'00000'0000000},
963 T{0b1'11111111111'11111110'000000000000, 0b11111111111111111110'00000'0000000},
964 T{0b1'11111111111'11111100'000000000000, 0b11111111111111111100'00000'0000000},
965 T{0b1'11111111111'11111000'000000000000, 0b11111111111111111000'00000'0000000},
966 T{0b1'11111111111'11110000'000000000000, 0b11111111111111110000'00000'0000000},
967 T{0b1'11111111111'11100000'000000000000, 0b11111111111111100000'00000'0000000},
968 T{0b1'11111111111'11000000'000000000000, 0b11111111111111000000'00000'0000000},
969 T{0b1'11111111111'10000000'000000000000, 0b11111111111110000000'00000'0000000},
970 T{0b1'11111111111'00000000'000000000000, 0b11111111111100000000'00000'0000000},
971 T{0b1'11111111110'00000000'000000000000, 0b11111111111000000000'00000'0000000},
972 T{0b1'11111111100'00000000'000000000000, 0b11111111110000000000'00000'0000000},
973 T{0b1'11111111000'00000000'000000000000, 0b11111111100000000000'00000'0000000},
974 T{0b1'11111110000'00000000'000000000000, 0b11111111000000000000'00000'0000000},
975 T{0b1'11111100000'00000000'000000000000, 0b11111110000000000000'00000'0000000},
976 T{0b1'11111000000'00000000'000000000000, 0b11111100000000000000'00000'0000000},
977 T{0b1'11110000000'00000000'000000000000, 0b11111000000000000000'00000'0000000},
978 T{0b1'11100000000'00000000'000000000000, 0b11110000000000000000'00000'0000000},
979 T{0b1'11000000000'00000000'000000000000, 0b11100000000000000000'00000'0000000},
980 T{0b1'10000000000'00000000'000000000000, 0b11000000000000000000'00000'0000000},
981 T{0b1'00000000000'00000000'000000000000, 0b10000000000000000000'00000'0000000},
982 });
983 }
984
985 } // namespace
986
987 } // namespace berberis
988