pcsx2/x86/iVU0micro.c

790 lines
32 KiB
C

/* Pcsx2 - Pc Ps2 Emulator
* Copyright (C) 2002-2005 Pcsx2 Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdlib.h>
#include <string.h>
#include "Common.h"
#include "InterTables.h"
#include "ix86/ix86.h"
#include "iR5900.h"
#include "iMMI.h"
#include "iFPU.h"
#include "iCP0.h"
#include "VUmicro.h"
#include "iVUmicro.h"
#include "iVU0micro.h"
#include "iVUops.h"
#include "VUops.h"
#include "iVUzerorec.h"
#ifdef __MSCW32__
#pragma warning(disable:4244)
#pragma warning(disable:4761)
#endif
static VURegs * const VU = (VURegs*)&VU0;
//u32 vu0time = 0;
//static LARGE_INTEGER vu0base, vu0final;
#ifdef PCSX2_DEVBUILD
extern u32 vudump;
#endif
#define VF_VAL(x) ((x==0x80000000)?0:x)
static u32 vuprogcount = 0;
void iDumpVU0Registers()
{
int i;
for(i = 1; i < 32; ++i) {
__Log("v%d: %x %x %x %x, vi: ", i, VF_VAL(VU0.VF[i].UL[3]), VF_VAL(VU0.VF[i].UL[2]),
VF_VAL(VU0.VF[i].UL[1]), VF_VAL(VU0.VF[i].UL[0]));
if( i == REG_Q || i == REG_P ) __Log("%f\n", VU0.VI[i].F);
else if( i == REG_MAC_FLAG ) __Log("%x\n", VU0.VI[i].UL&0xff);
else if( i == REG_STATUS_FLAG ) __Log("%x\n", VU0.VI[i].UL&0x03);
else if( i == REG_CLIP_FLAG ) __Log("0\n");
else __Log("%x\n", VU0.VI[i].UL);
}
__Log("vfACC: %f %f %f %f\n", VU0.ACC.F[3], VU0.ACC.F[2], VU0.ACC.F[1], VU0.ACC.F[0]);
}
void recExecuteVU0Block( void )
{
//SysPrintf("executeVU0 %x\n", VU0.VI[ REG_TPC ].UL);
//QueryPerformanceCounter(&vu0base);
assert( VU0.VI[REG_VPU_STAT].UL & 1 );
#ifdef _DEBUG
vuprogcount++;
// __Log("VU: %x %x\n", VU0.VI[ REG_TPC ].UL, vuprogcount);
// iDumpVU0Registers();
//vudump |= 0x10;
//vudump |= 8;
if( (vudump&8) && !CHECK_VU0REC ) {
__Log("tVU: %x\n", VU0.VI[ REG_TPC ].UL);
iDumpVU0Registers();
}
#endif
///while( (VU0.VI[ REG_VPU_STAT ].UL&1) ) {
if( CHECK_VU0REC) {
FreezeXMMRegs(1);
SuperVUExecuteProgram(VU0.VI[ REG_TPC ].UL, 0);
}
else {
intExecuteVU0Block();
}
//}
// __Log("eVU: %x %x\n", VU0.VI[ REG_TPC ].UL, vuprogcount);
// iDumpVU0Registers();
// QueryPerformanceCounter(&vu0final);
// vu0time += (u32)(vu0final.QuadPart-vu0final.QuadPart);
}
void recClearVU0( u32 Addr, u32 Size )
{
if( CHECK_VU0REC ) {
SuperVUClear(Addr, Size*4, 0);
}
}
void (*recVU0_LOWER_OPCODE[128])() = {
recVU0MI_LQ , recVU0MI_SQ , recVU0unknown , recVU0unknown,
recVU0MI_ILW , recVU0MI_ISW , recVU0unknown , recVU0unknown,
recVU0MI_IADDIU, recVU0MI_ISUBIU, recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0MI_FCEQ , recVU0MI_FCSET , recVU0MI_FCAND, recVU0MI_FCOR, /* 0x10 */
recVU0MI_FSEQ , recVU0MI_FSSET , recVU0MI_FSAND, recVU0MI_FSOR,
recVU0MI_FMEQ , recVU0unknown , recVU0MI_FMAND, recVU0MI_FMOR,
recVU0MI_FCGET , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0MI_B , recVU0MI_BAL , recVU0unknown , recVU0unknown, /* 0x20 */
recVU0MI_JR , recVU0MI_JALR , recVU0unknown , recVU0unknown,
recVU0MI_IBEQ , recVU0MI_IBNE , recVU0unknown , recVU0unknown,
recVU0MI_IBLTZ , recVU0MI_IBGTZ , recVU0MI_IBLEZ, recVU0MI_IBGEZ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown, /* 0x30 */
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0LowerOP , recVU0unknown , recVU0unknown , recVU0unknown, /* 0x40*/
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown, /* 0x50 */
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown, /* 0x60 */
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown, /* 0x70 */
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
};
void (*recVU0LowerOP_T3_00_OPCODE[32])() = {
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0MI_MOVE , recVU0MI_LQI , recVU0MI_DIV , recVU0MI_MTIR,
recVU0MI_RNEXT , recVU0unknown , recVU0unknown , recVU0unknown, /* 0x10 */
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0MI_MFP , recVU0unknown , recVU0unknown,
recVU0MI_ESADD , recVU0MI_EATANxy, recVU0MI_ESQRT, recVU0MI_ESIN,
};
void (*recVU0LowerOP_T3_01_OPCODE[32])() = {
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0MI_MR32 , recVU0MI_SQI , recVU0MI_SQRT , recVU0MI_MFIR,
recVU0MI_RGET , recVU0unknown , recVU0unknown , recVU0unknown, /* 0x10 */
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0MI_XITOP, recVU0unknown,
recVU0MI_ERSADD, recVU0MI_EATANxz, recVU0MI_ERSQRT, recVU0MI_EATAN,
};
void (*recVU0LowerOP_T3_10_OPCODE[32])() = {
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0MI_LQD , recVU0MI_RSQRT, recVU0MI_ILWR,
recVU0MI_RINIT , recVU0unknown , recVU0unknown , recVU0unknown, /* 0x10 */
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0MI_ELENG , recVU0MI_ESUM , recVU0MI_ERCPR, recVU0MI_EEXP,
};
void (*recVU0LowerOP_T3_11_OPCODE[32])() = {
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0MI_SQD , recVU0MI_WAITQ, recVU0MI_ISWR,
recVU0MI_RXOR , recVU0unknown , recVU0unknown , recVU0unknown, /* 0x10 */
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0MI_ERLENG, recVU0unknown , recVU0MI_WAITP, recVU0unknown,
};
void (*recVU0LowerOP_OPCODE[64])() = {
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown, /* 0x10 */
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown, /* 0x20 */
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0MI_IADD , recVU0MI_ISUB , recVU0MI_IADDI, recVU0unknown, /* 0x30 */
recVU0MI_IAND , recVU0MI_IOR , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0LowerOP_T3_00, recVU0LowerOP_T3_01, recVU0LowerOP_T3_10, recVU0LowerOP_T3_11,
};
void (*recVU0_UPPER_OPCODE[64])() = {
recVU0MI_ADDx , recVU0MI_ADDy , recVU0MI_ADDz , recVU0MI_ADDw,
recVU0MI_SUBx , recVU0MI_SUBy , recVU0MI_SUBz , recVU0MI_SUBw,
recVU0MI_MADDx , recVU0MI_MADDy , recVU0MI_MADDz , recVU0MI_MADDw,
recVU0MI_MSUBx , recVU0MI_MSUBy , recVU0MI_MSUBz , recVU0MI_MSUBw,
recVU0MI_MAXx , recVU0MI_MAXy , recVU0MI_MAXz , recVU0MI_MAXw, /* 0x10 */
recVU0MI_MINIx , recVU0MI_MINIy , recVU0MI_MINIz , recVU0MI_MINIw,
recVU0MI_MULx , recVU0MI_MULy , recVU0MI_MULz , recVU0MI_MULw,
recVU0MI_MULq , recVU0MI_MAXi , recVU0MI_MULi , recVU0MI_MINIi,
recVU0MI_ADDq , recVU0MI_MADDq , recVU0MI_ADDi , recVU0MI_MADDi, /* 0x20 */
recVU0MI_SUBq , recVU0MI_MSUBq , recVU0MI_SUBi , recVU0MI_MSUBi,
recVU0MI_ADD , recVU0MI_MADD , recVU0MI_MUL , recVU0MI_MAX,
recVU0MI_SUB , recVU0MI_MSUB , recVU0MI_OPMSUB, recVU0MI_MINI,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown, /* 0x30 */
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown,
recVU0_UPPER_FD_00, recVU0_UPPER_FD_01, recVU0_UPPER_FD_10, recVU0_UPPER_FD_11,
};
void (*recVU0_UPPER_FD_00_TABLE[32])() = {
recVU0MI_ADDAx, recVU0MI_SUBAx , recVU0MI_MADDAx, recVU0MI_MSUBAx,
recVU0MI_ITOF0, recVU0MI_FTOI0, recVU0MI_MULAx , recVU0MI_MULAq ,
recVU0MI_ADDAq, recVU0MI_SUBAq, recVU0MI_ADDA , recVU0MI_SUBA ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
};
void (*recVU0_UPPER_FD_01_TABLE[32])() = {
recVU0MI_ADDAy , recVU0MI_SUBAy , recVU0MI_MADDAy, recVU0MI_MSUBAy,
recVU0MI_ITOF4 , recVU0MI_FTOI4 , recVU0MI_MULAy , recVU0MI_ABS ,
recVU0MI_MADDAq, recVU0MI_MSUBAq, recVU0MI_MADDA , recVU0MI_MSUBA ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
};
void (*recVU0_UPPER_FD_10_TABLE[32])() = {
recVU0MI_ADDAz , recVU0MI_SUBAz , recVU0MI_MADDAz, recVU0MI_MSUBAz,
recVU0MI_ITOF12, recVU0MI_FTOI12, recVU0MI_MULAz , recVU0MI_MULAi ,
recVU0MI_MADDAi, recVU0MI_SUBAi , recVU0MI_MULA , recVU0MI_OPMULA,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
};
void (*recVU0_UPPER_FD_11_TABLE[32])() = {
recVU0MI_ADDAw , recVU0MI_SUBAw , recVU0MI_MADDAw, recVU0MI_MSUBAw,
recVU0MI_ITOF15, recVU0MI_FTOI15, recVU0MI_MULAw , recVU0MI_CLIP ,
recVU0MI_MADDAi, recVU0MI_MSUBAi, recVU0unknown , recVU0MI_NOP ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
recVU0unknown , recVU0unknown , recVU0unknown , recVU0unknown ,
};
void recVU0_UPPER_FD_00( void )
{
recVU0_UPPER_FD_00_TABLE[ ( VU0.code >> 6 ) & 0x1f ]( );
}
void recVU0_UPPER_FD_01( void )
{
recVU0_UPPER_FD_01_TABLE[ ( VU0.code >> 6 ) & 0x1f ]( );
}
void recVU0_UPPER_FD_10( void )
{
recVU0_UPPER_FD_10_TABLE[ ( VU0.code >> 6 ) & 0x1f ]( );
}
void recVU0_UPPER_FD_11( void )
{
recVU0_UPPER_FD_11_TABLE[ ( VU0.code >> 6 ) & 0x1f ]( );
}
void recVU0LowerOP( void )
{
recVU0LowerOP_OPCODE[ VU0.code & 0x3f ]( );
}
void recVU0LowerOP_T3_00( void )
{
recVU0LowerOP_T3_00_OPCODE[ ( VU0.code >> 6 ) & 0x1f ]( );
}
void recVU0LowerOP_T3_01( void )
{
recVU0LowerOP_T3_01_OPCODE[ ( VU0.code >> 6 ) & 0x1f ]( );
}
void recVU0LowerOP_T3_10( void )
{
recVU0LowerOP_T3_10_OPCODE[ ( VU0.code >> 6 ) & 0x1f ]( );
}
void recVU0LowerOP_T3_11( void )
{
recVU0LowerOP_T3_11_OPCODE[ ( VU0.code >> 6 ) & 0x1f ]( );
}
void recVU0unknown( void )
{
#ifdef CPU_LOG
CPU_LOG("Unknown VU0 micromode opcode calledn");
#endif
}
/****************************************/
/* VU Micromode Upper instructions */
/****************************************/
#ifdef RECOMPILE_VUMI_ABS
void recVU0MI_ABS() { recVUMI_ABS(VU, VUREC_INFO); }
#else
void recVU0MI_ABS() { REC_VUOP(VU0, ABS); }
#endif
#ifdef RECOMPILE_VUMI_ADD
void recVU0MI_ADD() { recVUMI_ADD(VU, VUREC_INFO); }
void recVU0MI_ADDi() { recVUMI_ADDi(VU, VUREC_INFO); }
void recVU0MI_ADDq() { recVUMI_ADDq(VU, VUREC_INFO); }
void recVU0MI_ADDx() { recVUMI_ADDx(VU, VUREC_INFO); }
void recVU0MI_ADDy() { recVUMI_ADDy(VU, VUREC_INFO); }
void recVU0MI_ADDz() { recVUMI_ADDz(VU, VUREC_INFO); }
void recVU0MI_ADDw() { recVUMI_ADDw(VU, VUREC_INFO); }
#else
void recVU0MI_ADD() { REC_VUOP(VU0, ADD); }
void recVU0MI_ADDi() { REC_VUOP(VU0, ADDi); }
void recVU0MI_ADDq() { REC_VUOP(VU0, ADDq); }
void recVU0MI_ADDx() { REC_VUOP(VU0, ADDx); }
void recVU0MI_ADDy() { REC_VUOP(VU0, ADDy); }
void recVU0MI_ADDz() { REC_VUOP(VU0, ADDz); }
void recVU0MI_ADDw() { REC_VUOP(VU0, ADDw); }
#endif
#ifdef RECOMPILE_VUMI_ADDA
void recVU0MI_ADDA() { recVUMI_ADDA(VU, VUREC_INFO); }
void recVU0MI_ADDAi() { recVUMI_ADDAi(VU, VUREC_INFO); }
void recVU0MI_ADDAq() { recVUMI_ADDAq(VU, VUREC_INFO); }
void recVU0MI_ADDAx() { recVUMI_ADDAx(VU, VUREC_INFO); }
void recVU0MI_ADDAy() { recVUMI_ADDAy(VU, VUREC_INFO); }
void recVU0MI_ADDAz() { recVUMI_ADDAz(VU, VUREC_INFO); }
void recVU0MI_ADDAw() { recVUMI_ADDAw(VU, VUREC_INFO); }
#else
void recVU0MI_ADDA() { REC_VUOP(VU0, ADDA); }
void recVU0MI_ADDAi() { REC_VUOP(VU0, ADDAi); }
void recVU0MI_ADDAq() { REC_VUOP(VU0, ADDAq); }
void recVU0MI_ADDAx() { REC_VUOP(VU0, ADDAx); }
void recVU0MI_ADDAy() { REC_VUOP(VU0, ADDAy); }
void recVU0MI_ADDAz() { REC_VUOP(VU0, ADDAz); }
void recVU0MI_ADDAw() { REC_VUOP(VU0, ADDAw); }
#endif
#ifdef RECOMPILE_VUMI_SUB
void recVU0MI_SUB() { recVUMI_SUB(VU, VUREC_INFO); }
void recVU0MI_SUBi() { recVUMI_SUBi(VU, VUREC_INFO); }
void recVU0MI_SUBq() { recVUMI_SUBq(VU, VUREC_INFO); }
void recVU0MI_SUBx() { recVUMI_SUBx(VU, VUREC_INFO); }
void recVU0MI_SUBy() { recVUMI_SUBy(VU, VUREC_INFO); }
void recVU0MI_SUBz() { recVUMI_SUBz(VU, VUREC_INFO); }
void recVU0MI_SUBw() { recVUMI_SUBw(VU, VUREC_INFO); }
#else
void recVU0MI_SUB() { REC_VUOP(VU0, SUB); }
void recVU0MI_SUBi() { REC_VUOP(VU0, SUBi); }
void recVU0MI_SUBq() { REC_VUOP(VU0, SUBq); }
void recVU0MI_SUBx() { REC_VUOP(VU0, SUBx); }
void recVU0MI_SUBy() { REC_VUOP(VU0, SUBy); }
void recVU0MI_SUBz() { REC_VUOP(VU0, SUBz); }
void recVU0MI_SUBw() { REC_VUOP(VU0, SUBw); }
#endif
#ifdef RECOMPILE_VUMI_SUBA
void recVU0MI_SUBA() { recVUMI_SUBA(VU, VUREC_INFO); }
void recVU0MI_SUBAi() { recVUMI_SUBAi(VU, VUREC_INFO); }
void recVU0MI_SUBAq() { recVUMI_SUBAq(VU, VUREC_INFO); }
void recVU0MI_SUBAx() { recVUMI_SUBAx(VU, VUREC_INFO); }
void recVU0MI_SUBAy() { recVUMI_SUBAy(VU, VUREC_INFO); }
void recVU0MI_SUBAz() { recVUMI_SUBAz(VU, VUREC_INFO); }
void recVU0MI_SUBAw() { recVUMI_SUBAw(VU, VUREC_INFO); }
#else
void recVU0MI_SUBA() { REC_VUOP(VU0, SUBA); }
void recVU0MI_SUBAi() { REC_VUOP(VU0, SUBAi); }
void recVU0MI_SUBAq() { REC_VUOP(VU0, SUBAq); }
void recVU0MI_SUBAx() { REC_VUOP(VU0, SUBAx); }
void recVU0MI_SUBAy() { REC_VUOP(VU0, SUBAy); }
void recVU0MI_SUBAz() { REC_VUOP(VU0, SUBAz); }
void recVU0MI_SUBAw() { REC_VUOP(VU0, SUBAw); }
#endif
#ifdef RECOMPILE_VUMI_MUL
void recVU0MI_MUL() { recVUMI_MUL(VU, VUREC_INFO); }
void recVU0MI_MULi() { recVUMI_MULi(VU, VUREC_INFO); }
void recVU0MI_MULq() { recVUMI_MULq(VU, VUREC_INFO); }
void recVU0MI_MULx() { recVUMI_MULx(VU, VUREC_INFO); }
void recVU0MI_MULy() { recVUMI_MULy(VU, VUREC_INFO); }
void recVU0MI_MULz() { recVUMI_MULz(VU, VUREC_INFO); }
void recVU0MI_MULw() { recVUMI_MULw(VU, VUREC_INFO); }
#else
void recVU0MI_MUL() { REC_VUOP(VU0, MUL); }
void recVU0MI_MULi() { REC_VUOP(VU0, MULi); }
void recVU0MI_MULq() { REC_VUOP(VU0, MULq); }
void recVU0MI_MULx() { REC_VUOP(VU0, MULx); }
void recVU0MI_MULy() { REC_VUOP(VU0, MULy); }
void recVU0MI_MULz() { REC_VUOP(VU0, MULz); }
void recVU0MI_MULw() { REC_VUOP(VU0, MULw); }
#endif
#ifdef RECOMPILE_VUMI_MULA
void recVU0MI_MULA() { recVUMI_MULA(VU, VUREC_INFO); }
void recVU0MI_MULAi() { recVUMI_MULAi(VU, VUREC_INFO); }
void recVU0MI_MULAq() { recVUMI_MULAq(VU, VUREC_INFO); }
void recVU0MI_MULAx() { recVUMI_MULAx(VU, VUREC_INFO); }
void recVU0MI_MULAy() { recVUMI_MULAy(VU, VUREC_INFO); }
void recVU0MI_MULAz() { recVUMI_MULAz(VU, VUREC_INFO); }
void recVU0MI_MULAw() { recVUMI_MULAw(VU, VUREC_INFO); }
#else
void recVU0MI_MULA() { REC_VUOP(VU0, MULA); }
void recVU0MI_MULAi() { REC_VUOP(VU0, MULAi); }
void recVU0MI_MULAq() { REC_VUOP(VU0, MULAq); }
void recVU0MI_MULAx() { REC_VUOP(VU0, MULAx); }
void recVU0MI_MULAy() { REC_VUOP(VU0, MULAy); }
void recVU0MI_MULAz() { REC_VUOP(VU0, MULAz); }
void recVU0MI_MULAw() { REC_VUOP(VU0, MULAw); }
#endif
#ifdef RECOMPILE_VUMI_MADD
void recVU0MI_MADD() { recVUMI_MADD(VU, VUREC_INFO); }
void recVU0MI_MADDi() { recVUMI_MADDi(VU, VUREC_INFO); }
void recVU0MI_MADDq() { recVUMI_MADDq(VU, VUREC_INFO); }
void recVU0MI_MADDx() { recVUMI_MADDx(VU, VUREC_INFO); }
void recVU0MI_MADDy() { recVUMI_MADDy(VU, VUREC_INFO); }
void recVU0MI_MADDz() { recVUMI_MADDz(VU, VUREC_INFO); }
void recVU0MI_MADDw() { recVUMI_MADDw(VU, VUREC_INFO); }
#else
void recVU0MI_MADD() { REC_VUOP(VU0, MADD); }
void recVU0MI_MADDi() { REC_VUOP(VU0, MADDi); }
void recVU0MI_MADDq() { REC_VUOP(VU0, MADDq); }
void recVU0MI_MADDx() { REC_VUOP(VU0, MADDx); }
void recVU0MI_MADDy() { REC_VUOP(VU0, MADDy); }
void recVU0MI_MADDz() { REC_VUOP(VU0, MADDz); }
void recVU0MI_MADDw() { REC_VUOP(VU0, MADDw); }
#endif
#ifdef RECOMPILE_VUMI_MADDA
void recVU0MI_MADDA() { recVUMI_MADDA(VU, VUREC_INFO); }
void recVU0MI_MADDAi() { recVUMI_MADDAi(VU, VUREC_INFO); }
void recVU0MI_MADDAq() { recVUMI_MADDAq(VU, VUREC_INFO); }
void recVU0MI_MADDAx() { recVUMI_MADDAx(VU, VUREC_INFO); }
void recVU0MI_MADDAy() { recVUMI_MADDAy(VU, VUREC_INFO); }
void recVU0MI_MADDAz() { recVUMI_MADDAz(VU, VUREC_INFO); }
void recVU0MI_MADDAw() { recVUMI_MADDAw(VU, VUREC_INFO); }
#else
void recVU0MI_MADDA() { REC_VUOP(VU0, MADDA); }
void recVU0MI_MADDAi() { REC_VUOP(VU0, MADDAi); }
void recVU0MI_MADDAq() { REC_VUOP(VU0, MADDAq); }
void recVU0MI_MADDAx() { REC_VUOP(VU0, MADDAx); }
void recVU0MI_MADDAy() { REC_VUOP(VU0, MADDAy); }
void recVU0MI_MADDAz() { REC_VUOP(VU0, MADDAz); }
void recVU0MI_MADDAw() { REC_VUOP(VU0, MADDAw); }
#endif
#ifdef RECOMPILE_VUMI_MSUB
void recVU0MI_MSUB() { recVUMI_MSUB(VU, VUREC_INFO); }
void recVU0MI_MSUBi() { recVUMI_MSUBi(VU, VUREC_INFO); }
void recVU0MI_MSUBq() { recVUMI_MSUBq(VU, VUREC_INFO); }
void recVU0MI_MSUBx() { recVUMI_MSUBx(VU, VUREC_INFO); }
void recVU0MI_MSUBy() { recVUMI_MSUBy(VU, VUREC_INFO); }
void recVU0MI_MSUBz() { recVUMI_MSUBz(VU, VUREC_INFO); }
void recVU0MI_MSUBw() { recVUMI_MSUBw(VU, VUREC_INFO); }
#else
void recVU0MI_MSUB() { REC_VUOP(VU0, MSUB); }
void recVU0MI_MSUBi() { REC_VUOP(VU0, MSUBi); }
void recVU0MI_MSUBq() { REC_VUOP(VU0, MSUBq); }
void recVU0MI_MSUBx() { REC_VUOP(VU0, MSUBx); }
void recVU0MI_MSUBy() { REC_VUOP(VU0, MSUBy); }
void recVU0MI_MSUBz() { REC_VUOP(VU0, MSUBz); }
void recVU0MI_MSUBw() { REC_VUOP(VU0, MSUBw); }
#endif
#ifdef RECOMPILE_VUMI_MSUBA
void recVU0MI_MSUBA() { recVUMI_MSUBA(VU, VUREC_INFO); }
void recVU0MI_MSUBAi() { recVUMI_MSUBAi(VU, VUREC_INFO); }
void recVU0MI_MSUBAq() { recVUMI_MSUBAq(VU, VUREC_INFO); }
void recVU0MI_MSUBAx() { recVUMI_MSUBAx(VU, VUREC_INFO); }
void recVU0MI_MSUBAy() { recVUMI_MSUBAy(VU, VUREC_INFO); }
void recVU0MI_MSUBAz() { recVUMI_MSUBAz(VU, VUREC_INFO); }
void recVU0MI_MSUBAw() { recVUMI_MSUBAw(VU, VUREC_INFO); }
#else
void recVU0MI_MSUBA() { REC_VUOP(VU0, MSUBA); }
void recVU0MI_MSUBAi() { REC_VUOP(VU0, MSUBAi); }
void recVU0MI_MSUBAq() { REC_VUOP(VU0, MSUBAq); }
void recVU0MI_MSUBAx() { REC_VUOP(VU0, MSUBAx); }
void recVU0MI_MSUBAy() { REC_VUOP(VU0, MSUBAy); }
void recVU0MI_MSUBAz() { REC_VUOP(VU0, MSUBAz); }
void recVU0MI_MSUBAw() { REC_VUOP(VU0, MSUBAw); }
#endif
#ifdef RECOMPILE_VUMI_MAX
void recVU0MI_MAX() { recVUMI_MAX(VU, VUREC_INFO); }
void recVU0MI_MAXi() { recVUMI_MAXi(VU, VUREC_INFO); }
void recVU0MI_MAXx() { recVUMI_MAXx(VU, VUREC_INFO); }
void recVU0MI_MAXy() { recVUMI_MAXy(VU, VUREC_INFO); }
void recVU0MI_MAXz() { recVUMI_MAXz(VU, VUREC_INFO); }
void recVU0MI_MAXw() { recVUMI_MAXw(VU, VUREC_INFO); }
#else
void recVU0MI_MAX() { REC_VUOP(VU0, MAX); }
void recVU0MI_MAXi() { REC_VUOP(VU0, MAXi); }
void recVU0MI_MAXx() { REC_VUOP(VU0, MAXx); }
void recVU0MI_MAXy() { REC_VUOP(VU0, MAXy); }
void recVU0MI_MAXz() { REC_VUOP(VU0, MAXz); }
void recVU0MI_MAXw() { REC_VUOP(VU0, MAXw); }
#endif
#ifdef RECOMPILE_VUMI_MINI
void recVU0MI_MINI() { recVUMI_MINI(VU, VUREC_INFO); }
void recVU0MI_MINIi() { recVUMI_MINIi(VU, VUREC_INFO); }
void recVU0MI_MINIx() { recVUMI_MINIx(VU, VUREC_INFO); }
void recVU0MI_MINIy() { recVUMI_MINIy(VU, VUREC_INFO); }
void recVU0MI_MINIz() { recVUMI_MINIz(VU, VUREC_INFO); }
void recVU0MI_MINIw() { recVUMI_MINIw(VU, VUREC_INFO); }
#else
void recVU0MI_MINI() { REC_VUOP(VU0, MINI); }
void recVU0MI_MINIi() { REC_VUOP(VU0, MINIi); }
void recVU0MI_MINIx() { REC_VUOP(VU0, MINIx); }
void recVU0MI_MINIy() { REC_VUOP(VU0, MINIy); }
void recVU0MI_MINIz() { REC_VUOP(VU0, MINIz); }
void recVU0MI_MINIw() { REC_VUOP(VU0, MINIw); }
#endif
#ifdef RECOMPILE_VUMI_FTOI
void recVU0MI_FTOI0() { recVUMI_FTOI0(VU, VUREC_INFO); }
void recVU0MI_FTOI4() { recVUMI_FTOI4(VU, VUREC_INFO); }
void recVU0MI_FTOI12() { recVUMI_FTOI12(VU, VUREC_INFO); }
void recVU0MI_FTOI15() { recVUMI_FTOI15(VU, VUREC_INFO); }
void recVU0MI_ITOF0() { recVUMI_ITOF0(VU, VUREC_INFO); }
void recVU0MI_ITOF4() { recVUMI_ITOF4(VU, VUREC_INFO); }
void recVU0MI_ITOF12() { recVUMI_ITOF12(VU, VUREC_INFO); }
void recVU0MI_ITOF15() { recVUMI_ITOF15(VU, VUREC_INFO); }
#else
void recVU0MI_FTOI0() { REC_VUOP(VU0, FTOI0); }
void recVU0MI_FTOI4() { REC_VUOP(VU0, FTOI4); }
void recVU0MI_FTOI12() { REC_VUOP(VU0, FTOI12); }
void recVU0MI_FTOI15() { REC_VUOP(VU0, FTOI15); }
void recVU0MI_ITOF0() { REC_VUOP(VU0, ITOF0); }
void recVU0MI_ITOF4() { REC_VUOP(VU0, ITOF4); }
void recVU0MI_ITOF12() { REC_VUOP(VU0, ITOF12); }
void recVU0MI_ITOF15() { REC_VUOP(VU0, ITOF15); }
#endif
void recVU0MI_OPMULA() { recVUMI_OPMULA(VU, VUREC_INFO); }
void recVU0MI_OPMSUB() { recVUMI_OPMSUB(VU, VUREC_INFO); }
void recVU0MI_NOP() { }
void recVU0MI_CLIP() { recVUMI_CLIP(VU, VUREC_INFO); }
/*****************************************/
/* VU Micromode Lower instructions */
/*****************************************/
#ifdef RECOMPILE_VUMI_MISC
void recVU0MI_MTIR() { recVUMI_MTIR(VU, VUREC_INFO); }
void recVU0MI_MR32() { recVUMI_MR32(VU, VUREC_INFO); }
void recVU0MI_MFIR() { recVUMI_MFIR(VU, VUREC_INFO); }
void recVU0MI_MOVE() { recVUMI_MOVE(VU, VUREC_INFO); }
void recVU0MI_WAITQ() { recVUMI_WAITQ(VU, VUREC_INFO); }
void recVU0MI_MFP() { recVUMI_MFP(VU, VUREC_INFO); }
void recVU0MI_WAITP() { SysPrintf("vu0 wait p?\n"); }
#else
void recVU0MI_MOVE() { REC_VUOP(VU0, MOVE); }
void recVU0MI_MFIR() { REC_VUOP(VU0, MFIR); }
void recVU0MI_MTIR() { REC_VUOP(VU0, MTIR); }
void recVU0MI_MR32() { REC_VUOP(VU0, MR32); }
void recVU0MI_WAITQ() { }
void recVU0MI_MFP() { REC_VUOP(VU0, MFP); }
void recVU0MI_WAITP() { REC_VUOP(VU0, WAITP); }
#endif
#ifdef RECOMPILE_VUMI_MATH
void recVU0MI_SQRT() { recVUMI_SQRT(VU, VUREC_INFO); }
void recVU0MI_RSQRT() { recVUMI_RSQRT(VU, VUREC_INFO); }
void recVU0MI_DIV() { recVUMI_DIV(VU, VUREC_INFO); }
#else
void recVU0MI_DIV() { REC_VUOP(VU0, DIV);}
void recVU0MI_SQRT() { REC_VUOP(VU0, SQRT); }
void recVU0MI_RSQRT() { REC_VUOP(VU0, RSQRT); }
#endif
#ifdef RECOMPILE_VUMI_E
void recVU0MI_ESADD() { REC_VUOP(VU0, ESADD); }
void recVU0MI_ERSADD() { REC_VUOP(VU0, ERSADD); }
void recVU0MI_ELENG() { recVUMI_ELENG(VU, VUREC_INFO); }
void recVU0MI_ERLENG() { REC_VUOP(VU0, ERLENG); }
void recVU0MI_EATANxy() { REC_VUOP(VU0, EATANxy); }
void recVU0MI_EATANxz() { REC_VUOP(VU0, EATANxz); }
void recVU0MI_ESUM() { REC_VUOP(VU0, ESUM); }
void recVU0MI_ERCPR() { REC_VUOP(VU0, ERCPR); }
void recVU0MI_ESQRT() { REC_VUOP(VU0, ESQRT); }
void recVU0MI_ERSQRT() { REC_VUOP(VU0, ERSQRT); }
void recVU0MI_ESIN() { REC_VUOP(VU0, ESIN); }
void recVU0MI_EATAN() { REC_VUOP(VU0, EATAN); }
void recVU0MI_EEXP() { REC_VUOP(VU0, EEXP); }
#else
void recVU0MI_ESADD() { REC_VUOP(VU0, ESADD); }
void recVU0MI_ERSADD() { REC_VUOP(VU0, ERSADD); }
void recVU0MI_ELENG() { REC_VUOP(VU0, ELENG); }
void recVU0MI_ERLENG() { REC_VUOP(VU0, ERLENG); }
void recVU0MI_EATANxy() { REC_VUOP(VU0, EATANxy); }
void recVU0MI_EATANxz() { REC_VUOP(VU0, EATANxz); }
void recVU0MI_ESUM() { REC_VUOP(VU0, ESUM); }
void recVU0MI_ERCPR() { REC_VUOP(VU0, ERCPR); }
void recVU0MI_ESQRT() { REC_VUOP(VU0, ESQRT); }
void recVU0MI_ERSQRT() { REC_VUOP(VU0, ERSQRT); }
void recVU0MI_ESIN() { REC_VUOP(VU0, ESIN); }
void recVU0MI_EATAN() { REC_VUOP(VU0, EATAN); }
void recVU0MI_EEXP() { REC_VUOP(VU0, EEXP); }
#endif
#ifdef RECOMPILE_VUMI_X
void recVU0MI_XITOP() { recVUMI_XITOP(VU, VUREC_INFO); }
void recVU0MI_XGKICK() { recVUMI_XGKICK(VU, VUREC_INFO); }
void recVU0MI_XTOP() { recVUMI_XTOP(VU, VUREC_INFO); }
#else
void recVU0MI_XITOP() { REC_VUOP(VU0, XITOP); }
void recVU0MI_XGKICK() { REC_VUOP(VU0, XGKICK);}
void recVU0MI_XTOP() { REC_VUOP(VU0, XTOP);}
#endif
#ifdef RECOMPILE_VUMI_RANDOM
void recVU0MI_RINIT() { recVUMI_RINIT(VU, VUREC_INFO); }
void recVU0MI_RGET() { recVUMI_RGET(VU, VUREC_INFO); }
void recVU0MI_RNEXT() { recVUMI_RNEXT(VU, VUREC_INFO); }
void recVU0MI_RXOR() { recVUMI_RXOR(VU, VUREC_INFO); }
#else
void recVU0MI_RINIT() { REC_VUOP(VU0, RINIT); }
void recVU0MI_RGET() { REC_VUOP(VU0, RGET); }
void recVU0MI_RNEXT() { REC_VUOP(VU0, RNEXT); }
void recVU0MI_RXOR() { REC_VUOP(VU0, RXOR); }
#endif
#ifdef RECOMPILE_VUMI_FLAG
void recVU0MI_FSAND() { recVUMI_FSAND(VU, VUREC_INFO); }
void recVU0MI_FSEQ() { recVUMI_FSEQ(VU, VUREC_INFO); }
void recVU0MI_FSOR() { recVUMI_FSOR(VU, VUREC_INFO); }
void recVU0MI_FSSET() { recVUMI_FSSET(VU, VUREC_INFO); }
void recVU0MI_FMEQ() { recVUMI_FMEQ(VU, VUREC_INFO); }
void recVU0MI_FMOR() { recVUMI_FMOR(VU, VUREC_INFO); }
void recVU0MI_FCEQ() { recVUMI_FCEQ(VU, VUREC_INFO); }
void recVU0MI_FCOR() { recVUMI_FCOR(VU, VUREC_INFO); }
void recVU0MI_FCSET() { recVUMI_FCSET(VU, VUREC_INFO); }
void recVU0MI_FCGET() { recVUMI_FCGET(VU, VUREC_INFO); }
void recVU0MI_FCAND() { recVUMI_FCAND(VU, VUREC_INFO); }
void recVU0MI_FMAND() { recVUMI_FMAND(VU, VUREC_INFO); }
#else
void recVU0MI_FSAND() { REC_VUOP(VU0, FSAND); }
void recVU0MI_FSEQ() { REC_VUOP(VU0, FSEQ); }
void recVU0MI_FSOR() { REC_VUOP(VU0, FSOR); }
void recVU0MI_FSSET() { REC_VUOP(VU0, FSSET); }
void recVU0MI_FMAND() { REC_VUOP(VU0, FMAND); }
void recVU0MI_FMEQ() { REC_VUOP(VU0, FMEQ); }
void recVU0MI_FMOR() { REC_VUOP(VU0, FMOR); }
void recVU0MI_FCAND() { REC_VUOP(VU0, FCAND); }
void recVU0MI_FCEQ() { REC_VUOP(VU0, FCEQ); }
void recVU0MI_FCOR() { REC_VUOP(VU0, FCOR); }
void recVU0MI_FCSET() { REC_VUOP(VU0, FCSET); }
void recVU0MI_FCGET() { REC_VUOP(VU0, FCGET); }
#endif
#ifdef RECOMPILE_VUMI_LOADSTORE
void recVU0MI_LQ() { recVUMI_LQ(VU, VUREC_INFO); }
void recVU0MI_LQD() { recVUMI_LQD(VU, VUREC_INFO); }
void recVU0MI_LQI() { recVUMI_LQI(VU, VUREC_INFO); }
void recVU0MI_SQ() { recVUMI_SQ(VU, VUREC_INFO); }
void recVU0MI_SQD() { recVUMI_SQD(VU, VUREC_INFO); }
void recVU0MI_SQI() { recVUMI_SQI(VU, VUREC_INFO); }
void recVU0MI_ILW() { recVUMI_ILW(VU, VUREC_INFO); }
void recVU0MI_ISW() { recVUMI_ISW(VU, VUREC_INFO); }
void recVU0MI_ILWR() { recVUMI_ILWR(VU, VUREC_INFO); }
void recVU0MI_ISWR() { recVUMI_ISWR(VU, VUREC_INFO); }
#else
void recVU0MI_LQ() { REC_VUOP(VU0, LQ); }
void recVU0MI_LQD() { REC_VUOP(VU0, LQD); }
void recVU0MI_LQI() { REC_VUOP(VU0, LQI); }
void recVU0MI_SQ() { REC_VUOP(VU0, SQ); }
void recVU0MI_SQD() { REC_VUOP(VU0, SQD); }
void recVU0MI_SQI() { REC_VUOP(VU0, SQI); }
void recVU0MI_ILW() { REC_VUOP(VU0, ILW); }
void recVU0MI_ISW() { REC_VUOP(VU0, ISW); }
void recVU0MI_ILWR() { REC_VUOP(VU0, ILWR); }
void recVU0MI_ISWR() { REC_VUOP(VU0, ISWR); }
#endif
#ifdef RECOMPILE_VUMI_ARITHMETIC
void recVU0MI_IADD() { recVUMI_IADD(VU, VUREC_INFO); }
void recVU0MI_IADDI() { recVUMI_IADDI(VU, VUREC_INFO); }
void recVU0MI_IADDIU() { recVUMI_IADDIU(VU, VUREC_INFO); }
void recVU0MI_IOR() { recVUMI_IOR(VU, VUREC_INFO); }
void recVU0MI_ISUB() { recVUMI_ISUB(VU, VUREC_INFO); }
void recVU0MI_IAND() { recVUMI_IAND(VU, VUREC_INFO); }
void recVU0MI_ISUBIU() { recVUMI_ISUBIU(VU, VUREC_INFO); }
#else
void recVU0MI_IADD() { REC_VUOP(VU0, IADD); }
void recVU0MI_IADDI() { REC_VUOP(VU0, IADDI); }
void recVU0MI_IADDIU() { REC_VUOP(VU0, IADDIU); }
void recVU0MI_IOR() { REC_VUOP(VU0, IOR); }
void recVU0MI_ISUB() { REC_VUOP(VU0, ISUB); }
void recVU0MI_IAND() { REC_VUOP(VU0, IAND); }
void recVU0MI_ISUBIU() { REC_VUOP(VU0, ISUBIU); }
#endif
#ifdef RECOMPILE_VUMI_BRANCH
void recVU0MI_IBEQ() { recVUMI_IBEQ(VU, VUREC_INFO); }
void recVU0MI_IBGEZ() { recVUMI_IBGEZ(VU, VUREC_INFO); }
void recVU0MI_IBLTZ() { recVUMI_IBLTZ(VU, VUREC_INFO); }
void recVU0MI_IBLEZ() { recVUMI_IBLEZ(VU, VUREC_INFO); }
void recVU0MI_IBGTZ() { recVUMI_IBGTZ(VU, VUREC_INFO); }
void recVU0MI_IBNE() { recVUMI_IBNE(VU, VUREC_INFO); }
void recVU0MI_B() { recVUMI_B(VU, VUREC_INFO); }
void recVU0MI_BAL() { recVUMI_BAL(VU, VUREC_INFO); }
void recVU0MI_JR() { recVUMI_JR(VU, VUREC_INFO); }
void recVU0MI_JALR() { recVUMI_JALR(VU, VUREC_INFO); }
#else
void recVU0MI_IBEQ() { REC_VUOP(VU0, IBEQ); }
void recVU0MI_IBGEZ() { REC_VUOP(VU0, IBGEZ); }
void recVU0MI_IBGTZ() { REC_VUOP(VU0, IBGTZ); }
void recVU0MI_IBLTZ() { REC_VUOP(VU0, IBLTZ); }
void recVU0MI_IBLEZ() { REC_VUOP(VU0, IBLEZ); }
void recVU0MI_IBNE() { REC_VUOP(VU0, IBNE); }
void recVU0MI_B() { REC_VUOP(VU0, B); }
void recVU0MI_BAL() { REC_VUOP(VU0, BAL); }
void recVU0MI_JR() { REC_VUOP(VU0, JR); }
void recVU0MI_JALR() { REC_VUOP(VU0, JALR); }
#endif