2020-04-11 15:11:43 -04:00
|
|
|
#include "MinMaxTest.h"
|
|
|
|
#include "VuAssembler.h"
|
|
|
|
|
|
|
|
void CMinMaxTest::Execute(CTestVm& virtualMachine)
|
|
|
|
{
|
2020-05-19 12:37:38 -04:00
|
|
|
auto resultReg1 = CVuAssembler::VF16;
|
|
|
|
auto resultReg2 = CVuAssembler::VF17;
|
|
|
|
auto resultReg3 = CVuAssembler::VF18;
|
|
|
|
auto resultReg4 = CVuAssembler::VF19;
|
2025-03-10 14:27:40 -04:00
|
|
|
auto resultReg5 = CVuAssembler::VF20;
|
2020-05-19 12:37:38 -04:00
|
|
|
|
2020-04-11 15:11:43 -04:00
|
|
|
virtualMachine.Reset();
|
|
|
|
|
|
|
|
auto microMem = reinterpret_cast<uint32*>(virtualMachine.m_microMem);
|
|
|
|
|
2020-05-19 12:37:38 -04:00
|
|
|
CVuAssembler assembler(microMem);
|
|
|
|
|
2020-04-11 15:11:43 -04:00
|
|
|
//Inspired by Dynasty Warriors 5
|
|
|
|
//Will use MINI on a vector, W contains alpha value as byte
|
|
|
|
//Which is a denormal if we interpret is as a float
|
|
|
|
//The denormal number should not be flushed to zero
|
2020-04-14 15:44:05 -04:00
|
|
|
//DW5 also requires that MAX preserve denormals
|
2020-04-11 15:11:43 -04:00
|
|
|
|
2020-05-19 12:37:38 -04:00
|
|
|
assembler.Write(
|
|
|
|
CVuAssembler::Upper::MINI(CVuAssembler::DEST_XYZW, resultReg1, CVuAssembler::VF1, CVuAssembler::VF2),
|
|
|
|
CVuAssembler::Lower::NOP());
|
|
|
|
|
|
|
|
assembler.Write(
|
|
|
|
CVuAssembler::Upper::MAX(CVuAssembler::DEST_XYZW, resultReg2, CVuAssembler::VF1, CVuAssembler::VF3),
|
|
|
|
CVuAssembler::Lower::NOP());
|
|
|
|
|
|
|
|
//Inspired by Gran Turismo 4
|
2025-03-10 14:27:40 -04:00
|
|
|
//MINI/MAX need to work properly with PS2's minimum & maximum float values
|
2020-04-11 15:11:43 -04:00
|
|
|
|
|
|
|
assembler.Write(
|
2020-05-19 12:37:38 -04:00
|
|
|
CVuAssembler::Upper::MINI(CVuAssembler::DEST_XYZW, resultReg3, CVuAssembler::VF1, CVuAssembler::VF4),
|
2020-04-14 15:44:05 -04:00
|
|
|
CVuAssembler::Lower::NOP());
|
|
|
|
|
|
|
|
assembler.Write(
|
2020-05-19 12:37:38 -04:00
|
|
|
CVuAssembler::Upper::MAX(CVuAssembler::DEST_XYZW, resultReg4, CVuAssembler::VF5, CVuAssembler::VF1),
|
2020-04-14 15:44:05 -04:00
|
|
|
CVuAssembler::Lower::NOP());
|
2020-04-11 15:11:43 -04:00
|
|
|
|
2025-03-10 14:27:40 -04:00
|
|
|
//Inspired by Dragon Quest - Shounen Yangus to Fushigi no Dungeon
|
|
|
|
//MAX needs to compare denormal with 0 as bigger.
|
|
|
|
|
|
|
|
assembler.Write(
|
|
|
|
CVuAssembler::Upper::MAXbc(CVuAssembler::DEST_XYZW, resultReg5, CVuAssembler::VF1, CVuAssembler::VF0, CVuAssembler::BC_X),
|
|
|
|
CVuAssembler::Lower::NOP());
|
|
|
|
|
2020-04-11 15:11:43 -04:00
|
|
|
assembler.Write(
|
|
|
|
CVuAssembler::Upper::NOP() | CVuAssembler::Upper::E_BIT,
|
|
|
|
CVuAssembler::Lower::NOP());
|
|
|
|
|
|
|
|
assembler.Write(
|
|
|
|
CVuAssembler::Upper::NOP(),
|
|
|
|
CVuAssembler::Lower::NOP());
|
|
|
|
|
2020-04-14 15:44:05 -04:00
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[1].nV0 = Float::_1;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[1].nV1 = Float::_Minus8;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[1].nV2 = Float::_64;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[1].nV3 = 0x80;
|
|
|
|
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[2].nV0 = Float::_8;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[2].nV1 = Float::_8;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[2].nV2 = Float::_8;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[2].nV3 = Float::_8;
|
2020-04-11 15:11:43 -04:00
|
|
|
|
2020-04-14 15:44:05 -04:00
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[3].nV0 = Float::_Minus1;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[3].nV1 = Float::_Minus1;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[3].nV2 = Float::_Minus1;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[3].nV3 = Float::_Minus1;
|
2020-04-11 15:11:43 -04:00
|
|
|
|
2020-05-19 12:37:38 -04:00
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[4].nV0 = Float::_Max;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[4].nV1 = Float::_Max;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[4].nV2 = Float::_Max;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[4].nV3 = Float::_Max;
|
|
|
|
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[5].nV0 = Float::_Min;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[5].nV1 = Float::_Min;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[5].nV2 = Float::_Min;
|
|
|
|
virtualMachine.m_cpu.m_State.nCOP2[5].nV3 = Float::_Min;
|
|
|
|
|
2020-04-11 15:11:43 -04:00
|
|
|
virtualMachine.ExecuteTest(0);
|
|
|
|
|
2020-05-19 12:37:38 -04:00
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg1].nV0 == Float::_1);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg1].nV1 == Float::_Minus8);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg1].nV2 == Float::_8);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg1].nV3 == 0x80);
|
|
|
|
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg2].nV0 == Float::_1);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg2].nV1 == Float::_Minus1);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg2].nV2 == Float::_64);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg2].nV3 == 0x80);
|
|
|
|
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg3].nV0 == Float::_1);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg3].nV1 == Float::_Minus8);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg3].nV2 == Float::_64);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg3].nV3 == 0x80);
|
2020-04-14 15:44:05 -04:00
|
|
|
|
2020-05-19 12:37:38 -04:00
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg4].nV0 == Float::_1);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg4].nV1 == Float::_Minus8);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg4].nV2 == Float::_64);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg4].nV3 == 0x80);
|
2025-03-10 14:27:40 -04:00
|
|
|
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg5].nV0 == Float::_1);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg5].nV1 == 0);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg5].nV2 == Float::_64);
|
|
|
|
TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[resultReg5].nV3 == 0x80);
|
2020-04-11 15:11:43 -04:00
|
|
|
}
|