summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-03-28 18:10:14 -0400
committerbd <bdunahu@operationnull.com>2025-03-28 18:10:14 -0400
commit9cd1f287f0c86b36788cd8ede812b847c584f711 (patch)
tree749bb48cd49f1e9e4fb7ca3dfa7001c27403231e /tests
parent043c2566c112f0d913c52aa80c9fcc4da5fb11ae (diff)
add get_instr_fields func to parse instruction fields from raw bits
Diffstat (limited to 'tests')
-rw-r--r--tests/utils.cc116
1 files changed, 112 insertions, 4 deletions
diff --git a/tests/utils.cc b/tests/utils.cc
index ea1a1ed..6c72694 100644
--- a/tests/utils.cc
+++ b/tests/utils.cc
@@ -2,26 +2,134 @@
#include "definitions.h"
#include <catch2/catch_test_macros.hpp>
-TEST_CASE("Parse arbitrary fields # one", "[cache]")
+TEST_CASE("Parse arbitrary fields # one", "[utils]")
{
int tag, index, offset;
int address = 0b0001010101;
- get_bit_fields(address, &tag, &index, &offset);
+ get_cache_fields(address, &tag, &index, &offset);
CHECK(tag == 0b000);
CHECK(index == 0b10101);
CHECK(offset == 0b01);
}
-TEST_CASE("Parse arbitrary fields # two", "[cache]")
+TEST_CASE("Parse arbitrary fields # two", "[utils]")
{
int tag, index, offset;
int address = 0b0100111011;
- get_bit_fields(address, &tag, &index, &offset);
+ get_cache_fields(address, &tag, &index, &offset);
CHECK(tag == 0b010);
CHECK(index == 0b01110);
CHECK(offset == 0b11);
}
+TEST_CASE("Parse invalid type", "[utils]")
+{
+ signed int s1 = 0, s2 = 0, s3 = 0;
+ unsigned int type = 0, opcode = 0;
+
+ s1 = 0x00FF00FF;
+ get_instr_fields(s1, s2, s3, type, opcode);
+
+ REQUIRE(type == 0b11);
+ // behavior does nothing
+ CHECK(s1 == 0x00FF00FF);
+ CHECK(s2 == 0b0);
+ CHECK(s3 == 0b0);
+ CHECK(opcode == 0b0);
+}
+
+TEST_CASE("Parse arbitrary r-type # one", "[utils]")
+{
+ signed int s1 = 0, s2 = 0, s3 = 0;
+ unsigned int type = 0, opcode = 0;
+
+ s1 = 0xCCCCCCCC;
+ get_instr_fields(s1, s2, s3, type, opcode);
+
+ REQUIRE(type == 0b00);
+ CHECK(s1 == 0b11001);
+ CHECK(s2 == 0b01100);
+ CHECK(s3 == 0b00110);
+ CHECK(opcode == 0b10011);
+}
+
+TEST_CASE("Parse arbitrary r-type # two", "[utils]")
+{
+ signed int s1 = 0, s2 = 0, s3 = 0;
+ unsigned int type = 0, opcode = 0;
+
+ s1 = 0x99AABBCC;
+ get_instr_fields(s1, s2, s3, type, opcode);
+
+ REQUIRE(type == 0b00);
+ CHECK(s1 == 0b10111);
+ CHECK(s2 == 0b01011);
+ CHECK(s3 == 0b10101);
+ CHECK(opcode == 0b10011);
+}
+
+TEST_CASE("Parse arbitrary i-type # one", "[utils]")
+{
+ signed int s1 = 0, s2 = 0, s3 = 0;
+ unsigned int type = 0, opcode = 0;
+
+ s1 = 0xDDDDDDDD;
+ get_instr_fields(s1, s2, s3, type, opcode);
+
+ REQUIRE(type == 0b01);
+ CHECK(s1 == 0b10111);
+ CHECK(s2 == 0b11011);
+ CHECK(s3 == 0xDDDD);
+ CHECK(opcode == 0b0111);
+}
+
+TEST_CASE("Parse arbitrary i-type # two", "[utils]")
+{
+ signed int s1 = 0, s2 = 0, s3 = 0;
+ unsigned int type = 0, opcode = 0;
+
+ s1 = 0xAABBCCDD;
+ get_instr_fields(s1, s2, s3, type, opcode);
+
+ REQUIRE(type == 0b01);
+ CHECK(s1 == 0b10011);
+ CHECK(s2 == 0b11001);
+ CHECK(s3 == 0xAABB);
+ CHECK(opcode == 0b0111);
+}
+
+TEST_CASE("Parse arbitrary j-type # one", "[utils]")
+{
+ signed int s1 = 0, s2 = 0, s3 = 0;
+ unsigned int type = 0, opcode = 0;
+
+ s1 = 0xEEEEEEEE;
+ get_instr_fields(s1, s2, s3, type, opcode);
+
+ REQUIRE(type == 0b10);
+ CHECK(s1 == 0b11011);
+ CHECK(s2 == 0b111011101110111011101);
+ CHECK(opcode == 0b1011);
+ // behavior does nothing
+ CHECK(s3 == 0b0);
+}
+
+TEST_CASE("Parse arbitrary j-type # two", "[utils]")
+{
+ signed int s1 = 0, s2 = 0, s3 = 0;
+ unsigned int type = 0, opcode = 0;
+
+ s1 = 0xBBCCDDEE;
+ get_instr_fields(s1, s2, s3, type, opcode);
+
+ REQUIRE(type == 0b10);
+ CHECK(s1 == 0b10111);
+ CHECK(s2 == 0b101110111100110011011);
+ CHECK(opcode == 0b1011);
+ // behavior does nothing
+ CHECK(s3 == 0b0);
+}
+
TEST_CASE("wrap address outside upper bound", "[utils]")
{
int address = MEM_WORDS + 25;