mirror of
				https://github.com/N64Recomp/N64Recomp.git
				synced 2025-10-30 08:02:11 +00:00 
			
		
		
		
	 5b17bf8bb5
			
		
	
	
		5b17bf8bb5
		
			
		
	
	
	
	
		
			
			* Initial implementation of binary operation table * Initial implementation of unary operation table * More binary op types, moved binary expression string generation into separate function * Added and implemented conditional branch instruction table * Fixed likely swap on bgezal, fixed extra indent branch close and missing indent on branch statement * Add operands for other uses of float registers * Added CHECK_FR generation to binary operation processing, moved float comparison instructions to binary op table * Finished moving float arithmetic instructions to operation tables * Added store instruction operation table * Created Generator interface, separated operation types and tables and C generation code into new files * Fix mov.d using the wrong input operand * Move recompiler core logic into a core library and make the existing CLI consume the core library * Removed unnecessary config input to recompilation functions * Moved parts of recomp_port.h into new internal headers in src folder * Changed recomp port naming to N64Recomp * Remove some unused code and document which Context fields are actually required for recompilation * Implement mod symbol parsing * Restructure mod symbols to make replacements global instead of per-section * Refactor elf parsing into static Context method for reusability * Move elf parsing into a separate library * WIP elf to mod tool, currently working without relocations or API exports/imports * Make mod tool emit relocs and patch binary for non-relocatable symbol references as needed * Implemented writing import and exports in the mod tool * Add dependencies to the mod symbol format, finish exporting and importing of mod symbols * Add first pass offline mod recompiler (generates C from mods that can be compiled and linked into a dynamic library) * Add strict mode and ability to generate exports for normal recompilation (for patches) * Move mod context fields into base context, move import symbols into separate vector, misc cleanup * Some cleanup by making some Context members private * Add events (from dependencies and exported) and callbacks to the mod symbol format and add support to them in elf parsing * Add runtime-driven fields to offline mod recompiler, fix event symbol relocs using the wrong section in the mod tool * Move file header writing outside of function recompilation * Allow cross-section relocations, encode exact target section in mod relocations, add way to tag reference symbol relocations * Add local symbol addresses array to offline mod recompiler output and rename original one to reference section addresses * Add more comments to the offline mod recompiler's output * Fix handling of section load addresses to match objcopy behavior, added event parsing to dependency tomls, minor cleanup * Fixed incorrect size used for finding section segments * Add missing includes for libstdc++ * Rework callbacks and imports to use the section name for identifying the dependency instead of relying on per-dependency tomls
		
			
				
	
	
		
			56 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef __GENERATOR_H__
 | |
| #define __GENERATOR_H__
 | |
| 
 | |
| #include "n64recomp.h"
 | |
| #include "operations.h"
 | |
| 
 | |
| namespace N64Recomp {
 | |
|     struct InstructionContext {
 | |
|         int rd;
 | |
|         int rs;
 | |
|         int rt;
 | |
|         int sa;
 | |
| 
 | |
|         int fd;
 | |
|         int fs;
 | |
|         int ft;
 | |
| 
 | |
|         int cop1_cs;
 | |
| 
 | |
|         uint16_t imm16;
 | |
| 
 | |
|         bool reloc_tag_as_reference;
 | |
|         RelocType reloc_type;
 | |
|         uint32_t reloc_section_index;
 | |
|         uint32_t reloc_target_section_offset;
 | |
|     };
 | |
| 
 | |
|     class Generator {
 | |
|     public:
 | |
|         virtual void process_binary_op(std::ostream& output_file, const BinaryOp& op, const InstructionContext& ctx) const = 0;
 | |
|         virtual void process_unary_op(std::ostream& output_file, const UnaryOp& op, const InstructionContext& ctx) const = 0;
 | |
|         virtual void process_store_op(std::ostream& output_file, const StoreOp& op, const InstructionContext& ctx) const = 0;
 | |
|         virtual void emit_branch_condition(std::ostream& output_file, const ConditionalBranchOp& op, const InstructionContext& ctx) const = 0;
 | |
|         virtual void emit_branch_close(std::ostream& output_file) const = 0;
 | |
|         virtual void emit_check_fr(std::ostream& output_file, int fpr) const = 0;
 | |
|         virtual void emit_check_nan(std::ostream& output_file, int fpr, bool is_double) const = 0;
 | |
|     };
 | |
| 
 | |
|     class CGenerator final : Generator {
 | |
|     public:
 | |
|         CGenerator() = default;
 | |
|         void process_binary_op(std::ostream& output_file, const BinaryOp& op, const InstructionContext& ctx) const final;
 | |
|         void process_unary_op(std::ostream& output_file, const UnaryOp& op, const InstructionContext& ctx) const final;
 | |
|         void process_store_op(std::ostream& output_file, const StoreOp& op, const InstructionContext& ctx) const final;
 | |
|         void emit_branch_condition(std::ostream& output_file, const ConditionalBranchOp& op, const InstructionContext& ctx) const final;
 | |
|         void emit_branch_close(std::ostream& output_file) const final;
 | |
|         void emit_check_fr(std::ostream& output_file, int fpr) const final;
 | |
|         void emit_check_nan(std::ostream& output_file, int fpr, bool is_double) const final;
 | |
|     private:
 | |
|         void get_operand_string(Operand operand, UnaryOpType operation, const InstructionContext& context, std::string& operand_string) const;
 | |
|         void get_binary_expr_string(BinaryOpType type, const BinaryOperands& operands, const InstructionContext& ctx, const std::string& output, std::string& expr_string) const;
 | |
|         void get_notation(BinaryOpType op_type, std::string& func_string, std::string& infix_string) const;
 | |
|     };
 | |
| }
 | |
| 
 | |
| #endif
 |