| /* |
| * Copyright (C) 2024 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "gtest/gtest.h" |
| |
| #include <array> |
| #include <optional> |
| #include <tuple> |
| |
| #include "berberis/assembler/rv32.h" |
| #include "berberis/assembler/rv64.h" |
| |
| namespace berberis { |
| |
| namespace { |
| |
| class Riscv64ImmediatesTest : public ::testing::Test { |
| public: |
| Riscv64ImmediatesTest() {} |
| |
| template <typename ImmediateType, |
| std::optional<ImmediateType> (*make_immediate_i8)(int8_t), |
| std::optional<ImmediateType> (*make_immediate_u8)(uint8_t), |
| std::optional<ImmediateType> (*make_immediate_i16)(int16_t), |
| std::optional<ImmediateType> (*make_immediate_u16)(uint16_t), |
| std::optional<ImmediateType> (*make_immediate_i32)(int32_t), |
| std::optional<ImmediateType> (*make_immediate_u32)(uint32_t), |
| std::optional<ImmediateType> (*make_immediate_i64)(int64_t), |
| std::optional<ImmediateType> (*make_immediate_u64)(uint64_t), |
| size_t size> |
| void TestConversion(std::array<std::tuple<uint32_t, std::optional<uint32_t>>, size> test_cases) { |
| for (const auto& test_case : test_cases) { |
| int32_t source = static_cast<int32_t>(std::get<0>(test_case)); |
| std::optional<uint32_t> expected_result = std::get<1>(test_case); |
| auto CheckConversion = |
| [&source, &expected_result]<typename IntType, |
| std::optional<ImmediateType> (*make_immediate)(IntType)>() { |
| IntType typed_source = static_cast<IntType>(source); |
| // If source is not representable as IntType, then conversion check doesn't make sense. |
| // E.e. if our test is trying to encode 0x100 which, when converted to int8_t becomes 0, |
| // then, if immediate actually accepts 0x100 expected_result would be encoding 0x100 but |
| // result would encode 0 which is correct, but different from expected_result ! |
| if (static_cast<int32_t>(typed_source) != source || |
| (!std::is_signed_v<IntType> && source < 0)) { |
| return; |
| } |
| std::optional<ImmediateType> result = make_immediate(source); |
| EXPECT_EQ(result.has_value(), expected_result.has_value()); |
| if (result.has_value()) { |
| uint32_t raw_immediate_value = result->EncodedValue(); |
| // RISC-V I-ImmediateType and S-Immediate support the same set of values and could be |
| // converted from one to another, but other types of immediates are unique. |
| if constexpr (std::is_same_v<ImmediateType, rv64::Assembler::Immediate>) { |
| EXPECT_EQ(ImmediateType(rv64::Assembler::SImmediate(typed_source)), *result); |
| } else if constexpr (std::is_same_v<ImmediateType, rv64::Assembler::SImmediate>) { |
| EXPECT_EQ(ImmediateType(rv64::Assembler::Immediate(typed_source)), *result); |
| } |
| EXPECT_EQ(raw_immediate_value, *expected_result); |
| ImmediateType result = ImmediateType(source); |
| raw_immediate_value = result.EncodedValue(); |
| EXPECT_EQ(raw_immediate_value, *expected_result); |
| } |
| }; |
| CheckConversion.template operator()<int8_t, make_immediate_i8>(); |
| CheckConversion.template operator()<uint8_t, make_immediate_u8>(); |
| CheckConversion.template operator()<int16_t, make_immediate_i16>(); |
| CheckConversion.template operator()<uint16_t, make_immediate_u16>(); |
| CheckConversion.template operator()<int32_t, make_immediate_i32>(); |
| CheckConversion.template operator()<uint32_t, make_immediate_u32>(); |
| CheckConversion.template operator()<int64_t, make_immediate_i64>(); |
| CheckConversion.template operator()<uint64_t, make_immediate_u64>(); |
| } |
| } |
| }; |
| |
| TEST_F(Riscv64ImmediatesTest, TestBImmediate) { |
| using T = std::tuple<uint32_t, std::optional<uint32_t>>; |
| TestConversion<rv64::Assembler::BImmediate, |
| rv64::Assembler::MakeBImmediate, |
| rv64::Assembler::MakeBImmediate, |
| rv64::Assembler::MakeBImmediate, |
| rv64::Assembler::MakeBImmediate, |
| rv64::Assembler::MakeBImmediate, |
| rv64::Assembler::MakeBImmediate, |
| rv64::Assembler::MakeBImmediate, |
| rv64::Assembler::MakeBImmediate>(std::array{ |
| T{0b00000000000000000000'0'000000'0000'0, 0b0'000000'00000'00000'000'0000'0'0000000}, |
| // 31 12 11 10 5 4 1 0 31 30 25 24 20 19 15 11 8 7 6 0 |
| T{0b00000000000000000000'0'000000'0000'1, {}}, |
| T{0b00000000000000000000'0'000000'0001'0, 0b0'000000'00000'00000'000'0001'0'0000000}, |
| T{0b00000000000000000000'0'000000'0010'0, 0b0'000000'00000'00000'000'0010'0'0000000}, |
| T{0b00000000000000000000'0'000000'0100'0, 0b0'000000'00000'00000'000'0100'0'0000000}, |
| T{0b00000000000000000000'0'000000'1000'0, 0b0'000000'00000'00000'000'1000'0'0000000}, |
| T{0b00000000000000000000'0'000001'0000'0, 0b0'000001'00000'00000'000'0000'0'0000000}, |
| T{0b00000000000000000000'0'000010'0000'0, 0b0'000010'00000'00000'000'0000'0'0000000}, |
| T{0b00000000000000000000'0'000100'0000'0, 0b0'000100'00000'00000'000'0000'0'0000000}, |
| T{0b00000000000000000000'0'001000'0000'0, 0b0'001000'00000'00000'000'0000'0'0000000}, |
| T{0b00000000000000000000'0'010000'0000'0, 0b0'010000'00000'00000'000'0000'0'0000000}, |
| T{0b00000000000000000000'0'100000'0000'0, 0b0'100000'00000'00000'000'0000'0'0000000}, |
| T{0b00000000000000000000'1'000000'0000'0, 0b0'000000'00000'00000'000'0000'1'0000000}, |
| T{0b00000000000000000001'0'000000'0000'0, {}}, |
| T{0b00000000000000000010'0'000000'0000'0, {}}, |
| T{0b00000000000000000100'0'000000'0000'0, {}}, |
| T{0b00000000000000001000'0'000000'0000'0, {}}, |
| T{0b00000000000000010000'0'000000'0000'0, {}}, |
| T{0b00000000000000100000'0'000000'0000'0, {}}, |
| T{0b00000000000001000000'0'000000'0000'0, {}}, |
| T{0b00000000000010000000'0'000000'0000'0, {}}, |
| T{0b00000000000100000000'0'000000'0000'0, {}}, |
| T{0b00000000001000000000'0'000000'0000'0, {}}, |
| T{0b00000000010000000000'0'000000'0000'0, {}}, |
| T{0b00000000100000000000'0'000000'0000'0, {}}, |
| T{0b00000001000000000000'0'000000'0000'0, {}}, |
| T{0b00000010000000000000'0'000000'0000'0, {}}, |
| T{0b00000100000000000000'0'000000'0000'0, {}}, |
| T{0b00001000000000000000'0'000000'0000'0, {}}, |
| T{0b00010000000000000000'0'000000'0000'0, {}}, |
| T{0b00100000000000000000'0'000000'0000'0, {}}, |
| T{0b01000000000000000000'0'000000'0000'0, {}}, |
| T{0b10000000000000000000'0'000000'0000'0, {}}, |
| // 31 12 11 10 5 4 1 0 31 30 25 24 20 19 15 11 8 7 6 0 |
| T{0b11111111111111111111'1'111111'1111'1, {}}, |
| T{0b11111111111111111111'1'111111'1111'0, 0b1'111111'00000'00000'000'1111'1'0000000}, |
| T{0b11111111111111111111'1'111111'1110'0, 0b1'111111'00000'00000'000'1110'1'0000000}, |
| T{0b11111111111111111111'1'111111'1100'0, 0b1'111111'00000'00000'000'1100'1'0000000}, |
| T{0b11111111111111111111'1'111111'1000'0, 0b1'111111'00000'00000'000'1000'1'0000000}, |
| T{0b11111111111111111111'1'111111'0000'0, 0b1'111111'00000'00000'000'0000'1'0000000}, |
| T{0b11111111111111111111'1'111110'0000'0, 0b1'111110'00000'00000'000'0000'1'0000000}, |
| T{0b11111111111111111111'1'111100'0000'0, 0b1'111100'00000'00000'000'0000'1'0000000}, |
| T{0b11111111111111111111'1'111000'0000'0, 0b1'111000'00000'00000'000'0000'1'0000000}, |
| T{0b11111111111111111111'1'110000'0000'0, 0b1'110000'00000'00000'000'0000'1'0000000}, |
| T{0b11111111111111111111'1'100000'0000'0, 0b1'100000'00000'00000'000'0000'1'0000000}, |
| T{0b11111111111111111111'1'000000'0000'0, 0b1'000000'00000'00000'000'0000'1'0000000}, |
| T{0b11111111111111111111'0'000000'0000'0, 0b1'000000'00000'00000'000'0000'0'0000000}, |
| T{0b11111111111111111110'0'000000'0000'0, {}}, |
| T{0b11111111111111111100'0'000000'0000'0, {}}, |
| T{0b11111111111111111000'0'000000'0000'0, {}}, |
| T{0b11111111111111110000'0'000000'0000'0, {}}, |
| T{0b11111111111111100000'0'000000'0000'0, {}}, |
| T{0b11111111111111000000'0'000000'0000'0, {}}, |
| T{0b11111111111110000000'0'000000'0000'0, {}}, |
| T{0b11111111111100000000'0'000000'0000'0, {}}, |
| T{0b11111111111000000000'0'000000'0000'0, {}}, |
| T{0b11111111110000000000'0'000000'0000'0, {}}, |
| T{0b11111111100000000000'0'000000'0000'0, {}}, |
| T{0b11111111000000000000'0'000000'0000'0, {}}, |
| T{0b11111110000000000000'0'000000'0000'0, {}}, |
| T{0b11111100000000000000'0'000000'0000'0, {}}, |
| T{0b11111000000000000000'0'000000'0000'0, {}}, |
| T{0b11110000000000000000'0'000000'0000'0, {}}, |
| T{0b11100000000000000000'0'000000'0000'0, {}}, |
| T{0b11000000000000000000'0'000000'0000'0, {}}, |
| T{0b10000000000000000000'0'000000'0000'0, {}}, |
| }); |
| } |
| |
| TEST_F(Riscv64ImmediatesTest, TestCsrImmediate) { |
| using T = std::tuple<uint32_t, std::optional<uint32_t>>; |
| TestConversion<rv64::Assembler::CsrImmediate, |
| rv64::Assembler::MakeCsrImmediate, |
| rv64::Assembler::MakeCsrImmediate, |
| rv64::Assembler::MakeCsrImmediate, |
| rv64::Assembler::MakeCsrImmediate, |
| rv64::Assembler::MakeCsrImmediate, |
| rv64::Assembler::MakeCsrImmediate, |
| rv64::Assembler::MakeCsrImmediate, |
| rv64::Assembler::MakeCsrImmediate>(std::array{ |
| T{0b000000000000000000000'000000'0000'0, 0b0'00000000000'00000'000'00000'0000000}, |
| // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0 |
| T{0b000000000000000000000'000000'0000'1, 0b0'00000000000'00001'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0001'0, 0b0'00000000000'00010'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0010'0, 0b0'00000000000'00100'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0100'0, 0b0'00000000000'01000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'1000'0, 0b0'00000000000'10000'000'00000'0000000}, |
| T{0b000000000000000000000'000001'0000'0, {}}, |
| T{0b000000000000000000000'000010'0000'0, {}}, |
| T{0b000000000000000000000'000100'0000'0, {}}, |
| T{0b000000000000000000000'001000'0000'0, {}}, |
| T{0b000000000000000000000'010000'0000'0, {}}, |
| T{0b000000000000000000000'100000'0000'0, {}}, |
| T{0b000000000000000000001'000000'0000'0, {}}, |
| T{0b000000000000000000010'000000'0000'0, {}}, |
| T{0b000000000000000000100'000000'0000'0, {}}, |
| T{0b000000000000000001000'000000'0000'0, {}}, |
| T{0b000000000000000010000'000000'0000'0, {}}, |
| T{0b000000000000000100000'000000'0000'0, {}}, |
| T{0b000000000000001000000'000000'0000'0, {}}, |
| T{0b000000000000010000000'000000'0000'0, {}}, |
| T{0b000000000000100000000'000000'0000'0, {}}, |
| T{0b000000000001000000000'000000'0000'0, {}}, |
| T{0b000000000010000000000'000000'0000'0, {}}, |
| T{0b000000000100000000000'000000'0000'0, {}}, |
| T{0b000000001000000000000'000000'0000'0, {}}, |
| T{0b000000010000000000000'000000'0000'0, {}}, |
| T{0b000000100000000000000'000000'0000'0, {}}, |
| T{0b000001000000000000000'000000'0000'0, {}}, |
| T{0b000010000000000000000'000000'0000'0, {}}, |
| T{0b000100000000000000000'000000'0000'0, {}}, |
| T{0b001000000000000000000'000000'0000'0, {}}, |
| T{0b010000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0 |
| T{0b111111111111111111111'111111'1111'1, {}}, |
| T{0b111111111111111111111'111111'1111'0, {}}, |
| T{0b111111111111111111111'111111'1110'0, {}}, |
| T{0b111111111111111111111'111111'1100'0, {}}, |
| T{0b111111111111111111111'111111'1000'0, {}}, |
| T{0b111111111111111111111'111111'0000'0, {}}, |
| T{0b111111111111111111111'111110'0000'0, {}}, |
| T{0b111111111111111111111'111100'0000'0, {}}, |
| T{0b111111111111111111111'111000'0000'0, {}}, |
| T{0b111111111111111111111'110000'0000'0, {}}, |
| T{0b111111111111111111111'100000'0000'0, {}}, |
| T{0b111111111111111111111'000000'0000'0, {}}, |
| T{0b111111111111111111110'000000'0000'0, {}}, |
| T{0b111111111111111111100'000000'0000'0, {}}, |
| T{0b111111111111111111000'000000'0000'0, {}}, |
| T{0b111111111111111110000'000000'0000'0, {}}, |
| T{0b111111111111111100000'000000'0000'0, {}}, |
| T{0b111111111111111000000'000000'0000'0, {}}, |
| T{0b111111111111110000000'000000'0000'0, {}}, |
| T{0b111111111111100000000'000000'0000'0, {}}, |
| T{0b111111111111000000000'000000'0000'0, {}}, |
| T{0b111111111110000000000'000000'0000'0, {}}, |
| T{0b111111111100000000000'000000'0000'0, {}}, |
| T{0b111111111000000000000'000000'0000'0, {}}, |
| T{0b111111110000000000000'000000'0000'0, {}}, |
| T{0b111111100000000000000'000000'0000'0, {}}, |
| T{0b111111000000000000000'000000'0000'0, {}}, |
| T{0b111110000000000000000'000000'0000'0, {}}, |
| T{0b111100000000000000000'000000'0000'0, {}}, |
| T{0b111000000000000000000'000000'0000'0, {}}, |
| T{0b110000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| }); |
| } |
| |
| TEST_F(Riscv64ImmediatesTest, TestIImmediate) { |
| using T = std::tuple<uint32_t, std::optional<uint32_t>>; |
| TestConversion<rv64::Assembler::Immediate, |
| rv64::Assembler::MakeImmediate, |
| rv64::Assembler::MakeImmediate, |
| rv64::Assembler::MakeImmediate, |
| rv64::Assembler::MakeImmediate, |
| rv64::Assembler::MakeImmediate, |
| rv64::Assembler::MakeImmediate, |
| rv64::Assembler::MakeImmediate, |
| rv64::Assembler::MakeImmediate>(std::array{ |
| T{0b000000000000000000000'000000'0000'0, 0b0'00000000000'00000'000'00000'0000000}, |
| // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0 |
| T{0b000000000000000000000'000000'0000'1, 0b0'00000000001'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0001'0, 0b0'00000000010'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0010'0, 0b0'00000000100'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0100'0, 0b0'00000001000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'1000'0, 0b0'00000010000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000001'0000'0, 0b0'00000100000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000010'0000'0, 0b0'00001000000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000100'0000'0, 0b0'00010000000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'001000'0000'0, 0b0'00100000000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'010000'0000'0, 0b0'01000000000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'100000'0000'0, 0b0'10000000000'00000'000'00000'0000000}, |
| T{0b000000000000000000001'000000'0000'0, {}}, |
| T{0b000000000000000000010'000000'0000'0, {}}, |
| T{0b000000000000000000100'000000'0000'0, {}}, |
| T{0b000000000000000001000'000000'0000'0, {}}, |
| T{0b000000000000000010000'000000'0000'0, {}}, |
| T{0b000000000000000100000'000000'0000'0, {}}, |
| T{0b000000000000001000000'000000'0000'0, {}}, |
| T{0b000000000000010000000'000000'0000'0, {}}, |
| T{0b000000000000100000000'000000'0000'0, {}}, |
| T{0b000000000001000000000'000000'0000'0, {}}, |
| T{0b000000000010000000000'000000'0000'0, {}}, |
| T{0b000000000100000000000'000000'0000'0, {}}, |
| T{0b000000001000000000000'000000'0000'0, {}}, |
| T{0b000000010000000000000'000000'0000'0, {}}, |
| T{0b000000100000000000000'000000'0000'0, {}}, |
| T{0b000001000000000000000'000000'0000'0, {}}, |
| T{0b000010000000000000000'000000'0000'0, {}}, |
| T{0b000100000000000000000'000000'0000'0, {}}, |
| T{0b001000000000000000000'000000'0000'0, {}}, |
| T{0b010000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0 |
| T{0b111111111111111111111'111111'1111'1, 0b1'11111111111'00000'000'00000'0000000}, |
| T{0b111111111111111111111'111111'1111'0, 0b1'11111111110'00000'000'00000'0000000}, |
| T{0b111111111111111111111'111111'1110'0, 0b1'11111111100'00000'000'00000'0000000}, |
| T{0b111111111111111111111'111111'1100'0, 0b1'11111111000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'111111'1000'0, 0b1'11111110000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'111111'0000'0, 0b1'11111100000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'111110'0000'0, 0b1'11111000000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'111100'0000'0, 0b1'11110000000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'111000'0000'0, 0b1'11100000000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'110000'0000'0, 0b1'11000000000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'100000'0000'0, 0b1'10000000000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'000000'0000'0, 0b1'00000000000'00000'000'00000'0000000}, |
| T{0b111111111111111111110'000000'0000'0, {}}, |
| T{0b111111111111111111100'000000'0000'0, {}}, |
| T{0b111111111111111111000'000000'0000'0, {}}, |
| T{0b111111111111111110000'000000'0000'0, {}}, |
| T{0b111111111111111100000'000000'0000'0, {}}, |
| T{0b111111111111111000000'000000'0000'0, {}}, |
| T{0b111111111111110000000'000000'0000'0, {}}, |
| T{0b111111111111100000000'000000'0000'0, {}}, |
| T{0b111111111111000000000'000000'0000'0, {}}, |
| T{0b111111111110000000000'000000'0000'0, {}}, |
| T{0b111111111100000000000'000000'0000'0, {}}, |
| T{0b111111111000000000000'000000'0000'0, {}}, |
| T{0b111111110000000000000'000000'0000'0, {}}, |
| T{0b111111100000000000000'000000'0000'0, {}}, |
| T{0b111111000000000000000'000000'0000'0, {}}, |
| T{0b111110000000000000000'000000'0000'0, {}}, |
| T{0b111100000000000000000'000000'0000'0, {}}, |
| T{0b111000000000000000000'000000'0000'0, {}}, |
| T{0b110000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| }); |
| } |
| |
| TEST_F(Riscv64ImmediatesTest, TestJImmediate) { |
| using T = std::tuple<uint32_t, std::optional<uint32_t>>; |
| TestConversion<rv64::Assembler::JImmediate, |
| rv64::Assembler::MakeJImmediate, |
| rv64::Assembler::MakeJImmediate, |
| rv64::Assembler::MakeJImmediate, |
| rv64::Assembler::MakeJImmediate, |
| rv64::Assembler::MakeJImmediate, |
| rv64::Assembler::MakeJImmediate, |
| rv64::Assembler::MakeJImmediate, |
| rv64::Assembler::MakeJImmediate>(std::array{ |
| T{0b000000000000'00000000'0'0000000000'0, 0b0'0000000000'0'00000'000'0000'0'0000000}, |
| // 31 20 19 12 11 10 5 4 1 0 31 30 21 20 19 15 11 8 7 6 0 |
| T{0b000000000000'00000000'0'000000'0000'1, {}}, |
| T{0b000000000000'00000000'0'000000'0001'0, 0b0'0000000001'0'00000'000'0000'0'0000000}, |
| T{0b000000000000'00000000'0'000000'0010'0, 0b0'0000000010'0'00000'000'0000'0'0000000}, |
| T{0b000000000000'00000000'0'000000'0100'0, 0b0'0000000100'0'00000'000'0000'0'0000000}, |
| T{0b000000000000'00000000'0'000000'1000'0, 0b0'0000001000'0'00000'000'0000'0'0000000}, |
| T{0b000000000000'00000000'0'000001'0000'0, 0b0'0000010000'0'00000'000'0000'0'0000000}, |
| T{0b000000000000'00000000'0'000010'0000'0, 0b0'0000100000'0'00000'000'0000'0'0000000}, |
| T{0b000000000000'00000000'0'000100'0000'0, 0b0'0001000000'0'00000'000'0000'0'0000000}, |
| T{0b000000000000'00000000'0'001000'0000'0, 0b0'0010000000'0'00000'000'0000'0'0000000}, |
| T{0b000000000000'00000000'0'010000'0000'0, 0b0'0100000000'0'00000'000'0000'0'0000000}, |
| T{0b000000000000'00000000'0'100000'0000'0, 0b0'1000000000'0'00000'000'0000'0'0000000}, |
| T{0b000000000000'00000000'1'000000'0000'0, 0b0'0000000000'1'00000'000'0000'0'0000000}, |
| T{0b000000000000'00000001'0'000000'0000'0, 0b0'0000000000'0'00000'001'0000'0'0000000}, |
| T{0b000000000000'00000010'0'000000'0000'0, 0b0'0000000000'0'00000'010'0000'0'0000000}, |
| T{0b000000000000'00000100'0'000000'0000'0, 0b0'0000000000'0'00000'100'0000'0'0000000}, |
| T{0b000000000000'00001000'0'000000'0000'0, 0b0'0000000000'0'00001'000'0000'0'0000000}, |
| T{0b000000000000'00010000'0'000000'0000'0, 0b0'0000000000'0'00010'000'0000'0'0000000}, |
| T{0b000000000000'00100000'0'000000'0000'0, 0b0'0000000000'0'00100'000'0000'0'0000000}, |
| T{0b000000000000'01000000'0'000000'0000'0, 0b0'0000000000'0'01000'000'0000'0'0000000}, |
| T{0b000000000000'10000000'0'000000'0000'0, 0b0'0000000000'0'10000'000'0000'0'0000000}, |
| T{0b000000000001'00000000'0'000000'0000'0, {}}, |
| T{0b000000000010'00000000'0'000000'0000'0, {}}, |
| T{0b000000000100'00000000'0'000000'0000'0, {}}, |
| T{0b000000001000'00000000'0'000000'0000'0, {}}, |
| T{0b000000010000'00000000'0'000000'0000'0, {}}, |
| T{0b000000100000'00000000'0'000000'0000'0, {}}, |
| T{0b000001000000'00000000'0'000000'0000'0, {}}, |
| T{0b000010000000'00000000'0'000000'0000'0, {}}, |
| T{0b000100000000'00000000'0'000000'0000'0, {}}, |
| T{0b001000000000'00000000'0'000000'0000'0, {}}, |
| T{0b010000000000'00000000'0'000000'0000'0, {}}, |
| T{0b100000000000'00000000'0'000000'0000'0, {}}, |
| // 31 20 19 12 11 10 5 4 1 0 31 30 21 20 19 15 11 8 7 6 0 |
| T{0b111111111111'11111111'1'111111'1111'1, {}}, |
| T{0b111111111111'11111111'1'111111'1111'0, 0b1'1111111111'1'11111'111'0000'0'0000000}, |
| T{0b111111111111'11111111'1'111111'1110'0, 0b1'1111111110'1'11111'111'0000'0'0000000}, |
| T{0b111111111111'11111111'1'111111'1100'0, 0b1'1111111100'1'11111'111'0000'0'0000000}, |
| T{0b111111111111'11111111'1'111111'1000'0, 0b1'1111111000'1'11111'111'0000'0'0000000}, |
| T{0b111111111111'11111111'1'111111'0000'0, 0b1'1111110000'1'11111'111'0000'0'0000000}, |
| T{0b111111111111'11111111'1'111110'0000'0, 0b1'1111100000'1'11111'111'0000'0'0000000}, |
| T{0b111111111111'11111111'1'111100'0000'0, 0b1'1111000000'1'11111'111'0000'0'0000000}, |
| T{0b111111111111'11111111'1'111000'0000'0, 0b1'1110000000'1'11111'111'0000'0'0000000}, |
| T{0b111111111111'11111111'1'110000'0000'0, 0b1'1100000000'1'11111'111'0000'0'0000000}, |
| T{0b111111111111'11111111'1'100000'0000'0, 0b1'1000000000'1'11111'111'0000'0'0000000}, |
| T{0b111111111111'11111111'1'000000'0000'0, 0b1'0000000000'1'11111'111'0000'0'0000000}, |
| T{0b111111111111'11111111'0'000000'0000'0, 0b1'0000000000'0'11111'111'0000'0'0000000}, |
| T{0b111111111111'11111110'0'000000'0000'0, 0b1'0000000000'0'11111'110'0000'0'0000000}, |
| T{0b111111111111'11111100'0'000000'0000'0, 0b1'0000000000'0'11111'100'0000'0'0000000}, |
| T{0b111111111111'11111000'0'000000'0000'0, 0b1'0000000000'0'11111'000'0000'0'0000000}, |
| T{0b111111111111'11110000'0'000000'0000'0, 0b1'0000000000'0'11110'000'0000'0'0000000}, |
| T{0b111111111111'11100000'0'000000'0000'0, 0b1'0000000000'0'11100'000'0000'0'0000000}, |
| T{0b111111111111'11000000'0'000000'0000'0, 0b1'0000000000'0'11000'000'0000'0'0000000}, |
| T{0b111111111111'10000000'0'000000'0000'0, 0b1'0000000000'0'10000'000'0000'0'0000000}, |
| T{0b111111111111'00000000'0'000000'0000'0, 0b1'0000000000'0'00000'000'0000'0'0000000}, |
| T{0b111111111110'00000000'0'000000'0000'0, {}}, |
| T{0b111111111100'00000000'0'000000'0000'0, {}}, |
| T{0b111111111000'00000000'0'000000'0000'0, {}}, |
| T{0b111111110000'00000000'0'000000'0000'0, {}}, |
| T{0b111111100000'00000000'0'000000'0000'0, {}}, |
| T{0b111111000000'00000000'0'000000'0000'0, {}}, |
| T{0b111110000000'00000000'0'000000'0000'0, {}}, |
| T{0b111100000000'00000000'0'000000'0000'0, {}}, |
| T{0b111000000000'00000000'0'000000'0000'0, {}}, |
| T{0b110000000000'00000000'0'000000'0000'0, {}}, |
| T{0b100000000000'00000000'0'000000'0000'0, {}}, |
| }); |
| } |
| |
| TEST_F(Riscv64ImmediatesTest, TestPImmediate) { |
| using T = std::tuple<uint32_t, std::optional<uint32_t>>; |
| TestConversion<rv64::Assembler::PImmediate, |
| rv64::Assembler::MakePImmediate, |
| rv64::Assembler::MakePImmediate, |
| rv64::Assembler::MakePImmediate, |
| rv64::Assembler::MakePImmediate, |
| rv64::Assembler::MakePImmediate, |
| rv64::Assembler::MakePImmediate, |
| rv64::Assembler::MakePImmediate, |
| rv64::Assembler::MakePImmediate>(std::array{ |
| T{0b000000000000000000000'000000'0000'0, 0b0'000000'00000'00000'000'00000'0000000}, |
| // 31 11 10 5 4 1 0 31 30 25 24 20 19 15 11 7 6 0 |
| T{0b000000000000000000000'000000'0000'1, {}}, |
| T{0b000000000000000000000'000000'0001'0, {}}, |
| T{0b000000000000000000000'000000'0010'0, {}}, |
| T{0b000000000000000000000'000000'0100'0, {}}, |
| T{0b000000000000000000000'000000'1000'0, {}}, |
| T{0b000000000000000000000'000001'0000'0, 0b0'000001'00000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000010'0000'0, 0b0'000010'00000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000100'0000'0, 0b0'000100'00000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'001000'0000'0, 0b0'001000'00000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'010000'0000'0, 0b0'010000'00000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'100000'0000'0, 0b0'100000'00000'00000'000'00000'0000000}, |
| T{0b000000000000000000001'000000'0000'0, {}}, |
| T{0b000000000000000000010'000000'0000'0, {}}, |
| T{0b000000000000000000100'000000'0000'0, {}}, |
| T{0b000000000000000001000'000000'0000'0, {}}, |
| T{0b000000000000000010000'000000'0000'0, {}}, |
| T{0b000000000000000100000'000000'0000'0, {}}, |
| T{0b000000000000001000000'000000'0000'0, {}}, |
| T{0b000000000000010000000'000000'0000'0, {}}, |
| T{0b000000000000100000000'000000'0000'0, {}}, |
| T{0b000000000001000000000'000000'0000'0, {}}, |
| T{0b000000000010000000000'000000'0000'0, {}}, |
| T{0b000000000100000000000'000000'0000'0, {}}, |
| T{0b000000001000000000000'000000'0000'0, {}}, |
| T{0b000000010000000000000'000000'0000'0, {}}, |
| T{0b000000100000000000000'000000'0000'0, {}}, |
| T{0b000001000000000000000'000000'0000'0, {}}, |
| T{0b000010000000000000000'000000'0000'0, {}}, |
| T{0b000100000000000000000'000000'0000'0, {}}, |
| T{0b001000000000000000000'000000'0000'0, {}}, |
| T{0b010000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| // 31 11 10 5 4 1 0 31 30 25 24 20 19 15 11 7 6 0 |
| T{0b111111111111111111111'111111'1111'1, {}}, |
| T{0b111111111111111111111'111111'1111'0, {}}, |
| T{0b111111111111111111111'111111'1110'0, {}}, |
| T{0b111111111111111111111'111111'1100'0, {}}, |
| T{0b111111111111111111111'111111'1000'0, {}}, |
| T{0b111111111111111111111'111111'0000'0, 0b1'111111'00000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'111110'0000'0, 0b1'111110'00000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'111100'0000'0, 0b1'111100'00000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'111000'0000'0, 0b1'111000'00000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'110000'0000'0, 0b1'110000'00000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'100000'0000'0, 0b1'100000'00000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'000000'0000'0, 0b1'000000'00000'00000'000'00000'0000000}, |
| T{0b111111111111111111110'000000'0000'0, {}}, |
| T{0b111111111111111111100'000000'0000'0, {}}, |
| T{0b111111111111111111000'000000'0000'0, {}}, |
| T{0b111111111111111110000'000000'0000'0, {}}, |
| T{0b111111111111111100000'000000'0000'0, {}}, |
| T{0b111111111111111000000'000000'0000'0, {}}, |
| T{0b111111111111110000000'000000'0000'0, {}}, |
| T{0b111111111111100000000'000000'0000'0, {}}, |
| T{0b111111111111000000000'000000'0000'0, {}}, |
| T{0b111111111110000000000'000000'0000'0, {}}, |
| T{0b111111111100000000000'000000'0000'0, {}}, |
| T{0b111111111000000000000'000000'0000'0, {}}, |
| T{0b111111110000000000000'000000'0000'0, {}}, |
| T{0b111111100000000000000'000000'0000'0, {}}, |
| T{0b111111000000000000000'000000'0000'0, {}}, |
| T{0b111110000000000000000'000000'0000'0, {}}, |
| T{0b111100000000000000000'000000'0000'0, {}}, |
| T{0b111000000000000000000'000000'0000'0, {}}, |
| T{0b110000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| }); |
| } |
| |
| TEST_F(Riscv64ImmediatesTest, TestShiftImmediate) { |
| using T = std::tuple<uint32_t, std::optional<uint32_t>>; |
| TestConversion<rv32::Assembler::ShiftImmediate, |
| rv32::Assembler::MakeShiftImmediate, |
| rv32::Assembler::MakeShiftImmediate, |
| rv32::Assembler::MakeShiftImmediate, |
| rv32::Assembler::MakeShiftImmediate, |
| rv32::Assembler::MakeShiftImmediate, |
| rv32::Assembler::MakeShiftImmediate, |
| rv32::Assembler::MakeShiftImmediate, |
| rv32::Assembler::MakeShiftImmediate>(std::array{ |
| T{0b000000000000000000000'000000'0000'0, 0b0'00000000000'00000'000'00000'0000000}, |
| // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0 |
| T{0b000000000000000000000'000000'0000'1, 0b0'00000000001'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0001'0, 0b0'00000000010'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0010'0, 0b0'00000000100'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0100'0, 0b0'00000001000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'1000'0, 0b0'00000010000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000001'0000'0, {}}, |
| T{0b000000000000000000000'000010'0000'0, {}}, |
| T{0b000000000000000000000'000100'0000'0, {}}, |
| T{0b000000000000000000000'001000'0000'0, {}}, |
| T{0b000000000000000000000'010000'0000'0, {}}, |
| T{0b000000000000000000000'100000'0000'0, {}}, |
| T{0b000000000000000000001'000000'0000'0, {}}, |
| T{0b000000000000000000010'000000'0000'0, {}}, |
| T{0b000000000000000000100'000000'0000'0, {}}, |
| T{0b000000000000000001000'000000'0000'0, {}}, |
| T{0b000000000000000010000'000000'0000'0, {}}, |
| T{0b000000000000000100000'000000'0000'0, {}}, |
| T{0b000000000000001000000'000000'0000'0, {}}, |
| T{0b000000000000010000000'000000'0000'0, {}}, |
| T{0b000000000000100000000'000000'0000'0, {}}, |
| T{0b000000000001000000000'000000'0000'0, {}}, |
| T{0b000000000010000000000'000000'0000'0, {}}, |
| T{0b000000000100000000000'000000'0000'0, {}}, |
| T{0b000000001000000000000'000000'0000'0, {}}, |
| T{0b000000010000000000000'000000'0000'0, {}}, |
| T{0b000000100000000000000'000000'0000'0, {}}, |
| T{0b000001000000000000000'000000'0000'0, {}}, |
| T{0b000010000000000000000'000000'0000'0, {}}, |
| T{0b000100000000000000000'000000'0000'0, {}}, |
| T{0b001000000000000000000'000000'0000'0, {}}, |
| T{0b010000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0 |
| T{0b111111111111111111111'111111'1111'1, {}}, |
| T{0b111111111111111111111'111111'1111'0, {}}, |
| T{0b111111111111111111111'111111'1110'0, {}}, |
| T{0b111111111111111111111'111111'1100'0, {}}, |
| T{0b111111111111111111111'111111'1000'0, {}}, |
| T{0b111111111111111111111'111111'0000'0, {}}, |
| T{0b111111111111111111111'111110'0000'0, {}}, |
| T{0b111111111111111111111'111100'0000'0, {}}, |
| T{0b111111111111111111111'111000'0000'0, {}}, |
| T{0b111111111111111111111'110000'0000'0, {}}, |
| T{0b111111111111111111111'100000'0000'0, {}}, |
| T{0b111111111111111111111'000000'0000'0, {}}, |
| T{0b111111111111111111110'000000'0000'0, {}}, |
| T{0b111111111111111111100'000000'0000'0, {}}, |
| T{0b111111111111111111000'000000'0000'0, {}}, |
| T{0b111111111111111110000'000000'0000'0, {}}, |
| T{0b111111111111111100000'000000'0000'0, {}}, |
| T{0b111111111111111000000'000000'0000'0, {}}, |
| T{0b111111111111110000000'000000'0000'0, {}}, |
| T{0b111111111111100000000'000000'0000'0, {}}, |
| T{0b111111111111000000000'000000'0000'0, {}}, |
| T{0b111111111110000000000'000000'0000'0, {}}, |
| T{0b111111111100000000000'000000'0000'0, {}}, |
| T{0b111111111000000000000'000000'0000'0, {}}, |
| T{0b111111110000000000000'000000'0000'0, {}}, |
| T{0b111111100000000000000'000000'0000'0, {}}, |
| T{0b111111000000000000000'000000'0000'0, {}}, |
| T{0b111110000000000000000'000000'0000'0, {}}, |
| T{0b111100000000000000000'000000'0000'0, {}}, |
| T{0b111000000000000000000'000000'0000'0, {}}, |
| T{0b110000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| }); |
| TestConversion<rv64::Assembler::ShiftImmediate, |
| rv64::Assembler::MakeShiftImmediate, |
| rv64::Assembler::MakeShiftImmediate, |
| rv64::Assembler::MakeShiftImmediate, |
| rv64::Assembler::MakeShiftImmediate, |
| rv64::Assembler::MakeShiftImmediate, |
| rv64::Assembler::MakeShiftImmediate, |
| rv64::Assembler::MakeShiftImmediate, |
| rv64::Assembler::MakeShiftImmediate>(std::array{ |
| T{0b000000000000000000000'000000'0000'0, 0b0'00000000000'00000'000'00000'0000000}, |
| // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0 |
| T{0b000000000000000000000'000000'0000'1, 0b0'00000000001'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0001'0, 0b0'00000000010'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0010'0, 0b0'00000000100'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0100'0, 0b0'00000001000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'1000'0, 0b0'00000010000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000001'0000'0, 0b0'00000100000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000010'0000'0, {}}, |
| T{0b000000000000000000000'000100'0000'0, {}}, |
| T{0b000000000000000000000'001000'0000'0, {}}, |
| T{0b000000000000000000000'010000'0000'0, {}}, |
| T{0b000000000000000000000'100000'0000'0, {}}, |
| T{0b000000000000000000001'000000'0000'0, {}}, |
| T{0b000000000000000000010'000000'0000'0, {}}, |
| T{0b000000000000000000100'000000'0000'0, {}}, |
| T{0b000000000000000001000'000000'0000'0, {}}, |
| T{0b000000000000000010000'000000'0000'0, {}}, |
| T{0b000000000000000100000'000000'0000'0, {}}, |
| T{0b000000000000001000000'000000'0000'0, {}}, |
| T{0b000000000000010000000'000000'0000'0, {}}, |
| T{0b000000000000100000000'000000'0000'0, {}}, |
| T{0b000000000001000000000'000000'0000'0, {}}, |
| T{0b000000000010000000000'000000'0000'0, {}}, |
| T{0b000000000100000000000'000000'0000'0, {}}, |
| T{0b000000001000000000000'000000'0000'0, {}}, |
| T{0b000000010000000000000'000000'0000'0, {}}, |
| T{0b000000100000000000000'000000'0000'0, {}}, |
| T{0b000001000000000000000'000000'0000'0, {}}, |
| T{0b000010000000000000000'000000'0000'0, {}}, |
| T{0b000100000000000000000'000000'0000'0, {}}, |
| T{0b001000000000000000000'000000'0000'0, {}}, |
| T{0b010000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0 |
| T{0b111111111111111111111'111111'1111'1, {}}, |
| T{0b111111111111111111111'111111'1111'0, {}}, |
| T{0b111111111111111111111'111111'1110'0, {}}, |
| T{0b111111111111111111111'111111'1100'0, {}}, |
| T{0b111111111111111111111'111111'1000'0, {}}, |
| T{0b111111111111111111111'111111'0000'0, {}}, |
| T{0b111111111111111111111'111110'0000'0, {}}, |
| T{0b111111111111111111111'111100'0000'0, {}}, |
| T{0b111111111111111111111'111000'0000'0, {}}, |
| T{0b111111111111111111111'110000'0000'0, {}}, |
| T{0b111111111111111111111'100000'0000'0, {}}, |
| T{0b111111111111111111111'000000'0000'0, {}}, |
| T{0b111111111111111111110'000000'0000'0, {}}, |
| T{0b111111111111111111100'000000'0000'0, {}}, |
| T{0b111111111111111111000'000000'0000'0, {}}, |
| T{0b111111111111111110000'000000'0000'0, {}}, |
| T{0b111111111111111100000'000000'0000'0, {}}, |
| T{0b111111111111111000000'000000'0000'0, {}}, |
| T{0b111111111111110000000'000000'0000'0, {}}, |
| T{0b111111111111100000000'000000'0000'0, {}}, |
| T{0b111111111111000000000'000000'0000'0, {}}, |
| T{0b111111111110000000000'000000'0000'0, {}}, |
| T{0b111111111100000000000'000000'0000'0, {}}, |
| T{0b111111111000000000000'000000'0000'0, {}}, |
| T{0b111111110000000000000'000000'0000'0, {}}, |
| T{0b111111100000000000000'000000'0000'0, {}}, |
| T{0b111111000000000000000'000000'0000'0, {}}, |
| T{0b111110000000000000000'000000'0000'0, {}}, |
| T{0b111100000000000000000'000000'0000'0, {}}, |
| T{0b111000000000000000000'000000'0000'0, {}}, |
| T{0b110000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| }); |
| } |
| |
| TEST_F(Riscv64ImmediatesTest, TestShift32Immediate) { |
| using T = std::tuple<uint32_t, std::optional<uint32_t>>; |
| TestConversion<rv64::Assembler::Shift32Immediate, |
| rv64::Assembler::MakeShift32Immediate, |
| rv64::Assembler::MakeShift32Immediate, |
| rv64::Assembler::MakeShift32Immediate, |
| rv64::Assembler::MakeShift32Immediate, |
| rv64::Assembler::MakeShift32Immediate, |
| rv64::Assembler::MakeShift32Immediate, |
| rv64::Assembler::MakeShift32Immediate, |
| rv64::Assembler::MakeShift32Immediate>(std::array{ |
| T{0b000000000000000000000'000000'0000'0, 0b0'00000000000'00000'000'00000'0000000}, |
| // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0 |
| T{0b000000000000000000000'000000'0000'1, 0b0'00000000001'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0001'0, 0b0'00000000010'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0010'0, 0b0'00000000100'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0100'0, 0b0'00000001000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'1000'0, 0b0'00000010000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000001'0000'0, {}}, |
| T{0b000000000000000000000'000010'0000'0, {}}, |
| T{0b000000000000000000000'000100'0000'0, {}}, |
| T{0b000000000000000000000'001000'0000'0, {}}, |
| T{0b000000000000000000000'010000'0000'0, {}}, |
| T{0b000000000000000000000'100000'0000'0, {}}, |
| T{0b000000000000000000001'000000'0000'0, {}}, |
| T{0b000000000000000000010'000000'0000'0, {}}, |
| T{0b000000000000000000100'000000'0000'0, {}}, |
| T{0b000000000000000001000'000000'0000'0, {}}, |
| T{0b000000000000000010000'000000'0000'0, {}}, |
| T{0b000000000000000100000'000000'0000'0, {}}, |
| T{0b000000000000001000000'000000'0000'0, {}}, |
| T{0b000000000000010000000'000000'0000'0, {}}, |
| T{0b000000000000100000000'000000'0000'0, {}}, |
| T{0b000000000001000000000'000000'0000'0, {}}, |
| T{0b000000000010000000000'000000'0000'0, {}}, |
| T{0b000000000100000000000'000000'0000'0, {}}, |
| T{0b000000001000000000000'000000'0000'0, {}}, |
| T{0b000000010000000000000'000000'0000'0, {}}, |
| T{0b000000100000000000000'000000'0000'0, {}}, |
| T{0b000001000000000000000'000000'0000'0, {}}, |
| T{0b000010000000000000000'000000'0000'0, {}}, |
| T{0b000100000000000000000'000000'0000'0, {}}, |
| T{0b001000000000000000000'000000'0000'0, {}}, |
| T{0b010000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0 |
| T{0b111111111111111111111'111111'1111'1, {}}, |
| T{0b111111111111111111111'111111'1111'0, {}}, |
| T{0b111111111111111111111'111111'1110'0, {}}, |
| T{0b111111111111111111111'111111'1100'0, {}}, |
| T{0b111111111111111111111'111111'1000'0, {}}, |
| T{0b111111111111111111111'111111'0000'0, {}}, |
| T{0b111111111111111111111'111110'0000'0, {}}, |
| T{0b111111111111111111111'111100'0000'0, {}}, |
| T{0b111111111111111111111'111000'0000'0, {}}, |
| T{0b111111111111111111111'110000'0000'0, {}}, |
| T{0b111111111111111111111'100000'0000'0, {}}, |
| T{0b111111111111111111111'000000'0000'0, {}}, |
| T{0b111111111111111111110'000000'0000'0, {}}, |
| T{0b111111111111111111100'000000'0000'0, {}}, |
| T{0b111111111111111111000'000000'0000'0, {}}, |
| T{0b111111111111111110000'000000'0000'0, {}}, |
| T{0b111111111111111100000'000000'0000'0, {}}, |
| T{0b111111111111111000000'000000'0000'0, {}}, |
| T{0b111111111111110000000'000000'0000'0, {}}, |
| T{0b111111111111100000000'000000'0000'0, {}}, |
| T{0b111111111111000000000'000000'0000'0, {}}, |
| T{0b111111111110000000000'000000'0000'0, {}}, |
| T{0b111111111100000000000'000000'0000'0, {}}, |
| T{0b111111111000000000000'000000'0000'0, {}}, |
| T{0b111111110000000000000'000000'0000'0, {}}, |
| T{0b111111100000000000000'000000'0000'0, {}}, |
| T{0b111111000000000000000'000000'0000'0, {}}, |
| T{0b111110000000000000000'000000'0000'0, {}}, |
| T{0b111100000000000000000'000000'0000'0, {}}, |
| T{0b111000000000000000000'000000'0000'0, {}}, |
| T{0b110000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| }); |
| } |
| |
| TEST_F(Riscv64ImmediatesTest, TestShift64Immediate) { |
| using T = std::tuple<uint32_t, std::optional<uint32_t>>; |
| TestConversion<rv64::Assembler::Shift64Immediate, |
| rv64::Assembler::MakeShift64Immediate, |
| rv64::Assembler::MakeShift64Immediate, |
| rv64::Assembler::MakeShift64Immediate, |
| rv64::Assembler::MakeShift64Immediate, |
| rv64::Assembler::MakeShift64Immediate, |
| rv64::Assembler::MakeShift64Immediate, |
| rv64::Assembler::MakeShift64Immediate, |
| rv64::Assembler::MakeShift64Immediate>(std::array{ |
| T{0b000000000000000000000'000000'0000'0, 0b0'00000000000'00000'000'00000'0000000}, |
| // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0 |
| T{0b000000000000000000000'000000'0000'1, 0b0'00000000001'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0001'0, 0b0'00000000010'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0010'0, 0b0'00000000100'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'0100'0, 0b0'00000001000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000000'1000'0, 0b0'00000010000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000001'0000'0, 0b0'00000100000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000010'0000'0, {}}, |
| T{0b000000000000000000000'000100'0000'0, {}}, |
| T{0b000000000000000000000'001000'0000'0, {}}, |
| T{0b000000000000000000000'010000'0000'0, {}}, |
| T{0b000000000000000000000'100000'0000'0, {}}, |
| T{0b000000000000000000001'000000'0000'0, {}}, |
| T{0b000000000000000000010'000000'0000'0, {}}, |
| T{0b000000000000000000100'000000'0000'0, {}}, |
| T{0b000000000000000001000'000000'0000'0, {}}, |
| T{0b000000000000000010000'000000'0000'0, {}}, |
| T{0b000000000000000100000'000000'0000'0, {}}, |
| T{0b000000000000001000000'000000'0000'0, {}}, |
| T{0b000000000000010000000'000000'0000'0, {}}, |
| T{0b000000000000100000000'000000'0000'0, {}}, |
| T{0b000000000001000000000'000000'0000'0, {}}, |
| T{0b000000000010000000000'000000'0000'0, {}}, |
| T{0b000000000100000000000'000000'0000'0, {}}, |
| T{0b000000001000000000000'000000'0000'0, {}}, |
| T{0b000000010000000000000'000000'0000'0, {}}, |
| T{0b000000100000000000000'000000'0000'0, {}}, |
| T{0b000001000000000000000'000000'0000'0, {}}, |
| T{0b000010000000000000000'000000'0000'0, {}}, |
| T{0b000100000000000000000'000000'0000'0, {}}, |
| T{0b001000000000000000000'000000'0000'0, {}}, |
| T{0b010000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| // 31 11 10 5 4 1 0 31 30 20 19 15 11 7 6 0 |
| T{0b111111111111111111111'111111'1111'1, {}}, |
| T{0b111111111111111111111'111111'1111'0, {}}, |
| T{0b111111111111111111111'111111'1110'0, {}}, |
| T{0b111111111111111111111'111111'1100'0, {}}, |
| T{0b111111111111111111111'111111'1000'0, {}}, |
| T{0b111111111111111111111'111111'0000'0, {}}, |
| T{0b111111111111111111111'111110'0000'0, {}}, |
| T{0b111111111111111111111'111100'0000'0, {}}, |
| T{0b111111111111111111111'111000'0000'0, {}}, |
| T{0b111111111111111111111'110000'0000'0, {}}, |
| T{0b111111111111111111111'100000'0000'0, {}}, |
| T{0b111111111111111111111'000000'0000'0, {}}, |
| T{0b111111111111111111110'000000'0000'0, {}}, |
| T{0b111111111111111111100'000000'0000'0, {}}, |
| T{0b111111111111111111000'000000'0000'0, {}}, |
| T{0b111111111111111110000'000000'0000'0, {}}, |
| T{0b111111111111111100000'000000'0000'0, {}}, |
| T{0b111111111111111000000'000000'0000'0, {}}, |
| T{0b111111111111110000000'000000'0000'0, {}}, |
| T{0b111111111111100000000'000000'0000'0, {}}, |
| T{0b111111111111000000000'000000'0000'0, {}}, |
| T{0b111111111110000000000'000000'0000'0, {}}, |
| T{0b111111111100000000000'000000'0000'0, {}}, |
| T{0b111111111000000000000'000000'0000'0, {}}, |
| T{0b111111110000000000000'000000'0000'0, {}}, |
| T{0b111111100000000000000'000000'0000'0, {}}, |
| T{0b111111000000000000000'000000'0000'0, {}}, |
| T{0b111110000000000000000'000000'0000'0, {}}, |
| T{0b111100000000000000000'000000'0000'0, {}}, |
| T{0b111000000000000000000'000000'0000'0, {}}, |
| T{0b110000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| }); |
| } |
| |
| TEST_F(Riscv64ImmediatesTest, TestSImmediate) { |
| using T = std::tuple<uint32_t, std::optional<uint32_t>>; |
| TestConversion<rv64::Assembler::SImmediate, |
| rv64::Assembler::MakeSImmediate, |
| rv64::Assembler::MakeSImmediate, |
| rv64::Assembler::MakeSImmediate, |
| rv64::Assembler::MakeSImmediate, |
| rv64::Assembler::MakeSImmediate, |
| rv64::Assembler::MakeSImmediate, |
| rv64::Assembler::MakeSImmediate, |
| rv64::Assembler::MakeSImmediate>(std::array{ |
| T{0b000000000000000000000'000000'0000'0, 0b0'000000'00000'00000'000'00000'0000000}, |
| // 31 11 10 5 4 1 0 31 30 25 24 20 19 15 11 7 6 0 |
| T{0b000000000000000000000'000000'0000'1, 0b0'000000'00000'00000'000'00001'0000000}, |
| T{0b000000000000000000000'000000'0001'0, 0b0'000000'00000'00000'000'00010'0000000}, |
| T{0b000000000000000000000'000000'0010'0, 0b0'000000'00000'00000'000'00100'0000000}, |
| T{0b000000000000000000000'000000'0100'0, 0b0'000000'00000'00000'000'01000'0000000}, |
| T{0b000000000000000000000'000000'1000'0, 0b0'000000'00000'00000'000'10000'0000000}, |
| T{0b000000000000000000000'000001'0000'0, 0b0'000001'00000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000010'0000'0, 0b0'000010'00000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'000100'0000'0, 0b0'000100'00000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'001000'0000'0, 0b0'001000'00000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'010000'0000'0, 0b0'010000'00000'00000'000'00000'0000000}, |
| T{0b000000000000000000000'100000'0000'0, 0b0'100000'00000'00000'000'00000'0000000}, |
| T{0b000000000000000000001'000000'0000'0, {}}, |
| T{0b000000000000000000010'000000'0000'0, {}}, |
| T{0b000000000000000000100'000000'0000'0, {}}, |
| T{0b000000000000000001000'000000'0000'0, {}}, |
| T{0b000000000000000010000'000000'0000'0, {}}, |
| T{0b000000000000000100000'000000'0000'0, {}}, |
| T{0b000000000000001000000'000000'0000'0, {}}, |
| T{0b000000000000010000000'000000'0000'0, {}}, |
| T{0b000000000000100000000'000000'0000'0, {}}, |
| T{0b000000000001000000000'000000'0000'0, {}}, |
| T{0b000000000010000000000'000000'0000'0, {}}, |
| T{0b000000000100000000000'000000'0000'0, {}}, |
| T{0b000000001000000000000'000000'0000'0, {}}, |
| T{0b000000010000000000000'000000'0000'0, {}}, |
| T{0b000000100000000000000'000000'0000'0, {}}, |
| T{0b000001000000000000000'000000'0000'0, {}}, |
| T{0b000010000000000000000'000000'0000'0, {}}, |
| T{0b000100000000000000000'000000'0000'0, {}}, |
| T{0b001000000000000000000'000000'0000'0, {}}, |
| T{0b010000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| // 31 11 10 5 4 1 0 31 30 25 24 20 19 15 11 7 6 0 |
| T{0b111111111111111111111'111111'1111'1, 0b1'111111'00000'00000'000'11111'0000000}, |
| T{0b111111111111111111111'111111'1111'0, 0b1'111111'00000'00000'000'11110'0000000}, |
| T{0b111111111111111111111'111111'1110'0, 0b1'111111'00000'00000'000'11100'0000000}, |
| T{0b111111111111111111111'111111'1100'0, 0b1'111111'00000'00000'000'11000'0000000}, |
| T{0b111111111111111111111'111111'1000'0, 0b1'111111'00000'00000'000'10000'0000000}, |
| T{0b111111111111111111111'111111'0000'0, 0b1'111111'00000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'111110'0000'0, 0b1'111110'00000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'111100'0000'0, 0b1'111100'00000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'111000'0000'0, 0b1'111000'00000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'110000'0000'0, 0b1'110000'00000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'100000'0000'0, 0b1'100000'00000'00000'000'00000'0000000}, |
| T{0b111111111111111111111'000000'0000'0, 0b1'000000'00000'00000'000'00000'0000000}, |
| T{0b111111111111111111110'000000'0000'0, {}}, |
| T{0b111111111111111111100'000000'0000'0, {}}, |
| T{0b111111111111111111000'000000'0000'0, {}}, |
| T{0b111111111111111110000'000000'0000'0, {}}, |
| T{0b111111111111111100000'000000'0000'0, {}}, |
| T{0b111111111111111000000'000000'0000'0, {}}, |
| T{0b111111111111110000000'000000'0000'0, {}}, |
| T{0b111111111111100000000'000000'0000'0, {}}, |
| T{0b111111111111000000000'000000'0000'0, {}}, |
| T{0b111111111110000000000'000000'0000'0, {}}, |
| T{0b111111111100000000000'000000'0000'0, {}}, |
| T{0b111111111000000000000'000000'0000'0, {}}, |
| T{0b111111110000000000000'000000'0000'0, {}}, |
| T{0b111111100000000000000'000000'0000'0, {}}, |
| T{0b111111000000000000000'000000'0000'0, {}}, |
| T{0b111110000000000000000'000000'0000'0, {}}, |
| T{0b111100000000000000000'000000'0000'0, {}}, |
| T{0b111000000000000000000'000000'0000'0, {}}, |
| T{0b110000000000000000000'000000'0000'0, {}}, |
| T{0b100000000000000000000'000000'0000'0, {}}, |
| }); |
| } |
| |
| TEST_F(Riscv64ImmediatesTest, TestUImmediate) { |
| using T = std::tuple<uint32_t, std::optional<uint32_t>>; |
| TestConversion<rv64::Assembler::UImmediate, |
| rv64::Assembler::MakeUImmediate, |
| rv64::Assembler::MakeUImmediate, |
| rv64::Assembler::MakeUImmediate, |
| rv64::Assembler::MakeUImmediate, |
| rv64::Assembler::MakeUImmediate, |
| rv64::Assembler::MakeUImmediate, |
| rv64::Assembler::MakeUImmediate, |
| rv64::Assembler::MakeUImmediate>(std::array{ |
| T{0b0'00000000000'00000000'000000000000, 0b00000000000000000000'00000'0000000}, |
| // 31 30 20 19 12 11 0 31 12 11 7 6 0 |
| T{0b0'00000000000'00000000'000000000001, {}}, |
| T{0b0'00000000000'00000000'000000000010, {}}, |
| T{0b0'00000000000'00000000'000000000100, {}}, |
| T{0b0'00000000000'00000000'000000001000, {}}, |
| T{0b0'00000000000'00000000'000000010000, {}}, |
| T{0b0'00000000000'00000000'000000100000, {}}, |
| T{0b0'00000000000'00000000'000001000000, {}}, |
| T{0b0'00000000000'00000000'000010000000, {}}, |
| T{0b0'00000000000'00000000'000100000000, {}}, |
| T{0b0'00000000000'00000000'001000000000, {}}, |
| T{0b0'00000000000'00000000'010000000000, {}}, |
| T{0b0'00000000000'00000000'100000000000, {}}, |
| T{0b0'00000000000'00000001'000000000000, 0b00000000000000000001'00000'0000000}, |
| T{0b0'00000000000'00000010'000000000000, 0b00000000000000000010'00000'0000000}, |
| T{0b0'00000000000'00000100'000000000000, 0b00000000000000000100'00000'0000000}, |
| T{0b0'00000000000'00001000'000000000000, 0b00000000000000001000'00000'0000000}, |
| T{0b0'00000000000'00010000'000000000000, 0b00000000000000010000'00000'0000000}, |
| T{0b0'00000000000'00100000'000000000000, 0b00000000000000100000'00000'0000000}, |
| T{0b0'00000000000'01000000'000000000000, 0b00000000000001000000'00000'0000000}, |
| T{0b0'00000000000'10000000'000000000000, 0b00000000000010000000'00000'0000000}, |
| T{0b0'00000000001'00000000'000000000000, 0b00000000000100000000'00000'0000000}, |
| T{0b0'00000000010'00000000'000000000000, 0b00000000001000000000'00000'0000000}, |
| T{0b0'00000000100'00000000'000000000000, 0b00000000010000000000'00000'0000000}, |
| T{0b0'00000001000'00000000'000000000000, 0b00000000100000000000'00000'0000000}, |
| T{0b0'00000010000'00000000'000000000000, 0b00000001000000000000'00000'0000000}, |
| T{0b0'00000100000'00000000'000000000000, 0b00000010000000000000'00000'0000000}, |
| T{0b0'00001000000'00000000'000000000000, 0b00000100000000000000'00000'0000000}, |
| T{0b0'00010000000'00000000'000000000000, 0b00001000000000000000'00000'0000000}, |
| T{0b0'00100000000'00000000'000000000000, 0b00010000000000000000'00000'0000000}, |
| T{0b0'01000000000'00000000'000000000000, 0b00100000000000000000'00000'0000000}, |
| T{0b0'10000000000'00000000'000000000000, 0b01000000000000000000'00000'0000000}, |
| // 31 30 20 19 12 11 0 31 12 11 7 6 0 |
| T{0b1'11111111111'11111111'111111111111, {}}, |
| T{0b1'11111111111'11111111'111111111110, {}}, |
| T{0b1'11111111111'11111111'111111111100, {}}, |
| T{0b1'11111111111'11111111'111111111000, {}}, |
| T{0b1'11111111111'11111111'111111110000, {}}, |
| T{0b1'11111111111'11111111'111111100000, {}}, |
| T{0b1'11111111111'11111111'111111000000, {}}, |
| T{0b1'11111111111'11111111'111110000000, {}}, |
| T{0b1'11111111111'11111111'111100000000, {}}, |
| T{0b1'11111111111'11111111'111000000000, {}}, |
| T{0b1'11111111111'11111111'110000000000, {}}, |
| T{0b1'11111111111'11111111'100000000000, {}}, |
| T{0b1'11111111111'11111111'000000000000, 0b11111111111111111111'00000'0000000}, |
| T{0b1'11111111111'11111110'000000000000, 0b11111111111111111110'00000'0000000}, |
| T{0b1'11111111111'11111100'000000000000, 0b11111111111111111100'00000'0000000}, |
| T{0b1'11111111111'11111000'000000000000, 0b11111111111111111000'00000'0000000}, |
| T{0b1'11111111111'11110000'000000000000, 0b11111111111111110000'00000'0000000}, |
| T{0b1'11111111111'11100000'000000000000, 0b11111111111111100000'00000'0000000}, |
| T{0b1'11111111111'11000000'000000000000, 0b11111111111111000000'00000'0000000}, |
| T{0b1'11111111111'10000000'000000000000, 0b11111111111110000000'00000'0000000}, |
| T{0b1'11111111111'00000000'000000000000, 0b11111111111100000000'00000'0000000}, |
| T{0b1'11111111110'00000000'000000000000, 0b11111111111000000000'00000'0000000}, |
| T{0b1'11111111100'00000000'000000000000, 0b11111111110000000000'00000'0000000}, |
| T{0b1'11111111000'00000000'000000000000, 0b11111111100000000000'00000'0000000}, |
| T{0b1'11111110000'00000000'000000000000, 0b11111111000000000000'00000'0000000}, |
| T{0b1'11111100000'00000000'000000000000, 0b11111110000000000000'00000'0000000}, |
| T{0b1'11111000000'00000000'000000000000, 0b11111100000000000000'00000'0000000}, |
| T{0b1'11110000000'00000000'000000000000, 0b11111000000000000000'00000'0000000}, |
| T{0b1'11100000000'00000000'000000000000, 0b11110000000000000000'00000'0000000}, |
| T{0b1'11000000000'00000000'000000000000, 0b11100000000000000000'00000'0000000}, |
| T{0b1'10000000000'00000000'000000000000, 0b11000000000000000000'00000'0000000}, |
| T{0b1'00000000000'00000000'000000000000, 0b10000000000000000000'00000'0000000}, |
| }); |
| } |
| |
| } // namespace |
| |
| } // namespace berberis |