mirror of
https://github.com/RPCSX/rpcsx.git
synced 2025-12-06 07:12:14 +01:00
Add atomic_t<>::try_dec instead of fetch_dec_sat Add atomic_t<>::try_inc GDBDebugServer is broken (needs rewrite) Removed old_thread class (former named_thread) Removed storing/rethrowing exceptions from thread Emu.Stop doesn't inject an exception anymore task_stack helper class removed thread_base simplified (no shared_from_this) thread_ctrl::spawn simplified (creates detached thread) Implemented overrideable thread detaching logic Disabled cellAdec, cellDmux, cellFsAio SPUThread renamed to spu_thread RawSPUThread removed, spu_thread used instead Disabled deriving from ppu_thread Partial support for thread renaming lv2_timer... simplified, screw it idm/fxm: butchered support for on_stop/on_init vm: improved allocation structure (added size)
250 lines
11 KiB
C++
250 lines
11 KiB
C++
#pragma once
|
|
|
|
#include "SPUOpcodes.h"
|
|
|
|
class spu_thread;
|
|
|
|
using spu_inter_func_t = bool(*)(spu_thread& spu, spu_opcode_t op);
|
|
|
|
struct spu_interpreter
|
|
{
|
|
static bool UNK(spu_thread&, spu_opcode_t);
|
|
static void set_interrupt_status(spu_thread&, spu_opcode_t);
|
|
|
|
static bool STOP(spu_thread&, spu_opcode_t);
|
|
static bool LNOP(spu_thread&, spu_opcode_t);
|
|
static bool SYNC(spu_thread&, spu_opcode_t);
|
|
static bool DSYNC(spu_thread&, spu_opcode_t);
|
|
static bool MFSPR(spu_thread&, spu_opcode_t);
|
|
static bool RDCH(spu_thread&, spu_opcode_t);
|
|
static bool RCHCNT(spu_thread&, spu_opcode_t);
|
|
static bool SF(spu_thread&, spu_opcode_t);
|
|
static bool OR(spu_thread&, spu_opcode_t);
|
|
static bool BG(spu_thread&, spu_opcode_t);
|
|
static bool SFH(spu_thread&, spu_opcode_t);
|
|
static bool NOR(spu_thread&, spu_opcode_t);
|
|
static bool ABSDB(spu_thread&, spu_opcode_t);
|
|
static bool ROT(spu_thread&, spu_opcode_t);
|
|
static bool ROTM(spu_thread&, spu_opcode_t);
|
|
static bool ROTMA(spu_thread&, spu_opcode_t);
|
|
static bool SHL(spu_thread&, spu_opcode_t);
|
|
static bool ROTH(spu_thread&, spu_opcode_t);
|
|
static bool ROTHM(spu_thread&, spu_opcode_t);
|
|
static bool ROTMAH(spu_thread&, spu_opcode_t);
|
|
static bool SHLH(spu_thread&, spu_opcode_t);
|
|
static bool ROTI(spu_thread&, spu_opcode_t);
|
|
static bool ROTMI(spu_thread&, spu_opcode_t);
|
|
static bool ROTMAI(spu_thread&, spu_opcode_t);
|
|
static bool SHLI(spu_thread&, spu_opcode_t);
|
|
static bool ROTHI(spu_thread&, spu_opcode_t);
|
|
static bool ROTHMI(spu_thread&, spu_opcode_t);
|
|
static bool ROTMAHI(spu_thread&, spu_opcode_t);
|
|
static bool SHLHI(spu_thread&, spu_opcode_t);
|
|
static bool A(spu_thread&, spu_opcode_t);
|
|
static bool AND(spu_thread&, spu_opcode_t);
|
|
static bool CG(spu_thread&, spu_opcode_t);
|
|
static bool AH(spu_thread&, spu_opcode_t);
|
|
static bool NAND(spu_thread&, spu_opcode_t);
|
|
static bool AVGB(spu_thread&, spu_opcode_t);
|
|
static bool MTSPR(spu_thread&, spu_opcode_t);
|
|
static bool WRCH(spu_thread&, spu_opcode_t);
|
|
static bool BIZ(spu_thread&, spu_opcode_t);
|
|
static bool BINZ(spu_thread&, spu_opcode_t);
|
|
static bool BIHZ(spu_thread&, spu_opcode_t);
|
|
static bool BIHNZ(spu_thread&, spu_opcode_t);
|
|
static bool STOPD(spu_thread&, spu_opcode_t);
|
|
static bool STQX(spu_thread&, spu_opcode_t);
|
|
static bool BI(spu_thread&, spu_opcode_t);
|
|
static bool BISL(spu_thread&, spu_opcode_t);
|
|
static bool IRET(spu_thread&, spu_opcode_t);
|
|
static bool BISLED(spu_thread&, spu_opcode_t);
|
|
static bool HBR(spu_thread&, spu_opcode_t);
|
|
static bool GB(spu_thread&, spu_opcode_t);
|
|
static bool GBH(spu_thread&, spu_opcode_t);
|
|
static bool GBB(spu_thread&, spu_opcode_t);
|
|
static bool FSM(spu_thread&, spu_opcode_t);
|
|
static bool FSMH(spu_thread&, spu_opcode_t);
|
|
static bool FSMB(spu_thread&, spu_opcode_t);
|
|
static bool LQX(spu_thread&, spu_opcode_t);
|
|
static bool ROTQBYBI(spu_thread&, spu_opcode_t);
|
|
static bool ROTQMBYBI(spu_thread&, spu_opcode_t);
|
|
static bool SHLQBYBI(spu_thread&, spu_opcode_t);
|
|
static bool CBX(spu_thread&, spu_opcode_t);
|
|
static bool CHX(spu_thread&, spu_opcode_t);
|
|
static bool CWX(spu_thread&, spu_opcode_t);
|
|
static bool CDX(spu_thread&, spu_opcode_t);
|
|
static bool ROTQBI(spu_thread&, spu_opcode_t);
|
|
static bool ROTQMBI(spu_thread&, spu_opcode_t);
|
|
static bool SHLQBI(spu_thread&, spu_opcode_t);
|
|
static bool ROTQBY(spu_thread&, spu_opcode_t);
|
|
static bool ROTQMBY(spu_thread&, spu_opcode_t);
|
|
static bool SHLQBY(spu_thread&, spu_opcode_t);
|
|
static bool ORX(spu_thread&, spu_opcode_t);
|
|
static bool CBD(spu_thread&, spu_opcode_t);
|
|
static bool CHD(spu_thread&, spu_opcode_t);
|
|
static bool CWD(spu_thread&, spu_opcode_t);
|
|
static bool CDD(spu_thread&, spu_opcode_t);
|
|
static bool ROTQBII(spu_thread&, spu_opcode_t);
|
|
static bool ROTQMBII(spu_thread&, spu_opcode_t);
|
|
static bool SHLQBII(spu_thread&, spu_opcode_t);
|
|
static bool ROTQBYI(spu_thread&, spu_opcode_t);
|
|
static bool ROTQMBYI(spu_thread&, spu_opcode_t);
|
|
static bool SHLQBYI(spu_thread&, spu_opcode_t);
|
|
static bool NOP(spu_thread&, spu_opcode_t);
|
|
static bool CGT(spu_thread&, spu_opcode_t);
|
|
static bool XOR(spu_thread&, spu_opcode_t);
|
|
static bool CGTH(spu_thread&, spu_opcode_t);
|
|
static bool EQV(spu_thread&, spu_opcode_t);
|
|
static bool CGTB(spu_thread&, spu_opcode_t);
|
|
static bool SUMB(spu_thread&, spu_opcode_t);
|
|
static bool HGT(spu_thread&, spu_opcode_t);
|
|
static bool CLZ(spu_thread&, spu_opcode_t);
|
|
static bool XSWD(spu_thread&, spu_opcode_t);
|
|
static bool XSHW(spu_thread&, spu_opcode_t);
|
|
static bool CNTB(spu_thread&, spu_opcode_t);
|
|
static bool XSBH(spu_thread&, spu_opcode_t);
|
|
static bool CLGT(spu_thread&, spu_opcode_t);
|
|
static bool ANDC(spu_thread&, spu_opcode_t);
|
|
static bool CLGTH(spu_thread&, spu_opcode_t);
|
|
static bool ORC(spu_thread&, spu_opcode_t);
|
|
static bool CLGTB(spu_thread&, spu_opcode_t);
|
|
static bool HLGT(spu_thread&, spu_opcode_t);
|
|
static bool CEQ(spu_thread&, spu_opcode_t);
|
|
static bool MPYHHU(spu_thread&, spu_opcode_t);
|
|
static bool ADDX(spu_thread&, spu_opcode_t);
|
|
static bool SFX(spu_thread&, spu_opcode_t);
|
|
static bool CGX(spu_thread&, spu_opcode_t);
|
|
static bool BGX(spu_thread&, spu_opcode_t);
|
|
static bool MPYHHA(spu_thread&, spu_opcode_t);
|
|
static bool MPYHHAU(spu_thread&, spu_opcode_t);
|
|
static bool MPY(spu_thread&, spu_opcode_t);
|
|
static bool MPYH(spu_thread&, spu_opcode_t);
|
|
static bool MPYHH(spu_thread&, spu_opcode_t);
|
|
static bool MPYS(spu_thread&, spu_opcode_t);
|
|
static bool CEQH(spu_thread&, spu_opcode_t);
|
|
static bool MPYU(spu_thread&, spu_opcode_t);
|
|
static bool CEQB(spu_thread&, spu_opcode_t);
|
|
static bool HEQ(spu_thread&, spu_opcode_t);
|
|
static bool BRZ(spu_thread&, spu_opcode_t);
|
|
static bool STQA(spu_thread&, spu_opcode_t);
|
|
static bool BRNZ(spu_thread&, spu_opcode_t);
|
|
static bool BRHZ(spu_thread&, spu_opcode_t);
|
|
static bool BRHNZ(spu_thread&, spu_opcode_t);
|
|
static bool STQR(spu_thread&, spu_opcode_t);
|
|
static bool BRA(spu_thread&, spu_opcode_t);
|
|
static bool LQA(spu_thread&, spu_opcode_t);
|
|
static bool BRASL(spu_thread&, spu_opcode_t);
|
|
static bool BR(spu_thread&, spu_opcode_t);
|
|
static bool FSMBI(spu_thread&, spu_opcode_t);
|
|
static bool BRSL(spu_thread&, spu_opcode_t);
|
|
static bool LQR(spu_thread&, spu_opcode_t);
|
|
static bool IL(spu_thread&, spu_opcode_t);
|
|
static bool ILHU(spu_thread&, spu_opcode_t);
|
|
static bool ILH(spu_thread&, spu_opcode_t);
|
|
static bool IOHL(spu_thread&, spu_opcode_t);
|
|
static bool ORI(spu_thread&, spu_opcode_t);
|
|
static bool ORHI(spu_thread&, spu_opcode_t);
|
|
static bool ORBI(spu_thread&, spu_opcode_t);
|
|
static bool SFI(spu_thread&, spu_opcode_t);
|
|
static bool SFHI(spu_thread&, spu_opcode_t);
|
|
static bool ANDI(spu_thread&, spu_opcode_t);
|
|
static bool ANDHI(spu_thread&, spu_opcode_t);
|
|
static bool ANDBI(spu_thread&, spu_opcode_t);
|
|
static bool AI(spu_thread&, spu_opcode_t);
|
|
static bool AHI(spu_thread&, spu_opcode_t);
|
|
static bool STQD(spu_thread&, spu_opcode_t);
|
|
static bool LQD(spu_thread&, spu_opcode_t);
|
|
static bool XORI(spu_thread&, spu_opcode_t);
|
|
static bool XORHI(spu_thread&, spu_opcode_t);
|
|
static bool XORBI(spu_thread&, spu_opcode_t);
|
|
static bool CGTI(spu_thread&, spu_opcode_t);
|
|
static bool CGTHI(spu_thread&, spu_opcode_t);
|
|
static bool CGTBI(spu_thread&, spu_opcode_t);
|
|
static bool HGTI(spu_thread&, spu_opcode_t);
|
|
static bool CLGTI(spu_thread&, spu_opcode_t);
|
|
static bool CLGTHI(spu_thread&, spu_opcode_t);
|
|
static bool CLGTBI(spu_thread&, spu_opcode_t);
|
|
static bool HLGTI(spu_thread&, spu_opcode_t);
|
|
static bool MPYI(spu_thread&, spu_opcode_t);
|
|
static bool MPYUI(spu_thread&, spu_opcode_t);
|
|
static bool CEQI(spu_thread&, spu_opcode_t);
|
|
static bool CEQHI(spu_thread&, spu_opcode_t);
|
|
static bool CEQBI(spu_thread&, spu_opcode_t);
|
|
static bool HEQI(spu_thread&, spu_opcode_t);
|
|
static bool HBRA(spu_thread&, spu_opcode_t);
|
|
static bool HBRR(spu_thread&, spu_opcode_t);
|
|
static bool ILA(spu_thread&, spu_opcode_t);
|
|
static bool SELB(spu_thread&, spu_opcode_t);
|
|
static const spu_inter_func_t SHUFB;
|
|
static bool MPYA(spu_thread&, spu_opcode_t);
|
|
static bool DFCGT(spu_thread&, spu_opcode_t);
|
|
static bool DFCMGT(spu_thread&, spu_opcode_t);
|
|
static bool DFTSV(spu_thread&, spu_opcode_t);
|
|
static bool DFCEQ(spu_thread&, spu_opcode_t);
|
|
static bool DFCMEQ(spu_thread&, spu_opcode_t);
|
|
};
|
|
|
|
struct spu_interpreter_fast final : spu_interpreter
|
|
{
|
|
static bool FREST(spu_thread&, spu_opcode_t);
|
|
static bool FRSQEST(spu_thread&, spu_opcode_t);
|
|
static bool FCGT(spu_thread&, spu_opcode_t);
|
|
static bool FA(spu_thread&, spu_opcode_t);
|
|
static bool FS(spu_thread&, spu_opcode_t);
|
|
static bool FM(spu_thread&, spu_opcode_t);
|
|
static bool FCMGT(spu_thread&, spu_opcode_t);
|
|
static bool DFA(spu_thread&, spu_opcode_t);
|
|
static bool DFS(spu_thread&, spu_opcode_t);
|
|
static bool DFM(spu_thread&, spu_opcode_t);
|
|
static bool DFMA(spu_thread&, spu_opcode_t);
|
|
static bool DFMS(spu_thread&, spu_opcode_t);
|
|
static bool DFNMS(spu_thread&, spu_opcode_t);
|
|
static bool DFNMA(spu_thread&, spu_opcode_t);
|
|
static bool FSCRRD(spu_thread&, spu_opcode_t);
|
|
static bool FESD(spu_thread&, spu_opcode_t);
|
|
static bool FRDS(spu_thread&, spu_opcode_t);
|
|
static bool FSCRWR(spu_thread&, spu_opcode_t);
|
|
static bool FCEQ(spu_thread&, spu_opcode_t);
|
|
static bool FCMEQ(spu_thread&, spu_opcode_t);
|
|
static bool FI(spu_thread&, spu_opcode_t);
|
|
static bool CFLTS(spu_thread&, spu_opcode_t);
|
|
static bool CFLTU(spu_thread&, spu_opcode_t);
|
|
static bool CSFLT(spu_thread&, spu_opcode_t);
|
|
static bool CUFLT(spu_thread&, spu_opcode_t);
|
|
static bool FNMS(spu_thread&, spu_opcode_t);
|
|
static bool FMA(spu_thread&, spu_opcode_t);
|
|
static bool FMS(spu_thread&, spu_opcode_t);
|
|
};
|
|
|
|
struct spu_interpreter_precise final : spu_interpreter
|
|
{
|
|
static bool FREST(spu_thread&, spu_opcode_t);
|
|
static bool FRSQEST(spu_thread&, spu_opcode_t);
|
|
static bool FCGT(spu_thread&, spu_opcode_t);
|
|
static bool FA(spu_thread&, spu_opcode_t);
|
|
static bool FS(spu_thread&, spu_opcode_t);
|
|
static bool FM(spu_thread&, spu_opcode_t);
|
|
static bool FCMGT(spu_thread&, spu_opcode_t);
|
|
static bool DFA(spu_thread&, spu_opcode_t);
|
|
static bool DFS(spu_thread&, spu_opcode_t);
|
|
static bool DFM(spu_thread&, spu_opcode_t);
|
|
static bool DFMA(spu_thread&, spu_opcode_t);
|
|
static bool DFMS(spu_thread&, spu_opcode_t);
|
|
static bool DFNMS(spu_thread&, spu_opcode_t);
|
|
static bool DFNMA(spu_thread&, spu_opcode_t);
|
|
static bool FSCRRD(spu_thread&, spu_opcode_t);
|
|
static bool FESD(spu_thread&, spu_opcode_t);
|
|
static bool FRDS(spu_thread&, spu_opcode_t);
|
|
static bool FSCRWR(spu_thread&, spu_opcode_t);
|
|
static bool FCEQ(spu_thread&, spu_opcode_t);
|
|
static bool FCMEQ(spu_thread&, spu_opcode_t);
|
|
static bool FI(spu_thread&, spu_opcode_t);
|
|
static bool CFLTS(spu_thread&, spu_opcode_t);
|
|
static bool CFLTU(spu_thread&, spu_opcode_t);
|
|
static bool CSFLT(spu_thread&, spu_opcode_t);
|
|
static bool CUFLT(spu_thread&, spu_opcode_t);
|
|
static bool FNMS(spu_thread&, spu_opcode_t);
|
|
static bool FMA(spu_thread&, spu_opcode_t);
|
|
static bool FMS(spu_thread&, spu_opcode_t);
|
|
};
|