2007-12-07 00:26:56 +00:00
|
|
|
#include <string.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "COP_FPU.h"
|
|
|
|
#include "MIPS.h"
|
2010-08-11 03:47:19 +00:00
|
|
|
#include "Jitter.h"
|
2007-12-11 07:05:37 +00:00
|
|
|
#include "offsetof_def.h"
|
2008-04-09 02:52:38 +00:00
|
|
|
#include "MemoryUtils.h"
|
2018-12-01 21:33:25 -05:00
|
|
|
#include "FpUtils.h"
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2024-01-26 13:35:56 -05:00
|
|
|
// clang-format off
|
2014-09-28 02:37:55 -04:00
|
|
|
const uint32 CCOP_FPU::m_ccMask[8] =
|
2024-01-26 13:35:56 -05:00
|
|
|
{
|
|
|
|
0x00800000,
|
|
|
|
0x02000000,
|
|
|
|
0x04000000,
|
|
|
|
0x08000000,
|
|
|
|
0x10000000,
|
|
|
|
0x20000000,
|
|
|
|
0x40000000,
|
|
|
|
0x80000000
|
|
|
|
};
|
|
|
|
// clang-format on
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2014-09-28 02:37:55 -04:00
|
|
|
CCOP_FPU::CCOP_FPU(MIPS_REGSIZE regSize)
|
2018-04-30 21:01:23 +01:00
|
|
|
: CMIPSCoprocessor(regSize)
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
|
|
|
SetupReflectionTables();
|
|
|
|
}
|
|
|
|
|
2022-10-18 20:01:20 +01:00
|
|
|
void CCOP_FPU::CompileInstruction(uint32 address, CMipsJitter* codeGen, CMIPS* ctx, uint32 instrPosition)
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
2022-10-18 20:01:20 +01:00
|
|
|
SetupQuickVariables(address, codeGen, ctx, instrPosition);
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2014-09-28 02:37:55 -04:00
|
|
|
m_ft = static_cast<uint8>((m_nOpcode >> 16) & 0x1F);
|
|
|
|
m_fs = static_cast<uint8>((m_nOpcode >> 11) & 0x1F);
|
|
|
|
m_fd = static_cast<uint8>((m_nOpcode >> 6) & 0x1F);
|
2007-12-07 00:26:56 +00:00
|
|
|
|
|
|
|
switch((m_nOpcode >> 26) & 0x3F)
|
|
|
|
{
|
|
|
|
case 0x11:
|
|
|
|
//COP1
|
2014-09-28 02:37:55 -04:00
|
|
|
((this)->*(m_opGeneral[(m_nOpcode >> 21) & 0x1F]))();
|
2007-12-07 00:26:56 +00:00
|
|
|
break;
|
|
|
|
case 0x31:
|
|
|
|
LWC1();
|
|
|
|
break;
|
|
|
|
case 0x39:
|
|
|
|
SWC1();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
Illegal();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-09-28 02:37:55 -04:00
|
|
|
void CCOP_FPU::SetCCBit(bool condition, uint32 mask)
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
2010-08-11 03:47:19 +00:00
|
|
|
m_codeGen->PushCst(0);
|
|
|
|
|
2014-09-28 02:37:55 -04:00
|
|
|
m_codeGen->BeginIf(condition ? Jitter::CONDITION_NE : Jitter::CONDITION_EQ);
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
2007-12-29 17:22:26 +00:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nFCSR));
|
2014-09-28 02:37:55 -04:00
|
|
|
m_codeGen->PushCst(mask);
|
2007-12-29 17:22:26 +00:00
|
|
|
m_codeGen->Or();
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nFCSR));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
2010-08-11 03:47:19 +00:00
|
|
|
m_codeGen->Else();
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
2007-12-29 17:22:26 +00:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nFCSR));
|
2014-09-28 02:37:55 -04:00
|
|
|
m_codeGen->PushCst(~mask);
|
2007-12-29 17:22:26 +00:00
|
|
|
m_codeGen->And();
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nFCSR));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
2007-12-29 17:22:26 +00:00
|
|
|
m_codeGen->EndIf();
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2014-09-28 02:37:55 -04:00
|
|
|
void CCOP_FPU::PushCCBit(uint32 mask)
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
2013-04-14 06:33:04 +00:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nFCSR));
|
2014-09-28 02:37:55 -04:00
|
|
|
m_codeGen->PushCst(mask);
|
2013-04-14 06:33:04 +00:00
|
|
|
m_codeGen->And();
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//General Opcodes
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
|
|
|
//00
|
|
|
|
void CCOP_FPU::MFC1()
|
|
|
|
{
|
2017-01-04 15:07:27 -05:00
|
|
|
if(m_ft == 0)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-09-28 03:09:17 -04:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
2010-08-11 03:47:19 +00:00
|
|
|
if(m_regSize == MIPS_REGSIZE_64)
|
|
|
|
{
|
2010-10-08 00:27:22 +00:00
|
|
|
m_codeGen->PushTop();
|
2013-04-14 06:33:04 +00:00
|
|
|
m_codeGen->SignExt();
|
2014-09-28 02:37:55 -04:00
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nGPR[m_ft].nV[1]));
|
2010-08-11 03:47:19 +00:00
|
|
|
}
|
2014-09-28 02:37:55 -04:00
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nGPR[m_ft].nV[0]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2010-04-29 03:47:06 +00:00
|
|
|
//02
|
|
|
|
void CCOP_FPU::CFC1()
|
|
|
|
{
|
2017-01-04 15:07:27 -05:00
|
|
|
if(m_ft == 0)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-04-13 01:40:25 -04:00
|
|
|
if(m_fs < 16)
|
|
|
|
{
|
|
|
|
//Implementation and Revision Register
|
|
|
|
//Value given away by the PS2 (Impl 46, Revision 3.0)
|
|
|
|
m_codeGen->PushCst(0x2E30);
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nGPR[m_ft].nV[0]));
|
|
|
|
if(m_regSize == MIPS_REGSIZE_64)
|
|
|
|
{
|
|
|
|
m_codeGen->PushCst(0);
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nGPR[m_ft].nV[1]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2010-04-29 03:47:06 +00:00
|
|
|
{
|
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nFCSR));
|
2015-04-11 02:02:05 -04:00
|
|
|
if(m_regSize == MIPS_REGSIZE_64)
|
|
|
|
{
|
|
|
|
m_codeGen->PushTop();
|
|
|
|
m_codeGen->SignExt();
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nGPR[m_ft].nV[1]));
|
|
|
|
}
|
2014-09-28 02:37:55 -04:00
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nGPR[m_ft].nV[0]));
|
2010-04-29 03:47:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//04
|
|
|
|
void CCOP_FPU::MTC1()
|
|
|
|
{
|
2014-09-28 02:37:55 -04:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nGPR[m_ft].nV[0]));
|
2014-09-28 03:09:17 -04:00
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//06
|
|
|
|
void CCOP_FPU::CTC1()
|
|
|
|
{
|
2014-09-28 02:37:55 -04:00
|
|
|
if(m_fs == 31)
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
2017-01-04 15:08:16 -05:00
|
|
|
//Only condition code and status flags are writable
|
|
|
|
static const uint32 FCSR_WRITE_MASK = 0x0083C078;
|
|
|
|
|
2014-09-28 02:37:55 -04:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nGPR[m_ft].nV[0]));
|
2017-01-04 15:08:16 -05:00
|
|
|
m_codeGen->PushCst(FCSR_WRITE_MASK);
|
|
|
|
m_codeGen->And();
|
|
|
|
|
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nFCSR));
|
|
|
|
m_codeGen->PushCst(~FCSR_WRITE_MASK);
|
|
|
|
m_codeGen->And();
|
|
|
|
|
|
|
|
m_codeGen->Or();
|
2008-01-19 03:36:27 +00:00
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nFCSR));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
2013-04-14 06:33:04 +00:00
|
|
|
else
|
|
|
|
{
|
2023-07-11 16:30:52 -04:00
|
|
|
Illegal();
|
2013-04-14 06:33:04 +00:00
|
|
|
}
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//08
|
|
|
|
void CCOP_FPU::BC1()
|
|
|
|
{
|
|
|
|
switch((m_nOpcode >> 16) & 0x03)
|
|
|
|
{
|
|
|
|
case 0x00:
|
|
|
|
BC1F();
|
|
|
|
break;
|
|
|
|
case 0x01:
|
|
|
|
BC1T();
|
|
|
|
break;
|
|
|
|
case 0x02:
|
|
|
|
BC1FL();
|
|
|
|
break;
|
|
|
|
case 0x03:
|
|
|
|
BC1TL();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
Illegal();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//10
|
|
|
|
void CCOP_FPU::S()
|
|
|
|
{
|
2014-09-28 02:37:55 -04:00
|
|
|
((this)->*(m_opSingle[(m_nOpcode & 0x3F)]))();
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//14
|
|
|
|
void CCOP_FPU::W()
|
|
|
|
{
|
2014-09-28 02:37:55 -04:00
|
|
|
((this)->*(m_opWord[(m_nOpcode & 0x3F)]))();
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//Branch Opcodes
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
|
|
|
//00
|
|
|
|
void CCOP_FPU::BC1F()
|
|
|
|
{
|
2014-09-28 02:37:55 -04:00
|
|
|
PushCCBit(m_ccMask[(m_nOpcode >> 18) & 0x07]);
|
2010-08-11 03:47:19 +00:00
|
|
|
m_codeGen->PushCst(0);
|
|
|
|
Branch(Jitter::CONDITION_EQ);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//01
|
|
|
|
void CCOP_FPU::BC1T()
|
|
|
|
{
|
2014-09-28 02:37:55 -04:00
|
|
|
PushCCBit(m_ccMask[(m_nOpcode >> 18) & 0x07]);
|
2010-08-11 03:47:19 +00:00
|
|
|
m_codeGen->PushCst(0);
|
|
|
|
Branch(Jitter::CONDITION_NE);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//02
|
|
|
|
void CCOP_FPU::BC1FL()
|
|
|
|
{
|
2014-09-28 02:37:55 -04:00
|
|
|
PushCCBit(m_ccMask[(m_nOpcode >> 18) & 0x07]);
|
2010-08-11 03:47:19 +00:00
|
|
|
m_codeGen->PushCst(0);
|
|
|
|
BranchLikely(Jitter::CONDITION_EQ);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//03
|
|
|
|
void CCOP_FPU::BC1TL()
|
|
|
|
{
|
2014-09-28 02:37:55 -04:00
|
|
|
PushCCBit(m_ccMask[(m_nOpcode >> 18) & 0x07]);
|
2010-08-11 03:47:19 +00:00
|
|
|
m_codeGen->PushCst(0);
|
|
|
|
BranchLikely(Jitter::CONDITION_NE);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//Single Precision Floating Point Opcodes
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
|
|
|
//00
|
|
|
|
void CCOP_FPU::ADD_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_AddS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//01
|
|
|
|
void CCOP_FPU::SUB_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_SubS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//02
|
|
|
|
void CCOP_FPU::MUL_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_MulS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//03
|
|
|
|
void CCOP_FPU::DIV_S()
|
|
|
|
{
|
2018-12-01 21:34:26 -05:00
|
|
|
FpUtils::IsZero(m_codeGen, offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
2010-08-11 03:47:19 +00:00
|
|
|
m_codeGen->BeginIf(Jitter::CONDITION_EQ);
|
2007-12-11 07:05:37 +00:00
|
|
|
{
|
2018-12-01 21:34:26 -05:00
|
|
|
FpUtils::ComputeDivisionByZero(m_codeGen,
|
2018-12-04 18:53:29 -05:00
|
|
|
offsetof(CMIPS, m_State.nCOP1[m_fs]),
|
|
|
|
offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
2014-09-28 03:09:17 -04:00
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
2010-08-11 03:47:19 +00:00
|
|
|
m_codeGen->Else();
|
2007-12-11 07:05:37 +00:00
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_DivS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2007-12-11 07:05:37 +00:00
|
|
|
}
|
|
|
|
m_codeGen->EndIf();
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//04
|
|
|
|
void CCOP_FPU::SQRT_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_AbsS();
|
|
|
|
m_codeGen->FP_SqrtS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//05
|
|
|
|
void CCOP_FPU::ABS_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_AbsS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//06
|
|
|
|
void CCOP_FPU::MOV_S()
|
|
|
|
{
|
2014-09-28 03:09:17 -04:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//07
|
|
|
|
void CCOP_FPU::NEG_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_NegS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2010-04-29 03:47:06 +00:00
|
|
|
//0D
|
|
|
|
void CCOP_FPU::TRUNC_W_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ToInt32TruncateS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2010-04-29 03:47:06 +00:00
|
|
|
}
|
|
|
|
|
2011-10-17 23:15:56 +00:00
|
|
|
//16
|
|
|
|
void CCOP_FPU::RSQRT_S()
|
|
|
|
{
|
2018-12-01 21:33:25 -05:00
|
|
|
FpUtils::IsZero(m_codeGen, offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->BeginIf(Jitter::CONDITION_EQ);
|
|
|
|
{
|
|
|
|
FpUtils::ComputeDivisionByZero(m_codeGen,
|
2018-12-04 18:53:29 -05:00
|
|
|
offsetof(CMIPS, m_State.nCOP1[m_fs]),
|
|
|
|
offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
2018-12-01 21:33:25 -05:00
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
|
|
|
}
|
|
|
|
m_codeGen->Else();
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_RsqrtS();
|
|
|
|
m_codeGen->FP_MulS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2018-12-01 21:33:25 -05:00
|
|
|
}
|
|
|
|
m_codeGen->EndIf();
|
2011-10-17 23:15:56 +00:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//18
|
|
|
|
void CCOP_FPU::ADDA_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_AddS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1A));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2011-11-22 02:55:52 +00:00
|
|
|
//19
|
|
|
|
void CCOP_FPU::SUBA_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_SubS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1A));
|
2011-11-22 02:55:52 +00:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//1A
|
|
|
|
void CCOP_FPU::MULA_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_MulS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1A));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//1C
|
|
|
|
void CCOP_FPU::MADD_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1A));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_MulS();
|
|
|
|
m_codeGen->FP_AddS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//1D
|
|
|
|
void CCOP_FPU::MSUB_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1A));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_MulS();
|
|
|
|
m_codeGen->FP_SubS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2014-06-30 22:40:02 -04:00
|
|
|
//1E
|
|
|
|
void CCOP_FPU::MADDA_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1A));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_MulS();
|
|
|
|
m_codeGen->FP_AddS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1A));
|
2014-06-30 22:40:02 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
//1F
|
|
|
|
void CCOP_FPU::MSUBA_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1A));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_MulS();
|
|
|
|
m_codeGen->FP_SubS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1A));
|
2014-06-30 22:40:02 -04:00
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//24
|
|
|
|
void CCOP_FPU::CVT_W_S()
|
|
|
|
{
|
2007-12-11 07:05:37 +00:00
|
|
|
//Load the rounding mode from FCSR?
|
2013-04-14 06:33:04 +00:00
|
|
|
//PS2 only supports truncate rounding mode
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ToInt32TruncateS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
2009-05-02 02:11:55 +00:00
|
|
|
//28
|
|
|
|
void CCOP_FPU::MAX_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_MaxS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2009-05-02 02:11:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//29
|
|
|
|
void CCOP_FPU::MIN_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
|
|
|
m_codeGen->FP_MinS();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2009-05-02 02:11:55 +00:00
|
|
|
}
|
|
|
|
|
2015-04-23 02:01:47 -04:00
|
|
|
//30
|
|
|
|
void CCOP_FPU::C_F_S()
|
|
|
|
{
|
|
|
|
m_codeGen->PushCst(0);
|
|
|
|
SetCCBit(true, m_ccMask[((m_nOpcode >> 8) & 0x07)]);
|
|
|
|
}
|
|
|
|
|
2007-12-07 00:26:56 +00:00
|
|
|
//32
|
|
|
|
void CCOP_FPU::C_EQ_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
2022-05-26 14:23:20 -04:00
|
|
|
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_CmpS(Jitter::CONDITION_EQ);
|
2007-12-29 17:22:26 +00:00
|
|
|
|
2014-09-28 02:37:55 -04:00
|
|
|
SetCCBit(true, m_ccMask[((m_nOpcode >> 8) & 0x07)]);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//34
|
|
|
|
void CCOP_FPU::C_LT_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
2022-05-25 11:58:07 -04:00
|
|
|
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_CmpS(Jitter::CONDITION_BL);
|
2008-01-03 07:42:54 +00:00
|
|
|
|
2014-09-28 02:37:55 -04:00
|
|
|
SetCCBit(true, m_ccMask[((m_nOpcode >> 8) & 0x07)]);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//36
|
|
|
|
void CCOP_FPU::C_LE_S()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ClampS();
|
2022-05-25 11:58:07 -04:00
|
|
|
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->FP_ClampS();
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_CmpS(Jitter::CONDITION_BE);
|
2008-01-15 20:27:44 +00:00
|
|
|
|
2014-09-28 02:37:55 -04:00
|
|
|
SetCCBit(true, m_ccMask[((m_nOpcode >> 8) & 0x07)]);
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//Word Sized Integer Opcodes
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
|
|
|
//20
|
|
|
|
void CCOP_FPU::CVT_S_W()
|
|
|
|
{
|
2024-05-28 17:30:17 -04:00
|
|
|
m_codeGen->FP_PushRel32(offsetof(CMIPS, m_State.nCOP1[m_fs]));
|
|
|
|
m_codeGen->FP_ToSingleI32();
|
|
|
|
m_codeGen->FP_PullRel32(offsetof(CMIPS, m_State.nCOP1[m_fd]));
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//Miscellanous Opcodes
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
|
|
|
//31
|
|
|
|
void CCOP_FPU::LWC1()
|
|
|
|
{
|
2019-04-17 20:03:32 -04:00
|
|
|
bool usePageLookup = (m_pCtx->m_pageLookup != nullptr);
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2019-04-17 20:03:32 -04:00
|
|
|
if(usePageLookup)
|
|
|
|
{
|
|
|
|
ComputeMemAccessPageRef();
|
|
|
|
|
|
|
|
m_codeGen->PushCst(0);
|
|
|
|
m_codeGen->BeginIf(Jitter::CONDITION_NE);
|
|
|
|
{
|
2023-08-11 10:38:23 -04:00
|
|
|
ComputeMemAccessRefIdx(4);
|
2007-12-11 07:05:37 +00:00
|
|
|
|
2023-08-11 10:38:23 -04:00
|
|
|
m_codeGen->LoadFromRefIdx(1);
|
2019-04-17 20:03:32 -04:00
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
}
|
|
|
|
m_codeGen->Else();
|
|
|
|
}
|
|
|
|
|
|
|
|
//Standard memory access
|
|
|
|
{
|
|
|
|
ComputeMemAccessAddrNoXlat();
|
2007-12-11 07:05:37 +00:00
|
|
|
|
2019-04-17 20:03:32 -04:00
|
|
|
m_codeGen->PushCtx();
|
|
|
|
m_codeGen->PushIdx(1);
|
2024-01-17 17:00:22 -05:00
|
|
|
m_codeGen->Call(reinterpret_cast<void*>(&MemoryUtils_GetWordProxy), 2, Jitter::CJitter::RETURN_VALUE_32);
|
2019-04-17 20:03:32 -04:00
|
|
|
|
|
|
|
m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
|
|
|
|
m_codeGen->PullTop();
|
|
|
|
}
|
|
|
|
|
|
|
|
if(usePageLookup)
|
|
|
|
{
|
|
|
|
m_codeGen->EndIf();
|
|
|
|
}
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//39
|
|
|
|
void CCOP_FPU::SWC1()
|
|
|
|
{
|
2019-04-17 20:03:32 -04:00
|
|
|
bool usePageLookup = (m_pCtx->m_pageLookup != nullptr);
|
2007-12-07 00:26:56 +00:00
|
|
|
|
2019-04-17 20:03:32 -04:00
|
|
|
if(usePageLookup)
|
|
|
|
{
|
|
|
|
ComputeMemAccessPageRef();
|
|
|
|
|
|
|
|
m_codeGen->PushCst(0);
|
|
|
|
m_codeGen->BeginIf(Jitter::CONDITION_NE);
|
|
|
|
{
|
2023-08-11 10:38:23 -04:00
|
|
|
ComputeMemAccessRefIdx(4);
|
2007-12-11 07:05:37 +00:00
|
|
|
|
2019-04-17 20:03:32 -04:00
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
2023-08-11 10:38:23 -04:00
|
|
|
m_codeGen->StoreAtRefIdx(1);
|
2019-04-17 20:03:32 -04:00
|
|
|
}
|
|
|
|
m_codeGen->Else();
|
|
|
|
}
|
|
|
|
|
|
|
|
//Standard memory access
|
|
|
|
{
|
|
|
|
ComputeMemAccessAddrNoXlat();
|
|
|
|
|
|
|
|
m_codeGen->PushCtx();
|
|
|
|
m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP1[m_ft]));
|
|
|
|
m_codeGen->PushIdx(2);
|
2024-01-17 17:00:22 -05:00
|
|
|
m_codeGen->Call(reinterpret_cast<void*>(&MemoryUtils_SetWordProxy), 3, Jitter::CJitter::RETURN_VALUE_NONE);
|
2019-04-17 20:03:32 -04:00
|
|
|
|
|
|
|
m_codeGen->PullTop();
|
|
|
|
}
|
|
|
|
|
|
|
|
if(usePageLookup)
|
|
|
|
{
|
|
|
|
m_codeGen->EndIf();
|
|
|
|
}
|
2007-12-07 00:26:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//Opcode Tables
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
|
2018-04-30 11:19:06 -04:00
|
|
|
// clang-format off
|
2014-09-28 02:37:55 -04:00
|
|
|
CCOP_FPU::InstructionFuncConstant CCOP_FPU::m_opGeneral[0x20] =
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
|
|
|
//0x00
|
2010-04-29 03:47:06 +00:00
|
|
|
&CCOP_FPU::MFC1, &CCOP_FPU::Illegal, &CCOP_FPU::CFC1, &CCOP_FPU::Illegal, &CCOP_FPU::MTC1, &CCOP_FPU::Illegal, &CCOP_FPU::CTC1, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x08
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_FPU::BC1, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x10
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_FPU::S, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::W, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x18
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
};
|
|
|
|
|
2014-09-28 02:37:55 -04:00
|
|
|
CCOP_FPU::InstructionFuncConstant CCOP_FPU::m_opSingle[0x40] =
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
|
|
|
//0x00
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_FPU::ADD_S, &CCOP_FPU::SUB_S, &CCOP_FPU::MUL_S, &CCOP_FPU::DIV_S, &CCOP_FPU::SQRT_S, &CCOP_FPU::ABS_S, &CCOP_FPU::MOV_S, &CCOP_FPU::NEG_S,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x08
|
2010-04-29 03:47:06 +00:00
|
|
|
&CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::TRUNC_W_S, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x10
|
2011-10-17 23:15:56 +00:00
|
|
|
&CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::RSQRT_S, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x18
|
2014-06-30 22:40:02 -04:00
|
|
|
&CCOP_FPU::ADDA_S, &CCOP_FPU::SUBA_S, &CCOP_FPU::MULA_S, &CCOP_FPU::Illegal, &CCOP_FPU::MADD_S, &CCOP_FPU::MSUB_S, &CCOP_FPU::MADDA_S, &CCOP_FPU::MSUBA_S,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x20
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::CVT_W_S, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x28
|
2024-06-10 15:51:07 -04:00
|
|
|
&CCOP_FPU::MAX_S, &CCOP_FPU::MIN_S, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x30
|
2015-04-23 02:01:47 -04:00
|
|
|
&CCOP_FPU::C_F_S, &CCOP_FPU::Illegal, &CCOP_FPU::C_EQ_S, &CCOP_FPU::Illegal, &CCOP_FPU::C_LT_S, &CCOP_FPU::Illegal, &CCOP_FPU::C_LE_S, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x38
|
2010-04-29 03:47:06 +00:00
|
|
|
&CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::C_LT_S, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
};
|
|
|
|
|
2014-09-28 02:37:55 -04:00
|
|
|
CCOP_FPU::InstructionFuncConstant CCOP_FPU::m_opWord[0x40] =
|
2007-12-07 00:26:56 +00:00
|
|
|
{
|
|
|
|
//0x00
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x08
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x10
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x18
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x20
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_FPU::CVT_S_W, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x28
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x30
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
//0x38
|
2009-09-07 19:23:46 +00:00
|
|
|
&CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal,
|
2007-12-07 00:26:56 +00:00
|
|
|
};
|
2018-04-30 11:19:06 -04:00
|
|
|
// clang-format on
|