spu_iname: refactor to use actual strings

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

View file

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