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)
|
2020-03-03 09:41:39 -05:00
|
|
|
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);
|
|
|
|
|
2020-03-03 09:41:39 -05:00
|
|
|
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
|
|
|
|
2020-03-03 09:41:39 -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
|
|
|
|
2020-03-03 09:41:39 -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
|
|
|
}
|