예제 #1
0
void CMA_VU::CUpper::CompileInstruction(uint32 nAddress, CMipsJitter* codeGen, CMIPS* pCtx)
{
	SetupQuickVariables(nAddress, codeGen, pCtx);

	m_nDest		= (uint8 )((m_nOpcode >> 21) & 0x000F);
	m_nFT		= (uint8 )((m_nOpcode >> 16) & 0x001F);
	m_nFS		= (uint8 )((m_nOpcode >> 11) & 0x001F);
	m_nFD		= (uint8 )((m_nOpcode >>  6) & 0x001F);

	m_nBc		= (uint8 )((m_nOpcode >>  0) & 0x0003);

	((this)->*(m_pOpVector[m_nOpcode & 0x3F]))();

	//Make sure D and T bit aren't set
	assert((m_nOpcode & 0x18000000) == 0);

	//Check I bit
	if(m_nOpcode & 0x80000000)
	{
		LOI(pCtx->m_pMemoryMap->GetInstruction(nAddress - 4));
	}

	//Check E bit
	if(m_nOpcode & 0x40000000)
	{
		//Force exception checking if microprogram is done
		m_codeGen->PushCst(1);
		m_codeGen->PullRel(offsetof(CMIPS, m_State.nHasException));
	}
}
예제 #2
0
void CMA_MIPSIV::CompileInstruction(uint32 nAddress, CMipsJitter* codeGen, CMIPS* pCtx)
{
	SetupQuickVariables(nAddress, codeGen, pCtx);

	m_nRS = (uint8)((m_nOpcode >> 21) & 0x1F);
	m_nRT = (uint8)((m_nOpcode >> 16) & 0x1F);
	m_nRD = (uint8)((m_nOpcode >> 11) & 0x1F);
	m_nSA = (uint8)((m_nOpcode >> 6) & 0x1F);
	m_nImmediate = (uint16)(m_nOpcode & 0xFFFF);

	if(m_nOpcode)
	{
		m_pOpGeneral[(m_nOpcode >> 26)]();
	}
}