Play-/tools/VuTest/FlagsTest3.cpp

100 lines
3.2 KiB
C++
Raw Permalink Normal View History

2020-02-07 09:36:09 -05:00
#include "FlagsTest3.h"
#include "VuAssembler.h"
void CFlagsTest3::Execute(CTestVm& virtualMachine)
{
virtualMachine.Reset();
auto microMem = reinterpret_cast<uint32*>(virtualMachine.m_microMem);
2020-02-08 12:30:08 -05:00
//Inspired by Kingdom Hearts 2 - Very simple flags test
2020-02-07 09:36:09 -05:00
CVuAssembler assembler(microMem);
2020-02-08 12:30:08 -05:00
for(uint32 i = 0; i < 6; i++)
{
assembler.Write(
CVuAssembler::Upper::ADDi(CVuAssembler::DEST_XYZW, CVuAssembler::VF0, CVuAssembler::VF0),
CVuAssembler::Lower::NOP());
}
2020-02-07 09:36:09 -05:00
assembler.Write(
CVuAssembler::Upper::NOP(),
2020-02-08 12:30:08 -05:00
CVuAssembler::Lower::FMAND(CVuAssembler::VI9, CVuAssembler::VI7));
for(uint32 i = 0; i < 6; i++)
{
assembler.Write(
CVuAssembler::Upper::ADDi(CVuAssembler::DEST_XYZW, CVuAssembler::VF0, CVuAssembler::VF0),
CVuAssembler::Lower::NOP());
}
2020-02-07 09:36:09 -05:00
assembler.Write(
2020-02-08 12:30:08 -05:00
CVuAssembler::Upper::OPMULA(CVuAssembler::VF6, CVuAssembler::VF23),
2020-02-07 09:36:09 -05:00
CVuAssembler::Lower::NOP());
assembler.Write(
2020-02-08 12:30:08 -05:00
CVuAssembler::Upper::OPMSUB(CVuAssembler::VF1, CVuAssembler::VF23, CVuAssembler::VF6),
2020-02-07 09:36:09 -05:00
CVuAssembler::Lower::NOP());
2020-02-08 12:30:08 -05:00
for(uint32 i = 0; i < 10; i++)
{
assembler.Write(
CVuAssembler::Upper::NOP(),
CVuAssembler::Lower::NOP());
}
2020-02-07 09:36:09 -05:00
assembler.Write(
CVuAssembler::Upper::NOP(),
CVuAssembler::Lower::FMAND(CVuAssembler::VI10, CVuAssembler::VI7));
2020-02-08 12:30:08 -05:00
for(uint32 i = 0; i < 10; i++)
{
assembler.Write(
CVuAssembler::Upper::ADDi(CVuAssembler::DEST_XYZW, CVuAssembler::VF0, CVuAssembler::VF0),
CVuAssembler::Lower::NOP());
}
2020-02-07 09:36:09 -05:00
assembler.Write(
CVuAssembler::Upper::NOP() | CVuAssembler::Upper::E_BIT,
CVuAssembler::Lower::NOP());
assembler.Write(
CVuAssembler::Upper::NOP(),
CVuAssembler::Lower::NOP());
2020-11-27 09:14:30 -05:00
virtualMachine.m_cpu.m_State.nCOP2[1].nV0 = 0x40000000; //VF1 = (2, 2, 2, 2)
virtualMachine.m_cpu.m_State.nCOP2[1].nV1 = 0x40000000;
virtualMachine.m_cpu.m_State.nCOP2[1].nV2 = 0x40000000;
virtualMachine.m_cpu.m_State.nCOP2[1].nV3 = 0x40000000;
2020-02-07 09:36:09 -05:00
virtualMachine.m_cpu.m_State.nCOP2[6].nV0 = 0x3F800000; //VF6 = (1, 0, 0, 1)
2020-02-08 12:30:08 -05:00
virtualMachine.m_cpu.m_State.nCOP2[6].nV1 = 0x3F800000;
2020-02-07 09:36:09 -05:00
virtualMachine.m_cpu.m_State.nCOP2[6].nV2 = 0x00000000;
virtualMachine.m_cpu.m_State.nCOP2[6].nV3 = 0x3F800000;
virtualMachine.m_cpu.m_State.nCOP2[23].nV0 = 0x00000000; //VF23 = (0, -1, 0, 1)
virtualMachine.m_cpu.m_State.nCOP2[23].nV1 = 0xBF800000;
virtualMachine.m_cpu.m_State.nCOP2[23].nV2 = 0x00000000;
virtualMachine.m_cpu.m_State.nCOP2[23].nV3 = 0x3F800000;
virtualMachine.m_cpu.m_State.nCOP2VI[7] = 0xFFFF;
virtualMachine.ExecuteTest(0);
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2A.nV0 == 0x00000000);
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2A.nV1 == 0x00000000);
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2A.nV2 == 0xBF800000);
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2A.nV3 == 0x00000000);
2020-11-27 09:14:30 -05:00
//VF1w should be unchanged from initial value
2020-02-08 12:30:08 -05:00
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[1].nV0 == 0x00000000);
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[1].nV1 == 0x00000000);
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[1].nV2 == 0xBF800000);
2020-11-27 09:14:30 -05:00
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[1].nV3 == 0x40000000);
2020-02-08 12:30:08 -05:00
2020-02-07 09:36:09 -05:00
//Check sign and zero flags
2020-02-08 12:30:08 -05:00
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2VI[9] == 0xE);
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2VI[10] == 0x2C);
2020-02-07 09:36:09 -05:00
}