From ebeb29d1b87c533c1e80e86ceed9ddc40e4d2cb2 Mon Sep 17 00:00:00 2001 From: bd Date: Sun, 30 Mar 2025 19:42:34 -0400 Subject: Add tests for EX --- src/sim/ex.cc | 18 +++++++++++++++++- src/sim/id.cc | 40 +++++++++++++++++++++------------------- src/sim/stage.cc | 2 +- 3 files changed, 39 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/sim/ex.cc b/src/sim/ex.cc index 50882d2..d177bc9 100644 --- a/src/sim/ex.cc +++ b/src/sim/ex.cc @@ -199,4 +199,20 @@ 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) { + m = this->curr_instr->get_mnemonic(); + s1 = this->curr_instr->get_s1(); + s2 = this->curr_instr->get_s2(); + + this->instr_map[m](s1, s2); + + this->curr_instr->set_s1(s1); + this->status = OK; + } +} diff --git a/src/sim/id.cc b/src/sim/id.cc index 36addbb..edf74e2 100644 --- a/src/sim/id.cc +++ b/src/sim/id.cc @@ -8,25 +8,6 @@ ID::ID(Stage *stage) : Stage(stage) { this->id = DCDE; } -void ID::get_instr_fields( - signed int &s1, signed int &s2, signed int &s3, Mnemonic &m) -{ - unsigned int type; - this->split_instr(s1, type, m); - - switch (type) { - case 0b00: - this->decode_R_type(s1, s2, s3); - break; - case 0b01: - this->decode_I_type(s1, s2, s3); - break; - case 0b10: - this->decode_J_type(s1, s2); - break; - } -} - void ID::split_instr(signed int &raw, unsigned int &type, Mnemonic &m) { unsigned int opcode, opcode_size; @@ -80,6 +61,27 @@ void ID::advance_helper() } } +void ID::get_instr_fields( + signed int &s1, signed int &s2, signed int &s3, Mnemonic &m) +{ + unsigned int type; + this->split_instr(s1, type, m); + + switch (type) { + case 0b00: + this->decode_R_type(s1, s2, s3); + break; + case 0b01: + this->decode_I_type(s1, s2, s3); + break; + case 0b10: + this->decode_J_type(s1, s2); + break; + case 0b11: + this->status = OK; + } +} + void ID::decode_R_type(signed int &s1, signed int &s2, signed int &s3) { unsigned int s0b, s1b, s2b; diff --git a/src/sim/stage.cc b/src/sim/stage.cc index 929a4b9..74a2176 100644 --- a/src/sim/stage.cc +++ b/src/sim/stage.cc @@ -45,7 +45,7 @@ InstrDTO *Stage::advance(Response p) void Stage::set_condition(CC c, bool v) { if (v) - this->gprs[3] = this->gprs[3] & 1 << c; + this->gprs[3] = this->gprs[3] | 1 << c; else this->gprs[3] = this->gprs[3] & ~(1 << c); } -- cgit v1.2.3 From ea5ce07be45c1a2d953e44ac122fbc96d18fc658 Mon Sep 17 00:00:00 2001 From: bd Date: Sun, 30 Mar 2025 19:55:57 -0400 Subject: All I-type instructions --- src/sim/ex.cc | 84 +++++++++++++++++++++---- tests/ex.cc | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 264 insertions(+), 18 deletions(-) (limited to 'src') 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 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]") +// { +// } -- cgit v1.2.3 From 4e0d121beed51c75221ef883e0fd7ec7b0ec24f2 Mon Sep 17 00:00:00 2001 From: bd Date: Sun, 30 Mar 2025 20:08:59 -0400 Subject: Implementation and tests for J types --- inc/stage.h | 5 +++ src/sim/ex.cc | 45 +++++++++++++++---- src/sim/stage.cc | 12 +++-- tests/ex.cc | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 181 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/inc/stage.h b/inc/stage.h index d1b6ee1..84d2a7b 100644 --- a/inc/stage.h +++ b/inc/stage.h @@ -50,6 +50,11 @@ class Stage */ bool get_condition(CC c); + /** + * Sets the value of the PC register. + */ + void set_pc(unsigned int pc); + protected: /** * The function expected to do the majority of the work. diff --git a/src/sim/ex.cc b/src/sim/ex.cc index b4e86ac..b043eb3 100644 --- a/src/sim/ex.cc +++ b/src/sim/ex.cc @@ -227,23 +227,50 @@ EX::EX(Stage *stage) : Stage(stage) }), /* J type instructions */ - INIT_INSTRUCTION(JMP, {}), + INIT_INSTRUCTION( + JMP, + { + s1 = s1 + s2; + (void)this; + }), - INIT_INSTRUCTION(JRL, {}), + INIT_INSTRUCTION( + JRL, + { + s1 = this->pc + s2; + (void)this; + }), - INIT_INSTRUCTION(JAL, {}), + INIT_INSTRUCTION( + JAL, + { + s1 = s1 + s2; + (void)this; + }), - INIT_INSTRUCTION(BEQ, {}), + INIT_INSTRUCTION(BEQ, { s1 = this->pc + s2; }), - INIT_INSTRUCTION(BGT, {}), + INIT_INSTRUCTION(BGT, { s1 = this->pc + s2; }), - INIT_INSTRUCTION(BUF, {}), + INIT_INSTRUCTION(BUF, { s1 = this->pc + s2; }), - INIT_INSTRUCTION(BOF, {}), + INIT_INSTRUCTION(BOF, { s1 = this->pc + s2; }), - INIT_INSTRUCTION(PUSH, {}), + INIT_INSTRUCTION( + PUSH, + { + (void)s2; + (void)s1; + (void)this; + }), - INIT_INSTRUCTION(POP, {}), + INIT_INSTRUCTION( + POP, + { + (void)s2; + (void)s1; + (void)this; + }), /* NOP */ INIT_INSTRUCTION( diff --git a/src/sim/stage.cc b/src/sim/stage.cc index 74a2176..2c03741 100644 --- a/src/sim/stage.cc +++ b/src/sim/stage.cc @@ -21,6 +21,14 @@ Storage *Stage::storage; bool Stage::is_pipelined; int Stage::clock_cycle; +bool Stage::get_condition(CC c) { + return (this->gprs[3] >> c) & 1; +} + +void Stage::set_pc(unsigned int pc) { + this->pc = pc; +} + InstrDTO *Stage::advance(Response p) { InstrDTO *r = nullptr; @@ -50,10 +58,6 @@ void Stage::set_condition(CC c, bool v) this->gprs[3] = this->gprs[3] & ~(1 << c); } -bool Stage::get_condition(CC c) { - return (this->gprs[3] >> c) & 1; -} - signed int Stage::dereference_register(signed int v) { signed int r; diff --git a/tests/ex.cc b/tests/ex.cc index 29c5fbc..cfa459d 100644 --- a/tests/ex.cc +++ b/tests/ex.cc @@ -611,3 +611,135 @@ TEST_CASE_METHOD(EXFixture, "STORE", "[ex]") // TEST_CASE_METHOD(EXFixture, "STOREV", "[ex]") // { // } + +TEST_CASE_METHOD(EXFixture, "JMP", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = JMP; + 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, "JRL", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = JRL; + s1 = 100, s2 = -42027; + this->ct->set_pc(42096); + 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, "JAL", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = JAL; + 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, "BEQ", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = BEQ; + s1 = 100, s2 = -42027; + this->ct->set_pc(42096); + 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, "BGT", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = BGT; + s1 = 100, s2 = -42027; + this->ct->set_pc(42096); + 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, "BUF", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = BUF; + s1 = 100, s2 = -42027; + this->ct->set_pc(42096); + 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, "BOF", "[ex]") +{ + signed int s1 = 0, s2 = 0; + Mnemonic m; + InstrDTO *i; + + m = BOF; + s1 = 100, s2 = -42027; + this->ct->set_pc(42096); + 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, "PUSH", "[ex]") +// { +// } + +// TEST_CASE_METHOD(EXFixture, "POP", "[ex]") +// { +// } -- cgit v1.2.3 From 6a15f66bef28de9e1b982c3adda4d9b75c818852 Mon Sep 17 00:00:00 2001 From: bd Date: Sun, 30 Mar 2025 21:11:30 -0400 Subject: Ensure type-I instruction could use S3 as displacement --- inc/ex.h | 2 +- src/sim/ex.cc | 87 ++++++++++++++++++++++----- tests/ex.cc | 187 ++++++++++++++++++++++++++++++---------------------------- 3 files changed, 168 insertions(+), 108 deletions(-) (limited to 'src') diff --git a/inc/ex.h b/inc/ex.h index cc8062b..6d4254e 100644 --- a/inc/ex.h +++ b/inc/ex.h @@ -25,7 +25,7 @@ class EX : public Stage */ std::unordered_map< Mnemonic, - std::function> + std::function> instr_map; }; diff --git a/src/sim/ex.cc b/src/sim/ex.cc index b043eb3..95cce8d 100644 --- a/src/sim/ex.cc +++ b/src/sim/ex.cc @@ -8,7 +8,7 @@ // clang-format off #define INIT_INSTRUCTION(mnemonic, body) \ - {mnemonic, [this](signed int &s1, signed int s2) { \ + {mnemonic, [this](signed int &s1, signed int s2, signed int s3) { \ body; \ }} // clang-format on @@ -23,6 +23,7 @@ EX::EX(Stage *stage) : Stage(stage) ADD, { s1 = s1 + s2; + (void)s3; (void)this; }), @@ -30,6 +31,7 @@ EX::EX(Stage *stage) : Stage(stage) SUB, { s1 = s1 - s2; + (void)s3; (void)this; }), @@ -37,6 +39,7 @@ EX::EX(Stage *stage) : Stage(stage) MUL, { s1 = s1 * s2; + (void)s3; (void)this; }), @@ -44,6 +47,7 @@ EX::EX(Stage *stage) : Stage(stage) QUOT, { s1 = s1 / s2; + (void)s3; (void)this; }), @@ -51,6 +55,7 @@ EX::EX(Stage *stage) : Stage(stage) REM, { s1 = s1 % s2; + (void)s3; (void)this; }), @@ -58,6 +63,7 @@ EX::EX(Stage *stage) : Stage(stage) SFTR, { s1 = s1 >> s2; + (void)s3; (void)this; }), @@ -65,6 +71,7 @@ EX::EX(Stage *stage) : Stage(stage) SFTL, { s1 = s1 << s2; + (void)s3; (void)this; }), @@ -72,6 +79,7 @@ EX::EX(Stage *stage) : Stage(stage) AND, { s1 = s1 & s2; + (void)s3; (void)this; }), @@ -79,6 +87,7 @@ EX::EX(Stage *stage) : Stage(stage) OR, { s1 = s1 | s2; + (void)s3; (void)this; }), @@ -86,6 +95,7 @@ EX::EX(Stage *stage) : Stage(stage) NOT, { s1 = ~s1; + (void)s3; (void)s2; (void)this; }), @@ -94,12 +104,14 @@ EX::EX(Stage *stage) : Stage(stage) XOR, { s1 = s1 ^ s2; + (void)s3; (void)this; }), INIT_INSTRUCTION( ADDV, { + (void)s3; (void)s2; (void)s1; (void)this; @@ -108,6 +120,7 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( SUBV, { + (void)s3; (void)s2; (void)s1; (void)this; @@ -116,6 +129,7 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( MULV, { + (void)s3; (void)s2; (void)s1; (void)this; @@ -124,6 +138,7 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( DIVV, { + (void)s3; (void)s2; (void)s1; (void)this; @@ -136,11 +151,13 @@ EX::EX(Stage *stage) : Stage(stage) : this->set_condition(GT, false); (s1 == s2) ? this->set_condition(EQ, true) : this->set_condition(EQ, false); + (void)s3; }), INIT_INSTRUCTION( CEV, { + (void)s3; (void)s2; (void)s1; (void)this; @@ -150,13 +167,15 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( LOAD, { - s1 = s1 + s2; + s1 = s1 + s3; + (void)s2; (void)this; }), INIT_INSTRUCTION( LOADV, { + (void)s3; (void)s2; (void)s1; (void)this; @@ -165,62 +184,71 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( ADDI, { - s1 = s1 + s2; + s1 = s1 + s3; + (void)s2; (void)this; }), INIT_INSTRUCTION( SUBI, { - s1 = s1 - s2; + s1 = s1 - s3; + (void)s2; (void)this; }), INIT_INSTRUCTION( SFTRI, { - s1 = s1 >> s2; + s1 = s1 >> s3; + (void)s2; (void)this; }), INIT_INSTRUCTION( SFTLI, { - s1 = s1 << s2; + s1 = s1 << s3; + (void)s2; (void)this; }), INIT_INSTRUCTION( ANDI, { - s1 = s1 & s2; + s1 = s1 & s3; + (void)s2; (void)this; }), INIT_INSTRUCTION( ORI, { - s1 = s1 | s2; + s1 = s1 | s3; + (void)s2; (void)this; }), INIT_INSTRUCTION( XORI, { - s1 = s1 ^ s2; + s1 = s1 ^ s3; + (void)s2; (void)this; }), INIT_INSTRUCTION( STORE, { - s1 = s1 + s2; + s1 = s1 + s3; + (void)s2; (void)this; }), INIT_INSTRUCTION( STOREV, { + (void)s3; (void)s2; (void)s1; (void)this; @@ -231,6 +259,7 @@ EX::EX(Stage *stage) : Stage(stage) JMP, { s1 = s1 + s2; + (void)s3; (void)this; }), @@ -238,6 +267,7 @@ EX::EX(Stage *stage) : Stage(stage) JRL, { s1 = this->pc + s2; + (void)s3; (void)this; }), @@ -245,20 +275,42 @@ EX::EX(Stage *stage) : Stage(stage) JAL, { s1 = s1 + s2; + (void)s3; (void)this; }), - INIT_INSTRUCTION(BEQ, { s1 = this->pc + s2; }), + INIT_INSTRUCTION( + BEQ, + { + s1 = this->pc + s2; + (void)s3; + }), - INIT_INSTRUCTION(BGT, { s1 = this->pc + s2; }), + INIT_INSTRUCTION( + BGT, + { + s1 = this->pc + s2; + (void)s3; + }), - INIT_INSTRUCTION(BUF, { s1 = this->pc + s2; }), + INIT_INSTRUCTION( + BUF, + { + s1 = this->pc + s2; + (void)s3; + }), - INIT_INSTRUCTION(BOF, { s1 = this->pc + s2; }), + INIT_INSTRUCTION( + BOF, + { + s1 = this->pc + s2; + (void)s3; + }), INIT_INSTRUCTION( PUSH, { + (void)s3; (void)s2; (void)s1; (void)this; @@ -267,6 +319,7 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( POP, { + (void)s3; (void)s2; (void)s1; (void)this; @@ -276,6 +329,7 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( NOP, { + (void)s3; (void)s2; (void)s1; (void)this; @@ -285,7 +339,7 @@ EX::EX(Stage *stage) : Stage(stage) void EX::advance_helper() { - signed int s1, s2; + signed int s1, s2, s3; Mnemonic m; // it may be good to ensure we are not doing @@ -294,8 +348,9 @@ void EX::advance_helper() m = this->curr_instr->get_mnemonic(); s1 = this->curr_instr->get_s1(); s2 = this->curr_instr->get_s2(); + s3 = this->curr_instr->get_s3(); - this->instr_map[m](s1, s2); + this->instr_map[m](s1, s2, s3); this->curr_instr->set_s1(s1); this->status = OK; diff --git a/tests/ex.cc b/tests/ex.cc index cfa459d..9def9fe 100644 --- a/tests/ex.cc +++ b/tests/ex.cc @@ -23,11 +23,13 @@ class EXFixture delete this->ct; delete this->c; }; - InstrDTO *execute_instr(signed int s1, signed int s2, Mnemonic m) + InstrDTO * + execute_instr(signed int s1, signed int s2, signed int s3, Mnemonic m) { InstrDTO *i = new InstrDTO(); i->set_s1(s1); i->set_s2(s2); + i->set_s3(s3); i->set_mnemonic(m); this->dum->set_curr_instr(i); @@ -47,13 +49,13 @@ class EXFixture TEST_CASE_METHOD(EXFixture, "ADD within bounds", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = ADD; - s1 = 42000, s2 = -41958; - i = execute_instr(s1, s2, m); + s1 = 42000, s2 = -41958, s3 = 0; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 42); CHECK(!ct->get_condition(OF)); @@ -72,13 +74,13 @@ TEST_CASE_METHOD(EXFixture, "ADD within bounds", "[ex]") TEST_CASE_METHOD(EXFixture, "SUB within bounds", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = SUB; - s1 = 200, s2 = 131; - i = execute_instr(s1, s2, m); + s1 = 200, s2 = 131, s3 = 0; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 69); CHECK(!ct->get_condition(OF)); @@ -97,13 +99,13 @@ TEST_CASE_METHOD(EXFixture, "SUB within bounds", "[ex]") TEST_CASE_METHOD(EXFixture, "MUL within bounds", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = MUL; - s1 = 200, s2 = 200; - i = execute_instr(s1, s2, m); + s1 = 200, s2 = 200, s3 = 0; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 40000); CHECK(!ct->get_condition(OF)); @@ -122,13 +124,13 @@ TEST_CASE_METHOD(EXFixture, "MUL within bounds", "[ex]") TEST_CASE_METHOD(EXFixture, "QUOT within bounds", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = QUOT; - s1 = 2043, s2 = 40; - i = execute_instr(s1, s2, m); + s1 = 2043, s2 = 40, s3 = 0; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 51); CHECK(!ct->get_condition(OF)); @@ -151,13 +153,13 @@ TEST_CASE_METHOD(EXFixture, "QUOT within bounds", "[ex]") TEST_CASE_METHOD(EXFixture, "REM within bounds", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = REM; - s1 = 2043, s2 = 40; - i = execute_instr(s1, s2, m); + s1 = 2043, s2 = 40, s3 = 0; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 3); CHECK(!ct->get_condition(OF)); @@ -180,13 +182,13 @@ TEST_CASE_METHOD(EXFixture, "REM within bounds", "[ex]") TEST_CASE_METHOD(EXFixture, "SFTR within bounds", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = SFTR; - s1 = 1300, s2 = 6; - i = execute_instr(s1, s2, m); + s1 = 1300, s2 = 6, s3 = 0; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 20); CHECK(!ct->get_condition(OF)); @@ -205,13 +207,13 @@ TEST_CASE_METHOD(EXFixture, "SFTR within bounds", "[ex]") TEST_CASE_METHOD(EXFixture, "SFTL within bounds", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = SFTL; - s1 = 13, s2 = 6; - i = execute_instr(s1, s2, m); + s1 = 13, s2 = 6, s3 = 0; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 832); CHECK(!ct->get_condition(OF)); @@ -230,13 +232,13 @@ TEST_CASE_METHOD(EXFixture, "SFTL within bounds", "[ex]") TEST_CASE_METHOD(EXFixture, "AND", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = AND; - s1 = 1234, s2 = 5678; - i = execute_instr(s1, s2, m); + s1 = 1234, s2 = 5678, s3 = 0; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 1026); CHECK(!ct->get_condition(OF)); @@ -247,13 +249,13 @@ TEST_CASE_METHOD(EXFixture, "AND", "[ex]") TEST_CASE_METHOD(EXFixture, "OR", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = OR; - s1 = 1234, s2 = 5678; - i = execute_instr(s1, s2, m); + s1 = 1234, s2 = 5678, s3 = 0; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 5886); CHECK(!ct->get_condition(OF)); @@ -264,13 +266,13 @@ TEST_CASE_METHOD(EXFixture, "OR", "[ex]") TEST_CASE_METHOD(EXFixture, "NOT", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = NOT; - s1 = 1234, s2 = -1; - i = execute_instr(s1, s2, m); + s1 = 1234, s2 = -1, s3 = 0; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == -1235); CHECK(!ct->get_condition(OF)); @@ -281,13 +283,13 @@ TEST_CASE_METHOD(EXFixture, "NOT", "[ex]") TEST_CASE_METHOD(EXFixture, "XOR", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = XOR; - s1 = 1234, s2 = 5678; - i = execute_instr(s1, s2, m); + s1 = 1234, s2 = 5678, s3 = 0; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 4860); CHECK(!ct->get_condition(OF)); @@ -346,13 +348,13 @@ TEST_CASE_METHOD(EXFixture, "XOR", "[ex]") TEST_CASE_METHOD(EXFixture, "CMP less", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = CMP; - s1 = -1, s2 = 0; - i = execute_instr(s1, s2, m); + s1 = -1, s2 = 0, s3 = 0; + i = execute_instr(s1, s2, s3, m); // should not be changed CHECK(i->get_s1() == -1); @@ -367,13 +369,13 @@ TEST_CASE_METHOD(EXFixture, "CMP less", "[ex]") TEST_CASE_METHOD(EXFixture, "CMP equal", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = CMP; - s1 = 20, s2 = 20; - i = execute_instr(s1, s2, m); + s1 = 20, s2 = 20, s3 = 0; + i = execute_instr(s1, s2, s3, m); // should not be changed CHECK(i->get_s1() == 20); @@ -388,13 +390,13 @@ TEST_CASE_METHOD(EXFixture, "CMP equal", "[ex]") TEST_CASE_METHOD(EXFixture, "CMP greater", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = CMP; - s1 = 21, s2 = 20; - i = execute_instr(s1, s2, m); + s1 = 21, s2 = 20, s3 = 0; + i = execute_instr(s1, s2, s3, m); // should not be changed CHECK(i->get_s1() == 21); @@ -421,13 +423,14 @@ TEST_CASE_METHOD(EXFixture, "CMP greater", "[ex]") TEST_CASE_METHOD(EXFixture, "LOAD", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = LOAD; - s1 = 42000, s2 = -41958; - i = execute_instr(s1, s2, m); + s1 = 42000, s2 = 0; + s3 = -41958; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 42); CHECK(!ct->get_condition(OF)); @@ -442,13 +445,14 @@ TEST_CASE_METHOD(EXFixture, "LOAD", "[ex]") TEST_CASE_METHOD(EXFixture, "ADDI within bounds", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = ADDI; - s1 = 42000, s2 = -41958; - i = execute_instr(s1, s2, m); + s1 = 42000, s2 = 0; + s3 = -41958; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 42); CHECK(!ct->get_condition(OF)); @@ -467,13 +471,14 @@ TEST_CASE_METHOD(EXFixture, "ADDI within bounds", "[ex]") TEST_CASE_METHOD(EXFixture, "SUBI within bounds", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = SUBI; - s1 = 200, s2 = 131; - i = execute_instr(s1, s2, m); + s1 = 200, s2 = 0; + s3 = 131; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 69); CHECK(!ct->get_condition(OF)); @@ -492,13 +497,13 @@ TEST_CASE_METHOD(EXFixture, "SUBI within bounds", "[ex]") TEST_CASE_METHOD(EXFixture, "SFTRI within bounds", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = SFTRI; - s1 = 1300, s2 = 6; - i = execute_instr(s1, s2, m); + s1 = 1300, s2 = 0, s3 = 6; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 20); CHECK(!ct->get_condition(OF)); @@ -517,13 +522,13 @@ TEST_CASE_METHOD(EXFixture, "SFTRI within bounds", "[ex]") TEST_CASE_METHOD(EXFixture, "SFTLI within bounds", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = SFTLI; - s1 = 13, s2 = 6; - i = execute_instr(s1, s2, m); + s1 = 13, s2 = 0, s3 = 6; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 832); CHECK(!ct->get_condition(OF)); @@ -542,13 +547,13 @@ TEST_CASE_METHOD(EXFixture, "SFTLI within bounds", "[ex]") TEST_CASE_METHOD(EXFixture, "ANDI", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = ANDI; - s1 = 1234, s2 = 5678; - i = execute_instr(s1, s2, m); + s1 = 1234, s2 = 0, s3 = 5678; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 1026); CHECK(!ct->get_condition(OF)); @@ -559,13 +564,13 @@ TEST_CASE_METHOD(EXFixture, "ANDI", "[ex]") TEST_CASE_METHOD(EXFixture, "ORI", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = ORI; - s1 = 1234, s2 = 5678; - i = execute_instr(s1, s2, m); + s1 = 1234, s2 = 0, s3 = 5678; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 5886); CHECK(!ct->get_condition(OF)); @@ -576,13 +581,13 @@ TEST_CASE_METHOD(EXFixture, "ORI", "[ex]") TEST_CASE_METHOD(EXFixture, "XORI", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = XORI; - s1 = 1234, s2 = 5678; - i = execute_instr(s1, s2, m); + s1 = 1234, s2 = 0, s3 = 5678; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 4860); CHECK(!ct->get_condition(OF)); @@ -593,13 +598,13 @@ TEST_CASE_METHOD(EXFixture, "XORI", "[ex]") TEST_CASE_METHOD(EXFixture, "STORE", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = LOAD; - s1 = 42000, s2 = -41958; - i = execute_instr(s1, s2, m); + s1 = 42000, s2 = 0, s3 = -41958; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 42); CHECK(!ct->get_condition(OF)); @@ -614,13 +619,13 @@ TEST_CASE_METHOD(EXFixture, "STORE", "[ex]") TEST_CASE_METHOD(EXFixture, "JMP", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = JMP; - s1 = 42000, s2 = -41958; - i = execute_instr(s1, s2, m); + s1 = 42000, s2 = -41958, s3 = 0; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 42); CHECK(!ct->get_condition(OF)); @@ -631,14 +636,14 @@ TEST_CASE_METHOD(EXFixture, "JMP", "[ex]") TEST_CASE_METHOD(EXFixture, "JRL", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = JRL; - s1 = 100, s2 = -42027; + s1 = 100, s2 = -42027, s3; this->ct->set_pc(42096); - i = execute_instr(s1, s2, m); + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 69); CHECK(!ct->get_condition(OF)); @@ -649,13 +654,13 @@ TEST_CASE_METHOD(EXFixture, "JRL", "[ex]") TEST_CASE_METHOD(EXFixture, "JAL", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = JAL; - s1 = 42000, s2 = -41958; - i = execute_instr(s1, s2, m); + s1 = 42000, s2 = -41958, s3 = 0; + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 42); CHECK(!ct->get_condition(OF)); @@ -666,14 +671,14 @@ TEST_CASE_METHOD(EXFixture, "JAL", "[ex]") TEST_CASE_METHOD(EXFixture, "BEQ", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = BEQ; - s1 = 100, s2 = -42027; + s1 = 100, s2 = -42027, s3 = 0; this->ct->set_pc(42096); - i = execute_instr(s1, s2, m); + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 69); CHECK(!ct->get_condition(OF)); @@ -684,14 +689,14 @@ TEST_CASE_METHOD(EXFixture, "BEQ", "[ex]") TEST_CASE_METHOD(EXFixture, "BGT", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = BGT; - s1 = 100, s2 = -42027; + s1 = 100, s2 = -42027, s3 = 0; this->ct->set_pc(42096); - i = execute_instr(s1, s2, m); + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 69); CHECK(!ct->get_condition(OF)); @@ -702,14 +707,14 @@ TEST_CASE_METHOD(EXFixture, "BGT", "[ex]") TEST_CASE_METHOD(EXFixture, "BUF", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = BUF; - s1 = 100, s2 = -42027; + s1 = 100, s2 = -42027, s3 = 0; this->ct->set_pc(42096); - i = execute_instr(s1, s2, m); + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 69); CHECK(!ct->get_condition(OF)); @@ -720,14 +725,14 @@ TEST_CASE_METHOD(EXFixture, "BUF", "[ex]") TEST_CASE_METHOD(EXFixture, "BOF", "[ex]") { - signed int s1 = 0, s2 = 0; + signed int s1, s2, s3; Mnemonic m; InstrDTO *i; m = BOF; - s1 = 100, s2 = -42027; + s1 = 100, s2 = -42027, s3 = 0; this->ct->set_pc(42096); - i = execute_instr(s1, s2, m); + i = execute_instr(s1, s2, s3, m); CHECK(i->get_s1() == 69); CHECK(!ct->get_condition(OF)); -- cgit v1.2.3