rpcs3/rpcs3/Emu/Cell/SPUOpcodes.h

449 lines
13 KiB
C++

#pragma once
namespace SPU_opcodes
{
enum SPU_0_10_Opcodes
{
STOP = 0x0,
LNOP = 0x1,
SYNC = 0x2,
DSYNC = 0x3,
MFSPR = 0xc,
RDCH = 0xd,
RCHCNT = 0xf,
SF = 0x40,
OR = 0x41,
BG = 0x42,
SFH = 0x48,
NOR = 0x49,
ABSDB = 0x53,
ROT = 0x58,
ROTM = 0x59,
ROTMA = 0x5a,
SHL = 0x5b,
ROTH = 0x5c,
ROTHM = 0x5d,
ROTMAH = 0x5e,
SHLH = 0x5f,
ROTI = 0x78,
ROTMI = 0x79,
ROTMAI = 0x7a,
SHLI = 0x7b,
ROTHI = 0x7c,
ROTHMI = 0x7d,
ROTMAHI = 0x7e,
SHLHI = 0x7f,
A = 0xc0,
AND = 0xc1,
CG = 0xc2,
AH = 0xc8,
NAND = 0xc9,
AVGB = 0xd3,
MTSPR = 0x10c,
WRCH = 0x10d,
BIZ = 0x128,
BINZ = 0x129,
BIHZ = 0x12a,
BIHNZ = 0x12b,
STOPD = 0x140,
STQX = 0x144,
BI = 0x1a8,
BISL = 0x1a9,
IRET = 0x1aa,
BISLED = 0x1ab,
HBR = 0x1ac,
GB = 0x1b0,
GBH = 0x1b1,
GBB = 0x1b2,
FSM = 0x1b4,
FSMH = 0x1b5,
FSMB = 0x1b6,
FREST = 0x1b8,
FRSQEST = 0x1b9,
LQX = 0x1c4,
ROTQBYBI = 0x1cc,
ROTQMBYBI = 0x1cd,
SHLQBYBI = 0x1cf,
CBX = 0x1d4,
CHX = 0x1d5,
CWX = 0x1d6,
CDX = 0x1d7,
ROTQBI = 0x1d8,
ROTQMBI = 0x1d9,
SHLQBI = 0x1db,
ROTQBY = 0x1dc,
ROTQMBY = 0x1dd,
SHLQBY = 0x1df,
ORX = 0x1f0,
CBD = 0x1f4,
CHD = 0x1f5,
CWD = 0x1f6,
CDD = 0x1f7,
ROTQBII = 0x1f8,
ROTQMBII = 0x1f9,
SHLQBII = 0x1fb,
ROTQBYI = 0x1fc,
ROTQMBYI = 0x1fd,
SHLQBYI = 0x1ff,
NOP = 0x201,
CGT = 0x240,
XOR = 0x241,
CGTH = 0x248,
EQV = 0x249,
CGTB = 0x250,
SUMB = 0x253,
HGT = 0x258,
CLZ = 0x2a5,
XSWD = 0x2a6,
XSHW = 0x2ae,
CNTB = 0x2b4,
XSBH = 0x2b6,
CLGT = 0x2c0,
ANDC = 0x2c1,
FCGT = 0x2c2,
DFCGT = 0x2c3,
FA = 0x2c4,
FS = 0x2c5,
FM = 0x2c6,
CLGTH = 0x2c8,
ORC = 0x2c9,
FCMGT = 0x2ca,
DFCMGT = 0x2cb,
DFA = 0x2cc,
DFS = 0x2cd,
DFM = 0x2ce,
CLGTB = 0x2d0,
HLGT = 0x2d8,
DFMA = 0x35c,
DFMS = 0x35d,
DFNMS = 0x35e,
DFNMA = 0x35f,
CEQ = 0x3c0,
MPYHHU = 0x3ce,
ADDX = 0x340,
SFX = 0x341,
CGX = 0x342,
BGX = 0x343,
MPYHHA = 0x346,
MPYHHAU = 0x34e,
FSCRRD = 0x398,
FESD = 0x3b8,
FRDS = 0x3b9,
FSCRWR = 0x3ba,
DFTSV = 0x3bf,
FCEQ = 0x3c2,
DFCEQ = 0x3c3,
MPY = 0x3c4,
MPYH = 0x3c5,
MPYHH = 0x3c6,
MPYS = 0x3c7,
CEQH = 0x3c8,
FCMEQ = 0x3ca,
DFCMEQ = 0x3cb,
MPYU = 0x3cc,
CEQB = 0x3d0,
FI = 0x3d4,
HEQ = 0x3d8,
};
enum SPU_0_9_Opcodes
{
CFLTS = 0x1d8,
CFLTU = 0x1d9,
CSFLT = 0x1da,
CUFLT = 0x1db,
};
enum SPU_0_8_Opcodes
{
BRZ = 0x40,
STQA = 0x41,
BRNZ = 0x42,
BRHZ = 0x44,
BRHNZ = 0x46,
STQR = 0x47,
BRA = 0x60,
LQA = 0x61,
BRASL = 0x62,
BR = 0x64,
FSMBI = 0x65,
BRSL = 0x66,
LQR = 0x67,
IL = 0x81,
ILHU = 0x82,
ILH = 0x83,
IOHL = 0xc1,
};
enum SPU_0_7_Opcodes
{
ORI = 0x4,
ORHI = 0x5,
ORBI = 0x6,
SFI = 0xc,
SFHI = 0xd,
ANDI = 0x14,
ANDHI = 0x15,
ANDBI = 0x16,
AI = 0x1c,
AHI = 0x1d,
STQD = 0x24,
LQD = 0x34,
XORI = 0x44,
XORHI = 0x45,
XORBI = 0x46,
CGTI = 0x4c,
CGTHI = 0x4d,
CGTBI = 0x4e,
HGTI = 0x4f,
CLGTI = 0x5c,
CLGTHI = 0x5d,
CLGTBI = 0x5e,
HLGTI = 0x5f,
MPYI = 0x74,
MPYUI = 0x75,
CEQI = 0x7c,
CEQHI = 0x7d,
CEQBI = 0x7e,
HEQI = 0x7f,
};
enum SPU_0_6_Opcodes
{
HBRA = 0x8,
HBRR = 0x9,
ILA = 0x21,
};
enum SPU_0_3_Opcodes
{
SELB = 0x8,
SHUFB = 0xb,
MPYA = 0xc,
FNMS = 0xd,
FMA = 0xe,
FMS = 0xf,
};
};
class SPUOpcodes
{
public:
static u32 branchTarget(const u64 pc, const s32 imm)
{
return (pc + (imm << 2)) & 0x3fffc;
}
//0 - 10
virtual void STOP(u32 code) = 0;
virtual void LNOP() = 0;
virtual void SYNC(u32 Cbit) = 0;
virtual void DSYNC() = 0;
virtual void MFSPR(u32 rt, u32 sa) = 0;
virtual void RDCH(u32 rt, u32 ra) = 0;
virtual void RCHCNT(u32 rt, u32 ra) = 0;
virtual void SF(u32 rt, u32 ra, u32 rb) = 0;
virtual void OR(u32 rt, u32 ra, u32 rb) = 0;
virtual void BG(u32 rt, u32 ra, u32 rb) = 0;
virtual void SFH(u32 rt, u32 ra, u32 rb) = 0;
virtual void NOR(u32 rt, u32 ra, u32 rb) = 0;
virtual void ABSDB(u32 rt, u32 ra, u32 rb) = 0;
virtual void ROT(u32 rt, u32 ra, u32 rb) = 0;
virtual void ROTM(u32 rt, u32 ra, u32 rb) = 0;
virtual void ROTMA(u32 rt, u32 ra, u32 rb) = 0;
virtual void SHL(u32 rt, u32 ra, u32 rb) = 0;
virtual void ROTH(u32 rt, u32 ra, u32 rb) = 0;
virtual void ROTHM(u32 rt, u32 ra, u32 rb) = 0;
virtual void ROTMAH(u32 rt, u32 ra, u32 rb) = 0;
virtual void SHLH(u32 rt, u32 ra, u32 rb) = 0;
virtual void ROTI(u32 rt, u32 ra, s32 i7) = 0;
virtual void ROTMI(u32 rt, u32 ra, s32 i7) = 0;
virtual void ROTMAI(u32 rt, u32 ra, s32 i7) = 0;
virtual void SHLI(u32 rt, u32 ra, s32 i7) = 0;
virtual void ROTHI(u32 rt, u32 ra, s32 i7) = 0;
virtual void ROTHMI(u32 rt, u32 ra, s32 i7) = 0;
virtual void ROTMAHI(u32 rt, u32 ra, s32 i7) = 0;
virtual void SHLHI(u32 rt, u32 ra, s32 i7) = 0;
virtual void A(u32 rt, u32 ra, u32 rb) = 0;
virtual void AND(u32 rt, u32 ra, u32 rb) = 0;
virtual void CG(u32 rt, u32 ra, u32 rb) = 0;
virtual void AH(u32 rt, u32 ra, u32 rb) = 0;
virtual void NAND(u32 rt, u32 ra, u32 rb) = 0;
virtual void AVGB(u32 rt, u32 ra, u32 rb) = 0;
virtual void MTSPR(u32 rt, u32 sa) = 0;
virtual void WRCH(u32 ra, u32 rt) = 0;
virtual void BIZ(u32 rt, u32 ra) = 0;
virtual void BINZ(u32 rt, u32 ra) = 0;
virtual void BIHZ(u32 rt, u32 ra) = 0;
virtual void BIHNZ(u32 rt, u32 ra) = 0;
virtual void STOPD(u32 rc, u32 ra, u32 rb) = 0;
virtual void STQX(u32 rt, u32 ra, u32 rb) = 0;
virtual void BI(u32 ra) = 0;
virtual void BISL(u32 rt, u32 ra) = 0;
virtual void IRET(u32 ra) = 0;
virtual void BISLED(u32 rt, u32 ra) = 0;
virtual void HBR(u32 p, u32 ro, u32 ra) = 0;
virtual void GB(u32 rt, u32 ra) = 0;
virtual void GBH(u32 rt, u32 ra) = 0;
virtual void GBB(u32 rt, u32 ra) = 0;
virtual void FSM(u32 rt, u32 ra) = 0;
virtual void FSMH(u32 rt, u32 ra) = 0;
virtual void FSMB(u32 rt, u32 ra) = 0;
virtual void FREST(u32 rt, u32 ra) = 0;
virtual void FRSQEST(u32 rt, u32 ra) = 0;
virtual void LQX(u32 rt, u32 ra, u32 rb) = 0;
virtual void ROTQBYBI(u32 rt, u32 ra, u32 rb) = 0;
virtual void ROTQMBYBI(u32 rt, u32 ra, u32 rb) = 0;
virtual void SHLQBYBI(u32 rt, u32 ra, u32 rb) = 0;
virtual void CBX(u32 rt, u32 ra, u32 rb) = 0;
virtual void CHX(u32 rt, u32 ra, u32 rb) = 0;
virtual void CWX(u32 rt, u32 ra, u32 rb) = 0;
virtual void CDX(u32 rt, u32 ra, u32 rb) = 0;
virtual void ROTQBI(u32 rt, u32 ra, u32 rb) = 0;
virtual void ROTQMBI(u32 rt, u32 ra, u32 rb) = 0;
virtual void SHLQBI(u32 rt, u32 ra, u32 rb) = 0;
virtual void ROTQBY(u32 rt, u32 ra, u32 rb) = 0;
virtual void ROTQMBY(u32 rt, u32 ra, u32 rb) = 0;
virtual void SHLQBY(u32 rt, u32 ra, u32 rb) = 0;
virtual void ORX(u32 rt, u32 ra) = 0;
virtual void CBD(u32 rt, u32 ra, s32 i7) = 0;
virtual void CHD(u32 rt, u32 ra, s32 i7) = 0;
virtual void CWD(u32 rt, u32 ra, s32 i7) = 0;
virtual void CDD(u32 rt, u32 ra, s32 i7) = 0;
virtual void ROTQBII(u32 rt, u32 ra, s32 i7) = 0;
virtual void ROTQMBII(u32 rt, u32 ra, s32 i7) = 0;
virtual void SHLQBII(u32 rt, u32 ra, s32 i7) = 0;
virtual void ROTQBYI(u32 rt, u32 ra, s32 i7) = 0;
virtual void ROTQMBYI(u32 rt, u32 ra, s32 i7) = 0;
virtual void SHLQBYI(u32 rt, u32 ra, s32 i7) = 0;
virtual void NOP(u32 rt) = 0;
virtual void CGT(u32 rt, u32 ra, u32 rb) = 0;
virtual void XOR(u32 rt, u32 ra, u32 rb) = 0;
virtual void CGTH(u32 rt, u32 ra, u32 rb) = 0;
virtual void EQV(u32 rt, u32 ra, u32 rb) = 0;
virtual void CGTB(u32 rt, u32 ra, u32 rb) = 0;
virtual void SUMB(u32 rt, u32 ra, u32 rb) = 0;
virtual void HGT(u32 rt, s32 ra, s32 rb) = 0;
virtual void CLZ(u32 rt, u32 ra) = 0;
virtual void XSWD(u32 rt, u32 ra) = 0;
virtual void XSHW(u32 rt, u32 ra) = 0;
virtual void CNTB(u32 rt, u32 ra) = 0;
virtual void XSBH(u32 rt, u32 ra) = 0;
virtual void CLGT(u32 rt, u32 ra, u32 rb) = 0;
virtual void ANDC(u32 rt, u32 ra, u32 rb) = 0;
virtual void FCGT(u32 rt, u32 ra, u32 rb) = 0;
virtual void DFCGT(u32 rt, u32 ra, u32 rb) = 0;
virtual void FA(u32 rt, u32 ra, u32 rb) = 0;
virtual void FS(u32 rt, u32 ra, u32 rb) = 0;
virtual void FM(u32 rt, u32 ra, u32 rb) = 0;
virtual void CLGTH(u32 rt, u32 ra, u32 rb) = 0;
virtual void ORC(u32 rt, u32 ra, u32 rb) = 0;
virtual void FCMGT(u32 rt, u32 ra, u32 rb) = 0;
virtual void DFCMGT(u32 rt, u32 ra, u32 rb) = 0;
virtual void DFA(u32 rt, u32 ra, u32 rb) = 0;
virtual void DFS(u32 rt, u32 ra, u32 rb) = 0;
virtual void DFM(u32 rt, u32 ra, u32 rb) = 0;
virtual void CLGTB(u32 rt, u32 ra, u32 rb) = 0;
virtual void HLGT(u32 rt, u32 ra, u32 rb) = 0;
virtual void DFMA(u32 rt, u32 ra, u32 rb) = 0;
virtual void DFMS(u32 rt, u32 ra, u32 rb) = 0;
virtual void DFNMS(u32 rt, u32 ra, u32 rb) = 0;
virtual void DFNMA(u32 rt, u32 ra, u32 rb) = 0;
virtual void CEQ(u32 rt, u32 ra, u32 rb) = 0;
virtual void MPYHHU(u32 rt, u32 ra, u32 rb) = 0;
virtual void ADDX(u32 rt, u32 ra, u32 rb) = 0;
virtual void SFX(u32 rt, u32 ra, u32 rb) = 0;
virtual void CGX(u32 rt, u32 ra, u32 rb) = 0;
virtual void BGX(u32 rt, u32 ra, u32 rb) = 0;
virtual void MPYHHA(u32 rt, u32 ra, u32 rb) = 0;
virtual void MPYHHAU(u32 rt, u32 ra, u32 rb) = 0;
virtual void FSCRRD(u32 rt) = 0;
virtual void FESD(u32 rt, u32 ra) = 0;
virtual void FRDS(u32 rt, u32 ra) = 0;
virtual void FSCRWR(u32 rt, u32 ra) = 0;
virtual void DFTSV(u32 rt, u32 ra, s32 i7) = 0;
virtual void FCEQ(u32 rt, u32 ra, u32 rb) = 0;
virtual void DFCEQ(u32 rt, u32 ra, u32 rb) = 0;
virtual void MPY(u32 rt, u32 ra, u32 rb) = 0;
virtual void MPYH(u32 rt, u32 ra, u32 rb) = 0;
virtual void MPYHH(u32 rt, u32 ra, u32 rb) = 0;
virtual void MPYS(u32 rt, u32 ra, u32 rb) = 0;
virtual void CEQH(u32 rt, u32 ra, u32 rb) = 0;
virtual void FCMEQ(u32 rt, u32 ra, u32 rb) = 0;
virtual void DFCMEQ(u32 rt, u32 ra, u32 rb) = 0;
virtual void MPYU(u32 rt, u32 ra, u32 rb) = 0;
virtual void CEQB(u32 rt, u32 ra, u32 rb) = 0;
virtual void FI(u32 rt, u32 ra, u32 rb) = 0;
virtual void HEQ(u32 rt, u32 ra, u32 rb) = 0;
//0 - 9
virtual void CFLTS(u32 rt, u32 ra, s32 i8) = 0;
virtual void CFLTU(u32 rt, u32 ra, s32 i8) = 0;
virtual void CSFLT(u32 rt, u32 ra, s32 i8) = 0;
virtual void CUFLT(u32 rt, u32 ra, s32 i8) = 0;
//0 - 8
virtual void BRZ(u32 rt, s32 i16) = 0;
virtual void STQA(u32 rt, s32 i16) = 0;
virtual void BRNZ(u32 rt, s32 i16) = 0;
virtual void BRHZ(u32 rt, s32 i16) = 0;
virtual void BRHNZ(u32 rt, s32 i16) = 0;
virtual void STQR(u32 rt, s32 i16) = 0;
virtual void BRA(s32 i16) = 0;
virtual void LQA(u32 rt, s32 i16) = 0;
virtual void BRASL(u32 rt, s32 i16) = 0;
virtual void BR(s32 i16) = 0;
virtual void FSMBI(u32 rt, s32 i16) = 0;
virtual void BRSL(u32 rt, s32 i16) = 0;
virtual void LQR(u32 rt, s32 i16) = 0;
virtual void IL(u32 rt, s32 i16) = 0;
virtual void ILHU(u32 rt, s32 i16) = 0;
virtual void ILH(u32 rt, s32 i16) = 0;
virtual void IOHL(u32 rt, s32 i16) = 0;
//0 - 7
virtual void ORI(u32 rt, u32 ra, s32 i10) = 0;
virtual void ORHI(u32 rt, u32 ra, s32 i10) = 0;
virtual void ORBI(u32 rt, u32 ra, s32 i10) = 0;
virtual void SFI(u32 rt, u32 ra, s32 i10) = 0;
virtual void SFHI(u32 rt, u32 ra, s32 i10) = 0;
virtual void ANDI(u32 rt, u32 ra, s32 i10) = 0;
virtual void ANDHI(u32 rt, u32 ra, s32 i10) = 0;
virtual void ANDBI(u32 rt, u32 ra, s32 i10) = 0;
virtual void AI(u32 rt, u32 ra, s32 i10) = 0;
virtual void AHI(u32 rt, u32 ra, s32 i10) = 0;
virtual void STQD(u32 rt, s32 i10, u32 ra) = 0;
virtual void LQD(u32 rt, s32 i10, u32 ra) = 0;
virtual void XORI(u32 rt, u32 ra, s32 i10) = 0;
virtual void XORHI(u32 rt, u32 ra, s32 i10) = 0;
virtual void XORBI(u32 rt, u32 ra, s32 i10) = 0;
virtual void CGTI(u32 rt, u32 ra, s32 i10) = 0;
virtual void CGTHI(u32 rt, u32 ra, s32 i10) = 0;
virtual void CGTBI(u32 rt, u32 ra, s32 i10) = 0;
virtual void HGTI(u32 rt, u32 ra, s32 i10) = 0;
virtual void CLGTI(u32 rt, u32 ra, s32 i10) = 0;
virtual void CLGTHI(u32 rt, u32 ra, s32 i10) = 0;
virtual void CLGTBI(u32 rt, u32 ra, s32 i10) = 0;
virtual void HLGTI(u32 rt, u32 ra, s32 i10) = 0;
virtual void MPYI(u32 rt, u32 ra, s32 i10) = 0;
virtual void MPYUI(u32 rt, u32 ra, s32 i10) = 0;
virtual void CEQI(u32 rt, u32 ra, s32 i10) = 0;
virtual void CEQHI(u32 rt, u32 ra, s32 i10) = 0;
virtual void CEQBI(u32 rt, u32 ra, s32 i10) = 0;
virtual void HEQI(u32 rt, u32 ra, s32 i10) = 0;
//0 - 6
virtual void HBRA(s32 ro, s32 i16) = 0;
virtual void HBRR(s32 ro, s32 i16) = 0;
virtual void ILA(u32 rt, s32 i18) = 0;
//0 - 3
virtual void SELB(u32 rc, u32 ra, u32 rb, u32 rt) = 0;
virtual void SHUFB(u32 rc, u32 ra, u32 rb, u32 rt) = 0;
virtual void MPYA(u32 rc, u32 ra, u32 rb, u32 rt) = 0;
virtual void FNMS(u32 rc, u32 ra, u32 rb, u32 rt) = 0;
virtual void FMA(u32 rc, u32 ra, u32 rb, u32 rt) = 0;
virtual void FMS(u32 rc, u32 ra, u32 rb, u32 rt) = 0;
virtual void UNK(u32 code, u32 opcode, u32 gcode) = 0;
};