Added VMFIR.

git-svn-id: http://svn.purei.org/purei/trunk@1019 b36208d7-6611-0410-8bec-b1987f11c4a2
This commit is contained in:
jpd002 2012-10-21 01:30:33 +00:00
parent 97e5401808
commit ef771a41f7
9 changed files with 33 additions and 20 deletions

View File

@ -573,6 +573,12 @@ void CCOP_VU::VSQRT()
VUShared::SQRT(m_codeGen, m_nFT, m_nFTF, 0);
}
//0F
void CCOP_VU::VMFIR()
{
VUShared::MFIR(m_codeGen, m_nDest, m_nIT, m_nIS);
}
//10
void CCOP_VU::VRGET()
{
@ -712,7 +718,7 @@ CCOP_VU::InstructionFuncConstant CCOP_VU::m_pOpVx1[0x20] =
//0x00
&CCOP_VU::VADDAbc, &CCOP_VU::VSUBAbc, &CCOP_VU::VMADDAbc, &CCOP_VU::VMSUBAbc, &CCOP_VU::VITOF4, &CCOP_VU::VFTOI4, &CCOP_VU::VMULAbc, &CCOP_VU::VABS,
//0x08
&CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::VMADDA, &CCOP_VU::VMSUBA, &CCOP_VU::VMR32, &CCOP_VU::VSQI, &CCOP_VU::VSQRT, &CCOP_VU::Illegal,
&CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::VMADDA, &CCOP_VU::VMSUBA, &CCOP_VU::VMR32, &CCOP_VU::VSQI, &CCOP_VU::VSQRT, &CCOP_VU::VMFIR,
//0x10
&CCOP_VU::VRGET, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal,
//0x18

View File

@ -122,6 +122,7 @@ private:
void VMR32();
void VSQI();
void VSQRT();
void VMFIR();
void VRGET();
//V2

View File

@ -318,7 +318,7 @@ INSTRUCTION CCOP_VU::m_cReflVX1[32] =
{ "VMR32", NULL, CopyMnemonic, ReflOpFtFs, NULL, NULL },
{ "VSQI", NULL, CopyMnemonic, ReflOpFsDstItInc, NULL, NULL },
{ "VSQRT", NULL, CopyMnemonic, ReflOpQFtf, NULL, NULL },
{ NULL, NULL, NULL, NULL, NULL, NULL },
{ "VMFIR", NULL, CopyMnemonic, ReflOpFtIs, NULL, NULL },
//0x10
{ "VRGET", NULL, CopyMnemonic, ReflOpFtR, NULL, NULL },
{ NULL, NULL, NULL, NULL, NULL, NULL },

View File

@ -218,7 +218,6 @@ private:
static void ReflOpItOfsIsDst(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
static void ReflOpImm24(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
static void ReflOpVi1Imm24(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
static void ReflOpFtIs(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
static void ReflOpFtDstIsInc(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
static void ReflOpFtDstIsDec(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
static void ReflOpFsDstOfsIt(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);

View File

@ -665,14 +665,7 @@ void CMA_VU::CLower::SQRT()
//0F
void CMA_VU::CLower::MFIR()
{
for(unsigned int i = 0; i < 4; i++)
{
if(!VUShared::DestinationHasElement(m_nDest, i)) continue;
VUShared::PushIntegerRegister(m_codeGen, m_nIS);
m_codeGen->SignExt16();
m_codeGen->PullRel(VUShared::GetVectorElement(m_nIT, i));
}
VUShared::MFIR(m_codeGen, m_nDest, m_nIT, m_nIS);
}
//10

View File

@ -128,15 +128,6 @@ void CMA_VU::CLower::ReflOpVi1Imm24(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAd
sprintf(sText, "VI1, $%0.6X", nImm);
}
void CMA_VU::CLower::ReflOpFtIs(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
{
uint8 nDest = static_cast<uint8>((nOpcode >> 21) & 0x000F);
uint8 nFT = static_cast<uint8>((nOpcode >> 16) & 0x001F);
uint8 nIS = static_cast<uint8>((nOpcode >> 11) & 0x001F);
sprintf(sText, "VF%i%s, VI%i", nFT, m_sDestination[nDest], nIS);
}
void CMA_VU::CLower::ReflOpFtDstIsInc(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
{
uint8 nDest = static_cast<uint8>((nOpcode >> 21) & 0x000F);

View File

@ -756,6 +756,18 @@ void VUShared::MSUBAi(CMipsJitter* codeGen, uint8 dest, uint8 fs)
true);
}
void VUShared::MFIR(CMipsJitter* codeGen, uint8 dest, uint8 ft, uint8 is)
{
for(unsigned int i = 0; i < 4; i++)
{
if(!VUShared::DestinationHasElement(dest, i)) continue;
PushIntegerRegister(codeGen, is);
codeGen->SignExt16();
codeGen->PullRel(VUShared::GetVectorElement(ft, i));
}
}
void VUShared::MTIR(CMipsJitter* codeGen, uint8 it, uint8 fs, uint8 fsf)
{
codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2[fs].nV[fsf]));

View File

@ -119,6 +119,7 @@ namespace VUShared
void MSUBA(CMipsJitter*, uint8, uint8, uint8);
void MSUBAbc(CMipsJitter*, uint8, uint8, uint8, uint8);
void MSUBAi(CMipsJitter*, uint8, uint8);
void MFIR(CMipsJitter*, uint8, uint8, uint8);
void MTIR(CMipsJitter*, uint8, uint8, uint8);
void MUL(CMipsJitter*, uint8, uint8, uint8, uint8);
void MULbc(CMipsJitter*, uint8, uint8, uint8, uint8, uint8, uint32);
@ -159,6 +160,7 @@ namespace VUShared
void ReflOpFsDstItDec(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
void ReflOpFsDstItInc(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
void ReflOpFtFs(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
void ReflOpFtIs(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
void ReflOpClip(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
void ReflOpAccFsI(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
void ReflOpAccFsQ(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);

View File

@ -120,6 +120,15 @@ void VUShared::ReflOpFtFs(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uin
sprintf(sText, "VF%i%s, VF%i%s", nFT, m_sDestination[nDest], nFS, m_sDestination[nDest]);
}
void VUShared::ReflOpFtIs(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
{
uint8 nDest = static_cast<uint8>((nOpcode >> 21) & 0x000F);
uint8 nFT = static_cast<uint8>((nOpcode >> 16) & 0x001F);
uint8 nIS = static_cast<uint8>((nOpcode >> 11) & 0x001F);
sprintf(sText, "VF%i%s, VI%i", nFT, m_sDestination[nDest], nIS);
}
void VUShared::ReflOpClip(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
{
uint8 nFT = (uint8)((nOpcode >> 16) & 0x001F);