/* * 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 #include #include #include "berberis/assembler/rv32.h" #include "berberis/assembler/rv64.h" namespace berberis { namespace { class Riscv64ImmediatesTest : public ::testing::Test { public: Riscv64ImmediatesTest() {} template (*make_immediate_i8)(int8_t), std::optional (*make_immediate_u8)(uint8_t), std::optional (*make_immediate_i16)(int16_t), std::optional (*make_immediate_u16)(uint16_t), std::optional (*make_immediate_i32)(int32_t), std::optional (*make_immediate_u32)(uint32_t), std::optional (*make_immediate_i64)(int64_t), std::optional (*make_immediate_u64)(uint64_t), size_t size> void TestConversion(std::array>, size> test_cases) { for (const auto& test_case : test_cases) { int32_t source = static_cast(std::get<0>(test_case)); std::optional expected_result = std::get<1>(test_case); auto CheckConversion = [&source, &expected_result] (*make_immediate)(IntType)>() { IntType typed_source = static_cast(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(typed_source) != source || (!std::is_signed_v && source < 0)) { return; } std::optional result = make_immediate(source); EXPECT_EQ(result.has_value(), expected_result.has_value()); if (result.has_value()) { if constexpr (std::is_same_v || std::is_same_v || std::is_same_v || (std::is_same_v && !std::is_same_v && !std::is_same_v) || (std::is_same_v || std::is_same_v)) { CHECK_EQ(typed_source, static_cast(*result)); } 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) { EXPECT_EQ(ImmediateType(rv64::Assembler::SImmediate(typed_source)), *result); } else if constexpr (std::is_same_v) { 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()(); CheckConversion.template operator()(); CheckConversion.template operator()(); CheckConversion.template operator()(); CheckConversion.template operator()(); CheckConversion.template operator()(); CheckConversion.template operator()(); CheckConversion.template operator()(); } } }; TEST_F(Riscv64ImmediatesTest, TestBImmediate) { using T = std::tuple>; TestConversion(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>; TestConversion(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>; TestConversion(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>; TestConversion(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>; TestConversion(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>; TestConversion(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(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>; TestConversion(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>; TestConversion(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>; TestConversion(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>; TestConversion(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