From 04ea2670be26291a17808bd704ce3549795953a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Tue, 5 Sep 2017 00:31:13 +0200 Subject: Add some more instructions to be decoded and arithmetic I test --- qtmips_machine/tests/testinstruction.cpp | 76 ++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 qtmips_machine/tests/testinstruction.cpp (limited to 'qtmips_machine/tests/testinstruction.cpp') 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 + +void MachineTests::instruction_arithmetic_data() { + QTest::addColumn("type"); + QTest::addColumn("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(®s); + i->execute(); + i->memory(nullptr); // We should not work with memory so segfault here is basically a test + i->write_back(®s); + + QCOMPARE(regs.read_gp(5), (std::uint32_t)res); +} + +void MachineTests::instruction_arithmetic_immediate_data() { + QTest::addColumn("type"); + QTest::addColumn("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(®s); + i->execute(); + i->memory(nullptr); // We should not work with memory so segfault here is basically a test + i->write_back(®s); + + QCOMPARE(regs.read_gp(3), (std::uint32_t)res); +} -- cgit v1.2.3