diff options
Diffstat (limited to 'externals/biscuit/tests/src/assembler_rv32i_tests.cpp')
-rw-r--r-- | externals/biscuit/tests/src/assembler_rv32i_tests.cpp | 769 |
1 files changed, 769 insertions, 0 deletions
diff --git a/externals/biscuit/tests/src/assembler_rv32i_tests.cpp b/externals/biscuit/tests/src/assembler_rv32i_tests.cpp new file mode 100644 index 00000000..a3dec818 --- /dev/null +++ b/externals/biscuit/tests/src/assembler_rv32i_tests.cpp @@ -0,0 +1,769 @@ +#include <catch/catch.hpp> + +#include <array> +#include <biscuit/assembler.hpp> + +#include "assembler_test_utils.hpp" + +using namespace biscuit; + +TEST_CASE("ADD", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.ADD(x7, x15, x31); + REQUIRE(value == 0x01F783B3); + + as.RewindBuffer(); + + as.ADD(x31, x31, x31); + REQUIRE(value == 0x01FF8FB3); + + as.RewindBuffer(); + + as.ADD(x0, x0, x0); + REQUIRE(value == 0x00000033); +} + +TEST_CASE("ADDI", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.ADDI(x15, x31, 1024); + REQUIRE(value == 0x400F8793); + + as.RewindBuffer(); + + as.ADDI(x15, x31, 2048); + REQUIRE(value == 0x800F8793); + + as.RewindBuffer(); + + as.ADDI(x15, x31, 4095); + REQUIRE(value == 0xFFFF8793); +} + +TEST_CASE("AND", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.AND(x7, x15, x31); + REQUIRE(value == 0x01F7F3B3); + + as.RewindBuffer(); + + as.AND(x31, x31, x31); + REQUIRE(value == 0x01FFFFB3); + + as.RewindBuffer(); + + as.AND(x0, x0, x0); + REQUIRE(value == 0x00007033); +} + +TEST_CASE("ANDI", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.ANDI(x15, x31, 1024); + REQUIRE(value == 0x400FF793); + + as.RewindBuffer(); + + as.ANDI(x15, x31, 2048); + REQUIRE(value == 0x800FF793); + + as.RewindBuffer(); + + as.ANDI(x15, x31, 4095); + REQUIRE(value == 0xFFFFF793); +} + +TEST_CASE("AUIPC", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.AUIPC(x31, -1); + REQUIRE(value == 0xFFFFFF97); + + as.RewindBuffer(); + + as.AUIPC(x31, 0); + REQUIRE(value == 0x00000F97); + + as.RewindBuffer(); + + as.AUIPC(x31, 0x00FF00FF); + REQUIRE(value == 0xF00FFF97); +} + +TEST_CASE("BEQ", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.BEQ(x15, x31, 2000); + REQUIRE(value == 0x7DF78863); + + as.RewindBuffer(); + + as.BEQ(x15, x31, -2); + REQUIRE(value == 0xFFF78FE3); +} + +TEST_CASE("BGE", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.BGE(x15, x31, 2000); + REQUIRE(value == 0x7DF7D863); + + as.RewindBuffer(); + + as.BGE(x15, x31, -2); + REQUIRE(value == 0xFFF7DFE3); +} + +TEST_CASE("BGEU", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.BGEU(x15, x31, 2000); + REQUIRE(value == 0x7DF7F863); + + as.RewindBuffer(); + + as.BGEU(x15, x31, -2); + REQUIRE(value == 0xFFF7FFE3); +} + +TEST_CASE("BNE", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.BNE(x15, x31, 2000); + REQUIRE(value == 0x7DF79863); + + as.RewindBuffer(); + + as.BNE(x15, x31, -2); + REQUIRE(value == 0xFFF79FE3); +} + +TEST_CASE("BLT", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.BLT(x15, x31, 2000); + REQUIRE(value == 0x7DF7C863); + + as.RewindBuffer(); + + as.BLT(x15, x31, -2); + REQUIRE(value == 0xFFF7CFE3); +} + +TEST_CASE("BLTU", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.BLTU(x15, x31, 2000); + REQUIRE(value == 0x7DF7E863); + + as.RewindBuffer(); + + as.BLTU(x15, x31, -2); + REQUIRE(value == 0xFFF7EFE3); +} + +TEST_CASE("CALL", "[rv32i]") { + std::array<uint32_t, 2> vals{}; + auto as = MakeAssembler32(vals); + + const auto compare_vals = [&vals](uint32_t val_1, uint32_t val_2) { + REQUIRE(vals[0] == val_1); + REQUIRE(vals[1] == val_2); + }; + + as.CALL(-1); + compare_vals(0x00000097, 0xFFF080E7); +} + +TEST_CASE("EBREAK", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.EBREAK(); + REQUIRE(value == 0x00100073); +} + +TEST_CASE("ECALL", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.ECALL(); + REQUIRE(value == 0x00000073); +} + +TEST_CASE("FENCE", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.FENCE(FenceOrder::IORW, FenceOrder::IORW); + REQUIRE(value == 0x0FF0000F); + + as.RewindBuffer(); + + as.FENCETSO(); + REQUIRE(value == 0x8330000F); + + as.RewindBuffer(); + + as.FENCEI(); + REQUIRE(value == 0x0000100F); +} + +TEST_CASE("JAL", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.JAL(x31, 0xFFFFFFFF); + REQUIRE(value == 0xFFFFFFEF); + + as.RewindBuffer(); + + as.JAL(x31, 2000); + REQUIRE(value == 0x7D000FEF); + + as.RewindBuffer(); + + as.JAL(x31, 100000); + REQUIRE(value == 0x6A018FEF); +} + +TEST_CASE("JALR", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.JALR(x15, 1024, x31); + REQUIRE(value == 0x400F87E7); + + as.RewindBuffer(); + + as.JALR(x15, 1536, x31); + REQUIRE(value == 0x600F87E7); + + as.RewindBuffer(); + + as.JALR(x15, -1, x31); + REQUIRE(value == 0xFFFF87E7); +} + +TEST_CASE("LB", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.LB(x15, 1024, x31); + REQUIRE(value == 0x400F8783); + + as.RewindBuffer(); + + as.LB(x15, 1536, x31); + REQUIRE(value == 0x600F8783); + + as.RewindBuffer(); + + as.LB(x15, -1, x31); + REQUIRE(value == 0xFFFF8783); +} + +TEST_CASE("LBU", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.LBU(x15, 1024, x31); + REQUIRE(value == 0x400FC783); + + as.RewindBuffer(); + + as.LBU(x15, 1536, x31); + REQUIRE(value == 0x600FC783); + + as.RewindBuffer(); + + as.LBU(x15, -1, x31); + REQUIRE(value == 0xFFFFC783); +} + +TEST_CASE("LH", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.LH(x15, 1024, x31); + REQUIRE(value == 0x400F9783); + + as.RewindBuffer(); + + as.LH(x15, 1536, x31); + REQUIRE(value == 0x600F9783); + + as.RewindBuffer(); + + as.LH(x15, -1, x31); + REQUIRE(value == 0xFFFF9783); +} + +TEST_CASE("LHU", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.LHU(x15, 1024, x31); + REQUIRE(value == 0x400FD783); + + as.RewindBuffer(); + + as.LHU(x15, 1536, x31); + REQUIRE(value == 0x600FD783); + + as.RewindBuffer(); + + as.LHU(x15, -1, x31); + REQUIRE(value == 0xFFFFD783); +} + +TEST_CASE("LI", "[rv32i]") { + std::array<uint32_t, 2> vals{}; + auto as = MakeAssembler32(vals); + + const auto compare_vals = [&vals](uint32_t val_1, uint32_t val_2) { + REQUIRE(vals[0] == val_1); + REQUIRE(vals[1] == val_2); + }; + + ///////// Single ADDI cases + + as.LI(x1, 0); + // addi x1, x0, 0 + compare_vals(0x00000093, 0x00000000); + as.RewindBuffer(); + vals = {}; + + as.LI(x1, -1); + // addi x1, x0, -1 + compare_vals(0xFFF00093, 0x00000000); + as.RewindBuffer(); + vals = {}; + + as.LI(x1, 42); + // addi x1, x0, 42 + compare_vals(0x02A00093, 0x000000000); + as.RewindBuffer(); + vals = {}; + + as.LI(x1, 0x7ff); + // addi x1, x0, 2047 + compare_vals(0x7FF00093, 0x00000000); + as.RewindBuffer(); + vals = {}; + + ///////// Single LUI cases + + as.LI(x1, 0x2A000); + // lui x1, 42 + compare_vals(0x0002A0B7, 0x00000000); + as.RewindBuffer(); + vals = {}; + + as.LI(x1, ~0xFFF); + // lui x1, -1 + compare_vals(0xFFFFF0B7, 0x00000000); + as.RewindBuffer(); + vals = {}; + + as.LI(x1, INT32_MIN); + // lui x1, -524288 + compare_vals(0x800000B7, 0x00000000); + as.RewindBuffer(); + vals = {}; + + ///////// Full LUI+ADDI cases + + as.LI(x1, 0x11111111); + // lui x1, 69905 + // addi x1, x1, 273 + compare_vals(0x111110B7, 0x11108093); + as.RewindBuffer(); + vals = {}; + + as.LI(x1, INT32_MAX); + // lui x1, -524288 + // addi x1, x1, -1 + compare_vals(0x800000B7, 0xFFF08093); +} + +TEST_CASE("LUI", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.LUI(x10, 0xFFFFFFFF); + REQUIRE(value == 0xFFFFF537); + + as.RewindBuffer(); + + as.LUI(x10, 0xFFF7FFFF); + REQUIRE(value == 0x7FFFF537); + + as.RewindBuffer(); + + as.LUI(x31, 0xFFFFFFFF); + REQUIRE(value == 0xFFFFFFB7); +} + +TEST_CASE("LW", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.LW(x15, 1024, x31); + REQUIRE(value == 0x400FA783); + + as.RewindBuffer(); + + as.LW(x15, 1536, x31); + REQUIRE(value == 0x600FA783); + + as.RewindBuffer(); + + as.LW(x15, -1, x31); + REQUIRE(value == 0xFFFFA783); +} + +TEST_CASE("OR", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.OR(x7, x15, x31); + REQUIRE(value == 0x01F7E3B3); + + as.RewindBuffer(); + + as.OR(x31, x31, x31); + REQUIRE(value == 0x01FFEFB3); + + as.RewindBuffer(); + + as.OR(x0, x0, x0); + REQUIRE(value == 0x00006033); +} + +TEST_CASE("ORI", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.ORI(x15, x31, 1024); + REQUIRE(value == 0x400FE793); + + as.RewindBuffer(); + + as.ORI(x15, x31, 2048); + REQUIRE(value == 0x800FE793); + + as.RewindBuffer(); + + as.ORI(x15, x31, 4095); + REQUIRE(value == 0xFFFFE793); +} + +TEST_CASE("PAUSE", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.PAUSE(); + REQUIRE(value == 0x0100000F); +} + +TEST_CASE("SB", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.SB(x31, 1024, x15); + REQUIRE(value == 0x41F78023); + + as.RewindBuffer(); + + as.SB(x31, 1536, x15); + REQUIRE(value == 0x61F78023); + + as.RewindBuffer(); + + as.SB(x31, -1, x15); + REQUIRE(value == 0xFFF78FA3); +} + +TEST_CASE("SH", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.SH(x31, 1024, x15); + REQUIRE(value == 0x41F79023); + + as.RewindBuffer(); + + as.SH(x31, 1536, x15); + REQUIRE(value == 0x61F79023); + + as.RewindBuffer(); + + as.SH(x31, -1, x15); + REQUIRE(value == 0xFFF79FA3); +} + +TEST_CASE("SLL", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.SLL(x7, x15, x31); + REQUIRE(value == 0x01F793B3); + + as.RewindBuffer(); + + as.SLL(x31, x31, x31); + REQUIRE(value == 0x01FF9FB3); + + as.RewindBuffer(); + + as.SLL(x0, x0, x0); + REQUIRE(value == 0x00001033); +} + +TEST_CASE("SLLI", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.SLLI(x31, x15, 10); + REQUIRE(value == 0x00A79F93); + + as.RewindBuffer(); + + as.SLLI(x31, x15, 20); + REQUIRE(value == 0x01479F93); + + as.RewindBuffer(); + + as.SLLI(x31, x15, 31); + REQUIRE(value == 0x01F79F93); +} + +TEST_CASE("SLT", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.SLT(x7, x15, x31); + REQUIRE(value == 0x01F7A3B3); + + as.RewindBuffer(); + + as.SLT(x31, x31, x31); + REQUIRE(value == 0x01FFAFB3); + + as.RewindBuffer(); + + as.SLT(x0, x0, x0); + REQUIRE(value == 0x00002033); +} + +TEST_CASE("SLTI", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.SLTI(x15, x31, 1024); + REQUIRE(value == 0x400FA793); + + as.RewindBuffer(); + + as.SLTI(x15, x31, -2048); + REQUIRE(value == 0x800FA793); + + as.RewindBuffer(); + + as.SLTI(x15, x31, -1); + REQUIRE(value == 0xFFFFA793); +} + +TEST_CASE("SLTIU", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.SLTIU(x15, x31, 1024); + REQUIRE(value == 0x400FB793); + + as.RewindBuffer(); + + as.SLTIU(x15, x31, -2048); + REQUIRE(value == 0x800FB793); + + as.RewindBuffer(); + + as.SLTIU(x15, x31, -1); + REQUIRE(value == 0xFFFFB793); +} + +TEST_CASE("SLTU", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.SLTU(x7, x15, x31); + REQUIRE(value == 0x01F7B3B3); + + as.RewindBuffer(); + + as.SLTU(x31, x31, x31); + REQUIRE(value == 0x01FFBFB3); + + as.RewindBuffer(); + + as.SLTU(x0, x0, x0); + REQUIRE(value == 0x00003033); +} + +TEST_CASE("SRA", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.SRA(x7, x15, x31); + REQUIRE(value == 0x41F7D3B3); + + as.RewindBuffer(); + + as.SRA(x31, x31, x31); + REQUIRE(value == 0x41FFDFB3); + + as.RewindBuffer(); + + as.SRA(x0, x0, x0); + REQUIRE(value == 0x40005033); +} + +TEST_CASE("SRAI", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.SRAI(x31, x15, 10); + REQUIRE(value == 0x40A7DF93); + + as.RewindBuffer(); + + as.SRAI(x31, x15, 20); + REQUIRE(value == 0x4147DF93); + + as.RewindBuffer(); + + as.SRAI(x31, x15, 31); + REQUIRE(value == 0x41F7DF93); +} + +TEST_CASE("SRL", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.SRL(x7, x15, x31); + REQUIRE(value == 0x01F7D3B3); + + as.RewindBuffer(); + + as.SRL(x31, x31, x31); + REQUIRE(value == 0x01FFDFB3); + + as.RewindBuffer(); + + as.SRL(x0, x0, x0); + REQUIRE(value == 0x00005033); +} + +TEST_CASE("SRLI", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.SRLI(x31, x15, 10); + REQUIRE(value == 0x00A7DF93); + + as.RewindBuffer(); + + as.SRLI(x31, x15, 20); + REQUIRE(value == 0x0147DF93); + + as.RewindBuffer(); + + as.SRLI(x31, x15, 31); + REQUIRE(value == 0x01F7DF93); +} + +TEST_CASE("SUB", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.SUB(x7, x15, x31); + REQUIRE(value == 0x41F783B3); + + as.RewindBuffer(); + + as.SUB(x31, x31, x31); + REQUIRE(value == 0x41FF8FB3); + + as.RewindBuffer(); + + as.SUB(x0, x0, x0); + REQUIRE(value == 0x40000033); +} + +TEST_CASE("SW", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.SW(x31, 1024, x15); + REQUIRE(value == 0x41F7A023); + + as.RewindBuffer(); + + as.SW(x31, 1536, x15); + REQUIRE(value == 0x61F7A023); + + as.RewindBuffer(); + + as.SW(x31, -1, x15); + REQUIRE(value == 0xFFF7AFA3); +} + +TEST_CASE("XOR", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.XOR(x7, x15, x31); + REQUIRE(value == 0x01F7C3B3); + + as.RewindBuffer(); + + as.XOR(x31, x31, x31); + REQUIRE(value == 0x01FFCFB3); + + as.RewindBuffer(); + + as.XOR(x0, x0, x0); + REQUIRE(value == 0x00004033); +} + +TEST_CASE("XORI", "[rv32i]") { + uint32_t value = 0; + auto as = MakeAssembler32(value); + + as.XORI(x15, x31, 1024); + REQUIRE(value == 0x400FC793); + + as.RewindBuffer(); + + as.XORI(x15, x31, 2048); + REQUIRE(value == 0x800FC793); + + as.RewindBuffer(); + + as.XORI(x15, x31, 4095); + REQUIRE(value == 0xFFFFC793); +} |