Play-/tools/VuTest/StallTest.cpp

114 lines
4.6 KiB
C++
Raw Permalink Normal View History

2020-02-24 12:54:17 -05:00
#include "StallTest.h"
#include "VuAssembler.h"
void CStallTest::Execute(CTestVm& virtualMachine)
{
virtualMachine.Reset();
auto microMem = reinterpret_cast<uint32*>(virtualMachine.m_microMem);
//Inspired by Rogue Galaxy - Looks like a FMAC stall with an impact, but not really
CVuAssembler assembler(microMem);
2020-02-26 20:07:56 -05:00
//pipeTime = 0
2020-02-24 12:54:17 -05:00
assembler.Write(
2020-03-03 09:44:25 -05:00
CVuAssembler::Upper::MULAbc(CVuAssembler::DEST_XYZW, CVuAssembler::VF1, CVuAssembler::VF10, CVuAssembler::BC_X),
CVuAssembler::Lower::DIV(CVuAssembler::VF0, CVuAssembler::FVF_W, CVuAssembler::VF9, CVuAssembler::FVF_W));
2020-02-24 12:54:17 -05:00
2020-02-26 20:07:56 -05:00
//pipeTime = 1
2020-02-24 12:54:17 -05:00
assembler.Write(
2020-03-03 09:44:25 -05:00
CVuAssembler::Upper::MADDAbc(CVuAssembler::DEST_XYZW, CVuAssembler::VF2, CVuAssembler::VF10, CVuAssembler::BC_Y),
CVuAssembler::Lower::NOP());
2020-02-24 12:54:17 -05:00
2020-02-26 20:07:56 -05:00
//pipeTime = 2
2020-02-24 12:54:17 -05:00
assembler.Write(
2020-03-03 09:44:25 -05:00
CVuAssembler::Upper::MADDAbc(CVuAssembler::DEST_XYZW, CVuAssembler::VF3, CVuAssembler::VF10, CVuAssembler::BC_Z),
CVuAssembler::Lower::NOP());
2020-02-24 12:54:17 -05:00
2020-02-26 20:07:56 -05:00
//pipeTime = 3
//Writing to VF10xyzw, result will be available at pipeTime 7
2020-02-24 12:54:17 -05:00
assembler.Write(
2020-03-03 09:44:25 -05:00
CVuAssembler::Upper::MADDbc(CVuAssembler::DEST_XYZW, CVuAssembler::VF10, CVuAssembler::VF5, CVuAssembler::VF10, CVuAssembler::BC_W),
CVuAssembler::Lower::NOP());
2020-02-24 12:54:17 -05:00
2020-02-26 20:07:56 -05:00
//pipeTime = 4, 5, 6, 7
2020-02-24 12:54:17 -05:00
//The DIV here will wait for the result to be written to VF10 (by previous instruction), causing a FMAC stall
//But it won't disrupt the execution, we will get 3 different values in the 3 MULq instructions below
assembler.Write(
2020-03-03 09:44:25 -05:00
CVuAssembler::Upper::MULAbc(CVuAssembler::DEST_XYZW, CVuAssembler::VF1, CVuAssembler::VF11, CVuAssembler::BC_X),
CVuAssembler::Lower::DIV(CVuAssembler::VF0, CVuAssembler::FVF_W, CVuAssembler::VF10, CVuAssembler::FVF_W));
2020-02-24 12:54:17 -05:00
2020-02-26 20:07:56 -05:00
//pipeTime = 8
2020-02-24 12:54:17 -05:00
assembler.Write(
2020-03-03 09:44:25 -05:00
CVuAssembler::Upper::MADDAbc(CVuAssembler::DEST_XYZW, CVuAssembler::VF2, CVuAssembler::VF11, CVuAssembler::BC_Y),
CVuAssembler::Lower::NOP());
2020-02-24 12:54:17 -05:00
2020-02-26 20:07:56 -05:00
//pipeTime = 9
2020-02-24 12:54:17 -05:00
assembler.Write(
2020-03-03 09:44:25 -05:00
CVuAssembler::Upper::MADDAbc(CVuAssembler::DEST_XYZW, CVuAssembler::VF3, CVuAssembler::VF11, CVuAssembler::BC_Z),
CVuAssembler::Lower::NOP());
2020-02-24 12:54:17 -05:00
2020-02-26 20:07:56 -05:00
//pipeTime = 10
2020-02-24 12:54:17 -05:00
assembler.Write(
2020-03-03 09:44:25 -05:00
CVuAssembler::Upper::MADDbc(CVuAssembler::DEST_XYZW, CVuAssembler::VF11, CVuAssembler::VF5, CVuAssembler::VF11, CVuAssembler::BC_W),
CVuAssembler::Lower::NOP());
2020-02-24 12:54:17 -05:00
assembler.Write(
CVuAssembler::Upper::NOP(),
CVuAssembler::Lower::NOP());
assembler.Write(
CVuAssembler::Upper::NOP(),
CVuAssembler::Lower::NOP());
assembler.Write(
2020-03-03 09:44:25 -05:00
CVuAssembler::Upper::MULq(CVuAssembler::DEST_XYZ, CVuAssembler::VF12, CVuAssembler::VF9),
CVuAssembler::Lower::NOP());
2020-02-24 12:54:17 -05:00
assembler.Write(
2020-03-03 09:44:25 -05:00
CVuAssembler::Upper::MULq(CVuAssembler::DEST_XYZ, CVuAssembler::VF9, CVuAssembler::VF10),
CVuAssembler::Lower::DIV(CVuAssembler::VF0, CVuAssembler::FVF_W, CVuAssembler::VF11, CVuAssembler::FVF_W));
2020-02-24 12:54:17 -05:00
assembler.Write(
CVuAssembler::Upper::NOP(),
CVuAssembler::Lower::NOP());
assembler.Write(
2020-03-03 09:44:25 -05:00
CVuAssembler::Upper::MULq(CVuAssembler::DEST_XYZ, CVuAssembler::VF11, CVuAssembler::VF11),
CVuAssembler::Lower::WAITQ());
2020-02-24 12:54:17 -05:00
assembler.Write(
CVuAssembler::Upper::NOP() | CVuAssembler::Upper::E_BIT,
CVuAssembler::Lower::NOP());
assembler.Write(
CVuAssembler::Upper::NOP(),
CVuAssembler::Lower::NOP());
//Some transformation matrix (identity)
virtualMachine.m_cpu.m_State.nCOP2[1] = uint128{Float::_1, Float::_0, Float::_0, Float::_0};
virtualMachine.m_cpu.m_State.nCOP2[2] = uint128{Float::_0, Float::_1, Float::_0, Float::_0};
virtualMachine.m_cpu.m_State.nCOP2[3] = uint128{Float::_0, Float::_0, Float::_1, Float::_0};
virtualMachine.m_cpu.m_State.nCOP2[5] = uint128{Float::_0, Float::_0, Float::_0, Float::_1};
2020-02-24 12:54:17 -05:00
//Some vectors that will be normalized
2020-03-03 09:44:25 -05:00
virtualMachine.m_cpu.m_State.nCOP2[9] = uint128{Float::_2, Float::_2, Float::_2, Float::_2};
virtualMachine.m_cpu.m_State.nCOP2[10] = uint128{Float::_4, Float::_4, Float::_4, Float::_4};
virtualMachine.m_cpu.m_State.nCOP2[11] = uint128{Float::_8, Float::_8, Float::_8, Float::_8};
2020-02-24 12:54:17 -05:00
virtualMachine.ExecuteTest(0);
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[12].nV0 == Float::_1);
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[12].nV1 == Float::_1);
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[12].nV2 == Float::_1);
2020-02-24 12:54:17 -05:00
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[9].nV0 == Float::_1);
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[9].nV1 == Float::_1);
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[9].nV2 == Float::_1);
2020-02-24 12:54:17 -05:00
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[11].nV0 == Float::_1);
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[11].nV1 == Float::_1);
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[11].nV2 == Float::_1);
2020-02-24 12:54:17 -05:00
}