summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sim/ex.cc84
-rw-r--r--tests/ex.cc198
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]")
+// {
+// }