Files
PS2Recomp/ps2xRecomp/include/ps2recomp/code_generator.h
T
Ranieri 93e221feaa Feature/runtime ecosystem refactor (#107)
* feat: remove memory and pad from stub section

* feat: add support for resume entry targets in CodeGenerator (this allow jumps in address outside function)
feat: refactor entry point discovery one more try to reduce big generated file

* feat: optmizations for release build

* feat: remove unused  file

* feat: added some test cases for code gen

* feat: added log macro and remove win specific code

* feat: refactor runtime folder structure
feat: added reset sound driver RPC state and compatibility layout
feat: rename and added new test
feat: update RPC calls to use defined constants
feat: added more PSMC(16, 32)
feat: change cd read to try find the asset ignoring case sensitive
fix: fix some render problems
feat: add logs on pad
feat: added more RPC handles

* feat: added game override for code veronica

* feat: apply vita patch

* feat: flags to disable build

* feat: fix merges
feat: break a lot of tests

* feat: better throw error on empty cd path
feat: remove recompiler unusde function
feat: apply missing patch

* feat: gamedp is now part of lib
feat: missing file

* feat: small cleanup

* feat: missing vita changes

* feat: fix more merge

* feat: fix tests

* feat: last missing feature

* feat: added missing import

* feat: rename test local functions

* feat: init syscall on ps2 list

* feat: added DMA helpers

* feat: faster builds
feat: more implement for darkcloud

* feat: back missing file

* feat: added missing includes

* feat: remove test

* feat: missing include

* feat: read register funtion

* feat: build  fix

* feat: force  exit on detach thread
2026-04-04 23:09:56 -03:00

201 lines
10 KiB
C++

#ifndef PS2RECOMP_CODE_GENERATOR_H
#define PS2RECOMP_CODE_GENERATOR_H
#include <cstdint>
#include <string>
#include <vector>
#include <map>
#include <unordered_map>
#include <unordered_set>
namespace ps2recomp
{
struct JumpTableEntry;
struct JumpTable;
struct Instruction;
struct Function;
struct Symbol;
struct Section;
extern const std::unordered_set<std::string> kKeywords;
class CodeGenerator
{
public:
explicit CodeGenerator(const std::vector<Symbol> &symbols, const std::vector<Section> &sections);
~CodeGenerator();
struct BootstrapInfo
{
bool valid = false;
uint32_t entry = 0;
uint32_t bssStart = 0;
uint32_t bssEnd = 0;
uint32_t gp = 0;
std::string entryName;
};
struct AnalysisResult {
std::unordered_set<uint32_t> entryPoints;
std::unordered_set<uint32_t> externalEntryPoints;
std::unordered_set<uint32_t> resumeEntryPoints;
std::unordered_map<uint32_t, std::vector<uint32_t>> jumpTableTargets;
};
std::string generateFunction(const Function &function, const std::vector<Instruction> &instructions, const bool &useHeaders);
std::string generateFunctionRegistration(const std::vector<Function> &functions, const std::map<uint32_t, std::string> &stubs);
std::string handleBranchDelaySlots(const Instruction &branchInst, const Instruction &delaySlot,
const Function &function, const AnalysisResult &analysisResult);
void setRenamedFunctions(const std::unordered_map<uint32_t, std::string> &renames);
void setBootstrapInfo(const BootstrapInfo &info);
void setRelocationCallNames(const std::unordered_map<uint32_t, std::string> &callNames);
void setConfiguredJumpTables(const std::vector<JumpTable> &jumpTables);
void setResumeEntryTargets(const std::unordered_map<uint32_t, std::vector<uint32_t>> &resumeTargetsByOwner);
AnalysisResult collectInternalBranchTargets(const Function &function,
const std::vector<Instruction> &instructions,
const std::vector<Function> *allFunctions = nullptr);
public:
std::unordered_map<uint32_t, Symbol> m_symbols;
std::unordered_map<uint32_t, std::string> m_renamedFunctions;
std::unordered_map<uint32_t, std::string> m_relocationCallNames;
std::unordered_map<uint32_t, std::vector<uint32_t>> m_configJumpTableTargetsByAddress;
std::unordered_map<uint32_t, std::vector<uint32_t>> m_resumeEntryTargetsByOwner;
const std::vector<Section>& m_sections;
BootstrapInfo m_bootstrapInfo;
std::string translateInstruction(const Instruction &inst);
std::string translateMMIInstruction(const Instruction &inst);
std::string translateVUInstruction(const Instruction &inst);
std::string translateFPUInstruction(const Instruction &inst);
std::string translateCOP0Instruction(const Instruction &inst);
std::string translateRegimmInstruction(const Instruction &inst);
std::string translateSpecialInstruction(const Instruction &inst);
// MMI Translation functions
std::string translateMMI0Instruction(const Instruction &inst);
std::string translateMMI1Instruction(const Instruction &inst);
std::string translateMMI2Instruction(const Instruction &inst);
std::string translateMMI3Instruction(const Instruction &inst);
std::string translatePMFHLInstruction(const Instruction &inst);
std::string translatePMTHLInstruction(const Instruction &inst);
// Instruction Helpers
std::string translateQFSRV(const Instruction &inst);
std::string translatePMADDW(const Instruction &inst);
std::string translatePMULTW(const Instruction &inst);
std::string translatePMSUBW(const Instruction &inst);
std::string translatePEXT5(const Instruction &inst);
std::string translatePPAC5(const Instruction &inst);
std::string translatePADSBH(const Instruction &inst);
std::string translatePMSUBH(const Instruction &inst);
std::string translatePHMSBH(const Instruction &inst);
std::string translatePMADDUW(const Instruction &inst);
std::string translatePDIVW(const Instruction &inst);
std::string translatePCPYLD(const Instruction &inst);
std::string translatePMADDH(const Instruction &inst);
std::string translatePHMADH(const Instruction &inst);
std::string translatePEXEH(const Instruction &inst);
std::string translatePREVH(const Instruction &inst);
std::string translatePMULTH(const Instruction &inst);
std::string translatePDIVBW(const Instruction &inst);
std::string translatePEXEW(const Instruction &inst);
std::string translatePROT3W(const Instruction &inst);
std::string translatePMULTUW(const Instruction &inst);
std::string translatePDIVUW(const Instruction &inst);
std::string translatePCPYUD(const Instruction &inst);
std::string translatePEXCH(const Instruction &inst);
std::string translatePCPYH(const Instruction &inst);
std::string translatePEXCW(const Instruction &inst);
std::string translatePMTHI(const Instruction &inst);
std::string translatePMTLO(const Instruction &inst);
// VU instruction translations
std::string translateVU_VADD_Field(const Instruction &inst);
std::string translateVU_VSUB_Field(const Instruction &inst);
std::string translateVU_VMUL_Field(const Instruction &inst);
std::string translateVU_VMSUB_Field(const Instruction &inst);
std::string translateVU_VADDA_Field(const Instruction &inst);
std::string translateVU_VSUBA_Field(const Instruction &inst);
std::string translateVU_VMADDA_Field(const Instruction &inst);
std::string translateVU_VMSUBA_Field(const Instruction &inst);
std::string translateVU_VMULA_Field(const Instruction &inst);
std::string translateVU_VADD(const Instruction &inst);
std::string translateVU_VSUB(const Instruction &inst);
std::string translateVU_VMUL(const Instruction &inst);
std::string translateVU_VDIV(const Instruction &inst);
std::string translateVU_VSQRT(const Instruction &inst);
std::string translateVU_VRSQRT(const Instruction &inst);
std::string translateVU_VMTIR(const Instruction &inst);
std::string translateVU_VMFIR(const Instruction &inst);
std::string translateVU_VILWR(const Instruction &inst);
std::string translateVU_VISWR(const Instruction &inst);
std::string translateVU_VIADD(const Instruction &inst);
std::string translateVU_VISUB(const Instruction &inst);
std::string translateVU_VIADDI(const Instruction &inst);
std::string translateVU_VIAND(const Instruction &inst);
std::string translateVU_VIOR(const Instruction &inst);
std::string translateVU_VCALLMS(const Instruction &inst);
std::string translateVU_VCALLMSR(const Instruction &inst);
std::string translateVU_VRNEXT(const Instruction &inst);
std::string translateVU_VRGET(const Instruction &inst);
std::string translateVU_VRINIT(const Instruction &inst);
std::string translateVU_VRXOR(const Instruction &inst);
std::string translateVU_VMADD_Field(const Instruction &inst);
std::string translateVU_VMINI_Field(const Instruction &inst);
std::string translateVU_VMAX_Field(const Instruction &inst);
std::string translateVU_VMADD(const Instruction &inst);
std::string translateVU_VMADDq(const Instruction &inst);
std::string translateVU_VMADDi(const Instruction &inst);
std::string translateVU_VMAX(const Instruction &inst);
std::string translateVU_VMAXi(const Instruction &inst);
std::string translateVU_VADDA(const Instruction &inst);
std::string translateVU_VADDAq(const Instruction &inst);
std::string translateVU_VADDAi(const Instruction &inst);
std::string translateVU_VSUBA(const Instruction &inst);
std::string translateVU_VSUBAq(const Instruction &inst);
std::string translateVU_VSUBAi(const Instruction &inst);
std::string translateVU_VMADDA(const Instruction &inst);
std::string translateVU_VMADDAq(const Instruction &inst);
std::string translateVU_VMADDAi(const Instruction &inst);
std::string translateVU_VMSUBA(const Instruction &inst);
std::string translateVU_VMSUBAq(const Instruction &inst);
std::string translateVU_VMSUBAi(const Instruction &inst);
std::string translateVU_VMULA(const Instruction &inst);
std::string translateVU_VMULAq(const Instruction &inst);
std::string translateVU_VMULAi(const Instruction &inst);
std::string translateVU_VOPMULA(const Instruction &inst);
std::string translateVU_VOPMSUB(const Instruction &inst);
std::string translateVU_VMINI(const Instruction &inst);
std::string translateVU_VMINIi(const Instruction &inst);
std::string translateVU_VMSUB(const Instruction &inst);
std::string translateVU_VMSUBq(const Instruction &inst);
std::string translateVU_VMSUBi(const Instruction &inst);
std::string translateVU_VMULq(const Instruction &inst);
std::string translateVU_VMULi(const Instruction &inst);
std::string translateVU_VADDq(const Instruction &inst);
std::string translateVU_VADDi(const Instruction &inst);
std::string translateVU_VSUBq(const Instruction &inst);
std::string translateVU_VSUBi(const Instruction &inst);
std::string translateVU_VITOF(const Instruction &inst, int shift);
std::string translateVU_VFTOI(const Instruction &inst, int shift);
std::string translateVU_VLQI(const Instruction &inst);
std::string translateVU_VSQI(const Instruction &inst);
std::string translateVU_VLQD(const Instruction &inst);
std::string translateVU_VSQD(const Instruction &inst);
// Jump Table Generation
std::string generateJumpTableSwitch(const Instruction &inst, uint32_t tableAddress,
const std::vector<JumpTableEntry> &entries);
const Symbol *findSymbolByAddress(uint32_t address) const;
std::string getFunctionName(uint32_t address) const;
std::string sanitizeFunctionName(const std::string& name) const;
};
}
#endif // PS2RECOMP_CODE_GENERATOR_H