mirror of
https://github.com/jpd002/Play-.git
synced 2025-04-28 13:47:57 +03:00
57 lines
1.7 KiB
C++
57 lines
1.7 KiB
C++
#include "StallTest5.h"
|
|
#include "VuAssembler.h"
|
|
|
|
void CStallTest5::Execute(CTestVm& virtualMachine)
|
|
{
|
|
virtualMachine.Reset();
|
|
|
|
auto microMem = reinterpret_cast<uint32*>(virtualMachine.m_microMem);
|
|
|
|
//Inspired by Sims 2: Castaway, stalling instruction reads Q
|
|
|
|
{
|
|
CVuAssembler assembler(microMem);
|
|
|
|
//pipeTime = 0 (DIV result at pipeTime 7)
|
|
assembler.Write(
|
|
CVuAssembler::Upper::NOP(),
|
|
CVuAssembler::Lower::DIV(CVuAssembler::VF0, CVuAssembler::FVF_W, CVuAssembler::VF16, CVuAssembler::FVF_W));
|
|
|
|
//pipeTime = 1
|
|
assembler.Write(
|
|
CVuAssembler::Upper::NOP(),
|
|
CVuAssembler::Lower::NOP());
|
|
|
|
//pipeTime = 2
|
|
assembler.Write(
|
|
CVuAssembler::Upper::NOP(),
|
|
CVuAssembler::Lower::NOP());
|
|
|
|
//pipeTime = 3
|
|
assembler.Write(
|
|
CVuAssembler::Upper::MAX(CVuAssembler::DEST_W, CVuAssembler::VF16, CVuAssembler::VF0, CVuAssembler::VF0),
|
|
CVuAssembler::Lower::NOP());
|
|
|
|
//pipeTime = 4, 5, 6, 7 (MULq has to wait for previous MAX instruction to complete)
|
|
assembler.Write(
|
|
CVuAssembler::Upper::MULq(CVuAssembler::DEST_XYZW, CVuAssembler::VF16, CVuAssembler::VF16),
|
|
CVuAssembler::Lower::NOP());
|
|
|
|
assembler.Write(
|
|
CVuAssembler::Upper::NOP() | CVuAssembler::Upper::E_BIT,
|
|
CVuAssembler::Lower::NOP());
|
|
|
|
assembler.Write(
|
|
CVuAssembler::Upper::NOP(),
|
|
CVuAssembler::Lower::NOP());
|
|
}
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[16] = uint128{Float::_8, Float::_4, Float::_2, Float::_2};
|
|
|
|
virtualMachine.ExecuteTest(0);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[16].nV0 == Float::_4);
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[16].nV1 == Float::_2);
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[16].nV2 == Float::_1);
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[16].nV3 == Float::_1Half);
|
|
}
|