diff options
Diffstat (limited to 'src/sim/ex.cc')
-rw-r--r-- | src/sim/ex.cc | 70 |
1 files changed, 53 insertions, 17 deletions
diff --git a/src/sim/ex.cc b/src/sim/ex.cc index f22adc0..b6f8a1d 100644 --- a/src/sim/ex.cc +++ b/src/sim/ex.cc @@ -4,11 +4,12 @@ #include "instrDTO.h" #include "response.h" #include "stage.h" +#include "utils.h" #include <unordered_map> // clang-format off #define INIT_INSTRUCTION(mnemonic, body) \ - {mnemonic, [this](signed int &s1, signed int s2, signed int s3) { \ + {mnemonic, [this](signed int &s1, signed int s2, signed int s3, unsigned int pc) { \ body; \ }} // clang-format on @@ -23,6 +24,7 @@ EX::EX(Stage *stage) : Stage(stage) ADD, { s1 = s1 + s2; + (void)pc; (void)s3; (void)this; }), @@ -31,6 +33,7 @@ EX::EX(Stage *stage) : Stage(stage) SUB, { s1 = s1 - s2; + (void)pc; (void)s3; (void)this; }), @@ -39,6 +42,7 @@ EX::EX(Stage *stage) : Stage(stage) MUL, { s1 = s1 * s2; + (void)pc; (void)s3; (void)this; }), @@ -47,6 +51,7 @@ EX::EX(Stage *stage) : Stage(stage) QUOT, { s1 = s1 / s2; + (void)pc; (void)s3; (void)this; }), @@ -55,6 +60,7 @@ EX::EX(Stage *stage) : Stage(stage) REM, { s1 = s1 % s2; + (void)pc; (void)s3; (void)this; }), @@ -63,6 +69,7 @@ EX::EX(Stage *stage) : Stage(stage) SFTR, { s1 = s1 >> s2; + (void)pc; (void)s3; (void)this; }), @@ -71,6 +78,7 @@ EX::EX(Stage *stage) : Stage(stage) SFTL, { s1 = s1 << s2; + (void)pc; (void)s3; (void)this; }), @@ -79,6 +87,7 @@ EX::EX(Stage *stage) : Stage(stage) AND, { s1 = s1 & s2; + (void)pc; (void)s3; (void)this; }), @@ -87,6 +96,7 @@ EX::EX(Stage *stage) : Stage(stage) OR, { s1 = s1 | s2; + (void)pc; (void)s3; (void)this; }), @@ -95,6 +105,7 @@ EX::EX(Stage *stage) : Stage(stage) NOT, { s1 = ~s1; + (void)pc; (void)s3; (void)s2; (void)this; @@ -104,6 +115,7 @@ EX::EX(Stage *stage) : Stage(stage) XOR, { s1 = s1 ^ s2; + (void)pc; (void)s3; (void)this; }), @@ -111,6 +123,7 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( ADDV, { + (void)pc; (void)s3; (void)s2; (void)s1; @@ -120,6 +133,7 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( SUBV, { + (void)pc; (void)s3; (void)s2; (void)s1; @@ -129,6 +143,7 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( MULV, { + (void)pc; (void)s3; (void)s2; (void)s1; @@ -138,6 +153,7 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( DIVV, { + (void)pc; (void)s3; (void)s2; (void)s1; @@ -151,12 +167,14 @@ EX::EX(Stage *stage) : Stage(stage) : this->set_condition(GT, false); (s1 == s2) ? this->set_condition(EQ, true) : this->set_condition(EQ, false); + (void)pc; (void)s3; }), INIT_INSTRUCTION( CEV, { + (void)pc; (void)s3; (void)s2; (void)s1; @@ -168,6 +186,7 @@ EX::EX(Stage *stage) : Stage(stage) LOAD, { s1 = s1 + s3; + (void)pc; (void)s2; (void)this; }), @@ -175,6 +194,7 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( LOADV, { + (void)pc; (void)s3; (void)s2; (void)s1; @@ -185,6 +205,7 @@ EX::EX(Stage *stage) : Stage(stage) ADDI, { s1 = s1 + s3; + (void)pc; (void)s2; (void)this; }), @@ -193,6 +214,7 @@ EX::EX(Stage *stage) : Stage(stage) SUBI, { s1 = s1 - s3; + (void)pc; (void)s2; (void)this; }), @@ -201,6 +223,7 @@ EX::EX(Stage *stage) : Stage(stage) SFTRI, { s1 = s1 >> s3; + (void)pc; (void)s2; (void)this; }), @@ -209,6 +232,7 @@ EX::EX(Stage *stage) : Stage(stage) SFTLI, { s1 = s1 << s3; + (void)pc; (void)s2; (void)this; }), @@ -217,6 +241,7 @@ EX::EX(Stage *stage) : Stage(stage) ANDI, { s1 = s1 & s3; + (void)pc; (void)s2; (void)this; }), @@ -225,6 +250,7 @@ EX::EX(Stage *stage) : Stage(stage) ORI, { s1 = s1 | s3; + (void)pc; (void)s2; (void)this; }), @@ -233,6 +259,7 @@ EX::EX(Stage *stage) : Stage(stage) XORI, { s1 = s1 ^ s3; + (void)pc; (void)s2; (void)this; }), @@ -241,6 +268,7 @@ EX::EX(Stage *stage) : Stage(stage) STORE, { s1 = s1 + s3; + (void)pc; (void)s2; (void)this; }), @@ -248,6 +276,7 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( STOREV, { + (void)pc; (void)s3; (void)s2; (void)s1; @@ -259,6 +288,7 @@ EX::EX(Stage *stage) : Stage(stage) JMP, { s1 = s1 + s2; + (void)pc; (void)s3; (void)this; }), @@ -266,7 +296,7 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( JRL, { - s1 = this->pc + s2; + s1 = pc + s2; (void)s3; (void)this; }), @@ -275,6 +305,7 @@ EX::EX(Stage *stage) : Stage(stage) JAL, { s1 = s1 + s2; + (void)pc; (void)s3; (void)this; }), @@ -282,34 +313,39 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( BEQ, { - (this->get_condition(EQ)) ? s1 = this->pc + s2 : s1 = this->pc; + (this->get_condition(EQ)) ? s1 = wrap_address(pc + s2) + : s1 = -1; (void)s3; }), INIT_INSTRUCTION( BGT, { - (this->get_condition(GT)) ? s1 = this->pc + s2 : s1 = this->pc; + (this->get_condition(GT)) ? s1 = wrap_address(pc + s2) + : s1 = -1; (void)s3; }), INIT_INSTRUCTION( BUF, { - (this->get_condition(UF)) ? s1 = this->pc + s2 : s1 = this->pc; + (this->get_condition(UF)) ? s1 = wrap_address(pc + s2) + : s1 = -1; (void)s3; }), INIT_INSTRUCTION( BOF, { - (this->get_condition(OF)) ? s1 = this->pc + s2 : s1 = this->pc; + (this->get_condition(OF)) ? s1 = wrap_address(pc + s2) + : s1 = -1; (void)s3; }), INIT_INSTRUCTION( PUSH, { + (void)pc; (void)s3; (void)s2; (void)s1; @@ -319,6 +355,7 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( POP, { + (void)pc; (void)s3; (void)s2; (void)s1; @@ -329,6 +366,7 @@ EX::EX(Stage *stage) : Stage(stage) INIT_INSTRUCTION( NOP, { + (void)pc; (void)s3; (void)s2; (void)s1; @@ -340,19 +378,17 @@ EX::EX(Stage *stage) : Stage(stage) void EX::advance_helper() { signed int s1, s2, s3; + unsigned int pc; 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(); - s3 = this->curr_instr->get_s3(); + m = this->curr_instr->get_mnemonic(); + s1 = this->curr_instr->get_s1(); + s2 = this->curr_instr->get_s2(); + s3 = this->curr_instr->get_s3(); + pc = this->curr_instr->get_pc(); - this->instr_map[m](s1, s2, s3); + this->instr_map[m](s1, s2, s3, pc ); - this->curr_instr->set_s1(s1); - this->status = OK; - } + this->curr_instr->set_s1(s1); + this->status = OK; } |