mirror of
https://github.com/libretro/Play-.git
synced 2025-02-15 00:57:18 +00:00
Added new VU flags test and fixed stuff in test framework.
This commit is contained in:
parent
d14eeea15c
commit
7ba95c46f2
@ -172,6 +172,7 @@
|
||||
<ClCompile Include="..\Source\VUShared_Reflection.cpp" />
|
||||
<ClCompile Include="..\tools\VuTest\FlagsTest.cpp" />
|
||||
<ClCompile Include="..\tools\VuTest\Main.cpp" />
|
||||
<ClCompile Include="..\tools\VuTest\FlagsTest2.cpp" />
|
||||
<ClCompile Include="..\tools\VuTest\StdAfx.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
@ -202,6 +203,7 @@
|
||||
<ClInclude Include="..\Source\VuExecutor.h" />
|
||||
<ClInclude Include="..\Source\VUShared.h" />
|
||||
<ClInclude Include="..\tools\VuTest\FlagsTest.h" />
|
||||
<ClInclude Include="..\tools\VuTest\FlagsTest2.h" />
|
||||
<ClInclude Include="..\tools\VuTest\StdAfx.h" />
|
||||
<ClInclude Include="..\tools\VuTest\Test.h" />
|
||||
<ClInclude Include="..\tools\VuTest\TestVm.h" />
|
||||
|
@ -100,6 +100,9 @@
|
||||
<ClCompile Include="..\tools\VuTest\VuAssembler.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\tools\VuTest\FlagsTest2.cpp">
|
||||
<Filter>Source Files\Tests</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\Source\MIPS.h">
|
||||
@ -174,6 +177,9 @@
|
||||
<ClInclude Include="..\tools\VuTest\VuAssembler.h">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\tools\VuTest\FlagsTest2.h">
|
||||
<Filter>Source Files\Tests</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
|
@ -41,7 +41,7 @@ void CFlagsTest::Execute(CTestVm& virtualMachine)
|
||||
CVuAssembler::Lower::NOP()
|
||||
);
|
||||
|
||||
//pipe = 5 //check result from SUBbc operation
|
||||
//pipe = 5 //check result from SUBbc operation (valid from pipe >= 1)
|
||||
assembler.Write(
|
||||
CVuAssembler::Upper::NOP(),
|
||||
CVuAssembler::Lower::FSAND(CVuAssembler::VI13, 0xF)
|
||||
|
93
tools/VuTest/FlagsTest2.cpp
Normal file
93
tools/VuTest/FlagsTest2.cpp
Normal file
@ -0,0 +1,93 @@
|
||||
#include "FlagsTest2.h"
|
||||
#include "VuAssembler.h"
|
||||
|
||||
void CFlagsTest2::Execute(CTestVm& virtualMachine)
|
||||
{
|
||||
virtualMachine.Reset();
|
||||
|
||||
auto microMem = reinterpret_cast<uint32*>(virtualMachine.m_microMem);
|
||||
|
||||
//From Dragonball Z: Infinite World - MAC pipeline has to be large enough to store 5 values
|
||||
|
||||
CVuAssembler assembler(microMem);
|
||||
|
||||
//pipe = 0 //macTime = 0 + 4 = 4
|
||||
assembler.Write(
|
||||
CVuAssembler::Upper::OPMULA(CVuAssembler::VF19, CVuAssembler::VF29),
|
||||
CVuAssembler::Lower::NOP()
|
||||
);
|
||||
|
||||
//pipe = 1 //macTime = 1 + 4 = 5
|
||||
assembler.Write(
|
||||
CVuAssembler::Upper::OPMSUB(CVuAssembler::VF19, CVuAssembler::VF29, CVuAssembler::VF19),
|
||||
CVuAssembler::Lower::NOP()
|
||||
);
|
||||
|
||||
//pipe = 2 //macTime = 2 + 4 = 6
|
||||
assembler.Write(
|
||||
CVuAssembler::Upper::MULAbc(CVuAssembler::DEST_XYZW, CVuAssembler::VF4, CVuAssembler::VF20, CVuAssembler::BC_W),
|
||||
CVuAssembler::Lower::NOP()
|
||||
);
|
||||
|
||||
//pipe = 3 //macTime = 3 + 4 = 7
|
||||
assembler.Write(
|
||||
CVuAssembler::Upper::MADDAbc(CVuAssembler::DEST_XYZW, CVuAssembler::VF1, CVuAssembler::VF20, CVuAssembler::BC_X),
|
||||
CVuAssembler::Lower::NOP()
|
||||
);
|
||||
|
||||
//pipe = 4 //macTime = 4 + 4 = 8
|
||||
assembler.Write(
|
||||
CVuAssembler::Upper::MADDAbc(CVuAssembler::DEST_XYZW, CVuAssembler::VF2, CVuAssembler::VF20, CVuAssembler::BC_Y),
|
||||
CVuAssembler::Lower::NOP()
|
||||
);
|
||||
|
||||
//pipe = 5 //macTime = 5 + 4 = 9, read result from pipe time 1
|
||||
assembler.Write(
|
||||
CVuAssembler::Upper::MADDbc(CVuAssembler::DEST_XYZW, CVuAssembler::VF25, CVuAssembler::VF3, CVuAssembler::VF20, CVuAssembler::BC_Z),
|
||||
CVuAssembler::Lower::FMAND(CVuAssembler::VI11, CVuAssembler::VI12)
|
||||
);
|
||||
|
||||
//pipe = 6
|
||||
assembler.Write(
|
||||
CVuAssembler::Upper::NOP() | CVuAssembler::Upper::E_BIT,
|
||||
CVuAssembler::Lower::NOP()
|
||||
);
|
||||
|
||||
//pipe = 7
|
||||
assembler.Write(
|
||||
CVuAssembler::Upper::NOP(),
|
||||
CVuAssembler::Lower::NOP()
|
||||
);
|
||||
|
||||
virtualMachine.m_cpu.m_State.nCOP2[1].nV0 = 0x3F800000; //VF1x = 1
|
||||
virtualMachine.m_cpu.m_State.nCOP2[2].nV1 = 0x3F800000; //VF2y = 1
|
||||
virtualMachine.m_cpu.m_State.nCOP2[3].nV2 = 0x3F800000; //VF3z = 1
|
||||
virtualMachine.m_cpu.m_State.nCOP2[4].nV3 = 0x3F800000; //VF4w = 1
|
||||
|
||||
virtualMachine.m_cpu.m_State.nCOP2[20].nV0 = 0x40000000; //VF20 = (2, 2, 2, 2)
|
||||
virtualMachine.m_cpu.m_State.nCOP2[20].nV1 = 0x40000000;
|
||||
virtualMachine.m_cpu.m_State.nCOP2[20].nV2 = 0x40000000;
|
||||
virtualMachine.m_cpu.m_State.nCOP2[20].nV3 = 0x40000000;
|
||||
|
||||
virtualMachine.m_cpu.m_State.nCOP2VI[12] = 0xFF;
|
||||
|
||||
virtualMachine.ExecuteTest(0);
|
||||
|
||||
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[19].nV0 == 0x00000000); //VF19 = cross(VF19, VF29)
|
||||
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[19].nV1 == 0x00000000);
|
||||
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[19].nV2 == 0x00000000);
|
||||
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[19].nV3 == 0x00000000);
|
||||
|
||||
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[25].nV0 == 0x40000000); //VF25 = mat4(VF1-4) * VF20
|
||||
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[25].nV1 == 0x40000000);
|
||||
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[25].nV2 == 0x40000000);
|
||||
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[25].nV3 == 0x40000000);
|
||||
|
||||
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2A.nV0 == 0x40000000);
|
||||
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2A.nV1 == 0x40000000);
|
||||
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2A.nV2 == 0x00000000);
|
||||
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2A.nV3 == 0x40000000);
|
||||
|
||||
//Check if Z flag is set for every component (cross product result)
|
||||
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2VI[11] == 0xF);
|
||||
}
|
9
tools/VuTest/FlagsTest2.h
Normal file
9
tools/VuTest/FlagsTest2.h
Normal file
@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include "Test.h"
|
||||
|
||||
class CFlagsTest2 : public CTest
|
||||
{
|
||||
public:
|
||||
void Execute(CTestVm&) override;
|
||||
};
|
@ -1,12 +1,14 @@
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include "FlagsTest.h"
|
||||
#include "FlagsTest2.h"
|
||||
|
||||
typedef std::function<CTest* ()> TestFactoryFunction;
|
||||
|
||||
static const TestFactoryFunction s_factories[] =
|
||||
{
|
||||
[] () { return new CFlagsTest(); },
|
||||
[] () { return new CFlagsTest2(); },
|
||||
};
|
||||
|
||||
int main(int argc, const char** argv)
|
||||
@ -15,6 +17,7 @@ int main(int argc, const char** argv)
|
||||
|
||||
for(const auto& factory : s_factories)
|
||||
{
|
||||
virtualMachine.Reset();
|
||||
auto test = factory();
|
||||
test->Execute(virtualMachine);
|
||||
delete test;
|
||||
|
@ -27,6 +27,7 @@ CTestVm::~CTestVm()
|
||||
void CTestVm::Reset()
|
||||
{
|
||||
m_cpu.Reset();
|
||||
m_executor.Reset();
|
||||
memset(m_vuMem, 0, PS2::VUMEM1SIZE);
|
||||
memset(m_microMem, 0, PS2::MICROMEM1SIZE);
|
||||
}
|
||||
|
@ -42,6 +42,16 @@ uint32 CVuAssembler::Upper::MADDbc(DEST dest, VF_REGISTER fd, VF_REGISTER fs, VF
|
||||
return result;
|
||||
}
|
||||
|
||||
uint32 CVuAssembler::Upper::MADDAbc(DEST dest, VF_REGISTER fs, VF_REGISTER ft, BROADCAST bc)
|
||||
{
|
||||
uint32 result = 0x000000BC;
|
||||
result |= bc;
|
||||
result |= (fs << 11);
|
||||
result |= (ft << 16);
|
||||
result |= (dest << 21);
|
||||
return result;
|
||||
}
|
||||
|
||||
uint32 CVuAssembler::Upper::MULAbc(DEST dest, VF_REGISTER fs, VF_REGISTER ft, BROADCAST bc)
|
||||
{
|
||||
uint32 result = 0x000001BC;
|
||||
@ -57,6 +67,23 @@ uint32 CVuAssembler::Upper::NOP()
|
||||
return 0x000002FF;
|
||||
}
|
||||
|
||||
uint32 CVuAssembler::Upper::OPMULA(VF_REGISTER fs, VF_REGISTER ft)
|
||||
{
|
||||
uint32 result = 0x01C002FE;
|
||||
result |= (fs << 11);
|
||||
result |= (ft << 16);
|
||||
return result;
|
||||
}
|
||||
|
||||
uint32 CVuAssembler::Upper::OPMSUB(VF_REGISTER fd, VF_REGISTER fs, VF_REGISTER ft)
|
||||
{
|
||||
uint32 result = 0x01C0002E;
|
||||
result |= (fd << 6);
|
||||
result |= (fs << 11);
|
||||
result |= (ft << 16);
|
||||
return result;
|
||||
}
|
||||
|
||||
uint32 CVuAssembler::Upper::SUBbc(DEST dest, VF_REGISTER fd, VF_REGISTER fs, VF_REGISTER ft, BROADCAST bc)
|
||||
{
|
||||
uint32 result = 0x00000004;
|
||||
@ -72,6 +99,14 @@ uint32 CVuAssembler::Upper::SUBbc(DEST dest, VF_REGISTER fd, VF_REGISTER fs, VF_
|
||||
//LOWER OPs
|
||||
//---------------------------------------------------------------------------------
|
||||
|
||||
uint32 CVuAssembler::Lower::FMAND(VI_REGISTER it, VI_REGISTER is)
|
||||
{
|
||||
uint32 result = 0x34000000;
|
||||
result |= (it << 16);
|
||||
result |= (is << 11);
|
||||
return result;
|
||||
}
|
||||
|
||||
uint32 CVuAssembler::Lower::FSAND(VI_REGISTER it, uint16 imm)
|
||||
{
|
||||
imm &= 0xFFF;
|
||||
|
@ -62,14 +62,18 @@ public:
|
||||
|
||||
static uint32 ITOF0(DEST, VF_REGISTER, VF_REGISTER);
|
||||
static uint32 MADDbc(DEST, VF_REGISTER, VF_REGISTER, VF_REGISTER, BROADCAST);
|
||||
static uint32 MADDAbc(DEST, VF_REGISTER, VF_REGISTER, BROADCAST);
|
||||
static uint32 MULAbc(DEST, VF_REGISTER, VF_REGISTER, BROADCAST);
|
||||
static uint32 NOP();
|
||||
static uint32 OPMULA(VF_REGISTER, VF_REGISTER);
|
||||
static uint32 OPMSUB(VF_REGISTER, VF_REGISTER, VF_REGISTER);
|
||||
static uint32 SUBbc(DEST, VF_REGISTER, VF_REGISTER, VF_REGISTER, BROADCAST);
|
||||
};
|
||||
|
||||
class Lower
|
||||
{
|
||||
public:
|
||||
static uint32 FMAND(VI_REGISTER, VI_REGISTER);
|
||||
static uint32 FSAND(VI_REGISTER, uint16);
|
||||
static uint32 NOP();
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user