2007-12-07 00:26:56 +00:00
|
|
|
#include <assert.h>
|
|
|
|
#include "COP_VU.h"
|
|
|
|
#include "VUShared.h"
|
2025-03-11 12:48:26 -04:00
|
|
|
#include "Log.h"
|
2015-05-06 00:54:15 -04:00
|
|
|
#include "../MIPS.h"
|
|
|
|
#include "../MemoryUtils.h"
|
2008-01-21 20:33:31 +00:00
|
|
|
#include "offsetof_def.h"
|
2016-05-25 22:56:24 -04:00
|
|
|
#include "Vpu.h"
|
2008-04-09 02:52:38 +00:00
|
|
|
|
2016-06-04 22:25:59 -04:00
|
|
|
#undef MAX
|
|
|
|
|
2016-12-28 12:47:27 -05:00
|
|
|
enum CTRL_REG
|
|
|
|
{
|
2018-04-30 21:01:23 +01:00
|
|
|
CTRL_REG_STATUS = 16,
|
|
|
|
CTRL_REG_MAC = 17,
|
|
|
|
CTRL_REG_CLIP = 18,
|
|
|
|
CTRL_REG_R = 20,
|
|
|
|
CTRL_REG_I = 21,
|
|
|
|
CTRL_REG_Q = 22,
|
|
|
|
CTRL_REG_TPC = 26,
|
|
|
|
CTRL_REG_CMSAR0 = 27,
|
|
|
|
CTRL_REG_FBRST = 28,
|
2016-12-28 12:47:27 -05:00
|
|
|
CTRL_REG_VPU_STAT = 29,
|
2018-04-30 21:01:23 +01:00
|
|
|
CTRL_REG_CMSAR1 = 31,
|
2016-12-28 12:47:27 -05:00
|
|
|
};
|
|
|
|
|
2017-03-31 22:31:45 -04:00
|
|
|
CCOP_VU::CCOP_VU(MIPS_REGSIZE nRegSize)
|
2018-04-30 21:01:23 +01:00
|
|
|
: CMIPSCoprocessor(nRegSize)
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
|
|
|
SetupReflectionTables();
|
|
|
|
}
|
|
|
|
|
2022-10-18 20:01:20 +01:00
|
|
|
void CCOP_VU::CompileInstruction(uint32 nAddress, CMipsJitter* codeGen, CMIPS* pCtx, uint32 instrPosition)
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
2022-10-18 20:01:20 +01:00
|
|
|
SetupQuickVariables(nAddress, codeGen, pCtx, instrPosition);
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
m_nDest = (uint8)((m_nOpcode >> 21) & 0x0F);
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
m_nFSF = ((m_nDest >> 0) & 0x03);
|
|
|
|
m_nFTF = ((m_nDest >> 2) & 0x03);
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
m_nFT = (uint8)((m_nOpcode >> 16) & 0x1F);
|
|
|
|
m_nFS = (uint8)((m_nOpcode >> 11) & 0x1F);
|
|
|
|
m_nFD = (uint8)((m_nOpcode >> 6) & 0x1F);
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
m_nBc = (uint8)((m_nOpcode >> 0) & 0x03);
|
|
|
|
|
|
|
|
m_nIT = m_nFT;
|
|
|
|
m_nIS = m_nFS;
|
|
|
|
m_nID = m_nFD;
|
|
|
|
m_nImm5 = m_nID;
|
|
|
|
m_nImm15 = (uint16)((m_nOpcode >> 6) & 0x7FFF);
|
2011-10-23 20:22:29 +00:00
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
switch((m_nOpcode >> 26) & 0x3F)
|
|
|
|
{
|
|
|
|
case 0x12:
|
|
|
|
//COP2
|
2009-03-30 04:57:52 +00:00
|
|
|
((this)->*(m_pOpCop2[(m_nOpcode >> 21) & 0x1F]))();
|
2007-12-07 00:26:56 +00:00
|
|
|
break;
|
|
|
|
case 0x36:
|
|
|
|
//LQC2
|
|
|
|
LQC2();
|
|
|
|
break;
|
|
|
|
case 0x3E:
|
|
|
|
//SQC2
|
|
|
|
SQC2();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
Illegal();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//General Instructions
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
|
|
|
//36
|
|
|
|
void CCOP_VU::LQC2()
|
|
|
|
{
|
2017-02-02 22:44:11 -05:00
|
|
|
if(m_nFT == 0) return;
|
|
|
|
|
2016-07-16 21:32:23 -04:00
|
|
|
ComputeMemAccessPageRef();
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2016-07-16 21:32:23 -04:00
|
|
|
m_codeGen->PushCst(0);
|
2019-04-17 18:57:09 -04:00
|
|
|
m_codeGen->BeginIf(Jitter::CONDITION_NE);
|
2016-07-16 21:32:23 -04:00
|
|
|
{
|
2023-07-21 16:22:15 -04:00
|
|
|
ComputeMemAccessRefIdx(0x10);
|
2016-07-16 21:32:23 -04:00
|
|
|
|
2023-07-21 16:22:15 -04:00
|
|
|
m_codeGen->MD_LoadFromRefIdx(1);
|
2016-07-16 21:32:23 -04:00
|
|
|
m_codeGen->MD_PullRel(offsetof(CMIPS, m_State.nCOP2[m_nFT]));
|
|
|
|
}
|
|
|
|
m_codeGen->Else();
|
|
|
|
{
|
2022-02-10 20:05:07 -05:00
|
|
|
if(m_codeGen->GetCodeGen()->Has128BitsCallOperands())
|
|
|
|
{
|
|
|
|
ComputeMemAccessAddrNoXlat();
|
2016-07-16 21:32:23 -04:00
|
|
|
|
2022-02-10 20:05:07 -05:00
|
|
|
m_codeGen->PushCtx();
|
|
|
|
m_codeGen->PushIdx(1);
|
|
|
|
m_codeGen->Call(reinterpret_cast<void*>(&MemoryUtils_GetQuadProxy), 2, Jitter::CJitter::RETURN_VALUE_128);
|
|
|
|
m_codeGen->MD_PullRel(offsetof(CMIPS, m_State.nCOP2[m_nFT]));
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2022-02-10 20:05:07 -05:00
|
|
|
m_codeGen->PullTop();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_codeGen->Break();
|
|
|
|
}
|
2016-07-16 21:32:23 -04:00
|
|
|
}
|
|
|
|
m_codeGen->EndIf();
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//3E
|
|
|
|
void CCOP_VU::SQC2()
|
|
|
|
{
|
2016-07-16 21:32:23 -04:00
|
|
|
ComputeMemAccessPageRef();
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2016-07-16 21:32:23 -04:00
|
|
|
m_codeGen->PushCst(0);
|
2019-04-17 18:57:09 -04:00
|
|
|
m_codeGen->BeginIf(Jitter::CONDITION_NE);
|
2016-07-16 21:32:23 -04:00
|
|
|
{
|
2023-07-21 16:22:15 -04:00
|
|
|
ComputeMemAccessRefIdx(0x10);
|
2016-07-16 21:32:23 -04:00
|
|
|
|
|
|
|
m_codeGen->MD_PushRel(offsetof(CMIPS, m_State.nCOP2[m_nFT]));
|
2023-07-21 16:22:15 -04:00
|
|
|
m_codeGen->MD_StoreAtRefIdx(1);
|
2016-07-16 21:32:23 -04:00
|
|
|
}
|
|
|
|
m_codeGen->Else();
|
|
|
|
{
|
2022-02-10 20:05:07 -05:00
|
|
|
if(m_codeGen->GetCodeGen()->Has128BitsCallOperands())
|
|
|
|
{
|
|
|
|
ComputeMemAccessAddrNoXlat();
|
2016-07-16 21:32:23 -04:00
|
|
|
|
2022-02-10 20:05:07 -05:00
|
|
|
m_codeGen->PushCtx();
|
|
|
|
m_codeGen->MD_PushRel(offsetof(CMIPS, m_State.nCOP2[m_nFT]));
|
|
|
|
m_codeGen->PushIdx(2);
|
|
|
|
m_codeGen->Call(reinterpret_cast<void*>(&MemoryUtils_SetQuadProxy), 3, Jitter::CJitter::RETURN_VALUE_NONE);
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2022-02-10 20:05:07 -05:00
|
|
|
m_codeGen->PullTop();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_codeGen->Break();
|
|
|
|
}
|
2016-07-16 21:32:23 -04:00
|
|
|
}
|
|
|
|
m_codeGen->EndIf();
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//COP2 Instructions
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
|
|
|
//01
|
|
|
|
void CCOP_VU::QMFC2()
|
|
|
|
{
|
2015-11-07 15:56:35 -05:00
|
|
|
if(m_nFT == 0) return;
|
|
|
|
|
2012-03-18 19:42:30 +00:00
|
|
|
for(unsigned int i = 0; i < 4; i++)
|
|
|
|
{
|
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2[m_nFS].nV[i]));
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nGPR[m_nFT].nV[i]));
|
|
|
|
}
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//02
|
|
|
|
void CCOP_VU::CFC2()
|
|
|
|
{
|
2017-01-22 13:22:30 -05:00
|
|
|
if(m_nFT == 0) return;
|
|
|
|
|
2012-03-18 19:42:30 +00:00
|
|
|
if(m_nFS < 16)
|
|
|
|
{
|
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nFS]));
|
|
|
|
m_codeGen->PushCst(0xFFFF);
|
|
|
|
m_codeGen->And();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
switch(m_nFS)
|
|
|
|
{
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_CLIP:
|
2017-04-11 22:29:12 -04:00
|
|
|
VUShared::CheckFlagPipeline(VUShared::g_pipeInfoClip, m_codeGen, VUShared::LATENCY_MAC);
|
2012-03-18 19:42:30 +00:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2CF));
|
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_STATUS:
|
2017-04-11 22:29:12 -04:00
|
|
|
VUShared::GetStatus(m_codeGen, offsetof(CMIPS, m_State.nCOP2T), VUShared::LATENCY_MAC);
|
2017-01-22 21:25:10 -05:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2T));
|
2015-04-19 14:04:49 -07:00
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_R:
|
2016-07-09 23:31:14 -04:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2R));
|
2012-03-18 19:42:30 +00:00
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_MAC:
|
2017-04-11 22:29:12 -04:00
|
|
|
VUShared::CheckFlagPipeline(VUShared::g_pipeInfoMac, m_codeGen, VUShared::LATENCY_MAC);
|
2016-12-30 20:54:01 -05:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2MF));
|
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_TPC:
|
2018-05-05 11:56:35 -04:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.callMsAddr));
|
|
|
|
m_codeGen->Srl(3);
|
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_FBRST:
|
|
|
|
case CTRL_REG_VPU_STAT:
|
2012-03-18 19:42:30 +00:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nGPR[0].nV[0]));
|
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_I:
|
2012-03-18 19:42:30 +00:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2I));
|
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_Q:
|
2012-03-18 19:42:30 +00:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2Q));
|
|
|
|
break;
|
|
|
|
default:
|
2016-07-09 23:18:01 -04:00
|
|
|
assert(false);
|
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nGPR[0].nV[0]));
|
2012-03-18 19:42:30 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2008-01-20 23:08:56 +00:00
|
|
|
|
2010-11-01 01:05:26 +00:00
|
|
|
m_codeGen->PushTop();
|
2010-09-03 21:13:57 +00:00
|
|
|
m_codeGen->SignExt();
|
2008-01-20 23:08:56 +00:00
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nGPR[m_nFT].nV[1]));
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nGPR[m_nFT].nV[0]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//05
|
|
|
|
void CCOP_VU::QMTC2()
|
|
|
|
{
|
2014-05-23 01:50:00 -04:00
|
|
|
if(m_nFS == 0) return;
|
|
|
|
|
2012-03-18 19:42:30 +00:00
|
|
|
for(unsigned int i = 0; i < 4; i++)
|
|
|
|
{
|
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nGPR[m_nFT].nV[i]));
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2[m_nFS].nV[i]));
|
|
|
|
}
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//06
|
|
|
|
void CCOP_VU::CTC2()
|
|
|
|
{
|
2012-10-09 01:56:38 +00:00
|
|
|
if(m_nFS == 0)
|
|
|
|
{
|
|
|
|
//Moving stuff in VI0 register? (probably synchronizing with VU0 micro subroutine execution)
|
|
|
|
}
|
|
|
|
else if((m_nFS > 0) && (m_nFS < 16))
|
2012-03-18 19:42:30 +00:00
|
|
|
{
|
2013-10-27 03:22:26 +00:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nGPR[m_nFT].nV[0]));
|
|
|
|
m_codeGen->PushCst(0xFFFF);
|
|
|
|
m_codeGen->And();
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nFS]));
|
2012-03-18 19:42:30 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nGPR[m_nFT].nV[0]));
|
|
|
|
|
|
|
|
switch(m_nFS)
|
|
|
|
{
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_STATUS:
|
2015-04-19 14:04:49 -07:00
|
|
|
m_codeGen->PullTop();
|
2017-01-22 21:25:10 -05:00
|
|
|
VUShared::SetStatus(m_codeGen, offsetof(CMIPS, m_State.nGPR[m_nFT].nV[0]));
|
2015-04-19 14:04:49 -07:00
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_MAC:
|
2017-01-21 21:22:14 -05:00
|
|
|
//Read-only register
|
2012-03-18 19:42:30 +00:00
|
|
|
m_codeGen->PullTop();
|
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_CLIP:
|
2017-01-21 21:30:22 -05:00
|
|
|
m_codeGen->PushCst(0xFFFFFF);
|
|
|
|
m_codeGen->And();
|
2016-12-30 18:55:58 -05:00
|
|
|
m_codeGen->PushTop();
|
2012-10-09 01:56:38 +00:00
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2CF));
|
2016-12-30 18:55:58 -05:00
|
|
|
VUShared::ResetFlagPipeline(VUShared::g_pipeInfoClip, m_codeGen);
|
2012-10-09 01:56:38 +00:00
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_R:
|
2016-07-09 23:31:14 -04:00
|
|
|
m_codeGen->PushCst(0x7FFFFF);
|
|
|
|
m_codeGen->And();
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2R));
|
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_I:
|
2012-03-18 19:42:30 +00:00
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2I));
|
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_Q:
|
2020-11-19 15:54:30 -05:00
|
|
|
m_codeGen->PullRel(VUShared::g_pipeInfoQ.heldValue);
|
|
|
|
VUShared::FlushPipeline(VUShared::g_pipeInfoQ, m_codeGen);
|
2014-08-23 18:26:41 -04:00
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_CMSAR0:
|
2017-01-21 21:30:22 -05:00
|
|
|
m_codeGen->PushCst(0xFFFF);
|
|
|
|
m_codeGen->And();
|
2012-10-09 01:56:38 +00:00
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.cmsar0));
|
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_FBRST:
|
2024-08-12 18:06:45 -04:00
|
|
|
{
|
|
|
|
uint32 valueCursor = m_codeGen->GetTopCursor();
|
|
|
|
|
|
|
|
m_codeGen->PushCtx();
|
|
|
|
m_codeGen->PushCursor(valueCursor);
|
|
|
|
m_codeGen->PushCst(CVpu::EE_ADDR_VU_FBRST);
|
|
|
|
m_codeGen->Call(reinterpret_cast<void*>(&MemoryUtils_SetWordProxy), 3, Jitter::CJitter::RETURN_VALUE_NONE);
|
|
|
|
|
2012-03-18 19:42:30 +00:00
|
|
|
m_codeGen->PullTop();
|
2024-08-12 18:06:45 -04:00
|
|
|
}
|
|
|
|
break;
|
2016-12-28 12:47:27 -05:00
|
|
|
case CTRL_REG_CMSAR1:
|
2018-04-30 21:01:23 +01:00
|
|
|
{
|
|
|
|
m_codeGen->PushCst(0xFFFF);
|
|
|
|
m_codeGen->And();
|
|
|
|
uint32 valueCursor = m_codeGen->GetTopCursor();
|
|
|
|
|
|
|
|
m_codeGen->PushCtx();
|
|
|
|
m_codeGen->PushCursor(valueCursor);
|
2022-07-07 16:04:00 -04:00
|
|
|
m_codeGen->PushCst(CVpu::EE_ADDR_VU_CMSAR1);
|
2024-01-17 17:00:22 -05:00
|
|
|
m_codeGen->Call(reinterpret_cast<void*>(&MemoryUtils_SetWordProxy), 3, Jitter::CJitter::RETURN_VALUE_NONE);
|
2024-08-12 18:06:45 -04:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
m_codeGen->PullTop();
|
|
|
|
}
|
|
|
|
break;
|
2012-03-18 19:42:30 +00:00
|
|
|
default:
|
2016-07-09 23:18:01 -04:00
|
|
|
assert(false);
|
|
|
|
m_codeGen->PullTop();
|
2012-03-18 19:42:30 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2016-09-02 18:36:51 -04:00
|
|
|
//08
|
|
|
|
void CCOP_VU::BC2()
|
|
|
|
{
|
|
|
|
//Not implemented
|
|
|
|
//We assume that this is used to check if VU0 is still running
|
|
|
|
//after VCALLMS* is used (used in .hack games)
|
2021-10-14 13:00:45 -04:00
|
|
|
//Also used in Kya: Dark Lineage
|
|
|
|
//For now, we just make it as if VU0 is not running
|
2021-10-14 20:14:28 -04:00
|
|
|
|
2016-09-02 18:36:51 -04:00
|
|
|
uint32 op = (m_nOpcode >> 16) & 0x03;
|
2021-10-14 13:00:45 -04:00
|
|
|
switch(op)
|
|
|
|
{
|
|
|
|
case 0x00:
|
|
|
|
//BC2F
|
|
|
|
//(running == false) -> Branch
|
|
|
|
m_codeGen->PushCst(0);
|
|
|
|
m_codeGen->PushCst(0);
|
|
|
|
Branch(Jitter::CONDITION_EQ);
|
|
|
|
break;
|
|
|
|
case 0x01:
|
|
|
|
//BC2T
|
|
|
|
//(running == false) -> Do not branch
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
Illegal();
|
|
|
|
break;
|
|
|
|
}
|
2016-09-02 18:36:51 -04:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//10-1F
|
|
|
|
void CCOP_VU::V()
|
|
|
|
{
|
2009-03-30 04:57:52 +00:00
|
|
|
((this)->*(m_pOpVector[(m_nOpcode & 0x3F)]))();
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//Vector Instructions
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
|
|
|
//00
|
|
|
|
//01
|
|
|
|
//02
|
|
|
|
//03
|
|
|
|
void CCOP_VU::VADDbc()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::ADDbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc, 0, 0);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//04
|
2008-06-07 17:57:36 +00:00
|
|
|
//05
|
|
|
|
//06
|
|
|
|
//07
|
2007-12-07 00:26:56 +00:00
|
|
|
void CCOP_VU::VSUBbc()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::SUBbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc, 0, 0);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2008-06-07 17:57:36 +00:00
|
|
|
//08
|
|
|
|
//09
|
|
|
|
//0A
|
2007-12-07 00:26:56 +00:00
|
|
|
//0B
|
|
|
|
void CCOP_VU::VMADDbc()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MADDbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc, 0, 0);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2008-06-07 17:57:36 +00:00
|
|
|
//0C
|
|
|
|
//0D
|
|
|
|
//0E
|
|
|
|
//0F
|
|
|
|
void CCOP_VU::VMSUBbc()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MSUBbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc, 0, 0);
|
2008-06-07 17:57:36 +00:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//10
|
2009-12-07 02:41:40 +00:00
|
|
|
//11
|
2011-10-23 20:22:29 +00:00
|
|
|
//12
|
|
|
|
//13
|
2007-12-07 00:26:56 +00:00
|
|
|
void CCOP_VU::VMAXbc()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::MAXbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//14
|
2009-12-16 05:55:51 +00:00
|
|
|
//15
|
2015-03-30 00:58:42 -04:00
|
|
|
//16
|
2009-12-06 21:46:12 +00:00
|
|
|
//17
|
2007-12-07 00:26:56 +00:00
|
|
|
void CCOP_VU::VMINIbc()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::MINIbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//18
|
2008-06-07 17:57:36 +00:00
|
|
|
//19
|
|
|
|
//1A
|
2007-12-07 00:26:56 +00:00
|
|
|
//1B
|
|
|
|
void CCOP_VU::VMULbc()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MULbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc, 0, 0);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//1C
|
|
|
|
void CCOP_VU::VMULq()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MULq(m_codeGen, m_nDest, m_nFD, m_nFS, 0, 0);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2016-05-16 20:52:09 -04:00
|
|
|
//1D
|
|
|
|
void CCOP_VU::VMAXi()
|
|
|
|
{
|
|
|
|
VUShared::MAXi(m_codeGen, m_nDest, m_nFD, m_nFS);
|
|
|
|
}
|
|
|
|
|
2012-04-01 00:57:23 +00:00
|
|
|
//1E
|
|
|
|
void CCOP_VU::VMULi()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MULi(m_codeGen, m_nDest, m_nFD, m_nFS, 0, 0);
|
2012-04-01 00:57:23 +00:00
|
|
|
}
|
|
|
|
|
2009-10-12 00:34:24 +00:00
|
|
|
//1F
|
|
|
|
void CCOP_VU::VMINIi()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::MINIi(m_codeGen, m_nDest, m_nFD, m_nFS);
|
2009-10-12 00:34:24 +00:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//20
|
|
|
|
void CCOP_VU::VADDq()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::ADDq(m_codeGen, m_nDest, m_nFD, m_nFS, 0, 0);
|
2011-11-22 06:40:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//21
|
|
|
|
void CCOP_VU::VMADDq()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MADDq(m_codeGen, m_nDest, m_nFD, m_nFS, 0, 0);
|
2011-11-22 06:40:29 +00:00
|
|
|
}
|
|
|
|
|
2016-06-29 22:52:48 -04:00
|
|
|
//22
|
|
|
|
void CCOP_VU::VADDi()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::ADDi(m_codeGen, m_nDest, m_nFD, m_nFS, 0, 0);
|
2016-06-29 22:52:48 -04:00
|
|
|
}
|
|
|
|
|
2012-05-02 03:46:45 +00:00
|
|
|
//23
|
|
|
|
void CCOP_VU::VMADDi()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MADDi(m_codeGen, m_nDest, m_nFD, m_nFS, 0, 0);
|
2012-05-02 03:46:45 +00:00
|
|
|
}
|
|
|
|
|
2015-05-08 21:31:32 -04:00
|
|
|
//24
|
|
|
|
void CCOP_VU::VSUBq()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::SUBq(m_codeGen, m_nDest, m_nFD, m_nFS, 0, 0);
|
2015-05-08 21:31:32 -04:00
|
|
|
}
|
|
|
|
|
2011-11-22 06:40:29 +00:00
|
|
|
//25
|
|
|
|
void CCOP_VU::VMSUBq()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MSUBq(m_codeGen, m_nDest, m_nFD, m_nFS, 0, 0);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2015-03-08 23:28:30 -05:00
|
|
|
//26
|
|
|
|
void CCOP_VU::VSUBi()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::SUBi(m_codeGen, m_nDest, m_nFD, m_nFS, 0, 0);
|
2015-03-08 23:28:30 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
//27
|
|
|
|
void CCOP_VU::VMSUBi()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MSUBi(m_codeGen, m_nDest, m_nFD, m_nFS, 0, 0);
|
2015-03-08 23:28:30 -05:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//28
|
|
|
|
void CCOP_VU::VADD()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::ADD(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, 0, 0);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2011-10-23 20:22:29 +00:00
|
|
|
//29
|
|
|
|
void CCOP_VU::VMADD()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MADD(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, 0, 0);
|
2011-10-23 20:22:29 +00:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//2A
|
|
|
|
void CCOP_VU::VMUL()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MUL(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, 0, 0);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//2B
|
|
|
|
void CCOP_VU::VMAX()
|
|
|
|
{
|
2008-03-16 22:31:37 +00:00
|
|
|
VUShared::MAX(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//2C
|
|
|
|
void CCOP_VU::VSUB()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::SUB(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, 0, 0);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2011-11-22 06:40:29 +00:00
|
|
|
//2D
|
|
|
|
void CCOP_VU::VMSUB()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MSUB(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, 0, 0);
|
2011-11-22 06:40:29 +00:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//2E
|
|
|
|
void CCOP_VU::VOPMSUB()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::OPMSUB(m_codeGen, m_nFD, m_nFS, m_nFT, 0, 0);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//2F
|
|
|
|
void CCOP_VU::VMINI()
|
|
|
|
{
|
2008-03-16 22:31:37 +00:00
|
|
|
VUShared::MINI(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2012-06-22 05:05:20 +00:00
|
|
|
//30
|
|
|
|
void CCOP_VU::VIADD()
|
|
|
|
{
|
|
|
|
VUShared::IADD(m_codeGen, m_nID, m_nIS, m_nIT);
|
|
|
|
}
|
|
|
|
|
2015-05-09 19:10:37 -04:00
|
|
|
//31
|
|
|
|
void CCOP_VU::VISUB()
|
|
|
|
{
|
|
|
|
VUShared::ISUB(m_codeGen, m_nID, m_nIS, m_nIT);
|
|
|
|
}
|
|
|
|
|
2011-10-23 20:22:29 +00:00
|
|
|
//32
|
|
|
|
void CCOP_VU::VIADDI()
|
|
|
|
{
|
|
|
|
VUShared::IADDI(m_codeGen, m_nIT, m_nIS, m_nImm5);
|
|
|
|
}
|
|
|
|
|
2015-05-09 19:10:37 -04:00
|
|
|
//34
|
|
|
|
void CCOP_VU::VIAND()
|
|
|
|
{
|
|
|
|
VUShared::IAND(m_codeGen, m_nID, m_nIS, m_nIT);
|
|
|
|
}
|
|
|
|
|
2015-03-14 04:28:51 -04:00
|
|
|
//35
|
|
|
|
void CCOP_VU::VIOR()
|
|
|
|
{
|
|
|
|
VUShared::IOR(m_codeGen, m_nID, m_nIS, m_nIT);
|
|
|
|
}
|
|
|
|
|
2011-10-23 20:22:29 +00:00
|
|
|
//38
|
|
|
|
void CCOP_VU::VCALLMS()
|
|
|
|
{
|
|
|
|
m_codeGen->PushCst(1);
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.callMsEnabled));
|
|
|
|
|
|
|
|
m_codeGen->PushCst(static_cast<uint32>(m_nImm15) * 8);
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.callMsAddr));
|
|
|
|
|
2024-08-12 18:06:45 -04:00
|
|
|
m_codeGen->PushCst(MIPS_EXCEPTION_VU_CALLMS);
|
2011-10-23 20:22:29 +00:00
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nHasException));
|
|
|
|
}
|
|
|
|
|
2012-10-09 01:56:38 +00:00
|
|
|
//39
|
|
|
|
void CCOP_VU::VCALLMSR()
|
|
|
|
{
|
|
|
|
m_codeGen->PushCst(1);
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.callMsEnabled));
|
|
|
|
|
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.cmsar0));
|
|
|
|
m_codeGen->Shl(3);
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.callMsAddr));
|
|
|
|
|
2024-08-12 18:06:45 -04:00
|
|
|
m_codeGen->PushCst(MIPS_EXCEPTION_VU_CALLMS);
|
2012-10-09 01:56:38 +00:00
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nHasException));
|
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//3C
|
|
|
|
void CCOP_VU::VX0()
|
|
|
|
{
|
2009-03-30 04:57:52 +00:00
|
|
|
((this)->*(m_pOpVx0[(m_nOpcode >> 6) & 0x1F]))();
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//3D
|
|
|
|
void CCOP_VU::VX1()
|
|
|
|
{
|
2009-03-30 04:57:52 +00:00
|
|
|
((this)->*(m_pOpVx1[(m_nOpcode >> 6) & 0x1F]))();
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//3E
|
|
|
|
void CCOP_VU::VX2()
|
|
|
|
{
|
2009-03-30 04:57:52 +00:00
|
|
|
((this)->*(m_pOpVx2[(m_nOpcode >> 6) & 0x1F]))();
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//3F
|
|
|
|
void CCOP_VU::VX3()
|
|
|
|
{
|
2009-03-30 04:57:52 +00:00
|
|
|
((this)->*(m_pOpVx3[(m_nOpcode >> 6) & 0x1F]))();
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//Vx Common Instructions
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
|
|
|
//
|
2008-06-07 17:57:36 +00:00
|
|
|
void CCOP_VU::VADDAbc()
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::ADDAbc(m_codeGen, m_nDest, m_nFS, m_nFT, m_nBc, 0, 0);
|
2008-06-07 17:57:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
void CCOP_VU::VSUBAbc()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::SUBAbc(m_codeGen, m_nDest, m_nFS, m_nFT, m_nBc, 0, 0);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
void CCOP_VU::VMADDAbc()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MADDAbc(m_codeGen, m_nDest, m_nFS, m_nFT, m_nBc, 0, 0);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2008-06-07 17:57:36 +00:00
|
|
|
//
|
|
|
|
void CCOP_VU::VMSUBAbc()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MSUBAbc(m_codeGen, m_nDest, m_nFS, m_nFT, m_nBc, 0, 0);
|
2008-06-07 17:57:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
void CCOP_VU::VMULAbc()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MULAbc(m_codeGen, m_nDest, m_nFS, m_nFT, m_nBc, 0, 0);
|
2008-06-07 17:57:36 +00:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//V0 Instructions
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
|
|
|
//04
|
|
|
|
void CCOP_VU::VITOF0()
|
|
|
|
{
|
2008-03-16 22:31:37 +00:00
|
|
|
VUShared::ITOF0(m_codeGen, m_nDest, m_nFT, m_nFS);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//05
|
|
|
|
void CCOP_VU::VFTOI0()
|
|
|
|
{
|
2008-03-06 03:14:33 +00:00
|
|
|
VUShared::FTOI0(m_codeGen, m_nDest, m_nFT, m_nFS);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2011-11-22 06:40:29 +00:00
|
|
|
//07
|
|
|
|
void CCOP_VU::VMULAq()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MULAq(m_codeGen, m_nDest, m_nFS, 0, 0);
|
2011-11-22 06:40:29 +00:00
|
|
|
}
|
|
|
|
|
2021-12-21 16:16:43 -05:00
|
|
|
//08
|
|
|
|
void CCOP_VU::VADDAq()
|
|
|
|
{
|
|
|
|
VUShared::ADDAq(m_codeGen, m_nDest, m_nFS, 0, 0);
|
|
|
|
}
|
|
|
|
|
2008-06-07 17:57:36 +00:00
|
|
|
//0A
|
|
|
|
void CCOP_VU::VADDA()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::ADDA(m_codeGen, m_nDest, m_nFS, m_nFT, 0, 0);
|
2008-06-07 17:57:36 +00:00
|
|
|
}
|
|
|
|
|
2015-01-01 18:13:24 -05:00
|
|
|
//0B
|
|
|
|
void CCOP_VU::VSUBA()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::SUBA(m_codeGen, m_nDest, m_nFS, m_nFT, 0, 0);
|
2015-01-01 18:13:24 -05:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//0C
|
|
|
|
void CCOP_VU::VMOVE()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::MOVE(m_codeGen, m_nDest, m_nFT, m_nFS);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2015-02-18 22:30:48 -05:00
|
|
|
//0D
|
|
|
|
void CCOP_VU::VLQI()
|
|
|
|
{
|
2024-07-31 11:46:37 -04:00
|
|
|
VUShared::LQI(m_codeGen, m_nDest, m_nIT, m_nIS, m_vuMemAddressMask, &CCOP_VU::EmitVu1AreaReadHandler);
|
2015-02-18 22:30:48 -05:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//0E
|
|
|
|
void CCOP_VU::VDIV()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::DIV(m_codeGen, m_nFS, m_nFSF, m_nFT, m_nFTF, 0);
|
2018-01-30 13:17:09 -05:00
|
|
|
VUShared::FlushPipeline(VUShared::g_pipeInfoQ, m_codeGen);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2012-06-22 05:05:20 +00:00
|
|
|
//0F
|
|
|
|
void CCOP_VU::VMTIR()
|
|
|
|
{
|
|
|
|
VUShared::MTIR(m_codeGen, m_nIT, m_nIS, m_nFSF);
|
|
|
|
}
|
|
|
|
|
2008-06-07 17:57:36 +00:00
|
|
|
//10
|
|
|
|
void CCOP_VU::VRNEXT()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::RNEXT(m_codeGen, m_nDest, m_nFT);
|
2008-06-07 17:57:36 +00:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//V1 Instructions
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
2008-06-23 01:35:05 +00:00
|
|
|
//04
|
|
|
|
void CCOP_VU::VITOF4()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::ITOF4(m_codeGen, m_nDest, m_nFT, m_nFS);
|
2008-06-23 01:35:05 +00:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//05
|
|
|
|
void CCOP_VU::VFTOI4()
|
|
|
|
{
|
2008-03-06 03:14:33 +00:00
|
|
|
VUShared::FTOI4(m_codeGen, m_nDest, m_nFT, m_nFS);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2009-09-30 00:53:08 +00:00
|
|
|
//07
|
|
|
|
void CCOP_VU::VABS()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::ABS(m_codeGen, m_nDest, m_nFT, m_nFS);
|
2009-09-30 00:53:08 +00:00
|
|
|
}
|
|
|
|
|
2017-08-15 10:00:01 -04:00
|
|
|
//08
|
|
|
|
void CCOP_VU::VMADDAq()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MADDAq(m_codeGen, m_nDest, m_nFS, 0, 0);
|
2017-08-15 10:00:01 -04:00
|
|
|
}
|
|
|
|
|
2017-08-15 09:57:49 -04:00
|
|
|
//09
|
|
|
|
void CCOP_VU::VMSUBAq()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MSUBAq(m_codeGen, m_nDest, m_nFS, 0, 0);
|
2017-08-15 09:57:49 -04:00
|
|
|
}
|
|
|
|
|
2012-10-09 01:56:38 +00:00
|
|
|
//0A
|
|
|
|
void CCOP_VU::VMADDA()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MADDA(m_codeGen, m_nDest, m_nFS, m_nFT, 0, 0);
|
2012-10-09 01:56:38 +00:00
|
|
|
}
|
|
|
|
|
2011-11-22 06:40:29 +00:00
|
|
|
//0B
|
|
|
|
void CCOP_VU::VMSUBA()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MSUBA(m_codeGen, m_nDest, m_nFS, m_nFT, 0, 0);
|
2011-11-22 06:40:29 +00:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//0C
|
|
|
|
void CCOP_VU::VMR32()
|
|
|
|
{
|
2008-02-27 02:23:28 +00:00
|
|
|
VUShared::MR32(m_codeGen, m_nDest, m_nFT, m_nFS);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2011-10-23 20:22:29 +00:00
|
|
|
//0D
|
|
|
|
void CCOP_VU::VSQI()
|
|
|
|
{
|
2022-07-07 16:54:22 -04:00
|
|
|
VUShared::SQI(m_codeGen, m_nDest, m_nIS, m_nIT, m_vuMemAddressMask, &CCOP_VU::EmitVu1AreaWriteHandler);
|
2011-10-23 20:22:29 +00:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//0E
|
|
|
|
void CCOP_VU::VSQRT()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::SQRT(m_codeGen, m_nFT, m_nFTF, 0);
|
2018-01-30 13:17:09 -05:00
|
|
|
VUShared::FlushPipeline(VUShared::g_pipeInfoQ, m_codeGen);
|
2011-10-23 20:22:29 +00:00
|
|
|
}
|
|
|
|
|
2012-10-21 01:30:33 +00:00
|
|
|
//0F
|
|
|
|
void CCOP_VU::VMFIR()
|
|
|
|
{
|
|
|
|
VUShared::MFIR(m_codeGen, m_nDest, m_nIT, m_nIS);
|
|
|
|
}
|
|
|
|
|
2011-10-23 20:22:29 +00:00
|
|
|
//10
|
|
|
|
void CCOP_VU::VRGET()
|
|
|
|
{
|
|
|
|
VUShared::RGET(m_codeGen, m_nDest, m_nFT);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//V2 Instructions
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
2009-09-24 02:37:56 +00:00
|
|
|
//04
|
|
|
|
void CCOP_VU::VITOF12()
|
|
|
|
{
|
|
|
|
VUShared::ITOF12(m_codeGen, m_nDest, m_nFT, m_nFS);
|
|
|
|
}
|
|
|
|
|
2009-12-16 05:55:51 +00:00
|
|
|
//05
|
|
|
|
void CCOP_VU::VFTOI12()
|
|
|
|
{
|
|
|
|
VUShared::FTOI12(m_codeGen, m_nDest, m_nFT, m_nFS);
|
|
|
|
}
|
|
|
|
|
2012-05-02 03:46:45 +00:00
|
|
|
//07
|
|
|
|
void CCOP_VU::VMULAi()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MULAi(m_codeGen, m_nDest, m_nFS, 0, 0);
|
2012-05-02 03:46:45 +00:00
|
|
|
}
|
|
|
|
|
2021-05-19 16:26:21 -04:00
|
|
|
//08
|
|
|
|
void CCOP_VU::VADDAi()
|
|
|
|
{
|
|
|
|
VUShared::ADDAi(m_codeGen, m_nDest, m_nFS, 0, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
//09
|
|
|
|
void CCOP_VU::VSUBAi()
|
|
|
|
{
|
|
|
|
VUShared::SUBAi(m_codeGen, m_nDest, m_nFS, 0, 0);
|
|
|
|
}
|
|
|
|
|
2011-10-23 20:22:29 +00:00
|
|
|
//0A
|
|
|
|
void CCOP_VU::VMULA()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MULA(m_codeGen, m_nDest, m_nFS, m_nFT, 0, 0);
|
2011-10-23 20:22:29 +00:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//0B
|
|
|
|
void CCOP_VU::VOPMULA()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::OPMULA(m_codeGen, m_nFS, m_nFT);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2016-04-06 10:41:17 -04:00
|
|
|
//0D
|
|
|
|
void CCOP_VU::VLQD()
|
|
|
|
{
|
2017-03-31 23:11:46 -04:00
|
|
|
VUShared::LQD(m_codeGen, m_nDest, m_nIT, m_nIS, m_vuMemAddressMask);
|
2016-04-06 10:41:17 -04:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//0E
|
|
|
|
void CCOP_VU::VRSQRT()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::RSQRT(m_codeGen, m_nFS, m_nFSF, m_nFT, m_nFTF, 0);
|
2018-01-30 13:17:09 -05:00
|
|
|
VUShared::FlushPipeline(VUShared::g_pipeInfoQ, m_codeGen);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2014-10-02 00:12:18 -04:00
|
|
|
//0F
|
|
|
|
void CCOP_VU::VILWR()
|
|
|
|
{
|
2017-03-31 23:11:46 -04:00
|
|
|
VUShared::ILWR(m_codeGen, m_nDest, m_nIT, m_nIS, m_vuMemAddressMask);
|
2014-10-02 00:12:18 -04:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//10
|
|
|
|
void CCOP_VU::VRINIT()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::RINIT(m_codeGen, m_nFS, m_nFSF);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//V3 Instructions
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
2008-06-09 00:06:58 +00:00
|
|
|
//04
|
|
|
|
void CCOP_VU::VITOF15()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::ITOF15(m_codeGen, m_nDest, m_nFT, m_nFS);
|
2008-06-09 00:06:58 +00:00
|
|
|
}
|
|
|
|
|
2013-10-27 03:22:26 +00:00
|
|
|
//05
|
|
|
|
void CCOP_VU::VFTOI15()
|
|
|
|
{
|
|
|
|
VUShared::FTOI15(m_codeGen, m_nDest, m_nFT, m_nFS);
|
|
|
|
}
|
|
|
|
|
2008-06-07 17:57:36 +00:00
|
|
|
//07
|
|
|
|
void CCOP_VU::VCLIP()
|
|
|
|
{
|
2016-12-30 18:55:58 -05:00
|
|
|
VUShared::CLIP(m_codeGen, m_nFS, m_nFT, 0);
|
2008-06-07 17:57:36 +00:00
|
|
|
}
|
|
|
|
|
2015-03-11 00:19:18 -04:00
|
|
|
//08
|
2015-03-08 23:28:30 -05:00
|
|
|
void CCOP_VU::VMADDAi()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MADDAi(m_codeGen, m_nDest, m_nFS, 0, 0);
|
2015-03-08 23:28:30 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
//09
|
|
|
|
void CCOP_VU::VMSUBAi()
|
|
|
|
{
|
2019-10-22 08:04:52 -04:00
|
|
|
VUShared::MSUBAi(m_codeGen, m_nDest, m_nFS, 0, 0);
|
2015-03-08 23:28:30 -05:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//0B
|
|
|
|
void CCOP_VU::VNOP()
|
|
|
|
{
|
|
|
|
//Nothing to do
|
|
|
|
}
|
|
|
|
|
2015-06-03 01:50:25 -04:00
|
|
|
//0D
|
|
|
|
void CCOP_VU::VSQD()
|
|
|
|
{
|
2017-03-31 23:11:46 -04:00
|
|
|
VUShared::SQD(m_codeGen, m_nDest, m_nIS, m_nIT, m_vuMemAddressMask);
|
2015-06-03 01:50:25 -04:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//0E
|
|
|
|
void CCOP_VU::VWAITQ()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::WAITQ(m_codeGen);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2014-10-02 00:12:18 -04:00
|
|
|
//0F
|
|
|
|
void CCOP_VU::VISWR()
|
|
|
|
{
|
2017-03-31 23:11:46 -04:00
|
|
|
VUShared::ISWR(m_codeGen, m_nDest, m_nIT, m_nIS, m_vuMemAddressMask);
|
2014-10-02 00:12:18 -04:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//10
|
|
|
|
void CCOP_VU::VRXOR()
|
|
|
|
{
|
2012-03-18 01:52:44 +00:00
|
|
|
VUShared::RXOR(m_codeGen, m_nFS, m_nFSF);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2022-07-07 16:54:22 -04:00
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//Helpers
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
2024-07-31 11:46:37 -04:00
|
|
|
void CCOP_VU::EmitVu1AreaReadHandler(CMipsJitter* codeGen, uint8 is, uint8 it)
|
|
|
|
{
|
|
|
|
codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[is]));
|
|
|
|
codeGen->Shl(4);
|
|
|
|
codeGen->PushCst(CVpu::VU_ADDR_VU1AREA_START);
|
|
|
|
codeGen->Sub();
|
|
|
|
codeGen->PushCst(CVpu::EE_ADDR_VU1AREA_START);
|
|
|
|
codeGen->Add();
|
|
|
|
|
|
|
|
for(unsigned int i = 0; i < 4; i++)
|
|
|
|
{
|
|
|
|
codeGen->PushCtx();
|
|
|
|
codeGen->PushIdx(1);
|
|
|
|
codeGen->Call(reinterpret_cast<void*>(&MemoryUtils_GetWordProxy), 2, Jitter::CJitter::RETURN_VALUE_32);
|
|
|
|
codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2[it].nV[i]));
|
|
|
|
|
|
|
|
codeGen->PushCst(4);
|
|
|
|
codeGen->Add();
|
|
|
|
}
|
|
|
|
|
|
|
|
codeGen->PullTop();
|
|
|
|
}
|
|
|
|
|
2022-07-07 16:54:22 -04:00
|
|
|
void CCOP_VU::EmitVu1AreaWriteHandler(CMipsJitter* codeGen, uint8 is, uint8 it)
|
|
|
|
{
|
|
|
|
codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[it]));
|
|
|
|
codeGen->Shl(4);
|
|
|
|
codeGen->PushCst(CVpu::VU_ADDR_VU1AREA_START);
|
|
|
|
codeGen->Sub();
|
|
|
|
codeGen->PushCst(CVpu::EE_ADDR_VU1AREA_START);
|
|
|
|
codeGen->Add();
|
|
|
|
|
2022-07-07 19:49:49 -04:00
|
|
|
for(unsigned int i = 0; i < 4; i++)
|
2022-07-07 16:54:22 -04:00
|
|
|
{
|
|
|
|
codeGen->PushCtx();
|
|
|
|
codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2[is].nV[i]));
|
|
|
|
codeGen->PushIdx(2);
|
|
|
|
codeGen->Call(reinterpret_cast<void*>(&MemoryUtils_SetWordProxy), 3, Jitter::CJitter::RETURN_VALUE_NONE);
|
|
|
|
|
|
|
|
codeGen->PushCst(4);
|
|
|
|
codeGen->Add();
|
|
|
|
}
|
|
|
|
|
|
|
|
codeGen->PullTop();
|
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//Opcode Tables
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
2018-04-30 11:19:06 -04:00
|
|
|
// clang-format off
|
2009-03-30 04:57:52 +00:00
|
|
|
CCOP_VU::InstructionFuncConstant CCOP_VU::m_pOpCop2[0x20] =
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
|
|
|
//0x00
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_VU::Illegal, &CCOP_VU::QMFC2, &CCOP_VU::CFC2, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::QMTC2, &CCOP_VU::CTC2, &CCOP_VU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x08
|
2016-09-02 18:36:51 -04:00
|
|
|
&CCOP_VU::BC2, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x10
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x18
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V,
|
2007-12-07 00:26:56 +00:00
|
|
|
};
|
|
|
|
|
2009-03-30 04:57:52 +00:00
|
|
|
CCOP_VU::InstructionFuncConstant CCOP_VU::m_pOpVector[0x40] =
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
|
|
|
//0x00
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_VU::VADDbc, &CCOP_VU::VADDbc, &CCOP_VU::VADDbc, &CCOP_VU::VADDbc, &CCOP_VU::VSUBbc, &CCOP_VU::VSUBbc, &CCOP_VU::VSUBbc, &CCOP_VU::VSUBbc,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x08
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_VU::VMADDbc, &CCOP_VU::VMADDbc, &CCOP_VU::VMADDbc, &CCOP_VU::VMADDbc, &CCOP_VU::VMSUBbc, &CCOP_VU::VMSUBbc, &CCOP_VU::VMSUBbc, &CCOP_VU::VMSUBbc,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x10
|
2015-03-30 00:58:42 -04:00
|
|
|
&CCOP_VU::VMAXbc, &CCOP_VU::VMAXbc, &CCOP_VU::VMAXbc, &CCOP_VU::VMAXbc, &CCOP_VU::VMINIbc, &CCOP_VU::VMINIbc, &CCOP_VU::VMINIbc, &CCOP_VU::VMINIbc,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x18
|
2016-05-16 20:52:09 -04:00
|
|
|
&CCOP_VU::VMULbc, &CCOP_VU::VMULbc, &CCOP_VU::VMULbc, &CCOP_VU::VMULbc, &CCOP_VU::VMULq, &CCOP_VU::VMAXi, &CCOP_VU::VMULi, &CCOP_VU::VMINIi,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x20
|
2016-06-29 22:52:48 -04:00
|
|
|
&CCOP_VU::VADDq, &CCOP_VU::VMADDq, &CCOP_VU::VADDi, &CCOP_VU::VMADDi, &CCOP_VU::VSUBq, &CCOP_VU::VMSUBq, &CCOP_VU::VSUBi, &CCOP_VU::VMSUBi,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x28
|
2011-11-22 06:40:29 +00:00
|
|
|
&CCOP_VU::VADD, &CCOP_VU::VMADD, &CCOP_VU::VMUL, &CCOP_VU::VMAX, &CCOP_VU::VSUB, &CCOP_VU::VMSUB, &CCOP_VU::VOPMSUB, &CCOP_VU::VMINI,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x30
|
2015-05-09 19:10:37 -04:00
|
|
|
&CCOP_VU::VIADD, &CCOP_VU::VISUB, &CCOP_VU::VIADDI, &CCOP_VU::Illegal, &CCOP_VU::VIAND, &CCOP_VU::VIOR, &CCOP_VU::Illegal, &CCOP_VU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x38
|
2012-10-09 01:56:38 +00:00
|
|
|
&CCOP_VU::VCALLMS, &CCOP_VU::VCALLMSR, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::VX0, &CCOP_VU::VX1, &CCOP_VU::VX2, &CCOP_VU::VX3,
|
2007-12-07 00:26:56 +00:00
|
|
|
};
|
|
|
|
|
2009-03-30 04:57:52 +00:00
|
|
|
CCOP_VU::InstructionFuncConstant CCOP_VU::m_pOpVx0[0x20] =
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
|
|
|
//0x00
|
2011-11-22 06:40:29 +00:00
|
|
|
&CCOP_VU::VADDAbc, &CCOP_VU::VSUBAbc, &CCOP_VU::VMADDAbc, &CCOP_VU::VMSUBAbc, &CCOP_VU::VITOF0, &CCOP_VU::VFTOI0, &CCOP_VU::VMULAbc, &CCOP_VU::VMULAq,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x08
|
2021-12-21 16:16:43 -05:00
|
|
|
&CCOP_VU::VADDAq, &CCOP_VU::Illegal, &CCOP_VU::VADDA, &CCOP_VU::VSUBA, &CCOP_VU::VMOVE, &CCOP_VU::VLQI, &CCOP_VU::VDIV, &CCOP_VU::VMTIR,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x10
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_VU::VRNEXT, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x18
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
};
|
|
|
|
|
2009-03-30 04:57:52 +00:00
|
|
|
CCOP_VU::InstructionFuncConstant CCOP_VU::m_pOpVx1[0x20] =
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
|
|
|
//0x00
|
2012-10-09 01:56:38 +00:00
|
|
|
&CCOP_VU::VADDAbc, &CCOP_VU::VSUBAbc, &CCOP_VU::VMADDAbc, &CCOP_VU::VMSUBAbc, &CCOP_VU::VITOF4, &CCOP_VU::VFTOI4, &CCOP_VU::VMULAbc, &CCOP_VU::VABS,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x08
|
2017-08-15 10:00:01 -04:00
|
|
|
&CCOP_VU::VMADDAq, &CCOP_VU::VMSUBAq, &CCOP_VU::VMADDA, &CCOP_VU::VMSUBA, &CCOP_VU::VMR32, &CCOP_VU::VSQI, &CCOP_VU::VSQRT, &CCOP_VU::VMFIR,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x10
|
2011-10-23 20:22:29 +00:00
|
|
|
&CCOP_VU::VRGET, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x18
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
};
|
|
|
|
|
2009-03-30 04:57:52 +00:00
|
|
|
CCOP_VU::InstructionFuncConstant CCOP_VU::m_pOpVx2[0x20] =
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
|
|
|
//0x00
|
2012-05-02 03:46:45 +00:00
|
|
|
&CCOP_VU::VADDAbc, &CCOP_VU::VSUBAbc, &CCOP_VU::VMADDAbc, &CCOP_VU::VMSUBAbc, &CCOP_VU::VITOF12, &CCOP_VU::VFTOI12, &CCOP_VU::VMULAbc, &CCOP_VU::VMULAi,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x08
|
2021-05-19 16:26:21 -04:00
|
|
|
&CCOP_VU::VADDAi, &CCOP_VU::VSUBAi, &CCOP_VU::VMULA, &CCOP_VU::VOPMULA, &CCOP_VU::Illegal, &CCOP_VU::VLQD, &CCOP_VU::VRSQRT, &CCOP_VU::VILWR,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x10
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_VU::VRINIT, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x18
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
};
|
|
|
|
|
2009-03-30 04:57:52 +00:00
|
|
|
CCOP_VU::InstructionFuncConstant CCOP_VU::m_pOpVx3[0x20] =
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
|
|
|
//0x00
|
2013-10-27 03:22:26 +00:00
|
|
|
&CCOP_VU::VADDAbc, &CCOP_VU::VSUBAbc, &CCOP_VU::VMADDAbc, &CCOP_VU::VMSUBAbc, &CCOP_VU::VITOF15, &CCOP_VU::VFTOI15, &CCOP_VU::VMULAbc, &CCOP_VU::VCLIP,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x08
|
2015-06-03 01:50:25 -04:00
|
|
|
&CCOP_VU::VMADDAi, &CCOP_VU::VMSUBAi, &CCOP_VU::Illegal, &CCOP_VU::VNOP, &CCOP_VU::Illegal, &CCOP_VU::VSQD, &CCOP_VU::VWAITQ, &CCOP_VU::VISWR,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x10
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_VU::VRXOR, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x18
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
};
|
2018-04-30 11:19:06 -04:00
|
|
|
// clang-format on
|