diff options
author | bd <bdunahu@operationnull.com> | 2025-03-30 19:55:57 -0400 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2025-03-30 19:55:57 -0400 |
commit | ea5ce07be45c1a2d953e44ac122fbc96d18fc658 (patch) | |
tree | cf9833dbdcb5c50d72076cb6f8e4a9bdb3994c83 | |
parent | ebeb29d1b87c533c1e80e86ceed9ddc40e4d2cb2 (diff) |
All I-type instructions
-rw-r--r-- | src/sim/ex.cc | 84 | ||||
-rw-r--r-- | tests/ex.cc | 198 |
2 files changed, 264 insertions, 18 deletions
diff --git a/src/sim/ex.cc b/src/sim/ex.cc index d177bc9..b4e86ac 100644 --- a/src/sim/ex.cc +++ b/src/sim/ex.cc @@ -147,27 +147,84 @@ EX::EX(Stage *stage) : Stage(stage) }), /* I type instructions */ - INIT_INSTRUCTION(LOAD, {}), + INIT_INSTRUCTION( + LOAD, + { + s1 = s1 + s2; + (void)this; + }), - INIT_INSTRUCTION(LOADV, {}), + INIT_INSTRUCTION( + LOADV, + { + (void)s2; + (void)s1; + (void)this; + }), - INIT_INSTRUCTION(ADDI, {}), + INIT_INSTRUCTION( + ADDI, + { + s1 = s1 + s2; + (void)this; + }), - INIT_INSTRUCTION(SUBI, {}), + INIT_INSTRUCTION( + SUBI, + { + s1 = s1 - s2; + (void)this; + }), - INIT_INSTRUCTION(SFTRI, {}), + INIT_INSTRUCTION( + SFTRI, + { + s1 = s1 >> s2; + (void)this; + }), - INIT_INSTRUCTION(SFTL, {}), + INIT_INSTRUCTION( + SFTLI, + { + s1 = s1 << s2; + (void)this; + }), - INIT_INSTRUCTION(ANDI, {}), + INIT_INSTRUCTION( + ANDI, + { + s1 = s1 & s2; + (void)this; + }), - INIT_INSTRUCTION(ORI, {}), + INIT_INSTRUCTION( + ORI, + { + s1 = s1 | s2; + (void)this; + }), - INIT_INSTRUCTION(XORI, {}), + INIT_INSTRUCTION( + XORI, + { + s1 = s1 ^ s2; + (void)this; + }), - INIT_INSTRUCTION(STORE, {}), + INIT_INSTRUCTION( + STORE, + { + s1 = s1 + s2; + (void)this; + }), - INIT_INSTRUCTION(STOREV, {}), + INIT_INSTRUCTION( + STOREV, + { + (void)s2; + (void)s1; + (void)this; + }), /* J type instructions */ INIT_INSTRUCTION(JMP, {}), @@ -199,10 +256,11 @@ EX::EX(Stage *stage) : Stage(stage) }; } -void EX::advance_helper() { +void EX::advance_helper() +{ signed int s1, s2; Mnemonic m; - + // it may be good to ensure we are not doing // work that has already been done if (this->curr_instr) { diff --git a/tests/ex.cc b/tests/ex.cc index d5920d2..29c5fbc 100644 --- a/tests/ex.cc +++ b/tests/ex.cc @@ -45,11 +45,6 @@ class EXFixture Controller *ct; }; -std::unordered_map<Mnemonic, signed int> results = { - {ADD, 42}, - {SUB, 83958}, -}; - TEST_CASE_METHOD(EXFixture, "ADD within bounds", "[ex]") { signed int s1 = 0, s2 = 0; @@ -423,3 +418,196 @@ TEST_CASE_METHOD(EXFixture, "CMP greater", "[ex]") // TEST_CASE_METHOD(EXFixture, "CEQ greater", "[ex]") // { // } + +TEST_CASE_METHOD(EXFixture, "LOAD", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = LOAD; + s1 = 42000, s2 = -41958; + i = execute_instr(s1, s2, m); + + CHECK(i->get_s1() == 42); + CHECK(!ct->get_condition(OF)); + CHECK(!ct->get_condition(UF)); + + delete i; +} + +// TEST_CASE_METHOD(EXFixture, "LOADV", "[ex]") +// { +// } + +TEST_CASE_METHOD(EXFixture, "ADDI within bounds", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = ADDI; + s1 = 42000, s2 = -41958; + i = execute_instr(s1, s2, m); + + CHECK(i->get_s1() == 42); + CHECK(!ct->get_condition(OF)); + CHECK(!ct->get_condition(UF)); + + delete i; +} + +// TEST_CASE_METHOD(EXFixture, "ADDI overflow", "[ex]") +// { +// } + +// TEST_CASE_METHOD(EXFixture, "ADDI underflow", "[ex]") +// { +// } + +TEST_CASE_METHOD(EXFixture, "SUBI within bounds", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = SUBI; + s1 = 200, s2 = 131; + i = execute_instr(s1, s2, m); + + CHECK(i->get_s1() == 69); + CHECK(!ct->get_condition(OF)); + CHECK(!ct->get_condition(UF)); + + delete i; +} + +// TEST_CASE_METHOD(EXFixture, "SUBI overflow", "[ex]") +// { +// } + +// TEST_CASE_METHOD(EXFixture, "SUBI underflow", "[ex]") +// { +// } + +TEST_CASE_METHOD(EXFixture, "SFTRI within bounds", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = SFTRI; + s1 = 1300, s2 = 6; + i = execute_instr(s1, s2, m); + + CHECK(i->get_s1() == 20); + CHECK(!ct->get_condition(OF)); + CHECK(!ct->get_condition(UF)); + + delete i; +} + +// TEST_CASE_METHOD(EXFixture, "SFTRI overflow", "[ex]") +// { +// } + +// TEST_CASE_METHOD(EXFixture, "SFTRI underflow", "[ex]") +// { +// } + +TEST_CASE_METHOD(EXFixture, "SFTLI within bounds", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = SFTLI; + s1 = 13, s2 = 6; + i = execute_instr(s1, s2, m); + + CHECK(i->get_s1() == 832); + CHECK(!ct->get_condition(OF)); + CHECK(!ct->get_condition(UF)); + + delete i; +} + +// TEST_CASE_METHOD(EXFixture, "SFTLI overflow", "[ex]") +// { +// } + +// TEST_CASE_METHOD(EXFixture, "SFTLI underflow", "[ex]") +// { +// } + +TEST_CASE_METHOD(EXFixture, "ANDI", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = ANDI; + s1 = 1234, s2 = 5678; + i = execute_instr(s1, s2, m); + + CHECK(i->get_s1() == 1026); + CHECK(!ct->get_condition(OF)); + CHECK(!ct->get_condition(UF)); + + delete i; +} + +TEST_CASE_METHOD(EXFixture, "ORI", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = ORI; + s1 = 1234, s2 = 5678; + i = execute_instr(s1, s2, m); + + CHECK(i->get_s1() == 5886); + CHECK(!ct->get_condition(OF)); + CHECK(!ct->get_condition(UF)); + + delete i; +} + +TEST_CASE_METHOD(EXFixture, "XORI", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = XORI; + s1 = 1234, s2 = 5678; + i = execute_instr(s1, s2, m); + + CHECK(i->get_s1() == 4860); + CHECK(!ct->get_condition(OF)); + CHECK(!ct->get_condition(UF)); + + delete i; +} + +TEST_CASE_METHOD(EXFixture, "STORE", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = LOAD; + s1 = 42000, s2 = -41958; + i = execute_instr(s1, s2, m); + + CHECK(i->get_s1() == 42); + CHECK(!ct->get_condition(OF)); + CHECK(!ct->get_condition(UF)); + + delete i; +} + +// TEST_CASE_METHOD(EXFixture, "STOREV", "[ex]") +// { +// } |