spu_iname: refactor to use actual strings

This commit is contained in:
Nekotekina 2020-03-26 15:23:13 +03:00
parent 453478c98b
commit 8d1a9dce91
2 changed files with 201 additions and 229 deletions

View file

@ -1,15 +1,2 @@
#include "stdafx.h"
#include "SPUAnalyser.h"
template <>
void fmt_class_string<spu_iname::type>::format(std::string& out, u64 arg)
{
// Decode instruction name from the enum value
for (u32 i = 0; i < 10; i++)
{
if (u64 value = (arg >> (54 - i * 6)) & 0x3f)
{
out += static_cast<char>(value + 0x20);
}
}
}

View file

@ -490,225 +490,210 @@ struct spu_iflag
}
};
// Encode instruction name: 6 bits per character (0x20..0x5f), max 10
static constexpr u64 spu_iname_encode(const char* ptr, u64 value = 0)
{
return *ptr == '\0' ? value : spu_iname_encode(ptr + 1, (*ptr - 0x20) | (value << 6));
}
#define NAME(x) x = spu_iname_encode(#x)
#define NAME(x) static constexpr const char& x = *#x
struct spu_iname
{
enum type : u64
{
NAME(UNK),
NAME(HEQ),
NAME(HEQI),
NAME(HGT),
NAME(HGTI),
NAME(HLGT),
NAME(HLGTI),
NAME(HBR),
NAME(HBRA),
NAME(HBRR),
NAME(STOP),
NAME(STOPD),
NAME(LNOP),
NAME(NOP),
NAME(SYNC),
NAME(DSYNC),
NAME(MFSPR),
NAME(MTSPR),
NAME(RDCH),
NAME(RCHCNT),
NAME(WRCH),
NAME(LQD),
NAME(LQX),
NAME(LQA),
NAME(LQR),
NAME(STQD),
NAME(STQX),
NAME(STQA),
NAME(STQR),
NAME(CBD),
NAME(CBX),
NAME(CHD),
NAME(CHX),
NAME(CWD),
NAME(CWX),
NAME(CDD),
NAME(CDX),
NAME(ILH),
NAME(ILHU),
NAME(IL),
NAME(ILA),
NAME(IOHL),
NAME(FSMBI),
NAME(AH),
NAME(AHI),
NAME(A),
NAME(AI),
NAME(SFH),
NAME(SFHI),
NAME(SF),
NAME(SFI),
NAME(ADDX),
NAME(CG),
NAME(CGX),
NAME(SFX),
NAME(BG),
NAME(BGX),
NAME(MPY),
NAME(MPYU),
NAME(MPYI),
NAME(MPYUI),
NAME(MPYH),
NAME(MPYS),
NAME(MPYHH),
NAME(MPYHHA),
NAME(MPYHHU),
NAME(MPYHHAU),
NAME(CLZ),
NAME(CNTB),
NAME(FSMB),
NAME(FSMH),
NAME(FSM),
NAME(GBB),
NAME(GBH),
NAME(GB),
NAME(AVGB),
NAME(ABSDB),
NAME(SUMB),
NAME(XSBH),
NAME(XSHW),
NAME(XSWD),
NAME(AND),
NAME(ANDC),
NAME(ANDBI),
NAME(ANDHI),
NAME(ANDI),
NAME(OR),
NAME(ORC),
NAME(ORBI),
NAME(ORHI),
NAME(ORI),
NAME(ORX),
NAME(XOR),
NAME(XORBI),
NAME(XORHI),
NAME(XORI),
NAME(NAND),
NAME(NOR),
NAME(EQV),
NAME(MPYA),
NAME(SELB),
NAME(SHUFB),
NAME(SHLH),
NAME(SHLHI),
NAME(SHL),
NAME(SHLI),
NAME(SHLQBI),
NAME(SHLQBII),
NAME(SHLQBY),
NAME(SHLQBYI),
NAME(SHLQBYBI),
NAME(ROTH),
NAME(ROTHI),
NAME(ROT),
NAME(ROTI),
NAME(ROTQBY),
NAME(ROTQBYI),
NAME(ROTQBYBI),
NAME(ROTQBI),
NAME(ROTQBII),
NAME(ROTHM),
NAME(ROTHMI),
NAME(ROTM),
NAME(ROTMI),
NAME(ROTQMBY),
NAME(ROTQMBYI),
NAME(ROTQMBYBI),
NAME(ROTQMBI),
NAME(ROTQMBII),
NAME(ROTMAH),
NAME(ROTMAHI),
NAME(ROTMA),
NAME(ROTMAI),
NAME(CEQB),
NAME(CEQBI),
NAME(CEQH),
NAME(CEQHI),
NAME(CEQ),
NAME(CEQI),
NAME(CGTB),
NAME(CGTBI),
NAME(CGTH),
NAME(CGTHI),
NAME(CGT),
NAME(CGTI),
NAME(CLGTB),
NAME(CLGTBI),
NAME(CLGTH),
NAME(CLGTHI),
NAME(CLGT),
NAME(CLGTI),
NAME(BR),
NAME(BRA),
NAME(BRSL),
NAME(BRASL),
NAME(BI),
NAME(IRET),
NAME(BISLED),
NAME(BISL),
NAME(BRNZ),
NAME(BRZ),
NAME(BRHNZ),
NAME(BRHZ),
NAME(BIZ),
NAME(BINZ),
NAME(BIHZ),
NAME(BIHNZ),
NAME(FA),
NAME(DFA),
NAME(FS),
NAME(DFS),
NAME(FM),
NAME(DFM),
NAME(DFMA),
NAME(DFNMS),
NAME(DFMS),
NAME(DFNMA),
NAME(FREST),
NAME(FRSQEST),
NAME(FI),
NAME(CSFLT),
NAME(CFLTS),
NAME(CUFLT),
NAME(CFLTU),
NAME(FRDS),
NAME(FESD),
NAME(FCEQ),
NAME(FCMEQ),
NAME(FCGT),
NAME(FCMGT),
NAME(FSCRWR),
NAME(FSCRRD),
NAME(DFCEQ),
NAME(DFCMEQ),
NAME(DFCGT),
NAME(DFCMGT),
NAME(DFTSV),
NAME(FMA),
NAME(FNMS),
NAME(FMS),
};
// Enable address-of operator for spu_decoder<>
friend constexpr type operator &(type value)
{
return value;
}
NAME(UNK);
NAME(HEQ);
NAME(HEQI);
NAME(HGT);
NAME(HGTI);
NAME(HLGT);
NAME(HLGTI);
NAME(HBR);
NAME(HBRA);
NAME(HBRR);
NAME(STOP);
NAME(STOPD);
NAME(LNOP);
NAME(NOP);
NAME(SYNC);
NAME(DSYNC);
NAME(MFSPR);
NAME(MTSPR);
NAME(RDCH);
NAME(RCHCNT);
NAME(WRCH);
NAME(LQD);
NAME(LQX);
NAME(LQA);
NAME(LQR);
NAME(STQD);
NAME(STQX);
NAME(STQA);
NAME(STQR);
NAME(CBD);
NAME(CBX);
NAME(CHD);
NAME(CHX);
NAME(CWD);
NAME(CWX);
NAME(CDD);
NAME(CDX);
NAME(ILH);
NAME(ILHU);
NAME(IL);
NAME(ILA);
NAME(IOHL);
NAME(FSMBI);
NAME(AH);
NAME(AHI);
NAME(A);
NAME(AI);
NAME(SFH);
NAME(SFHI);
NAME(SF);
NAME(SFI);
NAME(ADDX);
NAME(CG);
NAME(CGX);
NAME(SFX);
NAME(BG);
NAME(BGX);
NAME(MPY);
NAME(MPYU);
NAME(MPYI);
NAME(MPYUI);
NAME(MPYH);
NAME(MPYS);
NAME(MPYHH);
NAME(MPYHHA);
NAME(MPYHHU);
NAME(MPYHHAU);
NAME(CLZ);
NAME(CNTB);
NAME(FSMB);
NAME(FSMH);
NAME(FSM);
NAME(GBB);
NAME(GBH);
NAME(GB);
NAME(AVGB);
NAME(ABSDB);
NAME(SUMB);
NAME(XSBH);
NAME(XSHW);
NAME(XSWD);
NAME(AND);
NAME(ANDC);
NAME(ANDBI);
NAME(ANDHI);
NAME(ANDI);
NAME(OR);
NAME(ORC);
NAME(ORBI);
NAME(ORHI);
NAME(ORI);
NAME(ORX);
NAME(XOR);
NAME(XORBI);
NAME(XORHI);
NAME(XORI);
NAME(NAND);
NAME(NOR);
NAME(EQV);
NAME(MPYA);
NAME(SELB);
NAME(SHUFB);
NAME(SHLH);
NAME(SHLHI);
NAME(SHL);
NAME(SHLI);
NAME(SHLQBI);
NAME(SHLQBII);
NAME(SHLQBY);
NAME(SHLQBYI);
NAME(SHLQBYBI);
NAME(ROTH);
NAME(ROTHI);
NAME(ROT);
NAME(ROTI);
NAME(ROTQBY);
NAME(ROTQBYI);
NAME(ROTQBYBI);
NAME(ROTQBI);
NAME(ROTQBII);
NAME(ROTHM);
NAME(ROTHMI);
NAME(ROTM);
NAME(ROTMI);
NAME(ROTQMBY);
NAME(ROTQMBYI);
NAME(ROTQMBYBI);
NAME(ROTQMBI);
NAME(ROTQMBII);
NAME(ROTMAH);
NAME(ROTMAHI);
NAME(ROTMA);
NAME(ROTMAI);
NAME(CEQB);
NAME(CEQBI);
NAME(CEQH);
NAME(CEQHI);
NAME(CEQ);
NAME(CEQI);
NAME(CGTB);
NAME(CGTBI);
NAME(CGTH);
NAME(CGTHI);
NAME(CGT);
NAME(CGTI);
NAME(CLGTB);
NAME(CLGTBI);
NAME(CLGTH);
NAME(CLGTHI);
NAME(CLGT);
NAME(CLGTI);
NAME(BR);
NAME(BRA);
NAME(BRSL);
NAME(BRASL);
NAME(BI);
NAME(IRET);
NAME(BISLED);
NAME(BISL);
NAME(BRNZ);
NAME(BRZ);
NAME(BRHNZ);
NAME(BRHZ);
NAME(BIZ);
NAME(BINZ);
NAME(BIHZ);
NAME(BIHNZ);
NAME(FA);
NAME(DFA);
NAME(FS);
NAME(DFS);
NAME(FM);
NAME(DFM);
NAME(DFMA);
NAME(DFNMS);
NAME(DFMS);
NAME(DFNMA);
NAME(FREST);
NAME(FRSQEST);
NAME(FI);
NAME(CSFLT);
NAME(CFLTS);
NAME(CUFLT);
NAME(CFLTU);
NAME(FRDS);
NAME(FESD);
NAME(FCEQ);
NAME(FCMEQ);
NAME(FCGT);
NAME(FCMGT);
NAME(FSCRWR);
NAME(FSCRRD);
NAME(DFCEQ);
NAME(DFCMEQ);
NAME(DFCGT);
NAME(DFCMGT);
NAME(DFTSV);
NAME(FMA);
NAME(FNMS);
NAME(FMS);
};
#undef NAME