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