2006-06-15 04:19:30 +00:00
|
|
|
#ifndef _VUSHARED_H_
|
|
|
|
#define _VUSHARED_H_
|
|
|
|
|
|
|
|
#include "MIPSReflection.h"
|
2008-02-27 02:23:28 +00:00
|
|
|
#include "CodeGen.h"
|
2006-06-15 04:19:30 +00:00
|
|
|
#include "uint128.h"
|
2007-12-07 00:26:56 +00:00
|
|
|
#include <string.h>
|
2006-06-15 04:19:30 +00:00
|
|
|
|
|
|
|
namespace VUShared
|
|
|
|
{
|
|
|
|
enum VECTOR_COMP
|
|
|
|
{
|
|
|
|
VECTOR_COMPX = 0,
|
|
|
|
VECTOR_COMPY = 1,
|
|
|
|
VECTOR_COMPZ = 2,
|
|
|
|
VECTOR_COMPW = 3,
|
|
|
|
};
|
|
|
|
|
2008-05-02 00:55:54 +00:00
|
|
|
struct PIPEINFO
|
|
|
|
{
|
|
|
|
size_t value;
|
|
|
|
size_t heldValue;
|
|
|
|
size_t target;
|
|
|
|
};
|
|
|
|
|
|
|
|
int32 GetImm11Offset(uint16);
|
2006-06-15 04:19:30 +00:00
|
|
|
int32 GetBranch(uint16);
|
|
|
|
|
|
|
|
bool DestinationHasElement(uint8, unsigned int);
|
|
|
|
uint32* GetVectorElement(CMIPS*, unsigned int, unsigned int);
|
2006-07-18 12:08:40 +00:00
|
|
|
size_t GetVectorElement(unsigned int, unsigned int);
|
2006-06-15 04:19:30 +00:00
|
|
|
uint32* GetAccumulatorElement(CMIPS*, unsigned int);
|
2008-02-28 02:16:54 +00:00
|
|
|
size_t GetAccumulatorElement(unsigned int);
|
2006-06-15 04:19:30 +00:00
|
|
|
|
2008-04-09 02:52:38 +00:00
|
|
|
void PullVector(CCodeGen*, uint8, size_t);
|
2006-06-15 04:19:30 +00:00
|
|
|
|
2008-06-07 17:57:36 +00:00
|
|
|
void ADDA_base(CCodeGen*, uint8, size_t, size_t, bool);
|
2008-06-17 02:14:22 +00:00
|
|
|
void MADD_base(CCodeGen*, uint8, size_t, size_t, size_t, bool);
|
2008-06-07 17:57:36 +00:00
|
|
|
void MSUB_base(CCodeGen*, uint8, size_t, size_t, size_t, bool);
|
|
|
|
|
2006-06-15 04:19:30 +00:00
|
|
|
//Shared instructions
|
2008-04-04 01:50:41 +00:00
|
|
|
void ABS(CCodeGen*, uint8, uint8, uint8);
|
2008-02-27 02:23:28 +00:00
|
|
|
void ADD(CCodeGen*, uint8, uint8, uint8, uint8);
|
2008-02-29 02:11:27 +00:00
|
|
|
void ADDbc(CCodeGen*, uint8, uint8, uint8, uint8, uint8);
|
2008-04-18 01:09:44 +00:00
|
|
|
void ADDi(CCodeGen*, uint8, uint8, uint8);
|
2008-05-02 00:55:54 +00:00
|
|
|
void ADDq(CCodeGen*, uint8, uint8, uint8, uint32);
|
2008-06-07 17:57:36 +00:00
|
|
|
void ADDA(CCodeGen*, uint8, uint8, uint8);
|
2008-04-20 20:55:03 +00:00
|
|
|
void ADDAbc(CCodeGen*, uint8, uint8, uint8, uint8);
|
2008-04-19 16:50:09 +00:00
|
|
|
void CLIP(CCodeGen*, uint8, uint8);
|
2008-05-02 00:55:54 +00:00
|
|
|
void DIV(CCodeGen*, uint8, uint8, uint8, uint8, uint32, unsigned int);
|
2008-03-06 03:14:33 +00:00
|
|
|
void FTOI0(CCodeGen*, uint8, uint8, uint8);
|
|
|
|
void FTOI4(CCodeGen*, uint8, uint8, uint8);
|
2008-06-17 02:14:22 +00:00
|
|
|
void FTOI12(CCodeGen*, uint8, uint8, uint8);
|
2008-03-16 22:31:37 +00:00
|
|
|
void ITOF0(CCodeGen*, uint8, uint8, uint8);
|
2008-06-15 19:55:28 +00:00
|
|
|
void ITOF4(CCodeGen*, uint8, uint8, uint8);
|
|
|
|
void ITOF12(CCodeGen*, uint8, uint8, uint8);
|
2008-06-09 00:06:58 +00:00
|
|
|
void ITOF15(CCodeGen*, uint8, uint8, uint8);
|
2008-04-04 01:50:41 +00:00
|
|
|
void MADD(CCodeGen*, uint8, uint8, uint8, uint8);
|
2008-02-28 02:16:54 +00:00
|
|
|
void MADDbc(CCodeGen*, uint8, uint8, uint8, uint8, uint8);
|
2008-06-17 02:14:22 +00:00
|
|
|
void MADDq(CCodeGen*, uint8, uint8, uint8, uint32);
|
2008-04-04 01:50:41 +00:00
|
|
|
void MADDA(CCodeGen*, uint8, uint8, uint8);
|
2008-02-28 02:16:54 +00:00
|
|
|
void MADDAbc(CCodeGen*, uint8, uint8, uint8, uint8);
|
2008-04-04 01:50:41 +00:00
|
|
|
void MADDAi(CCodeGen*, uint8, uint8);
|
2008-03-16 22:31:37 +00:00
|
|
|
void MAX(CCodeGen*, uint8, uint8, uint8, uint8);
|
2008-03-15 16:20:36 +00:00
|
|
|
void MAXbc(CCodeGen*, uint8, uint8, uint8, uint8, uint8);
|
2008-03-16 22:31:37 +00:00
|
|
|
void MINI(CCodeGen*, uint8, uint8, uint8, uint8);
|
2008-03-15 16:20:36 +00:00
|
|
|
void MINIbc(CCodeGen*, uint8, uint8, uint8, uint8, uint8);
|
2008-04-20 20:55:03 +00:00
|
|
|
void MINIi(CCodeGen*, uint8, uint8, uint8);
|
2008-02-29 02:11:27 +00:00
|
|
|
void MOVE(CCodeGen*, uint8, uint8, uint8);
|
2008-02-27 02:23:28 +00:00
|
|
|
void MR32(CCodeGen*, uint8, uint8, uint8);
|
2008-06-07 17:57:36 +00:00
|
|
|
void MSUBbc(CCodeGen*, uint8, uint8, uint8, uint8, uint8);
|
2008-04-04 01:50:41 +00:00
|
|
|
void MSUBi(CCodeGen*, uint8, uint8, uint8);
|
2008-06-07 17:57:36 +00:00
|
|
|
void MSUBAbc(CCodeGen*, uint8, uint8, uint8, uint8);
|
2008-04-04 01:50:41 +00:00
|
|
|
void MSUBAi(CCodeGen*, uint8, uint8);
|
2008-02-29 02:11:27 +00:00
|
|
|
void MUL(CCodeGen*, uint8, uint8, uint8, uint8);
|
2008-03-03 00:38:28 +00:00
|
|
|
void MULbc(CCodeGen*, uint8, uint8, uint8, uint8, uint8);
|
2008-03-24 01:18:20 +00:00
|
|
|
void MULi(CCodeGen*, uint8, uint8, uint8);
|
2008-05-02 00:55:54 +00:00
|
|
|
void MULq(CCodeGen*, uint8, uint8, uint8, uint32);
|
2008-04-04 01:50:41 +00:00
|
|
|
void MULA(CCodeGen*, uint8, uint8, uint8);
|
2008-02-28 02:16:54 +00:00
|
|
|
void MULAbc(CCodeGen*, uint8, uint8, uint8, uint8);
|
2008-04-04 01:50:41 +00:00
|
|
|
void MULAi(CCodeGen*, uint8, uint8);
|
2008-02-28 02:16:54 +00:00
|
|
|
void OPMSUB(CCodeGen*, uint8, uint8, uint8);
|
|
|
|
void OPMULA(CCodeGen*, uint8, uint8);
|
2008-04-20 20:55:03 +00:00
|
|
|
void RINIT(CCodeGen*, uint8, uint8);
|
2008-06-07 17:57:36 +00:00
|
|
|
void RGET(CCodeGen*, uint8, uint8);
|
|
|
|
void RNEXT(CCodeGen*, uint8, uint8);
|
2008-05-02 00:55:54 +00:00
|
|
|
void RSQRT(CCodeGen*, uint8, uint8, uint8, uint8, uint32, unsigned int);
|
2008-05-28 02:29:57 +00:00
|
|
|
void RXOR(CCodeGen*, uint8, uint8);
|
2008-05-02 00:55:54 +00:00
|
|
|
void SQRT(CCodeGen*, uint8, uint8, uint32, unsigned int);
|
2008-02-27 02:23:28 +00:00
|
|
|
void SUB(CCodeGen*, uint8, uint8, uint8, uint8);
|
2008-03-15 16:20:36 +00:00
|
|
|
void SUBbc(CCodeGen*, uint8, uint8, uint8, uint8, uint8);
|
2008-04-04 01:50:41 +00:00
|
|
|
void SUBi(CCodeGen*, uint8, uint8, uint8);
|
2008-06-07 17:57:36 +00:00
|
|
|
void SUBAbc(CCodeGen*, uint8, uint8, uint8, uint8);
|
2008-05-02 00:55:54 +00:00
|
|
|
void WAITQ(CCodeGen*);
|
|
|
|
|
|
|
|
void FlushPipeline(const PIPEINFO&, CCodeGen*);
|
|
|
|
void QueueInPipeline(const PIPEINFO&, CCodeGen*, uint32);
|
|
|
|
void VerifyPipeline(const PIPEINFO&, CCodeGen*, uint32);
|
2006-06-15 04:19:30 +00:00
|
|
|
|
2008-05-02 00:55:54 +00:00
|
|
|
//Shared addressing modes
|
2006-06-15 04:19:30 +00:00
|
|
|
void ReflOpFdFsI(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
|
|
|
|
void ReflOpFdFsQ(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
|
|
|
|
void ReflOpFdFsFt(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
|
|
|
|
void ReflOpFdFsFtBc(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
|
|
|
|
void ReflOpFtFs(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 ReflOpAccFsFt(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
|
|
|
|
void ReflOpAccFsFtBc(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
|
2006-06-19 05:43:51 +00:00
|
|
|
void ReflOpRFsf(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
|
|
|
|
void ReflOpFtR(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
|
2006-06-15 04:19:30 +00:00
|
|
|
void ReflOpQFtf(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
|
|
|
|
void ReflOpQFsfFtf(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int);
|
|
|
|
|
|
|
|
extern const char* m_sBroadcast[4];
|
|
|
|
extern const char* m_sDestination[16];
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|