aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/tests/testinstruction.cpp
diff options
context:
space:
mode:
authorKarel Kočí <cynerd@email.cz>2017-09-05 00:31:13 +0200
committerKarel Kočí <cynerd@email.cz>2017-09-05 00:31:13 +0200
commit04ea2670be26291a17808bd704ce3549795953a0 (patch)
tree3beb72850745b014eb3ed5eb2e88bfe565c8d2df /qtmips_machine/tests/testinstruction.cpp
parentccf2283819a631cec62ceaec233ee845f28d59d8 (diff)
downloadqtmips-04ea2670be26291a17808bd704ce3549795953a0.tar.gz
qtmips-04ea2670be26291a17808bd704ce3549795953a0.tar.bz2
qtmips-04ea2670be26291a17808bd704ce3549795953a0.zip
Add some more instructions to be decoded and arithmetic I test
Diffstat (limited to 'qtmips_machine/tests/testinstruction.cpp')
-rw-r--r--qtmips_machine/tests/testinstruction.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/qtmips_machine/tests/testinstruction.cpp b/qtmips_machine/tests/testinstruction.cpp
new file mode 100644
index 0000000..a299bcf
--- /dev/null
+++ b/qtmips_machine/tests/testinstruction.cpp
@@ -0,0 +1,76 @@
+#include "tst_machine.h"
+#include "instructions/arithmetic.h"
+#include "instructions/jumpbranch.h"
+#include "instructions/loadstore.h"
+#include "instructions/nop.h"
+#include "instructions/shift.h"
+#include <iostream>
+
+void MachineTests::instruction_arithmetic_data() {
+ QTest::addColumn<size_t>("type");
+ QTest::addColumn<std::uint32_t>("res");
+
+ QTest::newRow("ADD") << (size_t)IAT_ADD << (unsigned)749;
+ QTest::newRow("ADDU") << (size_t)IAT_ADDU << (unsigned)749;
+ QTest::newRow("SUB") << (size_t)IAT_SUB << (unsigned)-665;
+ QTest::newRow("SUBU") << (size_t)IAT_SUBU << (unsigned)-665;
+ QTest::newRow("AND") << (size_t)IAT_AND << (unsigned)2;
+ QTest::newRow("OR") << (size_t)IAT_OR << (unsigned)747;
+ QTest::newRow("XOR") << (size_t)IAT_XOR << (unsigned)745;
+ // TODO others
+}
+
+void MachineTests::instruction_arithmetic() {
+ Registers regs;
+
+ QFETCH(size_t, type);
+ QFETCH(std::uint32_t, res);
+
+ // TODO meaby one more dataset?
+
+ regs.write_gp(12, 42);
+ regs.write_gp(8, 707);
+ regs.write_gp(5, 0);
+
+ Instruction *i = new InstructionArithmetic((enum InstructionArithmeticT)type, 12, 8, 5);
+
+ i->decode(&regs);
+ i->execute();
+ i->memory(nullptr); // We should not work with memory so segfault here is basically a test
+ i->write_back(&regs);
+
+ QCOMPARE(regs.read_gp(5), (std::uint32_t)res);
+}
+
+void MachineTests::instruction_arithmetic_immediate_data() {
+ QTest::addColumn<size_t>("type");
+ QTest::addColumn<std::uint32_t>("res");
+
+ QTest::newRow("ADDI") << (size_t)IAT_ADDI << (unsigned)749;
+ QTest::newRow("ADDIU") << (size_t)IAT_ADDIU << (unsigned)749;
+ QTest::newRow("ANDI") << (size_t)IAT_ANDI << (unsigned)-665;
+ QTest::newRow("ORI") << (size_t)IAT_ORI << (unsigned)-665;
+ QTest::newRow("XORI") << (size_t)IAT_XORI << (unsigned)2;
+ // TODO others
+}
+
+void MachineTests::instruction_arithmetic_immediate() {
+ Registers regs;
+
+ QFETCH(size_t, type);
+ QFETCH(std::uint32_t, res);
+
+ // TODO meaby one more dataset?
+
+ regs.write_gp(9, 42);
+ regs.write_gp(3, 0);
+
+ Instruction *i = new InstructionArithmeticImmediate((enum InstructionArithmeticImmediateT)type, 9, 3, 707);
+
+ i->decode(&regs);
+ i->execute();
+ i->memory(nullptr); // We should not work with memory so segfault here is basically a test
+ i->write_back(&regs);
+
+ QCOMPARE(regs.read_gp(3), (std::uint32_t)res);
+}