Files
PS2Recomp/ps2xRecomp/include/ps2recomp/code_generator.h
T
Ran-j 2d1f7ec07f feat: added missing v0 instructions
feat: added threads inplementation on ps2 syscalls
feat: patch entrypoint on recompiler
feat: ps2 macros now is part of the runtime
feat: use thread to hold game loop
feat: sanitize functions like point out by chrisking1981
fix: fix old instructions cast
fix: fix missing patch for opcode j
2025-12-27 11:33:24 -03:00

129 lines
6.2 KiB
C++

#ifndef PS2RECOMP_CODE_GENERATOR_H
#define PS2RECOMP_CODE_GENERATOR_H
#include "ps2recomp/types.h"
#include <string>
#include <vector>
#include <map>
#include <unordered_map>
#include <unordered_set>
namespace ps2recomp
{
extern const std::unordered_set<std::string> kKeywords;
class CodeGenerator
{
public:
CodeGenerator(const std::vector<Symbol> &symbols);
~CodeGenerator();
struct BootstrapInfo
{
bool valid = false;
uint32_t entry = 0;
uint32_t bssStart = 0;
uint32_t bssEnd = 0;
uint32_t gp = 0;
};
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 generateMacroHeader();
std::string handleBranchDelaySlots(const Instruction &branchInst, const Instruction &delaySlot,
const Function &function, const std::unordered_set<uint32_t> &internalTargets);
void setRenamedFunctions(const std::unordered_map<uint32_t, std::string> &renames);
void setBootstrapInfo(const BootstrapInfo &info);
std::unordered_set<uint32_t> collectInternalBranchTargets(const Function &function,
const std::vector<Instruction> &instructions);
public:
std::vector<Symbol> m_symbols;
std::unordered_map<uint32_t, std::string> m_renamedFunctions;
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 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_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_VMADD(const Instruction &inst);
std::string translateVU_VMAX(const Instruction &inst);
std::string translateVU_VOPMSUB(const Instruction &inst);
std::string translateVU_VMINI(const Instruction &inst);
// Jump Table Generation
std::string generateJumpTableSwitch(const Instruction &inst, uint32_t tableAddress,
const std::vector<JumpTableEntry> &entries);
std::string generateBootstrapFunction() const;
Symbol *findSymbolByAddress(uint32_t address);
std::string getFunctionName(uint32_t address);
std::string getGeneratedFunctionName(const Function &function);
};
}
#endif // PS2RECOMP_CODE_GENERATOR_H