summaryrefslogtreecommitdiff
path: root/src/sim/ex.cc
diff options
context:
space:
mode:
authorSiddarth Suresh <155843085+SiddarthSuresh98@users.noreply.github.com>2025-03-30 21:30:17 -0400
committerGitHub <noreply@github.com>2025-03-30 21:30:17 -0400
commit52e1ca72925444b8e5a9bb5b240a4063a4d7b958 (patch)
treebfd8e383eedbd40f5c9067e04734f62ed6ccab23 /src/sim/ex.cc
parent12a9e93f913c0057f2ef32f5894931c8b4bd3a85 (diff)
parent6a15f66bef28de9e1b982c3adda4d9b75c818852 (diff)
Merge pull request #42 from bdunahu/bdunahu
Add tests for EX, rest of (non-vector) instructions
Diffstat (limited to 'src/sim/ex.cc')
-rw-r--r--src/sim/ex.cc200
1 files changed, 178 insertions, 22 deletions
diff --git a/src/sim/ex.cc b/src/sim/ex.cc
index 50882d2..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,62 +151,185 @@ 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;
}),
/* I type instructions */
- INIT_INSTRUCTION(LOAD, {}),
+ INIT_INSTRUCTION(
+ LOAD,
+ {
+ s1 = s1 + s3;
+ (void)s2;
+ (void)this;
+ }),
- INIT_INSTRUCTION(LOADV, {}),
+ INIT_INSTRUCTION(
+ LOADV,
+ {
+ (void)s3;
+ (void)s2;
+ (void)s1;
+ (void)this;
+ }),
- INIT_INSTRUCTION(ADDI, {}),
+ INIT_INSTRUCTION(
+ ADDI,
+ {
+ s1 = s1 + s3;
+ (void)s2;
+ (void)this;
+ }),
- INIT_INSTRUCTION(SUBI, {}),
+ INIT_INSTRUCTION(
+ SUBI,
+ {
+ s1 = s1 - s3;
+ (void)s2;
+ (void)this;
+ }),
- INIT_INSTRUCTION(SFTRI, {}),
+ INIT_INSTRUCTION(
+ SFTRI,
+ {
+ s1 = s1 >> s3;
+ (void)s2;
+ (void)this;
+ }),
- INIT_INSTRUCTION(SFTL, {}),
+ INIT_INSTRUCTION(
+ SFTLI,
+ {
+ s1 = s1 << s3;
+ (void)s2;
+ (void)this;
+ }),
- INIT_INSTRUCTION(ANDI, {}),
+ INIT_INSTRUCTION(
+ ANDI,
+ {
+ s1 = s1 & s3;
+ (void)s2;
+ (void)this;
+ }),
- INIT_INSTRUCTION(ORI, {}),
+ INIT_INSTRUCTION(
+ ORI,
+ {
+ s1 = s1 | s3;
+ (void)s2;
+ (void)this;
+ }),
- INIT_INSTRUCTION(XORI, {}),
+ INIT_INSTRUCTION(
+ XORI,
+ {
+ s1 = s1 ^ s3;
+ (void)s2;
+ (void)this;
+ }),
- INIT_INSTRUCTION(STORE, {}),
+ INIT_INSTRUCTION(
+ STORE,
+ {
+ s1 = s1 + s3;
+ (void)s2;
+ (void)this;
+ }),
- INIT_INSTRUCTION(STOREV, {}),
+ INIT_INSTRUCTION(
+ STOREV,
+ {
+ (void)s3;
+ (void)s2;
+ (void)s1;
+ (void)this;
+ }),
/* J type instructions */
- INIT_INSTRUCTION(JMP, {}),
+ INIT_INSTRUCTION(
+ JMP,
+ {
+ s1 = s1 + s2;
+ (void)s3;
+ (void)this;
+ }),
- INIT_INSTRUCTION(JRL, {}),
+ INIT_INSTRUCTION(
+ JRL,
+ {
+ s1 = this->pc + s2;
+ (void)s3;
+ (void)this;
+ }),
- INIT_INSTRUCTION(JAL, {}),
+ INIT_INSTRUCTION(
+ JAL,
+ {
+ s1 = s1 + s2;
+ (void)s3;
+ (void)this;
+ }),
- INIT_INSTRUCTION(BEQ, {}),
+ INIT_INSTRUCTION(
+ BEQ,
+ {
+ s1 = this->pc + s2;
+ (void)s3;
+ }),
- INIT_INSTRUCTION(BGT, {}),
+ INIT_INSTRUCTION(
+ BGT,
+ {
+ s1 = this->pc + s2;
+ (void)s3;
+ }),
- INIT_INSTRUCTION(BUF, {}),
+ INIT_INSTRUCTION(
+ BUF,
+ {
+ s1 = this->pc + s2;
+ (void)s3;
+ }),
- INIT_INSTRUCTION(BOF, {}),
+ INIT_INSTRUCTION(
+ BOF,
+ {
+ s1 = this->pc + s2;
+ (void)s3;
+ }),
- INIT_INSTRUCTION(PUSH, {}),
+ INIT_INSTRUCTION(
+ PUSH,
+ {
+ (void)s3;
+ (void)s2;
+ (void)s1;
+ (void)this;
+ }),
- INIT_INSTRUCTION(POP, {}),
+ INIT_INSTRUCTION(
+ POP,
+ {
+ (void)s3;
+ (void)s2;
+ (void)s1;
+ (void)this;
+ }),
/* NOP */
INIT_INSTRUCTION(
NOP,
{
+ (void)s3;
(void)s2;
(void)s1;
(void)this;
@@ -199,4 +337,22 @@ EX::EX(Stage *stage) : Stage(stage)
};
}
-void EX::advance_helper() {}
+void EX::advance_helper()
+{
+ signed int s1, s2, s3;
+ 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();
+
+ this->instr_map[m](s1, s2, s3);
+
+ this->curr_instr->set_s1(s1);
+ this->status = OK;
+ }
+}