blob: a04af75eee885315bc3713bbd6c7d967e7b32191 [file] [log] [blame]
/*
* 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