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)); } }
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)](); } }