summaryrefslogtreecommitdiff
path: root/Source/UnitTests/DSPJitTester.cpp
diff options
context:
space:
mode:
authorj4ck.fr0st <j4ck.fr0st@gmail.com>2010-04-13 19:31:31 +0000
committerj4ck.fr0st <j4ck.fr0st@gmail.com>2010-04-13 19:31:31 +0000
commit578828a14203dbf255118669daab5410ab44ea71 (patch)
treeb246f89ed598e6f3d4c7d8e497d01e9c3a567438 /Source/UnitTests/DSPJitTester.cpp
parent122d5e7b4ebd77ab1c802cb91b7587daeb82e241 (diff)
moar testing! changed some things to make it easier to use, added some bits of documentation for other devs eager to use it :)
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5358 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/UnitTests/DSPJitTester.cpp')
-rw-r--r--Source/UnitTests/DSPJitTester.cpp90
1 files changed, 81 insertions, 9 deletions
diff --git a/Source/UnitTests/DSPJitTester.cpp b/Source/UnitTests/DSPJitTester.cpp
index 2c1467f485..2e7d91fffd 100644
--- a/Source/UnitTests/DSPJitTester.cpp
+++ b/Source/UnitTests/DSPJitTester.cpp
@@ -1,9 +1,9 @@
#include "DSPJitTester.h"
-DSPJitTester::DSPJitTester(u16 opcode, u16 opcode_ext, bool verbose)
- : be_verbose(verbose), run_count(0), fail_count(0)
+DSPJitTester::DSPJitTester(u16 opcode, u16 opcode_ext, bool verbose, bool only_failed)
+ : be_verbose(verbose), failed_only(only_failed), run_count(0), fail_count(0)
{
- instruction = opcode << 9 | opcode_ext;
+ instruction = opcode | opcode_ext;
opcode_template = GetOpTemplate(instruction);
sprintf(instruction_name, "%s", opcode_template->name);
if (opcode_template->extended)
@@ -12,9 +12,13 @@ DSPJitTester::DSPJitTester(u16 opcode, u16 opcode_ext, bool verbose)
}
bool DSPJitTester::Test(SDSP dsp_settings)
{
- if (be_verbose)
+ if (be_verbose && !failed_only)
+ {
printf("Running %s: ", instruction_name);
+ DumpRegs(dsp_settings);
+ }
+ last_input_dsp = dsp_settings;
last_int_dsp = RunInterpreter(dsp_settings);
last_jit_dsp = RunJit(dsp_settings);
@@ -55,18 +59,26 @@ void DSPJitTester::ResetJit()
bool DSPJitTester::AreEqual(SDSP& int_dsp, SDSP& jit_dsp)
{
bool equal = true;
- for (int i = 0; i < 32; i++)
+ for (int i = 0; i < DSP_REG_NUM; i++)
{
if (int_dsp.r[i] != jit_dsp.r[i])
{
- if (equal && be_verbose)
- printf("failed\n");
+ if (equal)
+ {
+ if (failed_only)
+ {
+ printf("%s ", instruction_name);
+ DumpRegs(last_input_dsp);
+ }
+ if (be_verbose || failed_only)
+ printf("failed\n");
+ }
equal = false;
- if (be_verbose)
+ if (be_verbose || failed_only)
printf("\t%s: int = 0x%04x, jit = 0x%04x\n", regnames[i].name, int_dsp.r[i], jit_dsp.r[i]);
}
}
- if (equal && be_verbose)
+ if (equal && be_verbose && !failed_only)
printf("passed\n");
return equal;
}
@@ -86,8 +98,68 @@ void DSPJitTester::DumpJittedCode()
printf("%02x ", code[i]);
printf("\n");
}
+void DSPJitTester::DumpRegs(SDSP& dsp)
+{
+ for (int i = 0; i < DSP_REG_NUM; i++)
+ if (dsp.r[i])
+ printf("%s=0x%04x ", regnames[i].name, dsp.r[i]);
+}
void DSPJitTester::Initialize()
{
//init int
InitInstructionTable();
+}
+
+int DSPJitTester::TestOne(TestDataIterator it, SDSP& dsp)
+{
+ int failed = 0;
+ if (it != test_values.end())
+ {
+ u8 reg = it->first;
+ TestData& data = it->second;
+ it++;
+ for (TestData::size_type i = 0; i < data.size(); i++)
+ {
+ dsp.r[reg] = data.at(i);
+ failed += TestOne(it, dsp);
+ }
+ }
+ else
+ {
+ if (!Test(dsp))
+ failed++;
+ }
+ return failed;
+}
+int DSPJitTester::TestAll(bool verbose_fail)
+{
+ int failed = 0;
+
+ SDSP dsp;
+ memset(&dsp, 0, sizeof(SDSP));
+
+ bool verbose = failed_only;
+ failed_only = verbose_fail;
+ failed += TestOne(test_values.begin(), dsp);
+ failed_only = verbose;
+
+ return failed;
+}
+void DSPJitTester::AddTestData(u8 reg)
+{
+ AddTestData(reg, 0);
+ AddTestData(reg, 1);
+ AddTestData(reg, 0x1fff);
+ AddTestData(reg, 0x2000);
+ AddTestData(reg, 0x2001);
+ AddTestData(reg, 0x7fff);
+ AddTestData(reg, 0x8000);
+ AddTestData(reg, 0x8001);
+ AddTestData(reg, 0xfffe);
+ AddTestData(reg, 0xffff);
+}
+void DSPJitTester::AddTestData(u8 reg, u16 value)
+{
+ if (reg < DSP_REG_NUM)
+ test_values[reg].push_back(value);
} \ No newline at end of file