Beispiel #1
0
int main(int argc, const char** argv)
{
	fesetround(FE_TOWARDZERO);

	CTestVm virtualMachine;
	
	for(const auto& factory : s_factories)
	{
		virtualMachine.Reset();
		auto test = factory();
		test->Execute(virtualMachine);
		delete test;
	}
	return 0;
}
Beispiel #2
0
void CAdd64Test::Execute(CTestVm& virtualMachine)
{
	const uint32 baseAddress = 0x100;
	const uint64 constantValue0 = 0xFFF0FFFFFFFFFFFFULL;
	const uint64 constantValue1 = 0x8000000000000001ULL;
	CMIPS::REGISTER valueRegister0 = CMIPS::A0;
	CMIPS::REGISTER valueRegister1 = CMIPS::A1;
	CMIPS::REGISTER addReg32Result = CMIPS::T0;
	CMIPS::REGISTER addReg64Result = CMIPS::T1;
	CMIPS::REGISTER addCst32Result = CMIPS::T2;
	CMIPS::REGISTER addCst64Result = CMIPS::T3;

	virtualMachine.Reset();

	{
		CMIPSAssembler assembler(reinterpret_cast<uint32*>(virtualMachine.m_ram + baseAddress));

		assembler.ADDU(addReg32Result, valueRegister0, valueRegister1);
		assembler.DADDU(addReg64Result, valueRegister0, valueRegister1);
		assembler.ADDIU(addCst32Result, valueRegister0, constantValue1);
		assembler.DADDIU(addCst64Result, valueRegister0, constantValue1);

		assembler.SYSCALL();
	}

	//Setup initial state
	virtualMachine.m_cpu.m_State.nGPR[valueRegister0].nD0 = constantValue0;
	virtualMachine.m_cpu.m_State.nGPR[valueRegister1].nD0 = constantValue1;

	//Execute
	virtualMachine.ExecuteTest(baseAddress);

	//Check final state
	TEST_VERIFY(virtualMachine.m_cpu.m_State.nGPR[valueRegister0].nD0 == constantValue0);
	TEST_VERIFY(virtualMachine.m_cpu.m_State.nGPR[valueRegister1].nD0 == constantValue1);

	TEST_VERIFY(virtualMachine.m_cpu.m_State.nGPR[addReg32Result].nD0 == static_cast<int32>(constantValue0 + constantValue1));
	TEST_VERIFY(virtualMachine.m_cpu.m_State.nGPR[addReg64Result].nD0 == constantValue0 + constantValue1);
	TEST_VERIFY(virtualMachine.m_cpu.m_State.nGPR[addCst32Result].nD0 == static_cast<int32>(constantValue0 + static_cast<int16>(constantValue1)));
	TEST_VERIFY(virtualMachine.m_cpu.m_State.nGPR[addCst64Result].nD0 == constantValue0 + static_cast<int16>(constantValue1));
}
Beispiel #3
0
void CTriAceTest::Execute(CTestVm& virtualMachine)
{
	virtualMachine.Reset();

	auto microMem = reinterpret_cast<uint32*>(virtualMachine.m_microMem);

	//From Radiata Stories - Needs accurate floating point handling to work

	CVuAssembler assembler(microMem);

	assembler.Write(
	    CVuAssembler::Upper::NOP() | CVuAssembler::Upper::I_BIT,
	    0x42FECCCD);

	//X
	assembler.Write(
	    CVuAssembler::Upper::MULi(CVuAssembler::DEST_X, CVuAssembler::VF2, CVuAssembler::VF1) | CVuAssembler::Upper::I_BIT,
	    0x42546666);

	assembler.Write(
	    CVuAssembler::Upper::ADDi(CVuAssembler::DEST_X, CVuAssembler::VF3, CVuAssembler::VF2) | CVuAssembler::Upper::I_BIT,
	    0x43D80D3E);

	//Y
	assembler.Write(
	    CVuAssembler::Upper::MULi(CVuAssembler::DEST_Y, CVuAssembler::VF2, CVuAssembler::VF1) | CVuAssembler::Upper::I_BIT,
	    0xC7F079B3);

	assembler.Write(
	    CVuAssembler::Upper::ADDi(CVuAssembler::DEST_Y, CVuAssembler::VF3, CVuAssembler::VF2) | CVuAssembler::Upper::I_BIT,
	    0x43A0DA10);

	//Z
	assembler.Write(
	    CVuAssembler::Upper::MULi(CVuAssembler::DEST_Z, CVuAssembler::VF2, CVuAssembler::VF1) | CVuAssembler::Upper::I_BIT,
	    0x43A02666);

	assembler.Write(
	    CVuAssembler::Upper::ADDi(CVuAssembler::DEST_Z, CVuAssembler::VF3, CVuAssembler::VF2) | CVuAssembler::Upper::I_BIT,
	    0x43546E14);

	//W
	assembler.Write(
	    CVuAssembler::Upper::MULi(CVuAssembler::DEST_W, CVuAssembler::VF2, CVuAssembler::VF1) | CVuAssembler::Upper::I_BIT,
	    0x42F23333);

	assembler.Write(
	    CVuAssembler::Upper::ADDi(CVuAssembler::DEST_W, CVuAssembler::VF3, CVuAssembler::VF2) | CVuAssembler::Upper::I_BIT,
	    0x3DD3DD98);

	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[1].nV0 = 0xB063B75B;
	virtualMachine.m_cpu.m_State.nCOP2[1].nV1 = 0x8701CE82;
	virtualMachine.m_cpu.m_State.nCOP2[1].nV2 = 0x46FCC888;
	virtualMachine.m_cpu.m_State.nCOP2[1].nV3 = 0x793CC535;

	virtualMachine.ExecuteTest(0);

	TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[3].nV0 == 0x42546666);
	TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[3].nV1 == 0xC7F079B3);
	TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[3].nV2 == 0x4B1ED5E7);
	TEST_VERIFY(virtualMachine.m_cpu.m_State.nCOP2[3].nV3 == 0x7D1CA47B);
}
Beispiel #4
0
void CPackedMultiplyTest::Execute(CTestVm& virtualMachine)
{
	auto& cpu = virtualMachine.m_cpu;

	const uint32 baseAddress = 0x100;
	const uint32 constantValue0		= 0x11110000;
	const uint32 constantValue1		= 0x33332222;
	const uint32 constantValue2		= 0x55554444;
	const uint32 constantValue3		= 0x77776666;
	const uint32 constantValue4		= 0x99998888;
	const uint32 constantValue5		= 0xBBBBAAAA;
	const uint32 constantValue6		= 0xDDDDCCCC;
	const uint32 constantValue7		= 0xFFFFEEEE;
	const uint64 multhResultLow		= 0xF49F3E9400000000ULL;
	const uint64 multhResultHigh	= 0xF92C06D4F2589630ULL;
	const uint64 multhLoLow			= 0xF92C5C2900000000ULL;
	const uint64 multhLoHigh		= 0xF49F0B61F2589630ULL;
	const uint64 multhHiLow			= 0xF258A741F49F3E94ULL;
	const uint64 multhHiHigh		= 0xFFFF8889F92C06D4ULL;
	const uint64 mfhlUwResultLow	= 0xF258A741F92C5C29ULL;
	const uint64 mfhlUwResultHigh	= 0xFFFF8889F49F0B61ULL;
	const uint64 mfhlLhResultLow	= 0xA7413E945C290000ULL;
	const uint64 mfhlLhResultHigh	= 0x888906D40B619630ULL;

	auto valueRegister0		= CMIPS::A0;
	auto valueRegister1		= CMIPS::A1;
	auto multhResult		= CMIPS::T0;
	auto multhLo			= CMIPS::T1;
	auto multhHi			= CMIPS::T2;
	auto multhSelfResult	= CMIPS::T3;
	auto multhSelfLo		= CMIPS::T4;
	auto multhSelfHi		= CMIPS::T5;
	auto mfhlUwResult		= CMIPS::T6;
	auto mfhlLhResult		= CMIPS::T7;

	virtualMachine.Reset();

	{
		CEEAssembler assembler(reinterpret_cast<uint32*>(virtualMachine.m_ram + baseAddress));

		//PMULTH
		assembler.PMULTH(multhResult, valueRegister0, valueRegister1);
		assembler.PMFLO(multhLo);
		assembler.PMFHI(multhHi);

		//PMULTH (self)
		assembler.PADDW(multhSelfResult, valueRegister0, CMIPS::R0);
		assembler.PMULTH(multhSelfResult, multhSelfResult, valueRegister1);
		assembler.PMFLO(multhSelfLo);
		assembler.PMFHI(multhSelfHi);

		//PMFHL.UW
		assembler.PMFHL_UW(mfhlUwResult);

		//PMFHL.LH
		assembler.PMFHL_LH(mfhlLhResult);

		assembler.SYSCALL();
	}

	//Setup initial state
	cpu.m_State.nGPR[valueRegister0].nV[0] = constantValue0;
	cpu.m_State.nGPR[valueRegister0].nV[1] = constantValue1;
	cpu.m_State.nGPR[valueRegister0].nV[2] = constantValue2;
	cpu.m_State.nGPR[valueRegister0].nV[3] = constantValue3;

	cpu.m_State.nGPR[valueRegister1].nV[0] = constantValue4;
	cpu.m_State.nGPR[valueRegister1].nV[1] = constantValue5;
	cpu.m_State.nGPR[valueRegister1].nV[2] = constantValue6;
	cpu.m_State.nGPR[valueRegister1].nV[3] = constantValue7;

	//Execute
	virtualMachine.ExecuteTest(baseAddress);

	//Check final state
	TEST_VERIFY(cpu.m_State.nGPR[valueRegister0].nV[0] == constantValue0);
	TEST_VERIFY(cpu.m_State.nGPR[valueRegister0].nV[1] == constantValue1);
	TEST_VERIFY(cpu.m_State.nGPR[valueRegister0].nV[2] == constantValue2);
	TEST_VERIFY(cpu.m_State.nGPR[valueRegister0].nV[3] == constantValue3);

	TEST_VERIFY(cpu.m_State.nGPR[valueRegister1].nV[0] == constantValue4);
	TEST_VERIFY(cpu.m_State.nGPR[valueRegister1].nV[1] == constantValue5);
	TEST_VERIFY(cpu.m_State.nGPR[valueRegister1].nV[2] == constantValue6);
	TEST_VERIFY(cpu.m_State.nGPR[valueRegister1].nV[3] == constantValue7);

	TEST_VERIFY(cpu.m_State.nGPR[multhResult].nD0 == multhResultLow);
	TEST_VERIFY(cpu.m_State.nGPR[multhResult].nD1 == multhResultHigh);

	TEST_VERIFY(cpu.m_State.nGPR[multhLo].nD0 == multhLoLow);
	TEST_VERIFY(cpu.m_State.nGPR[multhLo].nD1 == multhLoHigh);

	TEST_VERIFY(cpu.m_State.nGPR[multhHi].nD0 == multhHiLow);
	TEST_VERIFY(cpu.m_State.nGPR[multhHi].nD1 == multhHiHigh);

	TEST_VERIFY(cpu.m_State.nGPR[multhSelfResult].nD0 == multhResultLow);
	TEST_VERIFY(cpu.m_State.nGPR[multhSelfResult].nD1 == multhResultHigh);

	TEST_VERIFY(cpu.m_State.nGPR[multhSelfLo].nD0 == multhLoLow);
	TEST_VERIFY(cpu.m_State.nGPR[multhSelfLo].nD1 == multhLoHigh);

	TEST_VERIFY(cpu.m_State.nGPR[multhSelfHi].nD0 == multhHiLow);
	TEST_VERIFY(cpu.m_State.nGPR[multhSelfHi].nD1 == multhHiHigh);

	TEST_VERIFY(cpu.m_State.nGPR[mfhlUwResult].nD0 == mfhlUwResultLow);
	TEST_VERIFY(cpu.m_State.nGPR[mfhlUwResult].nD1 == mfhlUwResultHigh);

	TEST_VERIFY(cpu.m_State.nGPR[mfhlLhResult].nD0 == mfhlLhResultLow);
	TEST_VERIFY(cpu.m_State.nGPR[mfhlLhResult].nD1 == mfhlLhResultHigh);
}
Beispiel #5
0
void CPackTest::Execute(CTestVm& virtualMachine)
{
	auto& cpu = virtualMachine.m_cpu;

	const uint32 baseAddress = 0x100;
	const uint32 constantValue0 = 0x00000000;
	const uint32 constantValue1 = 0x11111111;
	const uint32 constantValue2 = 0x22222222;
	const uint32 constantValue3 = 0x33333333;
	const uint32 constantValue4 = 0x44444444;
	const uint32 constantValue5 = 0x55555555;
	const uint32 constantValue6 = 0x66666666;
	const uint32 constantValue7 = 0x77777777;
	const uint64 pachResultLow  = 0x7777666655554444ULL;
	const uint64 pachResultHigh = 0x3333222211110000ULL;
	const uint64 pacwResultLow  = 0x6666666644444444ULL;
	const uint64 pacwResultHigh = 0x2222222200000000ULL;

	auto valueRegister0	= CMIPS::A0;
	auto valueRegister1 = CMIPS::A1;
	auto pachResult		= CMIPS::T0;
	auto pachSelfResult	= CMIPS::T1;
	auto pacwResult		= CMIPS::T2;
	auto pacwSelfResult	= CMIPS::T3;

	virtualMachine.Reset();

	{
		CEEAssembler assembler(reinterpret_cast<uint32*>(virtualMachine.m_ram + baseAddress));

		//PPACH
		assembler.PPACH(pachResult, valueRegister0, valueRegister1);

		//PPACH (self)
		assembler.PADDW(pachSelfResult, valueRegister0, CMIPS::R0);
		assembler.PPACH(pachSelfResult, pachSelfResult, valueRegister1);

		//PPACW
		assembler.PPACW(pacwResult, valueRegister0, valueRegister1);

		//PPACW (self)
		assembler.PADDW(pacwSelfResult, valueRegister0, CMIPS::R0);
		assembler.PPACW(pacwSelfResult, pacwSelfResult, valueRegister1);

		assembler.SYSCALL();
	}

	//Setup initial state
	cpu.m_State.nGPR[valueRegister0].nV[0] = constantValue0;
	cpu.m_State.nGPR[valueRegister0].nV[1] = constantValue1;
	cpu.m_State.nGPR[valueRegister0].nV[2] = constantValue2;
	cpu.m_State.nGPR[valueRegister0].nV[3] = constantValue3;

	cpu.m_State.nGPR[valueRegister1].nV[0] = constantValue4;
	cpu.m_State.nGPR[valueRegister1].nV[1] = constantValue5;
	cpu.m_State.nGPR[valueRegister1].nV[2] = constantValue6;
	cpu.m_State.nGPR[valueRegister1].nV[3] = constantValue7;

	//Execute
	virtualMachine.ExecuteTest(baseAddress);

	//Check final state
	TEST_VERIFY(cpu.m_State.nGPR[valueRegister0].nV[0] == constantValue0);
	TEST_VERIFY(cpu.m_State.nGPR[valueRegister0].nV[1] == constantValue1);
	TEST_VERIFY(cpu.m_State.nGPR[valueRegister0].nV[2] == constantValue2);
	TEST_VERIFY(cpu.m_State.nGPR[valueRegister0].nV[3] == constantValue3);

	TEST_VERIFY(cpu.m_State.nGPR[valueRegister1].nV[0] == constantValue4);
	TEST_VERIFY(cpu.m_State.nGPR[valueRegister1].nV[1] == constantValue5);
	TEST_VERIFY(cpu.m_State.nGPR[valueRegister1].nV[2] == constantValue6);
	TEST_VERIFY(cpu.m_State.nGPR[valueRegister1].nV[3] == constantValue7);

	TEST_VERIFY(cpu.m_State.nGPR[pachResult].nD0 == pachResultLow);
	TEST_VERIFY(cpu.m_State.nGPR[pachResult].nD1 == pachResultHigh);

	TEST_VERIFY(cpu.m_State.nGPR[pachSelfResult].nD0 == pachResultLow);
	TEST_VERIFY(cpu.m_State.nGPR[pachSelfResult].nD1 == pachResultHigh);

	TEST_VERIFY(cpu.m_State.nGPR[pacwResult].nD0 == pacwResultLow);
	TEST_VERIFY(cpu.m_State.nGPR[pacwResult].nD1 == pacwResultHigh);

	TEST_VERIFY(cpu.m_State.nGPR[pacwSelfResult].nD0 == pacwResultLow);
	TEST_VERIFY(cpu.m_State.nGPR[pacwSelfResult].nD1 == pacwResultHigh);
}