From 72fe4ed79c1eb63739d84f9ed12b00f5c0b3593f Mon Sep 17 00:00:00 2001 From: Mr-Wiseguy Date: Mon, 11 Mar 2024 00:15:31 -0400 Subject: [PATCH] Added some missing float comparison instructions and fixed functions incorrectly getting detected as the entrypoint --- src/main.cpp | 2 +- src/recompilation.cpp | 58 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 34e7cb6..13fd451 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -661,7 +661,7 @@ bool read_symbols(RecompPort::Context& context, const ELFIO::elfio& elf_file, EL context.functions_by_vram[vram].push_back(context.functions.size()); // Find the entrypoint by rom address in case it doesn't have vram as its value - if (rom_address == 0x1000 && type == ELFIO::STT_FUNC) { + if (has_entrypoint && rom_address == 0x1000 && type == ELFIO::STT_FUNC) { vram = entrypoint; found_entrypoint_func = true; name = "recomp_entrypoint"; diff --git a/src/recompilation.cpp b/src/recompilation.cpp index 0f67e16..f70c185 100644 --- a/src/recompilation.cpp +++ b/src/recompilation.cpp @@ -684,7 +684,11 @@ bool process_instruction(const RecompPort::Context& context, const RecompPort::C case InstrId::cpu_c_olt_s: print_line("CHECK_FR(ctx, {})", fs); print_line("CHECK_FR(ctx, {})", ft); - //print_line("*(volatile int*)0 = 0;"); + print_line("c1cs = ctx->f{}.fl < ctx->f{}.fl", fs, ft); + break; + case InstrId::cpu_c_ult_s: + print_line("CHECK_FR(ctx, {})", fs); + print_line("CHECK_FR(ctx, {})", ft); print_line("c1cs = ctx->f{}.fl < ctx->f{}.fl", fs, ft); break; case InstrId::cpu_c_lt_d: @@ -692,6 +696,16 @@ bool process_instruction(const RecompPort::Context& context, const RecompPort::C print_line("CHECK_FR(ctx, {})", ft); print_line("c1cs = ctx->f{}.d < ctx->f{}.d", fs, ft); break; + case InstrId::cpu_c_olt_d: + print_line("CHECK_FR(ctx, {})", fs); + print_line("CHECK_FR(ctx, {})", ft); + print_line("c1cs = ctx->f{}.d < ctx->f{}.d", fs, ft); + break; + case InstrId::cpu_c_ult_d: + print_line("CHECK_FR(ctx, {})", fs); + print_line("CHECK_FR(ctx, {})", ft); + print_line("c1cs = ctx->f{}.d < ctx->f{}.d", fs, ft); + break; case InstrId::cpu_c_le_s: print_line("CHECK_FR(ctx, {})", fs); print_line("CHECK_FR(ctx, {})", ft); @@ -700,13 +714,11 @@ bool process_instruction(const RecompPort::Context& context, const RecompPort::C case InstrId::cpu_c_ole_s: print_line("CHECK_FR(ctx, {})", fs); print_line("CHECK_FR(ctx, {})", ft); - //print_line("*(volatile int*)0 = 0;"); print_line("c1cs = ctx->f{}.fl <= ctx->f{}.fl", fs, ft); break; case InstrId::cpu_c_ule_s: print_line("CHECK_FR(ctx, {})", fs); print_line("CHECK_FR(ctx, {})", ft); - //print_line("*(volatile int*)0 = 0;"); print_line("c1cs = ctx->f{}.fl <= ctx->f{}.fl", fs, ft); break; case InstrId::cpu_c_le_d: @@ -714,16 +726,56 @@ bool process_instruction(const RecompPort::Context& context, const RecompPort::C print_line("CHECK_FR(ctx, {})", ft); print_line("c1cs = ctx->f{}.d <= ctx->f{}.d", fs, ft); break; + case InstrId::cpu_c_ole_d: + print_line("CHECK_FR(ctx, {})", fs); + print_line("CHECK_FR(ctx, {})", ft); + print_line("c1cs = ctx->f{}.d <= ctx->f{}.d", fs, ft); + break; + case InstrId::cpu_c_ule_d: + print_line("CHECK_FR(ctx, {})", fs); + print_line("CHECK_FR(ctx, {})", ft); + print_line("c1cs = ctx->f{}.d <= ctx->f{}.d", fs, ft); + break; case InstrId::cpu_c_eq_s: print_line("CHECK_FR(ctx, {})", fs); print_line("CHECK_FR(ctx, {})", ft); print_line("c1cs = ctx->f{}.fl == ctx->f{}.fl", fs, ft); break; + case InstrId::cpu_c_ueq_s: + print_line("CHECK_FR(ctx, {})", fs); + print_line("CHECK_FR(ctx, {})", ft); + print_line("c1cs = ctx->f{}.fl == ctx->f{}.fl", fs, ft); + break; + case InstrId::cpu_c_ngl_s: + print_line("CHECK_FR(ctx, {})", fs); + print_line("CHECK_FR(ctx, {})", ft); + print_line("c1cs = ctx->f{}.fl == ctx->f{}.fl", fs, ft); + break; + case InstrId::cpu_c_seq_s: + print_line("CHECK_FR(ctx, {})", fs); + print_line("CHECK_FR(ctx, {})", ft); + print_line("c1cs = ctx->f{}.fl == ctx->f{}.fl", fs, ft); + break; case InstrId::cpu_c_eq_d: print_line("CHECK_FR(ctx, {})", fs); print_line("CHECK_FR(ctx, {})", ft); print_line("c1cs = ctx->f{}.d == ctx->f{}.d", fs, ft); break; + case InstrId::cpu_c_ueq_d: + print_line("CHECK_FR(ctx, {})", fs); + print_line("CHECK_FR(ctx, {})", ft); + print_line("c1cs = ctx->f{}.d == ctx->f{}.d", fs, ft); + break; + case InstrId::cpu_c_ngl_d: + print_line("CHECK_FR(ctx, {})", fs); + print_line("CHECK_FR(ctx, {})", ft); + print_line("c1cs = ctx->f{}.d == ctx->f{}.d", fs, ft); + break; + case InstrId::cpu_c_deq_d: // TODO rename to c_seq_d when fixed in rabbitizer + print_line("CHECK_FR(ctx, {})", fs); + print_line("CHECK_FR(ctx, {})", ft); + print_line("c1cs = ctx->f{}.d == ctx->f{}.d", fs, ft); + break; // Cop1 branches case InstrId::cpu_bc1tl: