From 37e3473b924bb546085f0a70732818308df08848 Mon Sep 17 00:00:00 2001 From: a Date: Mon, 16 Jun 2025 19:30:24 -0400 Subject: [PATCH] Remove IDO support completely --- tools/Makefile | 10 +- tools/ido-static-recomp/.clang-format | 23 - tools/ido-static-recomp/.gitignore | 10 - tools/ido-static-recomp/DOCS.md | 19 - tools/ido-static-recomp/Makefile | 231 - tools/ido-static-recomp/README.md | 66 - tools/ido-static-recomp/elf.h | 99 - tools/ido-static-recomp/header.h | 24 - tools/ido-static-recomp/helpers.h | 15 - tools/ido-static-recomp/libc_impl.c | 2971 ------------- tools/ido-static-recomp/libc_impl.h | 182 - tools/ido-static-recomp/recomp.cpp | 3813 ----------------- .../tools/rabbitizer/.clang-format | 23 - .../tools/rabbitizer/.clang-tidy | 9 - .../tools/rabbitizer/.gitattributes | 2 - .../tools/rabbitizer/.github/workflows/ci.yml | 54 - .../rabbitizer/.github/workflows/make.yml | 14 - .../tools/rabbitizer/.gitignore | 215 - .../tools/rabbitizer/.gitrepo | 12 - .../tools/rabbitizer/LICENSE | 21 - .../tools/rabbitizer/MANIFEST.in | 6 - .../tools/rabbitizer/Makefile | 140 - .../tools/rabbitizer/README.md | 55 - .../include/analysis/LoPairingInfo.hpp | 36 - .../include/analysis/RegistersTracker.hpp | 49 - .../include/instructions/InstrId.hpp | 38 - .../include/instructions/InstructionBase.hpp | 253 -- .../include/instructions/InstructionCpu.hpp | 20 - .../include/instructions/InstructionR5900.hpp | 41 - .../include/instructions/InstructionRsp.hpp | 40 - .../include/instructions/OperandType.hpp | 27 - .../include/instructions/Registers.hpp | 94 - .../cplusplus/include/rabbitizer.hpp | 26 - .../cplusplus/src/analysis/LoPairingInfo.cpp | 34 - .../src/analysis/RegistersTracker.cpp | 64 - .../cplusplus/src/instructions/InstrId.cpp | 14 - .../src/instructions/InstructionBase.cpp | 1036 ----- .../src/instructions/InstructionCpu.cpp | 15 - .../src/instructions/InstructionR5900.cpp | 118 - .../src/instructions/InstructionRsp.cpp | 128 - .../analysis/RabbitizerLoPairingInfo.h | 34 - .../analysis/RabbitizerRegistersTracker.h | 65 - .../analysis/RabbitizerTrackedRegisterState.h | 80 - .../tools/rabbitizer/include/common/Abi.inc | 7 - .../include/common/RabbitizerConfig.h | 83 - .../include/common/RabbitizerVersion.h | 33 - .../tools/rabbitizer/include/common/Utils.h | 116 - .../include/instructions/InstrCategory.inc | 6 - .../instructions/RabbitizerInstrDescriptor.h | 141 - .../include/instructions/RabbitizerInstrId.h | 46 - .../instructions/RabbitizerInstrSuffix.h | 36 - .../instructions/RabbitizerInstruction.h | 263 -- .../instructions/RabbitizerInstructionR5900.h | 87 - .../instructions/RabbitizerInstructionRsp.h | 70 - .../instructions/RabbitizerOperandType.h | 33 - .../include/instructions/RabbitizerRegister.h | 143 - .../instr_id/RabbitizerInstrId_cpu.inc | 40 - .../instr_id/RabbitizerInstrId_r5900.inc | 46 - .../instr_id/RabbitizerInstrId_rsp.inc | 41 - .../instructions/instr_id/cpu/cpu_cop0.inc | 10 - .../instr_id/cpu/cpu_cop0_bc0.inc | 8 - .../instr_id/cpu/cpu_cop0_tlb.inc | 12 - .../instructions/instr_id/cpu/cpu_cop1.inc | 12 - .../instr_id/cpu/cpu_cop1_bc1.inc | 8 - .../instr_id/cpu/cpu_cop1_fpu_d.inc | 48 - .../instr_id/cpu/cpu_cop1_fpu_l.inc | 6 - .../instr_id/cpu/cpu_cop1_fpu_s.inc | 48 - .../instr_id/cpu/cpu_cop1_fpu_w.inc | 6 - .../instructions/instr_id/cpu/cpu_normal.inc | 83 - .../instructions/instr_id/cpu/cpu_regimm.inc | 25 - .../instructions/instr_id/cpu/cpu_special.inc | 93 - .../instr_id/r5900/r5900_cop0_tlb.inc | 23 - .../instr_id/r5900/r5900_cop1_fpu_s.inc | 46 - .../instr_id/r5900/r5900_cop2.inc | 21 - .../instr_id/r5900/r5900_cop2_bc2.inc | 21 - .../instr_id/r5900/r5900_cop2_special1.inc | 82 - .../instr_id/r5900/r5900_cop2_special2.inc | 125 - .../instructions/instr_id/r5900/r5900_mmi.inc | 49 - .../instr_id/r5900/r5900_mmi_0.inc | 50 - .../instr_id/r5900/r5900_mmi_1.inc | 43 - .../instr_id/r5900/r5900_mmi_2.inc | 48 - .../instr_id/r5900/r5900_mmi_3.inc | 37 - .../instr_id/r5900/r5900_normal.inc | 31 - .../instr_id/r5900/r5900_regimm.inc | 20 - .../instr_id/r5900/r5900_special.inc | 27 - .../instructions/instr_id/rsp/rsp_cop0.inc | 6 - .../instructions/instr_id/rsp/rsp_cop2.inc | 10 - .../instructions/instr_id/rsp/rsp_cop2_vu.inc | 53 - .../instructions/instr_id/rsp/rsp_normal.inc | 53 - .../instr_id/rsp/rsp_normal_lwc2.inc | 15 - .../instr_id/rsp/rsp_normal_swc2.inc | 17 - .../instructions/instr_id/rsp/rsp_regimm.inc | 14 - .../instructions/instr_id/rsp/rsp_special.inc | 49 - .../operands/RabbitizerOperandType_cpu.inc | 25 - .../operands/RabbitizerOperandType_r5900.inc | 33 - .../operands/RabbitizerOperandType_rsp.inc | 24 - .../registers/RabbitizerRegister_Cop0.inc | 35 - .../RabbitizerRegister_Cop1Control.inc | 35 - .../registers/RabbitizerRegister_Cop1N32.inc | 35 - .../registers/RabbitizerRegister_Cop1N64.inc | 35 - .../registers/RabbitizerRegister_Cop1O32.inc | 35 - .../registers/RabbitizerRegister_Cop2.inc | 35 - .../registers/RabbitizerRegister_GprN32.inc | 35 - .../registers/RabbitizerRegister_GprO32.inc | 35 - .../registers/RabbitizerRegister_R5900VF.inc | 35 - .../registers/RabbitizerRegister_R5900VI.inc | 35 - .../registers/RabbitizerRegister_RspCop0.inc | 19 - .../registers/RabbitizerRegister_RspCop2.inc | 35 - .../RabbitizerRegister_RspCop2Control.inc | 35 - .../registers/RabbitizerRegister_RspGpr.inc | 35 - .../RabbitizerRegister_RspVector.inc | 35 - .../tools/rabbitizer/include/rabbitizer.h | 25 - .../tools/rabbitizer/pyproject.toml | 9 - .../tools/rabbitizer/r5900test.c | 47 - .../tools/rabbitizer/rabbitizer/Config.pyi | 46 - .../tools/rabbitizer/rabbitizer/Enum.pyi | 24 - .../rabbitizer/rabbitizer/InstrCategory.pyi | 15 - .../tools/rabbitizer/rabbitizer/InstrId.pyi | 631 --- .../rabbitizer/rabbitizer/LoPairingInfo.pyi | 16 - .../tools/rabbitizer/rabbitizer/RegGprN32.pyi | 43 - .../tools/rabbitizer/rabbitizer/RegGprO32.pyi | 43 - .../rabbitizer/RegistersTracker.pyi | 28 - .../rabbitizer/TrackedRegisterState.pyi | 24 - .../tools/rabbitizer/rabbitizer/Utils.pyi | 14 - .../tools/rabbitizer/rabbitizer/__init__.pyi | 21 - .../rabbitizer/rabbitizer/enums/enums_utils.c | 38 - .../rabbitizer/rabbitizer/enums/enums_utils.h | 85 - .../rabbitizer/enums/rabbitizer_enum_Abi.c | 48 - .../enums/rabbitizer_enum_InstrCategory.c | 23 - .../enums/rabbitizer_enum_InstrId.c | 29 - .../rabbitizer/enums/rabbitizer_type_Enum.c | 211 - .../enums/registers/rabbitizer_enum_GprN32.c | 28 - .../enums/registers/rabbitizer_enum_GprO32.c | 28 - .../tools/rabbitizer/rabbitizer/py.typed | 0 .../rabbitizer/rabbitizer/rabbitizer.pyi | 99 - .../rabbitizer/rabbitizer_global_config.c | 165 - .../rabbitizer/rabbitizer/rabbitizer_module.c | 142 - .../rabbitizer/rabbitizer/rabbitizer_module.h | 54 - .../rabbitizer/rabbitizer_submodule_Utils.c | 81 - .../rabbitizer/rabbitizer_type_Instruction.c | 436 -- .../rabbitizer_type_LoPairingInfo.c | 50 - .../rabbitizer_type_RegistersTracker.c | 320 -- .../rabbitizer_type_TrackedRegisterState.c | 102 - .../tools/rabbitizer/registersTrackerTest.c | 41 - .../tools/rabbitizer/rsptest.c | 44 - .../tools/rabbitizer/setup.cfg | 24 - .../tools/rabbitizer/setup.py | 28 - .../src/analysis/RabbitizerLoPairingInfo.c | 14 - .../src/analysis/RabbitizerRegistersTracker.c | 425 -- .../analysis/RabbitizerTrackedRegisterState.c | 142 - .../rabbitizer/src/common/RabbitizerConfig.c | 50 - .../rabbitizer/src/common/RabbitizerVersion.c | 10 - .../tools/rabbitizer/src/common/Utils.c | 78 - .../instructions/RabbitizerInstrDescriptor.c | 104 - .../src/instructions/RabbitizerInstrId.c | 28 - .../src/instructions/RabbitizerInstrSuffix.c | 62 - .../RabbitizerInstruction.c | 368 -- .../RabbitizerInstruction_Disassemble.c | 986 ----- .../RabbitizerInstruction_Examination.c | 840 ---- .../RabbitizerInstruction_ProcessUniqueId.c | 319 -- .../RabbitizerInstructionR5900.c | 17 - ...bbitizerInstructionR5900_ProcessUniqueId.c | 328 -- .../RabbitizerInstructionRsp.c | 56 - ...RabbitizerInstructionRsp_ProcessUniqueId.c | 233 - .../src/instructions/RabbitizerRegister.c | 181 - .../ido-static-recomp/tools/rabbitizer/test.c | 40 - .../tools/rabbitizer/tests/cplusplus/test.cpp | 16 - tools/ido5.3_compiler/LICENSE.md | 18 - tools/ido5.3_compiler/lib/libmalloc.so | Bin 28216 -> 0 bytes tools/ido5.3_compiler/lib/libmalloc_old.so | Bin 28216 -> 0 bytes tools/ido5.3_compiler/lib/rld | Bin 585876 -> 0 bytes tools/ido5.3_compiler/usr/bin/cc | Bin 275168 -> 0 bytes tools/ido5.3_compiler/usr/lib/acpp | Bin 93440 -> 0 bytes tools/ido5.3_compiler/usr/lib/as0 | Bin 175296 -> 0 bytes tools/ido5.3_compiler/usr/lib/as1 | Bin 816064 -> 0 bytes tools/ido5.3_compiler/usr/lib/cfe | Bin 902800 -> 0 bytes tools/ido5.3_compiler/usr/lib/copt | Bin 3597360 -> 0 bytes tools/ido5.3_compiler/usr/lib/crt1.o | Bin 3612 -> 0 bytes tools/ido5.3_compiler/usr/lib/err.english.cc | 1260 ------ tools/ido5.3_compiler/usr/lib/libc.so.1 | Bin 1483100 -> 0 bytes tools/ido5.3_compiler/usr/lib/libexc.so | Bin 29352 -> 0 bytes tools/ido5.3_compiler/usr/lib/libgen.so | Bin 69944 -> 0 bytes tools/ido5.3_compiler/usr/lib/libm.so | Bin 111272 -> 0 bytes tools/ido5.3_compiler/usr/lib/ugen | Bin 547616 -> 0 bytes tools/ido5.3_compiler/usr/lib/ujoin | Bin 101832 -> 0 bytes tools/ido5.3_compiler/usr/lib/uld | Bin 799088 -> 0 bytes tools/ido5.3_compiler/usr/lib/umerge | Bin 167408 -> 0 bytes tools/ido5.3_compiler/usr/lib/uopt | Bin 756800 -> 0 bytes tools/ido5.3_compiler/usr/lib/usplit | Bin 71408 -> 0 bytes 189 files changed, 2 insertions(+), 21842 deletions(-) delete mode 100644 tools/ido-static-recomp/.clang-format delete mode 100644 tools/ido-static-recomp/.gitignore delete mode 100644 tools/ido-static-recomp/DOCS.md delete mode 100644 tools/ido-static-recomp/Makefile delete mode 100644 tools/ido-static-recomp/README.md delete mode 100644 tools/ido-static-recomp/elf.h delete mode 100644 tools/ido-static-recomp/header.h delete mode 100644 tools/ido-static-recomp/helpers.h delete mode 100644 tools/ido-static-recomp/libc_impl.c delete mode 100644 tools/ido-static-recomp/libc_impl.h delete mode 100644 tools/ido-static-recomp/recomp.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/.clang-format delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/.clang-tidy delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/.gitattributes delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/.github/workflows/ci.yml delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/.github/workflows/make.yml delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/.gitignore delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/.gitrepo delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/LICENSE delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/MANIFEST.in delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/Makefile delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/README.md delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/LoPairingInfo.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/RegistersTracker.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstrId.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionBase.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionCpu.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionR5900.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionRsp.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/OperandType.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/Registers.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/rabbitizer.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/LoPairingInfo.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/RegistersTracker.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstrId.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionBase.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionCpu.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionR5900.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionRsp.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerLoPairingInfo.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerRegistersTracker.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerTrackedRegisterState.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/common/Abi.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerConfig.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerVersion.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/common/Utils.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/InstrCategory.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrDescriptor.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrId.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrSuffix.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstruction.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionR5900.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionRsp.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerOperandType.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerRegister.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_cpu.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_r5900.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_rsp.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_bc0.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_tlb.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_bc1.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_d.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_l.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_s.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_w.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_normal.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_regimm.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_special.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop0_tlb.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop1_fpu_s.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_bc2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special1.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_0.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_1.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_3.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_normal.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_regimm.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_special.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop0.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2_vu.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_lwc2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_swc2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_regimm.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_special.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_cpu.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_r5900.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_rsp.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop0.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1Control.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N32.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N64.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1O32.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprN32.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprO32.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VF.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VI.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop0.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2Control.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspGpr.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspVector.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/rabbitizer.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/pyproject.toml delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/r5900test.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Config.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Enum.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrCategory.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrId.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/LoPairingInfo.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprN32.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprO32.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegistersTracker.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/TrackedRegisterState.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Utils.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/__init__.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_Abi.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrCategory.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrId.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_type_Enum.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprN32.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprO32.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/py.typed delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_global_config.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_submodule_Utils.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_Instruction.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_LoPairingInfo.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_RegistersTracker.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_TrackedRegisterState.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/registersTrackerTest.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rsptest.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/setup.cfg delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/setup.py delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerLoPairingInfo.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerRegistersTracker.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerTrackedRegisterState.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerConfig.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerVersion.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/common/Utils.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrDescriptor.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrId.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrSuffix.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_ProcessUniqueId.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerRegister.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/test.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/tests/cplusplus/test.cpp delete mode 100644 tools/ido5.3_compiler/LICENSE.md delete mode 100644 tools/ido5.3_compiler/lib/libmalloc.so delete mode 100644 tools/ido5.3_compiler/lib/libmalloc_old.so delete mode 100755 tools/ido5.3_compiler/lib/rld delete mode 100755 tools/ido5.3_compiler/usr/bin/cc delete mode 100755 tools/ido5.3_compiler/usr/lib/acpp delete mode 100755 tools/ido5.3_compiler/usr/lib/as0 delete mode 100755 tools/ido5.3_compiler/usr/lib/as1 delete mode 100755 tools/ido5.3_compiler/usr/lib/cfe delete mode 100755 tools/ido5.3_compiler/usr/lib/copt delete mode 100644 tools/ido5.3_compiler/usr/lib/crt1.o delete mode 100644 tools/ido5.3_compiler/usr/lib/err.english.cc delete mode 100755 tools/ido5.3_compiler/usr/lib/libc.so.1 delete mode 100644 tools/ido5.3_compiler/usr/lib/libexc.so delete mode 100644 tools/ido5.3_compiler/usr/lib/libgen.so delete mode 100644 tools/ido5.3_compiler/usr/lib/libm.so delete mode 100755 tools/ido5.3_compiler/usr/lib/ugen delete mode 100755 tools/ido5.3_compiler/usr/lib/ujoin delete mode 100755 tools/ido5.3_compiler/usr/lib/uld delete mode 100755 tools/ido5.3_compiler/usr/lib/umerge delete mode 100755 tools/ido5.3_compiler/usr/lib/uopt delete mode 100755 tools/ido5.3_compiler/usr/lib/usplit diff --git a/tools/Makefile b/tools/Makefile index f3f9496f..41840771 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -49,25 +49,19 @@ endif all-except-recomp: $(LIBAUDIOFILE) $(BUILD_PROGRAMS) -all: all-except-recomp ido-static-recomp +all: all-except-recomp clean: $(RM) $(ALL_PROGRAMS) $(MAKE) -C audiofile clean - $(MAKE) -C ido-static-recomp clean - define COMPILE $(1): $($1_SOURCES) $$(CC) $(CFLAGS) $($1_CFLAGS) $$^ -o $$@ $($1_LDFLAGS) $(LDFLAGS) endef -ido-static-recomp: - @$(MAKE) -C ido-static-recomp setup - @$(MAKE) -C ido-static-recomp - $(foreach p,$(BUILD_PROGRAMS),$(eval $(call COMPILE,$(p)))) $(LIBAUDIOFILE): @$(MAKE) -C audiofile -.PHONY: all all-except-recomp clean default ido-static-recomp +.PHONY: all all-except-recomp clean default diff --git a/tools/ido-static-recomp/.clang-format b/tools/ido-static-recomp/.clang-format deleted file mode 100644 index c7b900f0..00000000 --- a/tools/ido-static-recomp/.clang-format +++ /dev/null @@ -1,23 +0,0 @@ -IndentWidth: 4 -Language: Cpp -UseTab: Never -ColumnLimit: 120 -PointerAlignment: Left -BreakBeforeBraces: Attach -SpaceAfterCStyleCast: false -Cpp11BracedListStyle: false -IndentCaseLabels: true -BinPackArguments: true -BinPackParameters: true -AlignAfterOpenBracket: Align -AlignOperands: true -BreakBeforeTernaryOperators: true -BreakBeforeBinaryOperators: None -AllowShortBlocksOnASingleLine: true -AllowShortIfStatementsOnASingleLine: false -AllowShortLoopsOnASingleLine: false -AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: false -AlignEscapedNewlines: Left -AlignTrailingComments: true -SortIncludes: false diff --git a/tools/ido-static-recomp/.gitignore b/tools/ido-static-recomp/.gitignore deleted file mode 100644 index e36efc8d..00000000 --- a/tools/ido-static-recomp/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.idea/ -build/ -.vscode/ - -qemu-irix - -ctx.c.m2c -*.s - -.DS_Store diff --git a/tools/ido-static-recomp/DOCS.md b/tools/ido-static-recomp/DOCS.md deleted file mode 100644 index 1953751c..00000000 --- a/tools/ido-static-recomp/DOCS.md +++ /dev/null @@ -1,19 +0,0 @@ -# Custom Functionality - -## Redirection -IDO recomp currently has two forms of path redirection, both involving the `/usr` folder. - -### `/usr/lib` -In order for users to not having to worry about installing the binaries in particular locations in `/usr/lib`, recomp automatically redirects `/usr/lib/` paths. This is done by determining the location of `cc` and redirecting to the same directory. This does mean all the binaries and `err.english.cc` are expected to be a part of a single flattened directory. - -It is also possible to override the auto redirect by using the environment variable `USR_LIB` with the desired redirection path. This can be used if the binaries are not in a flattened directory with `cc` or if on Linux and are unable to read `/proc/self/exe`. - -Wrapper functions implementing this redirection: -* `init_file` -* `wrapper_execvp` - -### /usr/include -The other form of redirection is completely optional and is done by setting the environment variable `USR_INCLUDE` to the desired redirection path. This will than redirect all opened files files there. This is done so that the `mdebug` section file paths will still use `/usr/include` path, but the files themselves can be located elsewhere for greater flexibility. - -Wrapper functions implementing this redirection: -* `wrapper_open` diff --git a/tools/ido-static-recomp/Makefile b/tools/ido-static-recomp/Makefile deleted file mode 100644 index 69a50d16..00000000 --- a/tools/ido-static-recomp/Makefile +++ /dev/null @@ -1,231 +0,0 @@ -# Build options can be changed by modifying the makefile or by building with 'make SETTING=value'. -# It is also possible to override the settings in Defaults in a file called .make_options as 'SETTING=value'. - --include .make_options - -#### Defaults #### - -# if WERROR is 1, pass -Werror to CC, so warnings would be treated as errors -WERROR ?= 0 -# if RELEASE is 1 strip binaries as well as enable optimizations -RELEASE ?= 1 -# On Mac, set this to `universal` to build universal (x86+ARM) binaries -TARGET ?= native -# Set to 1 to build with sanitization enabled -# N.B. cannot be used for `make setup` at the moment due to recomp.cpp not respecting it -ASAN ?= 0 - -# IDO 5.3 only for Super Mario 64 -IDO_VERSION := IDO53 -IDO_TC := cc acpp as0 as1 cfe copt ugen ujoin uld umerge uopt usplit - - -# -- determine the host environment and target -# | Host | Targets | -# |-------|-------------------| -# | macOS | native, universal | -# | linux | native | -# | win | native | - -UNAME_S := $(shell uname -s) -UNAME_P := $(shell uname -p) - -MAKE := make -ifeq ($(OS),Windows_NT) - DETECTED_OS := windows -else ifeq ($(UNAME_S),Linux) - DETECTED_OS := linux -else ifeq ($(UNAME_S),Darwin) - DETECTED_OS := macos - MAKE := gmake - CPPFLAGS += -xc++ -else - $(error Unsupported host OS for Makefile) -endif - -RABBITIZER := tools/rabbitizer -RABBITIZER_LIB := $(RABBITIZER)/build/librabbitizerpp.a - -CC := gcc -CXX := g++ -STRIP := strip - -CSTD ?= -std=c11 -CFLAGS ?= -MMD -fno-strict-aliasing -I. -CXXSTD ?= -std=c++17 -CXXFLAGS ?= -MMD -WARNINGS ?= -Wall -Wextra -LDFLAGS ?= -lm -RECOMP_FLAGS ?= - -ifneq ($(WERROR),0) - WARNINGS += -Werror -endif - -ifeq ($(RELEASE),1) - OPTFLAGS ?= -Os -else - OPTFLAGS ?= -Og -g3 - STRIP := @: -endif - -ifneq ($(ASAN),0) - CFLAGS += -fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined -fno-sanitize-recover=all - CXXFLAGS += -fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined -fno-sanitize-recover=all -endif - - -ifeq ($(DETECTED_OS),windows) - CXXFLAGS += -static -endif - -# -- Build Directories -# designed to work with Make 3.81 (macOS/last GPL-2 version) -# https://ismail.badawi.io/blog/automatic-directory-creation-in-make/ -BUILD_BASE ?= build -BUILD_DIR := $(BUILD_BASE) -BUILT_BIN := $(BUILD_DIR)/out - - -# -- Location of original IDO binaries in SM64 repo -IRIX_USR_DIR ?= ../ido5.3_compiler/usr - -# -- Location of the irix tool chain error messages -ERR_STRS := $(BUILT_BIN)/err.english.cc - -RECOMP_ELF := $(BUILD_BASE)/recomp.elf -LIBC_IMPL_O := libc_impl.o - -TARGET_BINARIES := $(foreach binary,$(IDO_TC),$(BUILT_BIN)/$(binary)) -O_FILES := $(foreach binary,$(IDO_TC),$(BUILD_DIR)/$(binary).o) -C_FILES := $(O_FILES:.o=.c) - -# Automatic dependency files -DEP_FILES := $(O_FILES:.o=.d) - -# create build directories -$(shell mkdir -p $(BUILT_BIN)) - -# per-file flags -# 5.3 ugen relies on UB stack reads -# to emulate, pass the conservative flag to `recomp` -$(BUILD_BASE)/ugen.c: RECOMP_FLAGS := --conservative - -$(RECOMP_ELF): CXXFLAGS += -I$(RABBITIZER)/include -I$(RABBITIZER)/cplusplus/include -$(RECOMP_ELF): LDFLAGS += -L$(RABBITIZER)/build -lrabbitizerpp - -ifneq ($(DETECTED_OS),windows) -# For traceback -$(RECOMP_ELF): LDFLAGS += -ldl -endif -ifeq ($(DETECTED_OS),linux) -# For traceback -$(RECOMP_ELF): LDFLAGS += -Wl,-export-dynamic -endif - -# Too many warnings, disable everything for now... -$(RECOMP_ELF): WARNINGS += -Wpedantic -Wno-shadow -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-parameter -Wno-implicit-fallthrough -%/$(LIBC_IMPL_O): CFLAGS += -D$(IDO_VERSION) -# TODO: fix warnings -%/$(LIBC_IMPL_O): WARNINGS += -Wno-unused-parameter -Wno-unused-variable -Wno-unused-but-set-variable -Wno-sign-compare -Wno-deprecated-declarations - -#### Main Targets ### - -all: $(TARGET_BINARIES) $(ERR_STRS) - -setup: - $(MAKE) -C $(RABBITIZER) static CC=$(CC) CXX=$(CXX) DEBUG=$(DEBUG) - $(MAKE) $(RECOMP_ELF) - -clean: - $(RM) -r $(BUILD_DIR) - -distclean: - $(RM) -r $(BUILD_BASE) - $(MAKE) -C $(RABBITIZER) distclean - -c_files: $(C_FILES) - - -.PHONY: all clean distclean setup -.DEFAULT_GOAL := all -# Prevent removing intermediate files -.SECONDARY: - - -#### Various Recipes #### - -$(BUILD_BASE)/%.elf: %.cpp - $(CXX) $(CXXSTD) $(OPTFLAGS) $(CXXFLAGS) $(WARNINGS) -o $@ $^ $(LDFLAGS) - - -$(BUILD_DIR)/%.c: $(IRIX_USR_DIR)/lib/% - $(RECOMP_ELF) $(RECOMP_FLAGS) $< > $@ || ($(RM) -f $@ && false) - -# cc and strip are special and are stored in the `bin` folder instead of the `lib` one -$(BUILD_DIR)/%.c: $(IRIX_USR_DIR)/bin/% - $(RECOMP_ELF) $(RECOMP_FLAGS) $< > $@ || ($(RM) -f $@ && false) - - -$(BUILT_BIN)/%.cc: $(IRIX_USR_DIR)/lib/%.cc - cp $^ $@ - - -ifeq ($(TARGET),universal) -MACOS_FAT_TARGETS ?= arm64-apple-macos11 x86_64-apple-macos10.14 - -FAT_FOLDERS := $(foreach target,$(MACOS_FAT_TARGETS),$(BUILD_DIR)/$(target)) - -# create build directories -$(shell mkdir -p $(FAT_FOLDERS)) - -# TODO: simplify -FAT_BINARIES := $(foreach binary,$(IDO_TC),$(BUILT_BIN)/arm64-apple-macos11/$(binary)) \ - $(foreach binary,$(IDO_TC),$(BUILT_BIN)/x86_64-apple-macos10.14/$(binary)) - -$(BUILT_BIN)/%: $(BUILD_DIR)/arm64-apple-macos11/% $(BUILD_DIR)/x86_64-apple-macos10.14/% | $(ERR_STRS) - lipo -create -output $@ $^ - - -$(BUILD_DIR)/arm64-apple-macos11/%: $(BUILD_DIR)/arm64-apple-macos11/%.o $(BUILD_DIR)/arm64-apple-macos11/$(LIBC_IMPL_O) | $(ERR_STRS) - $(CC) $(CSTD) $(OPTFLAGS) $(CFLAGS) -target arm64-apple-macos11 -o $@ $^ $(LDFLAGS) - $(STRIP) $@ - -$(BUILD_DIR)/x86_64-apple-macos10.14/%: $(BUILD_DIR)/x86_64-apple-macos10.14/%.o $(BUILD_DIR)/x86_64-apple-macos10.14/$(LIBC_IMPL_O) | $(ERR_STRS) - $(CC) $(CSTD) $(OPTFLAGS) $(CFLAGS) -target x86_64-apple-macos10.14 -o $@ $^ $(LDFLAGS) - $(STRIP) $@ - -$(BUILD_DIR)/arm64-apple-macos11/%.o: $(BUILD_DIR)/%.c - $(CC) -c $(CSTD) $(OPTFLAGS) $(CFLAGS) -target arm64-apple-macos11 -o $@ $< - -$(BUILD_DIR)/x86_64-apple-macos10.14/%.o: $(BUILD_DIR)/%.c - $(CC) -c $(CSTD) $(OPTFLAGS) $(CFLAGS) -target x86_64-apple-macos10.14 -o $@ $< - - -$(BUILD_DIR)/arm64-apple-macos11/$(LIBC_IMPL_O): libc_impl.c - $(CC) -c $(CSTD) $(OPTFLAGS) $(CFLAGS) $(WARNINGS) -target arm64-apple-macos11 -o $@ $< - -$(BUILD_DIR)/x86_64-apple-macos10.14/$(LIBC_IMPL_O): libc_impl.c - $(CC) -c $(CSTD) $(OPTFLAGS) $(CFLAGS) $(WARNINGS) -target x86_64-apple-macos10.14 -o $@ $< - -else -$(BUILT_BIN)/%: $(BUILD_DIR)/%.o $(BUILD_DIR)/$(LIBC_IMPL_O) | $(ERR_STRS) - $(CC) $(CSTD) $(OPTFLAGS) $(CFLAGS) -o $@ $^ $(LDFLAGS) - $(STRIP) $@ - -$(BUILD_DIR)/%.o: $(BUILD_DIR)/%.c - $(CC) -c $(CSTD) $(OPTFLAGS) $(CFLAGS) -o $@ $< - - -$(BUILD_DIR)/$(LIBC_IMPL_O): libc_impl.c - $(CC) -c $(CSTD) $(OPTFLAGS) $(CFLAGS) $(WARNINGS) -o $@ $< -endif - -# Remove built-in rules, to improve performance -MAKEFLAGS += --no-builtin-rules - --include $(DEP_FILES) - -# --- Debugging -# run `make print-VARIABLE` to debug that variable -print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true diff --git a/tools/ido-static-recomp/README.md b/tools/ido-static-recomp/README.md deleted file mode 100644 index 83ae760f..00000000 --- a/tools/ido-static-recomp/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# Static Recompilation of IRIX Programs - -Convert selected IRIX C toolchain programs into modern Linux or macOS programs - -## Supported Programs - -* IDO 5.3 - * cc, acpp, as0, as1, cfe, copt, ugen, ujoin, uld, umerge, uopt, usplit, ld, strip, upas -* IDO 7.1 - * cc, acpp, as0, as1, cfe, ugen, ujoin, uld, umerge, uopt, usplit, upas - -## Dependencies - -### Linux (Debian / Ubuntu) - -```bash -sudo apt-get install build-essential -``` - -### macOS - -[Install homebrew](https://brew.sh/) and then: - -```bash -brew install make -``` - -## Building - -First build the recomp binary itself - -```bash -make setup -``` - -```bash -make VERSION=5.3 -make VERSION=7.1 -``` - -The build artifacts are located in `build/{7.1|5.3}/out`. Add `-j{thread num}` for multithreaded building. - -By default, debug builds are created with less optimizations, debug flags, and unstripped binaries. -Add `RELEASE=1` to build release builds with optimizations and stripped binaries. - -### Creating Universal ARM/x86_64 macOS Builds - -By default, make build script create native binaries on macOS. This was done to minimize the time to build the recompiled suite. -In order to create "fat," universal ARM and x86_64, pass `TARGET=universal` to `gmake`. - -### Manual Building - -Example for compiling `as1` in a Linux environment: - -```bash -make -C tools/rabbitizer -g++ -Itools/rabbitizer/include -Itools/rabbitizer/cplusplus/include recomp.cpp -o recomp.elf -g -Ltools/rabbitizer/build -lrabbitizerpp -./recomp.elf ido/7.1/usr/lib/as1 > as1_c.c -gcc libc_impl.c as1_c.c -o as1 -g -fno-strict-aliasing -lm -DIDO71 -``` - -Use the same approach for `cc`, `cfe`, `uopt`, `ugen`, `as1` (and `copt` if you need that). - -Use `-DIDO53` instead of `-DIDO71` if the program you are trying to recompile was compiled with IDO 5.3 rather than IDO 7.1. - -To compile `ugen` for IDO 5.3, add `--conservative` when invoking `./recomp.elf`. This mimics UB present in `ugen53`. That program reads uninitialized stack memory and its result depends on that stack memory. diff --git a/tools/ido-static-recomp/elf.h b/tools/ido-static-recomp/elf.h deleted file mode 100644 index 91ba5fe2..00000000 --- a/tools/ido-static-recomp/elf.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef ELF_H -#define ELF_H - -#include - -#define EI_DATA 5 -#define EI_NIDENT 16 -#define SHT_SYMTAB 2 -#define SHT_DYNAMIC 6 -#define SHT_REL 9 -#define SHT_DYNSYM 11 -#define SHT_MIPS_REGINFO 0x70000006 -#define STN_UNDEF 0 -#define STT_OBJECT 1 -#define STT_FUNC 2 -#define DT_PLTGOT 3 -#define DT_MIPS_LOCAL_GOTNO 0x7000000a -#define DT_MIPS_SYMTABNO 0x70000011 -#define DT_MIPS_GOTSYM 0x70000013 - -#define ELF32_R_SYM(info) ((info) >> 8) -#define ELF32_R_TYPE(info) ((info) & 0xff) - -#define ELF32_ST_TYPE(info) ((info) & 0xf) - -#define R_MIPS_26 4 -#define R_MIPS_HI16 5 -#define R_MIPS_LO16 6 - -#define SHN_UNDEF 0 -#define SHN_COMMON 0xfff2 -#define SHN_MIPS_ACOMMON 0xff00 -#define SHN_MIPS_TEXT 0xff01 -#define SHN_MIPS_DATA 0xff02 - -typedef uint32_t Elf32_Addr; -typedef uint32_t Elf32_Off; - -typedef struct { - uint8_t e_ident[EI_NIDENT]; - uint16_t e_type; - uint16_t e_machine; - uint32_t e_version; - Elf32_Addr e_entry; - Elf32_Off e_phoff; - Elf32_Off e_shoff; - uint32_t e_flags; - uint16_t e_ehsize; - uint16_t e_phentsize; - uint16_t e_phnum; - uint16_t e_shentsize; - uint16_t e_shnum; - uint16_t e_shstrndx; -} Elf32_Ehdr; - -typedef struct { - uint32_t sh_name; - uint32_t sh_type; - uint32_t sh_flags; - Elf32_Addr sh_addr; - Elf32_Off sh_offset; - uint32_t sh_size; - uint32_t sh_link; - uint32_t sh_info; - uint32_t sh_addralign; - uint32_t sh_entsize; -} Elf32_Shdr; - -typedef struct { - uint32_t st_name; - Elf32_Addr st_value; - uint32_t st_size; - uint8_t st_info; - uint8_t st_other; - uint16_t st_shndx; -} Elf32_Sym; - -typedef struct { - Elf32_Addr r_offset; - uint32_t r_info; -} Elf32_Rel; - -typedef struct -{ - uint32_t ri_gprmask; /* General registers used. */ - uint32_t ri_cprmask[4]; /* Coprocessor registers used. */ - int32_t ri_gp_value; /* $gp register value. */ -} Elf32_RegInfo; - -typedef struct -{ - int32_t d_tag; /* Dynamic entry type */ - union { - uint32_t d_val; /* Integer value */ - Elf32_Addr d_ptr; /* Address value */ - } d_un; -} Elf32_Dyn; - -#endif diff --git a/tools/ido-static-recomp/header.h b/tools/ido-static-recomp/header.h deleted file mode 100644 index 0a72f1ab..00000000 --- a/tools/ido-static-recomp/header.h +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "libc_impl.h" -#include "helpers.h" - -#define RM_RN 0 -#define RM_RZ 1 -#define RM_RP 2 -#define RM_RM 3 - -#define cvt_w_d(f) \ - ((fcsr & RM_RZ) ? ((isnan(f) || f <= -2147483649.0 || f >= 2147483648.0) ? (fcsr |= 0x40, 2147483647) : (int)f) : (assert(0), 0)) - -#define cvt_w_s(f) cvt_w_d((double)f) - -static union FloatReg f0 = {{0, 0}}, f2 = {{0, 0}}, f4 = {{0, 0}}, f6 = {{0, 0}}, f8 = {{0, 0}}, -f10 = {{0, 0}}, f12 = {{0, 0}}, f14 = {{0, 0}}, f16 = {{0, 0}}, f18 = {{0, 0}}, f20 = {{0, 0}}, -f22 = {{0, 0}}, f24 = {{0, 0}}, f26 = {{0, 0}}, f28 = {{0, 0}}, f30 = {{0, 0}}; -static uint32_t fcsr = 1; diff --git a/tools/ido-static-recomp/helpers.h b/tools/ido-static-recomp/helpers.h deleted file mode 100644 index 9e031e0f..00000000 --- a/tools/ido-static-recomp/helpers.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef HELPERS_H -#define HELPERS_H - -#include - -#define MEM_F64(a) (double_from_memory(mem, a)) -#define MEM_F32(a) (*(float *)(mem + a)) -#define MEM_U32(a) (*(uint32_t *)(mem + a)) -#define MEM_S32(a) (*(int32_t *)(mem + a)) -#define MEM_U16(a) (*(uint16_t *)(mem + ((a) ^ 2))) -#define MEM_S16(a) (*(int16_t *)(mem + ((a) ^ 2))) -#define MEM_U8(a) (*(uint8_t *)(mem + ((a) ^ 3))) -#define MEM_S8(a) (*(int8_t *)(mem + ((a) ^ 3))) - -#endif diff --git a/tools/ido-static-recomp/libc_impl.c b/tools/ido-static-recomp/libc_impl.c deleted file mode 100644 index a6a11b96..00000000 --- a/tools/ido-static-recomp/libc_impl.c +++ /dev/null @@ -1,2971 +0,0 @@ -#define _GNU_SOURCE // for sigset -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __CYGWIN__ -#include -#endif - -#ifdef __APPLE__ -#include -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "libc_impl.h" -#include "helpers.h" -#include "header.h" - -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define MAX(a, b) ((a) > (b) ? (a) : (b)) - -#define STRING(param) \ - size_t param##_len = wrapper_strlen(mem, param##_addr); \ - char param[param##_len + 1]; \ - for (size_t i = 0; i <= param##_len; i++) { \ - param[i] = MEM_S8(param##_addr + i); \ - } - -#if !defined(IDO53) && !defined(IDO71) && !defined(IDO72) -#define IDO71 -#endif - -#define MEM_REGION_START 0xfb00000 -#define MEM_REGION_SIZE (512 * 1024 * 1024) - -#ifdef IDO53 -// IDO 5.3 -#define IOB_ADDR 0x0fb528e4 -#define ERRNO_ADDR 0x0fb52720 -#define CTYPE_ADDR 0x0fb504f0 -#define LIBC_ADDR 0x0fb50000 -#define LIBC_SIZE 0x3000 -#endif - -#ifdef IDO71 -// IDO 7.1 -#define IOB_ADDR 0x0fb4ee44 -#define ERRNO_ADDR 0x0fb4ec80 -#define CTYPE_ADDR 0x0fb4cba0 -#define LIBC_ADDR 0x0fb4c000 -#define LIBC_SIZE 0x3000 -#endif - -#ifdef IDO72 -// IDO 7.2 -#define IOB_ADDR 0x0fb49454 -#define ERRNO_ADDR 0x0fb49290 -#define CTYPE_ADDR 0x0fb46db0 -#define LIBC_ADDR 0x0fb46000 -#define LIBC_SIZE 0x4000 -#endif - -#define STDIN_ADDR IOB_ADDR -#define STDOUT_ADDR (IOB_ADDR + 0x10) -#define STDERR_ADDR (IOB_ADDR + 0x20) -#define STDIN ((struct FILE_irix*)&MEM_U32(STDIN_ADDR)) -#define STDOUT ((struct FILE_irix*)&MEM_U32(STDOUT_ADDR)) -#define STDERR ((struct FILE_irix*)&MEM_U32(STDERR_ADDR)) - -#define MALLOC_BINS_ADDR custom_libc_data_addr -#define STRTOK_DATA_ADDR (MALLOC_BINS_ADDR + (30 - 3) * 4) -#define INTBUF_ADDR (STRTOK_DATA_ADDR + 4) - -#define SIGNAL_HANDLER_STACK_START LIBC_ADDR - -#define NFILE 100 - -#define IOFBF 0000 /* full buffered */ -#define IOLBF 0100 /* line buffered */ -#define IONBF 0004 /* not buffered */ -#define IOEOF 0020 /* EOF reached on read */ -#define IOERR 0040 /* I/O error from system */ - -#define IOREAD 0001 /* currently reading */ -#define IOWRT 0002 /* currently writing */ -#define IORW 0200 /* opened for reading and writing */ -#define IOMYBUF 0010 /* stdio malloc()'d buffer */ - -#define STDIO_BUFSIZE 16384 - -struct timespec_t_irix { - int tv_sec; - int tv_nsec; -}; - -struct FILE_irix { - int _cnt; - uint32_t _ptr_addr; - uint32_t _base_addr; - uint8_t pad[2]; - uint8_t _file; - uint8_t _flag; -}; - -typedef uint64_t (*fptr_trampoline)(uint8_t* mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, - uint32_t fp_dest); - -static struct { - struct { - fptr_trampoline trampoline; - uint8_t* mem; - uint32_t fp_dest; - } handlers[65]; - volatile uint32_t recursion_level; -} signal_context; - -static uint32_t cur_sbrk; -static uint32_t bufendtab[NFILE]; // this version contains the size and not the end ptr -static uint32_t custom_libc_data_addr; - -#define _U 01 /* Upper case */ -#define _L 02 /* Lower case */ -#define _N 04 /* Numeral (digit) */ -#define _S 010 /* Spacing character */ -#define _P 020 /* Punctuation */ -#define _C 040 /* Control character */ -#define _B 0100 /* Blank */ -#define _X 0200 /* heXadecimal digit */ - -static char ctype[] = { - 0, - // clang-format off -/* 00 01 02 03 04 05 06 07 */ -/* 0 */ _C, _C, _C, _C, _C, _C, _C, _C, -/* 010 */ _C, _S|_C, _S|_C, _S|_C, _S|_C, _S|_C, _C, _C, -/* 020 */ _C, _C, _C, _C, _C, _C, _C, _C, -/* 030 */ _C, _C, _C, _C, _C, _C, _C, _C, -/* 040 */ _S|_B, _P, _P, _P, _P, _P, _P, _P, -/* 050 */ _P, _P, _P, _P, _P, _P, _P, _P, -/* 060 */ _N|_X, _N|_X, _N|_X, _N|_X, _N|_X, _N|_X, _N|_X, _N|_X, -/* 070 */ _N|_X, _N|_X, _P, _P, _P, _P, _P, _P, -/* 0100 */ _P, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U, -/* 0110 */ _U, _U, _U, _U, _U, _U, _U, _U, -/* 0120 */ _U, _U, _U, _U, _U, _U, _U, _U, -/* 0130 */ _U, _U, _U, _P, _P, _P, _P, _P, -/* 0140 */ _P, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L, -/* 0150 */ _L, _L, _L, _L, _L, _L, _L, _L, -/* 0160 */ _L, _L, _L, _L, _L, _L, _L, _L, -/* 0170 */ _L, _L, _L, _P, _P, _P, _P, _C, -/* 0200 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0210 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0220 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0230 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0240 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0250 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0260 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0270 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0300 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0310 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0320 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0330 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0340 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0350 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0360 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0370 */ 0, 0, 0, 0, 0, 0, 0, 0, - // clang-format on -}; - - -static char usr_lib_redirect[PATH_MAX + 1]; -static char usr_include_redirect[PATH_MAX + 1]; - -static int g_file_max = 3; - - -/* Compilation Target/Emulation Host Page Size Determination */ -#if defined(__CYGWIN__) || (defined(__linux__) && defined(__aarch64__)) -#define RUNTIME_PAGESIZE -/* ARM64 linux can have page sizes of 4kb, 16kb, or 64kb */ -/* Set in main before running the translated code */ -static size_t g_Pagesize; - -#define TRUNC_PAGE(x) ((x) & ~(g_Pagesize - 1)) -#define ROUND_PAGE(x) (TRUNC_PAGE((x) + (g_Pagesize - 1))) - -#elif defined(__APPLE__) -/* https://developer.apple.com/documentation/apple-silicon/addressing-architectural-differences-in-your-macos-code */ -#define TRUNC_PAGE(x) (trunc_page((x))) -#define ROUND_PAGE(x) (round_page((x))) - -#else -/* A fixed 4KB page size for x64 linux (is there anything else?) */ -#define TRUNC_PAGE(x) ((x) & ~(0x1000 - 1)) -#define ROUND_PAGE(x) (TRUNC_PAGE((x) + (0x1000 - 1))) -#endif /* PageSize Macros */ - -static uint8_t* memory_map(size_t length) { -#ifdef __CYGWIN__ - uint8_t* mem = mmap(0, length, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); -#else - uint8_t* mem = mmap(0, length, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -#endif - - assert(TRUNC_PAGE((uintptr_t)mem) == (uintptr_t)mem && - "Page size too small, try increasing `page_size` in recomp.cpp"); - if (mem == MAP_FAILED) { - perror("mmap (memory_map)"); - exit(1); - } - return mem; -} - -static void memory_allocate(uint8_t* mem, uint32_t start, uint32_t end) { - assert(start >= MEM_REGION_START); - assert(end <= MEM_REGION_START + MEM_REGION_SIZE); - // `start` will be passed to mmap, - // so it has to be host aligned in order to keep the guest's pages valid - assert(start == TRUNC_PAGE(start) && "Page size too small, try increasing `page_size` in recomp.cpp"); -#ifdef __CYGWIN__ - uintptr_t _start = TRUNC_PAGE((uintptr_t)mem + start); - uintptr_t _end = ROUND_PAGE((uintptr_t)mem + end); - - if (mprotect((void*)_start, _end - _start, PROT_READ | PROT_WRITE) < 0) { - perror("mprotect (memory_allocate)"); - exit(1); - } -#else - void* addr = (void*)TRUNC_PAGE((uintptr_t)mem + start); - size_t len = end - start; - - if (mmap(addr, len, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) == MAP_FAILED) { - perror("mmap (memory_allocate)"); - exit(1); - } -#endif /* __CYGWIN__ */ -} - -static void memory_unmap(uint8_t* mem, size_t length) { - if (munmap(mem, length)) { - perror("munmap"); - exit(1); - } -} - -static void free_all_file_bufs(uint8_t* mem) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(IOB_ADDR); - for (int i = 0; i < g_file_max; i++) { - if (f[i]._flag & IOMYBUF) { - wrapper_free(mem, f[i]._base_addr); - } - } -} - -void get_env_var(char* out, char* name) { - char* env = getenv(name); - - if (env == NULL) { // No environment variable found, so just return empty string - out[0] = '\0'; - return; - } - - if (snprintf(out, PATH_MAX, "%s", env) >= PATH_MAX) { - fprintf(stderr, "Error: Environment variable %s is too large\n", name); - exit(1); - } - -} - -static void init_usr_lib_redirect(void) { - char path[PATH_MAX + 1] = { 0 }; - - get_env_var(path, "USR_LIB"); - - if (path[0] != '\0') { - strcpy(usr_lib_redirect, path); - return; - } - - // gets the current executable's path -#ifdef __CYGWIN__ - uint32_t size = GetModuleFileName(NULL, path, PATH_MAX); - if (size == 0 || size == PATH_MAX) { - return; - } -#elif defined __APPLE__ - uint32_t size = PATH_MAX; - if (_NSGetExecutablePath(path, &size) < 0) { - return; - } -#else - ssize_t size = readlink("/proc/self/exe", path, PATH_MAX); - if (size < 0 || size == PATH_MAX) { - return; - } -#endif - - strcpy(usr_lib_redirect, dirname(path)); -} - -static void init_usr_include_redirect(void) { - char path[PATH_MAX + 1] = {0}; - - get_env_var(path, "USR_INCLUDE"); - - strcpy(usr_include_redirect, path); -} - -static void init_redirect_paths(void) { - init_usr_lib_redirect(); - init_usr_include_redirect(); -} - -/** - * Redirects `path` by replacing the initial segment `from` by `to`. The result is placed in `out`. - * If `path` does not have `from` as its initial segment, or there is no `to`, the original path is used. - * If an error occurs, an error message will be printed, and the program exited. -*/ -void redirect_path(char* out, const char* path, const char* from, const char* to) { - int from_len = strlen(from); - - if(!strncmp(path, from, from_len) && (to[0] != '\0')) { - char redirected_path[PATH_MAX + 1] = {0}; - int n; - - n = snprintf(redirected_path, sizeof(redirected_path), "%s%s", to, path + from_len); - - if (n >= 0 && n < sizeof(redirected_path)) { - strcpy(out, redirected_path); - } else { - fprintf(stderr, "Error: Unable to redirect %s->%s for %s\n", from, to, path); - exit(1); - } - } else { - strcpy(out, path); - } -} - -void final_cleanup(uint8_t* mem) { - wrapper_fflush(mem, 0); - free_all_file_bufs(mem); - mem += MEM_REGION_START; - memory_unmap(mem, MEM_REGION_SIZE); -} - -int main(int argc, char* argv[]) { - int ret; - - init_redirect_paths(); -#ifdef RUNTIME_PAGESIZE - g_Pagesize = sysconf(_SC_PAGESIZE); -#endif /* RUNTIME_PAGESIZE */ - - uint8_t* mem = memory_map(MEM_REGION_SIZE); - mem -= MEM_REGION_START; - int run(uint8_t * mem, int argc, char* argv[]); - ret = run(mem, argc, argv); - final_cleanup(mem); - return ret; -} - -void mmap_initial_data_range(uint8_t* mem, uint32_t start, uint32_t end) { - custom_libc_data_addr = end; -#ifdef __APPLE__ - end += vm_page_size; -#else - end += 4096; -#endif /* __APPLE__ */ - memory_allocate(mem, start, end); - cur_sbrk = end; -} - -void setup_libc_data(uint8_t* mem) { - memory_allocate(mem, LIBC_ADDR, (LIBC_ADDR + LIBC_SIZE)); - for (size_t i = 0; i < sizeof(ctype); i++) { - MEM_S8(CTYPE_ADDR + i) = ctype[i]; - } - STDIN->_flag = IOREAD; - STDIN->_file = 0; - STDOUT->_flag = IOWRT; - STDOUT->_file = 1; - STDERR->_flag = IOWRT | IONBF; - STDERR->_file = 2; -} - -static uint32_t strcpy1(uint8_t* mem, uint32_t dest_addr, const char* str) { - for (;;) { - char c = *str; - ++str; - MEM_S8(dest_addr) = c; - ++dest_addr; - if (c == '\0') { - return dest_addr - 1; - } - } -} - -static uint32_t strcpy2(uint8_t* mem, uint32_t dest_addr, uint32_t src_addr) { - for (;;) { - char c = MEM_S8(src_addr); - ++src_addr; - MEM_S8(dest_addr) = c; - ++dest_addr; - if (c == '\0') { - return dest_addr - 1; - } - } -} - -uint32_t wrapper_sbrk(uint8_t* mem, int increment) { - uint32_t old = cur_sbrk; - size_t alignedInc = ROUND_PAGE(old + increment) - old; - memory_allocate(mem, old, old + alignedInc); - cur_sbrk += alignedInc; - return old; -} - -/* -Simple bin-based malloc algorithm - -The memory is divided into bins of item sizes 8, 16, 32, 64, 128, ..., 2^30. -Size requests are divided into these bin sizes and each bin is handled -completely separate from other bins. - -For each bin there is a linked list of free'd items. -Linked list node: -struct FreeListNode { - struct Node *next; - size_t free_space_after; - uint8_t data[bin_item_size]; -}; -At most one value of next and space_after is non-zero. -If a node exists in the linked list, it is the memory node to return. -struct AllocatedNode { - int bin; - uint32_t current_size; - uint8_t data[bin_item_size]; -}; -The returned address is the data element. -When the last list node is returned, and free_space_after is big enough -for a new node, a new node is created having free_space_after set to -(free_space_after - (8 + bin_item_size)), and is appended to the list. - -If the list was empty, a new memory chunk is requested from the system -of 65536 bytes, or at least (8 + bin_item_size), rounded up to nearest -page size boundary. It can also be smaller if it leaves holes bigger than -4096 bytes that can never be used. This chunk is then inserted to the list, -and the algorithm restarts. - -This algorithm, for each bin, never uses more than twice as much as is -maximally in use (plus 65536 bytes). -The malloc/free calls run in O(1) and calloc/realloc calls run in O(size). -*/ - -size_t mem_used; -size_t mem_allocated; -size_t max_mem_used; -size_t num_sbrks; -size_t num_allocs; -uint32_t wrapper_malloc(uint8_t* mem, uint32_t size) { - int bin = -1; - for (int i = 3; i < 30; i++) { - if (size <= (1 << i)) { - bin = i; - break; - } - } - if (bin == -1) { - return 0; - } - ++num_allocs; - mem_used += size; - max_mem_used = MAX(mem_used, max_mem_used); - uint32_t item_size = 1 << bin; - uint32_t list_ptr = MALLOC_BINS_ADDR + (bin - 3) * 4; - uint32_t node_ptr = MEM_U32(list_ptr); - if (node_ptr == 0) { - uint32_t sbrk_request = 0x10000; - if (8 + item_size > sbrk_request) { - sbrk_request = 8 + item_size; - sbrk_request = ROUND_PAGE(sbrk_request); - } - uint32_t left_over = sbrk_request % (8 + item_size); - sbrk_request -= left_over & ~(4096 - 1); - mem_allocated += sbrk_request; - ++num_sbrks; - node_ptr = wrapper_sbrk(mem, sbrk_request); - MEM_U32(node_ptr + 4) = sbrk_request - (8 + item_size); - } - uint32_t next = MEM_U32(node_ptr); - if (next == 0) { - uint32_t free_space_after = MEM_U32(node_ptr + 4); - if (free_space_after >= 8 + item_size) { - next = node_ptr + 8 + item_size; - MEM_U32(next + 4) = free_space_after - (8 + item_size); - } - } else { - assert(MEM_U32(node_ptr + 4) == 0); - } - MEM_U32(list_ptr) = next; - MEM_U32(node_ptr) = bin; - MEM_U32(node_ptr + 4) = size; - return node_ptr + 8; -} - -uint32_t wrapper_calloc(uint8_t* mem, uint32_t num, uint32_t size) { - uint64_t new_size = (uint64_t)num * size; - assert(new_size == (uint32_t)new_size); - uint32_t ret = wrapper_malloc(mem, new_size); - return wrapper_memset(mem, ret, 0, new_size); -} - -uint32_t wrapper_realloc(uint8_t* mem, uint32_t data_addr, uint32_t size) { - if (data_addr == 0) { - return wrapper_malloc(mem, size); - } else { - uint32_t node_ptr = data_addr - 8; - int bin = MEM_U32(node_ptr); - uint32_t old_size = MEM_U32(node_ptr + 4); - uint32_t max_size = 1 << bin; - assert(bin >= 3 && bin < 30); - assert(old_size <= max_size); - if (size <= max_size) { - mem_used = mem_used - old_size + size; - MEM_U32(node_ptr + 4) = size; - return data_addr; - } else { - uint32_t new_addr = wrapper_malloc(mem, size); - wrapper_memcpy(mem, new_addr, data_addr, old_size); - wrapper_free(mem, data_addr); - return new_addr; - } - } -} - -void wrapper_free(uint8_t* mem, uint32_t data_addr) { - if (data_addr == 0) { - return; - } - uint32_t node_ptr = data_addr - 8; - int bin = MEM_U32(node_ptr); - uint32_t size = MEM_U32(node_ptr + 4); - if (size == 0) { - // Double free. IDO 5.3 strip relies on this. - fprintf(stderr, "warning: double free: 0x%x\n", data_addr); - return; - } - uint32_t list_ptr = MALLOC_BINS_ADDR + (bin - 3) * 4; - assert(bin >= 3 && bin < 30); - assert(size <= (1 << bin)); - MEM_U32(node_ptr) = MEM_U32(list_ptr); - MEM_U32(node_ptr + 4) = 0; - MEM_U32(list_ptr) = node_ptr; - mem_used -= size; -} - -int wrapper_fscanf(uint8_t* mem, uint32_t fp_addr, uint32_t format_addr, uint32_t sp) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - STRING(format) // for debug - - int ret = 0; - char c; - int ch; - sp += 2 * 4; - for (;;) { - c = MEM_S8(format_addr); - ++format_addr; - if (c == '%') { - c = MEM_S8(format_addr); - ++format_addr; - if (c == '%') { - goto percent; - } - for (;;) { - ch = wrapper_fgetc(mem, fp_addr); - if (ch == -1) { - return ret; - } - if (!isspace(ch)) { - break; - } - } - bool l = false; - continue_format: - switch (c) { - case 'l': - assert(!l && "ll not implemented in fscanf"); - l = true; - c = MEM_S8(format_addr); - ++format_addr; - goto continue_format; - case 'd': { - int64_t num = 0; - int sign = 1; - bool found_first = false; - if (ch == '-') { - sign = -1; - ch = wrapper_fgetc(mem, fp_addr); - if (ch == -1) { - return ret; - } - } - for (;;) { - if (isdigit(ch)) { - num *= 10; - num += ch - '0'; - found_first = true; - ch = wrapper_fgetc(mem, fp_addr); - if (ch == -1) { - break; - } - } else { - wrapper_ungetc(mem, ch, fp_addr); - break; - } - } - if (found_first) { - uint32_t int_addr = MEM_U32(sp); - sp += 4; - MEM_S32(int_addr) = (int)(num * sign); - ++ret; - } else { - return ret; - } - break; - } - default: - assert(0 && "fscanf format not implemented"); - } - } else if (c == '\0') { - break; - } else { - percent: - ch = wrapper_fgetc(mem, fp_addr); - if (ch == -1) { - break; - } - if ((char)ch != c) { - break; - } - } - } - - return ret; -} - -int wrapper_printf(uint8_t* mem, uint32_t format_addr, uint32_t sp) { - STRING(format) - if (!strcmp(format, " child died due to signal %d.\n")) { - printf(format, MEM_U32(sp + 4)); - return 1; - } - assert(0 && "printf not implemented"); - return 0; -} - -int wrapper_sprintf(uint8_t* mem, uint32_t str_addr, uint32_t format_addr, uint32_t sp) { - STRING(format) // for debug - char temp[32]; - - if (!strcmp(format, "%.16e")) { - union { - uint32_t w[2]; - double d; - } d; - d.w[1] = MEM_U32(sp + 2 * 4); - d.w[0] = MEM_U32(sp + 3 * 4); - sprintf(temp, "%.16e", d.d); - strcpy1(mem, str_addr, temp); - return 1; - } - if (!strcmp(format, "\\%03o")) { - sprintf(temp, "\\%03o", MEM_U32(sp + 2 * 4)); - strcpy1(mem, str_addr, temp); - return 1; - } - if (!strcmp(format, "%*ld=")) { - sprintf(temp, "%*d=", MEM_U32(sp + 2 * 4), MEM_U32(sp + 3 * 4)); - strcpy1(mem, str_addr, temp); - return 1; - } - - uint32_t orig_str_addr = str_addr; - uint32_t pos = 0; - int ret = 0; - char c; - sp += 2 * 4; - for (;;) { - c = MEM_S8(format_addr + pos); - ++pos; - if (c == '%') { - bool l = false; - c = MEM_S8(format_addr + pos); - ++pos; - uint32_t zeros = 0; - bool zero_prefix = false; - continue_format: - switch (c) { - case '\0': - goto finish_str; - - case '0': - do { - c = MEM_S8(format_addr + pos); - ++pos; - if (c >= '0' && c <= '9') { - zeros *= 10; - zeros += c - '0'; - } - } while (c >= '0' && c <= '9'); - goto continue_format; - case '#': - c = MEM_S8(format_addr + pos); - ++pos; - zero_prefix = true; - goto continue_format; - break; - case 'l': - assert(!l && "ll not implemented in fscanf"); - c = MEM_S8(format_addr + pos); - ++pos; - l = true; - goto continue_format; - break; - case 'd': - if (zeros != 0) { - char temp1[32]; - sprintf(temp1, "%%0%dd", zeros); - sprintf(temp, temp1, MEM_S32(sp)); - } else { - sprintf(temp, "%d", MEM_S32(sp)); - } - sp += 4; - str_addr = strcpy1(mem, str_addr, temp); - ++ret; - break; - case 'o': - if (zero_prefix) { - sprintf(temp, "%#o", MEM_S32(sp)); - } else { - sprintf(temp, "%o", MEM_S32(sp)); - } - sp += 4; - str_addr = strcpy1(mem, str_addr, temp); - ++ret; - break; - case 'x': - if (zero_prefix) { - sprintf(temp, "%#x", MEM_S32(sp)); - } else { - sprintf(temp, "%x", MEM_S32(sp)); - } - sp += 4; - str_addr = strcpy1(mem, str_addr, temp); - ++ret; - break; - case 'u': - sprintf(temp, "%u", MEM_S32(sp)); - sp += 4; - str_addr = strcpy1(mem, str_addr, temp); - ++ret; - break; - case 's': - str_addr = strcpy2(mem, str_addr, MEM_U32(sp)); - sp += 4; - ++ret; - break; - case 'c': - MEM_S8(str_addr) = (char)MEM_U32(sp); - ++str_addr; - sp += 4; - ++ret; - break; - case '%': - MEM_S8(str_addr) = '%'; - ++str_addr; - break; - default: - fprintf(stderr, "%s\n", format); - assert(0 && "non-implemented sprintf format"); - } - } else if (c == '\0') { - break; - } else { - MEM_S8(str_addr) = c; - ++str_addr; - } - } - -finish_str: - MEM_S8(str_addr) = '\0'; - return ret; -} - -int wrapper_fprintf(uint8_t* mem, uint32_t fp_addr, uint32_t format_addr, uint32_t sp) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - STRING(format) - sp += 8; - - // Special-case this one format string. This seems to be the only one that uses `%f` or width specifiers. - if (!strcmp(format, "%.2fu %.2fs %u:%04.1f %.0f%%\n") && fp_addr == STDERR_ADDR) { - double arg0 = MEM_F64(sp + 0); - double arg1 = MEM_F64(sp + 8); - uint32_t arg2 = MEM_U32(sp + 16); - double arg3 = MEM_F64(sp + 24); - double arg4 = MEM_F64(sp + 32); - fprintf(stderr, format, arg0, arg1, arg2, arg3, arg4); - fflush(stderr); - return 1; - } - if (strcmp(format, "%s phase time: %.2fu %.2fs %u:%04.1f %.0f%%\n") == 0 && fp_addr == STDERR_ADDR) { - if (wrapper_fputs(mem, MEM_U32(sp), fp_addr) == -1) { - return 0; - } - sp += 4; - // align - sp += 4; - - double arg0 = MEM_F64(sp + 0); - double arg1 = MEM_F64(sp + 8); - uint32_t arg2 = MEM_U32(sp + 16); - double arg3 = MEM_F64(sp + 24); - double arg4 = MEM_F64(sp + 32); - fprintf(stderr, " phase time: %.2fu %.2fs %u:%04.1f %.0f%%\n", arg0, arg1, arg2, arg3, arg4); - fflush(stderr); - return 1; - } - int ret = 0; - for (;;) { - int width = 1; - uint32_t pos = format_addr; - char ch = MEM_S8(pos); - - while (ch != '%' && ch != '\0') { - ++pos; - ch = MEM_S8(pos); - } - if (format_addr != pos) { - if (wrapper_fwrite(mem, format_addr, 1, pos - format_addr, fp_addr) != pos - format_addr) { - break; - } - } - if (ch == '\0') { - break; - } - ++pos; - ch = MEM_S8(pos); - if (ch >= '1' && ch <= '9') { - ++pos; - width = ch - '0'; - ch = MEM_S8(pos); - } - - switch (ch) { - case 'd': - case 'x': - case 'X': - case 'c': - case 'u': { - char buf[32]; - - char formatSpecifier[0x100] = { 0 }; - - formatSpecifier[0] = '%'; - formatSpecifier[1] = width + '0'; - formatSpecifier[2] = ch; - - sprintf(buf, formatSpecifier, MEM_U32(sp)); - - strcpy1(mem, INTBUF_ADDR, buf); - if (wrapper_fputs(mem, INTBUF_ADDR, fp_addr) == -1) { - return ret; - } - sp += 4; - ++ret; - break; - } - case 's': { - if (wrapper_fputs(mem, MEM_U32(sp), fp_addr) == -1) { - return ret; - } - sp += 4; - ++ret; - break; - } - default: - fprintf(stderr, "missing format: '%s'\n", format); - assert(0 && "non-implemented fprintf format"); - } - format_addr = ++pos; - } - return ret; -} - -int wrapper__doprnt(uint8_t* mem, uint32_t format_addr, uint32_t params_addr, uint32_t fp_addr) { - assert(0 && "_doprnt not implemented"); - return 0; -} - -uint32_t wrapper_strlen(uint8_t* mem, uint32_t str_addr) { - uint32_t len = 0; - while (MEM_S8(str_addr) != '\0') { - ++str_addr; - ++len; - } - return len; -} - -int wrapper_open(uint8_t* mem, uint32_t pathname_addr, int flags, int mode) { - STRING(pathname) - - char rpathname[PATH_MAX + 1]; - redirect_path(rpathname, pathname, "/usr/include", usr_include_redirect); - - int f = flags & O_ACCMODE; - if (flags & 0x100) { - f |= O_CREAT; - } - if (flags & 0x200) { - f |= O_TRUNC; - } - if (flags & 0x400) { - f |= O_EXCL; - } - if (flags & 0x800) { - f |= O_NOCTTY; - } - if (flags & 0x08) { - f |= O_APPEND; - } - - int fd = open(rpathname, f, mode); - MEM_U32(ERRNO_ADDR) = errno; - return fd; -} - -int wrapper_creat(uint8_t* mem, uint32_t pathname_addr, int mode) { - STRING(pathname) - int ret = creat(pathname, mode); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_access(uint8_t* mem, uint32_t pathname_addr, int mode) { - STRING(pathname) - int ret = access(pathname, mode); - if (ret != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_rename(uint8_t* mem, uint32_t oldpath_addr, uint32_t newpath_addr) { - STRING(oldpath) - STRING(newpath) - int ret = rename(oldpath, newpath); - if (ret != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_utime(uint8_t* mem, uint32_t filename_addr, uint32_t times_addr) { - STRING(filename) - struct utimbuf buf = { 0, 0 }; - int ret = utime(filename, times_addr == 0 ? NULL : &buf); - if (ret == 0) { - if (times_addr != 0) { - MEM_U32(times_addr + 0) = buf.actime; - MEM_U32(times_addr + 4) = buf.modtime; - } - } else { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_flock(uint8_t* mem, int fd, int operation) { - int ret = flock(fd, operation); - if (ret != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_chmod(uint8_t* mem, uint32_t path_addr, uint32_t mode) { - STRING(path) - int ret = chmod(path, mode); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_umask(int mode) { - return umask(mode); -} - -uint32_t wrapper_ecvt(uint8_t* mem, double number, int ndigits, uint32_t decpt_addr, uint32_t sign_addr) { - assert(0); -} - -uint32_t wrapper_fcvt(uint8_t* mem, double number, int ndigits, uint32_t decpt_addr, uint32_t sign_addr) { - assert(0); -} - -double wrapper_sqrt(double v) { - return sqrt(v); -} - -float wrapper_sqrtf(float v) { - return sqrtf(v); -} - -int wrapper_atoi(uint8_t* mem, uint32_t nptr_addr) { - STRING(nptr) - return atoi(nptr); -} - -int wrapper_atol(uint8_t* mem, uint32_t nptr_addr) { - return wrapper_atoi(mem, nptr_addr); -} - -double wrapper_atof(uint8_t* mem, uint32_t nptr_addr) { - STRING(nptr); - return atof(nptr); -} - -int wrapper_strtol(uint8_t* mem, uint32_t nptr_addr, uint32_t endptr_addr, int base) { - STRING(nptr) - char* endptr = NULL; - int64_t res = strtoll(nptr, endptr_addr != 0 ? &endptr : NULL, base); - if (res > INT_MAX) { - MEM_U32(ERRNO_ADDR) = ERANGE; - res = INT_MAX; - } - if (res < INT_MIN) { - MEM_U32(ERRNO_ADDR) = ERANGE; - res = INT_MIN; - } - if (endptr != NULL) { - MEM_U32(endptr_addr) = nptr_addr + (uint32_t)(endptr - nptr); - } - return res; -} - -uint32_t wrapper_strtoul(uint8_t* mem, uint32_t nptr_addr, uint32_t endptr_addr, int base) { - STRING(nptr) - char* endptr = NULL; - uint64_t res = strtoull(nptr, endptr_addr != 0 ? &endptr : NULL, base); - if (res > INT_MAX) { - MEM_U32(ERRNO_ADDR) = ERANGE; - res = INT_MAX; - } - if (endptr != NULL) { - MEM_U32(endptr_addr) = nptr_addr + (uint32_t)(endptr - nptr); - } - return res; -} - -int64_t wrapper_strtoll(uint8_t* mem, uint32_t nptr_addr, uint32_t endptr_addr, int base) { - STRING(nptr) - char* endptr = NULL; - errno = 0; - int64_t res = strtoll(nptr, endptr_addr != 0 ? &endptr : NULL, base); - if (errno != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - if (endptr != NULL) { - MEM_U32(endptr_addr) = nptr_addr + (uint32_t)(endptr - nptr); - } - return res; -} - -uint64_t wrapper_strtoull(uint8_t* mem, uint32_t nptr_addr, uint32_t endptr_addr, int base) { - STRING(nptr) - char* endptr = NULL; - errno = 0; - uint64_t res = strtoull(nptr, endptr_addr != 0 ? &endptr : NULL, base); - if (errno != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - if (endptr != NULL) { - MEM_U32(endptr_addr) = nptr_addr + (uint32_t)(endptr - nptr); - } - return res; -} - -double wrapper_strtod(uint8_t* mem, uint32_t nptr_addr, uint32_t endptr_addr) { - STRING(nptr) - char* endptr = NULL; - errno = 0; - double res = strtod(nptr, endptr_addr != 0 ? &endptr : NULL); - if (errno != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - if (endptr != NULL) { - MEM_U32(endptr_addr) = nptr_addr + (uint32_t)(endptr - nptr); - } - return res; -} - -uint32_t wrapper_strchr(uint8_t* mem, uint32_t str_addr, int c) { - c = c & 0xff; - for (;;) { - unsigned char ch = MEM_U8(str_addr); - if (ch == c) { - return str_addr; - } - if (ch == '\0') { - return 0; - } - ++str_addr; - } -} - -uint32_t wrapper_strrchr(uint8_t* mem, uint32_t str_addr, int c) { - c = c & 0xff; - uint32_t ret = 0; - for (;;) { - unsigned char ch = MEM_U8(str_addr); - if (ch == c) { - ret = str_addr; - } - if (ch == '\0') { - return ret; - } - ++str_addr; - } -} - -uint32_t wrapper_strcspn(uint8_t* mem, uint32_t str_addr, uint32_t invalid_addr) { - STRING(invalid) - uint32_t n = strlen(invalid); - uint32_t pos = 0; - char c; - while ((c = MEM_S8(str_addr)) != 0) { - for (int i = 0; i < n; i++) { - if (c == invalid[i]) { - return pos; - } - } - ++pos; - ++str_addr; - } - return pos; -} - -uint32_t wrapper_strpbrk(uint8_t* mem, uint32_t str_addr, uint32_t accept_addr) { - STRING(accept) - uint32_t n = strlen(accept); - char c; - while ((c = MEM_S8(str_addr)) != 0) { - for (int i = 0; i < n; i++) { - if (c == accept[i]) { - return str_addr; - } - } - ++str_addr; - } - return 0; -} - -static void stat_common(uint8_t* mem, uint32_t buf_addr, struct stat* statbuf) { - struct irix_stat { - int st_dev; - int pad1[3]; - int st_ino; - int st_mode; - int st_nlink; - int st_uid; - int st_gid; - int st_rdev; - int pad2[2]; - int st_size; - int pad3; - struct timespec_t_irix st_atim; - struct timespec_t_irix st_mtim; - struct timespec_t_irix st_ctim; - int st_blksize; - int st_blocks; - } s; - s.st_dev = statbuf->st_dev; - s.st_ino = statbuf->st_ino; - s.st_mode = statbuf->st_mode; - s.st_nlink = statbuf->st_nlink; - s.st_uid = statbuf->st_uid; - s.st_gid = statbuf->st_gid; - s.st_rdev = statbuf->st_rdev; - s.st_size = statbuf->st_size; -#ifdef __APPLE__ - s.st_atim.tv_sec = statbuf->st_atimespec.tv_sec; - s.st_atim.tv_nsec = statbuf->st_atimespec.tv_nsec; - s.st_mtim.tv_sec = statbuf->st_mtimespec.tv_sec; - s.st_mtim.tv_nsec = statbuf->st_mtimespec.tv_nsec; - s.st_ctim.tv_sec = statbuf->st_ctimespec.tv_sec; - s.st_ctim.tv_nsec = statbuf->st_ctimespec.tv_nsec; -#else - s.st_atim.tv_sec = statbuf->st_atim.tv_sec; - s.st_atim.tv_nsec = statbuf->st_atim.tv_nsec; - s.st_mtim.tv_sec = statbuf->st_mtim.tv_sec; - s.st_mtim.tv_nsec = statbuf->st_mtim.tv_nsec; - s.st_ctim.tv_sec = statbuf->st_ctim.tv_sec; - s.st_ctim.tv_nsec = statbuf->st_ctim.tv_nsec; -#endif - memcpy(&MEM_U32(buf_addr), &s, sizeof(s)); -} - -int wrapper_fstat(uint8_t* mem, int fildes, uint32_t buf_addr) { - struct stat statbuf; - if (fstat(fildes, &statbuf) < 0) { - MEM_U32(ERRNO_ADDR) = errno; - return -1; - } else { - stat_common(mem, buf_addr, &statbuf); - return 0; - } -} - -int wrapper_stat(uint8_t* mem, uint32_t pathname_addr, uint32_t buf_addr) { - STRING(pathname) - struct stat statbuf; - if (stat(pathname, &statbuf) < 0) { - MEM_U32(ERRNO_ADDR) = errno; - return -1; - } else { - stat_common(mem, buf_addr, &statbuf); - return 0; - } -} - -int wrapper_ftruncate(uint8_t* mem, int fd, int length) { - int ret = ftruncate(fd, length); - if (ret != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_truncate(uint8_t* mem, uint32_t pathname_addr, int length) { - STRING(pathname) - int ret = truncate(pathname, length); - if (ret != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -void wrapper_bcopy(uint8_t* mem, uint32_t src_addr, uint32_t dst_addr, uint32_t len) { - if (dst_addr % 4 == 0 && src_addr % 4 == 0 && len % 4 == 0) { - // Use memmove to copy regions that are 4-byte aligned. - // This prevents the byte-swapped mem from causing issues when copying normally. - // Memmove handles overlapping copies correctly, so overlap does not need to be checked. - memmove(&MEM_U32(dst_addr), &MEM_U32(src_addr), len); - } else if (dst_addr > src_addr) { - // Perform a reverse byte-swapped copy when the destination is ahead of the source. - // This prevents overwriting the source contents before they're read. - dst_addr += len - 1; - src_addr += len - 1; - while (len--) { - MEM_U8(dst_addr) = MEM_U8(src_addr); - --dst_addr; - --src_addr; - } - } else { - // Otherwise, perform a normal byte-swapped copy. - while (len--) { - MEM_U8(dst_addr) = MEM_U8(src_addr); - ++dst_addr; - ++src_addr; - } - } -} - -/** - * IRIX's memcpy seems to allow overlapping destination and source pointers, while the C standard dictates - * both pointer should not overlap, (UB otherwise). - * Because of this, we only use host bcopy since it can handle overlapping regions - */ -uint32_t wrapper_memcpy(uint8_t* mem, uint32_t dst_addr, uint32_t src_addr, uint32_t len) { - wrapper_bcopy(mem, src_addr, dst_addr, len); - return dst_addr; -} - -uint32_t wrapper_memccpy(uint8_t* mem, uint32_t dst_addr, uint32_t src_addr, int c, uint32_t len) { - while (len--) { - uint8_t ch = MEM_U8(src_addr); - MEM_U8(dst_addr) = ch; - ++dst_addr; - ++src_addr; - if (ch == c) { - return dst_addr; - } - } - return 0; -} - -int wrapper_read(uint8_t* mem, int fd, uint32_t buf_addr, uint32_t nbytes) { - uint8_t* buf = (uint8_t*)malloc(nbytes); - ssize_t ret = read(fd, buf, nbytes); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } else { - for (ssize_t i = 0; i < ret; i++) { - MEM_U8(buf_addr + i) = buf[i]; - } - } - free(buf); - return (int)ret; -} - -int wrapper_write(uint8_t* mem, int fd, uint32_t buf_addr, uint32_t nbytes) { - uint8_t* buf = (uint8_t*)malloc(nbytes); - for (size_t i = 0; i < nbytes; i++) { - buf[i] = MEM_U8(buf_addr + i); - } - ssize_t ret = write(fd, buf, nbytes); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - free(buf); - return (int)ret; -} - -static uint32_t init_file(uint8_t* mem, int fd, int i, const char* path, const char* mode) { - int flags = O_RDONLY; - if (strcmp(mode, "r") == 0 || strcmp(mode, "rb") == 0) { - flags = O_RDONLY; - } else if (strcmp(mode, "w") == 0 || strcmp(mode, "wb") == 0) { - flags = O_WRONLY | O_CREAT | O_TRUNC; - } else if (strcmp(mode, "a") == 0 || strcmp(mode, "ab") == 0) { - flags = O_WRONLY | O_CREAT | O_APPEND; - } else if (strcmp(mode, "r+") == 0 || strcmp(mode, "r+b") == 0) { - flags = O_RDWR; - } else if (strcmp(mode, "w+") == 0 || strcmp(mode, "w+b") == 0) { - flags = O_RDWR | O_CREAT | O_TRUNC; - } else if (strcmp(mode, "a+") == 0 || strcmp(mode, "a+b") == 0) { - flags = O_RDWR | O_CREAT | O_APPEND; - } - if (fd == -1) { - char rpathname[PATH_MAX + 1]; - redirect_path(rpathname, path, "/usr/lib", usr_lib_redirect); - - fd = open(rpathname, flags, 0666); - - if (fd < 0) { - MEM_U32(ERRNO_ADDR) = errno; - return 0; - } - } - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(IOB_ADDR); - uint32_t ret = 0; - if (i == -1) { - for (i = 3; i < NFILE; i++) { - if (f[i]._flag == 0) { - break; - } - } - } - assert(i < NFILE); - g_file_max = i + 1; - ret = IOB_ADDR + i * sizeof(struct FILE_irix); - f[i]._cnt = 0; - f[i]._ptr_addr = 0; - f[i]._base_addr = 0; - f[i]._file = fd; - f[i]._flag = (flags & O_ACCMODE) == O_RDONLY ? IOREAD : 0; - f[i]._flag |= (flags & O_ACCMODE) == O_WRONLY ? IOWRT : 0; - f[i]._flag |= (flags & O_ACCMODE) == O_RDWR ? IORW : 0; - bufendtab[i] = 0; - return ret; -} - -uint32_t wrapper_fopen(uint8_t* mem, uint32_t path_addr, uint32_t mode_addr) { - assert(path_addr != 0); - assert(mode_addr != 0); - - STRING(path) - STRING(mode) - return init_file(mem, -1, -1, path, mode); -} - -uint32_t wrapper_freopen(uint8_t* mem, uint32_t path_addr, uint32_t mode_addr, uint32_t fp_addr) { - STRING(path) - STRING(mode) - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - wrapper_fclose(mem, fp_addr); - return init_file(mem, -1, f - (struct FILE_irix*)&MEM_U32(IOB_ADDR), path, mode); -} - -int wrapper_fclose(uint8_t* mem, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - wrapper_fflush(mem, fp_addr); - if (f->_flag & IOMYBUF) { - wrapper_free(mem, f->_base_addr); - } - f->_flag = 0; - close(f->_file); - return 0; -} - -static int flush_all(uint8_t* mem) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(IOB_ADDR); - int ret = 0; - for (int i = 0; i < g_file_max; i++) { - if (f[i]._flag & IOWRT) { - ret |= wrapper_fflush(mem, IOB_ADDR + i * sizeof(struct FILE_irix)); - } - } - return ret; -} - -int wrapper_fflush(uint8_t* mem, uint32_t fp_addr) { - if (fp_addr == 0) { - // Flush all - return flush_all(mem); - } - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - if (f->_flag & IOWRT) { - int p = 0; - int to_flush = f->_ptr_addr - f->_base_addr; - int c = to_flush; - while (c > 0) { - int r = wrapper_write(mem, f->_file, f->_base_addr + p, c); - if (r < 0) { - f->_file |= IOERR; - return -1; - } - p += r; - c -= r; - } - f->_ptr_addr = f->_base_addr; - f->_cnt += to_flush; - } - return 0; -} - -int wrapper_fchown(uint8_t* mem, int fd, int owner, int group) { - int ret = fchown(fd, owner, group); - if (ret != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_ftell(uint8_t* mem, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - int adjust; - if (f->_cnt < 0) { - f->_cnt = 0; - } - if (f->_flag & IOREAD) { - adjust = -f->_cnt; - } else if (f->_flag & (IOWRT | IORW)) { - adjust = 0; - if ((f->_flag & IOWRT) && f->_base_addr != 0 && (f->_flag & IONBF) == 0) { - adjust = f->_ptr_addr - f->_base_addr; - } - } else { - return -1; - } - int res = wrapper_lseek(mem, f->_file, 0, 1); - if (res >= 0) { - res += adjust; - } - return res; -} - -void wrapper_rewind(uint8_t* mem, uint32_t fp_addr) { - (void)wrapper_fseek(mem, fp_addr, 0, SEEK_SET); - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - f->_flag &= ~IOERR; -} - -int wrapper_fseek(uint8_t* mem, uint32_t fp_addr, int offset, int origin) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - int c, p; - f->_flag &= ~IOEOF; - if (f->_flag & IOREAD) { - if (origin < SEEK_END && f->_base_addr && !(f->_flag & IONBF)) { - c = f->_cnt; - p = offset; - if (origin == SEEK_SET) { - p += c - lseek(f->_file, 0L, SEEK_CUR); - } else { - offset -= c; - } - if (!(f->_flag & IORW) && c > 0 && p <= c && p >= f->_base_addr - f->_ptr_addr) { - f->_ptr_addr += p; - f->_cnt -= p; - return 0; - } - } - if (f->_flag & IORW) { - f->_ptr_addr = f->_base_addr; - f->_flag &= ~IOREAD; - } - p = lseek(f->_file, offset, origin); - f->_cnt = 0; - } else if (f->_flag & (IOWRT | IORW)) { - wrapper_fflush(mem, fp_addr); - if (f->_flag & IORW) { - f->_cnt = 0; - f->_flag &= ~IOWRT; - f->_ptr_addr = f->_base_addr; - } - p = lseek(f->_file, offset, origin); - } - if (p < 0) { - MEM_U32(ERRNO_ADDR) = errno; - return p; - } - return 0; -} - -int wrapper_lseek(uint8_t* mem, int fd, int offset, int whence) { - int ret = (int)lseek(fd, offset, whence); - if (ret == -1) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_dup(uint8_t* mem, int fd) { - fd = dup(fd); - if (fd < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return fd; -} - -int wrapper_dup2(uint8_t* mem, int oldfd, int newfd) { - int fd = dup2(oldfd, newfd); - if (fd < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return fd; -} - -int wrapper_pipe(uint8_t* mem, uint32_t pipefd_addr) { - int pipefd[2]; - int ret = pipe(pipefd); - if (ret == 0) { - MEM_U32(pipefd_addr + 0) = pipefd[0]; - MEM_U32(pipefd_addr + 4) = pipefd[1]; - } else { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -void wrapper_perror(uint8_t* mem, uint32_t str_addr) { - STRING(str) - perror(str); -} - -int wrapper_fdopen(uint8_t* mem, int fd, uint32_t mode_addr) { - STRING(mode) - return init_file(mem, fd, -1, NULL, mode); -} - -uint32_t wrapper_memset(uint8_t* mem, uint32_t dest_addr, int byte, uint32_t n) { - uint32_t saved = dest_addr; - if (dest_addr % 4 == 0 && n % 4 == 0) { - memset(&MEM_U32(dest_addr), byte, n); - } else { - while (n--) { - MEM_U8(dest_addr) = (uint8_t)byte; - ++dest_addr; - } - } - return saved; -} - -int wrapper_bcmp(uint8_t* mem, uint32_t s1_addr, uint32_t s2_addr, uint32_t n) { - while (n--) { - if (MEM_U8(s1_addr) != MEM_U8(s2_addr)) { - return 1; - } - ++s1_addr; - ++s2_addr; - } - return 0; -} - -int wrapper_memcmp(uint8_t* mem, uint32_t s1_addr, uint32_t s2_addr, uint32_t n) { - while (n--) { - unsigned char c1 = MEM_U8(s1_addr); - unsigned char c2 = MEM_U8(s2_addr); - if (c1 < c2) { - return -1; - } - if (c1 > c2) { - return 1; - } - ++s1_addr; - ++s2_addr; - } - return 0; -} - -int wrapper_getpid(void) { - return getpid(); -} - -int wrapper_getpgrp(uint8_t* mem) { - int ret = getpgrp(); - if (ret == -1) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_remove(uint8_t* mem, uint32_t path_addr) { - STRING(path) - int ret = remove(path); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_unlink(uint8_t* mem, uint32_t path_addr) { - if (path_addr == 0) { - fprintf(stderr, "Warning: unlink with NULL as arguement\n"); - MEM_U32(ERRNO_ADDR) = EFAULT; - return -1; - } - STRING(path) - int ret = unlink(path); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_close(uint8_t* mem, int fd) { - int ret = close(fd); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_strcmp(uint8_t* mem, uint32_t s1_addr, uint32_t s2_addr) { - for (;;) { - char c1 = MEM_S8(s1_addr); - char c2 = MEM_S8(s2_addr); - if (c1 != c2) { - return c1 < c2 ? -1 : 1; - } - if (c1 == '\0') { - return 0; - } - ++s1_addr; - ++s2_addr; - } -} - -int wrapper_strncmp(uint8_t* mem, uint32_t s1_addr, uint32_t s2_addr, uint32_t n) { - if (n == 0) { - return 0; - } - for (;;) { - char c1 = MEM_S8(s1_addr); - char c2 = MEM_S8(s2_addr); - if (c1 != c2) { - return c1 < c2 ? -1 : 1; - } - if (--n == 0 || c1 == '\0') { - return 0; - } - ++s1_addr; - ++s2_addr; - } -} - -uint32_t wrapper_strcpy(uint8_t* mem, uint32_t dest_addr, uint32_t src_addr) { - uint32_t saved = dest_addr; - for (;;) { - char c = MEM_S8(src_addr); - ++src_addr; - MEM_S8(dest_addr) = c; - ++dest_addr; - if (c == '\0') { - return saved; - } - } -} - -uint32_t wrapper_strncpy(uint8_t* mem, uint32_t dest_addr, uint32_t src_addr, uint32_t n) { - uint32_t i; - for (i = 0; i < n && MEM_S8(src_addr) != '\0'; i++) { - MEM_S8(dest_addr + i) = MEM_S8(src_addr + i); - } - for (; i < n; i++) { - MEM_S8(dest_addr + i) = '\0'; - } - return dest_addr; -} - -uint32_t wrapper_strcat(uint8_t* mem, uint32_t dest_addr, uint32_t src_addr) { - uint32_t saved = dest_addr; - while (MEM_S8(dest_addr) != '\0') { - ++dest_addr; - } - while (MEM_S8(src_addr) != '\0') { - MEM_S8(dest_addr) = MEM_S8(src_addr); - ++src_addr; - ++dest_addr; - } - MEM_S8(dest_addr) = '\0'; - return saved; -} - -uint32_t wrapper_strncat(uint8_t* mem, uint32_t dest_addr, uint32_t src_addr, uint32_t n) { - uint32_t saved = dest_addr; - while (MEM_S8(dest_addr) != '\0') { - ++dest_addr; - } - while (n-- && MEM_S8(src_addr) != '\0') { - MEM_S8(dest_addr) = MEM_S8(src_addr); - ++src_addr; - ++dest_addr; - } - MEM_S8(dest_addr) = '\0'; - return saved; -} - -uint32_t wrapper_strtok(uint8_t* mem, uint32_t str_addr, uint32_t delimiters_addr) { - if (str_addr == 0) { - str_addr = MEM_U32(STRTOK_DATA_ADDR); - } - if (str_addr == 0) { - // nothing remaining - return 0; - } - uint32_t p; - for (p = str_addr; MEM_S8(p) != '\0'; p++) { - uint32_t q; - for (q = delimiters_addr; MEM_S8(q) != '\0' && MEM_S8(q) != MEM_S8(p); q++) {} - if (MEM_S8(q) == '\0') { - break; - } - } - if (MEM_S8(p) == '\0') { - return 0; - } - uint32_t ret = p; - for (;;) { - uint32_t q; - for (q = delimiters_addr; MEM_S8(q) != '\0' && MEM_S8(q) != MEM_S8(p); q++) {} - if (MEM_S8(q) != '\0') { - MEM_S8(p) = '\0'; - MEM_U32(STRTOK_DATA_ADDR) = ++p; - return ret; - } - char next = MEM_S8(p); - ++p; - if (next == '\0') { - MEM_U32(STRTOK_DATA_ADDR) = 0; - return ret; - } - } -} - -uint32_t wrapper_strstr(uint8_t* mem, uint32_t str1_addr, uint32_t str2_addr) { - for (;;) { - if (MEM_S8(str1_addr) == '\0') { - return 0; - } - uint32_t s1 = str1_addr; - uint32_t s2 = str2_addr; - for (;;) { - char c2 = MEM_S8(s2); - if (c2 == '\0') { - return str1_addr; - } - if (MEM_S8(s1) == c2) { - ++s1; - ++s2; - } else { - break; - } - } - ++str1_addr; - } -} - -uint32_t wrapper_strdup(uint8_t* mem, uint32_t str_addr) { - uint32_t len = wrapper_strlen(mem, str_addr) + 1; - uint32_t ret = wrapper_malloc(mem, len); - if (ret == 0) { - MEM_U32(ERRNO_ADDR) = ENOMEM; - return 0; - } - return wrapper_memcpy(mem, ret, str_addr, len); -} - -int wrapper_toupper(int c) { - return toupper(c); -} - -int wrapper_tolower(int c) { - return tolower(c); -} - -int wrapper_gethostname(uint8_t* mem, uint32_t name_addr, uint32_t len) { - char buf[256] = { 0 }; - if (len > 256) { - len = 256; - } - int ret = gethostname(buf, len); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } else { - for (uint32_t i = 0; i < len; i++) { - MEM_S8(name_addr + i) = buf[i]; - } - } - return ret; -} - -int wrapper_isatty(uint8_t* mem, int fd) { - int ret = isatty(fd); - if (ret == 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -uint32_t wrapper_strftime(uint8_t* mem, uint32_t ptr_addr, uint32_t maxsize, uint32_t format_addr, - uint32_t timeptr_addr) { - MEM_S8(ptr_addr) = 0; - return 0; -} - -int wrapper_times(uint8_t* mem, uint32_t buffer_addr) { - struct tms_irix { - int tms_utime; - int tms_stime; - int tms_cutime; - int tms_cstime; - } r; - struct tms t; - clock_t ret = times(&t); - if (ret == (clock_t)-1) { - MEM_U32(ERRNO_ADDR) = errno; - } else { - r.tms_utime = t.tms_utime; - r.tms_stime = t.tms_stime; - r.tms_cutime = t.tms_cutime; - r.tms_cstime = t.tms_cstime; - MEM_U32(buffer_addr + 0x0) = t.tms_utime; - MEM_U32(buffer_addr + 0x4) = t.tms_stime; - MEM_U32(buffer_addr + 0x8) = t.tms_cutime; - MEM_U32(buffer_addr + 0xC) = t.tms_cstime; - } - return (int)ret; -} - -int wrapper_clock(void) { - return (int)clock(); -} - -uint32_t wrapper_ctime(uint8_t* mem, uint32_t timep_addr) { - time_t t = MEM_S32(timep_addr); - char* res = ctime(&t); - size_t len = strlen(res) + 1; - uint32_t ret_addr = wrapper_malloc(mem, len); - uint32_t pos = ret_addr; - while (len--) { - MEM_S8(pos) = *res; - ++pos; - ++res; - } - return ret_addr; -} - -uint32_t wrapper_localtime(uint8_t* mem, uint32_t timep_addr) { - time_t t = MEM_S32(timep_addr); - struct irix_tm { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; - }; - uint32_t ret = wrapper_malloc(mem, sizeof(struct irix_tm)); - struct irix_tm* r = (struct irix_tm*)&MEM_U32(ret); - struct tm* l = localtime(&t); - r->tm_sec = l->tm_sec; - r->tm_min = l->tm_min; - r->tm_hour = l->tm_hour; - r->tm_mday = l->tm_mday; - r->tm_mon = l->tm_mon; - r->tm_year = l->tm_year; - r->tm_wday = l->tm_wday; - r->tm_yday = l->tm_yday; - r->tm_isdst = l->tm_isdst; - return ret; -} - -int wrapper_setvbuf(uint8_t* mem, uint32_t fp_addr, uint32_t buf_addr, int mode, uint32_t size) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - wrapper_fflush(mem, fp_addr); - if ((f->_flag & IOMYBUF) && f->_base_addr != 0) { - wrapper_free(mem, f->_base_addr); - } - size &= ~0xf; - f->_flag &= ~IOMYBUF; - - if (buf_addr == 0) { - assert(size > 0); - buf_addr = wrapper_malloc(mem, size); - f->_flag |= IOMYBUF; - } - - f->_base_addr = buf_addr; - f->_ptr_addr = buf_addr; - f->_cnt = 0; - bufendtab[(fp_addr - IOB_ADDR) / sizeof(struct FILE_irix)] = size; - return 0; -} - -int wrapper___semgetc(uint8_t* mem, uint32_t fp_addr) { - assert(0); -} - -int wrapper___semputc(uint8_t* mem, int c, uint32_t fp_addr) { - assert(0); -} - -int wrapper_fgetc(uint8_t* mem, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - if (--f->_cnt < 0) { - return wrapper___filbuf(mem, fp_addr); - } else { - int ret = MEM_U8(f->_ptr_addr); - ++f->_ptr_addr; - return ret; - } -} - -int wrapper_fgets(uint8_t* mem, uint32_t str_addr, int count, uint32_t fp_addr) { - bool modified = false; - uint32_t saved = str_addr; - for (count--; count > 0; count--) { - int ch = wrapper_fgetc(mem, fp_addr); - if (ch == -1) { - MEM_S8(str_addr) = '\0'; - return modified ? saved : 0; - } - modified = true; - MEM_S8(str_addr) = (char)ch; - ++str_addr; - if (ch == '\n') { - break; - } - } - MEM_S8(str_addr) = '\0'; - return saved; -} - -static void file_assign_buffer(uint8_t* mem, struct FILE_irix* f) { - f->_base_addr = wrapper_malloc(mem, STDIO_BUFSIZE); - f->_ptr_addr = f->_base_addr; - f->_flag |= IOMYBUF; - f->_cnt = 0; - bufendtab[f - (struct FILE_irix*)&MEM_U32(IOB_ADDR)] = STDIO_BUFSIZE; -} - -int wrapper___filbuf(uint8_t* mem, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - if (!(f->_flag & IOREAD)) { - if (f->_flag & IORW) { - f->_flag |= IOREAD; - } else { - MEM_U32(ERRNO_ADDR) = 9; // EBADF - return -1; - } - } - if (f->_base_addr == 0) { - file_assign_buffer(mem, f); - } - uint32_t size = bufendtab[(fp_addr - IOB_ADDR) / sizeof(struct FILE_irix)]; - int nread = wrapper_read(mem, f->_file, f->_base_addr, size); - int ret = -1; - if (nread > 0) { - f->_ptr_addr = f->_base_addr; - f->_cnt = nread; - ret = MEM_U8(f->_ptr_addr); - ++f->_ptr_addr; - --f->_cnt; - } else if (nread == 0) { - f->_flag |= IOEOF; - } else { - f->_flag |= IOERR; - } - return ret; -} - -int wrapper___flsbuf(uint8_t* mem, int ch, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - if (wrapper_fflush(mem, fp_addr) != 0) { - return -1; - } - if (f->_base_addr == 0) { - file_assign_buffer(mem, f); - f->_cnt = bufendtab[f - (struct FILE_irix*)&MEM_U32(IOB_ADDR)]; - } - MEM_U8(f->_ptr_addr) = ch; - ++f->_ptr_addr; - --f->_cnt; - if (f->_flag & IONBF) { - if (wrapper_fflush(mem, fp_addr) != 0) { - return -1; - } - f->_cnt = 0; - } - return ch; -} - -int wrapper_ungetc(uint8_t* mem, int ch, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - if (ch == -1 || f->_ptr_addr == f->_base_addr) { - return -1; - } - --f->_ptr_addr; - MEM_U8(f->_ptr_addr) = (uint8_t)ch; - ++f->_cnt; - f->_flag &= ~IOEOF; - return ch; -} - -uint32_t wrapper_gets(uint8_t* mem, uint32_t str_addr) { - uint32_t p, str0 = str_addr; - int n; - - for (;;) { - if (STDIN->_cnt <= 0) { - if (wrapper___filbuf(mem, STDIN_ADDR) == -1) { - if (str0 == str_addr) { - return 0; - } - break; - } - --STDIN->_ptr_addr; - ++STDIN->_cnt; - } - n = STDIN->_cnt; - if ((p = wrapper_memccpy(mem, str_addr, STDIN->_ptr_addr, '\n', n)) != 0) { - n = p - str_addr; - } - str_addr += n; - STDIN->_cnt -= n; - STDIN->_ptr_addr += n; - // bufsync - if (p != 0) { - // found '\n' in buffer - --str_addr; - break; - } - } - MEM_S8(str_addr) = '\0'; - return str0; -} - -uint32_t wrapper_fread(uint8_t* mem, uint32_t data_addr, uint32_t size, uint32_t count, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - int nleft = count * size; - int n; - for (;;) { - if (f->_cnt <= 0) { - if (wrapper___filbuf(mem, fp_addr) == -1) { - return count - (nleft + size - 1) / size; - } - --f->_ptr_addr; - ++f->_cnt; - } - n = MIN(nleft, f->_cnt); - data_addr = wrapper_memcpy(mem, data_addr, f->_ptr_addr, n) + n; - f->_cnt -= n; - f->_ptr_addr += n; - if ((nleft -= n) <= 0) { - return count; - } - } -} - -uint32_t wrapper_fwrite(uint8_t* mem, uint32_t data_addr, uint32_t size, uint32_t count, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - if (size > 0 && count > 0 && f->_base_addr == 0) { - file_assign_buffer(mem, f); - f->_cnt = bufendtab[f - (struct FILE_irix*)&MEM_U32(IOB_ADDR)]; - f->_flag |= IOWRT; - } - uint32_t num_written = 0; - while (count--) { - uint32_t s = size; - while (s > 0) { - uint32_t to_write = f->_cnt; - if (s < to_write) { - to_write = s; - } - if (f->_cnt == 0) { - if (wrapper_fflush(mem, fp_addr) != 0) { - return num_written; - } - } - wrapper_memcpy(mem, f->_ptr_addr, data_addr, to_write); - data_addr += to_write; - f->_ptr_addr += to_write; - f->_cnt -= to_write; - s -= to_write; - } - num_written++; - } - if (f->_flag & IONBF) { - wrapper_fflush(mem, fp_addr); // TODO check error return value - } - return num_written; -} - -int wrapper_fputs(uint8_t* mem, uint32_t str_addr, uint32_t fp_addr) { - assert(str_addr != 0); - - uint32_t len = wrapper_strlen(mem, str_addr); - uint32_t ret = wrapper_fwrite(mem, str_addr, 1, len, fp_addr); - return ret == 0 && len != 0 ? -1 : 0; -} - -int wrapper_puts(uint8_t* mem, uint32_t str_addr) { - int ret = wrapper_fputs(mem, str_addr, STDOUT_ADDR); - if (ret != 0) { - return ret; - } - struct FILE_irix* f = STDOUT; - if (--f->_cnt < 0) { - if (wrapper___flsbuf(mem, '\n', STDOUT_ADDR) != '\n') { - return -1; - } - } else { - MEM_S8(f->_ptr_addr) = '\n'; - ++f->_ptr_addr; - } - return 0; -} - -uint32_t wrapper_getcwd(uint8_t* mem, uint32_t buf_addr, uint32_t size) { - char buf[size]; - if (getcwd(buf, size) == NULL) { - MEM_U32(ERRNO_ADDR) = errno; - return 0; - } else { - if (buf_addr == 0) { - buf_addr = wrapper_malloc(mem, size); - } - strcpy1(mem, buf_addr, buf); - return buf_addr; - } -} - -int wrapper_time(uint8_t* mem, uint32_t tloc_addr) { - time_t ret = time(NULL); - if (ret == (time_t)-1) { - MEM_U32(ERRNO_ADDR) = errno; - } else if (tloc_addr != 0) { - MEM_S32(tloc_addr) = ret; - } - return ret; -} - -void wrapper_bzero(uint8_t* mem, uint32_t str_addr, uint32_t n) { - while (n--) { - MEM_U8(str_addr) = 0; - ++str_addr; - } -} - -int wrapper_fp_class_d(double d) { - union { - uint32_t w[2]; - double d; - } bits; - bits.d = d; - uint32_t a2 = bits.w[1]; - uint32_t a1 = a2 >> 20; - uint32_t a0 = a1; - a2 &= 0xfffff; - uint32_t a3 = bits.w[0]; - a1 &= 0x7ff; - a0 &= 0x800; - if (a1 == 0x7ff) { - if (a2 == 0 && a3 == 0) { - return a0 == 0 ? 2 : 3; - } - a0 = a2 & 0x80000; - return a0 == 0 ? 1 : 0; - } - if (a1 == 0) { - if (a2 == 0 && a3 == 0) { - return a0 == 0 ? 8 : 9; - } - return a0 == 0 ? 6 : 7; - } - return a0 == 0 ? 4 : 5; -} - -double wrapper_ldexp(double d, int i) { - return ldexp(d, i); -} - -uint64_t wrapper___ll_mul(uint64_t a0, uint64_t a1) { - return a0 * a1; -} - -int64_t wrapper___ll_div(int64_t a0, int64_t a1) { - return a0 / a1; -} - -int64_t wrapper___ll_rem(uint64_t a0, int64_t a1) { - return a0 % a1; -} - -uint64_t wrapper___ll_lshift(uint64_t a0, uint64_t shift) { - return a0 << (shift & 0x3F); -} - -int64_t wrapper___ll_rshift(int64_t a0, uint64_t shift) { - return a0 >> (shift & 0x3F); -} - -uint64_t wrapper___ull_div(uint64_t a0, uint64_t a1) { - return a0 / a1; -} - -uint64_t wrapper___ull_rem(uint64_t a0, uint64_t a1) { - return a0 % a1; -} - -uint64_t wrapper___ull_rshift(uint64_t a0, uint64_t shift) { - return a0 >> (shift & 0x3f); -} - -uint64_t wrapper___d_to_ull(double d) { - return d; -} - -int64_t wrapper___d_to_ll(double d) { - return d; -} - -uint64_t wrapper___f_to_ull(float f) { - return f; -} - -int64_t wrapper___f_to_ll(float f) { - return f; -} - -float wrapper___ull_to_f(uint64_t v) { - return v; -} - -float wrapper___ll_to_f(int64_t v) { - return v; -} - -double wrapper___ull_to_d(uint64_t v) { - return v; -} - -double wrapper___ll_to_d(int64_t v) { - return v; -} - -void wrapper_abort(uint8_t* mem) { - abort(); -} - -void wrapper_exit(uint8_t* mem, int status) { - final_cleanup(mem); - exit(status); -} - -void wrapper__exit(uint8_t* mem, int status) { - assert(0 && "_exit not implemented"); // exit() is already overridden -} - -void wrapper__cleanup(uint8_t* mem) { -} - -uint32_t wrapper__rld_new_interface(uint8_t* mem, uint32_t operation, uint32_t sp) { - assert(0 && "_rld_new_interface not implemented"); - return 0; -} - -void wrapper__exithandle(uint8_t* mem) { - assert(0 && "_exithandle not implemented"); -} - -int wrapper__prctl(uint8_t* mem, int operation, uint32_t sp) { - assert(0 && "_prctl not implemented"); - return 0; -} - -double wrapper__atod(uint8_t* mem, uint32_t buffer_addr, int ndigits, int dexp) { - // ftp://atoum.hst.nerim.net/irix/src/irix-6.5.5-src/6.5.5/m/irix/lib/libc/src/math/atod.c - assert(0 && "_atod not implemented"); - return 0.0; -} - -int wrapper_pathconf(uint8_t* mem, uint32_t path_addr, int name) { - STRING(path) - if (name == 5) { - errno = 0; - int ret = pathconf(path, _PC_PATH_MAX); - if (errno != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; - } - assert(0 && "pathconf not implemented for the specific 'name'"); - return 0; -} - -uint32_t wrapper_getenv(uint8_t* mem, uint32_t name_addr) { - STRING(name); - const char* value = getenv(name); - if (value == NULL) { - return 0; - } - size_t value_size = strlen(value) + 1; - uint32_t buf_addr = wrapper_malloc(mem, value_size); - strcpy1(mem, buf_addr, value); - return buf_addr; -} - -uint32_t wrapper_gettxt(uint8_t* mem, uint32_t msgid_addr, uint32_t default_str_addr) { - // Return default for now - return default_str_addr; -} - -uint32_t wrapper_setlocale(uint8_t* mem, int category, uint32_t locale_addr) { - assert(locale_addr != 0); - STRING(locale) - assert(category == 6); // LC_ALL - char* ret = setlocale(LC_ALL, locale); - // Let's hope the caller doesn't use the return value - return 0; -} - -uint32_t wrapper_mmap(uint8_t* mem, uint32_t addr, uint32_t length, int prot, int flags, int fd, int offset) { - if (addr == 0 && prot == (prot & 3) && flags == 2) { - // Read/write, map private. Just make a copy. - uint8_t* ptr = mmap(0, length, PROT_READ, MAP_PRIVATE, fd, offset); - if (ptr == MAP_FAILED) { - MEM_U32(ERRNO_ADDR) = errno; - return -1; - } - uint32_t out = wrapper_malloc(mem, length); - for (uint32_t i = 0; i < length; i++) { - MEM_S8(out + i) = ptr[i]; - } - munmap(ptr, length); - return out; - } - assert(0 && "mmap not implemented"); - return 0; -} - -int wrapper_munmap(uint8_t* mem, uint32_t addr, uint32_t length) { - return 0; -} - -int wrapper_mprotect(uint8_t* mem, uint32_t addr, uint32_t length, int prot) { - assert(0 && "mprotect not implemented"); - return 0; -} - -int wrapper_sysconf(uint8_t* mem, int name) { - assert(0 && "sysconf not implemented"); - return 0; -} - -int wrapper_getpagesize(uint8_t* mem) { - return 4096; -} - -int wrapper_strerror(uint8_t* mem, int errnum) { - errno = errnum; - perror("strerror"); - assert(0 && "strerror not implemented"); - return 0; -} - -int wrapper_ioctl(uint8_t* mem, int fd, uint32_t request, uint32_t sp) { - assert(0 && "ioctl not implemented"); - return 0; -} - -int wrapper_fcntl(uint8_t* mem, int fd, int cmd, uint32_t sp) { - assert(0 && "fcntl not implemented"); - return 0; -} - -static void signal_handler(int signum) { - uint32_t level = signal_context.recursion_level++; - uint8_t* mem = signal_context.handlers[signum].mem; - uint32_t fp_dest = signal_context.handlers[signum].fp_dest; - uint32_t sp = SIGNAL_HANDLER_STACK_START - 16 - level * 0x1000; - signal_context.handlers[signum].trampoline(mem, sp, signum, 0, 0, 0, fp_dest); - signal_context.recursion_level--; -} - -uint32_t wrapper_signal(uint8_t* mem, int signum, - uint64_t (*trampoline)(uint8_t* mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, - uint32_t a3, uint32_t fp_dest), - uint32_t handler_addr, uint32_t sp) { - return 0; -} - -uint32_t wrapper_sigset(uint8_t* mem, int signum, - uint64_t (*trampoline)(uint8_t* mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, - uint32_t a3, uint32_t fp_dest), - uint32_t disp_addr, uint32_t sp) { - void (*handler)(int) = signal_handler; - - if ((int)disp_addr >= -1 && (int)disp_addr <= 1) { - // SIG_DFL etc. - handler = (void (*)(int))(intptr_t)(int)disp_addr; - } - - switch (signum) { - case 2: - signum = SIGINT; - break; - case 13: - signum = SIGPIPE; - break; - case 15: - signum = SIGTERM; - break; - default: - assert(0 && "sigset with this signum not implemented"); - break; - } - - signal_context.handlers[signum].trampoline = trampoline; - signal_context.handlers[signum].mem = mem; - signal_context.handlers[signum].fp_dest = disp_addr; - - return (uint32_t)(uintptr_t)sigset(signum, handler); // for now only support SIG_DFL etc. as return value -} - -int wrapper_get_fpc_csr(uint8_t* mem) { - return 0; -} - -int wrapper_set_fpc_csr(uint8_t* mem, int csr) { - return 0; -} - -int wrapper_setjmp(uint8_t* mem, uint32_t addr) { - return 0; -} - -void wrapper_longjmp(uint8_t* mem, uint32_t addr, int status) { - assert(0 && "longjmp not implemented"); -} - -uint32_t wrapper_tempnam(uint8_t *mem, uint32_t dir_addr, uint32_t pfx_addr) { - STRING(dir) - STRING(pfx) - char *ret = tempnam(dir, pfx); - char *ret_saved = ret; - if (ret == NULL) { - MEM_U32(ERRNO_ADDR) = errno; - return 0; - } - size_t len = strlen(ret) + 1; - uint32_t ret_addr = wrapper_malloc(mem, len); - uint32_t pos = ret_addr; - while (len--) { - MEM_S8(pos) = *ret; - ++pos; - ++ret; - } - free(ret_saved); - return ret_addr; -} - -uint32_t wrapper_tmpnam(uint8_t *mem, uint32_t str_addr) { - char buf[1024]; - assert(str_addr != 0 && "s NULL not implemented for tmpnam"); - char *ret = tmpnam(buf); - if (ret == NULL) { - return 0; - } else { - strcpy1(mem, str_addr, ret); - return str_addr; - } -} - -uint32_t wrapper_mktemp(uint8_t *mem, uint32_t template_addr) { - STRING(template) - mktemp(template); - strcpy1(mem, template_addr, template); - return template_addr; -} - -int wrapper_mkstemp(uint8_t* mem, uint32_t name_addr) { - STRING(name) - int fd = mkstemp(name); - if (fd < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } else { - strcpy1(mem, name_addr, name); - } - return fd; -} - -uint32_t wrapper_tmpfile(uint8_t* mem) { - // create and fopen a temporary file that is removed when the program exits - const char* tmpdir = getenv("TMPDIR"); - if (tmpdir == NULL) { - tmpdir = "/tmp"; - } - - char name[PATH_MAX + 1] = { 0 }; - int n = snprintf(name, sizeof(name), "%s/copt_temp_XXXXXX", tmpdir); - if (n < 0 || n >= sizeof(name)) { - // This isn't the best errno code, but it is one that can be returned by tmpfile - MEM_U32(ERRNO_ADDR) = EACCES; - return 0; - } - - int fd = mkstemp(name); - if (fd < 0) { - MEM_U32(ERRNO_ADDR) = errno; - return 0; - } - - // the file will be removed from disk when it's closed later - unlink(name); - - // fdopen: - uint32_t ret = init_file(mem, fd, -1, NULL, "w+"); - if (ret == 0) { - close(fd); - } - return ret; -} - -int wrapper_wait(uint8_t* mem, uint32_t wstatus_addr) { - int wstatus; - pid_t ret = wait(&wstatus); - MEM_S32(wstatus_addr) = wstatus; - return ret; -} - -int wrapper_kill(uint8_t* mem, int pid, int sig) { - int ret = kill(pid, sig); - if (ret != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_execlp(uint8_t* mem, uint32_t file_addr, uint32_t sp) { - uint32_t argv_addr = sp + 4; - return wrapper_execvp(mem, file_addr, argv_addr); -} - -int wrapper_execv(uint8_t* mem, uint32_t pathname_addr, uint32_t argv_addr) { - STRING(pathname) - uint32_t argc = 0; - while (MEM_U32(argv_addr + argc * 4) != 0) { - ++argc; - } - char* argv[argc + 1]; - for (uint32_t i = 0; i < argc; i++) { - uint32_t str_addr = MEM_U32(argv_addr + i * 4); - uint32_t len = wrapper_strlen(mem, str_addr) + 1; - argv[i] = (char*)malloc(len); - char* pos = argv[i]; - while (len--) { - *pos++ = MEM_S8(str_addr); - ++str_addr; - } - } - argv[argc] = NULL; - execv(pathname, argv); - MEM_U32(ERRNO_ADDR) = errno; - for (uint32_t i = 0; i < argc; i++) { - free(argv[i]); - } - return -1; -} - -int wrapper_execvp(uint8_t* mem, uint32_t file_addr, uint32_t argv_addr) { - STRING(file) - uint32_t argc = 0; - while (MEM_U32(argv_addr + argc * 4) != 0) { - ++argc; - } - char* argv[argc + 1]; - for (uint32_t i = 0; i < argc; i++) { - uint32_t str_addr = MEM_U32(argv_addr + i * 4); - uint32_t len = wrapper_strlen(mem, str_addr) + 1; - argv[i] = (char*)malloc(len); - char* pos = argv[i]; - while (len--) { - *pos++ = MEM_S8(str_addr); - ++str_addr; - } - } - argv[argc] = NULL; - - char rfile[PATH_MAX + 1]; - redirect_path(rfile, file, "/usr/lib", usr_lib_redirect); - - execvp(rfile, argv); - - MEM_U32(ERRNO_ADDR) = errno; - for (uint32_t i = 0; i < argc; i++) { - free(argv[i]); - } - return -1; -} - -int wrapper_fork(uint8_t* mem) { - int ret = fork(); - if (ret == -1) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_system(uint8_t* mem, uint32_t command_addr) { - STRING(command) - return system(command); // no errno -} - -static int name_compare(uint8_t* mem, uint32_t a_addr, uint32_t b_addr) { - return wrapper_strcmp(mem, MEM_U32(a_addr), MEM_U32(b_addr)); -} - -static uint32_t tsearch_tfind(uint8_t* mem, uint32_t key_addr, uint32_t rootp_addr, uint32_t compar_addr, bool insert) { - if (rootp_addr == 0) { - return 0; - } - while (MEM_U32(rootp_addr) != 0) { - uint32_t node_addr = MEM_U32(rootp_addr); - int r = name_compare(mem, key_addr, MEM_U32(node_addr)); - if (r == 0) { - return node_addr; - } - rootp_addr = r < 0 ? node_addr + 4 : node_addr + 8; - } - if (insert) { - uint32_t node_addr = wrapper_malloc(mem, 12); - if (node_addr != 0) { - MEM_U32(rootp_addr) = node_addr; - MEM_U32(node_addr) = key_addr; - MEM_U32(node_addr + 4) = 0; - MEM_U32(node_addr + 8) = 0; - return node_addr; - } - } - return 0; -} - -uint32_t wrapper_tsearch(uint8_t* mem, uint32_t key_addr, uint32_t rootp_addr, uint32_t compar_addr) { - return tsearch_tfind(mem, key_addr, rootp_addr, compar_addr, true); -} - -uint32_t wrapper_tfind(uint8_t* mem, uint32_t key_addr, uint32_t rootp_addr, uint32_t compar_addr) { - return tsearch_tfind(mem, key_addr, rootp_addr, compar_addr, false); -} - -// qsort implementation from SGI libc, originally derived from -// https://people.ece.ubc.ca/~eddieh/glu_dox/d7/da4/qsort_8c_source.html (public domain) - -#define CMP(x, y) (int32_t)(trampoline(mem, sp, (x), (y), 0, 0, compare_addr) >> 32) - -static void qst(uint8_t* mem, uint32_t start, uint32_t end, fptr_trampoline trampoline, uint32_t compare_addr, - uint32_t sp, uint32_t size, uint32_t minSortSize, uint32_t medianOfThreeThreshold); - -uint32_t wrapper_qsort(uint8_t* mem, uint32_t base_addr, uint32_t count, uint32_t size, fptr_trampoline trampoline, - uint32_t compare_addr, uint32_t sp) { - uint32_t end; - uint32_t it; - uint32_t prevIt; - uint32_t byteIt; - uint32_t hi; - uint32_t insPos; - uint32_t cur; - uint32_t smallest; - uint8_t temp; - - if (count < 2) { - return 0; - } - - end = base_addr + (count * size); - - if (count >= 4) { - // run a rough quicksort - qst(mem, base_addr, end, trampoline, compare_addr, sp, size, size * 4, size * 6); - // the smallest element will be one of the first 4 - hi = base_addr + size * 4; - } else { - hi = end; - } - - // Find the smallest element and swap it to the front - smallest = base_addr; - for (it = base_addr + size; it < hi; it += size) { - if (CMP(smallest, it) > 0) { - smallest = it; - } - } - - if (smallest != base_addr) { - for (it = base_addr; it < base_addr + size; smallest++, it++) { - temp = MEM_U8(smallest); - MEM_U8(smallest) = MEM_U8(it); - MEM_U8(it) = temp; - } - } - - // Do insertion sort on the rest of the elements - for (cur = base_addr + size; cur < end; cur += size) { - - // Find where cur should go - insPos = cur - size; - while (CMP(insPos, cur) > 0) { - if (base_addr == insPos) { - // This isn't logically possible, because we've put the smallest element first. - // But it can happen if the comparator function is faulty, and it's best not to - // write out of bounds in that situation. - break; - } - insPos -= size; - } - insPos += size; - - if (insPos == cur) { - continue; - } - - for (byteIt = cur + size; --byteIt >= cur;) { - temp = MEM_U8(byteIt); - prevIt = byteIt; - for (it = byteIt - size; it >= insPos; it -= size) { - MEM_U8(prevIt) = MEM_U8(it); - prevIt = it; - } - MEM_U8(prevIt) = temp; - } - } - - return 0; -} - -static void qst(uint8_t* mem, uint32_t start, uint32_t end, fptr_trampoline trampoline, uint32_t compare_addr, - uint32_t sp, uint32_t size, uint32_t minSortSize, uint32_t medianOfThreeThreshold) { - uint32_t sizeAfterPivot; - uint32_t sizeBeforePivot; - uint32_t totalSize; - int32_t i; - uint32_t afterPivot; - uint32_t last; - uint32_t newPartitionFirst; - uint32_t median; - uint32_t partitionFirst; - uint32_t partitionLast; - uint32_t pivot; - uint32_t swapWith; - uint8_t temp; - - totalSize = end - start; - do { - last = end - size; - pivot = partitionFirst = (((totalSize / size) >> 1) * size) + start; - if (totalSize >= medianOfThreeThreshold) { - // compute median of three - median = CMP(start, pivot) > 0 ? start : pivot; - if (CMP(median, last) > 0) { - median = median == start ? pivot : start; - median = CMP(median, last) < 0 ? last : median; - } - - // swap the median so it ends up in the middle - if (median != pivot) { - // Fake-match: use partitionFirst here instead of e.g. swapWith. - i = size; - do { - temp = MEM_U8(partitionFirst); - MEM_U8(partitionFirst) = MEM_U8(median); - MEM_U8(median) = temp; - partitionFirst++; - median++; - i--; - } while (i != 0); - } - } - - // Partition the elements start, ..., pivot, ..., last, such that values smaller than the - // pivot are on the left, and values greater than the pivot are on the right (equal ones can - // go wherever). The pivot may end up getting swapped into another position in the process. - - partitionFirst = start; - partitionLast = last; - - // Loop invariant: Elements partitionFirst, ..., partitionLast remain to be partitioned, - // and pivot is in that range. - for (;;) { - while (partitionFirst < pivot && CMP(partitionFirst, pivot) < 0) { - // Skip over smaller values on the left. - partitionFirst += size; - } - - while (pivot < partitionLast) { - if (CMP(pivot, partitionLast) < 0) { - // Skip over greater values on the right. - partitionLast -= size; - } else { - // We have found a value we cannot skip over. Put it at the front. - // If the pivot was at the front, it gets swapped to the last position, - // otherwise, the value at the front is something we know isn't smaller - // than the pivot, so we can skip partitioning it. - newPartitionFirst = partitionFirst + size; - if (partitionFirst == pivot) { - swapWith = partitionLast; - pivot = partitionLast; - } else { - swapWith = partitionLast; - partitionLast -= size; - } - goto swapFront; - } - } - - // We have hit up against the pivot at the end. Swap it to the front to we can - // skip over it. The front element is known to not be smaller than the pivot, - // except if the pivot is at the front also, i.e. if the range has been reduced - // down to size 1 -- in that case it's time to break out of the loop. - partitionLast -= size; - if (partitionFirst == pivot) { - break; - } - swapWith = pivot; - pivot = partitionFirst; - newPartitionFirst = partitionFirst; - - swapFront: - i = size; - do { - temp = MEM_U8(partitionFirst); - MEM_U8(partitionFirst) = MEM_U8(swapWith); - MEM_U8(swapWith) = temp; - partitionFirst++; - swapWith++; - i--; - } while (i != 0); - partitionFirst = newPartitionFirst; - } - - afterPivot = pivot + size; - sizeBeforePivot = pivot - start; - sizeAfterPivot = end - afterPivot; - totalSize = sizeBeforePivot; - if (sizeAfterPivot >= sizeBeforePivot) { - if (sizeBeforePivot >= minSortSize) { - qst(mem, start, pivot, trampoline, compare_addr, sp, size, minSortSize, medianOfThreeThreshold); - } - start = afterPivot; - totalSize = sizeAfterPivot; - } else { - if (sizeAfterPivot >= minSortSize) { - qst(mem, afterPivot, end, trampoline, compare_addr, sp, size, minSortSize, medianOfThreeThreshold); - } - end = pivot; - } - } while (totalSize >= minSortSize); -} - -#undef CMP - -uint32_t wrapper_regcmp(uint8_t* mem, uint32_t string1_addr, uint32_t sp) { - STRING(string1); - fprintf(stderr, "regex string: %s\n", string1); - assert(0 && "regcmp not implemented"); - return 0; -} - -uint32_t wrapper_regex(uint8_t* mem, uint32_t re_addr, uint32_t subject_addr, uint32_t sp) { - STRING(subject); - assert(0 && "regex not implemented"); - return 0; -} - -void wrapper___assert(uint8_t* mem, uint32_t assertion_addr, uint32_t file_addr, int line) { - STRING(assertion) - STRING(file) - __assert(assertion, file, line); -} - -union host_doubleword { - uint64_t ww; - double d; -}; - -union FloatReg FloatReg_from_double(double d) { - union host_doubleword val; - union FloatReg floatreg; - - val.d = d; - - floatreg.w[0] = val.ww & 0xFFFFFFFF; - floatreg.w[1] = (val.ww >> 32) & 0xFFFFFFFF; - - return floatreg; -} - -double double_from_FloatReg(union FloatReg floatreg) { - union host_doubleword val; - - val.ww = floatreg.w[1]; - val.ww <<= 32; - val.ww |= floatreg.w[0]; - return val.d; -} - -double double_from_memory(uint8_t* mem, uint32_t address) { - union host_doubleword val; - - val.ww = MEM_U32(address); - val.ww <<= 32; - val.ww |= MEM_U32(address + 4); - return val.d; -} diff --git a/tools/ido-static-recomp/libc_impl.h b/tools/ido-static-recomp/libc_impl.h deleted file mode 100644 index b9f50b37..00000000 --- a/tools/ido-static-recomp/libc_impl.h +++ /dev/null @@ -1,182 +0,0 @@ -#ifndef LIBC_IMPL_H -#define LIBC_IMPL_H - -#include - -union FloatReg { - float f[2]; - uint32_t w[2]; - //double d; -}; - -void mmap_initial_data_range(uint8_t *mem, uint32_t start, uint32_t end); -void setup_libc_data(uint8_t *mem); - -uint32_t wrapper_sbrk(uint8_t *mem, int increment); -uint32_t wrapper_malloc(uint8_t *mem, uint32_t size); -uint32_t wrapper_calloc(uint8_t *mem, uint32_t num, uint32_t size); -uint32_t wrapper_realloc(uint8_t *mem, uint32_t data_addr, uint32_t size); -int wrapper_fscanf(uint8_t *mem, uint32_t fp_addr, uint32_t format_addr, uint32_t sp); -int wrapper_printf(uint8_t *mem, uint32_t format_addr, uint32_t sp); -int wrapper_sprintf(uint8_t *mem, uint32_t str_addr, uint32_t format_addr, uint32_t sp); -int wrapper_fprintf(uint8_t *mem, uint32_t fp_addr, uint32_t format_addr, uint32_t sp); -int wrapper__doprnt(uint8_t *mem, uint32_t format_addr, uint32_t params_addr, uint32_t fp_addr); -void wrapper_free(uint8_t *mem, uint32_t data_addr); -uint32_t wrapper_strlen(uint8_t *mem, uint32_t str_addr); -int wrapper_open(uint8_t *mem, uint32_t pathname_addr, int flags, int mode); -int wrapper_creat(uint8_t *mem, uint32_t pathname_addr, int mode); -int wrapper_access(uint8_t *mem, uint32_t pathname_addr, int mode); -int wrapper_rename(uint8_t *mem, uint32_t oldpath_addr, uint32_t newpath_addr); -int wrapper_utime(uint8_t *mem, uint32_t filename_addr, uint32_t times_addr); -int wrapper_flock(uint8_t *mem, int fd, int operation); -int wrapper_chmod(uint8_t *mem, uint32_t path_addr, uint32_t mode); -int wrapper_umask(int mode); -uint32_t wrapper_ecvt(uint8_t *mem, double number, int ndigits, uint32_t decpt_addr, uint32_t sign_addr); -uint32_t wrapper_fcvt(uint8_t *mem, double number, int ndigits, uint32_t decpt_addr, uint32_t sign_addr); -double wrapper_sqrt(double v); -float wrapper_sqrtf(float v); -int wrapper_atoi(uint8_t *mem, uint32_t nptr_addr); -int wrapper_atol(uint8_t *mem, uint32_t nptr_addr); -double wrapper_atof(uint8_t *mem, uint32_t nptr_addr); -int wrapper_strtol(uint8_t *mem, uint32_t nptr_addr, uint32_t endptr_addr, int base); -uint32_t wrapper_strtoul(uint8_t *mem, uint32_t nptr_addr, uint32_t endptr_addr, int base); -int64_t wrapper_strtoll(uint8_t *mem, uint32_t nptr_addr, uint32_t endptr_addr, int base); -uint64_t wrapper_strtoull(uint8_t *mem, uint32_t nptr_addr, uint32_t endptr_addr, int base); -double wrapper_strtod(uint8_t *mem, uint32_t nptr_addr, uint32_t endptr_addr); -uint32_t wrapper_strchr(uint8_t *mem, uint32_t str_addr, int c); -uint32_t wrapper_strrchr(uint8_t *mem, uint32_t str_addr, int c); -uint32_t wrapper_strcspn(uint8_t *mem, uint32_t str_addr, uint32_t invalid_addr); -uint32_t wrapper_strpbrk(uint8_t *mem, uint32_t str_addr, uint32_t accept_addr); -int wrapper_fstat(uint8_t *mem, int fildes, uint32_t buf_addr); -int wrapper_stat(uint8_t *mem, uint32_t pathname_addr, uint32_t buf_addr); -int wrapper_ftruncate(uint8_t *mem, int fd, int length); -int wrapper_truncate(uint8_t *mem, uint32_t pathname_addr, int length); -void wrapper_bcopy(uint8_t *mem, uint32_t src_addr, uint32_t dst_addr, uint32_t len); -uint32_t wrapper_memcpy(uint8_t *mem, uint32_t dst_addr, uint32_t src_addr, uint32_t len); -uint32_t wrapper_memccpy(uint8_t *mem, uint32_t dst_addr, uint32_t src_addr, int c, uint32_t len); -int wrapper_read(uint8_t *mem, int fd, uint32_t buf_addr, uint32_t nbytes); -int wrapper_write(uint8_t *mem, int fd, uint32_t buf_addr, uint32_t nbytes); -uint32_t wrapper_fopen(uint8_t *mem, uint32_t path_addr, uint32_t mode_addr); -uint32_t wrapper_freopen(uint8_t *mem, uint32_t path_addr, uint32_t mode_addr, uint32_t fp_addr); -int wrapper_fclose(uint8_t *mem, uint32_t fp_addr); -int wrapper_fflush(uint8_t *mem, uint32_t fp_addr); -int wrapper_fchown(uint8_t *mem, int fd, int owner, int group); -int wrapper_ftell(uint8_t *mem, uint32_t fp_addr); -void wrapper_rewind(uint8_t *mem, uint32_t fp_addr); -int wrapper_fseek(uint8_t *mem, uint32_t fp_addr, int offset, int origin); -int wrapper_lseek(uint8_t *mem, int fd, int offset, int whence); -int wrapper_dup(uint8_t *mem, int fd); -int wrapper_dup2(uint8_t *mem, int oldfd, int newfd); -int wrapper_pipe(uint8_t *mem, uint32_t pipefd_addr); -void wrapper_perror(uint8_t *mem, uint32_t str_addr); -int wrapper_fdopen(uint8_t *mem, int fd, uint32_t mode_addr); -uint32_t wrapper_memset(uint8_t *mem, uint32_t dest_addr, int byte, uint32_t n); -int wrapper_bcmp(uint8_t *mem, uint32_t s1_addr, uint32_t s2_addr, uint32_t n); -int wrapper_memcmp(uint8_t *mem, uint32_t s1_addr, uint32_t s2_addr, uint32_t n); -int wrapper_getpid(void); -int wrapper_getpgrp(uint8_t *mem); -int wrapper_remove(uint8_t *mem, uint32_t path_addr); -int wrapper_unlink(uint8_t *mem, uint32_t path_addr); -int wrapper_close(uint8_t *mem, int fd); -int wrapper_strcmp(uint8_t *mem, uint32_t s1_addr, uint32_t s2_addr); -int wrapper_strncmp(uint8_t *mem, uint32_t s1_addr, uint32_t s2_addr, uint32_t n); -uint32_t wrapper_strcpy(uint8_t *mem, uint32_t dest_addr, uint32_t src_addr); -uint32_t wrapper_strncpy(uint8_t *mem, uint32_t dest_addr, uint32_t src_addr, uint32_t n); -uint32_t wrapper_strcat(uint8_t *mem, uint32_t dest_addr, uint32_t src_addr); -uint32_t wrapper_strncat(uint8_t *mem, uint32_t dest_addr, uint32_t src_addr, uint32_t n); -uint32_t wrapper_strtok(uint8_t *mem, uint32_t str_addr, uint32_t delimiters_addr); -uint32_t wrapper_strstr(uint8_t *mem, uint32_t str1_addr, uint32_t str2_addr); -uint32_t wrapper_strdup(uint8_t *mem, uint32_t str_addr); -int wrapper_toupper(int c); -int wrapper_tolower(int c); -int wrapper_gethostname(uint8_t *mem, uint32_t name_addr, uint32_t len); -int wrapper_isatty(uint8_t *mem, int fd); -int wrapper_times(uint8_t *mem, uint32_t buffer_addr); -uint32_t wrapper_strftime(uint8_t *mem, uint32_t ptr_addr, uint32_t maxsize, uint32_t format_addr, uint32_t timeptr_addr); -int wrapper_clock(void); -uint32_t wrapper_ctime(uint8_t *mem, uint32_t timep_addr); -uint32_t wrapper_localtime(uint8_t *mem, uint32_t timep_addr); -int wrapper_setvbuf(uint8_t *mem, uint32_t fp_addr, uint32_t buf_addr, int mode, uint32_t size); -int wrapper___semgetc(uint8_t *mem, uint32_t fp_addr); -int wrapper___semputc(uint8_t *mem, int c, uint32_t fp_addr); -int wrapper_fgetc(uint8_t *mem, uint32_t fp_addr); -int wrapper_fgets(uint8_t *mem, uint32_t str_addr, int count, uint32_t fp_addr); -int wrapper___filbuf(uint8_t *mem, uint32_t fp_addr); -int wrapper___flsbuf(uint8_t *mem, int ch, uint32_t fp_addr); -int wrapper_ungetc(uint8_t *mem, int ch, uint32_t fp_addr); -uint32_t wrapper_gets(uint8_t *mem, uint32_t str_addr); -uint32_t wrapper_fread(uint8_t *mem, uint32_t data_addr, uint32_t size, uint32_t count, uint32_t fp_addr); -uint32_t wrapper_fwrite(uint8_t *mem, uint32_t data_addr, uint32_t size, uint32_t count, uint32_t fp_addr); -int wrapper_fputs(uint8_t *mem, uint32_t str_addr, uint32_t fp_addr); -int wrapper_puts(uint8_t *mem, uint32_t str_addr); -uint32_t wrapper_getcwd(uint8_t *mem, uint32_t buf_addr, uint32_t size); -int wrapper_time(uint8_t *mem, uint32_t tloc_addr); -void wrapper_bzero(uint8_t *mem, uint32_t str_addr, uint32_t n); -int wrapper_fp_class_d(double d); -double wrapper_ldexp(double d, int i); -uint64_t wrapper___ll_mul(uint64_t a0, uint64_t a1); -int64_t wrapper___ll_div(int64_t a0, int64_t a1); -int64_t wrapper___ll_rem(uint64_t a0, int64_t a1); -uint64_t wrapper___ll_lshift(uint64_t a0, uint64_t shift); -int64_t wrapper___ll_rshift(int64_t a0, uint64_t shift); -uint64_t wrapper___ull_div(uint64_t a0, uint64_t a1); -uint64_t wrapper___ull_rem(uint64_t a0, uint64_t a1); -uint64_t wrapper___ull_rshift(uint64_t a0, uint64_t shift); -uint64_t wrapper___d_to_ull(double d); -int64_t wrapper___d_to_ll(double d); -uint64_t wrapper___f_to_ull(float f); -int64_t wrapper___f_to_ll(float f); -float wrapper___ull_to_f(uint64_t v); -float wrapper___ll_to_f(int64_t v); -double wrapper___ull_to_d(uint64_t v); -double wrapper___ll_to_d(int64_t v); -void wrapper_abort(uint8_t *mem); -void wrapper_exit(uint8_t *mem, int status); -void wrapper__exit(uint8_t *mem, int status); -void wrapper__cleanup(uint8_t *mem); -uint32_t wrapper__rld_new_interface(uint8_t *mem, uint32_t operation, uint32_t sp); -void wrapper__exithandle(uint8_t *mem); -int wrapper__prctl(uint8_t *mem, int operation, uint32_t sp); -double wrapper__atod(uint8_t *mem, uint32_t buffer_addr, int ndigits, int dexp); -int wrapper_pathconf(uint8_t *mem, uint32_t path_addr, int name); -uint32_t wrapper_getenv(uint8_t *mem, uint32_t name_addr); -uint32_t wrapper_gettxt(uint8_t *mem, uint32_t msgid_addr, uint32_t default_str_addr); -uint32_t wrapper_setlocale(uint8_t *mem, int category, uint32_t locale_addr); -uint32_t wrapper_mmap(uint8_t *mem, uint32_t addr, uint32_t length, int prot, int flags, int fd, int offset); -int wrapper_munmap(uint8_t *mem, uint32_t addr, uint32_t length); -int wrapper_mprotect(uint8_t *mem, uint32_t addr, uint32_t length, int prot); -int wrapper_sysconf(uint8_t *mem, int name); -int wrapper_getpagesize(uint8_t *mem); -int wrapper_strerror(uint8_t *mem, int errnum); -int wrapper_ioctl(uint8_t *mem, int fd, uint32_t request, uint32_t sp); -int wrapper_fcntl(uint8_t *mem, int fd, int cmd, uint32_t sp); -uint32_t wrapper_signal(uint8_t *mem, int signum, uint64_t (*trampoline)(uint8_t *mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t fp_dest), uint32_t handler_addr, uint32_t sp); -uint32_t wrapper_sigset(uint8_t *mem, int signum, uint64_t (*trampoline)(uint8_t *mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t fp_dest), uint32_t disp_addr, uint32_t sp); -int wrapper_get_fpc_csr(uint8_t *mem); -int wrapper_set_fpc_csr(uint8_t *mem, int csr); -int wrapper_setjmp(uint8_t *mem, uint32_t addr); -void wrapper_longjmp(uint8_t *mem, uint32_t addr, int status); -uint32_t wrapper_tempnam(uint8_t *mem, uint32_t dir_addr, uint32_t pfx_addr); -uint32_t wrapper_tmpnam(uint8_t *mem, uint32_t str_addr); -uint32_t wrapper_mktemp(uint8_t *mem, uint32_t template_addr); -int wrapper_mkstemp(uint8_t *mem, uint32_t name_addr); -uint32_t wrapper_tmpfile(uint8_t *mem); -int wrapper_wait(uint8_t *mem, uint32_t wstatus_addr); -int wrapper_kill(uint8_t *mem, int pid, int sig); -int wrapper_execlp(uint8_t *mem, uint32_t file_addr, uint32_t sp); -int wrapper_execv(uint8_t *mem, uint32_t pathname_addr, uint32_t argv_addr); -int wrapper_execvp(uint8_t *mem, uint32_t file_addr, uint32_t argv_addr); -int wrapper_fork(uint8_t *mem); -int wrapper_system(uint8_t *mem, uint32_t command_addr); -uint32_t wrapper_tsearch(uint8_t *mem, uint32_t key_addr, uint32_t rootp_addr, uint32_t compar_addr); -uint32_t wrapper_tfind(uint8_t *mem, uint32_t key_addr, uint32_t rootp_addr, uint32_t compar_addr); -uint32_t wrapper_qsort(uint8_t *mem, uint32_t base_addr, uint32_t num, uint32_t size, uint64_t (*trampoline)(uint8_t *mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t fp_dest), uint32_t compare_addr, uint32_t sp); -uint32_t wrapper_regcmp(uint8_t *mem, uint32_t string1_addr, uint32_t sp); -uint32_t wrapper_regex(uint8_t *mem, uint32_t re_addr, uint32_t subject_addr, uint32_t sp); -void wrapper___assert(uint8_t *mem, uint32_t assertion_addr, uint32_t file_addr, int line); - -union FloatReg FloatReg_from_double(double d); -double double_from_FloatReg(union FloatReg floatreg); -double double_from_memory(uint8_t *mem, uint32_t address); - -#endif diff --git a/tools/ido-static-recomp/recomp.cpp b/tools/ido-static-recomp/recomp.cpp deleted file mode 100644 index 683e750d..00000000 --- a/tools/ido-static-recomp/recomp.cpp +++ /dev/null @@ -1,3813 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "rabbitizer.hpp" -#include "rabbitizer.h" - -#include "elf.h" - -#if defined(_WIN32) && !defined(__CYGWIN__) -#include -#endif /* _WIN32 && !__CYGWIN__ */ - -#if !defined(_MSC_VER) && !defined(__CYGWIN__) && !defined(_WIN32) -#define UNIX_PLATFORM -#endif - -#ifdef UNIX_PLATFORM -// TODO: determine if any of those headers are not required -#include -#include -#include // for __cxa_demangle -#include // for dladdr -#include -#include -#endif - -#ifndef FULL_TRACEBACK -// Change to non-zero to have full traceback, including names not exported -#define FULL_TRACEBACK 0 -#endif - -// set this to 1 when testing a new program, to verify that no false function pointers are found -#define INSPECT_FUNCTION_POINTERS 0 - -#ifndef TRACE -#define TRACE 0 -#endif - -#define LABELS_64_BIT 1 - -#ifndef DUMP_INSTRUCTIONS -// Set to non-zero to dump actual disassembly when dumping C code -#define DUMP_INSTRUCTIONS 0 -#endif - -#define u32be(x) (uint32_t)(((x & 0xff) << 24) + ((x & 0xff00) << 8) + ((x & 0xff0000) >> 8) + ((uint32_t)(x) >> 24)) -#define u16be(x) (uint16_t)(((x & 0xff) << 8) + ((x & 0xff00) >> 8)) -#define read_u32_be(buf) (uint32_t)(((buf)[0] << 24) + ((buf)[1] << 16) + ((buf)[2] << 8) + ((buf)[3])) - -#define UniqueId_cpu_li rabbitizer::InstrId::UniqueId::cpu_USERDEF_00 -#define UniqueId_cpu_la rabbitizer::InstrId::UniqueId::cpu_USERDEF_01 - -using namespace std; - -struct Edge { - uint32_t i; - uint8_t function_entry : 1; - uint8_t function_exit : 1; - uint8_t extern_function : 1; - uint8_t function_pointer : 1; -}; - -struct Insn { - // base instruction - rabbitizer::InstructionCpu instruction; - - // - bool is_global_got_memop; - bool no_following_successor; - - // patching instructions - bool patched; - // lui pairs - uint32_t patched_addr; - // immediates are 16 bits wide, but they can be either signed or unsigned - // a 32 bits signed member can hold all those possible values - int32_t patched_imms; - rabbitizer::Registers::Cpu::GprO32 lila_dst_reg; - int linked_insn; - union { - uint32_t linked_value; - float linked_float; - }; - - // jumptable instructions - uint32_t jtbl_addr; - uint32_t num_cases; - rabbitizer::Registers::Cpu::GprO32 index_reg; - - // graph - vector successors; - vector predecessors; - uint64_t b_liveout; - uint64_t b_livein; - uint64_t f_livein; - uint64_t f_liveout; - - Insn(uint32_t word, uint32_t vram) : instruction(word, vram) { - this->is_global_got_memop = false; - this->no_following_successor = false; - - this->patched = false; - this->patched_addr = 0; - this->patched_imms = 0; - this->lila_dst_reg = rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero; - this->linked_insn = -1; - this->linked_value = 0; - - this->jtbl_addr = 0; - this->num_cases = 0; - this->index_reg = rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero; - - this->b_liveout = 0; - this->b_livein = 0; - this->f_livein = 0; - this->f_liveout = 0; - } - - void patchInstruction(rabbitizer::InstrId::UniqueId instructionId) { - this->patched = true; - RabbitizerInstruction* innerInstr = this->instruction.getCPtr(); - innerInstr->uniqueId = (RabbitizerInstrId)(instructionId); - innerInstr->descriptor = &RabbitizerInstrDescriptor_Descriptors[innerInstr->uniqueId]; - } - - void patchAddress(rabbitizer::InstrId::UniqueId instructionId, uint32_t newAddress) { - this->patchInstruction(instructionId); - this->patched_addr = newAddress; - } - - uint32_t getAddress() const { - if (this->patched && this->patched_addr != 0) { - return this->patched_addr; - } - - if (this->instruction.hasOperandAlias(rabbitizer::OperandType::cpu_label)) { - return this->instruction.getInstrIndexAsVram(); - } - - if (this->instruction.isBranch()) { - return this->instruction.getVram() + this->instruction.getBranchOffset(); - } - - assert(!"unreachable code"); - } - - void patchImmediate(int32_t newImmediate) { - this->patched = true; - this->patched_imms = newImmediate; - } - - int32_t getImmediate() const { - if (this->patched) { - return this->patched_imms; - } - - return this->instruction.getProcessedImmediate(); - } - - std::string disassemble() const { - char buffer[0x1000]; - int32_t imm; - - switch (this->instruction.getUniqueId()) { - case UniqueId_cpu_li: - imm = this->getImmediate(); - if (imm >= 0) { - sprintf(buffer, "li %s, 0x%X", RabbitizerRegister_getNameGpr((int)this->lila_dst_reg), - imm); - } else { - sprintf(buffer, "li %s, %i", RabbitizerRegister_getNameGpr((int)this->lila_dst_reg), imm); - } - return buffer; - - case UniqueId_cpu_la: - sprintf(buffer, "la %s, 0x%X", RabbitizerRegister_getNameGpr((int)this->lila_dst_reg), - this->getAddress()); - return buffer; - - default: - return this->instruction.disassembleInstruction(0); - } - } -}; - -struct Function { - vector returns; // points to delay slots - uint32_t end_addr; // address after end - uint32_t nargs; - uint32_t nret; - bool v0_in; - bool referenced_by_function_pointer; -}; - -bool conservative; - -const uint8_t* text_section; -uint32_t text_section_len; -uint32_t text_vaddr; - -const uint8_t* rodata_section; -uint32_t rodata_section_len; -uint32_t rodata_vaddr; - -const uint8_t* data_section; -uint32_t data_section_len; -uint32_t data_vaddr; - -uint32_t bss_section_len; -uint32_t bss_vaddr; - -vector insns; -set label_addresses; -vector got_globals; -vector got_locals; -uint32_t gp_value; -uint32_t gp_value_adj; - -map symbol_names; - -vector> data_function_pointers; -set la_function_pointers; -map functions; -uint32_t main_addr; -uint32_t mcount_addr; -uint32_t procedure_table_start; -uint32_t procedure_table_len; - -#define FLAG_NO_MEM 1 -#define FLAG_VARARG 2 - -/** - * Struct containing information on external functions that are called using the wrappers in `libc_impl.c`. - * - * name: function name - * params: first char is return type, subsequent chars are argument types. Key to chars used: - * - 'v' void - * - 'i' signed int (int32_t) - * - 'u' unsigned int (uint32_t) - * - 'p' pointer (uintptr_t) - * - 'f' float - * - 'd' double - * - 'l' signed long long (int64_t) - * - 'j' unsigned long long (uint64_t) - * - 't' trampoline - * - * flags: use defines above - */ -const struct ExternFunction { - const char* name; - const char* params; - int flags; -} extern_functions[] = { - { "exit", "vi", 0 }, // override exit from application - { "abort", "v", 0 }, - { "sbrk", "pi", 0 }, - { "malloc", "pu", 0 }, - { "calloc", "puu", 0 }, - { "realloc", "ppu", 0 }, - { "free", "vp", 0 }, - { "fscanf", "ipp", FLAG_VARARG }, - { "printf", "ip", FLAG_VARARG }, - { "sprintf", "ipp", FLAG_VARARG }, - { "fprintf", "ipp", FLAG_VARARG }, - { "_doprnt", "ippp", 0 }, - { "strlen", "up", 0 }, - { "open", "ipii", 0 }, - { "creat", "ipi", 0 }, - { "access", "ipi", 0 }, - { "rename", "ipp", 0 }, - { "utime", "ipp", 0 }, - { "flock", "iii", 0 }, - { "chmod", "ipu", 0 }, - { "umask", "ii", FLAG_NO_MEM }, - { "ecvt", "pdipp", 0 }, - { "fcvt", "pdipp", 0 }, - { "sqrt", "dd", FLAG_NO_MEM }, - { "sqrtf", "ff", FLAG_NO_MEM }, - { "atoi", "ip", 0 }, - { "atol", "ip", 0 }, - { "atof", "dp", 0 }, - { "strtol", "ippi", 0 }, - { "strtoul", "uppi", 0 }, - { "strtoll", "lppi", 0 }, - { "strtoull", "jppi", 0 }, - { "strtod", "dpp", 0 }, - { "strchr", "ppi", 0 }, - { "strrchr", "ppi", 0 }, - { "strcspn", "upp", 0 }, - { "strpbrk", "ppp", 0 }, - { "fstat", "iip", 0 }, - { "stat", "ipp", 0 }, - { "ftruncate", "iii", 0 }, - { "truncate", "ipi", 0}, - { "bcopy", "vppu", 0 }, - { "memcpy", "pppu", 0 }, - { "memccpy", "pppiu", 0 }, - { "read", "iipu", 0 }, - { "write", "iipu", 0 }, - { "fopen", "ppp", 0 }, - { "freopen", "pppp", 0 }, - { "fclose", "ip", 0 }, - { "ftell", "ip", 0 }, - { "rewind", "vp", 0 }, - { "fseek", "ipii", 0 }, - { "lseek", "iiii", 0 }, - { "fflush", "ip", 0 }, - { "fchown", "iiii", 0 }, - { "dup", "ii", 0 }, - { "dup2", "iii", 0 }, - { "pipe", "ip", 0 }, - { "perror", "vp", 0 }, - { "fdopen", "iip", 0 }, - { "memset", "ppiu", 0 }, - { "bcmp", "ippu", 0 }, - { "memcmp", "ippu", 0 }, - { "getpid", "i", FLAG_NO_MEM }, - { "getpgrp", "i", 0 }, - { "remove", "ip", 0 }, - { "unlink", "ip", 0 }, - { "close", "ii", 0 }, - { "strcmp", "ipp", 0 }, - { "strncmp", "ippu", 0 }, - { "strcpy", "ppp", 0 }, - { "strncpy", "pppu", 0 }, - { "strcat", "ppp", 0 }, - { "strncat", "pppu", 0 }, - { "strtok", "ppp", 0 }, - { "strstr", "ppp", 0 }, - { "strdup", "pp", 0 }, - { "toupper", "ii", FLAG_NO_MEM }, - { "tolower", "ii", FLAG_NO_MEM }, - { "gethostname", "ipu", 0 }, - { "isatty", "ii", 0 }, - { "strftime", "upupp", 0 }, - { "times", "ip", 0 }, - { "clock", "i", FLAG_NO_MEM }, - { "ctime", "pp", 0 }, - { "localtime", "pp", 0 }, - { "setvbuf", "ippiu", 0 }, - { "__semgetc", "ip", 0 }, - { "__semputc", "iip", 0 }, - { "fgetc", "ip", 0 }, - { "fgets", "ipip", 0 }, - { "__filbuf", "ip", 0 }, - { "__flsbuf", "iip", 0 }, - { "ungetc", "iip", 0 }, - { "gets", "pp", 0 }, - { "fread", "upuup", 0 }, - { "fwrite", "upuup", 0 }, - { "fputs", "ipp", 0 }, - { "puts", "ip", 0 }, - { "getcwd", "ppu", 0 }, - { "time", "ip", 0 }, - { "bzero", "vpu", 0 }, - { "fp_class_d", "id", FLAG_NO_MEM }, - { "ldexp", "ddi", FLAG_NO_MEM }, - { "__ll_mul", "lll", FLAG_NO_MEM }, - { "__ll_div", "lll", FLAG_NO_MEM }, - { "__ll_rem", "ljl", FLAG_NO_MEM }, - { "__ll_lshift", "llj", FLAG_NO_MEM }, - { "__ll_rshift", "llj", FLAG_NO_MEM }, - { "__ull_div", "jjj", FLAG_NO_MEM }, - { "__ull_rem", "jjj", FLAG_NO_MEM }, - { "__ull_rshift", "jjj", FLAG_NO_MEM }, - { "__d_to_ull", "jd", FLAG_NO_MEM }, - { "__d_to_ll", "ld", FLAG_NO_MEM }, - { "__f_to_ull", "jf", FLAG_NO_MEM }, - { "__f_to_ll", "lf", FLAG_NO_MEM }, - { "__ull_to_f", "fj", FLAG_NO_MEM }, - { "__ll_to_f", "fl", FLAG_NO_MEM }, - { "__ull_to_d", "dj", FLAG_NO_MEM }, - { "__ll_to_d", "dl", FLAG_NO_MEM }, - { "_exit", "vi", 0 }, - { "_cleanup", "v", 0 }, - { "_rld_new_interface", "pu", FLAG_VARARG }, - { "_exithandle", "v", 0 }, - { "_prctl", "ii", FLAG_VARARG }, - { "_atod", "dpii", 0 }, - { "pathconf", "ipi", 0 }, - { "getenv", "pp", 0 }, - { "gettxt", "ppp", 0 }, - { "setlocale", "pip", 0 }, - { "mmap", "ppuiiii", 0 }, - { "munmap", "ipu", 0 }, - { "mprotect", "ipui", 0 }, - { "sysconf", "ii", 0 }, - { "getpagesize", "i", 0 }, - { "strerror", "pi", 0 }, - { "ioctl", "iiu", FLAG_VARARG }, - { "fcntl", "iii", FLAG_VARARG }, - { "signal", "pit", 0 }, - { "sigset", "pit", 0 }, - { "get_fpc_csr", "i", 0 }, - { "set_fpc_csr", "ii", 0 }, - { "setjmp", "ip", 0 }, - { "longjmp", "vpi", 0 }, - { "tempnam", "ppp", 0 }, - { "tmpnam", "pp", 0 }, - { "mktemp", "pp", 0 }, - { "mkstemp", "ip", 0 }, - { "tmpfile", "p", 0 }, - { "wait", "ip", 0 }, - { "kill", "iii", 0 }, - { "execlp", "ip", FLAG_VARARG }, - { "execv", "ipp", 0 }, - { "execvp", "ipp", 0 }, - { "fork", "i", 0 }, - { "system", "ip", 0 }, - { "tsearch", "pppp", 0 }, - { "tfind", "pppp", 0 }, - { "qsort", "vpuut", 0 }, - { "regcmp", "pp", FLAG_VARARG }, - { "regex", "ppp", FLAG_VARARG }, - { "__assert", "vppi", 0 }, -}; - -void disassemble(void) { - uint32_t i; - - RabbitizerConfig_Cfg.misc.omit0XOnSmallImm = true; - RabbitizerConfig_Cfg.misc.opcodeLJust -= 8; - RabbitizerConfig_Cfg.misc.upperCaseImm = false; - insns.reserve(1 + text_section_len / sizeof(uint32_t)); // +1 for dummy instruction - - for (i = 0; i < text_section_len; i += sizeof(uint32_t)) { - uint32_t word = read_u32_be(&text_section[i]); - Insn insn(word, text_vaddr + i); - insns.push_back(insn); - } - - { - // Add dummy NOP instruction to avoid out of bounds - Insn insn(0x00000000, text_vaddr + i); - insn.no_following_successor = true; - insns.push_back(insn); - } -} - -void add_function(uint32_t addr) { - if (addr >= text_vaddr && addr < text_vaddr + text_section_len) { - functions[addr]; - } -} - -map::iterator find_function(uint32_t addr) { - if (functions.size() == 0) { - return functions.end(); - } - - auto it = functions.upper_bound(addr); - - if (it == functions.begin()) { - return functions.end(); - } - - --it; - return it; -} - -rabbitizer::Registers::Cpu::GprO32 get_dest_reg(const Insn& insn) { - switch (insn.instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_jalr: - // jalr technically modifies rd, so an empty case is here to avoid crashing - break; - - case UniqueId_cpu_li: - case UniqueId_cpu_la: - return insn.lila_dst_reg; - - default: - if (insn.instruction.modifiesRt()) { - return insn.instruction.GetO32_rt(); - } else if (insn.instruction.modifiesRd()) { - return insn.instruction.GetO32_rd(); - } - break; - } - - return rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero; -} - -// try to find a matching LUI for a given register -void link_with_lui(int offset, rabbitizer::Registers::Cpu::GprO32 reg, int mem_imm) { -#define MAX_LOOKBACK 128 - // don't attempt to compute addresses for zero offset - // end search after some sane max number of instructions - int end_search = std::max(0, offset - MAX_LOOKBACK); - - for (int search = offset - 1; search >= end_search; search--) { - switch (insns[search].instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_lui: - if (reg == insns[search].instruction.GetO32_rt()) { - goto loop_end; - } - continue; - - case rabbitizer::InstrId::UniqueId::cpu_lw: - case rabbitizer::InstrId::UniqueId::cpu_ld: - case rabbitizer::InstrId::UniqueId::cpu_addiu: - case rabbitizer::InstrId::UniqueId::cpu_add: - case rabbitizer::InstrId::UniqueId::cpu_sub: - case rabbitizer::InstrId::UniqueId::cpu_subu: - if (reg == get_dest_reg(insns[search])) { - if ((insns[search].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_lw) && - insns[search].instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_gp) { - int mem_imm0 = insns[search].instruction.getProcessedImmediate(); - uint32_t got_entry = (mem_imm0 + gp_value_adj) / sizeof(uint32_t); - - if (got_entry < got_locals.size()) { - // used for static functions - uint32_t addr = got_locals[got_entry] + mem_imm; - insns[search].linked_insn = offset; - insns[search].linked_value = addr; - insns[offset].linked_insn = search; - insns[offset].linked_value = addr; - - // Patch instruction to contain full address - insns[search].lila_dst_reg = get_dest_reg(insns[search]); - insns[search].patchAddress(UniqueId_cpu_la, addr); - - // Patch instruction to have offset 0 - switch (insns[offset].instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_addiu: { - rabbitizer::Registers::Cpu::GprO32 dst_reg = insns[offset].instruction.GetO32_rt(); - insns[offset].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_move); - // Patch the destination register too - insns[offset].instruction.Set_rd(dst_reg); - } - - if (addr >= text_vaddr && addr < text_vaddr + text_section_len) { - add_function(addr); - } - goto loop_end; - - case rabbitizer::InstrId::UniqueId::cpu_lb: - case rabbitizer::InstrId::UniqueId::cpu_lbu: - case rabbitizer::InstrId::UniqueId::cpu_sb: - case rabbitizer::InstrId::UniqueId::cpu_lh: - case rabbitizer::InstrId::UniqueId::cpu_lhu: - case rabbitizer::InstrId::UniqueId::cpu_sh: - case rabbitizer::InstrId::UniqueId::cpu_lw: - case rabbitizer::InstrId::UniqueId::cpu_sw: - case rabbitizer::InstrId::UniqueId::cpu_ldc1: - case rabbitizer::InstrId::UniqueId::cpu_lwc1: - case rabbitizer::InstrId::UniqueId::cpu_swc1: - insns[offset].patchImmediate(0); - goto loop_end; - - default: - assert(0 && "Unsupported instruction type"); - } - } - goto loop_end; - } else { - // ignore: reg is pointer, offset is probably struct data member - goto loop_end; - } - } - - continue; - - case rabbitizer::InstrId::UniqueId::cpu_jr: - if ((insns[search].instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra) && - (offset - search >= 2)) { - // stop looking when previous `jr ra` is hit, - // but ignore if `offset` is branch delay slot for this `jr ra` - goto loop_end; - } - continue; - - default: - continue; - } - } -loop_end:; -} - -// for a given `jalr t9`, find the matching t9 load -void link_with_jalr(int offset) { - // end search after some sane max number of instructions - int end_search = std::max(0, offset - MAX_LOOKBACK); - - for (int search = offset - 1; search >= end_search; search--) { - if (get_dest_reg(insns[search]) == rabbitizer::Registers::Cpu::GprO32::GPR_O32_t9) { - // should be a switch with returns - switch (insns[search].instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_lw: - case UniqueId_cpu_la: - if (insns[search].is_global_got_memop || - (insns[search].instruction.getUniqueId() == UniqueId_cpu_la)) { - insns[search].linked_insn = offset; - insns[offset].linked_insn = search; - insns[offset].linked_value = insns[search].linked_value; - - insns[offset].patchAddress(rabbitizer::InstrId::UniqueId::cpu_jal, insns[search].linked_value); - - insns[search].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_nop); - insns[search].is_global_got_memop = false; - - add_function(insns[search].linked_value); - } - return; - - case rabbitizer::InstrId::UniqueId::cpu_addiu: - if (insns[search].linked_insn != -1) { - uint32_t first = insns[search].linked_insn; - - // not describing as patched since instruction not edited - insns[search].linked_insn = offset; - insns[offset].linked_insn = first; - insns[offset].linked_value = insns[search].linked_value; - } - return; - - case rabbitizer::InstrId::UniqueId::cpu_ld: - case rabbitizer::InstrId::UniqueId::cpu_addu: - case rabbitizer::InstrId::UniqueId::cpu_add: - case rabbitizer::InstrId::UniqueId::cpu_sub: - case rabbitizer::InstrId::UniqueId::cpu_subu: - return; - - default: - break; - } - } else if ((insns[search].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_jr) && - (insns[search].instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra)) { - // stop looking when previous `jr ra` is hit - return; - } - } -} - -// TODO: uniformise use of insn vs insns[i] -void pass1(void) { - for (size_t i = 0; i < insns.size(); i++) { - Insn& insn = insns[i]; - - // TODO: replace with BAL. Or just fix properly - if (insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_bal) { - insn.patchAddress(rabbitizer::InstrId::UniqueId::cpu_jal, - insn.instruction.getVram() + insn.instruction.getBranchOffset()); - } - - if (insn.instruction.isJump()) { - if (insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_jal || - insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_j) { - uint32_t target = insn.getAddress(); - - label_addresses.insert(target); - add_function(target); - } else if (insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_jr) { - // sltiu $at, $ty, z - // sw $reg, offset($sp) (very seldom, one or more, usually in func entry) - // lw $gp, offset($sp) (if PIC, and very seldom) - // beqz $at, .L - // some other instruction (not always) - // lui $at, %hi(jtbl) - // sll $tx, $ty, 2 - // addu $at, $at, $tx - // lw $tx, %lo(jtbl)($at) - // nop (code compiled with 5.3) - // addu $tx, $tx, $gp (if PIC) - // jr $tx - - // IDO 7.1: - // lw at,offset(gp) - // andi t9,t8,0x3f - // sll t9,t9,0x2 - // addu at,at,t9 - // lw t9,offset(at) - // addu t9,t9,gp - // jr t9 - - // IDO 5.3: - // lw at,offset(gp) - // andi t3,t2,0x3f - // sll t3,t3,0x2 - // addu at,at,t3 - // something - // lw t3,offset(at) - // something - // addu t3,t3,gp - // jr t3 - if (i >= 7 && rodata_section != NULL) { - bool is_pic = - (insns[i - 1].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_addu) && - (insns[i - 1].instruction.GetO32_rt() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_gp); - bool has_nop = - insns[i - is_pic - 1].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_nop; - bool has_extra = insns[i - is_pic - has_nop - 5].instruction.getUniqueId() != - rabbitizer::InstrId::UniqueId::cpu_beqz; - int lw = i - (int)is_pic - (int)has_nop - 1; - - if (insns[lw].instruction.getUniqueId() != rabbitizer::InstrId::UniqueId::cpu_lw) { - --lw; - } - - if ((insns[lw].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_lw) && - (insns[lw].linked_insn != -1)) { - int sltiu_index = -1; - int andi_index = -1; - uint32_t addu_index = lw - 1; - uint32_t num_cases; - bool found = false; - bool and_variant = false; - int end = 14; - - if (insns[addu_index].instruction.getUniqueId() != rabbitizer::InstrId::UniqueId::cpu_addu) { - --addu_index; - } - - if (insns[addu_index].instruction.getUniqueId() != rabbitizer::InstrId::UniqueId::cpu_addu) { - goto skip; - } - - if (insns[addu_index - 1].instruction.getUniqueId() != rabbitizer::InstrId::UniqueId::cpu_sll) { - goto skip; - } - - if (get_dest_reg(insns[addu_index - 1]) != insn.instruction.GetO32_rs()) { - goto skip; - } - - for (int j = 3; j <= 4; j++) { - if (insns[lw - j].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_andi) { - andi_index = lw - j; - break; - } - } - - if (i == 368393) { - // In copt - end = 18; - } - - for (int j = 5; j <= end; j++) { - if ((insns[lw - has_extra - j].instruction.getUniqueId() == - rabbitizer::InstrId::UniqueId::cpu_sltiu) && - (insns[lw - has_extra - j].instruction.GetO32_rt() == - rabbitizer::Registers::Cpu::GprO32::GPR_O32_at)) { - sltiu_index = j; - break; - } - - if (insns[lw - has_extra - j].instruction.getUniqueId() == - rabbitizer::InstrId::UniqueId::cpu_jr) { - // Prevent going into a previous switch - break; - } - } - - if (sltiu_index != -1) { - andi_index = -1; - } - - if (sltiu_index != -1 && insns[lw - has_extra - sltiu_index].instruction.getUniqueId() == - rabbitizer::InstrId::UniqueId::cpu_sltiu) { - num_cases = insns[lw - has_extra - sltiu_index].instruction.getProcessedImmediate(); - found = true; - } else if (andi_index != -1) { - num_cases = insns[andi_index].instruction.getProcessedImmediate() + 1; - found = true; - and_variant = true; - } else if (i == 219382) { - // Special hard case in copt where the initial sltiu is in another basic block - found = true; - num_cases = 13; - } else if (i == 370995) { - // Special hard case in copt where the initial sltiu is in another basic block - found = true; - num_cases = 12; - } - - if (found) { - uint32_t jtbl_addr = insns[lw].linked_value; - - if (is_pic) { - insns[i - 1].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_nop); - } - - insn.jtbl_addr = jtbl_addr; - insn.num_cases = num_cases; - insn.index_reg = insns[addu_index - 1].instruction.GetO32_rt(); - insns[lw].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_nop); - - insns[addu_index].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_nop); - - insns[addu_index - 1].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_nop); - - if (!and_variant) { - insns[addu_index - 2].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_nop); - } - - if (jtbl_addr < rodata_vaddr || - jtbl_addr + num_cases * sizeof(uint32_t) > rodata_vaddr + rodata_section_len) { - fprintf(stderr, "jump table outside rodata\n"); - exit(EXIT_FAILURE); - } - - for (uint32_t i = 0; i < num_cases; i++) { - uint32_t target_addr = - read_u32_be(rodata_section + (jtbl_addr - rodata_vaddr) + i * sizeof(uint32_t)); - - target_addr += gp_value; - // printf("%08X\n", target_addr); - label_addresses.insert(target_addr); - } - } - skip:; - } - } - } else if (insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_jalr) { - // empty - } else { - assert(!"Unreachable code"); - } - } else if (insn.instruction.isBranch()) { - uint32_t target = insn.getAddress(); - - label_addresses.insert(target); - } - - switch (insns[i].instruction.getUniqueId()) { - // find floating point LI - case rabbitizer::InstrId::UniqueId::cpu_mtc1: { - rabbitizer::Registers::Cpu::GprO32 rt = insns[i].instruction.GetO32_rt(); - - for (int s = i - 1; s >= 0; s--) { - switch (insns[s].instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_lui: - if (insns[s].instruction.GetO32_rt() == rt) { - float f; - uint32_t lui_imm = insns[s].instruction.getProcessedImmediate() << 16; - - memcpy(&f, &lui_imm, sizeof(f)); - // link up the LUI with this instruction and the float - insns[s].linked_insn = i; - insns[s].linked_float = f; - // rewrite LUI instruction to be LI - insns[s].lila_dst_reg = get_dest_reg(insns[s]); - insns[s].patchInstruction(UniqueId_cpu_li); - insns[s].patchImmediate(lui_imm); - } - goto loop_end; - - case rabbitizer::InstrId::UniqueId::cpu_lw: - case rabbitizer::InstrId::UniqueId::cpu_ld: - case rabbitizer::InstrId::UniqueId::cpu_lh: - case rabbitizer::InstrId::UniqueId::cpu_lhu: - case rabbitizer::InstrId::UniqueId::cpu_lb: - case rabbitizer::InstrId::UniqueId::cpu_lbu: - case rabbitizer::InstrId::UniqueId::cpu_addiu: - if (rt == insns[s].instruction.GetO32_rt()) { - goto loop_end; - } - continue; - - case rabbitizer::InstrId::UniqueId::cpu_add: - case rabbitizer::InstrId::UniqueId::cpu_sub: - case rabbitizer::InstrId::UniqueId::cpu_subu: - if (rt == insns[s].instruction.GetO32_rd()) { - goto loop_end; - } - continue; - - case rabbitizer::InstrId::UniqueId::cpu_jr: - if (insns[s].instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra) { - goto loop_end; - } - continue; - - default: - continue; - } - } - loop_end:; - } break; - - case rabbitizer::InstrId::UniqueId::cpu_sd: - case rabbitizer::InstrId::UniqueId::cpu_sw: - case rabbitizer::InstrId::UniqueId::cpu_sh: - case rabbitizer::InstrId::UniqueId::cpu_sb: - case rabbitizer::InstrId::UniqueId::cpu_lb: - case rabbitizer::InstrId::UniqueId::cpu_lbu: - case rabbitizer::InstrId::UniqueId::cpu_ld: - case rabbitizer::InstrId::UniqueId::cpu_ldl: - case rabbitizer::InstrId::UniqueId::cpu_ldr: - case rabbitizer::InstrId::UniqueId::cpu_lh: - case rabbitizer::InstrId::UniqueId::cpu_lhu: - case rabbitizer::InstrId::UniqueId::cpu_lw: - case rabbitizer::InstrId::UniqueId::cpu_lwu: - case rabbitizer::InstrId::UniqueId::cpu_ldc1: - case rabbitizer::InstrId::UniqueId::cpu_lwc1: - case rabbitizer::InstrId::UniqueId::cpu_lwc2: - case rabbitizer::InstrId::UniqueId::cpu_swc1: - case rabbitizer::InstrId::UniqueId::cpu_swc2: { - rabbitizer::Registers::Cpu::GprO32 mem_rs = insns[i].instruction.GetO32_rs(); - int32_t mem_imm = insns[i].instruction.getProcessedImmediate(); - - if (mem_rs == rabbitizer::Registers::Cpu::GprO32::GPR_O32_gp) { - unsigned int got_entry = (mem_imm + gp_value_adj) / sizeof(unsigned int); - - if (got_entry >= got_locals.size()) { - got_entry -= got_locals.size(); - if (got_entry < got_globals.size()) { - assert(insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_lw); - unsigned int dest_vaddr = got_globals[got_entry]; - - insns[i].is_global_got_memop = true; - insns[i].linked_value = dest_vaddr; - - // patch to LA - insns[i].lila_dst_reg = get_dest_reg(insns[i]); - insns[i].patchAddress(UniqueId_cpu_la, dest_vaddr); - } - } - } else { - link_with_lui(i, mem_rs, mem_imm); - } - } break; - - case rabbitizer::InstrId::UniqueId::cpu_addiu: - case rabbitizer::InstrId::UniqueId::cpu_ori: { - // could be insn? - rabbitizer::Registers::Cpu::GprO32 rt = insns[i].instruction.GetO32_rt(); - rabbitizer::Registers::Cpu::GprO32 rs = insns[i].instruction.GetO32_rs(); - int32_t imm = insns[i].instruction.getProcessedImmediate(); - - if (rs == rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero) { // becomes LI - insns[i].lila_dst_reg = get_dest_reg(insns[i]); - insns[i].patchInstruction(UniqueId_cpu_li); - insns[i].patchImmediate(imm); - } else if (rt != rabbitizer::Registers::Cpu::GprO32::GPR_O32_gp) { // only look for LUI if rt and rs are - // the same - link_with_lui(i, rs, imm); - } - } break; - - case rabbitizer::InstrId::UniqueId::cpu_jalr: { - rabbitizer::Registers::Cpu::GprO32 rs = insn.instruction.GetO32_rs(); - - if (rs == rabbitizer::Registers::Cpu::GprO32::GPR_O32_t9) { - link_with_jalr(i); - if (insn.linked_insn != -1) { - insn.patchAddress(rabbitizer::InstrId::UniqueId::cpu_jal, insn.linked_value); - - label_addresses.insert(insn.linked_value); - add_function(insn.linked_value); - } - } - } break; - - default: - break; - } - - if ((insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_addu) && - (insn.instruction.GetO32_rd() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_gp) && - (insn.instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_gp) && - (insn.instruction.GetO32_rt() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_t9) && i >= 2) { - for (size_t j = i - 2; j <= i; j++) { - insns[j].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_nop); - } - } - } -} - -uint32_t addr_to_i(uint32_t addr) { - return (addr - text_vaddr) / 4; -} - -void pass2(void) { - // Find returns in each function - for (size_t i = 0; i < insns.size(); i++) { - uint32_t addr = text_vaddr + i * 4; - Insn& insn = insns[i]; - - if ((insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_jr) && - (insn.instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra)) { - auto it = find_function(addr); - assert(it != functions.end()); - - it->second.returns.push_back(addr + 4); - } - - if (insn.instruction.getUniqueId() == UniqueId_cpu_la) { - uint32_t faddr = insn.getAddress(); - - if ((text_vaddr <= faddr) && (faddr < text_vaddr + text_section_len)) { - la_function_pointers.insert(faddr); - functions[faddr].referenced_by_function_pointer = true; -#if INSPECT_FUNCTION_POINTERS - fprintf(stderr, "la function pointer: 0x%x at 0x%x\n", faddr, addr); -#endif - } - } - } - - for (auto it = functions.begin(); it != functions.end(); ++it) { - if (it->second.returns.size() == 0) { - uint32_t i = addr_to_i(it->first); - auto str_it = symbol_names.find(it->first); - - if (str_it != symbol_names.end() && str_it->second == "__start") { - - } else if (str_it != symbol_names.end() && str_it->second == "xmalloc") { - // orig 5.3: - /* - 496bf4: 3c1c0fb9 lui gp,0xfb9 - 496bf8: 279c366c addiu gp,gp,13932 - 496bfc: 0399e021 addu gp,gp,t9 - 496c00: 27bdffd8 addiu sp,sp,-40 - 496c04: 8f858de8 lw a1,-29208(gp) - 496c08: 10000006 b 496c24 - 496c0c: afbf0020 sw ra,32(sp) - */ - - // jal alloc_new - // lui $a1, malloc_scb - // jr $ra - // nop - uint32_t alloc_new_addr = text_vaddr + (i + 7) * 4; - - insns[i].patchAddress(rabbitizer::InstrId::UniqueId::cpu_jal, alloc_new_addr); - - assert(symbol_names.count(alloc_new_addr) && symbol_names[alloc_new_addr] == "alloc_new"); - i++; - - // LA - if (insns[i + 5].instruction.getUniqueId() == UniqueId_cpu_la) { - // 7.1 - insns[i] = insns[i + 5]; - } else { - // 5.3 - insns[i] = insns[i + 3]; - } - i++; - - // JR $RA - insns[i].patched = true; - insns[i].instruction = rabbitizer::InstructionCpu(0x03E00008, insns[i].instruction.getVram()); - it->second.returns.push_back(text_vaddr + i * 4 + 4); - i++; - - for (uint32_t j = 0; j < 4; j++) { - // NOP - insns[i].patched = true; - insns[i].instruction = rabbitizer::InstructionCpu(0, insns[i].instruction.getVram()); - i++; - } - } else if (str_it != symbol_names.end() && str_it->second == "xfree") { - // jal alloc_dispose - // lui $a1, malloc_scb - // jr $ra - // nop - uint32_t alloc_dispose_addr = text_vaddr + (i + 4) * 4; - - if (symbol_names.count(alloc_dispose_addr + 4) && - symbol_names[alloc_dispose_addr + 4] == "alloc_dispose") { - alloc_dispose_addr += 4; - } - - insns[i].patchAddress(rabbitizer::InstrId::UniqueId::cpu_jal, alloc_dispose_addr); - assert(symbol_names.count(alloc_dispose_addr) && symbol_names[alloc_dispose_addr] == "alloc_dispose"); - i++; - - insns[i] = insns[i + 2]; - i++; - - // JR $RA - insns[i].patched = true; - insns[i].instruction = rabbitizer::InstructionCpu(0x03E00008, insns[i].instruction.getVram()); - it->second.returns.push_back(text_vaddr + i * 4 + 4); - i++; - - // NOP - insns[i].patched = true; - insns[i].instruction = rabbitizer::InstructionCpu(0, insns[i].instruction.getVram()); - } else if ((insns[i].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_lw) && - (insns[i + 1].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_move) && - (insns[i + 2].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_jalr)) { - /* - 408f50: 8f998010 lw t9,-32752(gp) - 408f54: 03e07821 move t7,ra - 408f58: 0320f809 jalr t9 - */ - } else if (it->first > mcount_addr) { - fprintf(stderr, "no ret: 0x%x\n", it->first); - abort(); - } - } - - auto next = it; - - ++next; - if (next == functions.end()) { - it->second.end_addr = text_vaddr + text_section_len; - } else { - it->second.end_addr = next->first; - } - } -} - -void add_edge(uint32_t from, uint32_t to, bool function_entry = false, bool function_exit = false, - bool extern_function = false, bool function_pointer = false) { - Edge fe = Edge(), be = Edge(); - - fe.i = to; - be.i = from; - fe.function_entry = function_entry; - be.function_entry = function_entry; - fe.function_exit = function_exit; - be.function_exit = function_exit; - fe.extern_function = extern_function; - be.extern_function = extern_function; - fe.function_pointer = function_pointer; - be.function_pointer = function_pointer; - insns[from].successors.push_back(fe); - insns[to].predecessors.push_back(be); -} - -void pass3(void) { - // Build graph - for (size_t i = 0; i < insns.size(); i++) { - uint32_t addr = text_vaddr + i * 4; - Insn& insn = insns[i]; - - if (insn.no_following_successor) { - continue; - } - - switch (insn.instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_beq: - case rabbitizer::InstrId::UniqueId::cpu_bgez: - case rabbitizer::InstrId::UniqueId::cpu_bgtz: - case rabbitizer::InstrId::UniqueId::cpu_blez: - case rabbitizer::InstrId::UniqueId::cpu_bltz: - case rabbitizer::InstrId::UniqueId::cpu_bne: - case rabbitizer::InstrId::UniqueId::cpu_beqz: - case rabbitizer::InstrId::UniqueId::cpu_bnez: - case rabbitizer::InstrId::UniqueId::cpu_bc1f: - case rabbitizer::InstrId::UniqueId::cpu_bc1t: - add_edge(i, i + 1); - add_edge(i + 1, addr_to_i(insn.getAddress())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_beql: - case rabbitizer::InstrId::UniqueId::cpu_bgezl: - case rabbitizer::InstrId::UniqueId::cpu_bgtzl: - case rabbitizer::InstrId::UniqueId::cpu_blezl: - case rabbitizer::InstrId::UniqueId::cpu_bltzl: - case rabbitizer::InstrId::UniqueId::cpu_bnel: - case rabbitizer::InstrId::UniqueId::cpu_bc1fl: - case rabbitizer::InstrId::UniqueId::cpu_bc1tl: - add_edge(i, i + 1); - add_edge(i, i + 2); - add_edge(i + 1, addr_to_i(insn.getAddress())); - insns[i + 1].no_following_successor = true; // don't inspect delay slot - break; - - case rabbitizer::InstrId::UniqueId::cpu_b: - case rabbitizer::InstrId::UniqueId::cpu_j: - add_edge(i, i + 1); - add_edge(i + 1, addr_to_i(insn.getAddress())); - insns[i + 1].no_following_successor = true; // don't inspect delay slot - break; - - case rabbitizer::InstrId::UniqueId::cpu_jr: { - add_edge(i, i + 1); - - if (insn.jtbl_addr != 0) { - uint32_t jtbl_pos = insn.jtbl_addr - rodata_vaddr; - - assert(jtbl_pos < rodata_section_len && - jtbl_pos + insn.num_cases * sizeof(uint32_t) <= rodata_section_len); - - for (uint32_t j = 0; j < insn.num_cases; j++) { - uint32_t dest_addr = read_u32_be(rodata_section + jtbl_pos + j * sizeof(uint32_t)) + gp_value; - - add_edge(i + 1, addr_to_i(dest_addr)); - } - } else { - assert(insn.instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra && - "jump to address in register not supported"); - } - - insns[i + 1].no_following_successor = true; // don't inspect delay slot - break; - } - - case rabbitizer::InstrId::UniqueId::cpu_jal: { - add_edge(i, i + 1); - - uint32_t dest = insn.getAddress(); - - if (dest > mcount_addr && dest >= text_vaddr && dest < text_vaddr + text_section_len) { - add_edge(i + 1, addr_to_i(dest), true); - - auto it = functions.find(dest); - assert(it != functions.end()); - - for (uint32_t ret_instr : it->second.returns) { - add_edge(addr_to_i(ret_instr), i + 2, false, true); - } - } else { - add_edge(i + 1, i + 2, false, false, true); - } - - insns[i + 1].no_following_successor = true; // don't inspect delay slot - break; - } - - case rabbitizer::InstrId::UniqueId::cpu_jalr: - // function pointer - add_edge(i, i + 1); - add_edge(i + 1, i + 2, false, false, false, true); - insns[i + 1].no_following_successor = true; // don't inspect delay slot - break; - - default: - add_edge(i, i + 1); - break; - } - } -} - -#define GPR_O32_hi (rabbitizer::Registers::Cpu::GprO32)((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra + 1) -#define GPR_O32_lo (rabbitizer::Registers::Cpu::GprO32)((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra + 2) - -uint64_t map_reg(rabbitizer::Registers::Cpu::GprO32 reg) { - return (uint64_t)1 << ((int)reg - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero + 1); -} - -uint64_t temporary_regs(void) { - // clang-format off - return - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t4) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t5) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t6) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t7) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t8) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t9); - // clang-format on -} - -typedef enum { - /* 0 */ TYPE_NOP, // No arguments - /* 1 */ TYPE_S, // in - /* 2 */ TYPE_D, // 1 out - /* 3 */ TYPE_D_S, // out, in -} TYPE; - -TYPE insn_to_type(Insn& insn) { - switch (insn.instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_add_s: - case rabbitizer::InstrId::UniqueId::cpu_add_d: - return TYPE_NOP; - - case rabbitizer::InstrId::UniqueId::cpu_add: - case rabbitizer::InstrId::UniqueId::cpu_addu: - return TYPE_D_S; - - case rabbitizer::InstrId::UniqueId::cpu_addi: - case rabbitizer::InstrId::UniqueId::cpu_addiu: - case rabbitizer::InstrId::UniqueId::cpu_andi: - case rabbitizer::InstrId::UniqueId::cpu_ori: - case rabbitizer::InstrId::UniqueId::cpu_lb: - case rabbitizer::InstrId::UniqueId::cpu_lbu: - case rabbitizer::InstrId::UniqueId::cpu_lh: - case rabbitizer::InstrId::UniqueId::cpu_lhu: - case rabbitizer::InstrId::UniqueId::cpu_lw: - case rabbitizer::InstrId::UniqueId::cpu_lwl: - // case rabbitizer::InstrId::UniqueId::cpu_lwr: - case rabbitizer::InstrId::UniqueId::cpu_move: - case rabbitizer::InstrId::UniqueId::cpu_negu: - case rabbitizer::InstrId::UniqueId::cpu_not: - case rabbitizer::InstrId::UniqueId::cpu_sll: - case rabbitizer::InstrId::UniqueId::cpu_slti: - case rabbitizer::InstrId::UniqueId::cpu_sltiu: - case rabbitizer::InstrId::UniqueId::cpu_sra: - case rabbitizer::InstrId::UniqueId::cpu_srl: - case rabbitizer::InstrId::UniqueId::cpu_xori: - return TYPE_D_S; - - case rabbitizer::InstrId::UniqueId::cpu_mfhi: - return TYPE_D_S; - - case rabbitizer::InstrId::UniqueId::cpu_mflo: - return TYPE_D_S; - - case rabbitizer::InstrId::UniqueId::cpu_and: - case rabbitizer::InstrId::UniqueId::cpu_or: - case rabbitizer::InstrId::UniqueId::cpu_nor: - case rabbitizer::InstrId::UniqueId::cpu_sllv: - case rabbitizer::InstrId::UniqueId::cpu_slt: - case rabbitizer::InstrId::UniqueId::cpu_sltu: - case rabbitizer::InstrId::UniqueId::cpu_srav: - case rabbitizer::InstrId::UniqueId::cpu_srlv: - case rabbitizer::InstrId::UniqueId::cpu_subu: - case rabbitizer::InstrId::UniqueId::cpu_xor: - return TYPE_D_S; - - case rabbitizer::InstrId::UniqueId::cpu_cfc1: - case rabbitizer::InstrId::UniqueId::cpu_mfc1: - case UniqueId_cpu_li: - case UniqueId_cpu_la: - case rabbitizer::InstrId::UniqueId::cpu_lui: - return TYPE_D; - - case rabbitizer::InstrId::UniqueId::cpu_ctc1: - case rabbitizer::InstrId::UniqueId::cpu_bgez: - case rabbitizer::InstrId::UniqueId::cpu_bgezl: - case rabbitizer::InstrId::UniqueId::cpu_bgtz: - case rabbitizer::InstrId::UniqueId::cpu_bgtzl: - case rabbitizer::InstrId::UniqueId::cpu_blez: - case rabbitizer::InstrId::UniqueId::cpu_blezl: - case rabbitizer::InstrId::UniqueId::cpu_bltz: - case rabbitizer::InstrId::UniqueId::cpu_bltzl: - case rabbitizer::InstrId::UniqueId::cpu_beqz: - case rabbitizer::InstrId::UniqueId::cpu_bnez: - case rabbitizer::InstrId::UniqueId::cpu_mtc1: - return TYPE_S; - - case rabbitizer::InstrId::UniqueId::cpu_beq: - case rabbitizer::InstrId::UniqueId::cpu_beql: - case rabbitizer::InstrId::UniqueId::cpu_bne: - case rabbitizer::InstrId::UniqueId::cpu_bnel: - case rabbitizer::InstrId::UniqueId::cpu_sb: - case rabbitizer::InstrId::UniqueId::cpu_sh: - case rabbitizer::InstrId::UniqueId::cpu_sw: - case rabbitizer::InstrId::UniqueId::cpu_swl: - // case rabbitizer::InstrId::UniqueId::cpu_swr: - case rabbitizer::InstrId::UniqueId::cpu_tne: - case rabbitizer::InstrId::UniqueId::cpu_teq: - case rabbitizer::InstrId::UniqueId::cpu_tge: - case rabbitizer::InstrId::UniqueId::cpu_tgeu: - case rabbitizer::InstrId::UniqueId::cpu_tlt: - return TYPE_S; - - case rabbitizer::InstrId::UniqueId::cpu_div: - return TYPE_D_S; - - case rabbitizer::InstrId::UniqueId::cpu_div_s: - case rabbitizer::InstrId::UniqueId::cpu_div_d: - return TYPE_NOP; - - case rabbitizer::InstrId::UniqueId::cpu_divu: - case rabbitizer::InstrId::UniqueId::cpu_mult: - case rabbitizer::InstrId::UniqueId::cpu_multu: - return TYPE_D_S; - - case rabbitizer::InstrId::UniqueId::cpu_neg_s: - case rabbitizer::InstrId::UniqueId::cpu_neg_d: - return TYPE_NOP; - - case rabbitizer::InstrId::UniqueId::cpu_jalr: - return TYPE_S; - - case rabbitizer::InstrId::UniqueId::cpu_jr: - if (insn.jtbl_addr != 0) { - insn.instruction.Set_rs(insn.index_reg); - } - if (insn.instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra) { - return TYPE_NOP; - } - return TYPE_S; - - case rabbitizer::InstrId::UniqueId::cpu_lwc1: - case rabbitizer::InstrId::UniqueId::cpu_ldc1: - case rabbitizer::InstrId::UniqueId::cpu_swc1: - case rabbitizer::InstrId::UniqueId::cpu_sdc1: - return TYPE_S; - - default: - return TYPE_NOP; - } -} - -uint64_t get_dest_reg_mask(const Insn& insn) { - switch (insn.instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_div: - case rabbitizer::InstrId::UniqueId::cpu_divu: - case rabbitizer::InstrId::UniqueId::cpu_mult: - case rabbitizer::InstrId::UniqueId::cpu_multu: - return map_reg(GPR_O32_lo) | map_reg(GPR_O32_hi); - - default: - return map_reg(get_dest_reg(insn)); - } -} - -uint64_t get_single_source_reg_mask(const rabbitizer::InstructionCpu& instr) { - switch (instr.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_mflo: - return map_reg(GPR_O32_lo); - case rabbitizer::InstrId::UniqueId::cpu_mfhi: - return map_reg(GPR_O32_hi); - - default: - break; - } - if (instr.hasOperandAlias(rabbitizer::OperandType::cpu_rs)) { - return map_reg(instr.GetO32_rs()); - } else if (instr.hasOperandAlias(rabbitizer::OperandType::cpu_rt)) { - return map_reg(instr.GetO32_rt()); - } else { - return 0; - } -} - -uint64_t get_all_source_reg_mask(const rabbitizer::InstructionCpu& instr) { - uint64_t ret = 0; - - switch (instr.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_mflo: - ret |= map_reg(GPR_O32_lo); - case rabbitizer::InstrId::UniqueId::cpu_mfhi: - ret |= map_reg(GPR_O32_hi); - - default: - break; - } - - if (instr.hasOperandAlias(rabbitizer::OperandType::cpu_rs)) { - ret |= map_reg(instr.GetO32_rs()); - } - if (instr.hasOperandAlias(rabbitizer::OperandType::cpu_rt) && !instr.modifiesRt()) { - ret |= map_reg(instr.GetO32_rt()); - } - return ret; -} - -void pass4(void) { - vector q; // TODO: Why is this called q? - uint64_t livein_func_start = 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_sp) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero); - - q.push_back(main_addr); - insns[addr_to_i(main_addr)].f_livein = livein_func_start; - - for (auto& it : data_function_pointers) { - q.push_back(it.second); - insns[addr_to_i(it.second)].f_livein = livein_func_start | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3); - } - - for (auto& addr : la_function_pointers) { - q.push_back(addr); - insns[addr_to_i(addr)].f_livein = livein_func_start | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3); - } - - while (!q.empty()) { - uint32_t addr = q.back(); - q.pop_back(); - uint32_t i = addr_to_i(addr); - Insn& insn = insns[i]; - uint64_t live = insn.f_livein | 1U; - uint64_t src_regs_map; - - switch (insn_to_type(insn)) { - case TYPE_D: - live |= get_dest_reg_mask(insn); - break; - - case TYPE_D_S: - src_regs_map = get_all_source_reg_mask(insn.instruction); - if ((live & src_regs_map) == src_regs_map) { - live |= get_dest_reg_mask(insn); - } - break; - - case TYPE_S: - case TYPE_NOP: - break; - } - - if ((insn.f_liveout | live) == insn.f_liveout) { - // No new bits - continue; - } - - live |= insn.f_liveout; - insn.f_liveout = live; - - bool function_entry = false; - - for (Edge& e : insn.successors) { - uint64_t new_live = live; - - if (e.function_exit) { - new_live &= 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero); - } else if (e.function_entry) { - new_live &= 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_sp) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero); - function_entry = true; - } else if (e.extern_function) { - string_view name; - size_t extern_function_id; - uint32_t address = insns[i - 1].getAddress(); - - // TODO: Can this only ever be a J-type instruction? - auto it = symbol_names.find(address); - const ExternFunction* found_fn = nullptr; - - if (it != symbol_names.end()) { - name = it->second; - - for (auto& fn : extern_functions) { - if (name == fn.name) { - found_fn = &fn; - break; - } - } - - if (found_fn == nullptr) { - fprintf(stderr, "missing extern function: %s\n", string(name).c_str()); - } - } - - assert(found_fn); - - char ret_type = found_fn->params[0]; - - new_live &= ~(map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1) | temporary_regs()); - - switch (ret_type) { - case 'i': - case 'u': - case 'p': - new_live |= map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0); - break; - - case 'f': - break; - - case 'd': - break; - - case 'v': - break; - - case 'l': - case 'j': - new_live |= map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1); - break; - } - } else if (e.function_pointer) { - new_live &= ~(map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1) | temporary_regs()); - new_live |= map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1); - } - - if ((insns[e.i].f_livein | new_live) != insns[e.i].f_livein) { - insns[e.i].f_livein |= new_live; - q.push_back(text_vaddr + e.i * sizeof(uint32_t)); - } - } - - if (function_entry) { - // add one edge that skips the function call, for callee-saved register liveness propagation - live &= ~(map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1) | temporary_regs()); - - if ((insns[i + 1].f_livein | live) != insns[i + 1].f_livein) { - insns[i + 1].f_livein |= live; - q.push_back(text_vaddr + (i + 1) * sizeof(uint32_t)); - } - } - } -} - -void pass5(void) { - vector q; - - assert(functions.count(main_addr)); - - q = functions[main_addr].returns; - for (auto addr : q) { - insns[addr_to_i(addr)].b_liveout = 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0); - } - - for (auto& it : data_function_pointers) { - for (auto addr : functions[it.second].returns) { - q.push_back(addr); - insns[addr_to_i(addr)].b_liveout = 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1); - } - } - - for (auto& func_addr : la_function_pointers) { - for (auto addr : functions[func_addr].returns) { - q.push_back(addr); - insns[addr_to_i(addr)].b_liveout = 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1); - } - } - - for (auto& insn : insns) { - if (insn.f_livein != 0) { - q.push_back(insn.instruction.getVram()); - } - } - - while (!q.empty()) { - uint32_t addr = q.back(); - - q.pop_back(); - - uint32_t i = addr_to_i(addr); - Insn& insn = insns[i]; - uint64_t live = insn.b_liveout | 1; - - switch (insn_to_type(insn)) { - case TYPE_S: - live |= get_all_source_reg_mask(insn.instruction); - break; - - case TYPE_D: - live &= ~get_dest_reg_mask(insn); - break; - - case TYPE_D_S: - if (live & get_dest_reg_mask(insn)) { - live &= ~get_dest_reg_mask(insn); - live |= get_all_source_reg_mask(insn.instruction); - } - break; - - case TYPE_NOP: - break; - } - - if ((insn.b_livein | live) == insn.b_livein) { - // No new bits - continue; - } - - live |= insn.b_livein; - insn.b_livein = live; - - bool function_exit = false; - - for (Edge& e : insn.predecessors) { - uint64_t new_live = live; - - if (e.function_exit) { - new_live &= 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1); - function_exit = true; - } else if (e.function_entry) { - new_live &= 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_sp); - } else if (e.extern_function) { - string_view name; - size_t extern_function_id; - const ExternFunction* found_fn = nullptr; - uint32_t address = insns[i - 2].getAddress(); - // TODO: Can this only ever be a J-type instruction? - auto it = symbol_names.find(address); - - if (it != symbol_names.end()) { - name = it->second; - for (auto& fn : extern_functions) { - if (name == fn.name) { - found_fn = &fn; - break; - } - } - } - - assert(found_fn); - - uint64_t args = 1U; - - if (found_fn->flags & FLAG_VARARG) { - // Assume the worst, that all four registers are used - for (int j = 0; j < 4; j++) { - args |= map_reg((rabbitizer::Registers::Cpu::GprO32)( - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + j)); - } - } - - int pos = 0; - int pos_float = 0; - bool only_floats_so_far = true; - - for (const char* p = found_fn->params + 1; *p != '\0'; ++p) { - switch (*p) { - case 'i': - case 'u': - case 'p': - case 't': - only_floats_so_far = false; - if (pos < 4) { - args |= map_reg((rabbitizer::Registers::Cpu::GprO32)( - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos)); - } - ++pos; - break; - - case 'f': - if (only_floats_so_far && pos_float < 4) { - pos_float += 2; - } else if (pos < 4) { - args |= map_reg((rabbitizer::Registers::Cpu::GprO32)( - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos)); - } - ++pos; - break; - - case 'd': - // !!! - if (pos % 1 != 0) { - ++pos; - } - if (only_floats_so_far && pos_float < 4) { - pos_float += 2; - } else if (pos < 4) { - args |= map_reg((rabbitizer::Registers::Cpu::GprO32)( - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos)) | - map_reg((rabbitizer::Registers::Cpu::GprO32)( - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos + 1)); - } - pos += 2; - break; - - case 'l': - case 'j': - if (pos % 1 != 0) { - ++pos; - } - only_floats_so_far = false; - if (pos < 4) { - args |= map_reg((rabbitizer::Registers::Cpu::GprO32)( - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos)) | - map_reg((rabbitizer::Registers::Cpu::GprO32)( - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos + 1)); - } - pos += 2; - break; - } - } - args |= map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_sp); - new_live &= ~(map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1) | temporary_regs()); - new_live |= args; - } else if (e.function_pointer) { - new_live &= ~(map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1) | temporary_regs()); - new_live |= map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3); - } - - if ((insns[e.i].b_liveout | new_live) != insns[e.i].b_liveout) { - insns[e.i].b_liveout |= new_live; - q.push_back(text_vaddr + e.i * sizeof(uint32_t)); - } - } - - if (function_exit) { - // add one edge that skips the function call, for callee-saved register liveness propagation - live &= ~(map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1) | temporary_regs()); - - if ((insns[i - 1].b_liveout | live) != insns[i - 1].b_liveout) { - insns[i - 1].b_liveout |= live; - q.push_back(text_vaddr + (i - 1) * sizeof(uint32_t)); - } - } - } -} - -void pass6(void) { - for (auto& it : functions) { - uint32_t addr = it.first; - Function& f = it.second; - - for (uint32_t ret : f.returns) { - Insn& i = insns[addr_to_i(ret)]; - - if (i.f_liveout & i.b_liveout & map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1)) { - f.nret = 2; - } else if ((i.f_liveout & i.b_liveout & map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)) && - f.nret == 0) { - f.nret = 1; - } - } - - Insn& insn = insns.at(addr_to_i(addr)); - - for (int i = 0; i < 4; i++) { - if (insn.f_livein & insn.b_livein & - map_reg( - (rabbitizer::Registers::Cpu::GprO32)((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + i))) { - f.nargs = 1 + i; - } - } - f.v0_in = (insn.f_livein & insn.b_livein & map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)) != 0 && - !f.referenced_by_function_pointer; - } -} - -void dump(void) { - for (size_t i = 0; i < insns.size(); i++) { - Insn& insn = insns[i]; - uint32_t vaddr = text_vaddr + i * sizeof(uint32_t); - if (label_addresses.count(vaddr)) { - if (symbol_names.count(vaddr)) { - printf("L%08x: //%s\n", vaddr, symbol_names[vaddr].c_str()); - } else { - printf("L%08x:\n", vaddr); - } - } - - // TODO: construct an immediate override for the instructions - printf("\t%s", insn.disassemble().c_str()); - if (insn.patched) { - printf("\t[patched, immediate now 0x%X]", insn.patched_addr); - } - printf("\n"); - } -} - -const char* r(uint32_t reg) { - static const char* regs[] = { - /* */ "zero", "at", "v0", "v1", - /* */ "a0", "a1", "a2", "a3", - /* */ "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", - /* */ "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", - /* */ "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra", - }; - - assert(reg < std::size(regs)); - return regs[reg]; -} - -const char* wr(uint32_t reg) { - // clang-format off - static const char *regs[] = { - "f0.w[0]", "f0.w[1]", - "f2.w[0]", "f2.w[1]", - "f4.w[0]", "f4.w[1]", - "f6.w[0]", "f6.w[1]", - "f8.w[0]", "f8.w[1]", - "f10.w[0]", "f10.w[1]", - "f12.w[0]", "f12.w[1]", - "f14.w[0]", "f14.w[1]", - "f16.w[0]", "f16.w[1]", - "f18.w[0]", "f18.w[1]", - "f20.w[0]", "f20.w[1]", - "f22.w[0]", "f22.w[1]", - "f24.w[0]", "f24.w[1]", - "f26.w[0]", "f26.w[1]", - "f28.w[0]", "f28.w[1]", - "f30.w[0]", "f30.w[1]" - }; - // clang-format on - - size_t index = reg - (int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fv0; - - assert(index < std::size(regs)); - return regs[index]; -} - -const char* fr(uint32_t reg) { - // clang-format off - static const char *regs[] = { - "f0.f[0]", "f0.f[1]", - "f2.f[0]", "f2.f[1]", - "f4.f[0]", "f4.f[1]", - "f6.f[0]", "f6.f[1]", - "f8.f[0]", "f8.f[1]", - "f10.f[0]", "f10.f[1]", - "f12.f[0]", "f12.f[1]", - "f14.f[0]", "f14.f[1]", - "f16.f[0]", "f16.f[1]", - "f18.f[0]", "f18.f[1]", - "f20.f[0]", "f20.f[1]", - "f22.f[0]", "f22.f[1]", - "f24.f[0]", "f24.f[1]", - "f26.f[0]", "f26.f[1]", - "f28.f[0]", "f28.f[1]", - "f30.f[0]", "f30.f[1]", - }; - // clang-format on - - size_t index = reg - (int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fv0; - - assert(index < std::size(regs)); - return regs[index]; -} - -const char* dr(uint32_t reg) { - // clang-format off - static const char *regs[] = { - "f0", - "f2", - "f4", - "f6", - "f8", - "f10", - "f12", - "f14", - "f16", - "f18", - "f20", - "f22", - "f24", - "f26", - "f28", - "f30" - }; - // clang-format on - - size_t index = reg - (int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fv0; - - assert(index % 2 == 0); - index /= 2; - assert(index < std::size(regs)); - return regs[index]; -} - -void dump_instr(int i); - -void dump_cond_branch(int i, const char* lhs, const char* op, const char* rhs) { - Insn& insn = insns[i]; - const char* cast1 = ""; - const char* cast2 = ""; - - if (strcmp(op, "==") && strcmp(op, "!=")) { - cast1 = "(int)"; - if (strcmp(rhs, "0")) { - cast2 = "(int)"; - } - } - printf("if (%s%s %s %s%s) {\n", cast1, lhs, op, cast2, rhs); - dump_instr(i + 1); - - uint32_t addr = insn.getAddress(); - - printf("goto L%x;}\n", addr); -} - -void dump_cond_branch_likely(int i, const char* lhs, const char* op, const char* rhs) { - uint32_t target = text_vaddr + (i + 2) * sizeof(uint32_t); - - dump_cond_branch(i, lhs, op, rhs); - if (!TRACE) { - printf("else goto L%x;\n", target); - } else { - printf("else {printf(\"pc=0x%08x (ignored)\\n\"); goto L%x;}\n", text_vaddr + (i + 1) * 4, target); - } - label_addresses.insert(target); -} - -void dump_jal(int i, uint32_t imm) { - string_view name; - auto it = symbol_names.find(imm); - const ExternFunction* found_fn = nullptr; - - // Check for an external function at the address in the immediate. If it does not exist, function is internal - if (it != symbol_names.end()) { - name = it->second; - for (auto& fn : extern_functions) { - if (name == fn.name) { - found_fn = &fn; - break; - } - } - } - - dump_instr(i + 1); - - if (found_fn != nullptr) { - if (found_fn->flags & FLAG_VARARG) { - for (int j = 0; j < 4; j++) { - printf("MEM_U32(sp + %d) = %s;\n", j * 4, r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + j)); - } - } - - const char ret_type = found_fn->params[0]; - - switch (ret_type) { - case 'v': - break; - - case 'i': - case 'u': - case 'p': - printf("%s = ", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)); - break; - - case 'f': - printf("%s = ", fr((int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fv0)); - break; - - case 'd': - printf("tempf64 = "); - break; - - case 'l': - case 'j': - printf("temp64 = "); - break; - } - - printf("wrapper_%s(", string(name).c_str()); - - bool first = true; - - if (!(found_fn->flags & FLAG_NO_MEM)) { - printf("mem"); - first = false; - } - - int pos = 0; - int pos_float = 0; - bool only_floats_so_far = true; - bool needs_sp = false; - - for (const char* p = &found_fn->params[1]; *p != '\0'; ++p) { - if (!first) { - printf(", "); - } - - first = false; - - switch (*p) { - case 't': - printf("trampoline, "); - needs_sp = true; - // fallthrough - case 'i': - case 'u': - case 'p': - only_floats_so_far = false; - if (pos < 4) { - printf("%s", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos)); - } else { - printf("MEM_%c32(sp + %d)", *p == 'i' ? 'S' : 'U', pos * 4); - } - ++pos; - break; - - case 'f': - if (only_floats_so_far && pos_float < 4) { - printf("%s", fr((int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fa0 + pos_float)); - pos_float += 2; - } else if (pos < 4) { - printf("BITCAST_U32_TO_F32(%s)", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos)); - } else { - printf("BITCAST_U32_TO_F32(MEM_U32(sp + %d))", pos * 4); - } - ++pos; - break; - - case 'd': - if (pos % 1 != 0) { - ++pos; - } - if (only_floats_so_far && pos_float < 4) { - printf("double_from_FloatReg(%s)", - dr((int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fa0 + pos_float)); - pos_float += 2; - } else if (pos < 4) { - printf("BITCAST_U64_TO_F64(((uint64_t)%s << 32) | (uint64_t)%s)", - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos), - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos + 1)); - } else { - printf("BITCAST_U64_TO_F64(((uint64_t)MEM_U32(sp + %d) << 32) | " - "(uint64_t)MEM_U32(sp + " - "%d))", - pos * 4, (pos + 1) * 4); - } - pos += 2; - break; - - case 'l': - case 'j': - if (pos % 1 != 0) { - ++pos; - } - only_floats_so_far = false; - if (*p == 'l') { - printf("(int64_t)"); - } - if (pos < 4) { - printf("(((uint64_t)%s << 32) | (uint64_t)%s)", - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos), - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos + 1)); - } else { - printf("(((uint64_t)MEM_U32(sp + %d) << 32) | (uint64_t)MEM_U32(sp + %d))", pos * 4, - (pos + 1) * 4); - } - pos += 2; - break; - } - } - - if ((found_fn->flags & FLAG_VARARG) || needs_sp) { - printf("%s%s", first ? "" : ", ", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_sp)); - } - - printf(");\n"); - - if (ret_type == 'l' || ret_type == 'j') { - printf("%s = (uint32_t)(temp64 >> 32);\n", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)); - printf("%s = (uint32_t)temp64;\n", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1)); - } else if (ret_type == 'd') { - printf("%s = FloatReg_from_double(tempf64);\n", dr((int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fv0)); - } - } else { - Function& f = functions.find(imm)->second; - - if (f.nret == 1) { - printf("v0 = "); - } else if (f.nret == 2) { - printf("temp64 = "); - } - - if (!name.empty()) { - printf("f_%s", string(name).c_str()); - } else { - printf("func_%x", imm); - } - - printf("(mem, sp"); - - if (f.v0_in) { - printf(", %s", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)); - } - - for (uint32_t i = 0; i < f.nargs; i++) { - printf(", %s", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + i)); - } - - printf(");\n"); - - if (f.nret == 2) { - printf("%s = (uint32_t)(temp64 >> 32);\n", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)); - printf("%s = (uint32_t)temp64;\n", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1)); - } - } - - printf("goto L%x;\n", text_vaddr + (i + 2) * 4); - label_addresses.insert(text_vaddr + (i + 2) * 4); -} - -void dump_instr(int i) { - Insn& insn = insns[i]; - - const char* symbol_name = NULL; - if (symbol_names.count(text_vaddr + i * sizeof(uint32_t)) != 0) { - symbol_name = symbol_names[text_vaddr + i * sizeof(uint32_t)].c_str(); - printf("//%s:\n", symbol_name); - } - - if (TRACE) { - printf("++cnt; printf(\"pc=0x%08x%s%s\\n\"); ", text_vaddr + i * 4, symbol_name ? " " : "", - symbol_name ? symbol_name : ""); - } - - uint64_t src_regs_map; - if (!insn.instruction.isJump() && !insn.instruction.isBranch() && !conservative) { - switch (insn_to_type(insn)) { - case TYPE_S: - src_regs_map = get_all_source_reg_mask(insn.instruction); - if (!((insn.f_livein & src_regs_map) == src_regs_map)) { - printf("// fdead %llx ", (unsigned long long)insn.f_livein); - } - break; - - case TYPE_D_S: { - uint64_t reg_mask = get_all_source_reg_mask(insn.instruction); - - if ((insn.f_livein & reg_mask) != reg_mask) { - printf("// fdead %llx ", (unsigned long long)insn.f_livein); - break; - } - } - // fallthrough - case TYPE_D: - if (!(insn.b_liveout & get_dest_reg_mask(insn))) { -#if 0 - printf("// %i bdead %llx %llx ", i, (unsigned long long)insn.b_liveout, - (unsigned long long)get_dest_reg_mask(insn)); -#else - printf("// bdead %llx ", (unsigned long long)insn.b_liveout); -#endif - } - break; - - case TYPE_NOP: - break; - } - } - - int32_t imm; - char buf[0x100]; - switch (insn.instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_add: - case rabbitizer::InstrId::UniqueId::cpu_addu: - if (insn.instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero) { - printf("%s = %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rt())); - } else if (insn.instruction.GetO32_rt() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero) { - printf("%s = %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs())); - } else { - printf("%s = %s + %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - } - break; - - case rabbitizer::InstrId::UniqueId::cpu_add_s: - printf("%s = %s + %s;\n", fr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs()), - fr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_add_d: - printf("%s = FloatReg_from_double(double_from_FloatReg(%s) + double_from_FloatReg(%s));\n", - dr((int)insn.instruction.GetO32_fd()), dr((int)insn.instruction.GetO32_fs()), - dr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_addi: - case rabbitizer::InstrId::UniqueId::cpu_addiu: - imm = insn.getImmediate(); - if (insn.instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero) { - printf("%s = 0x%x;\n", r((int)insn.instruction.GetO32_rt()), imm); - } else { - printf("%s = %s + 0x%x;\n", r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs()), - imm); - } - break; - - case rabbitizer::InstrId::UniqueId::cpu_and: - printf("%s = %s & %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_andi: - imm = insn.getImmediate(); - printf("%s = %s & 0x%x;\n", r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs()), - imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_beq: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), "==", r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_beql: - dump_cond_branch_likely(i, r((int)insn.instruction.GetO32_rs()), - "==", r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bgez: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), ">=", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bgezl: - dump_cond_branch_likely(i, r((int)insn.instruction.GetO32_rs()), ">=", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bgtz: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), ">", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bgtzl: - dump_cond_branch_likely(i, r((int)insn.instruction.GetO32_rs()), ">", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_blez: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), "<=", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_blezl: - dump_cond_branch_likely(i, r((int)insn.instruction.GetO32_rs()), "<=", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bltz: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), "<", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bltzl: - dump_cond_branch_likely(i, r((int)insn.instruction.GetO32_rs()), "<", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bne: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), "!=", r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bnel: - dump_cond_branch_likely(i, r((int)insn.instruction.GetO32_rs()), - "!=", r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_break: - printf("abort();\n"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_beqz: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), "==", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_b: - dump_instr(i + 1); - imm = insn.getAddress(); - printf("goto L%x;\n", imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bc1f: - printf("if (!cf) {\n"); - dump_instr(i + 1); - imm = insn.getAddress(); - printf("goto L%x;}\n", imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bc1t: - printf("if (cf) {\n"); - dump_instr(i + 1); - imm = insn.getAddress(); - printf("goto L%x;}\n", imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bc1fl: { - uint32_t target = text_vaddr + (i + 2) * sizeof(uint32_t); - printf("if (!cf) {\n"); - dump_instr(i + 1); - imm = insn.getAddress(); - printf("goto L%x;}\n", imm); - if (!TRACE) { - printf("else goto L%x;\n", target); - } else { - printf("else {printf(\"pc=0x%08x (ignored)\\n\"); goto L%x;}\n", text_vaddr + (i + 1) * 4, target); - } - label_addresses.insert(target); - } break; - - case rabbitizer::InstrId::UniqueId::cpu_bc1tl: { - uint32_t target = text_vaddr + (i + 2) * sizeof(uint32_t); - printf("if (cf) {\n"); - dump_instr(i + 1); - imm = insn.getAddress(); - printf("goto L%x;}\n", imm); - if (!TRACE) { - printf("else goto L%x;\n", target); - } else { - printf("else {printf(\"pc=0x%08x (ignored)\\n\"); goto L%x;}\n", text_vaddr + (i + 1) * 4, target); - } - label_addresses.insert(target); - } break; - - case rabbitizer::InstrId::UniqueId::cpu_bnez: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), "!=", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_c_lt_s: - printf("cf = %s < %s;\n", fr((int)insn.instruction.GetO32_fs()), fr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_c_le_s: - printf("cf = %s <= %s;\n", fr((int)insn.instruction.GetO32_fs()), fr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_c_eq_s: - printf("cf = %s == %s;\n", fr((int)insn.instruction.GetO32_fs()), fr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_c_lt_d: - printf("cf = double_from_FloatReg(%s) < double_from_FloatReg(%s);\n", dr((int)insn.instruction.GetO32_fs()), - dr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_c_le_d: - printf("cf = double_from_FloatReg(%s) <= double_from_FloatReg(%s);\n", - dr((int)insn.instruction.GetO32_fs()), dr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_c_eq_d: - printf("cf = double_from_FloatReg(%s) == double_from_FloatReg(%s);\n", - dr((int)insn.instruction.GetO32_fs()), dr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_cvt_s_w: - printf("%s = (int)%s;\n", fr((int)insn.instruction.GetO32_fd()), wr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_cvt_d_w: - printf("%s = FloatReg_from_double((int)%s);\n", dr((int)insn.instruction.GetO32_fd()), - wr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_cvt_d_s: - printf("%s = FloatReg_from_double(%s);\n", dr((int)insn.instruction.GetO32_fd()), - fr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_cvt_s_d: - printf("%s = double_from_FloatReg(%s);\n", fr((int)insn.instruction.GetO32_fd()), - dr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_cvt_w_d: - printf("%s = cvt_w_d(double_from_FloatReg(%s));\n", wr((int)insn.instruction.GetO32_fd()), - dr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_cvt_w_s: - printf("%s = cvt_w_s(%s);\n", wr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_cvt_l_d: - case rabbitizer::InstrId::UniqueId::cpu_cvt_l_s: - case rabbitizer::InstrId::UniqueId::cpu_cvt_s_l: - case rabbitizer::InstrId::UniqueId::cpu_cvt_d_l: - goto unimplemented; - - case rabbitizer::InstrId::UniqueId::cpu_cfc1: - assert(insn.instruction.Get_cop1cs() == rabbitizer::Registers::Cpu::Cop1Control::COP1_CONTROL_FpcCsr); - printf("%s = fcsr;\n", r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_ctc1: - assert(insn.instruction.Get_cop1cs() == rabbitizer::Registers::Cpu::Cop1Control::COP1_CONTROL_FpcCsr); - printf("fcsr = %s;\n", r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_div: - printf("lo = (int)%s / (int)%s; ", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - printf("hi = (int)%s %% (int)%s;\n", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_divu: - printf("lo = %s / %s; ", r((int)insn.instruction.GetO32_rs()), r((int)insn.instruction.GetO32_rt())); - printf("hi = %s %% %s;\n", r((int)insn.instruction.GetO32_rs()), r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_div_s: - printf("%s = %s / %s;\n", fr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs()), - fr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_div_d: - printf("%s = FloatReg_from_double(double_from_FloatReg(%s) / double_from_FloatReg(%s));\n", - dr((int)insn.instruction.GetO32_fd()), dr((int)insn.instruction.GetO32_fs()), - dr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mov_s: - printf("%s = %s;\n", fr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mov_d: - printf("%s = %s;\n", dr((int)insn.instruction.GetO32_fd()), dr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mul_s: - printf("%s = %s * %s;\n", fr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs()), - fr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mul_d: - printf("%s = FloatReg_from_double(double_from_FloatReg(%s) * double_from_FloatReg(%s));\n", - dr((int)insn.instruction.GetO32_fd()), dr((int)insn.instruction.GetO32_fs()), - dr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_negu: - printf("%s = -%s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_neg_s: - printf("%s = -%s;\n", fr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_neg_d: - printf("%s = FloatReg_from_double(-double_from_FloatReg(%s));\n", dr((int)insn.instruction.GetO32_fd()), - dr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sub: - if (insn.instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero) { - printf("%s = -%s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rt())); - break; - } else { - goto unimplemented; - } - - case rabbitizer::InstrId::UniqueId::cpu_sub_s: - printf("%s = %s - %s;\n", fr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs()), - fr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sub_d: - printf("%s = FloatReg_from_double(double_from_FloatReg(%s) - double_from_FloatReg(%s));\n", - dr((int)insn.instruction.GetO32_fd()), dr((int)insn.instruction.GetO32_fs()), - dr((int)insn.instruction.GetO32_ft())); - break; - - // Jumps - - case rabbitizer::InstrId::UniqueId::cpu_j: - dump_instr(i + 1); - imm = insn.getAddress(); - printf("goto L%x;\n", imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_jal: - imm = insn.getAddress(); - dump_jal(i, imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_jalr: - printf("fp_dest = %s;\n", r((int)insn.instruction.GetO32_rs())); - dump_instr(i + 1); - printf("temp64 = trampoline(mem, sp, %s, %s, %s, %s, fp_dest);\n", - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0), - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1), - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2), - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3)); - printf("%s = (uint32_t)(temp64 >> 32);\n", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)); - printf("%s = (uint32_t)temp64;\n", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1)); - printf("goto L%x;\n", text_vaddr + (i + 2) * 4); - label_addresses.insert(text_vaddr + (i + 2) * 4); - break; - - case rabbitizer::InstrId::UniqueId::cpu_jr: - // TODO: understand why the switch version fails, and why only it needs the nop - if (insn.jtbl_addr != 0) { - uint32_t jtbl_pos = insn.jtbl_addr - rodata_vaddr; - - assert(jtbl_pos < rodata_section_len && - jtbl_pos + insn.num_cases * sizeof(uint32_t) <= rodata_section_len); -#if 1 - printf(";static void *const Lswitch%x[] = {\n", insn.jtbl_addr); - - for (uint32_t i = 0; i < insn.num_cases; i++) { - uint32_t dest_addr = read_u32_be(rodata_section + jtbl_pos + i * sizeof(uint32_t)) + gp_value; - printf("&&L%x,\n", dest_addr); - label_addresses.insert(dest_addr); - } - - printf("};\n"); - printf("dest = Lswitch%x[%s];\n", insn.jtbl_addr, r((int)insn.index_reg)); - dump_instr(i + 1); - printf("goto *dest;\n"); -#else - // This block produces a switch instead of an array of labels. - // It is not being used because currently it is a bit bugged. - // It has been keep as a reference and with the main intention to fix it - - assert(insns[i + 1].id == MIPS_INS_NOP); - printf("switch (%s) {\n", r(insn.index_reg)); - - for (uint32_t i = 0; i < insn.num_cases; i++) { - uint32_t dest_addr = read_u32_be(rodata_section + jtbl_pos + i * sizeof(uint32_t)) + gp_value; - printf("case %u: goto L%x;\n", i, dest_addr); - label_addresses.insert(dest_addr); - } - - printf("}\n"); -#endif - } else { - if (insn.instruction.GetO32_rs() != rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra) { - printf("UNSUPPORTED JR %s (no jumptable available)\n", r((int)insn.instruction.GetO32_rs())); - } else { - dump_instr(i + 1); - switch (find_function(text_vaddr + i * sizeof(uint32_t))->second.nret) { - case 0: - printf("return;\n"); - break; - - case 1: - printf("return v0;\n"); - break; - - case 2: - printf("return ((uint64_t)v0 << 32) | v1;\n"); - break; - } - } - } - break; - - case rabbitizer::InstrId::UniqueId::cpu_lb: - imm = insn.getImmediate(); - printf("%s = MEM_S8(%s + %d);\n", r((int)insn.instruction.GetO32_rt()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_lbu: - imm = insn.getImmediate(); - printf("%s = MEM_U8(%s + %d);\n", r((int)insn.instruction.GetO32_rt()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_lh: - imm = insn.getImmediate(); - printf("%s = MEM_S16(%s + %d);\n", r((int)insn.instruction.GetO32_rt()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_lhu: - imm = insn.getImmediate(); - printf("%s = MEM_U16(%s + %d);\n", r((int)insn.instruction.GetO32_rt()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_lui: - imm = insn.getImmediate(); - printf("%s = 0x%x;\n", r((int)insn.instruction.GetO32_rt()), imm << 16); - break; - - case rabbitizer::InstrId::UniqueId::cpu_lw: - imm = insn.getImmediate(); - printf("%s = MEM_U32(%s + %d);\n", r((int)insn.instruction.GetO32_rt()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_lwc1: - imm = insn.getImmediate(); - printf("%s = MEM_U32(%s + %d);\n", wr((int)insn.instruction.GetO32_ft()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_ldc1: - imm = insn.getImmediate(); - assert(((int)insn.instruction.GetO32_ft() - (int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fv0) % 2 == - 0); - printf("%s = MEM_U32(%s + %d);\n", wr((int)insn.instruction.GetO32_ft() + 1), - r((int)insn.instruction.GetO32_rs()), imm); - printf("%s = MEM_U32(%s + %d + 4);\n", wr((int)insn.instruction.GetO32_ft()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_lwl: { - const char* reg = r((int)insn.instruction.GetO32_rt()); - - imm = insn.getImmediate(); - - printf("%s = %s + %d; ", reg, r((int)insn.instruction.GetO32_rs()), imm); - printf("%s = ((uint32_t)MEM_U8(%s) << 24) | (MEM_U8(%s + 1) << 16) | (MEM_U8(%s + 2) << 8) | MEM_U8(%s + 3);\n", reg, - reg, reg, reg, reg); - } break; - - case rabbitizer::InstrId::UniqueId::cpu_lwr: - printf("//%s\n", insn.disassemble().c_str()); - break; - - case UniqueId_cpu_la: { - uint32_t addr = insn.getAddress(); - - printf("%s = 0x%x;", r((int)insn.lila_dst_reg), addr); - if ((text_vaddr <= addr) && (addr < text_vaddr + text_section_len)) { - printf(" // function pointer"); - label_addresses.insert(addr); - } - printf("\n"); - } break; - - case UniqueId_cpu_li: - imm = insn.getImmediate(); - - printf("%s = 0x%x;\n", r((int)insn.lila_dst_reg), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mfc1: - printf("%s = %s;\n", r((int)insn.instruction.GetO32_rt()), wr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mfhi: - printf("%s = hi;\n", r((int)insn.instruction.GetO32_rd())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mflo: - printf("%s = lo;\n", r((int)insn.instruction.GetO32_rd())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_move: - printf("%s = %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mtc1: - printf("%s = %s;\n", wr((int)insn.instruction.GetO32_fs()), r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mult: - printf("lo = %s * %s;\n", r((int)insn.instruction.GetO32_rs()), r((int)insn.instruction.GetO32_rt())); - printf("hi = (uint32_t)((int64_t)(int)%s * (int64_t)(int)%s >> 32);\n", - r((int)insn.instruction.GetO32_rs()), r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_multu: - printf("lo = %s * %s;\n", r((int)insn.instruction.GetO32_rs()), r((int)insn.instruction.GetO32_rt())); - printf("hi = (uint32_t)((uint64_t)%s * (uint64_t)%s >> 32);\n", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sqrt_s: - printf("%s = sqrtf(%s);\n", fr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_nor: - printf("%s = ~(%s | %s);\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_not: - printf("%s = ~%s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_or: - printf("%s = %s | %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_ori: - imm = insn.getImmediate(); - printf("%s = %s | 0x%x;\n", r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs()), - imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sb: - imm = insn.getImmediate(); - printf("MEM_U8(%s + %d) = (uint8_t)%s;\n", r((int)insn.instruction.GetO32_rs()), imm, - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sh: - imm = insn.getImmediate(); - printf("MEM_U16(%s + %d) = (uint16_t)%s;\n", r((int)insn.instruction.GetO32_rs()), imm, - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sll: - printf("%s = %s << %d;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rt()), - insn.instruction.Get_sa()); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sllv: - printf("%s = %s << (%s & 0x1f);\n", r((int)insn.instruction.GetO32_rd()), - r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_slt: - printf("%s = (int)%s < (int)%s;\n", r((int)insn.instruction.GetO32_rd()), - r((int)insn.instruction.GetO32_rs()), r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_slti: - imm = insn.getImmediate(); - printf("%s = (int)%s < (int)0x%x;\n", r((int)insn.instruction.GetO32_rt()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sltiu: - imm = insn.getImmediate(); - printf("%s = %s < 0x%x;\n", r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs()), - imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sltu: - printf("%s = %s < %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sra: - printf("%s = (int)%s >> %d;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rt()), - insn.instruction.Get_sa()); - break; - - case rabbitizer::InstrId::UniqueId::cpu_srav: - printf("%s = (int)%s >> (%s & 0x1f);\n", r((int)insn.instruction.GetO32_rd()), - r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_srl: - printf("%s = %s >> %d;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rt()), - insn.instruction.Get_sa()); - break; - - case rabbitizer::InstrId::UniqueId::cpu_srlv: - printf("%s = %s >> (%s & 0x1f);\n", r((int)insn.instruction.GetO32_rd()), - r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_subu: - printf("%s = %s - %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sw: - imm = insn.getImmediate(); - printf("MEM_U32(%s + %d) = %s;\n", r((int)insn.instruction.GetO32_rs()), imm, - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_swc1: - imm = insn.getImmediate(); - printf("MEM_U32(%s + %d) = %s;\n", r((int)insn.instruction.GetO32_rs()), imm, - wr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sdc1: - assert(((int)insn.instruction.GetO32_ft() - (int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fv0) % 2 == - 0); - imm = insn.getImmediate(); - printf("MEM_U32(%s + %d) = %s;\n", r((int)insn.instruction.GetO32_rs()), imm, - wr((int)insn.instruction.GetO32_ft() + 1)); - printf("MEM_U32(%s + %d + 4) = %s;\n", r((int)insn.instruction.GetO32_rs()), imm, - wr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_swl: - imm = insn.getImmediate(); - for (int i = 0; i < 4; i++) { - printf("MEM_U8(%s + %d + %d) = (uint8_t)(%s >> %d);\n", r((int)insn.instruction.GetO32_rs()), imm, i, - r((int)insn.instruction.GetO32_rt()), (3 - i) * 8); - } - break; - - case rabbitizer::InstrId::UniqueId::cpu_swr: - printf("//%s\n", insn.disassemble().c_str()); - break; - - case rabbitizer::InstrId::UniqueId::cpu_trunc_w_s: - printf("%s = (int)%s;\n", wr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_trunc_w_d: - printf("%s = (int)double_from_FloatReg(%s);\n", wr((int)insn.instruction.GetO32_fd()), - dr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_trunc_l_d: - case rabbitizer::InstrId::UniqueId::cpu_trunc_l_s: - goto unimplemented; - - case rabbitizer::InstrId::UniqueId::cpu_xor: - printf("%s = %s ^ %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_xori: - imm = insn.getImmediate(); - printf("%s = %s ^ 0x%x;\n", r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs()), - imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_tne: - imm = insn.instruction.Get_code_lower(); - printf("assert(%s == %s && \"tne %d\");\n", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_teq: - imm = insn.instruction.Get_code_lower(); - printf("assert(%s != %s && \"teq %d\");\n", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_tge: - imm = insn.instruction.Get_code_lower(); - printf("assert((int)%s < (int)%s && \"tge %d\");\n", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_tgeu: - imm = insn.instruction.Get_code_lower(); - printf("assert(%s < %s && \"tgeu %d\");\n", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_tlt: - imm = insn.instruction.Get_code_lower(); - printf("assert((int)%s >= (int)%s && \"tlt %d\");\n", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_nop: - printf("//nop;\n"); - break; - - default: - unimplemented: - printf("UNIMPLEMENTED 0x%X : %s\n", insn.instruction.getRaw(), insn.disassemble().c_str()); - break; - } -} - -void inspect_data_function_pointers(vector>& ret, const uint8_t* section, - uint32_t section_vaddr, uint32_t len) { - for (uint32_t i = 0; i < len; i += 4) { - uint32_t addr = read_u32_be(section + i); - - if (addr == 0x430b00 || addr == 0x433b00) { - // in as1, not function pointers (normal integers) - continue; - } - - if (addr == 0x4a0000) { - // in copt - continue; - } - - if (section_vaddr + i >= procedure_table_start && - section_vaddr + i < procedure_table_start + procedure_table_len) { - // some linking table with a "all" functions, in as1 5.3 - continue; - } - - if ((addr >= text_vaddr) && (addr < text_vaddr + text_section_len) && ((addr % 4) == 0)) { -#if INSPECT_FUNCTION_POINTERS - fprintf(stderr, "assuming function pointer 0x%x at 0x%x\n", addr, section_vaddr + i); -#endif - ret.push_back(make_pair(section_vaddr + i, addr)); - label_addresses.insert(addr); - functions[addr].referenced_by_function_pointer = true; - } - } -} - -void dump_function_signature(Function& f, uint32_t vaddr) { - printf("static "); - switch (f.nret) { - case 0: - printf("void "); - break; - - case 1: - printf("uint32_t "); - break; - - case 2: - printf("uint64_t "); - break; - } - - auto name_it = symbol_names.find(vaddr); - - if (name_it != symbol_names.end()) { - printf("f_%s", name_it->second.c_str()); - } else { - printf("func_%x", vaddr); - } - - printf("(uint8_t *mem, uint32_t sp"); - - if (f.v0_in) { - printf(", uint32_t %s", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)); - } - - for (uint32_t i = 0; i < f.nargs; i++) { - printf(", uint32_t %s", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + i)); - } - - printf(")"); -} - -void dump_c(void) { - map symbol_names_inv; - - for (auto& it : symbol_names) { - symbol_names_inv[it.second] = it.first; - } - - uint32_t min_addr = UINT32_MAX; - uint32_t max_addr = 0; - - if (data_section_len > 0) { - min_addr = std::min(min_addr, data_vaddr); - max_addr = std::max(max_addr, data_vaddr + data_section_len); - } - if (rodata_section_len > 0) { - min_addr = std::min(min_addr, rodata_vaddr); - max_addr = std::max(max_addr, rodata_vaddr + rodata_section_len); - } - if (bss_section_len) { - min_addr = std::min(min_addr, bss_vaddr); - max_addr = std::max(max_addr, bss_vaddr + bss_section_len); - } - - // 64 kB. Supposedly the worst-case smallest permitted page size, increase if necessary. - // Ensures the hardcoded min_addr and max_addr are sufficiently aligned for the machine running the - // recompiled binaries (and not just the one doing the original recomp build). - uint32_t page_size = 0x10000; - - min_addr = min_addr & ~(page_size - 1); - max_addr = (max_addr + (page_size - 1)) & ~(page_size - 1); - - uint32_t stack_bottom = min_addr; - min_addr -= 0x100000; // 1 MB stack - stack_bottom -= 0x10; // for main's stack frame - - printf("#include \"header.h\"\n"); - - if (conservative) { - printf("static uint32_t s0, s1, s2, s3, s4, s5, s6, s7, fp;\n"); - } - - printf("static const uint32_t rodata[] = {\n"); - - for (size_t i = 0; i < rodata_section_len; i += 4) { - printf("0x%x,%s", read_u32_be(rodata_section + i), i % 32 == 28 ? "\n" : ""); - } - - printf("};\n"); - printf("static const uint32_t data[] = {\n"); - - for (size_t i = 0; i < data_section_len; i += 4) { - printf("0x%x,%s", read_u32_be(data_section + i), i % 32 == 28 ? "\n" : ""); - } - - printf("};\n"); - - /* if (!data_function_pointers.empty()) { - printf("static const struct { uint32_t orig_addr; void *recompiled_addr; } data_function_pointers[] = {\n"); - for (auto item : data_function_pointers) { - printf("{0x%x, &&L%x},\n", item.first, item.second); - } - printf("};\n"); - } */ - - if (TRACE) { - printf("static unsigned long long int cnt = 0;\n"); - } - - for (auto& f_it : functions) { - uint32_t addr = f_it.first; - auto& ins = insns.at(addr_to_i(addr)); - - if (ins.f_livein != 0) { - // Function is used - dump_function_signature(f_it.second, addr); - printf(";\n"); - } - } - - if (!data_function_pointers.empty() || !la_function_pointers.empty()) { - printf("uint64_t trampoline(uint8_t *mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, " - "uint32_t fp_dest) {\n"); - printf("switch (fp_dest) {\n"); - - for (auto& it : functions) { - Function& f = it.second; - - if (f.referenced_by_function_pointer) { - printf("case 0x%x: ", it.first); - - if (f.nret == 1) { - printf("return (uint64_t)"); - } else if (f.nret == 2) { - printf("return "); - } - - auto name_it = symbol_names.find(it.first); - - if (name_it != symbol_names.end()) { - printf("f_%s", name_it->second.c_str()); - } else { - printf("func_%x", it.first); - } - - printf("(mem, sp"); - - for (unsigned int i = 0; i < f.nargs; i++) { - printf(", a%d", i); - } - - printf(")"); - - if (f.nret == 1) { - printf(" << 32"); - } - - printf(";"); - - if (f.nret == 0) { - printf(" return 0;"); - } - - printf("\n"); - } - } - - printf("default: abort();"); - printf("}\n"); - printf("}\n"); - } - - printf("int run(uint8_t *mem, int argc, char *argv[]) {\n"); - printf("mmap_initial_data_range(mem, 0x%x, 0x%x);\n", min_addr, max_addr); - - printf("memcpy(mem + 0x%x, rodata, 0x%x);\n", rodata_vaddr, rodata_section_len); - printf("memcpy(mem + 0x%x, data, 0x%x);\n", data_vaddr, data_section_len); - - /* if (!data_function_pointers.empty()) { - if (!LABELS_64_BIT) { - printf("for (int i = 0; i < %d; i++) MEM_U32(data_function_pointers[i].orig_addr) = - (uint32_t)(uintptr_t)data_function_pointers[i].recompiled_addr;\n", (int)data_function_pointers.size()); } else { - printf("for (int i = 0; i < %d; i++) MEM_U32(data_function_pointers[i].orig_addr) = - (uint32_t)((uintptr_t)data_function_pointers[i].recompiled_addr - (uintptr_t)&&Loffset);\n", - (int)data_function_pointers.size()); - } - } */ - - printf("MEM_S32(0x%x) = argc;\n", symbol_names_inv.at("__Argc")); - printf("MEM_S32(0x%x) = argc;\n", stack_bottom); - printf("uint32_t al = argc * 4; for (int i = 0; i < argc; i++) al += strlen(argv[i]) + 1;\n"); - printf("uint32_t arg_addr = wrapper_malloc(mem, al);\n"); - printf("MEM_U32(0x%x) = arg_addr;\n", symbol_names_inv.at("__Argv")); - printf("MEM_U32(0x%x) = arg_addr;\n", stack_bottom + 4); - printf("uint32_t arg_strpos = arg_addr + argc * 4;\n"); - printf("for (int i = 0; i < argc; i++) {MEM_U32(arg_addr + i * 4) = arg_strpos; uint32_t p = 0; do { " - "MEM_S8(arg_strpos) = argv[i][p]; ++arg_strpos; } while (argv[i][p++] != '\\0');}\n"); - - printf("setup_libc_data(mem);\n"); - - // printf("gp = 0x%x;\n", gp_value); // only to recreate the outcome when ugen reads uninitialized stack memory - - printf("int ret = f_main(mem, 0x%x", stack_bottom); - - Function& main_func = functions[main_addr]; - - if (main_func.nargs >= 1) { - printf(", argc"); - } - - if (main_func.nargs >= 2) { - printf(", arg_addr"); - } - - printf(");\n"); - - if (TRACE) { - printf("end: fprintf(stderr, \"cnt: %%llu\\n\", cnt);\n"); - } - - printf("return ret;\n"); - printf("}\n"); - - for (auto& f_it : functions) { - Function& f = f_it.second; - uint32_t start_addr = f_it.first; - uint32_t end_addr = f.end_addr; - - if (insns[addr_to_i(start_addr)].f_livein == 0) { - // Non-used function, skip - continue; - } - - printf("\n"); - dump_function_signature(f, start_addr); - printf(" {\n"); - printf("const uint32_t zero = 0;\n"); - - if (!conservative) { - printf("uint32_t at = 0, v1 = 0, t0 = 0, t1 = 0, t2 = 0,\n"); - printf("t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, s0 = 0, s1 = 0, s2 = 0, s3 = 0, s4 = 0, s5 = 0,\n"); - printf("s6 = 0, s7 = 0, t8 = 0, t9 = 0, gp = 0, fp = 0, s8 = 0, ra = 0;\n"); - } else { - printf("uint32_t at = 0, v1 = 0, t0 = 0, t1 = 0, t2 = 0,\n"); - printf("t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, t8 = 0, t9 = 0, gp = 0x10000, ra = 0x10000;\n"); - } - - printf("uint32_t lo = 0, hi = 0;\n"); - printf("int cf = 0;\n"); - printf("uint64_t temp64;\n"); - printf("double tempf64;\n"); - printf("uint32_t fp_dest;\n"); - printf("void *dest;\n"); - - if (!f.v0_in) { - printf("uint32_t v0 = 0;\n"); - } - - for (uint32_t j = f.nargs; j < 4; j++) { - printf("uint32_t %s = 0;\n", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + j)); - } - - for (size_t i = addr_to_i(start_addr), end_i = addr_to_i(end_addr); i < end_i; i++) { - Insn& insn = insns[i]; - uint32_t vaddr = text_vaddr + i * 4; - if (label_addresses.count(vaddr)) { - printf("L%x:\n", vaddr); - } -#if DUMP_INSTRUCTIONS - printf("// %s:\n", insn.disassemble().c_str()); -#endif - dump_instr(i); - } - - printf("}\n"); - } - /* for (size_t i = 0; i < insns.size(); i++) { - Insn& insn = insns[i]; - uint32_t vaddr = text_vaddr + i * 4; - auto fn_it = functions.find(vaddr); - - if (fn_it != functions.end()) { - Function& f = fn_it->second; - - printf("}\n\n"); - - switch (f.nret) { - case 0: - printf("void "); - break; - - case 1: - printf("uint32_t "); - break; - - case 2: - printf("uint64_t "); - break; - } - - auto name_it = symbol_names.find(vaddr); - - if (name_it != symbol_names.end()) { - printf("%s", name_it->second.c_str()); - } else { - printf("func_%x", vaddr); - } - - printf("(uint8_t *mem, uint32_t sp"); - - if (f.v0_in) { - printf(", uint32_t %s", r(MIPS_REG_V0)); - } - - for (uint32_t i = 0; i < f.nargs; i++) { - printf(", uint32_t %s", r(MIPS_REG_A0 + i)); - } - - printf(") {\n"); - printf("const uint32_t zero = 0;\n"); - printf("uint32_t at = 0, v1 = 0, t0 = 0, t1 = 0, t2 = 0,\n"); - printf("t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, s0 = 0, s1 = 0, s2 = 0, s3 = 0, s4 = 0, s5 = 0,\n"); - printf("s6 = 0, s7 = 0, t8 = 0, t9 = 0, gp = 0, fp = 0, s8 = 0, ra = 0;\n"); - printf("uint32_t lo = 0, hi = 0;\n"); - printf("int cf = 0;\n"); - - if (!f.v0_in) { - printf("uint32_t v0 = 0;\n"); - } - - for (uint32_t j = f.nargs; j < 4; j++) { - printf("uint32_t %s = 0;\n", r(MIPS_REG_A0 + j)); - } - } - - if (label_addresses.count(vaddr)) { - printf("L%x:\n", vaddr); - } - - dump_instr(i); - } */ -} - -void parse_elf(const uint8_t* data, size_t file_len) { - Elf32_Ehdr* ehdr; - Elf32_Shdr *shdr, *str_shdr, *sym_shdr = NULL, *dynsym_shdr, *dynamic_shdr, *reginfo_shdr, *got_shdr, - *sym_strtab = NULL, *sym_dynstr; - int text_section_index = -1; - int symtab_section_index = -1; - int dynsym_section_index = -1; - int reginfo_section_index = -1; - int dynamic_section_index = -1; - int got_section_index = -1; - int rodata_section_index = -1; - int data_section_index = -1; - int bss_section_index = -1; - uint32_t text_offset = 0; - uint32_t vaddr_adj = 0; - - if (file_len < 4 || data[0] != 0x7f || data[1] != 'E' || data[2] != 'L' || data[3] != 'F') { - fprintf(stderr, "Not an ELF file.\n"); - exit(EXIT_FAILURE); - } - - ehdr = (Elf32_Ehdr*)data; - if (ehdr->e_ident[EI_DATA] != 2 || u16be(ehdr->e_machine) != 8) { - fprintf(stderr, "Not big-endian MIPS.\n"); - exit(EXIT_FAILURE); - } - - if (u16be(ehdr->e_shstrndx) == 0) { - // (We could look at program headers instead in this case.) - fprintf(stderr, "Missing section headers; stripped binaries are not yet supported.\n"); - exit(EXIT_FAILURE); - } - -#define SECTION(index) (Elf32_Shdr*)(data + u32be(ehdr->e_shoff) + (index)*u16be(ehdr->e_shentsize)) -#define STR(strtab, offset) (const char*)(data + u32be(strtab->sh_offset) + offset) - - str_shdr = SECTION(u16be(ehdr->e_shstrndx)); - for (int i = 0; i < u16be(ehdr->e_shnum); i++) { - shdr = SECTION(i); - - const char* name = STR(str_shdr, u32be(shdr->sh_name)); - - if (strcmp(name, ".text") == 0) { - text_offset = u32be(shdr->sh_offset); - text_vaddr = u32be(shdr->sh_addr); - vaddr_adj = text_vaddr - u32be(shdr->sh_addr); - text_section_len = u32be(shdr->sh_size); - text_section = data + text_offset; - text_section_index = i; - } - - if (u32be(shdr->sh_type) == SHT_SYMTAB) { - symtab_section_index = i; - } - - if (u32be(shdr->sh_type) == SHT_DYNSYM) { - dynsym_section_index = i; - } - - if (u32be(shdr->sh_type) == SHT_MIPS_REGINFO) { - reginfo_section_index = i; - } - - if (u32be(shdr->sh_type) == SHT_DYNAMIC) { - dynamic_section_index = i; - } - - if (strcmp(name, ".got") == 0) { - got_section_index = i; - } - - if (strcmp(name, ".rodata") == 0) { - rodata_section_index = i; - } - - if (strcmp(name, ".data") == 0) { - data_section_index = i; - } - - if (strcmp(name, ".bss") == 0) { - bss_section_index = i; - } - } - - if (text_section_index == -1) { - fprintf(stderr, "Missing .text section.\n"); - exit(EXIT_FAILURE); - } - - if (symtab_section_index == -1 && dynsym_section_index == -1) { - fprintf(stderr, "Missing .symtab or .dynsym section.\n"); - exit(EXIT_FAILURE); - } - - if (dynsym_section_index != -1) { - if (reginfo_section_index == -1) { - fprintf(stderr, "Missing .reginfo section.\n"); - exit(EXIT_FAILURE); - } - - if (dynamic_section_index == -1) { - fprintf(stderr, "Missing .dynamic section.\n"); - exit(EXIT_FAILURE); - } - - if (got_section_index == -1) { - fprintf(stderr, "Missing .got section.\n"); - exit(EXIT_FAILURE); - } - } - - if (rodata_section_index != -1) { - shdr = SECTION(rodata_section_index); - uint32_t size = u32be(shdr->sh_size); - rodata_section = data + u32be(shdr->sh_offset); - rodata_section_len = size; - rodata_vaddr = u32be(shdr->sh_addr); - } - - if (data_section_index != -1) { - shdr = SECTION(data_section_index); - uint32_t size = u32be(shdr->sh_size); - data_section = data + u32be(shdr->sh_offset); - data_section_len = size; - data_vaddr = u32be(shdr->sh_addr); - } - - if (bss_section_index != -1) { - shdr = SECTION(bss_section_index); - uint32_t size = u32be(shdr->sh_size); - bss_section_len = size; - bss_vaddr = u32be(shdr->sh_addr); - } - - // add symbols - if (symtab_section_index != -1) { - sym_shdr = SECTION(symtab_section_index); - sym_strtab = SECTION(u32be(sym_shdr->sh_link)); - assert(0 && ".symtab not supported - use a program with .dynsym instead"); - - assert(u32be(sym_shdr->sh_entsize) == sizeof(Elf32_Sym)); - for (uint32_t i = 0; i < u32be(sym_shdr->sh_size); i += sizeof(Elf32_Sym)) { - Elf32_Sym* sym = (Elf32_Sym*)(data + u32be(sym_shdr->sh_offset) + i); - const char* name = STR(sym_strtab, u32be(sym->st_name)); - uint32_t addr = u32be(sym->st_value); - - if (u16be(sym->st_shndx) != text_section_index || name[0] == '.') { - continue; - } - - addr += vaddr_adj; - // disasm_label_add(state, name, addr, u32be(sym->st_size), true); - } - } - - if (dynsym_section_index != -1) { - dynsym_shdr = SECTION(dynsym_section_index); - sym_dynstr = SECTION(u32be(dynsym_shdr->sh_link)); - reginfo_shdr = SECTION(reginfo_section_index); - dynamic_shdr = SECTION(dynamic_section_index); - got_shdr = SECTION(got_section_index); - - Elf32_RegInfo* reg_info = (Elf32_RegInfo*)(data + u32be(reginfo_shdr->sh_offset)); - uint32_t gp_base = u32be(reg_info->ri_gp_value); // gp should have this value through the program run - uint32_t got_start = 0; - uint32_t local_got_no = 0; - uint32_t first_got_sym = 0; - uint32_t dynsym_no = 0; // section size can't be used due to alignment 16 padding - - assert(u32be(dynamic_shdr->sh_entsize) == sizeof(Elf32_Dyn)); - for (uint32_t i = 0; i < u32be(dynamic_shdr->sh_size); i += sizeof(Elf32_Dyn)) { - Elf32_Dyn* dyn = (Elf32_Dyn*)(data + u32be(dynamic_shdr->sh_offset) + i); - - if (u32be(dyn->d_tag) == DT_PLTGOT) { - got_start = u32be(dyn->d_un.d_ptr); - } - - if (u32be(dyn->d_tag) == DT_MIPS_LOCAL_GOTNO) { - local_got_no = u32be(dyn->d_un.d_val); - } - - if (u32be(dyn->d_tag) == DT_MIPS_GOTSYM) { - first_got_sym = u32be(dyn->d_un.d_val); - } - - if (u32be(dyn->d_tag) == DT_MIPS_SYMTABNO) { - dynsym_no = u32be(dyn->d_un.d_val); - } - } - - assert(got_start != 0); - - // value to add to asm gp offset, for example 32752, if -32752(gp) refers to the first entry in got. - uint32_t gp_adj = gp_base - got_start; - - assert(gp_adj < 0x10000); - - assert(u32be(dynsym_shdr->sh_entsize) == sizeof(Elf32_Sym)); - - uint32_t global_got_no = dynsym_no - first_got_sym; - // global_got_entry *global_entries = (global_got_entry *)calloc(global_got_no, sizeof(global_got_entry)); - - got_globals.resize(global_got_no); - - uint32_t common_start = ~0U; - vector common_order; - - for (uint32_t i = 0; i < dynsym_no; i++) { - Elf32_Sym* sym = (Elf32_Sym*)(data + u32be(dynsym_shdr->sh_offset) + i * sizeof(Elf32_Sym)); - const char* name = STR(sym_dynstr, u32be(sym->st_name)); - uint32_t addr = u32be(sym->st_value); - - addr += vaddr_adj; - - uint8_t type = ELF32_ST_TYPE(sym->st_info); - - if (!strcmp(name, "_procedure_table")) { - procedure_table_start = addr; - } else if (!strcmp(name, "_procedure_table_size")) { - procedure_table_len = 40 * u32be(sym->st_value); - } - - if ((u16be(sym->st_shndx) == SHN_MIPS_TEXT && type == STT_FUNC) || - (type == STT_OBJECT && - (u16be(sym->st_shndx) == SHN_MIPS_ACOMMON || u16be(sym->st_shndx) == SHN_MIPS_DATA))) { - // disasm_label_add(state, name, addr, u32be(sym->st_size), true); - if (type == STT_OBJECT) {} - - if (u16be(sym->st_shndx) == SHN_MIPS_ACOMMON) { - if (addr < common_start) { - common_start = addr; - } - - common_order.push_back(name); - } - - if (type == STT_FUNC) { - add_function(addr); - - if (strcmp(name, "main") == 0) { - main_addr = addr; - } - - if (strcmp(name, "_mcount") == 0) { - mcount_addr = addr; - } - - symbol_names[addr] = name; - } - } - - if (i >= first_got_sym) { - uint32_t got_value = u32be(*(uint32_t*)(data + u32be(got_shdr->sh_offset) + - (local_got_no + (i - first_got_sym)) * sizeof(uint32_t))); - - if (u16be(sym->st_shndx) == SHN_MIPS_TEXT && type == STT_FUNC) { - // got_globals[i - first_got_sym] = got_value; - // label_addresses.insert(got_value); - got_globals[i - first_got_sym] = addr; // to include the 3 instr gp header thing - label_addresses.insert(addr); - } else if (type == STT_OBJECT && - (u16be(sym->st_shndx) == SHN_UNDEF || u16be(sym->st_shndx) == SHN_COMMON)) { - // symbol defined externally (for example in libc) - got_globals[i - first_got_sym] = got_value; - } else { - got_globals[i - first_got_sym] = addr; - } - - symbol_names[got_globals[i - first_got_sym]] = name; - } - } - - uint32_t* local_entries = (uint32_t*)calloc(local_got_no, sizeof(uint32_t)); - got_locals.resize(local_got_no); - for (uint32_t i = 0; i < local_got_no; i++) { - uint32_t* entry = (uint32_t*)(data + u32be(got_shdr->sh_offset) + i * sizeof(uint32_t)); - got_locals[i] = u32be(*entry); - } - - gp_value = gp_base; - gp_value_adj = gp_adj; - - free(local_entries); - } - - // add relocations - for (int i = 0; i < u16be(ehdr->e_shnum); i++) { - Elf32_Rel* prevHi = NULL; - - shdr = SECTION(i); - if (u32be(shdr->sh_type) != SHT_REL || u32be(shdr->sh_info) != (uint32_t)text_section_index) - continue; - - if (sym_shdr == NULL) { - fprintf(stderr, "Relocations without .symtab section\n"); - exit(EXIT_FAILURE); - } - - assert(u32be(shdr->sh_link) == (uint32_t)symtab_section_index); - assert(u32be(shdr->sh_entsize) == sizeof(Elf32_Rel)); - - for (uint32_t i = 0; i < u32be(shdr->sh_size); i += sizeof(Elf32_Rel)) { - Elf32_Rel* rel = (Elf32_Rel*)(data + u32be(shdr->sh_offset) + i); - uint32_t offset = text_offset + u32be(rel->r_offset); - uint32_t symIndex = ELF32_R_SYM(u32be(rel->r_info)); - uint32_t rtype = ELF32_R_TYPE(u32be(rel->r_info)); - const char* symName = "0"; - - if (symIndex != STN_UNDEF) { - Elf32_Sym* sym = (Elf32_Sym*)(data + u32be(sym_shdr->sh_offset) + symIndex * sizeof(Elf32_Sym)); - - symName = STR(sym_strtab, u32be(sym->st_name)); - } - - if (rtype == R_MIPS_HI16) { - if (prevHi != NULL) { - fprintf(stderr, "Consecutive R_MIPS_HI16.\n"); - exit(EXIT_FAILURE); - } - - prevHi = rel; - continue; - } - - if (rtype == R_MIPS_LO16) { - int32_t addend = (int16_t)((data[offset + 2] << 8) + data[offset + 3]); - - if (prevHi != NULL) { - uint32_t offset2 = text_offset + u32be(prevHi->r_offset); - - addend += (uint32_t)((data[offset2 + 2] << 8) + data[offset2 + 3]) << 16; - // add_reloc(state, offset2, symName, addend, out_range.vaddr); - } - prevHi = NULL; - // add_reloc(state, offset, symName, addend, out_range.vaddr); - } else if (rtype == R_MIPS_26) { - int32_t addend = (u32be(*(uint32_t*)(data + offset)) & ((1 << 26) - 1)) << 2; - - if (addend >= (1 << 27)) { - addend -= 1 << 28; - } - // add_reloc(state, offset, symName, addend, out_range.vaddr); - } - - else { - fprintf(stderr, "Bad relocation type %d.\n", rtype); - exit(EXIT_FAILURE); - } - } - - if (prevHi != NULL) { - fprintf(stderr, "R_MIPS_HI16 without matching R_MIPS_LO16.\n"); - exit(EXIT_FAILURE); - } - } -} -#undef SECTION -#undef STR - -size_t read_file(const char* file_name, uint8_t** data) { - FILE* in; - uint8_t* in_buf = NULL; - long file_size; - long bytes_read; - - in = fopen(file_name, "rb"); - assert(in != nullptr); - - // allocate buffer to read from offset to end of file - fseek(in, 0, SEEK_END); - file_size = ftell(in); - assert(file_size != -1L); - - in_buf = (uint8_t*)malloc(file_size); - fseek(in, 0, SEEK_SET); - - // read bytes - bytes_read = fread(in_buf, 1, file_size, in); - assert(bytes_read == file_size); - - fclose(in); - *data = in_buf; - return bytes_read; -} - -#ifdef UNIX_PLATFORM -void crashHandler(int sig) { - void* array[4096]; - const size_t nMaxFrames = std::size(array); - size_t size = backtrace(array, nMaxFrames); - char** symbols = backtrace_symbols(array, nMaxFrames); - - fprintf(stderr, "\n recomp crashed. (Signal: %i)\n", sig); - - // Feel free to add more crash messages. - const char* crashEasterEgg[] = { - "\tIT'S A SECRET TO EVERYBODY. \n\tBut it shouldn't be, you'd better ask about it!", - "\tI AM ERROR.", - "\tGRUMBLE,GRUMBLE...", - "\tDODONGO DISLIKES SMOKE \n\tAnd recomp dislikes whatever you fed it.", - "\tMay the way of the Hero lead \n\tto the debugger.", - "\tTHE WIND FISH SLUMBERS LONG... \n\tTHE HERO'S LIFE GONE... ", - "\tSEA BEARS FOAM, SLEEP BEARS DREAMS. \n\tBOTH END IN THE SAME WAY CRASSSH!", - "\tYou've met with a terrible fate, haven't you?", - "\tMaster, I calculate a 100% probability that recomp has crashed. \n\tAdditionally, the " - "batteries in your Wii Remote are nearly depleted.", - "\t CONGRATURATIONS! \n" - "\tAll Pages are displayed.\n" - "\t THANK YOU! \n" - "\t You are great debugger!", - "\tRCP is HUNG UP!!\n" - "\tOh! MY GOD!!", - }; - - srand(time(nullptr)); - auto easterIndex = rand() % std::size(crashEasterEgg); - - fprintf(stderr, "\n%s\n\n", crashEasterEgg[easterIndex]); - - fprintf(stderr, "Traceback:\n"); - for (size_t i = 1; i < size; i++) { - Dl_info info; - uint32_t gotAddress = dladdr(array[i], &info); - std::string functionName(symbols[i]); - - if (gotAddress != 0 && info.dli_sname != nullptr) { - int32_t status; - char* demangled = abi::__cxa_demangle(info.dli_sname, nullptr, nullptr, &status); - const char* nameFound = info.dli_sname; - - if (status == 0) { - nameFound = demangled; - } - - { - char auxBuffer[0x8000]; - - snprintf(auxBuffer, std::size(auxBuffer), "%s (+0x%lX)", nameFound, - (char*)array[i] - (char*)info.dli_saddr); - functionName = auxBuffer; - } - free(demangled); - -#if FULL_TRACEBACK == 0 - fprintf(stderr, "%-3zd %s\n", i, functionName.c_str()); -#endif - } - -#if FULL_TRACEBACK != 0 - fprintf(stderr, "%-3zd %s\n", i, functionName.c_str()); -#endif - } - - fprintf(stderr, "\n"); - - free(symbols); - exit(1); -} -#endif - -int main(int argc, char* argv[]) { - const char* filename = argv[1]; - - if (strcmp(filename, "--conservative") == 0) { - conservative = true; - filename = argv[2]; - } - -#ifdef UNIX_PLATFORM - signal(SIGSEGV, crashHandler); - signal(SIGABRT, crashHandler); -#endif - - uint8_t* data; - size_t len = read_file(filename, &data); - - parse_elf(data, len); - disassemble(); - inspect_data_function_pointers(data_function_pointers, rodata_section, rodata_vaddr, rodata_section_len); - inspect_data_function_pointers(data_function_pointers, data_section, data_vaddr, data_section_len); - pass1(); - pass2(); - pass3(); - pass4(); - pass5(); - pass6(); - // dump(); - dump_c(); - free(data); - - return 0; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/.clang-format b/tools/ido-static-recomp/tools/rabbitizer/.clang-format deleted file mode 100644 index 414e3cff..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/.clang-format +++ /dev/null @@ -1,23 +0,0 @@ -IndentWidth: 4 -Language: Cpp -UseTab: Never -ColumnLimit: 160 -PointerAlignment: Right -BreakBeforeBraces: Attach -SpaceAfterCStyleCast: false -Cpp11BracedListStyle: false -IndentCaseLabels: true -BinPackArguments: true -BinPackParameters: true -AlignAfterOpenBracket: Align -AlignOperands: true -BreakBeforeTernaryOperators: true -BreakBeforeBinaryOperators: None -AllowShortBlocksOnASingleLine: true -AllowShortIfStatementsOnASingleLine: false -AllowShortLoopsOnASingleLine: false -AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: false -AlignEscapedNewlines: Left -AlignTrailingComments: true -SortIncludes: false diff --git a/tools/ido-static-recomp/tools/rabbitizer/.clang-tidy b/tools/ido-static-recomp/tools/rabbitizer/.clang-tidy deleted file mode 100644 index 8534b8a6..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/.clang-tidy +++ /dev/null @@ -1,9 +0,0 @@ -Checks: 'readability-*,-readability-magic-numbers,clang-diagnostic-*,clang-analyzer-*,-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,bugprone*,-bugprone-branch-clone,modernize*,performance*,portability*,diagnostic-*,analyzer-*,misc*,-misc-no-recursion' -WarningsAsErrors: '' -HeaderFilterRegex: '(src|include)\/.*\.h$' -FormatStyle: 'file' -CheckOptions: - # Require argument names to match exactly (instead of allowing a name to be a prefix/suffix of another) - # Note: 'true' is expected by clang-tidy 12+ but '1' is used for compatibility with older versions - - key: readability-inconsistent-declaration-parameter-name.Strict - value: 1 diff --git a/tools/ido-static-recomp/tools/rabbitizer/.gitattributes b/tools/ido-static-recomp/tools/rabbitizer/.gitattributes deleted file mode 100644 index dfe07704..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/tools/ido-static-recomp/tools/rabbitizer/.github/workflows/ci.yml b/tools/ido-static-recomp/tools/rabbitizer/.github/workflows/ci.yml deleted file mode 100644 index 6baeb371..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/.github/workflows/ci.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Build and upload to PyPI - -# Build on every branch push, tag push, and pull request change: -on: [push, pull_request] - -jobs: - build_wheels: - name: Build wheels on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - - steps: - - uses: actions/checkout@v2 - - - name: Build wheels - uses: pypa/cibuildwheel@v2.5.0 - env: - CIBW_ARCHS_WINDOWS: "auto" - CIBW_ARCHS_LINUX: "auto" - CIBW_ARCHS_MACOS: "all" - - - uses: actions/upload-artifact@v2 - with: - path: ./wheelhouse/*.whl - - build_sdist: - name: Build source distribution - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Build sdist - run: pipx run build --sdist - - - uses: actions/upload-artifact@v2 - with: - path: dist/*.tar.gz - - upload_pypi: - needs: [build_wheels, build_sdist] - runs-on: ubuntu-latest - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') - steps: - - uses: actions/download-artifact@v2 - with: - name: artifact - path: dist - - - uses: pypa/gh-action-pypi-publish@v1.4.2 - with: - user: __token__ - password: ${{ secrets.pypi_password }} diff --git a/tools/ido-static-recomp/tools/rabbitizer/.github/workflows/make.yml b/tools/ido-static-recomp/tools/rabbitizer/.github/workflows/make.yml deleted file mode 100644 index 3079d9e3..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/.github/workflows/make.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: make - -# Build on every branch push, tag push, and pull request change: -on: [push, pull_request] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: make - run: make WERROR=1 diff --git a/tools/ido-static-recomp/tools/rabbitizer/.gitignore b/tools/ido-static-recomp/tools/rabbitizer/.gitignore deleted file mode 100644 index e433d8d7..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/.gitignore +++ /dev/null @@ -1,215 +0,0 @@ -# https://raw.githubusercontent.com/github/gitignore/main/C.gitignore -# https://raw.githubusercontent.com/github/gitignore/main/Python.gitignore - -# Prerequisites -*.d - -# Object files -*.o -*.ko -*.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb - -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf - - - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - - -.vscode/ - diff --git a/tools/ido-static-recomp/tools/rabbitizer/.gitrepo b/tools/ido-static-recomp/tools/rabbitizer/.gitrepo deleted file mode 100644 index cbd77990..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/.gitrepo +++ /dev/null @@ -1,12 +0,0 @@ -; DO NOT EDIT (unless you know what you are doing) -; -; This subdirectory is a git "subrepo", and this file is maintained by the -; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme -; -[subrepo] - remote = git@github.com:Decompollaborate/rabbitizer.git - branch = develop - commit = 72bf240f468d30286888212b5fb773fae94340f6 - parent = fa84f928c510147d6083b979efb28a5a07eefe10 - method = merge - cmdver = 0.4.3 diff --git a/tools/ido-static-recomp/tools/rabbitizer/LICENSE b/tools/ido-static-recomp/tools/rabbitizer/LICENSE deleted file mode 100644 index 10a2aa35..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Decompollaborate - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/tools/ido-static-recomp/tools/rabbitizer/MANIFEST.in b/tools/ido-static-recomp/tools/rabbitizer/MANIFEST.in deleted file mode 100644 index 1e60716c..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/MANIFEST.in +++ /dev/null @@ -1,6 +0,0 @@ -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -include **/*.h -include **/**/*.h -graft include diff --git a/tools/ido-static-recomp/tools/rabbitizer/Makefile b/tools/ido-static-recomp/tools/rabbitizer/Makefile deleted file mode 100644 index e0b92c36..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/Makefile +++ /dev/null @@ -1,140 +0,0 @@ -# Build options can be changed by modifying the makefile or by building with 'make SETTING=value'. -DEBUG ?= 0 -WERROR ?= 0 -ASAN ?= 0 -EXPERIMENTAL ?= 0 -SANITY_CHECKS ?= 1 - -CC := clang -CXX := clang++ -AR := ar -IINC := -I include -IINC_XX := -I include -I cplusplus/include -CSTD := -std=c11 -CXXSTD := -std=c++17 -CFLAGS := -fPIC -CXXFLAGS := -fPIC -LDFLAGS := -Lbuild -lrabbitizer -LDXXFLAGS := -Lbuild -lrabbitizerpp -WARNINGS := -Wall -Wextra -Wpedantic -# WARNINGS := -Wall -Wextra -Wpedantic -Wpadded -WARNINGS += -Werror=vla -Werror=switch -Werror=implicit-fallthrough -Werror=unused-function -Werror=unused-parameter -Werror=shadow -WARNINGS_C := -Werror=implicit-function-declaration -Werror=incompatible-pointer-types -WARNINGS_CXX := - -ifeq ($(CC),gcc) - WARNINGS += -Wno-cast-function-type -endif - -ifeq ($(DEBUG),0) - OPTFLAGS := -Os -g -else - OPTFLAGS := -O0 -g3 - CFLAGS += -DDEVELOPMENT=1 - CXXFLAGS += -DDEVELOPMENT=1 -endif - -ifneq ($(WERROR),0) - WARNINGS += -Werror -endif - -ifneq ($(ASAN),0) - CFLAGS += -fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined - CXXFLAGS += -fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined -endif - -ifneq ($(EXPERIMENTAL),0) - CFLAGS += -DEXPERIMENTAL - CXXFLAGS += -DEXPERIMENTAL -endif - -ifneq ($(SANITY_CHECKS),0) - CFLAGS += -DRAB_SANITY_CHECKS=1 - CXXFLAGS += -DRAB_SANITY_CHECKS=1 -endif - - -SRC_DIRS := $(shell find src -type d) -C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) -H_FILES := $(foreach dir,$(IINC),$(wildcard $(dir)/**/*.h)) -O_FILES := $(foreach f,$(C_FILES:.c=.o),build/$f) - -SRCXX_DIRS := $(shell find cplusplus/src -type d) -CXX_FILES := $(foreach dir,$(SRCXX_DIRS),$(wildcard $(dir)/*.cpp)) -HXX_FILES := $(foreach dir,$(IINC_XX),$(wildcard $(dir)/**/*.hpp)) -OXX_FILES := $(foreach f,$(CXX_FILES:.cpp=.o),build/$f) - -DEP_FILES := $(O_FILES:%.o=%.d) $(OXX_FILES:%.o=%.d) - -TESTS_DIRS := $(shell find tests -type d) - -STATIC_LIB := build/librabbitizer.a -DYNAMIC_LIB := build/librabbitizer.so - -STATIC_LIB_XX := build/librabbitizerpp.a -DYNAMIC_LIB_XX := build/librabbitizerpp.so - -# create build directories -$(shell mkdir -p $(foreach dir,$(SRC_DIRS) $(SRCXX_DIRS) $(TESTS_DIRS),build/$(dir))) - - -# Dependencies of libraries - -$(STATIC_LIB): $(O_FILES) -$(DYNAMIC_LIB): $(O_FILES) - -$(STATIC_LIB_XX): $(O_FILES) $(OXX_FILES) -$(DYNAMIC_LIB_XX): $(O_FILES) $(OXX_FILES) - - -#### Main Targets ### - -all: static tests - -static: $(STATIC_LIB) $(STATIC_LIB_XX) -dynamic: $(DYNAMIC_LIB) $(DYNAMIC_LIB_XX) - -clean: - $(RM) -rf build - -distclean: clean - $(RM) -rf dist rabbitizer.egg-info .mypy_cache - -format: - clang-format-11 -i -style=file $(C_FILES) - clang-format-11 -i -style=file $(CXX_FILES) - -tidy: - clang-tidy-11 -p . --fix --fix-errors $(C_FILES) $(H_FILES) -- $(CSTD) $(OPTFLAGS) $(IINC) $(WARNINGS) $(WARNINGS_C) $(CFLAGS) - -tests: build/test.elf build/rsptest.elf build/r5900test.elf build/registersTrackerTest.elf build/tests/cplusplus/test.elf - -.PHONY: all clean distclean format tidy tests -.DEFAULT_GOAL := all -.SECONDARY: - - -#### Various Recipes #### - -build/%.elf: %.c | $(STATIC_LIB) - $(CC) -MMD $(CSTD) $(OPTFLAGS) $(IINC) $(WARNINGS) $(WARNINGS_C) $(CFLAGS) -o $@ $^ $(LDFLAGS) - -build/%.elf: %.cpp | $(STATIC_LIB_XX) - $(CXX) -MMD $(CXXSTD) $(OPTFLAGS) $(IINC_XX) $(WARNINGS) $(WARNINGS_CXX) $(CXXFLAGS) -o $@ $^ $(LDXXFLAGS) - -build/%.a: - $(AR) rcs $@ $^ - -build/%.so: - $(CC) -shared -o $@ $^ - -build/%.o: %.c -# The -MMD flags additionaly creates a .d file with the same name as the .o file. - $(CC) -MMD -c $(CSTD) $(OPTFLAGS) $(IINC) $(WARNINGS) $(WARNINGS_C) $(CFLAGS) -o $@ $< - -build/%.o: %.cpp -# The -MMD flags additionaly creates a .d file with the same name as the .o file. - $(CXX) -MMD -c $(CXXSTD) $(OPTFLAGS) $(IINC_XX) $(WARNINGS) $(WARNINGS_CXX) $(CXXFLAGS) -o $@ $< - - --include $(DEP_FILES) diff --git a/tools/ido-static-recomp/tools/rabbitizer/README.md b/tools/ido-static-recomp/tools/rabbitizer/README.md deleted file mode 100644 index 18bc794c..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# rabbitizer - -[![PyPI - Downloads](https://img.shields.io/pypi/dm/rabbitizer)](https://pypi.org/project/rabbitizer/) -![GitHub](https://img.shields.io/github/license/Decompollaborate/rabbitizer) -![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/Decompollaborate/rabbitizer) -![PyPI](https://img.shields.io/pypi/v/rabbitizer) -![GitHub contributors](https://img.shields.io/github/contributors/Decompollaborate/rabbitizer?logo=purple) - -A MIPS instruction decoder API. - -Currently supports all the CPU instructions for MIPS I, II, III and IV. - -## Installing - -The recommended way to install is using from the PyPi release, via `pip`: - -```bash -pip install rabbitizer -``` - -In case you want to mess with the latest development version without wanting to clone the repository, then you could use the following command: - -```bash -pip install git+https://github.com/Decompollaborate/rabbitizer.git@develop -``` - -NOTE: Installing the development version is not recommended. Proceed at your own risk. - -## Features - -- Should produces matching assembly. -- Fully written in C for fast decoding. -- Python bindings. - - The minimal Python version is 3.7, older versions are not guaranteed to work. -- Includes some minor tools to build your own pointer/symbol detection. -- Configurable, many features can be turned on and off. -- MIPS instructions features: - - Named registers for MIPS VR4300's coprocessors. - - Support for many pseudoinstructions. - - Properly handle move to/from coprocessor instructions. - - Support for numeric, o32, n32 and n64 ABI register names. -- Some workarounds for some specific compilers/assemblers: - - `SN64`: - - `div`/`divu` fix: tweaks a bit the produced `div`, `divu` and `break` instructions. -- N64 RSP instruction decoding support. - - RSP decoding has been tested to build back to matching assemblies with [armips](https://github.com/Kingcom/armips/). -- R5900 (PS2's Emotion Engine processor) decoding support. - -## References - -- R5900: - - EmotionEngine instruction decoding: - - Official documentation from Toshiba: - - VU instruction manual: - - GNU binutils: diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/LoPairingInfo.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/LoPairingInfo.hpp deleted file mode 100644 index 020761a5..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/LoPairingInfo.hpp +++ /dev/null @@ -1,36 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_LO_PAIRING_INFO_HPP -#define RABBITIZER_LO_PAIRING_INFO_HPP -#pragma once - -#include "analysis/RabbitizerLoPairingInfo.h" - - -namespace rabbitizer { - class LoPairingInfo { - protected: - RabbitizerLoPairingInfo pairingInfo; - - public: - LoPairingInfo(); - LoPairingInfo(const RabbitizerLoPairingInfo &pairingInfo); - - /** - * Returns a pointer to the inner RabbitizerLoPairingInfo. - * It is recommended to not mess with it unless you know what you are doing. - */ - RabbitizerLoPairingInfo *getCPtr(); - const RabbitizerLoPairingInfo *getCPtr() const; - - int getInstrOffset() const; - int64_t getValue() const; - bool shouldProcess() const; - bool isGpRel() const; - bool isGpGot() const; - }; -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/RegistersTracker.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/RegistersTracker.hpp deleted file mode 100644 index d3e1cb9e..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/RegistersTracker.hpp +++ /dev/null @@ -1,49 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_REGISTERS_TRACKER_HPP -#define RABBITIZER_REGISTERS_TRACKER_HPP -#pragma once - -#include "analysis/RabbitizerRegistersTracker.h" - -#include "analysis/LoPairingInfo.hpp" -#include "instructions/InstructionBase.hpp" - - -namespace rabbitizer { - class RegistersTracker { - protected: - RabbitizerRegistersTracker tracker; - - public: - RegistersTracker(); - RegistersTracker(const RegistersTracker &other); - virtual ~RegistersTracker(); - - /** - * Returns a pointer to the inner RabbitizerRegistersTracker. - * It is recommended to not mess with it unless you know what you are doing. - */ - RabbitizerRegistersTracker *getCPtr(); - const RabbitizerRegistersTracker *getCPtr() const; - - bool moveRegisters(const InstructionBase &instr); - void overwriteRegisters(const InstructionBase &instr, int instrOffset); - void unsetRegistersAfterFuncCall(const InstructionBase &instr, const InstructionBase &prevInstr); - bool getAddressIfCanSetType(const InstructionBase &instr, int instrOffset, uint32_t *dstAddress) const; - bool getJrInfo(const InstructionBase &instr, int *dstOffset, uint32_t *dstAddress) const; - - void processLui(const InstructionBase &instr, int instrOffset); - void processLui(const InstructionBase &instr, int instrOffset, const InstructionBase &prevInstr); - void processGpLoad(const InstructionBase &instr, int instrOffset); - bool getLuiOffsetForConstant(const InstructionBase &instr, int *dstOffset) const; - void processConstant(const InstructionBase &instr, uint32_t value, int offset); - LoPairingInfo preprocessLoAndGetInfo(const InstructionBase &instr, int instrOffset); - void processLo(const InstructionBase &instr, uint32_t value, int offset); - bool hasLoButNoHi(const InstructionBase &instr) const; - }; -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstrId.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstrId.hpp deleted file mode 100644 index 59bf46f5..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstrId.hpp +++ /dev/null @@ -1,38 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRID_HPP -#define RABBITIZER_INSTRID_HPP -#pragma once - -#include - - -namespace rabbitizer { - namespace InstrId { - #define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \ - prefix##_##name, - - #define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) \ - RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__) - - enum class UniqueId { - #include "instructions/instr_id/RabbitizerInstrId_cpu.inc" - - #include "instructions/instr_id/RabbitizerInstrId_rsp.inc" - - #include "instructions/instr_id/RabbitizerInstrId_r5900.inc" - - ALL_MAX = RABBITIZER_DEF_INSTR_ID(r5900, , MAX, ) - }; - - #undef RABBITIZER_DEF_INSTR_ID - #undef RABBITIZER_DEF_INSTR_ID_ALTNAME - - - std::string getOpcodeName(UniqueId uniqueId); - }; -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionBase.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionBase.hpp deleted file mode 100644 index ced9901a..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionBase.hpp +++ /dev/null @@ -1,253 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRUCTION_BASE_HPP -#define RABBITIZER_INSTRUCTION_BASE_HPP -#pragma once - -#include -#include - -#include "instructions/RabbitizerInstruction.h" - -#include "instructions/Registers.hpp" -#include "instructions/OperandType.hpp" -#include "instructions/InstrId.hpp" - - -namespace rabbitizer { - class InstructionBase { - protected: - RabbitizerInstruction instr; - - InstructionBase() = default; - virtual ~InstructionBase() = default; - - public: - /** - * Returns a pointer to the inner RabbitizerInstruction. - * It is recommended to not mess with it unless you know what you are doing. - */ - RabbitizerInstruction *getCPtr(); - const RabbitizerInstruction *getCPtr() const; - - /* getters */ - - uint8_t Get_opcode() const; - uint8_t Get_sa() const; - uint8_t Get_function() const; - - Registers::Cpu::GprO32 GetO32_rs() const; - Registers::Cpu::GprO32 GetO32_rt() const; - Registers::Cpu::GprO32 GetO32_rd() const; - - Registers::Cpu::GprN32 GetN32_rs() const; - Registers::Cpu::GprN32 GetN32_rt() const; - Registers::Cpu::GprN32 GetN32_rd() const; - - Registers::Cpu::Cop0 Get_cop0d() const; - - uint32_t Get_instr_index() const; - uint16_t Get_immediate() const; - - Registers::Cpu::Cop1O32 GetO32_fs() const; - Registers::Cpu::Cop1O32 GetO32_ft() const; - Registers::Cpu::Cop1O32 GetO32_fd() const; - - Registers::Cpu::Cop1N32 GetN32_fs() const; - Registers::Cpu::Cop1N32 GetN32_ft() const; - Registers::Cpu::Cop1N32 GetN32_fd() const; - - Registers::Cpu::Cop1N64 GetN64_fs() const; - Registers::Cpu::Cop1N64 GetN64_ft() const; - Registers::Cpu::Cop1N64 GetN64_fd() const; - - Registers::Cpu::Cop1Control Get_cop1cs() const; - - Registers::Cpu::Cop2 Get_cop2t() const; - - uint8_t Get_op() const; - - uint32_t Get_code() const; - uint32_t Get_code_upper() const; - uint32_t Get_code_lower() const; - - uint32_t Get_copraw() const; - - uint8_t Get_fmt() const; - uint8_t Get_fc() const; - uint8_t Get_cond() const; - - uint8_t Get_tf() const; - uint8_t Get_nd() const; - uint8_t Get_bc_fmt() const; - - uint8_t Get_stype() const; - - /* getters */ - - - /* setters */ - - void Set_opcode(uint8_t val); - void Set_sa(uint8_t val); - void Set_function(uint8_t val); - - void Set_rs(Registers::Cpu::GprO32 val); - void Set_rt(Registers::Cpu::GprO32 val); - void Set_rd(Registers::Cpu::GprO32 val); - - void Set_rs(Registers::Cpu::GprN32 val); - void Set_rt(Registers::Cpu::GprN32 val); - void Set_rd(Registers::Cpu::GprN32 val); - - void Set_cop0d(Registers::Cpu::Cop0 val); - - void Set_instr_index(uint32_t val); - void Set_immediate(uint16_t val); - - void Set_fs(Registers::Cpu::Cop1O32 val); - void Set_ft(Registers::Cpu::Cop1O32 val); - void Set_fd(Registers::Cpu::Cop1O32 val); - - void Set_fs(Registers::Cpu::Cop1N32 val); - void Set_ft(Registers::Cpu::Cop1N32 val); - void Set_fd(Registers::Cpu::Cop1N32 val); - - void Set_fs(Registers::Cpu::Cop1N64 val); - void Set_ft(Registers::Cpu::Cop1N64 val); - void Set_fd(Registers::Cpu::Cop1N64 val); - - void Set_cop1cs(Registers::Cpu::Cop1Control val); - - void Set_cop2t(Registers::Cpu::Cop2 val); - - void Set_op(uint8_t val); - - void Set_code(uint32_t val); - void Set_code_upper(uint32_t val); - void Set_code_lower(uint32_t val); - - void Set_copraw(uint32_t val); - - void Set_fmt(uint8_t val); - void Set_fc(uint8_t val); - void Set_cond(uint8_t val); - - void Set_tf(uint8_t val); - void Set_nd(uint8_t val); - void Set_bc_fmt(uint8_t val); - - void Set_stype(uint8_t val); - - /* setters */ - - - /* more getters */ - - uint32_t getRaw() const; - - InstrId::UniqueId getUniqueId() const; - uint32_t getVram() const; - bool isInHandwrittenFunction() const; - - int32_t getProcessedImmediate() const; - uint32_t getInstrIndexAsVram() const; - - int32_t getBranchOffset() const; - int32_t getGenericBranchOffset(uint32_t currentVram) const; - - - std::string getOpcodeName() const; - - /* more getters */ - - - /* */ - - void blankOut(); - - - /* Instruction examination */ - - bool isImplemented() const; - bool isLikelyHandwritten() const; - bool isNop() const; - bool isUnconditionalBranch() const; - bool isJrRa() const; - bool isJrNotRa() const; - bool hasDelaySlot() const; - - std::string mapInstrToType() const; - - bool sameOpcode(const InstructionBase &other) const; - bool sameOpcodeButDifferentArguments(const InstructionBase &other) const; - - bool hasOperand(OperandType operand) const; - bool hasOperandAlias(OperandType operand) const; - - uint32_t getValidBits() const; - bool isValid() const; - - /* Instruction examination */ - - - /* Instruction descriptor */ - - bool isUnknownType() const; - bool isJType() const; - bool isIType() const; - bool isRType() const; - bool isRegimmType() const; - - // TODO - // RabbitizerInstrSuffix instrSuffix() const; - - bool isBranch() const; - bool isBranchLikely() const; - bool isJump() const; - bool isTrap() const; - - bool isFloat() const; - bool isDouble() const; - - bool isUnsigned() const; - - bool modifiesRt() const; - bool modifiesRd() const; - - bool notEmitedByCompilers() const; - - bool canBeHi() const; - bool canBeLo() const; - bool doesLink() const; - bool doesDereference() const; - bool doesLoad() const; - bool doesStore() const; - bool maybeIsMove() const; - - bool isPseudo() const; - - /* Instruction descriptor */ - - - /* Disassembly */ - - bool mustDisasmAsData() const; - - std::string disassembleOperands() const; - std::string disassembleOperands(std::string_view immOverride) const; - - std::string disassembleInstruction(int extraLJust) const; - std::string disassembleInstruction(int extraLJust, std::string_view immOverride) const; - - std::string disassembleAsData(int extraLJust) const; - - std::string disassemble(int extraLJust) const; - std::string disassemble(int extraLJust, std::string_view immOverride) const; - - /* Disassembly */ - }; -}; - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionCpu.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionCpu.hpp deleted file mode 100644 index ef2eec54..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionCpu.hpp +++ /dev/null @@ -1,20 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRUCTION_CPU_HPP -#define RABBITIZER_INSTRUCTION_CPU_HPP -#pragma once - -#include "InstructionBase.hpp" - - -namespace rabbitizer { - class InstructionCpu : public InstructionBase { - public: - InstructionCpu(uint32_t word, uint32_t vram); - virtual ~InstructionCpu(); - }; -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionR5900.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionR5900.hpp deleted file mode 100644 index 0be3a271..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionR5900.hpp +++ /dev/null @@ -1,41 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRUCTION_R5900_HPP -#define RABBITIZER_INSTRUCTION_R5900_HPP -#pragma once - -#include "InstructionBase.hpp" - - -namespace rabbitizer { - class InstructionR5900 : public InstructionBase { - public: - InstructionR5900(uint32_t word, uint32_t vram); - virtual ~InstructionR5900(); - - Registers::R5900::VF GetR5900_vfs() const; - Registers::R5900::VF GetR5900_vft() const; - Registers::R5900::VF GetR5900_vfd() const; - - Registers::R5900::VI GetR5900_vis() const; - Registers::R5900::VI GetR5900_vit() const; - Registers::R5900::VI GetR5900_vid() const; - - uint8_t GetR5900_mmi_function() const; - uint8_t GetR5900_fhi_flo() const; - - uint8_t GetR5900_xyzw_x() const; - uint8_t GetR5900_xyzw_y() const; - uint8_t GetR5900_xyzw_z() const; - uint8_t GetR5900_xyzw_w() const; - uint8_t GetR5900_n() const; - uint8_t GetR5900_l() const; - uint8_t GetR5900_m() const; - - uint8_t GetR5900_imm5() const; - }; -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionRsp.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionRsp.hpp deleted file mode 100644 index f2d32a13..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionRsp.hpp +++ /dev/null @@ -1,40 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRUCTION_RSP_HPP -#define RABBITIZER_INSTRUCTION_RSP_HPP -#pragma once - -#include "InstructionBase.hpp" - - -namespace rabbitizer { - class InstructionRsp : public InstructionBase { - public: - InstructionRsp(uint32_t word, uint32_t vram); - virtual ~InstructionRsp(); - - Registers::Rsp::Gpr GetRsp_rs() const; - Registers::Rsp::Gpr GetRsp_rt() const; - Registers::Rsp::Gpr GetRsp_rd() const; - - Registers::Rsp::Cop0 GetRsp_cop0d() const; - - Registers::Rsp::Cop2 GetRsp_cop2t() const; - - Registers::Rsp::Cop2Control GetRsp_cop2cd() const; - - Registers::Rsp::Vector GetRsp_vs() const; - Registers::Rsp::Vector GetRsp_vt() const; - Registers::Rsp::Vector GetRsp_vd() const; - - uint8_t GetRsp_elementhigh() const; - uint8_t GetRsp_elementlow() const; - - uint8_t GetRsp_index() const; - uint8_t GetRsp_de() const; - }; -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/OperandType.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/OperandType.hpp deleted file mode 100644 index abd728ad..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/OperandType.hpp +++ /dev/null @@ -1,27 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_OPERAND_TYPE_HPP -#define RABBITIZER_OPERAND_TYPE_HPP -#pragma once - - -namespace rabbitizer { - #define RAB_DEF_OPERAND(prefix, operand) \ - prefix##_##operand, - - enum class OperandType { - RAB_DEF_OPERAND(ALL, INVALID) - - #include "instructions/operands/RabbitizerOperandType_cpu.inc" - #include "instructions/operands/RabbitizerOperandType_rsp.inc" - #include "instructions/operands/RabbitizerOperandType_r5900.inc" - - RAB_DEF_OPERAND(ALL, MAX) - }; - - #undef RAB_DEF_OPERAND -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/Registers.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/Registers.hpp deleted file mode 100644 index ceddd8f8..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/Registers.hpp +++ /dev/null @@ -1,94 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_REGISTER_HPP -#define RABBITIZER_REGISTER_HPP -#pragma once - - -namespace rabbitizer { - - namespace Registers { - #define RABBITIZER_DEF_REG(prefix, name, numeric) \ - prefix##_##name - - #define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric) \ - prefix##_##name - - namespace Cpu { - enum class GprO32 { - #include "instructions/registers/RabbitizerRegister_GprO32.inc" - }; - - enum class GprN32 { - #include "instructions/registers/RabbitizerRegister_GprN32.inc" - }; - - - enum class Cop0 { - #include "instructions/registers/RabbitizerRegister_Cop0.inc" - }; - - // Float registers - enum class Cop1O32 { - #include "instructions/registers/RabbitizerRegister_Cop1O32.inc" - }; - - enum class Cop1N32 { - #include "instructions/registers/RabbitizerRegister_Cop1N32.inc" - }; - - enum class Cop1N64 { - #include "instructions/registers/RabbitizerRegister_Cop1N64.inc" - }; - - enum class Cop1Control { - #include "instructions/registers/RabbitizerRegister_Cop1Control.inc" - }; - - enum class Cop2 { - #include "instructions/registers/RabbitizerRegister_Cop2.inc" - }; - }; - - - namespace Rsp { - enum class Gpr { - #include "instructions/registers/RabbitizerRegister_RspGpr.inc" - }; - - enum class Cop0 { - #include "instructions/registers/RabbitizerRegister_RspCop0.inc" - }; - - enum class Cop2 { - #include "instructions/registers/RabbitizerRegister_RspCop2.inc" - }; - - enum class Cop2Control { - #include "instructions/registers/RabbitizerRegister_RspCop2Control.inc" - }; - - enum class Vector { - #include "instructions/registers/RabbitizerRegister_RspVector.inc" - }; - }; - - - namespace R5900 { - enum class VF { - #include "instructions/registers/RabbitizerRegister_R5900VF.inc" - }; - - enum class VI { - #include "instructions/registers/RabbitizerRegister_R5900VI.inc" - }; - }; - - #undef RABBITIZER_DEF_REG - #undef RABBITIZER_DEF_REG_NODOLLAR - }; -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/rabbitizer.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/rabbitizer.hpp deleted file mode 100644 index 332101e8..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/rabbitizer.hpp +++ /dev/null @@ -1,26 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_HPP -#define RABBITIZER_HPP -#pragma once - - -#include "common/RabbitizerVersion.h" -#include "common/RabbitizerConfig.h" - -#include "instructions/OperandType.hpp" -#include "instructions/InstrId.hpp" -//#include "instructions/InstrSuffix.hpp" -//#include "instructions/InstrDescriptor.hpp" -#include "instructions/Registers.hpp" -#include "instructions/InstructionBase.hpp" -#include "instructions/InstructionCpu.hpp" -#include "instructions/InstructionRsp.hpp" -#include "instructions/InstructionR5900.hpp" - -#include "analysis/LoPairingInfo.hpp" -#include "analysis/RegistersTracker.hpp" - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/LoPairingInfo.cpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/LoPairingInfo.cpp deleted file mode 100644 index d6fba253..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/LoPairingInfo.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "analysis/LoPairingInfo.hpp" - -using namespace rabbitizer; - -LoPairingInfo::LoPairingInfo() : pairingInfo{} { -} -LoPairingInfo::LoPairingInfo(const RabbitizerLoPairingInfo &newPairingInfo) : pairingInfo{ newPairingInfo } { -} - -RabbitizerLoPairingInfo *LoPairingInfo::getCPtr() { - return &this->pairingInfo; -} -const RabbitizerLoPairingInfo *LoPairingInfo::getCPtr() const { - return &this->pairingInfo; -} - -int LoPairingInfo::getInstrOffset() const { - return this->pairingInfo.instrOffset; -} -int64_t LoPairingInfo::getValue() const { - return this->pairingInfo.value; -} -bool LoPairingInfo::shouldProcess() const { - return this->pairingInfo.shouldProcess; -} -bool LoPairingInfo::isGpRel() const { - return this->pairingInfo.isGpRel; -} -bool LoPairingInfo::isGpGot() const { - return this->pairingInfo.isGpGot; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/RegistersTracker.cpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/RegistersTracker.cpp deleted file mode 100644 index 5294d58f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/RegistersTracker.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "analysis/RegistersTracker.hpp" - -using namespace rabbitizer; - -RegistersTracker::RegistersTracker() { - RabbitizerRegistersTracker_init(&this->tracker, NULL); -} -RegistersTracker::RegistersTracker(const RegistersTracker &other) { - RabbitizerRegistersTracker_init(&this->tracker, &other.tracker); -} -RegistersTracker::~RegistersTracker() { - RabbitizerRegistersTracker_destroy(&this->tracker); -} - -RabbitizerRegistersTracker *RegistersTracker::getCPtr() { - return &this->tracker; -} -const RabbitizerRegistersTracker *RegistersTracker::getCPtr() const { - return &this->tracker; -} - -bool RegistersTracker::moveRegisters(const InstructionBase &instr) { - return RabbitizerRegistersTracker_moveRegisters(&this->tracker, instr.getCPtr()); -} -void RegistersTracker::overwriteRegisters(const InstructionBase &instr, int instrOffset) { - RabbitizerRegistersTracker_overwriteRegisters(&this->tracker, instr.getCPtr(), instrOffset); -} -void RegistersTracker::unsetRegistersAfterFuncCall(const InstructionBase &instr, const InstructionBase &prevInstr) { - RabbitizerRegistersTracker_unsetRegistersAfterFuncCall(&this->tracker, instr.getCPtr(), prevInstr.getCPtr()); -} -bool RegistersTracker::getAddressIfCanSetType(const InstructionBase &instr, int instrOffset, uint32_t *dstAddress) const { - return RabbitizerRegistersTracker_getAddressIfCanSetType(&this->tracker, instr.getCPtr(), instrOffset, dstAddress); -} -bool RegistersTracker::getJrInfo(const InstructionBase &instr, int *dstOffset, uint32_t *dstAddress) const { - return RabbitizerRegistersTracker_getJrInfo(&this->tracker, instr.getCPtr(), dstOffset, dstAddress); -} - -void RegistersTracker::processLui(const InstructionBase &instr, int instrOffset) { - RabbitizerRegistersTracker_processLui(&this->tracker, instr.getCPtr(), instrOffset, NULL); -} -void RegistersTracker::processLui(const InstructionBase &instr, int instrOffset, const InstructionBase &prevInstr) { - RabbitizerRegistersTracker_processLui(&this->tracker, instr.getCPtr(), instrOffset, prevInstr.getCPtr()); -} -void RegistersTracker::processGpLoad(const InstructionBase &instr, int instrOffset) { - RabbitizerRegistersTracker_processGpLoad(&this->tracker, instr.getCPtr(), instrOffset); -} -bool RegistersTracker::getLuiOffsetForConstant(const InstructionBase &instr, int *dstOffset) const { - return RabbitizerRegistersTracker_getLuiOffsetForConstant(&this->tracker, instr.getCPtr(), dstOffset); -} -void RegistersTracker::processConstant(const InstructionBase &instr, uint32_t value, int offset) { - RabbitizerRegistersTracker_processConstant(&this->tracker, instr.getCPtr(), value, offset); -} -LoPairingInfo RegistersTracker::preprocessLoAndGetInfo(const InstructionBase &instr, int instrOffset) { - return RabbitizerRegistersTracker_preprocessLoAndGetInfo(&this->tracker, instr.getCPtr(), instrOffset); -} -void RegistersTracker::processLo(const InstructionBase &instr, uint32_t value, int offset) { - RabbitizerRegistersTracker_processLo(&this->tracker, instr.getCPtr(), value, offset); -} -bool RegistersTracker::hasLoButNoHi(const InstructionBase &instr) const { - return RabbitizerRegistersTracker_hasLoButNoHi(&this->tracker, instr.getCPtr()); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstrId.cpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstrId.cpp deleted file mode 100644 index 03e28d01..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstrId.cpp +++ /dev/null @@ -1,14 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/InstrId.hpp" - -#include "instructions/RabbitizerInstrId.h" - -using namespace rabbitizer; - -std::string InstrId::getOpcodeName(InstrId::UniqueId uniqueId) { - RabbitizerInstrId id = static_cast(uniqueId); - - return std::string(RabbitizerInstrId_getOpcodeName(id)); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionBase.cpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionBase.cpp deleted file mode 100644 index 4f5ad5be..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionBase.cpp +++ /dev/null @@ -1,1036 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/InstructionBase.hpp" - -#include - -#include "instructions/RabbitizerInstruction.h" -#include "instructions/RabbitizerInstructionR5900.h" - -using namespace rabbitizer; - -RabbitizerInstruction *InstructionBase::getCPtr() { - return &this->instr; -} -const RabbitizerInstruction *InstructionBase::getCPtr() const { - return &this->instr; -} - -/* getters */ - -uint8_t InstructionBase::Get_opcode() const { - return RAB_INSTR_GET_opcode(&this->instr); -} -uint8_t InstructionBase::Get_sa() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_sa)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'sa' operand."); - } -#endif - - return RAB_INSTR_GET_sa(&this->instr); -} -uint8_t InstructionBase::Get_function() const { - /* - #ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_function)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'function' operand."); - } - #endif - */ - - return RAB_INSTR_GET_function(&this->instr); -} - -Registers::Cpu::GprO32 InstructionBase::GetO32_rs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rs' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rs(&this->instr)); -} -Registers::Cpu::GprO32 InstructionBase::GetO32_rt() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rt' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rt(&this->instr)); -} -Registers::Cpu::GprO32 InstructionBase::GetO32_rd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rd' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rd(&this->instr)); -} - -Registers::Cpu::GprN32 InstructionBase::GetN32_rs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rs' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rs(&this->instr)); -} -Registers::Cpu::GprN32 InstructionBase::GetN32_rt() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rt' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rt(&this->instr)); -} -Registers::Cpu::GprN32 InstructionBase::GetN32_rd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rd' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rd(&this->instr)); -} - -Registers::Cpu::Cop0 InstructionBase::Get_cop0d() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_cop0d)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop0d' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_cop0d(&this->instr)); -} - -uint32_t InstructionBase::Get_instr_index() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_label)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'label' operand."); - } -#endif - - return RAB_INSTR_GET_instr_index(&this->instr); -} -uint16_t InstructionBase::Get_immediate() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_immediate)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'immediate' operand."); - } -#endif - - return RAB_INSTR_GET_immediate(&this->instr); -} - -Registers::Cpu::Cop1O32 InstructionBase::GetO32_fs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fs' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_fs(&this->instr)); -} -Registers::Cpu::Cop1O32 InstructionBase::GetO32_ft() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_ft)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'ft' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_ft(&this->instr)); -} -Registers::Cpu::Cop1O32 InstructionBase::GetO32_fd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fd' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_fd(&this->instr)); -} - -Registers::Cpu::Cop1N32 InstructionBase::GetN32_fs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fs' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_fs(&this->instr)); -} -Registers::Cpu::Cop1N32 InstructionBase::GetN32_ft() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_ft)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'ft' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_ft(&this->instr)); -} -Registers::Cpu::Cop1N32 InstructionBase::GetN32_fd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fd' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_fd(&this->instr)); -} - -Registers::Cpu::Cop1N64 InstructionBase::GetN64_fs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fs' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_fs(&this->instr)); -} -Registers::Cpu::Cop1N64 InstructionBase::GetN64_ft() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_ft)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'ft' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_ft(&this->instr)); -} -Registers::Cpu::Cop1N64 InstructionBase::GetN64_fd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fd' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_fd(&this->instr)); -} - -Registers::Cpu::Cop1Control InstructionBase::Get_cop1cs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_cop1cs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop1cs' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_cop1cs(&this->instr)); -} - -Registers::Cpu::Cop2 InstructionBase::Get_cop2t() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_cop2t)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop2t' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_cop2t(&this->instr)); -} - -uint8_t InstructionBase::Get_op() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_op)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'op' operand."); - } -#endif - - return RAB_INSTR_GET_op(&this->instr); -} - -uint32_t InstructionBase::Get_code() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_code)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'code' operand."); - } -#endif - - return RAB_INSTR_GET_code(&this->instr); -} -uint32_t InstructionBase::Get_code_upper() const { -#if 0 -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_code_upper)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'code_upper' operand."); - } -#endif -#endif - - return RAB_INSTR_GET_code_upper(&this->instr); -} -uint32_t InstructionBase::Get_code_lower() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_code_lower)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'code_lower' operand."); - } -#endif - - return RAB_INSTR_GET_code_lower(&this->instr); -} - -uint32_t InstructionBase::Get_copraw() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_copraw)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'copraw' operand."); - } -#endif - - return RAB_INSTR_GET_copraw(&this->instr); -} - -uint8_t InstructionBase::Get_fmt() const { - return RAB_INSTR_GET_fmt(&this->instr); -} -uint8_t InstructionBase::Get_fc() const { - return RAB_INSTR_GET_fc(&this->instr); -} -uint8_t InstructionBase::Get_cond() const { - return RAB_INSTR_GET_cond(&this->instr); -} - -uint8_t InstructionBase::Get_tf() const { - return RAB_INSTR_GET_tf(&this->instr); -} -uint8_t InstructionBase::Get_nd() const { - return RAB_INSTR_GET_nd(&this->instr); -} -uint8_t InstructionBase::Get_bc_fmt() const { - return RAB_INSTR_GET_bc_fmt(&this->instr); -} - -uint8_t InstructionBase::Get_stype() const { - return RAB_INSTR_GET_stype(&this->instr); -} - -/* getters */ - -/* setters */ - -void InstructionBase::Set_opcode(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_opcode(this->instr.word, val); -} -void InstructionBase::Set_sa(uint8_t val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_sa)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'sa' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_sa(this->instr.word, val); -} -void InstructionBase::Set_function(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_function(this->instr.word, val); -} - -void InstructionBase::Set_rs(Registers::Cpu::GprO32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rs' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_rs(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_rt(Registers::Cpu::GprO32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rt' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_rt(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_rd(Registers::Cpu::GprO32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rd' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_rd(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_rs(Registers::Cpu::GprN32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rs' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_rs(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_rt(Registers::Cpu::GprN32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rt' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_rt(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_rd(Registers::Cpu::GprN32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rd' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_rd(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_cop0d(Registers::Cpu::Cop0 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_cop0d)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop0d' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_cop0d(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_instr_index(uint32_t val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_label)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'label' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_instr_index(this->instr.word, val); -} -void InstructionBase::Set_immediate(uint16_t val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_immediate)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'immediate' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_immediate(this->instr.word, val); -} - -void InstructionBase::Set_fs(Registers::Cpu::Cop1O32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fs' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_fs(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_ft(Registers::Cpu::Cop1O32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_ft)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'ft' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_ft(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_fd(Registers::Cpu::Cop1O32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fd' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_fd(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_fs(Registers::Cpu::Cop1N32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fs' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_fs(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_ft(Registers::Cpu::Cop1N32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_ft)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'ft' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_ft(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_fd(Registers::Cpu::Cop1N32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fd' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_fd(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_fs(Registers::Cpu::Cop1N64 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fs' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_fs(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_ft(Registers::Cpu::Cop1N64 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_ft)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'ft' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_ft(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_fd(Registers::Cpu::Cop1N64 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fd' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_fd(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_cop1cs(Registers::Cpu::Cop1Control val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_cop1cs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop1cs' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_cop1cs(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_cop2t(Registers::Cpu::Cop2 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_cop2t)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop2t' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_cop2t(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_op(uint8_t val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_op)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'op' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_op(this->instr.word, val); -} - -void InstructionBase::Set_code(uint32_t val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_code)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'code' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_code(this->instr.word, val); -} - -void InstructionBase::Set_code_upper(uint32_t val) { -#if 0 -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_code_upper)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'code_upper' operand."); - } -#endif -#endif - - this->instr.word = RAB_INSTR_PACK_code_upper(this->instr.word, val); -} - -void InstructionBase::Set_code_lower(uint32_t val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_code_lower)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'code_lower' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_code_lower(this->instr.word, val); -} - -void InstructionBase::Set_copraw(uint32_t val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_copraw)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'copraw' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_copraw(this->instr.word, val); -} - -void InstructionBase::Set_fmt(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_fmt(this->instr.word, val); -} -void InstructionBase::Set_fc(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_fc(this->instr.word, val); -} -void InstructionBase::Set_cond(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_cond(this->instr.word, val); -} - -void InstructionBase::Set_tf(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_tf(this->instr.word, val); -} -void InstructionBase::Set_nd(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_nd(this->instr.word, val); -} -void InstructionBase::Set_bc_fmt(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_bc_fmt(this->instr.word, val); -} - -void InstructionBase::Set_stype(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_stype(this->instr.word, val); -} - -/* setters */ - -/* more getters */ - -uint32_t InstructionBase::getRaw() const { - return RabbitizerInstruction_getRaw(&this->instr); -} - -InstrId::UniqueId InstructionBase::getUniqueId() const { - return static_cast(this->instr.uniqueId); -} -uint32_t InstructionBase::getVram() const { - return this->instr.vram; -} -bool InstructionBase::isInHandwrittenFunction() const { - return this->instr.inHandwrittenFunction; -} - -int32_t InstructionBase::getProcessedImmediate() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_immediate)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'immediate' operand."); - } -#endif - - return RabbitizerInstruction_getProcessedImmediate(&this->instr); -} -uint32_t InstructionBase::getInstrIndexAsVram() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_label)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'label' operand."); - } -#endif - - return RabbitizerInstruction_getInstrIndexAsVram(&this->instr); -} - -int32_t InstructionBase::getBranchOffset() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_branch_target_label)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'branch_target_label' operand."); - } -#endif - - return RabbitizerInstruction_getBranchOffset(&this->instr); -} -int32_t InstructionBase::getGenericBranchOffset(uint32_t currentVram) const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_branch_target_label) && !hasOperandAlias(OperandType::cpu_label)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have either 'branch_target_label' or 'label' operands."); - } -#endif - - return RabbitizerInstruction_getGenericBranchOffset(&this->instr, currentVram); -} - -std::string InstructionBase::getOpcodeName() const { - return InstrId::getOpcodeName(getUniqueId()); -} - -/* more getters */ - -/* */ - -void InstructionBase::blankOut() { - RabbitizerInstruction_blankOut(&this->instr); -} - -/* Instruction examination */ - -bool InstructionBase::isImplemented() const { - return RabbitizerInstruction_isImplemented(&this->instr); -} -bool InstructionBase::isLikelyHandwritten() const { - return RabbitizerInstruction_isLikelyHandwritten(&this->instr); -} -bool InstructionBase::isNop() const { - return RabbitizerInstruction_isNop(&this->instr); -} -bool InstructionBase::isUnconditionalBranch() const { - return RabbitizerInstruction_isUnconditionalBranch(&this->instr); -} -bool InstructionBase::isJrRa() const { - return RabbitizerInstruction_isJrRa(&this->instr); -} -bool InstructionBase::isJrNotRa() const { - return RabbitizerInstruction_isJrNotRa(&this->instr); -} -bool InstructionBase::hasDelaySlot() const { - return RabbitizerInstruction_hasDelaySlot(&this->instr); -} - -std::string InstructionBase::mapInstrToType() const { - return std::string(RabbitizerInstruction_mapInstrToType(&this->instr)); -} - -bool InstructionBase::sameOpcode(const InstructionBase &other) const { - return RabbitizerInstruction_sameOpcode(&this->instr, &other.instr); -} -bool InstructionBase::sameOpcodeButDifferentArguments(const InstructionBase &other) const { - return RabbitizerInstruction_sameOpcodeButDifferentArguments(&this->instr, &other.instr); -} - -bool InstructionBase::hasOperand(OperandType operand) const { - return RabbitizerInstruction_hasOperand(&this->instr, static_cast(operand)); -} -bool InstructionBase::hasOperandAlias(OperandType operand) const { - return RabbitizerInstruction_hasOperandAlias(&this->instr, static_cast(operand)); -} - -uint32_t InstructionBase::getValidBits() const { - return RabbitizerInstruction_getValidBits(&this->instr); -} -bool InstructionBase::isValid() const { - return RabbitizerInstruction_isValid(&this->instr); -} - -/* Instruction examination */ - -/* Instruction descriptor */ - -bool InstructionBase::isUnknownType() const { - return RabbitizerInstrDescriptor_isUnknownType(this->instr.descriptor); -} -bool InstructionBase::isJType() const { - return RabbitizerInstrDescriptor_isJType(this->instr.descriptor); -} -bool InstructionBase::isIType() const { - return RabbitizerInstrDescriptor_isIType(this->instr.descriptor); -} -bool InstructionBase::isRType() const { - return RabbitizerInstrDescriptor_isRType(this->instr.descriptor); -} -bool InstructionBase::isRegimmType() const { - return RabbitizerInstrDescriptor_isRegimmType(this->instr.descriptor); -} - -// TODO -// RabbitizerInstrSuffix instrSuffix() const; - -bool InstructionBase::isBranch() const { - return RabbitizerInstrDescriptor_isBranch(this->instr.descriptor); -} -bool InstructionBase::isBranchLikely() const { - return RabbitizerInstrDescriptor_isBranchLikely(this->instr.descriptor); -} -bool InstructionBase::isJump() const { - return RabbitizerInstrDescriptor_isJump(this->instr.descriptor); -} -bool InstructionBase::isTrap() const { - return RabbitizerInstrDescriptor_isTrap(this->instr.descriptor); -} - -bool InstructionBase::isFloat() const { - return RabbitizerInstrDescriptor_isFloat(this->instr.descriptor); -} -bool InstructionBase::isDouble() const { - return RabbitizerInstrDescriptor_isDouble(this->instr.descriptor); -} - -bool InstructionBase::isUnsigned() const { - return RabbitizerInstrDescriptor_isUnsigned(this->instr.descriptor); -} - -bool InstructionBase::modifiesRt() const { - return RabbitizerInstrDescriptor_modifiesRt(this->instr.descriptor); -} -bool InstructionBase::modifiesRd() const { - return RabbitizerInstrDescriptor_modifiesRd(this->instr.descriptor); -} - -bool InstructionBase::notEmitedByCompilers() const { - return RabbitizerInstrDescriptor_notEmitedByCompilers(this->instr.descriptor); -} - -bool InstructionBase::canBeHi() const { - return RabbitizerInstrDescriptor_canBeHi(this->instr.descriptor); -} -bool InstructionBase::canBeLo() const { - return RabbitizerInstrDescriptor_canBeLo(this->instr.descriptor); -} -bool InstructionBase::doesLink() const { - return RabbitizerInstrDescriptor_doesLink(this->instr.descriptor); -} -bool InstructionBase::doesDereference() const { - return RabbitizerInstrDescriptor_doesDereference(this->instr.descriptor); -} -bool InstructionBase::doesLoad() const { - return RabbitizerInstrDescriptor_doesLoad(this->instr.descriptor); -} -bool InstructionBase::doesStore() const { - return RabbitizerInstrDescriptor_doesStore(this->instr.descriptor); -} -bool InstructionBase::maybeIsMove() const { - return RabbitizerInstrDescriptor_maybeIsMove(this->instr.descriptor); -} - -bool InstructionBase::isPseudo() const { - return RabbitizerInstrDescriptor_isPseudo(this->instr.descriptor); -} - -/* Instruction descriptor */ - -/* Disassembly */ - -bool InstructionBase::mustDisasmAsData() const { - return RabbitizerInstruction_mustDisasmAsData(&this->instr); -} - -std::string InstructionBase::disassembleOperands() const { - const char *immOverridePtr = NULL; - size_t immOverrideLength = 0; - size_t bufferSize; - size_t disassmbledSize; - char *buffer; - - bufferSize = RabbitizerInstruction_getSizeForBufferOperandsDisasm(&instr, immOverrideLength); - - buffer = (char *)malloc(bufferSize + 1); - if (buffer == NULL) { - throw std::runtime_error("buffer == NULL"); - } - - disassmbledSize = RabbitizerInstruction_disassembleOperands(&instr, buffer, immOverridePtr, immOverrideLength); - - std::string output(buffer); - free(buffer); - - if (disassmbledSize > bufferSize) { - throw std::runtime_error("disassmbledSize > bufferSize"); - } - - return output; -} -std::string InstructionBase::disassembleOperands(std::string_view immOverride) const { - const char *immOverridePtr = immOverride.data(); - size_t immOverrideLength = immOverride.size(); - size_t bufferSize; - size_t disassmbledSize; - char *buffer; - - bufferSize = RabbitizerInstruction_getSizeForBufferOperandsDisasm(&instr, immOverrideLength); - - buffer = (char *)malloc(bufferSize + 1); - if (buffer == NULL) { - throw std::runtime_error("buffer == NULL"); - } - - disassmbledSize = RabbitizerInstruction_disassembleOperands(&instr, buffer, immOverridePtr, immOverrideLength); - - std::string output(buffer); - free(buffer); - - if (disassmbledSize > bufferSize) { - throw std::runtime_error("disassmbledSize > bufferSize"); - } - - return output; -} - -std::string InstructionBase::disassembleInstruction(int extraLJust) const { - const char *immOverridePtr = NULL; - size_t immOverrideLength = 0; - size_t bufferSize; - size_t disassmbledSize; - char *buffer; - - bufferSize = RabbitizerInstruction_getSizeForBufferInstrDisasm(&instr, immOverrideLength, extraLJust); - - buffer = (char *)malloc(bufferSize + 1); - if (buffer == NULL) { - throw std::runtime_error("buffer == NULL"); - } - - disassmbledSize = RabbitizerInstruction_disassembleInstruction(&instr, buffer, immOverridePtr, immOverrideLength, extraLJust); - - std::string output(buffer); - free(buffer); - - if (disassmbledSize > bufferSize) { - throw std::runtime_error("disassmbledSize > bufferSize"); - } - - return output; -} -std::string InstructionBase::disassembleInstruction(int extraLJust, std::string_view immOverride) const { - const char *immOverridePtr = immOverride.data(); - size_t immOverrideLength = immOverride.size(); - size_t bufferSize; - size_t disassmbledSize; - char *buffer; - - bufferSize = RabbitizerInstruction_getSizeForBufferInstrDisasm(&instr, immOverrideLength, extraLJust); - - buffer = (char *)malloc(bufferSize + 1); - if (buffer == NULL) { - throw std::runtime_error("buffer == NULL"); - } - - disassmbledSize = RabbitizerInstruction_disassembleInstruction(&instr, buffer, immOverridePtr, immOverrideLength, extraLJust); - - std::string output(buffer); - free(buffer); - - if (disassmbledSize > bufferSize) { - throw std::runtime_error("disassmbledSize > bufferSize"); - } - - return output; -} - -std::string InstructionBase::disassembleAsData(int extraLJust) const { - size_t bufferSize; - size_t disassmbledSize; - char *buffer; - - bufferSize = RabbitizerInstruction_getSizeForBufferDataDisasm(&instr, extraLJust); - - buffer = (char *)malloc(bufferSize + 1); - if (buffer == NULL) { - throw std::runtime_error("buffer == NULL"); - } - - disassmbledSize = RabbitizerInstruction_disassembleAsData(&instr, buffer, extraLJust); - - std::string output(buffer); - free(buffer); - - if (disassmbledSize > bufferSize) { - throw std::runtime_error("disassmbledSize > bufferSize"); - } - - return output; -} - -std::string InstructionBase::disassemble(int extraLJust) const { - const char *immOverridePtr = NULL; - size_t immOverrideLength = 0; - size_t bufferSize; - size_t disassmbledSize; - char *buffer; - - bufferSize = RabbitizerInstruction_getSizeForBuffer(&instr, immOverrideLength, extraLJust); - - buffer = (char *)malloc(bufferSize + 1); - if (buffer == NULL) { - throw std::runtime_error("buffer == NULL"); - } - - disassmbledSize = RabbitizerInstruction_disassemble(&instr, buffer, immOverridePtr, immOverrideLength, extraLJust); - - std::string output(buffer); - free(buffer); - - if (disassmbledSize > bufferSize) { - throw std::runtime_error("disassmbledSize > bufferSize"); - } - - return output; -} - -std::string InstructionBase::disassemble(int extraLJust, std::string_view immOverride) const { - const char *immOverridePtr = immOverride.data(); - size_t immOverrideLength = immOverride.size(); - size_t bufferSize; - size_t disassmbledSize; - char *buffer; - - bufferSize = RabbitizerInstruction_getSizeForBuffer(&instr, immOverrideLength, extraLJust); - - buffer = (char *)malloc(bufferSize + 1); - if (buffer == NULL) { - throw std::runtime_error("buffer == NULL"); - } - - disassmbledSize = RabbitizerInstruction_disassemble(&instr, buffer, immOverridePtr, immOverrideLength, extraLJust); - - std::string output(buffer); - free(buffer); - - if (disassmbledSize > bufferSize) { - throw std::runtime_error("disassmbledSize > bufferSize"); - } - - return output; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionCpu.cpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionCpu.cpp deleted file mode 100644 index 9488b9a3..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionCpu.cpp +++ /dev/null @@ -1,15 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/InstructionCpu.hpp" - -using namespace rabbitizer; - -InstructionCpu::InstructionCpu(uint32_t word, uint32_t vram) : InstructionBase() { - RabbitizerInstruction_init(&this->instr, word, vram); - RabbitizerInstruction_processUniqueId(&this->instr); -} - -InstructionCpu::~InstructionCpu() { - RabbitizerInstruction_destroy(&this->instr); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionR5900.cpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionR5900.cpp deleted file mode 100644 index 0fe00630..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionR5900.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/InstructionR5900.hpp" - -#include - -#include "instructions/RabbitizerInstructionR5900.h" - -using namespace rabbitizer; - -InstructionR5900::InstructionR5900(uint32_t word, uint32_t vram) : InstructionBase() { - RabbitizerInstructionR5900_init(&this->instr, word, vram); - RabbitizerInstructionR5900_processUniqueId(&this->instr); -} - -InstructionR5900::~InstructionR5900() { - RabbitizerInstructionR5900_destroy(&this->instr); -} - -Registers::R5900::VF InstructionR5900::GetR5900_vfs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vfs' operand."); - } -#endif - - return static_cast(RAB_INSTR_R5900_GET_vfs(&this->instr)); -} - -Registers::R5900::VF InstructionR5900::GetR5900_vft() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vft' operand."); - } -#endif - - return static_cast(RAB_INSTR_R5900_GET_vft(&this->instr)); -} - -Registers::R5900::VF InstructionR5900::GetR5900_vfd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vfd' operand."); - } -#endif - - return static_cast(RAB_INSTR_R5900_GET_vfd(&this->instr)); -} - -Registers::R5900::VI InstructionR5900::GetR5900_vis() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vis' operand."); - } -#endif - - return static_cast(RAB_INSTR_R5900_GET_vis(&this->instr)); -} - -Registers::R5900::VI InstructionR5900::GetR5900_vit() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vit' operand."); - } -#endif - - return static_cast(RAB_INSTR_R5900_GET_vit(&this->instr)); -} - -Registers::R5900::VI InstructionR5900::GetR5900_vid() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vid' operand."); - } -#endif - - return static_cast(RAB_INSTR_R5900_GET_vid(&this->instr)); -} - -uint8_t InstructionR5900::GetR5900_mmi_function() const { - return RAB_INSTR_R5900_GET_mmi_function(&this->instr); -} -uint8_t InstructionR5900::GetR5900_fhi_flo() const { - return RAB_INSTR_R5900_GET_fhi_flo(&this->instr); -} - -uint8_t InstructionR5900::GetR5900_xyzw_x() const { - return RAB_INSTR_R5900_GET_xyzw_x(&this->instr); -} -uint8_t InstructionR5900::GetR5900_xyzw_y() const { - return RAB_INSTR_R5900_GET_xyzw_y(&this->instr); -} -uint8_t InstructionR5900::GetR5900_xyzw_z() const { - return RAB_INSTR_R5900_GET_xyzw_z(&this->instr); -} -uint8_t InstructionR5900::GetR5900_xyzw_w() const { - return RAB_INSTR_R5900_GET_xyzw_w(&this->instr); -} -uint8_t InstructionR5900::GetR5900_n() const { - return RAB_INSTR_R5900_GET_n(&this->instr); -} -uint8_t InstructionR5900::GetR5900_l() const { - return RAB_INSTR_R5900_GET_l(&this->instr); -} -uint8_t InstructionR5900::GetR5900_m() const { - return RAB_INSTR_R5900_GET_m(&this->instr); -} - -uint8_t InstructionR5900::GetR5900_imm5() const { - return RAB_INSTR_R5900_GET_imm5(&this->instr); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionRsp.cpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionRsp.cpp deleted file mode 100644 index 891a0351..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionRsp.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/InstructionRsp.hpp" - -#include - -#include "instructions/RabbitizerInstructionRsp.h" - -using namespace rabbitizer; - -InstructionRsp::InstructionRsp(uint32_t word, uint32_t vram) : InstructionBase() { - RabbitizerInstructionRsp_init(&this->instr, word, vram); - RabbitizerInstructionRsp_processUniqueId(&this->instr); -} - -InstructionRsp::~InstructionRsp() { - RabbitizerInstructionRsp_destroy(&this->instr); -} - -Registers::Rsp::Gpr InstructionRsp::GetRsp_rs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rs' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rs(&this->instr)); -} -Registers::Rsp::Gpr InstructionRsp::GetRsp_rt() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rt' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rt(&this->instr)); -} -Registers::Rsp::Gpr InstructionRsp::GetRsp_rd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rd' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rd(&this->instr)); -} - -Registers::Rsp::Cop0 InstructionRsp::GetRsp_cop0d() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_cop0d)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop0d' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_cop0d(&this->instr)); -} - -Registers::Rsp::Cop2 InstructionRsp::GetRsp_cop2t() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_cop2t)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop2t' operand."); - } -#endif - - return static_cast(RAB_INSTR_RSP_GET_cop2t(&this->instr)); -} - -Registers::Rsp::Cop2Control InstructionRsp::GetRsp_cop2cd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_cop2t)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop2cd' operand."); - } -#endif - - return static_cast(RAB_INSTR_RSP_GET_cop2cd(&this->instr)); -} - -Registers::Rsp::Vector InstructionRsp::GetRsp_vs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_vs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vs' operand."); - } -#endif - - return static_cast(RAB_INSTR_RSP_GET_vs(&this->instr)); -} -Registers::Rsp::Vector InstructionRsp::GetRsp_vt() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_vt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vt' operand."); - } -#endif - - return static_cast(RAB_INSTR_RSP_GET_vt(&this->instr)); -} -Registers::Rsp::Vector InstructionRsp::GetRsp_vd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_vd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vd' operand."); - } -#endif - - return static_cast(RAB_INSTR_RSP_GET_vd(&this->instr)); -} - -uint8_t InstructionRsp::GetRsp_elementhigh() const { - return RAB_INSTR_RSP_GET_elementhigh(&this->instr); -} -uint8_t InstructionRsp::GetRsp_elementlow() const { - return RAB_INSTR_RSP_GET_elementlow(&this->instr); -} - -uint8_t InstructionRsp::GetRsp_index() const { - return RAB_INSTR_RSP_GET_index(&this->instr); -} -uint8_t InstructionRsp::GetRsp_de() const { - return RAB_INSTR_RSP_GET_de(&this->instr); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerLoPairingInfo.h b/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerLoPairingInfo.h deleted file mode 100644 index b6a70ed2..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerLoPairingInfo.h +++ /dev/null @@ -1,34 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_LO_PAIRING_INFO_H -#define RABBITIZER_LO_PAIRING_INFO_H -#pragma once - -#include - -#include "common/Utils.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef struct RabbitizerLoPairingInfo { - int instrOffset; - int64_t value; // could be either an unsigned 32 bits number or a signed one, so use 64 bits to ensure it fits - bool shouldProcess; - bool isGpRel; - bool isGpGot; -} RabbitizerLoPairingInfo; - - -NON_NULL(1) -void RabbitizerLoPairingInfo_Init(RabbitizerLoPairingInfo *self); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerRegistersTracker.h b/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerRegistersTracker.h deleted file mode 100644 index 36ccbd56..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerRegistersTracker.h +++ /dev/null @@ -1,65 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_REGISTERS_TRACKER_H -#define RABBITIZER_REGISTERS_TRACKER_H -#pragma once - -#include "common/Utils.h" -#include "RabbitizerTrackedRegisterState.h" -#include "RabbitizerLoPairingInfo.h" -#include "instructions/RabbitizerInstruction.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define RAB_REGISTERS_COUNT 32 - - -typedef struct RabbitizerRegistersTracker { - RabbitizerTrackedRegisterState registers[RAB_REGISTERS_COUNT]; -} RabbitizerRegistersTracker; - -// TODO: Change functions which use parameters as a way to return values into actual structs returned by the functions - -NON_NULL(1) -void RabbitizerRegistersTracker_init(RabbitizerRegistersTracker *self, const RabbitizerRegistersTracker *other); -NON_NULL(1) -void RabbitizerRegistersTracker_destroy(RabbitizerRegistersTracker *self); - -NON_NULL(1, 2) -bool RabbitizerRegistersTracker_moveRegisters(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr); -NON_NULL(1, 2) -void RabbitizerRegistersTracker_overwriteRegisters(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset); -NON_NULL(1, 2, 3) -void RabbitizerRegistersTracker_unsetRegistersAfterFuncCall(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, const RabbitizerInstruction *prevInstr); -NON_NULL(1, 2, 4) -bool RabbitizerRegistersTracker_getAddressIfCanSetType(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, uint32_t *dstAddress); -NON_NULL(1, 2, 3, 4) -bool RabbitizerRegistersTracker_getJrInfo(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int *dstOffset, uint32_t *dstAddress); - -// prevInstr can be NULL -NON_NULL(1, 2) -void RabbitizerRegistersTracker_processLui(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, const RabbitizerInstruction *prevInstr); -NON_NULL(1, 2) -void RabbitizerRegistersTracker_processGpLoad(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset); -NON_NULL(1, 2, 3) -bool RabbitizerRegistersTracker_getLuiOffsetForConstant(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int *dstOffset); -NON_NULL(1, 2) -void RabbitizerRegistersTracker_processConstant(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, uint32_t value, int offset); -NON_NULL(1, 2, 4, 5) // deprecated -bool RabbitizerRegistersTracker_getLuiOffsetForLo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, int *dstOffset, bool *dstIsGp); -NODISCARD NON_NULL(1, 2) -RabbitizerLoPairingInfo RabbitizerRegistersTracker_preprocessLoAndGetInfo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset); -NON_NULL(1, 2) -void RabbitizerRegistersTracker_processLo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, uint32_t value, int offset); -NON_NULL(1, 2) -bool RabbitizerRegistersTracker_hasLoButNoHi(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerTrackedRegisterState.h b/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerTrackedRegisterState.h deleted file mode 100644 index daf4b2da..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerTrackedRegisterState.h +++ /dev/null @@ -1,80 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_TRACKED_REGISTER_STATE_H -#define RABBITIZER_TRACKED_REGISTER_STATE_H -#pragma once - -#include -#include -#include - -#include "common/Utils.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef struct RabbitizerTrackedRegisterState { - int registerNum; - - bool hasLuiValue; - int luiOffset; // The offset of last lui which set a value to this register - bool luiSetOnBranchLikely; - - bool hasGpGot; - int gpGotOffset; - - bool hasLoValue; - int loOffset; - bool dereferenced; - int dereferenceOffset; - - uint32_t value; -} RabbitizerTrackedRegisterState; - - -NON_NULL(1) -void RabbitizerTrackedRegisterState_init(RabbitizerTrackedRegisterState *self, int registerNum); -NON_NULL(1) -void RabbitizerTrackedRegisterState_destroy(RabbitizerTrackedRegisterState *self); - -NON_NULL(1) -void RabbitizerTrackedRegisterState_clear(RabbitizerTrackedRegisterState *self); -NON_NULL(1) -void RabbitizerTrackedRegisterState_clearHi(RabbitizerTrackedRegisterState *self); -NON_NULL(1) -void RabbitizerTrackedRegisterState_clearGp(RabbitizerTrackedRegisterState *self); -NON_NULL(1) -void RabbitizerTrackedRegisterState_clearLo(RabbitizerTrackedRegisterState *self); - -NON_NULL(1, 2) -void RabbitizerTrackedRegisterState_copyState(RabbitizerTrackedRegisterState *self, const RabbitizerTrackedRegisterState *other); - -NON_NULL(1) -void RabbitizerTrackedRegisterState_setHi(RabbitizerTrackedRegisterState *self, uint32_t value, int offset); -NON_NULL(1) -void RabbitizerTrackedRegisterState_setGpLoad(RabbitizerTrackedRegisterState *self, uint32_t value, int offset); -NON_NULL(1) -void RabbitizerTrackedRegisterState_setLo(RabbitizerTrackedRegisterState *self, uint32_t value, int offset); - -NON_NULL(1) -void RabbitizerTrackedRegisterState_deref(RabbitizerTrackedRegisterState *self, int offset); -NON_NULL(1, 2) -void RabbitizerTrackedRegisterState_dereferenceState(RabbitizerTrackedRegisterState *self, const RabbitizerTrackedRegisterState *other, int offset); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerTrackedRegisterState_hasAnyValue(const RabbitizerTrackedRegisterState *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerTrackedRegisterState_wasSetInCurrentOffset(const RabbitizerTrackedRegisterState *self, int offset); - -NON_NULL(1) -void RabbitizerTrackedRegisterState_fprint(const RabbitizerTrackedRegisterState *self, FILE* outFile); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/common/Abi.inc b/tools/ido-static-recomp/tools/rabbitizer/include/common/Abi.inc deleted file mode 100644 index fa01d92f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/common/Abi.inc +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RABBITIZER_DEF_ABI(NUMERIC), -RABBITIZER_DEF_ABI(O32), -RABBITIZER_DEF_ABI(N32), -RABBITIZER_DEF_ABI(N64), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerConfig.h b/tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerConfig.h deleted file mode 100644 index 8b9def78..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerConfig.h +++ /dev/null @@ -1,83 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_CONFIG_H -#define RABBITIZER_CONFIG_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -#define RABBITIZER_DEF_ABI(name) RABBITIZER_ABI_##name - -typedef enum RabbitizerAbi { - #include "Abi.inc" - - RABBITIZER_DEF_ABI(MAX), -} RabbitizerAbi; - -#undef RABBITIZER_DEF_ABI - -RabbitizerAbi RabbitizerAbi_fromStr(const char *name); - - -typedef struct RabbitizerConfig_RegisterNames { - bool namedRegisters; // Enables using named registers. This option takes precedence over the other named register options - RabbitizerAbi gprAbiNames; // The ABI names to be used for general purpose registers when disassembling the main processor's instructions - RabbitizerAbi fprAbiNames; // The ABI names to be used for floating point registers when disassembling the floating point (coprocessor 1) instructions - bool userFpcCsr; // Use FpcCsr as register $31 for the FP control/status register - bool vr4300Cop0NamedRegisters; // Use named registers for VR4300's coprocessor 0 registers - bool vr4300RspCop0NamedRegisters; // Use named registers for VR4300's RSP's coprocessor 0 registers -} RabbitizerConfig_RegisterNames; - -typedef struct RabbitizerConfig_PseudoInstr { - bool enablePseudos; // Produce pseudo instructions (like `move` or `b`) whenever those may match the desired original instruction - bool pseudoBeqz; - bool pseudoBnez; - bool pseudoB; - bool pseudoMove; - bool pseudoNot; - bool pseudoNegu; - bool pseudoBal; -} RabbitizerConfig_PseudoInstr; - -typedef struct RabbitizerConfig_ToolchainTweaks { - bool treatJAsUnconditionalBranch; //! @deprecated - /** - * Enables a few fixes for SN64's assembler related to div/divu instructions - * - * - SN64's assembler doesn't like assembling `div $0, a, b` with .set noat active. - * Removing the $0 fixes this issue (but not for handwritten asm) - * - * - SN64's assembler expands div to have break if dividing by zero - * However, the break it generates is different than the one it generates with `break N` - * So we replace break instrutions for SN64 with the exact word that the assembler generates when expanding div - */ - bool sn64DivFix; -} RabbitizerConfig_ToolchainTweaks; - -typedef struct RabbitizerConfig_Misc { - int opcodeLJust; // The minimal number of characters to left-align the opcode name - bool unknownInstrComment; // Generate a pseudo-disassembly comment when disassembling non implemented instructions - bool omit0XOnSmallImm; - bool upperCaseImm; -} RabbitizerConfig_Misc; - -typedef struct RabbitizerConfig { - RabbitizerConfig_RegisterNames regNames; - RabbitizerConfig_PseudoInstr pseudos; - RabbitizerConfig_ToolchainTweaks toolchainTweaks; - RabbitizerConfig_Misc misc; -} RabbitizerConfig; - -extern RabbitizerConfig RabbitizerConfig_Cfg; - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerVersion.h b/tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerVersion.h deleted file mode 100644 index d59e716f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerVersion.h +++ /dev/null @@ -1,33 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_VERSION_H -#define RABBITIZER_VERSION_H - -#include "Utils.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -// Header version -#define RAB_VERSION_MAJOR 1 -#define RAB_VERSION_MINOR 2 -#define RAB_VERSION_PATCH 3 - -#define RAB_VERSION_STR RAB_STRINGIFY(RAB_VERSION_MAJOR) "." RAB_STRINGIFY(RAB_VERSION_MINOR) "." RAB_STRINGIFY(RAB_VERSION_PATCH) - -// Compiled library version -extern const int RabVersion_Major; -extern const int RabVersion_Minor; -extern const int RabVersion_Patch; - -extern const char RabVersion_Str[]; - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/common/Utils.h b/tools/ido-static-recomp/tools/rabbitizer/include/common/Utils.h deleted file mode 100644 index 6255a04a..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/common/Utils.h +++ /dev/null @@ -1,116 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_UTILS_H -#define RABBITIZER_UTILS_H - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -#if !defined(__GNUC__) && !defined(__clang__) -#define __attribute__(x) -#endif - -#if __STDC_VERSION__ >= 202000L -#define CONST [[gnu::const]] -#define DEPRECATED(reason) [[deprecated (reason)]] -#define FALLTHROUGH [[fallthrough]] -#define NODISCARD [[nodiscard]] -#define NORETURN [[noreturn]] -#define NON_NULL(...) [[gnu::nonnull (__VA_ARGS__)]] -#define PURE [[gnu::pure]] -#define RETURNS_NON_NULL [[gnu::returns_nonnull]] -#define UNUSED [[maybe_unused]] -#else -#define CONST __attribute__((const)) -#define DEPRECATED(reason) __attribute__((deprecated (reason))) -#define FALLTHROUGH __attribute__((fallthrough)) -#define NODISCARD __attribute__((warn_unused_result)) -#define NORETURN _Noreturn -#define NON_NULL(...) __attribute__((nonnull (__VA_ARGS__))) -#define PURE __attribute__((pure)) -#define RETURNS_NON_NULL __attribute__((returns_nonnull)) -#define UNUSED __attribute__((unused)) -#endif - - -#if defined(_MSC_VER) -# define UNREACHABLE __assume(0) -#elif defined(__GNUC__) || defined(__clang__) -# define UNREACHABLE __builtin_unreachable() -#else -# define UNREACHABLE -#endif - - -#define ARRAY_COUNT(arr) (sizeof(arr) / sizeof((arr)[0])) - -#define RAB_STRINGIFY(x) #x - -#define MASK(v, w) ((v) & ((1 << (w)) - 1)) - -/* - * the SHIFT macros take a value, a shift amount, and a width. - * - * For the left shift, the lower bits of the value are masked, - * then shifted left. - * - * For the right shift, the value is shifted right, then the lower bits - * are masked. - * - * (NOTE: SHIFTL(v, 0, 32) won't work, just use an assignment) - * - */ -#define SHIFTL(v, s, w) (MASK((v), (w)) << (s)) -#define SHIFTR(v, s, w) (MASK((v) >> (s), (w))) - -#define BITREPACK(fullword, v, s, w) ((SHIFTR((fullword), (s)+(w), 32-((s)+(w))) << ((s)+(w))) | SHIFTL((v), (s), (w)) | MASK((fullword), (s))) -#define BITREPACK_RIGHT(fullword, v, s, w) (SHIFTL((v), (s), (w)) | MASK((fullword), (s))) - - -#define RABUTILS_BUFFER_ADVANCE(buffer, totalSize, expression) \ - do { \ - size_t __tempSize = expression; \ - (buffer) += __tempSize; \ - (totalSize) += __tempSize; \ - } while (0) - -#define RABUTILS_BUFFER_WRITE_CHAR(buffer, totalSize, character) \ - do { \ - *(buffer) = (character); \ - RABUTILS_BUFFER_ADVANCE(buffer, totalSize, 1); \ - } while (0) - -#define RABUTILS_BUFFER_SPRINTF(buffer, totalSize, format, ...) \ - do { \ - int _len = sprintf(buffer, format, __VA_ARGS__); \ - assert(_len > 0); \ - RABUTILS_BUFFER_ADVANCE(buffer, totalSize, _len); \ - } while (0) - -#define RABUTILS_BUFFER_CPY(buffer, totalSize, string) \ - do { \ - size_t _tempSize = strlen(string); \ - memcpy(buffer, string, _tempSize); \ - RABUTILS_BUFFER_ADVANCE(buffer, totalSize, _tempSize); \ - } while (0) - - -CONST NODISCARD -int32_t RabbitizerUtils_From2Complement(uint32_t number, int bits); -NON_NULL(1) -size_t RabbitizerUtils_CharFill(char *dst, int count, char fillchar); -NON_NULL(1, 3) -size_t RabbitizerUtils_escapeString(char *dst, size_t dstSize, const char *src, size_t srcSize); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/InstrCategory.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/InstrCategory.inc deleted file mode 100644 index 9a6d85c1..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/InstrCategory.inc +++ /dev/null @@ -1,6 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RABBITIZER_DEF_INSTR_CATEGORY(CPU), -RABBITIZER_DEF_INSTR_CATEGORY(RSP), // N64 -RABBITIZER_DEF_INSTR_CATEGORY(R5900), // PS2's Emotion Engine diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrDescriptor.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrDescriptor.h deleted file mode 100644 index e92f7971..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrDescriptor.h +++ /dev/null @@ -1,141 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRDESCRIPTOR_H -#define RABBITIZER_INSTRDESCRIPTOR_H -#pragma once - -#include - -#include "common/Utils.h" -#include "RabbitizerOperandType.h" -#include "RabbitizerInstrId.h" -#include "RabbitizerInstrSuffix.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef enum RabbitizerInstrType { - RABBITIZER_INSTR_TYPE_UNKNOWN, - RABBITIZER_INSTR_TYPE_J, - RABBITIZER_INSTR_TYPE_I, - RABBITIZER_INSTR_TYPE_R, - RABBITIZER_INSTR_TYPE_REGIMM, - RABBITIZER_INSTR_TYPE_MAX, -} RabbitizerInstrType; - -typedef enum RabbitizerArchitectureVersion { - RABBITIZER_ARCHVERSION_INVALID=-1, - RABBITIZER_ARCHVERSION_UNKNOWN, - RABBITIZER_ARCHVERSION_MIPS_I, - RABBITIZER_ARCHVERSION_MIPS_II, - RABBITIZER_ARCHVERSION_MIPS_III, - RABBITIZER_ARCHVERSION_MIPS_IV -} RabbitizerArchitectureVersion; - -typedef struct RabbitizerInstrDescriptor { - RabbitizerOperandType operands[4]; - RabbitizerInstrType instrType; - - RabbitizerInstrSuffix instrSuffix; - - bool isBranch; - bool isBranchLikely; - bool isJump; - bool isTrap; - - bool isFloat; - bool isDouble; - - bool isUnsigned; - - bool modifiesRt; - bool modifiesRd; - - bool notEmitedByCompilers; - - bool canBeHi; - bool canBeLo; - bool doesLink; // "and link" family of instructions - bool doesDereference; - bool doesLoad; // loads data from memory - bool doesStore; // stores data to memory - bool maybeIsMove; - - bool isPseudo; - - RabbitizerArchitectureVersion architectureVersion; // TODO: consider removing -} RabbitizerInstrDescriptor; - -// TODO: less redundant name -extern const RabbitizerInstrDescriptor RabbitizerInstrDescriptor_Descriptors[]; - - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isUnknownType(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isJType(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isIType(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isRType(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isRegimmType(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -RabbitizerInstrSuffix RabbitizerInstrDescriptor_instrSuffix(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isBranch(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isBranchLikely(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isJump(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isTrap(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isFloat(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isDouble(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isUnsigned(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_modifiesRt(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_modifiesRd(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_notEmitedByCompilers(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_canBeHi(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_canBeLo(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_doesLink(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_doesDereference(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_doesLoad(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_doesStore(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_maybeIsMove(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isPseudo(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -RabbitizerArchitectureVersion RabbitizerInstrDescriptor_getArchitectureVersion(const RabbitizerInstrDescriptor *self); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrId.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrId.h deleted file mode 100644 index c3838211..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrId.h +++ /dev/null @@ -1,46 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRID_H -#define RABBITIZER_INSTRID_H -#pragma once - -#include "common/Utils.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \ - RABBITIZER_INSTR_ID_##prefix##_##name, - -#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) \ - RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__) - -typedef enum RabbitizerInstrId { - #include "instructions/instr_id/RabbitizerInstrId_cpu.inc" - - #include "instructions/instr_id/RabbitizerInstrId_rsp.inc" - - #include "instructions/instr_id/RabbitizerInstrId_r5900.inc" - - RABBITIZER_INSTR_ID_ALL_MAX = RABBITIZER_DEF_INSTR_ID(r5900, , MAX, ) -} RabbitizerInstrId; - -#undef RABBITIZER_DEF_INSTR_ID -#undef RABBITIZER_DEF_INSTR_ID_ALTNAME - - -extern const char *RabbitizerInstrId_Names[]; - - -CONST NODISCARD RETURNS_NON_NULL -const char *RabbitizerInstrId_getOpcodeName(RabbitizerInstrId uniqueId); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrSuffix.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrSuffix.h deleted file mode 100644 index 7c59e334..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrSuffix.h +++ /dev/null @@ -1,36 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRSUFFIX_H -#define RABBITIZER_INSTRSUFFIX_H -#pragma once - -#include "common/Utils.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -struct RabbitizerInstruction; - -typedef enum RabbitizerInstrSuffix { - RABINSTRSUFFIX_NONE, - - RABINSTRSUFFIX_R5900_xyzw, - - RABINSTRSUFFIX_MAX -} RabbitizerInstrSuffix; - -CONST NODISCARD NON_NULL(1) -size_t RabbitizerInstrSuffix_getSizeForBuffer(const struct RabbitizerInstruction *self, RabbitizerInstrSuffix instrSuffix); - -CONST NODISCARD NON_NULL(1, 2) -size_t RabbitizerInstrSuffix_processSuffix(const struct RabbitizerInstruction *self, char *dst, RabbitizerInstrSuffix instrSuffix); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstruction.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstruction.h deleted file mode 100644 index 17e3bab9..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstruction.h +++ /dev/null @@ -1,263 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRUCTION_H -#define RABBITIZER_INSTRUCTION_H -#pragma once - -#include -#include -#include - -#include "common/Utils.h" - -#include "RabbitizerInstrId.h" -#include "RabbitizerInstrDescriptor.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define RABBITIZER_DEF_INSTR_CATEGORY(name) RABBITIZER_INSTRCAT_##name - -typedef enum RabbitizerInstrCategory { - #include "instructions/InstrCategory.inc" - - RABBITIZER_DEF_INSTR_CATEGORY(MAX), -} RabbitizerInstrCategory; - -#undef RABBITIZER_DEF_INSTR_CATEGORY - - -typedef struct RabbitizerInstruction { - uint32_t word; - uint32_t _mandatorybits; - - RabbitizerInstrId uniqueId; - const RabbitizerInstrDescriptor *descriptor; - - uint32_t vram; - bool _handwrittenCategory; - bool inHandwrittenFunction; - RabbitizerInstrCategory category; -} RabbitizerInstruction; - - -#define RAB_INSTR_GET_opcode(self) (SHIFTR((self)->word, 26, 6)) -#define RAB_INSTR_GET_rs(self) (SHIFTR((self)->word, 21, 5)) -#define RAB_INSTR_GET_rt(self) (SHIFTR((self)->word, 16, 5)) -#define RAB_INSTR_GET_rd(self) (SHIFTR((self)->word, 11, 5)) -#define RAB_INSTR_GET_sa(self) (SHIFTR((self)->word, 6, 5)) -#define RAB_INSTR_GET_function(self) (SHIFTR((self)->word, 0, 6)) - -#define RAB_INSTR_GET_cop0d(self) (SHIFTR((self)->word, 11, 5)) - -#define RAB_INSTR_GET_instr_index(self) (SHIFTR((self)->word, 0, 26)) -#define RAB_INSTR_GET_immediate(self) (SHIFTR((self)->word, 0, 16)) - -#define RAB_INSTR_GET_fs(self) (SHIFTR((self)->word, 11, 5)) -#define RAB_INSTR_GET_ft(self) (SHIFTR((self)->word, 16, 5)) -#define RAB_INSTR_GET_fd(self) (SHIFTR((self)->word, 6, 5)) -#define RAB_INSTR_GET_cop1cs(self) (SHIFTR((self)->word, 11, 5)) - -#define RAB_INSTR_GET_op(self) (SHIFTR((self)->word, 16, 5)) - -#define RAB_INSTR_GET_code(self) (SHIFTR((self)->word, 6, 20)) -#define RAB_INSTR_GET_code_upper(self) (SHIFTR((self)->word, 16, 10)) -#define RAB_INSTR_GET_code_lower(self) (SHIFTR((self)->word, 6, 10)) - -#define RAB_INSTR_GET_copraw(self) (SHIFTR((self)->word, 0, 25)) - -#define RAB_INSTR_GET_fmt(self) (SHIFTR((self)->word, 21, 5)) -#define RAB_INSTR_GET_fc(self) (SHIFTR((self)->word, 4, 2)) -#define RAB_INSTR_GET_cond(self) (SHIFTR((self)->word, 0, 4)) - -#define RAB_INSTR_GET_cop2t(self) (SHIFTR((self)->word, 16, 5)) - -#define RAB_INSTR_GET_tf(self) (SHIFTR((self)->word, 16, 1)) -#define RAB_INSTR_GET_nd(self) (SHIFTR((self)->word, 17, 1)) -#define RAB_INSTR_GET_bc_fmt(self) (SHIFTR((self)->word, 16, 5)) - -#define RAB_INSTR_GET_stype(self) (SHIFTR((self)->word, 6, 5)) - - -#define RAB_INSTR_PACK_opcode(word, value) (BITREPACK_RIGHT((word), (value), 26, 6)) -#define RAB_INSTR_PACK_rs(word, value) (BITREPACK((word), (value), 21, 5)) -#define RAB_INSTR_PACK_rt(word, value) (BITREPACK((word), (value), 16, 5)) -#define RAB_INSTR_PACK_rd(word, value) (BITREPACK((word), (value), 11, 5)) -#define RAB_INSTR_PACK_sa(word, value) (BITREPACK((word), (value), 6, 5)) -#define RAB_INSTR_PACK_function(word, value) (BITREPACK((word), (value), 0, 6)) - -#define RAB_INSTR_PACK_cop0d(word, value) (BITREPACK((word), (value), 11, 5)) - -#define RAB_INSTR_PACK_instr_index(word, value) (BITREPACK((word), (value), 0, 26)) -#define RAB_INSTR_PACK_immediate(word, value) (BITREPACK((word), (value), 0, 16)) - -#define RAB_INSTR_PACK_code(word, value) (BITREPACK((word), (value), 6, 20)) -#define RAB_INSTR_PACK_code_upper(word, value) (BITREPACK((word), (value), 16, 10)) -#define RAB_INSTR_PACK_code_lower(word, value) (BITREPACK((word), (value), 6, 10)) - -#define RAB_INSTR_PACK_copraw(word, value) (BITREPACK((word), (value), 0, 25)) - -#define RAB_INSTR_PACK_fmt(word, value) (BITREPACK((word), (value), 21, 5)) -#define RAB_INSTR_PACK_fc(word, value) (BITREPACK((word), (value), 4, 2)) -#define RAB_INSTR_PACK_cond(word, value) (BITREPACK((word), (value), 0, 4)) - -#define RAB_INSTR_PACK_fs(word, value) (BITREPACK((word), (value), 11, 5)) -#define RAB_INSTR_PACK_ft(word, value) (BITREPACK((word), (value), 16, 5)) -#define RAB_INSTR_PACK_fd(word, value) (BITREPACK((word), (value), 6, 5)) -#define RAB_INSTR_PACK_cop1cs(word, value) (BITREPACK((word), (value), 11, 5)) - -#define RAB_INSTR_PACK_op(word, value) (BITREPACK((word), (value), 16, 5)) - -#define RAB_INSTR_PACK_cop2t(word, value) (BITREPACK((word), (value), 16, 5)) - -#define RAB_INSTR_PACK_tf(word, value) (BITREPACK((word), (value), 16, 1)) -#define RAB_INSTR_PACK_nd(word, value) (BITREPACK((word), (value), 17, 1)) -#define RAB_INSTR_PACK_bc_fmt(word, value) (BITREPACK((word), (value), 16, 5)) - -#define RAB_INSTR_PACK_stype(word, value) (BITREPACK((word), (value), 6, 5)) - - -NON_NULL(1) -void RabbitizerInstruction_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram); -NON_NULL(1) -void RabbitizerInstruction_destroy(RabbitizerInstruction* self); - - -/* Process uniqueId */ - -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Normal(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Special(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Regimm(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor0_BC0(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor0_Tlb(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor0(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor1_BC1(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuS(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuD(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuW(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuL(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor1(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor2(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId(RabbitizerInstruction *self); - -/* Process uniqueId */ - - -/* General getters */ - -NODISCARD NON_NULL(1) PURE -uint32_t RabbitizerInstruction_getRaw(const RabbitizerInstruction *self); - -NODISCARD NON_NULL(1) PURE -uint32_t RabbitizerInstruction_getImmediate(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -int32_t RabbitizerInstruction_getProcessedImmediate(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -uint32_t RabbitizerInstruction_getInstrIndex(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -uint32_t RabbitizerInstruction_getInstrIndexAsVram(const RabbitizerInstruction *self); - -NODISCARD NON_NULL(1) PURE -int32_t RabbitizerInstruction_getBranchOffset(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -int32_t RabbitizerInstruction_getGenericBranchOffset(const RabbitizerInstruction *self, uint32_t currentVram); - -/* General getters */ - -NON_NULL(1) -void RabbitizerInstruction_blankOut(RabbitizerInstruction *self); - - -/* Instruction examination */ - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_isImplemented(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_isLikelyHandwritten(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_isNop(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_isUnconditionalBranch(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_isJrRa(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_isJrNotRa(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_hasDelaySlot(const RabbitizerInstruction *self); - -NODISCARD NON_NULL(1) PURE -const char *RabbitizerInstruction_mapInstrToType(const RabbitizerInstruction *self); - -NODISCARD NON_NULL(1, 2) PURE -bool RabbitizerInstruction_sameOpcode(const RabbitizerInstruction *self, const RabbitizerInstruction *other); -NODISCARD NON_NULL(1, 2) PURE -bool RabbitizerInstruction_sameOpcodeButDifferentArguments(const RabbitizerInstruction *self, const RabbitizerInstruction *other); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_hasOperand(const RabbitizerInstruction *self, RabbitizerOperandType operand); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, RabbitizerOperandType operand); - -NODISCARD NON_NULL(1) PURE -uint32_t RabbitizerInstruction_getValidBits(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self); - -/* Instruction examination */ - - -/* Disassembly */ - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_mustDisasmAsData(const RabbitizerInstruction *self); - -NODISCARD NON_NULL(1) PURE -size_t RabbitizerInstruction_getSizeForBufferOperandsDisasm(const RabbitizerInstruction *self, size_t immOverrideLength); -NON_NULL(1, 2) -size_t RabbitizerInstruction_disassembleOperands(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength); - -NODISCARD NON_NULL(1) PURE -size_t RabbitizerInstruction_getSizeForBufferInstrDisasm(const RabbitizerInstruction *self, size_t immOverrideLength, int extraLJust); -NON_NULL(1, 2) -size_t RabbitizerInstruction_disassembleInstruction(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength, int extraLJust); - -NODISCARD NON_NULL(1) PURE -size_t RabbitizerInstruction_getSizeForBufferDataDisasm(const RabbitizerInstruction *self, int extraLJust); -NON_NULL(1, 2) -size_t RabbitizerInstruction_disassembleAsData(const RabbitizerInstruction *self, char *dst, int extraLJust); - -NODISCARD NON_NULL(1) PURE -size_t RabbitizerInstruction_getSizeForBuffer(const RabbitizerInstruction *self, size_t immOverrideLength, int extraLJust); -NON_NULL(1, 2) -size_t RabbitizerInstruction_disassemble(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength, int extraLJust); - -/* Disassembly */ - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionR5900.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionR5900.h deleted file mode 100644 index af5e809e..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionR5900.h +++ /dev/null @@ -1,87 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRUCTION_R5900_H -#define RABBITIZER_INSTRUCTION_R5900_H -#pragma once - -#include "RabbitizerInstruction.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define RAB_INSTR_R5900_GET_mmi_function(self) (SHIFTR((self)->word, 6, 5)) -#define RAB_INSTR_R5900_GET_fhi_flo(self) ((SHIFTR((self)->word, 6, 5) << 2) | SHIFTR((self)->word, 0, 2)) - -#define RAB_INSTR_R5900_GET_vfs(self) (SHIFTR((self)->word, 11, 5)) -#define RAB_INSTR_R5900_GET_vft(self) (SHIFTR((self)->word, 16, 5)) -#define RAB_INSTR_R5900_GET_vfd(self) (SHIFTR((self)->word, 6, 5)) - -#define RAB_INSTR_R5900_GET_xyzw_x(self) (SHIFTR((self)->word, 24, 1)) -#define RAB_INSTR_R5900_GET_xyzw_y(self) (SHIFTR((self)->word, 23, 1)) -#define RAB_INSTR_R5900_GET_xyzw_z(self) (SHIFTR((self)->word, 22, 1)) -#define RAB_INSTR_R5900_GET_xyzw_w(self) (SHIFTR((self)->word, 21, 1)) -#define RAB_INSTR_R5900_GET_n(self) (SHIFTR((self)->word, 0, 2)) -#define RAB_INSTR_R5900_GET_l(self) (SHIFTR((self)->word, 21, 2)) -#define RAB_INSTR_R5900_GET_m(self) (SHIFTR((self)->word, 23, 2)) - -#define RAB_INSTR_R5900_GET_vis(self) (SHIFTR((self)->word, 11, 5)) -#define RAB_INSTR_R5900_GET_vit(self) (SHIFTR((self)->word, 16, 5)) -#define RAB_INSTR_R5900_GET_vid(self) (SHIFTR((self)->word, 6, 5)) - -#define RAB_INSTR_R5900_GET_imm5(self) (SHIFTR((self)->word, 6, 5)) - - -#define RAB_INSTR_R5900_PACK_mmi_function(word, value) (BITREPACK((word), (value), 6, 5)) -#define RAB_INSTR_R5900_PACK_fhi_flo(word, value) (BITREPACK(BITREPACK((word), (value) >> 2, 6, 5), (value), 0, 2)) - -#define RAB_INSTR_R5900_PACK_vfs(word, value) (BITREPACK((word), (value), 11, 5)) -#define RAB_INSTR_R5900_PACK_vft(word, value) (BITREPACK((word), (value), 16, 5)) -#define RAB_INSTR_R5900_PACK_vfd(word, value) (BITREPACK((word), (value), 6, 5)) - -#define RAB_INSTR_R5900_PACK_xyzw_x(word, value) (BITREPACK((word), (value), 24, 1)) -#define RAB_INSTR_R5900_PACK_xyzw_y(word, value) (BITREPACK((word), (value), 23, 1)) -#define RAB_INSTR_R5900_PACK_xyzw_z(word, value) (BITREPACK((word), (value), 22, 1)) -#define RAB_INSTR_R5900_PACK_xyzw_w(word, value) (BITREPACK((word), (value), 21, 1)) -#define RAB_INSTR_R5900_PACK_n(word, value) (BITREPACK((word), (value), 0, 2)) -#define RAB_INSTR_R5900_PACK_l(word, value) (BITREPACK((word), (value), 21, 2)) -#define RAB_INSTR_R5900_PACK_m(word, value) (BITREPACK((word), (value), 23, 2)) - -#define RAB_INSTR_R5900_PACK_vis(word, value) (BITREPACK((word), (value), 11, 5)) -#define RAB_INSTR_R5900_PACK_vit(word, value) (BITREPACK((word), (value), 16, 5)) -#define RAB_INSTR_R5900_PACK_vid(word, value) (BITREPACK((word), (value), 6, 5)) - -#define RAB_INSTR_R5900_PACK_imm5(word, value) (BITREPACK((word), (value), 6, 5)) - - -NON_NULL(1) -void RabbitizerInstructionR5900_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram); -NON_NULL(1) -void RabbitizerInstructionR5900_destroy(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId_Normal(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId_Special(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId_Regimm(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId_Coprocessor0(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId_Coprocessor1(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId_Coprocessor2(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId_MMI(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId(RabbitizerInstruction *self); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionRsp.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionRsp.h deleted file mode 100644 index b2fb40d5..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionRsp.h +++ /dev/null @@ -1,70 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRUCTION_RSP_H -#define RABBITIZER_INSTRUCTION_RSP_H -#pragma once - -#include "RabbitizerInstruction.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define RAB_INSTR_RSP_GET_cop2t(self) (SHIFTR((self)->word, 16, 5)) -#define RAB_INSTR_RSP_GET_cop2cd(self) (SHIFTR((self)->word, 11, 5)) - -#define RAB_INSTR_RSP_GET_vs(self) (SHIFTR((self)->word, 11, 5)) -#define RAB_INSTR_RSP_GET_vt(self) (SHIFTR((self)->word, 16, 5)) -#define RAB_INSTR_RSP_GET_vd(self) (SHIFTR((self)->word, 6, 5)) - -#define RAB_INSTR_RSP_GET_elementhigh(self) (SHIFTR((self)->word, 21, 4)) -#define RAB_INSTR_RSP_GET_elementlow(self) (SHIFTR((self)->word, 7, 4)) -#define RAB_INSTR_RSP_GET_OFFSET_VECTOR_RAW(self) (SHIFTR((self)->word, 0, 7)) - -#define RAB_INSTR_RSP_GET_index(self) (SHIFTR((self)->word, 7, 4)) -#define RAB_INSTR_RSP_GET_de(self) (SHIFTR((self)->word, 11, 5)) - - -#define RAB_INSTR_RSP_PACK_cop2t(word, value) (BITREPACK((word), value, 16, 5)) -#define RAB_INSTR_RSP_PACK_cop2cd(word, value) (BITREPACK((word), value, 11, 5)) - -#define RAB_INSTR_RSP_PACK_vs(word, value) (BITREPACK((word), value, 11, 5)) -#define RAB_INSTR_RSP_PACK_vt(word, value) (BITREPACK((word), value, 16, 5)) -#define RAB_INSTR_RSP_PACK_vd(word, value) (BITREPACK((word), value, 6, 5)) - -#define RAB_INSTR_RSP_PACK_elementhigh(word, value) (BITREPACK((word), value, 21, 4)) -#define RAB_INSTR_RSP_PACK_elementlow(word, value) (BITREPACK((word), value, 7, 4)) - -#define RAB_INSTR_RSP_PACK_index(word, value) (BITREPACK((word), value, 7, 4)) -#define RAB_INSTR_RSP_PACK_offset(word, value) (BITREPACK((word), value, 0, 7)) -#define RAB_INSTR_RSP_PACK_de(word, value) (BITREPACK((word), value, 11, 5)) - - -NON_NULL(1) -void RabbitizerInstructionRsp_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram); -NON_NULL(1) -void RabbitizerInstructionRsp_destroy(RabbitizerInstruction *self); - - -NON_NULL(1) -void RabbitizerInstructionRsp_processUniqueId_Normal(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionRsp_processUniqueId_Special(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionRsp_processUniqueId_Regimm(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstructionRsp_processUniqueId(RabbitizerInstruction *self); - - -NODISCARD NON_NULL(1) PURE -uint16_t RabbitizerInstructionRsp_GetOffsetVector(const RabbitizerInstruction *self); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerOperandType.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerOperandType.h deleted file mode 100644 index 58c26594..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerOperandType.h +++ /dev/null @@ -1,33 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_OPERAND_TYPE_H -#define RABBITIZER_OPERAND_TYPE_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - - -#define RAB_DEF_OPERAND(prefix, operand) \ - RAB_OPERAND_##prefix##_##operand, - -typedef enum RabbitizerOperandType { - RAB_DEF_OPERAND(ALL, INVALID) - -#include "operands/RabbitizerOperandType_cpu.inc" -#include "operands/RabbitizerOperandType_rsp.inc" -#include "operands/RabbitizerOperandType_r5900.inc" - - RAB_DEF_OPERAND(ALL, MAX) -} RabbitizerOperandType; - -#undef RAB_DEF_OPERAND - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerRegister.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerRegister.h deleted file mode 100644 index 1c6421cd..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerRegister.h +++ /dev/null @@ -1,143 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_REGISTER_H -#define RABBITIZER_REGISTER_H -#pragma once - -#include - -#include "common/Utils.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define RABBITIZER_DEF_REG(prefix, name, numeric) \ - RABBITIZER_REG_##prefix##_##name - -#define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric) \ - RABBITIZER_REG_##prefix##_##name - - -typedef enum RabbitizerRegister_GprO32 { - #include "instructions/registers/RabbitizerRegister_GprO32.inc" -} RabbitizerRegister_GprO32; - -typedef enum RabbitizerRegister_GprN32 { - #include "instructions/registers/RabbitizerRegister_GprN32.inc" -} RabbitizerRegister_GprN32; - -typedef enum RabbitizerRegister_Cop0 { - #include "instructions/registers/RabbitizerRegister_Cop0.inc" -} RabbitizerRegister_Cop0; - -// Float registers -typedef enum RabbitizerRegister_Cop1O32 { - #include "instructions/registers/RabbitizerRegister_Cop1O32.inc" -} RabbitizerRegister_Cop1O32; - -typedef enum RabbitizerRegister_Cop1N32 { - #include "instructions/registers/RabbitizerRegister_Cop1N32.inc" -} RabbitizerRegister_Cop1N32; - -typedef enum RabbitizerRegister_Cop1N64 { - #include "instructions/registers/RabbitizerRegister_Cop1N64.inc" -} RabbitizerRegister_Cop1N64; - -typedef enum RabbitizerRegister_Cop1Control { - #include "instructions/registers/RabbitizerRegister_Cop1Control.inc" -} RabbitizerRegister_Cop1Control; - -typedef enum RabbitizerRegister_Cop2 { - #include "instructions/registers/RabbitizerRegister_Cop2.inc" -} RabbitizerRegister_Cop2; - - -/* RSP */ - -typedef enum RabbitizerRegister_RspGpr { - #include "instructions/registers/RabbitizerRegister_RspGpr.inc" -} RabbitizerRegister_RspGpr; - -typedef enum RabbitizerRegister_RspCop0 { - #include "instructions/registers/RabbitizerRegister_RspCop0.inc" -} RabbitizerRegister_RspCop0; - -typedef enum RabbitizerRegister_RspCop2 { - #include "instructions/registers/RabbitizerRegister_RspCop2.inc" -} RabbitizerRegister_RspCop2; - -typedef enum RabbitizerRegister_RspCop2Control { - #include "instructions/registers/RabbitizerRegister_RspCop2Control.inc" -} RabbitizerRegister_RspCop2Control; - -typedef enum RabbitizerRegister_RspVector { - #include "instructions/registers/RabbitizerRegister_RspVector.inc" -} RabbitizerRegister_RspVector; - -/* RSP */ - -/* R5900 */ - -typedef enum RabbitizerRegister_R5900VF { - #include "instructions/registers/RabbitizerRegister_R5900VF.inc" -} RabbitizerRegister_R5900VF; - -typedef enum RabbitizerRegister_R5900VI { - #include "instructions/registers/RabbitizerRegister_R5900VI.inc" -} RabbitizerRegister_R5900VI; - -/* R5900 */ - - -#undef RABBITIZER_DEF_REG -#undef RABBITIZER_DEF_REG_NODOLLAR - - -extern const char *RabbitizerRegister_GprO32_Names[][2]; -extern const char *RabbitizerRegister_GprN32_Names[][2]; -extern const char *RabbitizerRegister_Cop0_Names[][2]; -extern const char *RabbitizerRegister_Cop1O32_Names[][2]; -extern const char *RabbitizerRegister_Cop1N32_Names[][2]; -extern const char *RabbitizerRegister_Cop1N64_Names[][2]; -extern const char *RabbitizerRegister_Cop2_Names[][2]; -extern const char *RabbitizerRegister_RspGpr_Names[][2]; -extern const char *RabbitizerRegister_RspCop0_Names[][2]; -extern const char *RabbitizerRegister_RspVector_Names[][2]; - - -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameGpr(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameCop0(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameCop1(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameCop1Control(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameCop2(uint8_t regValue); - -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameRspGpr(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameRspCop0(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameRspCop2(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameRspCop2Control(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameRspVector(uint8_t regValue); - -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameR5900VF(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameR5900VI(uint8_t regValue); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_cpu.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_cpu.inc deleted file mode 100644 index dbbb9818..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_cpu.inc +++ /dev/null @@ -1,40 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RABBITIZER_DEF_INSTR_ID(cpu, , INVALID, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate}) - -#include "instructions/instr_id/cpu/cpu_normal.inc" -#include "instructions/instr_id/cpu/cpu_special.inc" -#include "instructions/instr_id/cpu/cpu_regimm.inc" -#include "instructions/instr_id/cpu/cpu_cop0.inc" -#include "instructions/instr_id/cpu/cpu_cop0_bc0.inc" -#include "instructions/instr_id/cpu/cpu_cop0_tlb.inc" -#include "instructions/instr_id/cpu/cpu_cop1.inc" -#include "instructions/instr_id/cpu/cpu_cop1_bc1.inc" -#include "instructions/instr_id/cpu/cpu_cop1_fpu_s.inc" -#include "instructions/instr_id/cpu/cpu_cop1_fpu_d.inc" -#include "instructions/instr_id/cpu/cpu_cop1_fpu_w.inc" -#include "instructions/instr_id/cpu/cpu_cop1_fpu_l.inc" - -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_00, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_01, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_02, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_03, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_04, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_05, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_06, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_07, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_08, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_09, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_10, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_11, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_12, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_13, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_14, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_15, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_16, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_17, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_18, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_19, .operands={0}) - -RABBITIZER_DEF_INSTR_ID(cpu, , MAX, .operands={0}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_r5900.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_r5900.inc deleted file mode 100644 index 10f11126..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_r5900.inc +++ /dev/null @@ -1,46 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RABBITIZER_DEF_INSTR_ID(r5900, , INVALID, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .architectureVersion=-1) - -#include "instructions/instr_id/r5900/r5900_normal.inc" -#include "instructions/instr_id/r5900/r5900_special.inc" -#include "instructions/instr_id/r5900/r5900_regimm.inc" - -#include "instructions/instr_id/r5900/r5900_mmi.inc" -#include "instructions/instr_id/r5900/r5900_mmi_0.inc" -#include "instructions/instr_id/r5900/r5900_mmi_1.inc" -#include "instructions/instr_id/r5900/r5900_mmi_2.inc" -#include "instructions/instr_id/r5900/r5900_mmi_3.inc" - -#include "instructions/instr_id/r5900/r5900_cop0_tlb.inc" - -#include "instructions/instr_id/r5900/r5900_cop1_fpu_s.inc" - -#include "instructions/instr_id/r5900/r5900_cop2.inc" -#include "instructions/instr_id/r5900/r5900_cop2_bc2.inc" -#include "instructions/instr_id/r5900/r5900_cop2_special1.inc" -#include "instructions/instr_id/r5900/r5900_cop2_special2.inc" - -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_00, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_01, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_02, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_03, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_04, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_05, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_06, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_07, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_08, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_09, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_10, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_11, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_12, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_13, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_14, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_15, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_16, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_17, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_18, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_19, .operands={0}) - -RABBITIZER_DEF_INSTR_ID(r5900, , MAX, .operands={0}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_rsp.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_rsp.inc deleted file mode 100644 index 2fcaa854..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_rsp.inc +++ /dev/null @@ -1,41 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// RSP instructions -RABBITIZER_DEF_INSTR_ID(rsp, , INVALID, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) - -#include "instructions/instr_id/rsp/rsp_cop2.inc" -#include "instructions/instr_id/rsp/rsp_cop2_vu.inc" - -#include "instructions/instr_id/rsp/rsp_normal_lwc2.inc" -#include "instructions/instr_id/rsp/rsp_normal_swc2.inc" - -// CPU instructions but with rsp registers - -#include "instructions/instr_id/rsp/rsp_normal.inc" -#include "instructions/instr_id/rsp/rsp_special.inc" -#include "instructions/instr_id/rsp/rsp_regimm.inc" -#include "instructions/instr_id/rsp/rsp_cop0.inc" - -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_00, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_01, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_02, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_03, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_04, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_05, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_06, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_07, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_08, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_09, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_10, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_11, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_12, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_13, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_14, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_15, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_16, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_17, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_18, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_19, .operands={0}) - -RABBITIZER_DEF_INSTR_ID(rsp, , MAX, .operands={0}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0.inc deleted file mode 100644 index 0aa3df49..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0.inc +++ /dev/null @@ -1,10 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP rt, cop0d -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, mfc0, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true, .notEmitedByCompilers=true) // Move word From CP0 -RABBITIZER_DEF_INSTR_ID(cpu, 0x01, dmfc0, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true) // Doubleword Move From CP0 -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, cfc0, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true) // Move control word From CP0 -RABBITIZER_DEF_INSTR_ID(cpu, 0x04, mtc0, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Move word to CP0 -RABBITIZER_DEF_INSTR_ID(cpu, 0x05, dmtc0, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN) // Doubleword Move To CP0 -RABBITIZER_DEF_INSTR_ID(cpu, 0x06, ctc0, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN) // Move control word To CP0 diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_bc0.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_bc0.inc deleted file mode 100644 index 0165039b..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_bc0.inc +++ /dev/null @@ -1,8 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, bc0f, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true) // Branch on FP False -RABBITIZER_DEF_INSTR_ID(cpu, 0x01, bc0t, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true) // Branch on FP True -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, bc0fl, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true) // Branch on FP False Likely -RABBITIZER_DEF_INSTR_ID(cpu, 0x03, bc0tl, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true) // Branch on FP True Likely diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_tlb.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_tlb.inc deleted file mode 100644 index 65b808e3..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_tlb.inc +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP -RABBITIZER_DEF_INSTR_ID(cpu, 0x01, tlbr, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Read Indexed TLB Entry -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, tlbwi, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Write Indexed TLB Entry - -RABBITIZER_DEF_INSTR_ID(cpu, 0x06, tlbwr, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN) // Write Random TLB Entry - -RABBITIZER_DEF_INSTR_ID(cpu, 0x08, tlbp, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Probe TLB for Matching Entry - -RABBITIZER_DEF_INSTR_ID(cpu, 0x18, eret, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Return from Exception diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1.inc deleted file mode 100644 index e6defc81..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1.inc +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP rt, fs -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, mfc1, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .modifiesRt=true) // Move Word From Floating-Point -RABBITIZER_DEF_INSTR_ID(cpu, 0x01, dmfc1, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .modifiesRt=true) // Doubleword Move From Floating-Point -RABBITIZER_DEF_INSTR_ID(cpu, 0x04, mtc1, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Move Word to Floating-Point -RABBITIZER_DEF_INSTR_ID(cpu, 0x05, dmtc1, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Doubleword Move To Floating-Point - -// OP rt, cop1cs -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, cfc1, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop1cs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .modifiesRt=true) // Move Control Word from Floating-Point -RABBITIZER_DEF_INSTR_ID(cpu, 0x06, ctc1, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop1cs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Move Control Word to Floating-Point diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_bc1.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_bc1.inc deleted file mode 100644 index e339cd4d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_bc1.inc +++ /dev/null @@ -1,8 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, bc1f, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true) -RABBITIZER_DEF_INSTR_ID(cpu, 0x01, bc1t, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true) -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, bc1fl, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true) -RABBITIZER_DEF_INSTR_ID(cpu, 0x03, bc1tl, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_d.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_d.inc deleted file mode 100644 index a512496c..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_d.inc +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP fd, fs, ft -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x00, add_d, add.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Add -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x01, sub_d, sub.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Sub -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x02, mul_d, mul.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Multiply -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x03, div_d, div.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Divide - -// OP fd, fs -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x04, sqrt_d, sqrt.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Square Root -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x05, abs_d, abs.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Absolute Value -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x06, mov_d, mov.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Move -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x07, neg_d, neg.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Negate - -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x08, round_l_d, round.l.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Round to Long Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x09, trunc_l_d, trunc.l.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Truncate to Long Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0A, ceil_l_d, ceil.l.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Ceiling Convert to Long Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0B, floor_l_d, floor.l.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Floor Convert to Long Fixed-Point - -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0C, round_w_d, round.w.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Round to Word Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0D, trunc_w_d, trunc.w.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Truncate to Word Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0E, ceil_w_d, ceil.w.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Ceiling Convert to Word Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0F, floor_w_d, floor.w.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Floor Convert to Word Fixed-Point - -// OP fd, fs -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x20, cvt_s_d, cvt.s.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x24, cvt_w_d, cvt.w.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x25, cvt_l_d, cvt.l.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true) - -// OP fs, ft -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x30, c_f_d, c.f.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x31, c_un_d, c.un.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x32, c_eq_d, c.eq.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x33, c_ueq_d, c.ueq.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x34, c_olt_d, c.olt.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x35, c_ult_d, c.ult.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x36, c_ole_d, c.ole.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x37, c_ule_d, c.ule.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) - -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x38, c_df_d, c.df.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x39, c_ngle_d, c.ngle.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3A, c_deq_d, c.deq.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3B, c_ngl_d, c.ngl.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3C, c_lt_d, c.lt.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3D, c_nge_d, c.nge.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3E, c_le_d, c.le.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3F, c_ngt_d, c.ngt.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_l.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_l.inc deleted file mode 100644 index 48eea054..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_l.inc +++ /dev/null @@ -1,6 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP fd, fs -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x20, cvt_s_l, cvt.s.l, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x21, cvt_d_l, cvt.d.l, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_s.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_s.inc deleted file mode 100644 index 4271429b..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_s.inc +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP fd, fs, ft -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x00, add_s, add.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Add -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x01, sub_s, sub.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Sub -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x02, mul_s, mul.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Multiply -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x03, div_s, div.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Divide - -// OP fd, fs -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x04, sqrt_s, sqrt.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Square Root -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x05, abs_s, abs.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Absolute Value -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x06, mov_s, mov.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Move -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x07, neg_s, neg.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Negate - -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x08, round_l_s, round.l.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Round to Long Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x09, trunc_l_s, trunc.l.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Truncate to Long Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0A, ceil_l_s, ceil.l.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Ceiling Convert to Long Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0B, floor_l_s, floor.l.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Floor Convert to Long Fixed-Point - -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0C, round_w_s, round.w.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Round to Word Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0D, trunc_w_s, trunc.w.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Truncate to Word Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0E, ceil_w_s, ceil.w.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Ceiling Convert to Word Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0F, floor_w_s, floor.w.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Floor Convert to Word Fixed-Point - -// OP fd, fs -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x21, cvt_d_s, cvt.d.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x24, cvt_w_s, cvt.w.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x25, cvt_l_s, cvt.l.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) - -// OP fs, ft -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x30, c_f_s, c.f.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x31, c_un_s, c.un.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x32, c_eq_s, c.eq.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x33, c_ueq_s, c.ueq.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x34, c_olt_s, c.olt.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x35, c_ult_s, c.ult.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x36, c_ole_s, c.ole.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x37, c_ule_s, c.ule.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) - -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x38, c_sf_s, c.sf.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x39, c_ngle_s, c.ngle.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3A, c_seq_s, c.seq.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3B, c_ngl_s, c.ngl.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3C, c_lt_s, c.lt.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3D, c_nge_s, c.nge.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3E, c_le_s, c.le.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3F, c_ngt_s, c.ngt.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_w.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_w.inc deleted file mode 100644 index 9d07b6dc..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_w.inc +++ /dev/null @@ -1,6 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP fd, fs -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x20, cvt_s_w, cvt.s.w, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x21, cvt_d_w, cvt.d.w, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_normal.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_normal.inc deleted file mode 100644 index cc93fa5c..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_normal.inc +++ /dev/null @@ -1,83 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP LABEL -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, j, .operands={RAB_OPERAND_cpu_label}, .instrType=RABBITIZER_INSTR_TYPE_J, .isJump=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Jump -RABBITIZER_DEF_INSTR_ID(cpu, 0x03, jal, .operands={RAB_OPERAND_cpu_label}, .instrType=RABBITIZER_INSTR_TYPE_J, .isJump=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Jump And Link - -// OP rs, rt, IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x04, beq, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on EQual -RABBITIZER_DEF_INSTR_ID(cpu, 0x05, bne, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Not Equal -RABBITIZER_DEF_INSTR_ID(cpu, 0x14, beql, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on EQual Likely -RABBITIZER_DEF_INSTR_ID(cpu, 0x15, bnel, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Not Equal Likely - -// OP rs, IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x06, blez, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Less than or Equal to Zero -RABBITIZER_DEF_INSTR_ID(cpu, 0x16, blezl, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Less than or Equal to Zero Likely -RABBITIZER_DEF_INSTR_ID(cpu, 0x07, bgtz, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Greater Than Zero -RABBITIZER_DEF_INSTR_ID(cpu, 0x17, bgtzl, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Greater Than Zero Likely - -// OP rt, rs, IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x08, addi, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .notEmitedByCompilers=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Add Immediate -RABBITIZER_DEF_INSTR_ID(cpu, 0x09, addiu, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Add Immediate Unsigned Word -RABBITIZER_DEF_INSTR_ID(cpu, 0x0A, slti, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Set on Less Than Immediate -RABBITIZER_DEF_INSTR_ID(cpu, 0x0B, sltiu, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Set on Less Than Immediate Unsigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x0C, andi, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // And Immediate -RABBITIZER_DEF_INSTR_ID(cpu, 0x0D, ori, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Or Immediate -RABBITIZER_DEF_INSTR_ID(cpu, 0x0E, xori, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // eXclusive OR Immediate -RABBITIZER_DEF_INSTR_ID(cpu, 0x18, daddi, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword add Immediate -RABBITIZER_DEF_INSTR_ID(cpu, 0x19, daddiu, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword add Immediate Unsigned - -// OP rt, IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x0F, lui, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeHi=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Upper Immediate - -// OP rt, IMM(base) -RABBITIZER_DEF_INSTR_ID(cpu, 0x1A, ldl, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Doubleword Left -RABBITIZER_DEF_INSTR_ID(cpu, 0x1B, ldr, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Doubleword Right -RABBITIZER_DEF_INSTR_ID(cpu, 0x20, lb, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Byte -RABBITIZER_DEF_INSTR_ID(cpu, 0x21, lh, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Halfword -RABBITIZER_DEF_INSTR_ID(cpu, 0x22, lwl, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word Left -RABBITIZER_DEF_INSTR_ID(cpu, 0x23, lw, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word -RABBITIZER_DEF_INSTR_ID(cpu, 0x24, lbu, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Byte Insigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x25, lhu, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Halfword Unsigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x26, lwr, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word Right -RABBITIZER_DEF_INSTR_ID(cpu, 0x27, lwu, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Word Unsigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x28, sb, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Byte -RABBITIZER_DEF_INSTR_ID(cpu, 0x29, sh, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Halfword -RABBITIZER_DEF_INSTR_ID(cpu, 0x2A, swl, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word Left -RABBITIZER_DEF_INSTR_ID(cpu, 0x2B, sw, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word -RABBITIZER_DEF_INSTR_ID(cpu, 0x2C, sdl, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Store Doubleword Left -RABBITIZER_DEF_INSTR_ID(cpu, 0x2D, sdr, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Store Doubleword Right -RABBITIZER_DEF_INSTR_ID(cpu, 0x2E, swr, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word Right -RABBITIZER_DEF_INSTR_ID(cpu, 0x30, ll, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Load Linked word -RABBITIZER_DEF_INSTR_ID(cpu, 0x33, pref, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV) // Prefetch -RABBITIZER_DEF_INSTR_ID(cpu, 0x34, lld, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Linked Doubleword -RABBITIZER_DEF_INSTR_ID(cpu, 0x37, ld, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Doubleword -RABBITIZER_DEF_INSTR_ID(cpu, 0x38, sc, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Store Conditional word -RABBITIZER_DEF_INSTR_ID(cpu, 0x3C, scd, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Store Conditional Doubleword -RABBITIZER_DEF_INSTR_ID(cpu, 0x3F, sd, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Store Doubleword - -// OP op, IMM(base) -RABBITIZER_DEF_INSTR_ID(cpu, 0x2F, cache, .operands={RAB_OPERAND_cpu_op, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .notEmitedByCompilers=true) // Cache - -// OP ft, IMM(base) -RABBITIZER_DEF_INSTR_ID(cpu, 0x31, lwc1, .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word to Coprocessor z -RABBITIZER_DEF_INSTR_ID(cpu, 0x35, ldc1, .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .isDouble=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Load Doubleword to Coprocessor z -RABBITIZER_DEF_INSTR_ID(cpu, 0x39, swc1, .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word from Coprocessor z -RABBITIZER_DEF_INSTR_ID(cpu, 0x3D, sdc1, .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .isDouble=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Store Doubleword from Coprocessor z - -// OP cop2t, IMM(base) -RABBITIZER_DEF_INSTR_ID(cpu, 0x32, lwc2, .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word to Coprocessor z -RABBITIZER_DEF_INSTR_ID(cpu, 0x36, ldc2, .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Load Doubleword to Coprocessor z -RABBITIZER_DEF_INSTR_ID(cpu, 0x3A, swc2, .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word from Coprocessor z -RABBITIZER_DEF_INSTR_ID(cpu, 0x3E, sdc2, .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Store Doubleword from Coprocessor z - - -// Pseudo-Instruction Unique IDs - -// OP IMM -RABBITIZER_DEF_INSTR_ID(cpu, -0x03, b, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true) // Branch (unconditional) - -// OP rs, IMM -RABBITIZER_DEF_INSTR_ID(cpu, -0x04, beqz, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true) // Branch on EQual Zero -RABBITIZER_DEF_INSTR_ID(cpu, -0x05, bnez, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true) // Branch on Not Equal Zero diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_regimm.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_regimm.inc deleted file mode 100644 index 4d47123b..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_regimm.inc +++ /dev/null @@ -1,25 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP rs, IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, bltz, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Less Than Zero -RABBITIZER_DEF_INSTR_ID(cpu, 0x01, bgez, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Greater than or Equal to Zero -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, bltzl, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Less Than Zero Likely -RABBITIZER_DEF_INSTR_ID(cpu, 0x03, bgezl, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Greater than or Equal to Zero Likely - -RABBITIZER_DEF_INSTR_ID(cpu, 0x08, tgei, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) -RABBITIZER_DEF_INSTR_ID(cpu, 0x09, tgeiu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) -RABBITIZER_DEF_INSTR_ID(cpu, 0x0A, tlti, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) -RABBITIZER_DEF_INSTR_ID(cpu, 0x0B, tltiu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) -RABBITIZER_DEF_INSTR_ID(cpu, 0x0C, teqi, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) -RABBITIZER_DEF_INSTR_ID(cpu, 0x0E, tnei, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) - -RABBITIZER_DEF_INSTR_ID(cpu, 0x10, bltzal, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Less Than Zero and Link -RABBITIZER_DEF_INSTR_ID(cpu, 0x11, bgezal, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Greater Than or Equal to Zero and Link -RABBITIZER_DEF_INSTR_ID(cpu, 0x12, bltzall, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .isBranchLikely=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Less Than Zero and Link Likely -RABBITIZER_DEF_INSTR_ID(cpu, 0x13, bgezall, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .isBranchLikely=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Greater Than or Equal to Zero and Link Likely - - -// Pseudo-Instruction Unique IDs - -RABBITIZER_DEF_INSTR_ID(cpu, -0x11, bal, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true, .isPseudo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch and Link diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_special.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_special.inc deleted file mode 100644 index 1adb970a..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_special.inc +++ /dev/null @@ -1,93 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP rd, rt, sa -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, sll, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Left Logical -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, srl, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Right Logical -RABBITIZER_DEF_INSTR_ID(cpu, 0x03, sra, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Right Arithmetic -RABBITIZER_DEF_INSTR_ID(cpu, 0x38, dsll, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Left Logical -RABBITIZER_DEF_INSTR_ID(cpu, 0x3A, dsrl, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Logical -RABBITIZER_DEF_INSTR_ID(cpu, 0x3B, dsra, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Arithmetic -RABBITIZER_DEF_INSTR_ID(cpu, 0x3C, dsll32, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Left Logical plus 32 -RABBITIZER_DEF_INSTR_ID(cpu, 0x3E, dsrl32, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Logical plus 32 -RABBITIZER_DEF_INSTR_ID(cpu, 0x3F, dsra32, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Arithmetic plus 32 - -// OP rd, rt, rs -RABBITIZER_DEF_INSTR_ID(cpu, 0x14, dsllv, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Left Logical Variable -RABBITIZER_DEF_INSTR_ID(cpu, 0x16, dsrlv, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Logical Variable -RABBITIZER_DEF_INSTR_ID(cpu, 0x17, dsrav, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Arithmetic Variable -RABBITIZER_DEF_INSTR_ID(cpu, 0x04, sllv, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Left Logical Variable -RABBITIZER_DEF_INSTR_ID(cpu, 0x06, srlv, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Right Logical Variable -RABBITIZER_DEF_INSTR_ID(cpu, 0x07, srav, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Right Arithmetic Variable - -// OP rs -RABBITIZER_DEF_INSTR_ID(cpu, 0x11, mthi, .operands={RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Move To HI register -RABBITIZER_DEF_INSTR_ID(cpu, 0x13, mtlo, .operands={RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Move To LO register -RABBITIZER_DEF_INSTR_ID(cpu, 0x08, jr, .operands={RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Jump Register -RABBITIZER_DEF_INSTR_ID(cpu, 0x09, jalr, .operands={RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Jump And Link Register - -// OP rd, rs -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, -0x09, jalr_rd, jalr, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Jump And Link Register // Special case for rd != 31 - -// OP rd -RABBITIZER_DEF_INSTR_ID(cpu, 0x10, mfhi, .operands={RAB_OPERAND_cpu_rd}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Move From HI register -RABBITIZER_DEF_INSTR_ID(cpu, 0x12, mflo, .operands={RAB_OPERAND_cpu_rd}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Move From LO register - -// OP rd, rs, rt -RABBITIZER_DEF_INSTR_ID(cpu, 0x0A, movz, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV) // MOVe conditional on Zero -RABBITIZER_DEF_INSTR_ID(cpu, 0x0B, movn, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV) // MOVe conditional on Not zero -RABBITIZER_DEF_INSTR_ID(cpu, 0x1A, div, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // DIVide word -RABBITIZER_DEF_INSTR_ID(cpu, 0x1B, divu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // DIVide Unsigned word - -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, -0x1A, sn64_div, div, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // DIVide word -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, -0x1B, sn64_divu, divu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // DIVide Unsigned word - -RABBITIZER_DEF_INSTR_ID(cpu, 0x1E, ddiv, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword DIVide -RABBITIZER_DEF_INSTR_ID(cpu, 0x1F, ddivu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword DIVide Unsigned -// RABBITIZER_DEF_INSTR_ID(cpu, , ddiv, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) -// RABBITIZER_DEF_INSTR_ID(cpu, , ddivu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) -RABBITIZER_DEF_INSTR_ID(cpu, 0x20, add, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .notEmitedByCompilers=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // ADD word -RABBITIZER_DEF_INSTR_ID(cpu, 0x21, addu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // ADD Unsigned word -RABBITIZER_DEF_INSTR_ID(cpu, 0x22, sub, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Subtract word -RABBITIZER_DEF_INSTR_ID(cpu, 0x23, subu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // SUBtract Unsigned word -RABBITIZER_DEF_INSTR_ID(cpu, 0x24, and, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // AND -RABBITIZER_DEF_INSTR_ID(cpu, 0x25, or, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // OR -RABBITIZER_DEF_INSTR_ID(cpu, 0x26, xor, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // eXclusive OR -RABBITIZER_DEF_INSTR_ID(cpu, 0x27, nor, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Not OR -RABBITIZER_DEF_INSTR_ID(cpu, 0x2A, slt, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Set on Less Than -RABBITIZER_DEF_INSTR_ID(cpu, 0x2B, sltu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Set on Less Than Unsigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x2C, dadd, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Add -RABBITIZER_DEF_INSTR_ID(cpu, 0x2D, daddu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Add Unsigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x2E, dsub, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword SUBtract -RABBITIZER_DEF_INSTR_ID(cpu, 0x2F, dsubu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword SUBtract Unsigned - -// OP code -RABBITIZER_DEF_INSTR_ID(cpu, 0x0C, syscall, .operands={RAB_OPERAND_cpu_code}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // SYStem CALL -RABBITIZER_DEF_INSTR_ID(cpu, 0x0D, break, .operands={RAB_OPERAND_cpu_code}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Break -RABBITIZER_DEF_INSTR_ID(cpu, 0x0F, sync, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Sync - -// OP rs, rt -RABBITIZER_DEF_INSTR_ID(cpu, 0x18, mult, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // MULTtiply word -RABBITIZER_DEF_INSTR_ID(cpu, 0x19, multu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // MULTtiply Unsigned word -RABBITIZER_DEF_INSTR_ID(cpu, 0x1C, dmult, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword MULTiply -RABBITIZER_DEF_INSTR_ID(cpu, 0x1D, dmultu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword MULTiply Unsigned - -RABBITIZER_DEF_INSTR_ID(cpu, 0x30, tge, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_code_lower}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Greater or Equal -RABBITIZER_DEF_INSTR_ID(cpu, 0x31, tgeu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_code_lower}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Greater or Equal Unsigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x32, tlt, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_code_lower}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Less Than -RABBITIZER_DEF_INSTR_ID(cpu, 0x33, tltu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_code_lower}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Less Than Unsigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x34, teq, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_code_lower}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if EQual -RABBITIZER_DEF_INSTR_ID(cpu, 0x36, tne, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_code_lower}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Not Equal - - -// Pseudo-Instruction Unique IDs - -// OP -RABBITIZER_DEF_INSTR_ID(cpu, -0x01, nop, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R, .isPseudo=true) // No OPeration - -// OP rd, rs -RABBITIZER_DEF_INSTR_ID(cpu, -0x25, move, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .isPseudo=true) // Move -RABBITIZER_DEF_INSTR_ID(cpu, -0x27, not, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .isPseudo=true) // Not - -// OP rd, rt -RABBITIZER_DEF_INSTR_ID(cpu, -0x23, negu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .isPseudo=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop0_tlb.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop0_tlb.inc deleted file mode 100644 index 5173361a..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop0_tlb.inc +++ /dev/null @@ -1,23 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31--------26-25------21--------------------------------5--------0 - | = COP0 | TLB | | fmt | - ------6----------5----------------------------------------------- - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo -000 | --- | TLBR | TLBWI | --- | --- | --- | TLBWR | --- | -001 | TLBP | --- | --- | --- | --- | --- | --- | --- | -010 | --- | --- | --- | --- | --- | --- | --- | --- | -011 | ERET | --- | --- | --- | --- | --- | --- | --- | -100 | --- | --- | --- | --- | --- | --- | --- | --- | -101 | --- | --- | --- | --- | --- | --- | --- | --- | -110 | --- | --- | --- | --- | --- | --- | --- | --- | -111 | EI | DI | --- | --- | --- | --- | --- | --- | - hi |-------|-------|-------|-------|-------|-------|-------|-------| -*/ - -// The other instructions are implemented using the main CPU table - -RABBITIZER_DEF_INSTR_ID(r5900, 0x38, ei, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x39, di, .operands={0}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop1_fpu_s.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop1_fpu_s.inc deleted file mode 100644 index 730e7e91..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop1_fpu_s.inc +++ /dev/null @@ -1,46 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31--------26-25------21 -------------------------------5--------0 - | = COP1 | = S | | function| - ------6----------5-----------------------------------------6----- - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo -000 | ADD.S | SUB.S | MUL.S | DIV.S | SQRT.S| ABS.S | MOV.S | NEG.S | -001 | --- | --- | --- | --- | --- | --- | --- | --- | -010 | --- | --- | --- | --- | --- | --- |RSQRT.S| --- | -011 | ADDA.S| SUBA.S| MULA.S| --- | MADD.S| MSUB.S|MADDA.S|MSUBA.S| -100 | --- | --- | --- | --- | CVT.W | --- | --- | --- | -101 | MAX.S | MIN.S | --- | --- | --- | --- | --- | --- | -110 | C.F | --- | C.EQ | --- | C.LT | --- | C.LE | --- | -111 | --- | --- | --- | --- | --- | --- | --- | --- | - hi |-------|-------|-------|-------|-------|-------|-------|-------| -*/ - -// The other instructions are implemented using the main CPU table - -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x04, c1__sqrt_s, c1, .operands={RAB_OPERAND_cpu_copraw}) - -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x16, rsqrt_s, rsqrt.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point Reciprocal SQuare RooT - -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x18, adda_s, adda.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point ADD to Accumulator -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x19, suba_s, suba.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point SUBtract to Accumulator -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1A, mula_s, mula.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point MULtiply to Accumulator - -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1C, madd_s, madd.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point Multiply-ADD -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1D, msub_s, msub.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point Multiply abd SUBtract -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1E, madda_s, madda.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point Multiply-ADD Accumulator -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1F, msuba_s, msuba.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point Multiply SUBtract from Accumulator - -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x28, max_s, max.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point MAXimum -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x29, min_s, min.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point MINimum - -// Due to the R5900's FPU being non properly complaint the instruction cvt.w.s always behaves as trunc.w.s because is because EE can only do round-to-zero. -// Assemblers like GAS workaround this issue by decoding cvt.w.s as trunc.w.s, so we mimic that behaviour to allow assembling with GAS. -// Here's some reading about the binutils rationale: -// https://sourceware.org/legacy-ml/binutils/2012-11/msg00360.html -// https://sourceware.org/pipermail/binutils/2013-January/079863.html -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x24, trunc_w_s, trunc.w.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .isFloat=true) // Floating-Point Truncate to Word Fixed-Point - -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x34, c_lt_s, c.lt.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x36, c_le_s, c.le.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2.inc deleted file mode 100644 index fae81904..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2.inc +++ /dev/null @@ -1,21 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31--------26-25------21 ----------------------------------------0 - | = COP2 | fmt | | - ------6----------5----------------------------------------------- - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo - 00 | --- | QMFC2 | CFC2 | --- | --- | QMTC2 | CTC2 | --- | - 01 | *1 | --- | --- | --- | --- | --- | --- | --- | - 10 | *2 | *2 | *2 | *2 | *2 | *2 | *2 | *2 | - 11 | *2 | *2 | *2 | *2 | *2 | *2 | *2 | *2 | - hi |-------|-------|-------|-------|-------|-------|-------|-------| - *1 = BC instructions, see BC2 list *2 =see special1 table -*/ - -// TODO: properties -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, qmfc2, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r5900_vfs}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, cfc2, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r5900_vis}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x05, qmtc2, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r5900_vfs}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x06, ctc2, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r5900_vis}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_bc2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_bc2.inc deleted file mode 100644 index 734e0d4f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_bc2.inc +++ /dev/null @@ -1,21 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31--------26-25------21-20------16------------------------------0 - | = COP0 | BC2 | fmt | | - ------6----------5----------5------------------------------------ - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo - 00 | BC2F | BC2T | BC2FL | BC2TL | --- | --- | --- | --- | - 01 | --- | --- | --- | --- | --- | --- | --- | --- | - 10 | --- | --- | --- | --- | --- | --- | --- | --- | - 11 | --- | --- | --- | --- | --- | --- | --- | --- | - hi |-------|-------|-------|-------|-------|-------|-------|-------| -*/ - -// TODO: operands and properties - -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, bc2f, .operands={RAB_OPERAND_cpu_branch_target_label}, .isBranch=true) -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, bc2t, .operands={RAB_OPERAND_cpu_branch_target_label}, .isBranch=true) -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, bc2fl, .operands={RAB_OPERAND_cpu_branch_target_label}, .isBranch=true, .isBranchLikely=true) -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, bc2tl, .operands={RAB_OPERAND_cpu_branch_target_label}, .isBranch=true, .isBranchLikely=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special1.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special1.inc deleted file mode 100644 index 043c911f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special1.inc +++ /dev/null @@ -1,82 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26-25-----21-20-----------------------------5--------0 - | =COP2 | Special1 | |function| - ------6----------5------------------------------------------6---- - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo -000 |VADDx |VADDy |VADDz |VADDw |VSUBx |VSUBy |VSUBz |VSUBw | -001 |VMADDx |VMADDy |VMADDz |VMADDw |VMSUBx |VMSUBy |VMSUBz |VMSUBw | -010 |VMAXx |VMAXy |VMAXz |VMAXw |VMINIx |VMINIy |VMINIz |VMINIw | -011 |VMULx |VMULy |VMULz |VMULw |VMULq |VMAXi |VMULi |VMINIi | -100 |VADDq |VMADDq |VADDi |VMADDi |VSUBq |VMSUBq |VSUbi |VMSUBi | -101 |VADD |VMADD |VMUL |VMAX |VSUB |VMSUB |VOPMSUB|VMINI | -110 |VIADD |VISUB |VIADDI | --- |VIAND |VIOR | --- | --- | -111 |VCALLMS|VCALLMSR| --- | --- | *1 | *1 | *1 | *1 | - hi |-------|-------|-------|-------|-------|-------|-------|-------| - *1=see special2 table -*/ - -// TODO: properties - -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, vaddx, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, vaddy, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, vaddz, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, vaddw, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x04, vsubx, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x05, vsuby, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x06, vsubz, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x07, vsubw, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x08, vmaddx, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x09, vmaddy, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, vmaddz, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0B, vmaddw, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0C, vmsubx, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0D, vmsuby, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0E, vmsubz, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0F, vmsubw, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract broadcast - -RABBITIZER_DEF_INSTR_ID(r5900, 0x10, vmaxx, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x11, vmaxy, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x12, vmaxz, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x13, vmaxw, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x14, vminix, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x15, vminiy, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x16, vminiz, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x17, vminiw, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x18, vmulx, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x19, vmuly, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, vmulz, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, vmulw, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x1C, vmulq, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x1D, vmaxi, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum I -RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, vmuli, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply I -RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, vminii, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINImum I - -RABBITIZER_DEF_INSTR_ID(r5900, 0x20, vaddq, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x21, vmaddq, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x22, vaddi, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD I -RABBITIZER_DEF_INSTR_ID(r5900, 0x23, vmaddi, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD I -RABBITIZER_DEF_INSTR_ID(r5900, 0x24, vsubq, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x25, vmsubq, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x26, vsubi, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract I -RABBITIZER_DEF_INSTR_ID(r5900, 0x27, vmsubi, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract I -RABBITIZER_DEF_INSTR_ID(r5900, 0x28, vadd, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD -RABBITIZER_DEF_INSTR_ID(r5900, 0x29, vmadd, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD -RABBITIZER_DEF_INSTR_ID(r5900, 0x2A, vmul, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply -RABBITIZER_DEF_INSTR_ID(r5900, 0x2B, vmax, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum -RABBITIZER_DEF_INSTR_ID(r5900, 0x2C, vsub, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract -RABBITIZER_DEF_INSTR_ID(r5900, 0x2D, vmsub, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract -RABBITIZER_DEF_INSTR_ID(r5900, 0x2E, vopmsub, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Outer product post decrement -RABBITIZER_DEF_INSTR_ID(r5900, 0x2F, vmini, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINImum - -RABBITIZER_DEF_INSTR_ID(r5900, 0x30, viadd, .operands={RAB_OPERAND_r5900_vid, RAB_OPERAND_r5900_vis, RAB_OPERAND_r5900_vit}) // Integer ADD -RABBITIZER_DEF_INSTR_ID(r5900, 0x31, visub, .operands={RAB_OPERAND_r5900_vid, RAB_OPERAND_r5900_vis, RAB_OPERAND_r5900_vit}) // Integer SUBtract -RABBITIZER_DEF_INSTR_ID(r5900, 0x32, viaddi, .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis, RAB_OPERAND_r5900_immediate5}) // Integer ADD Immediate -RABBITIZER_DEF_INSTR_ID(r5900, 0x34, viand, .operands={RAB_OPERAND_r5900_vid, RAB_OPERAND_r5900_vis, RAB_OPERAND_r5900_vit}) // Integer AND -RABBITIZER_DEF_INSTR_ID(r5900, 0x35, vior, .operands={RAB_OPERAND_r5900_vid, RAB_OPERAND_r5900_vis, RAB_OPERAND_r5900_vit}) // Integer OR - -// TODO: operands and properties -RABBITIZER_DEF_INSTR_ID(r5900, 0x38, vcallms, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x39, vcallmsr, .operands={RAB_OPERAND_r5900_vis}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special2.inc deleted file mode 100644 index 6558540f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special2.inc +++ /dev/null @@ -1,125 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26-25-----21-20------------------11-10------6-5-2-1--0 - | =COP2 | Special2 | | fhi |1111|flo| - ------6----------5----------------------------------------------- -Note: opcode is flo | (fhi * 4). - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo -0000 |VADDAx |VADDAy |VADDAz |VADDAw |VSUBAx |VSUBAy |VSUBAz |VSUBAw | -0001 |VMADDAx|VMADDAy|VMADDAz|VMADDAw|VMSUBAx|VMSUBAy|VMSUBAz|VMSUBAw| -0010 |VITOF0 |VITOF4 |VITOF12|VITOF15|VFTOI0 |VFTOI4 |VFTOI12|VFTOI15| -0011 |VMULAx |VMULAy |VMULAz |VMULAw |VMULAq |VABS |VMULAi |VCLIPw | -0100 |VADDAq |VMADDAq|VADDAi |VMADDAi|VSUBAq |VMSUBAq|VSUBAi |VMSUBAi| -0101 |VADDA |VMADDA |VMULA | --- |VSUBA |VMSUBA |VOPMULA|VNOP | -0110 |VMOVE |VMR32 | --- | --- |VLQI |VSQI |VLQD |VSQD | -0111 |VDIV |VSQRT |VRSQRT |VWAITQ |VMTIR |VMFIR |VILWR |VISWR | -1000 |VRNEXT |VRGET |VRINIT |VRXOR | --- | --- | --- | --- | -1001 | --- | --- | --- | --- | --- | --- | --- | --- | -1010 | --- | --- | --- | --- | --- | --- | --- | --- | -1011 | --- | --- | --- | --- | --- | --- | --- | --- | -1100 | --- | --- | --- | --- | --- | --- | --- | --- | -1101 | --- | --- | --- | --- | --- | --- | --- | --- | -1110 | --- | --- | --- | --- | --- | --- | --- | --- | -1111 | --- | --- | --- | --- | --- | --- | --- | --- | - hi |-------|-------|-------|-------|-------|-------|-------|-------| -*/ - -// TODO: operands and properties - -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, vaddax, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, vadday, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, vaddaz, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, vaddaw, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x04, vsubax, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x05, vsubay, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x06, vsubaz, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x07, vsubaw, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x08, vmaddax, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) // Multiply and add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x09, vmadday, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) // Multiply and add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, vmaddaz, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) // Multiply and add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0B, vmaddaw, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) // Multiply and add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0C, vmsubax, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0D, vmsubay, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0E, vmsubaz, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0F, vmsubaw, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast - -RABBITIZER_DEF_INSTR_ID(r5900, 0x10, vitof0, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Integer to floating point -RABBITIZER_DEF_INSTR_ID(r5900, 0x11, vitof4, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Integer to floating point -RABBITIZER_DEF_INSTR_ID(r5900, 0x12, vitof12, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Integer to floating point -RABBITIZER_DEF_INSTR_ID(r5900, 0x13, vitof15, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Integer to floating point -RABBITIZER_DEF_INSTR_ID(r5900, 0x14, vftoi0, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Floating to integer -RABBITIZER_DEF_INSTR_ID(r5900, 0x15, vftoi4, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Floating to integer -RABBITIZER_DEF_INSTR_ID(r5900, 0x16, vftoi12, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Floating to integer -RABBITIZER_DEF_INSTR_ID(r5900, 0x17, vftoi15, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Floating to integer - -RABBITIZER_DEF_INSTR_ID(r5900, 0x18, vmulax, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) -RABBITIZER_DEF_INSTR_ID(r5900, 0x19, vmulay, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) -RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, vmulaz, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) -RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, vmulaw, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) -// TODO -RABBITIZER_DEF_INSTR_ID(r5900, 0x1C, vmulaq, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1D, vabs, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Absolute - -// TODO -RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, vmulai, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, vclipw, .operands={RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Clip - -RABBITIZER_DEF_INSTR_ID(r5900, 0x20, vaddaq, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x21, vmaddaq, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and add accumulator Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x22, vaddai, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator I -RABBITIZER_DEF_INSTR_ID(r5900, 0x23, vmaddai, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and add accumulator I -RABBITIZER_DEF_INSTR_ID(r5900, 0x24, vsubaq, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Subtract accumulator Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x25, vmsubaq, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and Subtract accumulator Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x26, vsubai, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Subtract accumulator I -RABBITIZER_DEF_INSTR_ID(r5900, 0x27, vmsubai, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and Subtract accumulator I -RABBITIZER_DEF_INSTR_ID(r5900, 0x28, vadda, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator -RABBITIZER_DEF_INSTR_ID(r5900, 0x29, vmadda, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and add accumulator - -// TODO -RABBITIZER_DEF_INSTR_ID(r5900, 0x2A, vmula, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) - -RABBITIZER_DEF_INSTR_ID(r5900, 0x2C, vsuba, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) -RABBITIZER_DEF_INSTR_ID(r5900, 0x2D, vmsuba, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator -RABBITIZER_DEF_INSTR_ID(r5900, 0x2E, vopmula, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Outer product pre increment -RABBITIZER_DEF_INSTR_ID(r5900, 0x2F, vnop, .operands={0}) // No operation - -RABBITIZER_DEF_INSTR_ID(r5900, 0x30, vmove, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Move floating point registers -RABBITIZER_DEF_INSTR_ID(r5900, 0x31, vmr32, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Move and rotate per word -RABBITIZER_DEF_INSTR_ID(r5900, 0x34, vlqi, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vis_postincr}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Load quadraword post increment -RABBITIZER_DEF_INSTR_ID(r5900, 0x35, vsqi, .operands={RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vit_postincr}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Store quadraword post increment -RABBITIZER_DEF_INSTR_ID(r5900, 0x36, vlqd, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vis_predecr}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Load quadraword pre decrement -RABBITIZER_DEF_INSTR_ID(r5900, 0x37, vsqd, .operands={RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vit_predecr}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Store quadraword pre decrement - -RABBITIZER_DEF_INSTR_ID(r5900, 0x38, vdiv, .operands={RAB_OPERAND_r5900_Q, RAB_OPERAND_r5900_vfsl, RAB_OPERAND_r5900_vftm}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x39, vsqrt, .operands={RAB_OPERAND_r5900_Q, RAB_OPERAND_r5900_vftm}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x3A, vrsqrt, .operands={RAB_OPERAND_r5900_Q, RAB_OPERAND_r5900_vfsl,RAB_OPERAND_r5900_vftm}) - -RABBITIZER_DEF_INSTR_ID(r5900, 0x3B, vwaitq, .operands={0}) // Wait Q operation - -RABBITIZER_DEF_INSTR_ID(r5900, 0x3C, vmtir, .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vfsl}) - -RABBITIZER_DEF_INSTR_ID(r5900, 0x3D, vmfir, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vis}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Move from integer register - -RABBITIZER_DEF_INSTR_ID(r5900, 0x3E, vilwr, .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis}, .isFloat=true, .doesDereference=true, .doesLoad=true) // Integer load word register -RABBITIZER_DEF_INSTR_ID(r5900, 0x3F, viswr, .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis}, .isFloat=true, .doesDereference=true, .doesStore=true) // Integer store word register -/* -"vilwr.w", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -"vilwr.x", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -"vilwr.y", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -"vilwr.z", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -"viswr.w", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -"viswr.x", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -"viswr.y", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -"viswr.z", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -*/ - -RABBITIZER_DEF_INSTR_ID(r5900, 0x40, vrnext, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_R}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // R next -RABBITIZER_DEF_INSTR_ID(r5900, 0x41, vrget, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_R}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // R move - -// TODO -RABBITIZER_DEF_INSTR_ID(r5900, 0x42, vrinit, .operands={RAB_OPERAND_r5900_R, RAB_OPERAND_r5900_vfsl}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x43, vrxor, .operands={RAB_OPERAND_r5900_R, RAB_OPERAND_r5900_vfsl}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi.inc deleted file mode 100644 index 1cc9bf5c..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi.inc +++ /dev/null @@ -1,49 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26------------------------------------------5--------0 - | = MMI | | function| - ------6----------------------------------------------------6----- - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo -000 | MADD | MADDU | --- | --- | PLZCW | --- | --- | --- | -001 | *1 | *2 | --- | --- | --- | --- | --- | --- | -010 | MFHI1 | MTHI1 | MFLO1 | MTLO1 | --- | --- | --- | --- | -011 | MULT1 | MULTU1| DIV1 | DIVU1 | --- | --- | --- | --- | -100 | MADD1 | MADDU1| --- | --- | --- | --- | --- | --- | -101 | *3 | *4 | --- | --- | --- | --- | --- | --- | -110 | PMFHL | PMTHL | --- | --- | PSLLH | --- | PSRLH | PSRAH | -111 | --- | --- | --- | --- | PSLLW | --- | PSRLW | PSRAW | - hi |-------|-------|-------|-------|-------|-------|-------|-------| - *1 = MMI0 list *2 = MMI2 list - *3 = MMI1 list *4 = MMI3 list -*/ - -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, madd, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Multiply-ADD word -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, maddu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Multiply-ADD Unsigned word -RABBITIZER_DEF_INSTR_ID(r5900, 0x04, plzcw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs}, .modifiesRd=true) // Parallel Leading Zero or one Count Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x10, mfhi1, .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true) // Move From HI1 register -RABBITIZER_DEF_INSTR_ID(r5900, 0x11, mthi1, .operands={RAB_OPERAND_cpu_rs}) // Move To HI1 register -RABBITIZER_DEF_INSTR_ID(r5900, 0x12, mflo1, .operands={RAB_OPERAND_cpu_rd}) // Move From LO1 register -RABBITIZER_DEF_INSTR_ID(r5900, 0x13, mtlo1, .operands={RAB_OPERAND_cpu_rs}) // Move To LO1 register - -RABBITIZER_DEF_INSTR_ID(r5900, 0x18, mult1, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // MULTiply word pipeline 1 -RABBITIZER_DEF_INSTR_ID(r5900, 0x19, multu1, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // MULTiply Unsigned word pipeline 1 -RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, div1, .operands={RAB_OPERAND_cpu_zero, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}) // DIVide word pipeline 1 -RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, divu1, .operands={RAB_OPERAND_cpu_zero, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}) // DIVide Unsigned word pipeline 1 - -RABBITIZER_DEF_INSTR_ID(r5900, 0x20, madd1, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Multiply-ADD word pipeline 1 -RABBITIZER_DEF_INSTR_ID(r5900, 0x21, maddu1, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Multiply-ADD Unsigned word pipeline 1 - -// TODO: check this two instruction, it is supposed to have an extra .fmt -RABBITIZER_DEF_INSTR_ID(r5900, 0x30, pmfhl, .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true) // Parallel Move From Hi/Lo register -RABBITIZER_DEF_INSTR_ID(r5900, 0x31, pmthl, .operands={RAB_OPERAND_cpu_rs}) // Parallel Move To Hi/Lo register - -RABBITIZER_DEF_INSTR_ID(r5900, 0x34, psllh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true) // Parallel Shift Left Logical Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x36, psrlh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true) // Parallel Shift Right Logical Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x37, psrah, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true) // Parallel Shift Right Arithmetic Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x3C, psllw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true) // Parallel Shift Left Logical Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x3E, psrlw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true) // Parallel Shift Right Logical Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x3F, psraw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true) // Parallel Shift Right Arithmetic Word diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_0.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_0.inc deleted file mode 100644 index d9203e52..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_0.inc +++ /dev/null @@ -1,50 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26------------------------------10--------6-5--------0 - | | |function | MMI0 | - ------6----------------------------------------------------6----- - |---00--|---01--|---10--|---11--| lo -000 |PADDW | PSUBW | PCGTW | PMAXW | -001 |PADDH | PSUBH | PCGTH | PMAXH | -010 |PADDB | PSUBB | PCGTB | --- | -011 | --- | --- | --- | --- | -100 |PADDSW |PSUBSW |PEXTLW | PPACW | -101 |PADDSH |PSUBSH |PEXTLH | PPACH | -110 |PADDSB |PSUBSB |PEXTLB | PPACB | -111 | --- | --- | PEXT5 | PPAC5 | - hi |-------|-------|-------|-------| -*/ - -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, paddw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, psubw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, pcgtw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Compare for Greater Than Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, pmaxw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel MAXimum Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x04, paddh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x05, psubh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x06, pcgth, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Compare for Greater Than Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x07, pmaxh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel MAXimum Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x08, paddb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD Byte -RABBITIZER_DEF_INSTR_ID(r5900, 0x09, psubb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract Byte -RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, pcgtb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Compare for Greater Than Byte - -RABBITIZER_DEF_INSTR_ID(r5900, 0x10, paddsw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD with Signed saturation Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x11, psubsw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract with Signed saturation Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x12, pextlw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXTend Lower from Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x13, ppacw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel PACk to Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x14, paddsh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD with Signed saturation Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x15, psubsh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract with Signed saturation Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x16, pextlh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXTend Lower from Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x17, ppach, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel PACk to Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x18, paddsb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD with Signed saturation Bytes -RABBITIZER_DEF_INSTR_ID(r5900, 0x19, psubsb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract with Signed saturation Bytes -RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, pextlb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXTend Lower from Bytes -RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, ppacb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel PACk to Bytes - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, pext5, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXTend from 5-bits -RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, ppac5, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel PACk to 5-bits diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_1.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_1.inc deleted file mode 100644 index 64573223..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_1.inc +++ /dev/null @@ -1,43 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26------------------------------------------5--------0 - | | |function | MMI1 | - ------6----------------------------------------------------6----- - |---00--|---01--|---10--|---11--| lo -000 | --- | PABSW | PCEQW | PMINW | -001 |PADSBH | PABSH | PCEQH | PMINH | -010 | --- | --- | PCEQB | --- | -011 | --- | --- | --- | --- | -100 |PADDUW |PSUBUW |PEXTUW | --- | -101 |PADDUH |PSUBUH |PEXTUH | --- | -110 |PADDUB |PSUBUB |PEXTUB | QFSRV | -111 | --- | --- | --- | --- | - hi |-------|-------|-------|-------| -*/ - -// TODO: operands and properties -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, pabsw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ABSolute Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, pceqw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Compare for EQual Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, pminw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel MINimum Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x04, padsbh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADd/SuBtract Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x05, pabsh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ABSolute Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x06, pceqh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Compare for EQual Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x07, pminh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel MINimum Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, pceqb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Compare for EQual Byte - -RABBITIZER_DEF_INSTR_ID(r5900, 0x10, padduw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD Unsigned saturation Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x11, psubuw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract Unsigned saturation Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x12, pextuw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXTend Upper from Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x14, padduh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD Unsigned saturation Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x15, psubuh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract Unsigned saturation Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x16, pextuh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXTend Upper from Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x18, paddub, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD Unsigned saturation Byte -RABBITIZER_DEF_INSTR_ID(r5900, 0x19, psubub, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract Unsigned saturation Byte -RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, pextub, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXTend Upper from Byte -RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, qfsrv, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Quadword Funnel Shift Right Variable diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_2.inc deleted file mode 100644 index a7cd357f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_2.inc +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26------------------------------------------5--------0 - | | |function | MMI2 | - ------6----------------------------------------------------6----- - |---00--|---01--|---10--|---11--| lo -000 |PMADDW | --- |PSLLVW |PSRLVW | -001 |PMSUBW | --- | --- | --- | -010 |PMFHI |PMFLO |PINTH | --- | -011 |PMULTW |PDIVW |PCPYLD | --- | -100 |PMADDH |PHMADH | PAND | PXOR | -101 |PMSUBH |PHMSBH | --- | --- | -110 | --- | --- | PEXEH | PREVH | -111 |PMULTH |PDIVBW | PEXEW |PROT3W | - hi |-------|-------|-------|-------| -*/ - -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, pmaddw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Multiply-ADD Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, psllvw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .modifiesRd=true) // Parallel Shift Left Logical Variable Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, psrlvw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .modifiesRd=true) // Parallel Shift Right Logical Variable Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x04, pmsubw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Multiply-SUBtract Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x08, pmfhi, .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true) // Parallel Move From HI register -RABBITIZER_DEF_INSTR_ID(r5900, 0x09, pmflo, .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true) // Parallel Move From LO register -RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, pinth, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel INTerleave Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x0C, pmultw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel MULTiply Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x0D, pdivw, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}) // Parallel DIVide Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x0E, pcpyld, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel CoPY Lower Doubleword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x10, pmaddh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Multiply-ADD Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x11, phmadh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Horizontal Multiply-ADd Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x12, pand, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel AND -RABBITIZER_DEF_INSTR_ID(r5900, 0x13, pxor, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel eXclusive OR - -RABBITIZER_DEF_INSTR_ID(r5900, 0x14, pmsubh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Multiply-SUBtract Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x15, phmsbh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Horizontal Multiply-Subtract Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, pexeh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXchange Even Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, prevh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel REVerse Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1C, pmulth, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Multiply Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x1D, pdivbw, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel DIVide Broadcast Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, pexew, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXchange Even Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, prot3w, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ROTate 3 Words left diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_3.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_3.inc deleted file mode 100644 index 21edadd5..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_3.inc +++ /dev/null @@ -1,37 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26------------------------------------------5--------0 - | | |function | MMI3 | - ------6----------------------------------------------------6----- - |---00--|---01--|---10--|---11--| lo -000 |PMADDUW| --- | --- |PSRAVW | -001 | --- | --- | --- | --- | -010 |PMTHI | PMTLO |PINTEH | --- | -011 |PMULTUW| PDIVUW|PCPYUD | --- | -100 | --- | --- | POR | PNOR | -101 | --- | --- | --- | --- | -110 | --- | --- | PEXCH | PCPYH | -111 | --- | --- | PEXCW | --- | - hi |-------|-------|-------|-------| -*/ - -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, pmadduw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Multiply-ADD Unsigned Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, psravw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .modifiesRd=true) // Parallel Shift Right Arithmetic Variable Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x08, pmthi, .operands={RAB_OPERAND_cpu_rs}) // Parallel Move To HI register -RABBITIZER_DEF_INSTR_ID(r5900, 0x09, pmtlo, .operands={RAB_OPERAND_cpu_rs}) // Parallel Move To LO register -RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, pinteh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel INTerleave Even Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x0C, pmultuw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel MULTiply Unsigned Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x0D, pdivuw, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}) // Prallel DIVide Unsigned Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x0E, pcpyud, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel CoPY Upper Doubleword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x12, por, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel OR -RABBITIZER_DEF_INSTR_ID(r5900, 0x13, pnor, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Not OR - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, pexch, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXchange Center Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, pcpyh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel CoPY Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, pexcw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXchange Center Word diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_normal.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_normal.inc deleted file mode 100644 index d5bd5c23..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_normal.inc +++ /dev/null @@ -1,31 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26---------------------------------------------------0 - | opcode | | - ------6---------------------------------------------------------- - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo -000 | *1 | *2 | J | JAL | BEQ | BNE | BLEZ | BGTZ | -001 | ADDI | ADDIU | SLTI | SLTIU | ANDI | ORI | XORI | LUI | -010 | *3 | *4 | *5 | --- | BEQL | BNEL | BLEZL | BGTZL | -011 | DADDI |DADDIU | LDL | LDR | *6 | --- | LQ | SQ | -100 | LB | LH | LWL | LW | LBU | LHU | LWR | LWU | -101 | SB | SH | SWL | SW | SDL | SDR | SWR | CACHE | -110 | --- | LWC1 | --- | PREF | --- | --- | LQC2 | LD | -111 | --- | SWC1 | --- | --- | --- | --- | SQC2 | SD | - hi |-------|-------|-------|-------|-------|-------|-------|-------| - *1 = SPECIAL, see SPECIAL list *2 = REGIMM, see REGIMM list - *3 = COP0 *4 = COP1 - *5 = COP2 *6 = MMI table -*/ - -// The other instructions are implemented using the main CPU table - - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, lq, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true) // Load Quadword -RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, sq, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true) // Store Quadword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x36, lqc2, .operands={RAB_OPERAND_r5900_vft, RAB_OPERAND_cpu_immediate_base}, .canBeLo=true, .doesDereference=true, .doesLoad=true) - -RABBITIZER_DEF_INSTR_ID(r5900, 0x3E, sqc2, .operands={RAB_OPERAND_r5900_vft, RAB_OPERAND_cpu_immediate_base}, .canBeLo=true, .doesDereference=true, .doesStore=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_regimm.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_regimm.inc deleted file mode 100644 index c1f27a2a..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_regimm.inc +++ /dev/null @@ -1,20 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26----------20-------16------------------------------0 - | = REGIMM | | rt | | - ------6---------------------5------------------------------------ - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo - 00 | BLTZ | BGEZ | BLTZL | BGEZL | --- | --- | --- | --- | - 01 | TGEI | TGEIU | TLTI | TLTIU | TEQI | --- | TNEI | --- | - 10 | BLTZAL| BGEZAL|BLTZALL|BGEZALL| --- | --- | --- | --- | - 11 | MTSAB | MTSAH | --- | --- | --- | --- | --- | --- | - hi |-------|-------|-------|-------|-------|-------|-------|-------| -*/ - -// The other instructions are implemented using the main CPU table - -// OP rs, IMM -RABBITIZER_DEF_INSTR_ID(r5900, 0x18, mtsab, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM) -RABBITIZER_DEF_INSTR_ID(r5900, 0x19, mtsah, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_special.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_special.inc deleted file mode 100644 index 22e1bb73..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_special.inc +++ /dev/null @@ -1,27 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26------------------------------------------5--------0 - | = SPECIAL | | function| - ------6----------------------------------------------------6----- - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo -000 | SLL | --- | SRL | SRA | SLLV | --- | SRLV | SRAV | -001 | JR | JALR | MOVZ | MOVN |SYSCALL| BREAK | --- | SYNC | -010 | MFHI | MTHI | MFLO | MTLO | DSLLV | --- | DSRLV | DSRAV | -011 | MULT | MULTU | DIV | DIVU | ---- | --- | ---- | ----- | -100 | ADD | ADDU | SUB | SUBU | AND | OR | XOR | NOR | -101 | MFSA | MTSA | SLT | SLTU | DADD | DADDU | DSUB | DSUBU | -110 | TGE | TGEU | TLT | TLTU | TEQ | --- | TNE | --- | -111 | DSLL | --- | DSRL | DSRA |DSLL32 | --- |DSRL32 |DSRA32 | - hi |-------|-------|-------|-------|-------|-------|-------|-------| -*/ - -// The other instructions are implemented using the main CPU table - -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, -0x0F, sync_p, sync.p, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Sync - -RABBITIZER_DEF_INSTR_ID(r5900, 0x18, mult, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // MULTtiply word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x28, mfsa, .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true) // Move From Shift Amount register -RABBITIZER_DEF_INSTR_ID(r5900, 0x29, mtsa, .operands={RAB_OPERAND_cpu_rs}) // Move To Shift Amount register diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop0.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop0.inc deleted file mode 100644 index c6c7d0ea..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop0.inc +++ /dev/null @@ -1,6 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP rt, cop0d -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, mfc0, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true, .notEmitedByCompilers=true) // Move word From CP0 -RABBITIZER_DEF_INSTR_ID(rsp, 0x04, mtc0, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Move word to CP0 diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2.inc deleted file mode 100644 index 344891db..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2.inc +++ /dev/null @@ -1,10 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP cop2t, vd[index] -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, mfc2, .operands={RAB_OPERAND_rsp_cop2t, RAB_OPERAND_rsp_vs_index}, .modifiesRt=true) -RABBITIZER_DEF_INSTR_ID(rsp, 0x04, mtc2, .operands={RAB_OPERAND_rsp_cop2t, RAB_OPERAND_rsp_vs_index}) - -// OP rt, cop2cd -RABBITIZER_DEF_INSTR_ID(rsp, 0x02, cfc2, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_rsp_cop2cd}, .modifiesRt=true) -RABBITIZER_DEF_INSTR_ID(rsp, 0x06, ctc2, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_rsp_cop2cd}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2_vu.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2_vu.inc deleted file mode 100644 index 4a927a59..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2_vu.inc +++ /dev/null @@ -1,53 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP vd, vs, vt[elementhigh] -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, vmulf, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x01, vmulu, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x02, vrndp, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x03, vmulq, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x04, vmudl, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x05, vmudm, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x06, vmudn, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x07, vmudh, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x08, vmacf, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x09, vmacu, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0A, vrndn, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, vmacq, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0C, vmadl, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0D, vmadm, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0E, vmadn, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0F, vmadh, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x10, vadd, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x11, vsub, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x13, vabs, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x14, vaddc, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x15, vsubc, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x1D, vsar, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x28, vand, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x29, vnand, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x2A, vor, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x2B, vnor, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x2C, vxor, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x2D, vnxor, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) - -RABBITIZER_DEF_INSTR_ID(rsp, 0x20, vlt, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x21, veq, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x22, vne, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x23, vge, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x24, vcl, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x25, vch, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x26, vcr, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x27, vmrg, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) - -// OP vd[de], vt[elementhigh] -RABBITIZER_DEF_INSTR_ID(rsp, 0x30, vrcp, .operands={RAB_OPERAND_rsp_vd_de, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x31, vrcpl, .operands={RAB_OPERAND_rsp_vd_de, RAB_OPERAND_rsp_vt_elementhigh}) // operands may be wrong -RABBITIZER_DEF_INSTR_ID(rsp, 0x32, vrcph, .operands={RAB_OPERAND_rsp_vd_de, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x33, vmov, .operands={RAB_OPERAND_rsp_vd_de, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x34, vrsq, .operands={RAB_OPERAND_rsp_vd_de, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x35, vrsql, .operands={RAB_OPERAND_rsp_vd_de, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x36, vrsqh, .operands={RAB_OPERAND_rsp_vd_de, RAB_OPERAND_rsp_vt_elementhigh}) - -// OP -RABBITIZER_DEF_INSTR_ID(rsp, 0x37, vnop, .operands={0}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal.inc deleted file mode 100644 index be73f5a0..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal.inc +++ /dev/null @@ -1,53 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP LABEL -RABBITIZER_DEF_INSTR_ID(rsp, 0x02, j, .operands={RAB_OPERAND_cpu_label}, .instrType=RABBITIZER_INSTR_TYPE_J, .isJump=true) // Jump -RABBITIZER_DEF_INSTR_ID(rsp, 0x03, jal, .operands={RAB_OPERAND_cpu_label}, .instrType=RABBITIZER_INSTR_TYPE_J, .isJump=true, .doesLink=true) // Jump And Link - -// OP rs, rt, IMM -RABBITIZER_DEF_INSTR_ID(rsp, 0x04, beq, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on EQual -RABBITIZER_DEF_INSTR_ID(rsp, 0x05, bne, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Not Equal - -// OP rs, IMM -RABBITIZER_DEF_INSTR_ID(rsp, 0x06, blez, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Less than or Equal to Zero -RABBITIZER_DEF_INSTR_ID(rsp, 0x07, bgtz, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Greater Than Zero - -// OP rt, rs, IMM -RABBITIZER_DEF_INSTR_ID(rsp, 0x08, addi, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .notEmitedByCompilers=true, .canBeLo=true) // Add Immediate -RABBITIZER_DEF_INSTR_ID(rsp, 0x09, addiu, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true) // Add Immediate Unsigned Word -RABBITIZER_DEF_INSTR_ID(rsp, 0x0A, slti, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true) // Set on Less Than Immediate -RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, sltiu, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true) // Set on Less Than Immediate Unsigned -RABBITIZER_DEF_INSTR_ID(rsp, 0x0C, andi, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true) // And Immediate -RABBITIZER_DEF_INSTR_ID(rsp, 0x0D, ori, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeLo=true) // Or Immediate -RABBITIZER_DEF_INSTR_ID(rsp, 0x0E, xori, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true) // eXclusive OR Immediate - -// OP rt, IMM -RABBITIZER_DEF_INSTR_ID(rsp, 0x0F, lui, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeHi=true) // Load Upper Immediate - -// OP rt, IMM(base) -RABBITIZER_DEF_INSTR_ID(rsp, 0x20, lb, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Byte -RABBITIZER_DEF_INSTR_ID(rsp, 0x21, lh, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Halfword -RABBITIZER_DEF_INSTR_ID(rsp, 0x23, lw, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word -RABBITIZER_DEF_INSTR_ID(rsp, 0x24, lbu, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Byte Insigned -RABBITIZER_DEF_INSTR_ID(rsp, 0x25, lhu, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Halfword Unsigned -RABBITIZER_DEF_INSTR_ID(rsp, 0x28, sb, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Byte -RABBITIZER_DEF_INSTR_ID(rsp, 0x29, sh, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Halfword -RABBITIZER_DEF_INSTR_ID(rsp, 0x2B, sw, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word -RABBITIZER_DEF_INSTR_ID(rsp, 0x33, pref, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV) // Prefetch - -RABBITIZER_DEF_INSTR_ID(rsp, 0x2F, cache, .operands={RAB_OPERAND_cpu_op, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .notEmitedByCompilers=true) // Cache - -// OP ft, IMM(base) -RABBITIZER_DEF_INSTR_ID(rsp, 0x31, lwc1, .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word to Coprocessor z -RABBITIZER_DEF_INSTR_ID(rsp, 0x39, swc1, .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word from Coprocessor z - - -// Pseudo-Instruction Unique IDs - -// OP IMM -RABBITIZER_DEF_INSTR_ID(rsp, -0x03, b, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch (unconditional) - -// OP rs, IMM -RABBITIZER_DEF_INSTR_ID(rsp, -0x04, beqz, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on EQual Zero -RABBITIZER_DEF_INSTR_ID(rsp, -0x05, bnez, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Not Equal Zero diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_lwc2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_lwc2.inc deleted file mode 100644 index 4440fb09..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_lwc2.inc +++ /dev/null @@ -1,15 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP vt[elementlow], offset(vs) -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, lbv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x01, lsv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x02, llv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x03, ldv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x04, lqv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x05, lrv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x06, lpv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x07, luv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x08, lhv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x09, lfv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, ltv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_swc2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_swc2.inc deleted file mode 100644 index 996c69f2..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_swc2.inc +++ /dev/null @@ -1,17 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP vt[elementlow], offset(vs) -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, sbv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x01, ssv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x02, slv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x03, sdv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x04, sqv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x05, srv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x06, spv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x07, suv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x08, shv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x09, sfv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, stv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) - -RABBITIZER_DEF_INSTR_ID(rsp, -0x07, swv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_regimm.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_regimm.inc deleted file mode 100644 index c2132f94..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_regimm.inc +++ /dev/null @@ -1,14 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP rs, IMM -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, bltz, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Less Than Zero -RABBITIZER_DEF_INSTR_ID(rsp, 0x01, bgez, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Greater than or Equal to Zero - -RABBITIZER_DEF_INSTR_ID(rsp, 0x10, bltzal, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true) // Branch on Less Than Zero and Link -RABBITIZER_DEF_INSTR_ID(rsp, 0x11, bgezal, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true) // Branch on Greater Than or Equal to Zero and Link - - -// Pseudo-Instruction Unique IDs - -RABBITIZER_DEF_INSTR_ID(rsp, -0x11, bal, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true, .isPseudo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch and Link diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_special.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_special.inc deleted file mode 100644 index 9f12212d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_special.inc +++ /dev/null @@ -1,49 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP rd, rt, sa -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, sll, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Left Logical -RABBITIZER_DEF_INSTR_ID(rsp, 0x02, srl, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Right Logical -RABBITIZER_DEF_INSTR_ID(rsp, 0x03, sra, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Right Arithmetic - -// OP rd, rt, rs -RABBITIZER_DEF_INSTR_ID(rsp, 0x04, sllv, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Left Logical Variable -RABBITIZER_DEF_INSTR_ID(rsp, 0x06, srlv, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Right Logical Variable -RABBITIZER_DEF_INSTR_ID(rsp, 0x07, srav, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Right Arithmetic Variable - -// OP rs -RABBITIZER_DEF_INSTR_ID(rsp, 0x08, jr, .operands={RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true) // Jump Register -RABBITIZER_DEF_INSTR_ID(rsp, 0x09, jalr, .operands={RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true) // Jump And Link Register - -// OP rd, rs -RABBITIZER_DEF_INSTR_ID_ALTNAME(rsp, -0x09, jalr_rd, jalr, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true) // Jump And Link Register // Special case for rd != 31 - -// OP rd, rs, rt -RABBITIZER_DEF_INSTR_ID(rsp, 0x0A, movz, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // MOVe conditional on Zero -RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, movn, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // MOVe conditional on Not zero - -RABBITIZER_DEF_INSTR_ID(rsp, 0x20, add, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .notEmitedByCompilers=true) // ADD word -RABBITIZER_DEF_INSTR_ID(rsp, 0x21, addu, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // ADD Unsigned word -RABBITIZER_DEF_INSTR_ID(rsp, 0x22, sub, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Subtract word -RABBITIZER_DEF_INSTR_ID(rsp, 0x23, subu, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // SUBtract Unsigned word -RABBITIZER_DEF_INSTR_ID(rsp, 0x24, and, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // AND -RABBITIZER_DEF_INSTR_ID(rsp, 0x25, or, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // OR -RABBITIZER_DEF_INSTR_ID(rsp, 0x26, xor, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // eXclusive OR -RABBITIZER_DEF_INSTR_ID(rsp, 0x27, nor, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Not OR -RABBITIZER_DEF_INSTR_ID(rsp, 0x2A, slt, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Set on Less Than -RABBITIZER_DEF_INSTR_ID(rsp, 0x2B, sltu, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Set on Less Than Unsigned - -// OP code -RABBITIZER_DEF_INSTR_ID(rsp, 0x0D, break, .operands={RAB_OPERAND_cpu_code}, .instrType=RABBITIZER_INSTR_TYPE_R) // Break - - -// Pseudo-Instruction Unique IDs -// OP -RABBITIZER_DEF_INSTR_ID(rsp, -0x01, nop, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R) // No OPeration - -// OP rd, rs -RABBITIZER_DEF_INSTR_ID(rsp, -0x25, move, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Move -RABBITIZER_DEF_INSTR_ID(rsp, -0x27, not, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Not - -// OP rd, rt -RABBITIZER_DEF_INSTR_ID(rsp, -0x23, negu, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_cpu.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_cpu.inc deleted file mode 100644 index bb863366..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_cpu.inc +++ /dev/null @@ -1,25 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RAB_DEF_OPERAND(cpu, rs) -RAB_DEF_OPERAND(cpu, rt) -RAB_DEF_OPERAND(cpu, rd) -RAB_DEF_OPERAND(cpu, sa) -RAB_DEF_OPERAND(cpu, zero) // $zero -// RAB_DEF_OPERAND(cpu, function) -RAB_DEF_OPERAND(cpu, cop0d) -RAB_DEF_OPERAND(cpu, fs) -RAB_DEF_OPERAND(cpu, ft) -RAB_DEF_OPERAND(cpu, fd) -RAB_DEF_OPERAND(cpu, cop1cs) // Coprocessor 1 control fs -RAB_DEF_OPERAND(cpu, cop2t) -RAB_DEF_OPERAND(cpu, op) -RAB_DEF_OPERAND(cpu, code) -RAB_DEF_OPERAND(cpu, code_lower) -RAB_DEF_OPERAND(cpu, copraw) -RAB_DEF_OPERAND(cpu, label) -RAB_DEF_OPERAND(cpu, immediate) -RAB_DEF_OPERAND(cpu, branch_target_label) - -// composed/aliased operands -RAB_DEF_OPERAND(cpu, immediate_base) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_r5900.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_r5900.inc deleted file mode 100644 index 36cb6efc..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_r5900.inc +++ /dev/null @@ -1,33 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RAB_DEF_OPERAND(r5900, I) -RAB_DEF_OPERAND(r5900, Q) -RAB_DEF_OPERAND(r5900, R) -RAB_DEF_OPERAND(r5900, ACC) -RAB_DEF_OPERAND(r5900, ACCxyzw) -RAB_DEF_OPERAND(r5900, vfs) -RAB_DEF_OPERAND(r5900, vft) -RAB_DEF_OPERAND(r5900, vfd) -RAB_DEF_OPERAND(r5900, vfsxyzw) -RAB_DEF_OPERAND(r5900, vftxyzw) -RAB_DEF_OPERAND(r5900, vfdxyzw) -RAB_DEF_OPERAND(r5900, vfsn) -RAB_DEF_OPERAND(r5900, vftn) -RAB_DEF_OPERAND(r5900, vfdn) -RAB_DEF_OPERAND(r5900, vfsl) -RAB_DEF_OPERAND(r5900, vftl) -RAB_DEF_OPERAND(r5900, vfdl) -RAB_DEF_OPERAND(r5900, vfsm) -RAB_DEF_OPERAND(r5900, vftm) -RAB_DEF_OPERAND(r5900, vfdm) -RAB_DEF_OPERAND(r5900, vis) -RAB_DEF_OPERAND(r5900, vit) -RAB_DEF_OPERAND(r5900, vid) -RAB_DEF_OPERAND(r5900, vis_predecr) -RAB_DEF_OPERAND(r5900, vit_predecr) -RAB_DEF_OPERAND(r5900, vid_predecr) -RAB_DEF_OPERAND(r5900, vis_postincr) -RAB_DEF_OPERAND(r5900, vit_postincr) -RAB_DEF_OPERAND(r5900, vid_postincr) -RAB_DEF_OPERAND(r5900, immediate5) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_rsp.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_rsp.inc deleted file mode 100644 index 7bae435d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_rsp.inc +++ /dev/null @@ -1,24 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RAB_DEF_OPERAND(rsp, rs) -RAB_DEF_OPERAND(rsp, rt) -RAB_DEF_OPERAND(rsp, rd) -RAB_DEF_OPERAND(rsp, cop0d) -RAB_DEF_OPERAND(rsp, cop2t) -RAB_DEF_OPERAND(rsp, cop2cd) // Coprocessor 2 control rd -RAB_DEF_OPERAND(rsp, vs) -RAB_DEF_OPERAND(rsp, vt) -RAB_DEF_OPERAND(rsp, vd) -// RAB_DEF_OPERAND(rsp, elementhigh) -// RAB_DEF_OPERAND(rsp, elementlow) -// RAB_DEF_OPERAND(rsp, index) -// RAB_DEF_OPERAND(rsp, offset) - -// composed/aliased operands -RAB_DEF_OPERAND(rsp, vt_elementhigh) -RAB_DEF_OPERAND(rsp, vt_elementlow) -RAB_DEF_OPERAND(rsp, vd_de) -RAB_DEF_OPERAND(rsp, vs_index) -RAB_DEF_OPERAND(rsp, offset_rs) -RAB_DEF_OPERAND(rsp, immediate_base) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop0.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop0.inc deleted file mode 100644 index 9d3d63d2..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop0.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG_NODOLLAR(COP0, Index, 0), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Random, 1), - RABBITIZER_DEF_REG_NODOLLAR(COP0, EntryLo0, 2), - RABBITIZER_DEF_REG_NODOLLAR(COP0, EntryLo1, 3), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Context, 4), - RABBITIZER_DEF_REG_NODOLLAR(COP0, PageMask, 5), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Wired, 6), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Reserved07, 7), - RABBITIZER_DEF_REG_NODOLLAR(COP0, BadVaddr, 8), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Count, 9), - RABBITIZER_DEF_REG_NODOLLAR(COP0, EntryHi, 10), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Compare, 11), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Status, 12), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Cause, 13), - RABBITIZER_DEF_REG_NODOLLAR(COP0, EPC, 14), - RABBITIZER_DEF_REG_NODOLLAR(COP0, PRevID, 15), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Config, 16), - RABBITIZER_DEF_REG_NODOLLAR(COP0, LLAddr, 17), - RABBITIZER_DEF_REG_NODOLLAR(COP0, WatchLo, 18), - RABBITIZER_DEF_REG_NODOLLAR(COP0, WatchHi, 19), - RABBITIZER_DEF_REG_NODOLLAR(COP0, XContext, 20), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Reserved21, 21), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Reserved22, 22), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Reserved23, 23), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Reserved24, 24), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Reserved25, 25), - RABBITIZER_DEF_REG_NODOLLAR(COP0, PErr, 26), - RABBITIZER_DEF_REG_NODOLLAR(COP0, CacheErr, 27), - RABBITIZER_DEF_REG_NODOLLAR(COP0, TagLo, 28), - RABBITIZER_DEF_REG_NODOLLAR(COP0, TagHi, 29), - RABBITIZER_DEF_REG_NODOLLAR(COP0, ErrorEPC, 30), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Reserved31, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1Control.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1Control.inc deleted file mode 100644 index cad6bde5..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1Control.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(COP1_CONTROL, 0, 0), - RABBITIZER_DEF_REG(COP1_CONTROL, 1, 1), - RABBITIZER_DEF_REG(COP1_CONTROL, 2, 2), - RABBITIZER_DEF_REG(COP1_CONTROL, 3, 3), - RABBITIZER_DEF_REG(COP1_CONTROL, 4, 4), - RABBITIZER_DEF_REG(COP1_CONTROL, 5, 5), - RABBITIZER_DEF_REG(COP1_CONTROL, 6, 6), - RABBITIZER_DEF_REG(COP1_CONTROL, 7, 7), - RABBITIZER_DEF_REG(COP1_CONTROL, 8, 8), - RABBITIZER_DEF_REG(COP1_CONTROL, 9, 9), - RABBITIZER_DEF_REG(COP1_CONTROL, 10, 10), - RABBITIZER_DEF_REG(COP1_CONTROL, 11, 11), - RABBITIZER_DEF_REG(COP1_CONTROL, 12, 12), - RABBITIZER_DEF_REG(COP1_CONTROL, 13, 13), - RABBITIZER_DEF_REG(COP1_CONTROL, 14, 14), - RABBITIZER_DEF_REG(COP1_CONTROL, 15, 15), - RABBITIZER_DEF_REG(COP1_CONTROL, 16, 16), - RABBITIZER_DEF_REG(COP1_CONTROL, 17, 17), - RABBITIZER_DEF_REG(COP1_CONTROL, 18, 18), - RABBITIZER_DEF_REG(COP1_CONTROL, 19, 19), - RABBITIZER_DEF_REG(COP1_CONTROL, 20, 20), - RABBITIZER_DEF_REG(COP1_CONTROL, 21, 21), - RABBITIZER_DEF_REG(COP1_CONTROL, 22, 22), - RABBITIZER_DEF_REG(COP1_CONTROL, 23, 23), - RABBITIZER_DEF_REG(COP1_CONTROL, 24, 24), - RABBITIZER_DEF_REG(COP1_CONTROL, 25, 25), - RABBITIZER_DEF_REG(COP1_CONTROL, 26, 26), - RABBITIZER_DEF_REG(COP1_CONTROL, 27, 27), - RABBITIZER_DEF_REG(COP1_CONTROL, 28, 28), - RABBITIZER_DEF_REG(COP1_CONTROL, 29, 29), - RABBITIZER_DEF_REG(COP1_CONTROL, 30, 30), - RABBITIZER_DEF_REG(COP1_CONTROL, FpcCsr, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N32.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N32.inc deleted file mode 100644 index affe4948..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N32.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(COP1_N32, fv0, f0), - RABBITIZER_DEF_REG(COP1_N32, ft14, f1), - RABBITIZER_DEF_REG(COP1_N32, fv1, f2), - RABBITIZER_DEF_REG(COP1_N32, ft15, f3), - RABBITIZER_DEF_REG(COP1_N32, ft0, f4), - RABBITIZER_DEF_REG(COP1_N32, ft1, f5), - RABBITIZER_DEF_REG(COP1_N32, ft2, f6), - RABBITIZER_DEF_REG(COP1_N32, ft3, f7), - RABBITIZER_DEF_REG(COP1_N32, ft4, f8), - RABBITIZER_DEF_REG(COP1_N32, ft5, f9), - RABBITIZER_DEF_REG(COP1_N32, ft6, f10), - RABBITIZER_DEF_REG(COP1_N32, ft7, f11), - RABBITIZER_DEF_REG(COP1_N32, fa0, f12), - RABBITIZER_DEF_REG(COP1_N32, fa1, f13), - RABBITIZER_DEF_REG(COP1_N32, fa2, f14), - RABBITIZER_DEF_REG(COP1_N32, fa3, f15), - RABBITIZER_DEF_REG(COP1_N32, fa4, f16), - RABBITIZER_DEF_REG(COP1_N32, fa5, f17), - RABBITIZER_DEF_REG(COP1_N32, fa6, f18), - RABBITIZER_DEF_REG(COP1_N32, fa7, f19), - RABBITIZER_DEF_REG(COP1_N32, fs0, f20), - RABBITIZER_DEF_REG(COP1_N32, ft8, f21), - RABBITIZER_DEF_REG(COP1_N32, fs1, f22), - RABBITIZER_DEF_REG(COP1_N32, ft9, f23), - RABBITIZER_DEF_REG(COP1_N32, fs2, f24), - RABBITIZER_DEF_REG(COP1_N32, ft10, f25), - RABBITIZER_DEF_REG(COP1_N32, fs3, f26), - RABBITIZER_DEF_REG(COP1_N32, ft11, f27), - RABBITIZER_DEF_REG(COP1_N32, fs4, f28), - RABBITIZER_DEF_REG(COP1_N32, ft12, f29), - RABBITIZER_DEF_REG(COP1_N32, fs5, f30), - RABBITIZER_DEF_REG(COP1_N32, ft13, f31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N64.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N64.inc deleted file mode 100644 index 1388c93d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N64.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(COP1_N64, fv0, f0), - RABBITIZER_DEF_REG(COP1_N64, ft12, f1), - RABBITIZER_DEF_REG(COP1_N64, fv1, f2), - RABBITIZER_DEF_REG(COP1_N64, ft13, f3), - RABBITIZER_DEF_REG(COP1_N64, ft0, f4), - RABBITIZER_DEF_REG(COP1_N64, ft1, f5), - RABBITIZER_DEF_REG(COP1_N64, ft2, f6), - RABBITIZER_DEF_REG(COP1_N64, ft3, f7), - RABBITIZER_DEF_REG(COP1_N64, ft4, f8), - RABBITIZER_DEF_REG(COP1_N64, ft5, f9), - RABBITIZER_DEF_REG(COP1_N64, ft6, f10), - RABBITIZER_DEF_REG(COP1_N64, ft7, f11), - RABBITIZER_DEF_REG(COP1_N64, fa0, f12), - RABBITIZER_DEF_REG(COP1_N64, fa1, f13), - RABBITIZER_DEF_REG(COP1_N64, fa2, f14), - RABBITIZER_DEF_REG(COP1_N64, fa3, f15), - RABBITIZER_DEF_REG(COP1_N64, fa4, f16), - RABBITIZER_DEF_REG(COP1_N64, fa5, f17), - RABBITIZER_DEF_REG(COP1_N64, fa6, f18), - RABBITIZER_DEF_REG(COP1_N64, fa7, f19), - RABBITIZER_DEF_REG(COP1_N64, ft8, f20), - RABBITIZER_DEF_REG(COP1_N64, ft9, f21), - RABBITIZER_DEF_REG(COP1_N64, ft10, f22), - RABBITIZER_DEF_REG(COP1_N64, ft11, f23), - RABBITIZER_DEF_REG(COP1_N64, fs0, f24), - RABBITIZER_DEF_REG(COP1_N64, fs1, f25), - RABBITIZER_DEF_REG(COP1_N64, fs2, f26), - RABBITIZER_DEF_REG(COP1_N64, fs3, f27), - RABBITIZER_DEF_REG(COP1_N64, fs4, f28), - RABBITIZER_DEF_REG(COP1_N64, fs5, f29), - RABBITIZER_DEF_REG(COP1_N64, fs6, f30), - RABBITIZER_DEF_REG(COP1_N64, fs7, f31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1O32.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1O32.inc deleted file mode 100644 index 44ba53e1..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1O32.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(COP1_O32, fv0, f0), - RABBITIZER_DEF_REG(COP1_O32, fv0f, f1), - RABBITIZER_DEF_REG(COP1_O32, fv1, f2), - RABBITIZER_DEF_REG(COP1_O32, fv1f, f3), - RABBITIZER_DEF_REG(COP1_O32, ft0, f4), - RABBITIZER_DEF_REG(COP1_O32, ft0f, f5), - RABBITIZER_DEF_REG(COP1_O32, ft1, f6), - RABBITIZER_DEF_REG(COP1_O32, ft1f, f7), - RABBITIZER_DEF_REG(COP1_O32, ft2, f8), - RABBITIZER_DEF_REG(COP1_O32, ft2f, f9), - RABBITIZER_DEF_REG(COP1_O32, ft3, f10), - RABBITIZER_DEF_REG(COP1_O32, ft3f, f11), - RABBITIZER_DEF_REG(COP1_O32, fa0, f12), - RABBITIZER_DEF_REG(COP1_O32, fa0f, f13), - RABBITIZER_DEF_REG(COP1_O32, fa1, f14), - RABBITIZER_DEF_REG(COP1_O32, fa1f, f15), - RABBITIZER_DEF_REG(COP1_O32, ft4, f16), - RABBITIZER_DEF_REG(COP1_O32, ft4f, f17), - RABBITIZER_DEF_REG(COP1_O32, ft5, f18), - RABBITIZER_DEF_REG(COP1_O32, ft5f, f19), - RABBITIZER_DEF_REG(COP1_O32, fs0, f20), - RABBITIZER_DEF_REG(COP1_O32, fs0f, f21), - RABBITIZER_DEF_REG(COP1_O32, fs1, f22), - RABBITIZER_DEF_REG(COP1_O32, fs1f, f23), - RABBITIZER_DEF_REG(COP1_O32, fs2, f24), - RABBITIZER_DEF_REG(COP1_O32, fs2f, f25), - RABBITIZER_DEF_REG(COP1_O32, fs3, f26), - RABBITIZER_DEF_REG(COP1_O32, fs3f, f27), - RABBITIZER_DEF_REG(COP1_O32, fs4, f28), - RABBITIZER_DEF_REG(COP1_O32, fs4f, f29), - RABBITIZER_DEF_REG(COP1_O32, fs5, f30), - RABBITIZER_DEF_REG(COP1_O32, fs5f, f31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop2.inc deleted file mode 100644 index 84e40f32..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop2.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(COP2, 0, 0), - RABBITIZER_DEF_REG(COP2, 1, 1), - RABBITIZER_DEF_REG(COP2, 2, 2), - RABBITIZER_DEF_REG(COP2, 3, 3), - RABBITIZER_DEF_REG(COP2, 4, 4), - RABBITIZER_DEF_REG(COP2, 5, 5), - RABBITIZER_DEF_REG(COP2, 6, 6), - RABBITIZER_DEF_REG(COP2, 7, 7), - RABBITIZER_DEF_REG(COP2, 8, 8), - RABBITIZER_DEF_REG(COP2, 9, 9), - RABBITIZER_DEF_REG(COP2, 10, 10), - RABBITIZER_DEF_REG(COP2, 11, 11), - RABBITIZER_DEF_REG(COP2, 12, 12), - RABBITIZER_DEF_REG(COP2, 13, 13), - RABBITIZER_DEF_REG(COP2, 14, 14), - RABBITIZER_DEF_REG(COP2, 15, 15), - RABBITIZER_DEF_REG(COP2, 16, 16), - RABBITIZER_DEF_REG(COP2, 17, 17), - RABBITIZER_DEF_REG(COP2, 18, 18), - RABBITIZER_DEF_REG(COP2, 19, 19), - RABBITIZER_DEF_REG(COP2, 20, 20), - RABBITIZER_DEF_REG(COP2, 21, 21), - RABBITIZER_DEF_REG(COP2, 22, 22), - RABBITIZER_DEF_REG(COP2, 23, 23), - RABBITIZER_DEF_REG(COP2, 24, 24), - RABBITIZER_DEF_REG(COP2, 25, 25), - RABBITIZER_DEF_REG(COP2, 26, 26), - RABBITIZER_DEF_REG(COP2, 27, 27), - RABBITIZER_DEF_REG(COP2, 28, 28), - RABBITIZER_DEF_REG(COP2, 29, 29), - RABBITIZER_DEF_REG(COP2, 30, 30), - RABBITIZER_DEF_REG(COP2, 31, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprN32.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprN32.inc deleted file mode 100644 index a937136b..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprN32.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(GPR_N32, zero, 0), - RABBITIZER_DEF_REG(GPR_N32, at, 1), - RABBITIZER_DEF_REG(GPR_N32, v0, 2), - RABBITIZER_DEF_REG(GPR_N32, v1, 3), - RABBITIZER_DEF_REG(GPR_N32, a0, 4), - RABBITIZER_DEF_REG(GPR_N32, a1, 5), - RABBITIZER_DEF_REG(GPR_N32, a2, 6), - RABBITIZER_DEF_REG(GPR_N32, a3, 7), - RABBITIZER_DEF_REG(GPR_N32, a4, 8), - RABBITIZER_DEF_REG(GPR_N32, a5, 9), - RABBITIZER_DEF_REG(GPR_N32, a6, 10), - RABBITIZER_DEF_REG(GPR_N32, a7, 11), - RABBITIZER_DEF_REG(GPR_N32, t0, 12), - RABBITIZER_DEF_REG(GPR_N32, t1, 13), - RABBITIZER_DEF_REG(GPR_N32, t2, 14), - RABBITIZER_DEF_REG(GPR_N32, t3, 15), - RABBITIZER_DEF_REG(GPR_N32, s0, 16), - RABBITIZER_DEF_REG(GPR_N32, s1, 17), - RABBITIZER_DEF_REG(GPR_N32, s2, 18), - RABBITIZER_DEF_REG(GPR_N32, s3, 19), - RABBITIZER_DEF_REG(GPR_N32, s4, 20), - RABBITIZER_DEF_REG(GPR_N32, s5, 21), - RABBITIZER_DEF_REG(GPR_N32, s6, 22), - RABBITIZER_DEF_REG(GPR_N32, s7, 23), - RABBITIZER_DEF_REG(GPR_N32, t8, 24), - RABBITIZER_DEF_REG(GPR_N32, t9, 25), - RABBITIZER_DEF_REG(GPR_N32, k0, 26), - RABBITIZER_DEF_REG(GPR_N32, k1, 27), - RABBITIZER_DEF_REG(GPR_N32, gp, 28), - RABBITIZER_DEF_REG(GPR_N32, sp, 29), - RABBITIZER_DEF_REG(GPR_N32, fp, 30), - RABBITIZER_DEF_REG(GPR_N32, ra, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprO32.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprO32.inc deleted file mode 100644 index 26685fe5..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprO32.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(GPR_O32, zero, 0), - RABBITIZER_DEF_REG(GPR_O32, at, 1), - RABBITIZER_DEF_REG(GPR_O32, v0, 2), - RABBITIZER_DEF_REG(GPR_O32, v1, 3), - RABBITIZER_DEF_REG(GPR_O32, a0, 4), - RABBITIZER_DEF_REG(GPR_O32, a1, 5), - RABBITIZER_DEF_REG(GPR_O32, a2, 6), - RABBITIZER_DEF_REG(GPR_O32, a3, 7), - RABBITIZER_DEF_REG(GPR_O32, t0, 8), - RABBITIZER_DEF_REG(GPR_O32, t1, 9), - RABBITIZER_DEF_REG(GPR_O32, t2, 10), - RABBITIZER_DEF_REG(GPR_O32, t3, 11), - RABBITIZER_DEF_REG(GPR_O32, t4, 12), - RABBITIZER_DEF_REG(GPR_O32, t5, 13), - RABBITIZER_DEF_REG(GPR_O32, t6, 14), - RABBITIZER_DEF_REG(GPR_O32, t7, 15), - RABBITIZER_DEF_REG(GPR_O32, s0, 16), - RABBITIZER_DEF_REG(GPR_O32, s1, 17), - RABBITIZER_DEF_REG(GPR_O32, s2, 18), - RABBITIZER_DEF_REG(GPR_O32, s3, 19), - RABBITIZER_DEF_REG(GPR_O32, s4, 20), - RABBITIZER_DEF_REG(GPR_O32, s5, 21), - RABBITIZER_DEF_REG(GPR_O32, s6, 22), - RABBITIZER_DEF_REG(GPR_O32, s7, 23), - RABBITIZER_DEF_REG(GPR_O32, t8, 24), - RABBITIZER_DEF_REG(GPR_O32, t9, 25), - RABBITIZER_DEF_REG(GPR_O32, k0, 26), - RABBITIZER_DEF_REG(GPR_O32, k1, 27), - RABBITIZER_DEF_REG(GPR_O32, gp, 28), - RABBITIZER_DEF_REG(GPR_O32, sp, 29), - RABBITIZER_DEF_REG(GPR_O32, fp, 30), - RABBITIZER_DEF_REG(GPR_O32, ra, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VF.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VF.inc deleted file mode 100644 index afb88dd5..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VF.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RABBITIZER_DEF_REG(R5900_VF, vf0, 0), -RABBITIZER_DEF_REG(R5900_VF, vf1, 1), -RABBITIZER_DEF_REG(R5900_VF, vf2, 2), -RABBITIZER_DEF_REG(R5900_VF, vf3, 3), -RABBITIZER_DEF_REG(R5900_VF, vf4, 4), -RABBITIZER_DEF_REG(R5900_VF, vf5, 5), -RABBITIZER_DEF_REG(R5900_VF, vf6, 6), -RABBITIZER_DEF_REG(R5900_VF, vf7, 7), -RABBITIZER_DEF_REG(R5900_VF, vf8, 8), -RABBITIZER_DEF_REG(R5900_VF, vf9, 9), -RABBITIZER_DEF_REG(R5900_VF, vf10, 10), -RABBITIZER_DEF_REG(R5900_VF, vf11, 11), -RABBITIZER_DEF_REG(R5900_VF, vf12, 12), -RABBITIZER_DEF_REG(R5900_VF, vf13, 13), -RABBITIZER_DEF_REG(R5900_VF, vf14, 14), -RABBITIZER_DEF_REG(R5900_VF, vf15, 15), -RABBITIZER_DEF_REG(R5900_VF, vf16, 16), -RABBITIZER_DEF_REG(R5900_VF, vf17, 17), -RABBITIZER_DEF_REG(R5900_VF, vf18, 18), -RABBITIZER_DEF_REG(R5900_VF, vf19, 19), -RABBITIZER_DEF_REG(R5900_VF, vf20, 20), -RABBITIZER_DEF_REG(R5900_VF, vf21, 21), -RABBITIZER_DEF_REG(R5900_VF, vf22, 22), -RABBITIZER_DEF_REG(R5900_VF, vf23, 23), -RABBITIZER_DEF_REG(R5900_VF, vf24, 24), -RABBITIZER_DEF_REG(R5900_VF, vf25, 25), -RABBITIZER_DEF_REG(R5900_VF, vf26, 26), -RABBITIZER_DEF_REG(R5900_VF, vf27, 27), -RABBITIZER_DEF_REG(R5900_VF, vf28, 28), -RABBITIZER_DEF_REG(R5900_VF, vf29, 29), -RABBITIZER_DEF_REG(R5900_VF, vf30, 30), -RABBITIZER_DEF_REG(R5900_VF, vf31, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VI.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VI.inc deleted file mode 100644 index 3e8e9f82..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VI.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RABBITIZER_DEF_REG(R5900_VI, vi0, 0), -RABBITIZER_DEF_REG(R5900_VI, vi1, 1), -RABBITIZER_DEF_REG(R5900_VI, vi2, 2), -RABBITIZER_DEF_REG(R5900_VI, vi3, 3), -RABBITIZER_DEF_REG(R5900_VI, vi4, 4), -RABBITIZER_DEF_REG(R5900_VI, vi5, 5), -RABBITIZER_DEF_REG(R5900_VI, vi6, 6), -RABBITIZER_DEF_REG(R5900_VI, vi7, 7), -RABBITIZER_DEF_REG(R5900_VI, vi8, 8), -RABBITIZER_DEF_REG(R5900_VI, vi9, 9), -RABBITIZER_DEF_REG(R5900_VI, vi10, 10), -RABBITIZER_DEF_REG(R5900_VI, vi11, 11), -RABBITIZER_DEF_REG(R5900_VI, vi12, 12), -RABBITIZER_DEF_REG(R5900_VI, vi13, 13), -RABBITIZER_DEF_REG(R5900_VI, vi14, 14), -RABBITIZER_DEF_REG(R5900_VI, vi15, 15), -RABBITIZER_DEF_REG(R5900_VI, vi16, 16), -RABBITIZER_DEF_REG(R5900_VI, vi17, 17), -RABBITIZER_DEF_REG(R5900_VI, vi18, 18), -RABBITIZER_DEF_REG(R5900_VI, vi19, 19), -RABBITIZER_DEF_REG(R5900_VI, vi20, 20), -RABBITIZER_DEF_REG(R5900_VI, vi21, 21), -RABBITIZER_DEF_REG(R5900_VI, vi22, 22), -RABBITIZER_DEF_REG(R5900_VI, vi23, 23), -RABBITIZER_DEF_REG(R5900_VI, vi24, 24), -RABBITIZER_DEF_REG(R5900_VI, vi25, 25), -RABBITIZER_DEF_REG(R5900_VI, vi26, 26), -RABBITIZER_DEF_REG(R5900_VI, vi27, 27), -RABBITIZER_DEF_REG(R5900_VI, vi28, 28), -RABBITIZER_DEF_REG(R5900_VI, vi29, 29), -RABBITIZER_DEF_REG(R5900_VI, vi30, 30), -RABBITIZER_DEF_REG(R5900_VI, vi31, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop0.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop0.inc deleted file mode 100644 index fdac94d1..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop0.inc +++ /dev/null @@ -1,19 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_MEM_ADDR, 0), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_DRAM_ADDR, 1), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_RD_LEN, 2), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_WR_LEN, 3), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_STATUS, 4), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_DMA_FULL, 5), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_DMA_BUSY, 6), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_SEMAPHORE, 7), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_START, 8), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_END, 9), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_CURRENT, 10), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_STATUS, 11), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_CLOCK, 12), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_BUFBUSY, 13), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_PIPEBUSY, 14), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_TMEM, 15), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2.inc deleted file mode 100644 index d22b673f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(RSP_COP2, 0, 0), - RABBITIZER_DEF_REG(RSP_COP2, 1, 1), - RABBITIZER_DEF_REG(RSP_COP2, 2, 2), - RABBITIZER_DEF_REG(RSP_COP2, 3, 3), - RABBITIZER_DEF_REG(RSP_COP2, 4, 4), - RABBITIZER_DEF_REG(RSP_COP2, 5, 5), - RABBITIZER_DEF_REG(RSP_COP2, 6, 6), - RABBITIZER_DEF_REG(RSP_COP2, 7, 7), - RABBITIZER_DEF_REG(RSP_COP2, 8, 8), - RABBITIZER_DEF_REG(RSP_COP2, 9, 9), - RABBITIZER_DEF_REG(RSP_COP2, 10, 10), - RABBITIZER_DEF_REG(RSP_COP2, 11, 11), - RABBITIZER_DEF_REG(RSP_COP2, 12, 12), - RABBITIZER_DEF_REG(RSP_COP2, 13, 13), - RABBITIZER_DEF_REG(RSP_COP2, 14, 14), - RABBITIZER_DEF_REG(RSP_COP2, 15, 15), - RABBITIZER_DEF_REG(RSP_COP2, 16, 16), - RABBITIZER_DEF_REG(RSP_COP2, 17, 17), - RABBITIZER_DEF_REG(RSP_COP2, 18, 18), - RABBITIZER_DEF_REG(RSP_COP2, 19, 19), - RABBITIZER_DEF_REG(RSP_COP2, 20, 20), - RABBITIZER_DEF_REG(RSP_COP2, 21, 21), - RABBITIZER_DEF_REG(RSP_COP2, 22, 22), - RABBITIZER_DEF_REG(RSP_COP2, 23, 23), - RABBITIZER_DEF_REG(RSP_COP2, 24, 24), - RABBITIZER_DEF_REG(RSP_COP2, 25, 25), - RABBITIZER_DEF_REG(RSP_COP2, 26, 26), - RABBITIZER_DEF_REG(RSP_COP2, 27, 27), - RABBITIZER_DEF_REG(RSP_COP2, 28, 28), - RABBITIZER_DEF_REG(RSP_COP2, 29, 29), - RABBITIZER_DEF_REG(RSP_COP2, 30, 30), - RABBITIZER_DEF_REG(RSP_COP2, 31, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2Control.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2Control.inc deleted file mode 100644 index 0f730f31..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2Control.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 0, 0), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 1, 1), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 2, 2), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 3, 3), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 4, 4), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 5, 5), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 6, 6), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 7, 7), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 8, 8), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 9, 9), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 10, 10), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 11, 11), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 12, 12), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 13, 13), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 14, 14), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 15, 15), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 16, 16), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 17, 17), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 18, 18), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 19, 19), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 20, 20), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 21, 21), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 22, 22), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 23, 23), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 24, 24), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 25, 25), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 26, 26), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 27, 27), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 28, 28), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 29, 29), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 30, 30), - RABBITIZER_DEF_REG(COP1_CONTROL, 31, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspGpr.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspGpr.inc deleted file mode 100644 index 490926cd..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspGpr.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(RSP_GPR, zero, 0), - RABBITIZER_DEF_REG(RSP_GPR, 1, 1), - RABBITIZER_DEF_REG(RSP_GPR, 2, 2), - RABBITIZER_DEF_REG(RSP_GPR, 3, 3), - RABBITIZER_DEF_REG(RSP_GPR, 4, 4), - RABBITIZER_DEF_REG(RSP_GPR, 5, 5), - RABBITIZER_DEF_REG(RSP_GPR, 6, 6), - RABBITIZER_DEF_REG(RSP_GPR, 7, 7), - RABBITIZER_DEF_REG(RSP_GPR, 8, 8), - RABBITIZER_DEF_REG(RSP_GPR, 9, 9), - RABBITIZER_DEF_REG(RSP_GPR, 10, 10), - RABBITIZER_DEF_REG(RSP_GPR, 11, 11), - RABBITIZER_DEF_REG(RSP_GPR, 12, 12), - RABBITIZER_DEF_REG(RSP_GPR, 13, 13), - RABBITIZER_DEF_REG(RSP_GPR, 14, 14), - RABBITIZER_DEF_REG(RSP_GPR, 15, 15), - RABBITIZER_DEF_REG(RSP_GPR, 16, 16), - RABBITIZER_DEF_REG(RSP_GPR, 17, 17), - RABBITIZER_DEF_REG(RSP_GPR, 18, 18), - RABBITIZER_DEF_REG(RSP_GPR, 19, 19), - RABBITIZER_DEF_REG(RSP_GPR, 20, 20), - RABBITIZER_DEF_REG(RSP_GPR, 21, 21), - RABBITIZER_DEF_REG(RSP_GPR, 22, 22), - RABBITIZER_DEF_REG(RSP_GPR, 23, 23), - RABBITIZER_DEF_REG(RSP_GPR, 24, 24), - RABBITIZER_DEF_REG(RSP_GPR, 25, 25), - RABBITIZER_DEF_REG(RSP_GPR, 26, 26), - RABBITIZER_DEF_REG(RSP_GPR, 27, 27), - RABBITIZER_DEF_REG(RSP_GPR, 28, 28), - RABBITIZER_DEF_REG(RSP_GPR, 29, 29), - RABBITIZER_DEF_REG(RSP_GPR, 30, 30), - RABBITIZER_DEF_REG(RSP_GPR, ra, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspVector.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspVector.inc deleted file mode 100644 index c2676d91..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspVector.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(RSP_VECTOR, v0, 0), - RABBITIZER_DEF_REG(RSP_VECTOR, v1, 1), - RABBITIZER_DEF_REG(RSP_VECTOR, v2, 2), - RABBITIZER_DEF_REG(RSP_VECTOR, v3, 3), - RABBITIZER_DEF_REG(RSP_VECTOR, v4, 4), - RABBITIZER_DEF_REG(RSP_VECTOR, v5, 5), - RABBITIZER_DEF_REG(RSP_VECTOR, v6, 6), - RABBITIZER_DEF_REG(RSP_VECTOR, v7, 7), - RABBITIZER_DEF_REG(RSP_VECTOR, v8, 8), - RABBITIZER_DEF_REG(RSP_VECTOR, v9, 9), - RABBITIZER_DEF_REG(RSP_VECTOR, v10, 10), - RABBITIZER_DEF_REG(RSP_VECTOR, v11, 11), - RABBITIZER_DEF_REG(RSP_VECTOR, v12, 12), - RABBITIZER_DEF_REG(RSP_VECTOR, v13, 13), - RABBITIZER_DEF_REG(RSP_VECTOR, v14, 14), - RABBITIZER_DEF_REG(RSP_VECTOR, v15, 15), - RABBITIZER_DEF_REG(RSP_VECTOR, v16, 16), - RABBITIZER_DEF_REG(RSP_VECTOR, v17, 17), - RABBITIZER_DEF_REG(RSP_VECTOR, v18, 18), - RABBITIZER_DEF_REG(RSP_VECTOR, v19, 19), - RABBITIZER_DEF_REG(RSP_VECTOR, v20, 20), - RABBITIZER_DEF_REG(RSP_VECTOR, v21, 21), - RABBITIZER_DEF_REG(RSP_VECTOR, v22, 22), - RABBITIZER_DEF_REG(RSP_VECTOR, v23, 23), - RABBITIZER_DEF_REG(RSP_VECTOR, v24, 24), - RABBITIZER_DEF_REG(RSP_VECTOR, v25, 25), - RABBITIZER_DEF_REG(RSP_VECTOR, v26, 26), - RABBITIZER_DEF_REG(RSP_VECTOR, v27, 27), - RABBITIZER_DEF_REG(RSP_VECTOR, v28, 28), - RABBITIZER_DEF_REG(RSP_VECTOR, v29, 29), - RABBITIZER_DEF_REG(RSP_VECTOR, v30, 30), - RABBITIZER_DEF_REG(RSP_VECTOR, v31, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/rabbitizer.h b/tools/ido-static-recomp/tools/rabbitizer/include/rabbitizer.h deleted file mode 100644 index 5bae2d58..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/rabbitizer.h +++ /dev/null @@ -1,25 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_H -#define RABBITIZER_H -#pragma once - -#include "common/Utils.h" -#include "common/RabbitizerVersion.h" -#include "common/RabbitizerConfig.h" - -#include "instructions/RabbitizerOperandType.h" -#include "instructions/RabbitizerInstrId.h" -#include "instructions/RabbitizerInstrSuffix.h" -#include "instructions/RabbitizerInstrDescriptor.h" -#include "instructions/RabbitizerRegister.h" -#include "instructions/RabbitizerInstruction.h" -#include "instructions/RabbitizerInstructionRsp.h" -#include "instructions/RabbitizerInstructionR5900.h" - -#include "analysis/RabbitizerTrackedRegisterState.h" -#include "analysis/RabbitizerLoPairingInfo.h" -#include "analysis/RabbitizerRegistersTracker.h" - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/pyproject.toml b/tools/ido-static-recomp/tools/rabbitizer/pyproject.toml deleted file mode 100644 index 35a5cb29..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/pyproject.toml +++ /dev/null @@ -1,9 +0,0 @@ -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -[build-system] -requires = ["setuptools>=61.0", "wheel"] -build-backend = "setuptools.build_meta" - -[tool.cibuildwheel] -skip = ["cp36-*"] diff --git a/tools/ido-static-recomp/tools/rabbitizer/r5900test.c b/tools/ido-static-recomp/tools/rabbitizer/r5900test.c deleted file mode 100644 index bc83f4db..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/r5900test.c +++ /dev/null @@ -1,47 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstructionR5900.h" - -#include -#include -#include -#include - - -int main() { - uint32_t word; - RabbitizerInstruction instr; - char *buffer; - int extraLJust = 5; -#if 1 - uint32_t validbits; -#endif - - word = 0x4BE1634B; - - RabbitizerInstructionR5900_init(&instr, word, 0x00100000); - - RabbitizerInstructionR5900_processUniqueId(&instr); - - buffer = malloc(RabbitizerInstruction_getSizeForBuffer(&instr, 0, extraLJust) + 1); - assert(buffer != NULL); - - RabbitizerInstruction_disassemble(&instr, buffer, NULL, 0, extraLJust); - - printf("%08X: %s\n", word, buffer); - -#if 1 - validbits = RabbitizerInstruction_getValidBits(&instr); - - printf("word: %08X\n", instr.word); - printf("mandatory bits: %08X\n", instr._mandatorybits); - printf("valid bits: %08X\n", validbits); - printf("invalid bits: %08X\n", (~validbits) & instr.word); -#endif - - free(buffer); - RabbitizerInstructionR5900_destroy(&instr); - - return 0; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Config.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Config.pyi deleted file mode 100644 index c639b4f1..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Config.pyi +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .Enum import Enum - - -class Abi: - NUMERIC: Enum - O32: Enum - N32: Enum - N64: Enum - - @staticmethod - def fromStr(name: str | None) -> Enum: ... - - -class _RabbitizerConfig: - regNames_namedRegisters: bool = True - regNames_gprAbiNames: Enum = Abi.O32 - regNames_fprAbiNames: Enum = Abi.NUMERIC - regNames_userFpcCsr: bool = True - regNames_vr4300Cop0NamedRegisters: bool = True - regNames_vr4300RspCop0NamedRegisters: bool = True - - pseudos_enablePseudos: bool = True - pseudos_pseudoBeqz: bool = True - pseudos_pseudoBnez: bool = True - pseudos_pseudoB: bool = True - pseudos_pseudoMove: bool = True - pseudos_pseudoNot: bool = True - pseudos_pseudoNegu: bool = True - pseudos_pseudoBal: bool = True - - toolchainTweaks_sn64DivFix: bool = False - toolchainTweaks_treatJAsUnconditionalBranch: bool = False - - misc_opcodeLJust: int = 11 - misc_unknownInstrComment: bool = True - misc_omit0XOnSmallImm: bool = False - misc_upperCaseImm: bool = True - -config: _RabbitizerConfig diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Enum.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Enum.pyi deleted file mode 100644 index afa18969..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Enum.pyi +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - - -class Enum: - name: str - value: int - - def __init__(self, enumType: str, name: str, value: int) -> None: ... - - def __reduce__(self) -> tuple: ... - - def __lt__(self, __o: object) -> bool: ... - def __le__(self, __o: object) -> bool: ... - def __eq__(self, __o: object) -> bool: ... - def __gt__(self, __o: object) -> bool: ... - def __ge__(self, __o: object) -> bool: ... - - def __repr__(self) -> str: ... - def __str__(self) -> str: ... diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrCategory.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrCategory.pyi deleted file mode 100644 index 7d4b7e56..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrCategory.pyi +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .Enum import Enum - - -class InstrCategory: - CPU: Enum - RSP: Enum - R5900: Enum - MAX: Enum diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrId.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrId.pyi deleted file mode 100644 index 87e87bf3..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrId.pyi +++ /dev/null @@ -1,631 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .Enum import Enum - - -class InstrId: - cpu_INVALID: Enum - cpu_mthi: Enum - cpu_mtlo: Enum - cpu_jr: Enum - cpu_jalr: Enum - cpu_jalr_rd: Enum - cpu_mfhi: Enum - cpu_mflo: Enum - cpu_mult: Enum - cpu_multu: Enum - cpu_dmult: Enum - cpu_dmultu: Enum - cpu_tge: Enum - cpu_tgeu: Enum - cpu_tlt: Enum - cpu_tltu: Enum - cpu_teq: Enum - cpu_tne: Enum - cpu_movz: Enum - cpu_movn: Enum - cpu_div: Enum - cpu_divu: Enum - cpu_sn64_div: Enum - cpu_sn64_divu: Enum - cpu_ddiv: Enum - cpu_ddivu: Enum - cpu_add: Enum - cpu_addu: Enum - cpu_sub: Enum - cpu_subu: Enum - cpu_and: Enum - cpu_or: Enum - cpu_xor: Enum - cpu_nor: Enum - cpu_slt: Enum - cpu_sltu: Enum - cpu_dadd: Enum - cpu_daddu: Enum - cpu_dsub: Enum - cpu_dsubu: Enum - cpu_syscall: Enum - cpu_break: Enum - cpu_sync: Enum - cpu_dsllv: Enum - cpu_dsrlv: Enum - cpu_dsrav: Enum - cpu_sllv: Enum - cpu_srlv: Enum - cpu_srav: Enum - cpu_sll: Enum - cpu_srl: Enum - cpu_sra: Enum - cpu_dsll: Enum - cpu_dsrl: Enum - cpu_dsra: Enum - cpu_dsll32: Enum - cpu_dsrl32: Enum - cpu_dsra32: Enum - cpu_bltz: Enum - cpu_bgez: Enum - cpu_bltzl: Enum - cpu_bgezl: Enum - cpu_tgei: Enum - cpu_tgeiu: Enum - cpu_tlti: Enum - cpu_tltiu: Enum - cpu_bltzal: Enum - cpu_bgezal: Enum - cpu_bltzall: Enum - cpu_bgezall: Enum - cpu_bal: Enum - cpu_teqi: Enum - cpu_tnei: Enum - cpu_j: Enum - cpu_jal: Enum - cpu_beq: Enum - cpu_bne: Enum - cpu_beql: Enum - cpu_bnel: Enum - cpu_blez: Enum - cpu_bgtz: Enum - cpu_blezl: Enum - cpu_bgtzl: Enum - cpu_lui: Enum - cpu_andi: Enum - cpu_ori: Enum - cpu_xori: Enum - cpu_addi: Enum - cpu_addiu: Enum - cpu_daddi: Enum - cpu_daddiu: Enum - cpu_slti: Enum - cpu_sltiu: Enum - cpu_ldl: Enum - cpu_ldr: Enum - cpu_lb: Enum - cpu_lh: Enum - cpu_lwl: Enum - cpu_lw: Enum - cpu_lbu: Enum - cpu_lhu: Enum - cpu_lwr: Enum - cpu_lwu: Enum - cpu_sb: Enum - cpu_sh: Enum - cpu_swl: Enum - cpu_sw: Enum - cpu_sdl: Enum - cpu_sdr: Enum - cpu_swr: Enum - cpu_ll: Enum - cpu_pref: Enum - cpu_lld: Enum - cpu_ld: Enum - cpu_sc: Enum - cpu_scd: Enum - cpu_sd: Enum - cpu_lwc1: Enum - cpu_ldc1: Enum - cpu_swc1: Enum - cpu_sdc1: Enum - cpu_lwc2: Enum - cpu_ldc2: Enum - cpu_swc2: Enum - cpu_sdc2: Enum - cpu_mfc0: Enum - cpu_dmfc0: Enum - cpu_cfc0: Enum - cpu_mtc0: Enum - cpu_dmtc0: Enum - cpu_ctc0: Enum - cpu_tlbr: Enum - cpu_tlbwi: Enum - cpu_tlbwr: Enum - cpu_tlbp: Enum - cpu_eret: Enum - cpu_bc0t: Enum - cpu_bc0f: Enum - cpu_bc0tl: Enum - cpu_bc0fl: Enum - cpu_mfc1: Enum - cpu_dmfc1: Enum - cpu_mtc1: Enum - cpu_dmtc1: Enum - cpu_cfc1: Enum - cpu_ctc1: Enum - cpu_bc1f: Enum - cpu_bc1t: Enum - cpu_bc1fl: Enum - cpu_bc1tl: Enum - cpu_add_s: Enum - cpu_sub_s: Enum - cpu_mul_s: Enum - cpu_div_s: Enum - cpu_add_d: Enum - cpu_sub_d: Enum - cpu_mul_d: Enum - cpu_div_d: Enum - cpu_sqrt_s: Enum - cpu_abs_s: Enum - cpu_mov_s: Enum - cpu_neg_s: Enum - cpu_sqrt_d: Enum - cpu_abs_d: Enum - cpu_mov_d: Enum - cpu_neg_d: Enum - cpu_round_l_s: Enum - cpu_trunc_l_s: Enum - cpu_ceil_l_s: Enum - cpu_floor_l_s: Enum - cpu_round_l_d: Enum - cpu_trunc_l_d: Enum - cpu_ceil_l_d: Enum - cpu_floor_l_d: Enum - cpu_round_w_s: Enum - cpu_trunc_w_s: Enum - cpu_ceil_w_s: Enum - cpu_floor_w_s: Enum - cpu_round_w_d: Enum - cpu_trunc_w_d: Enum - cpu_ceil_w_d: Enum - cpu_floor_w_d: Enum - cpu_c_f_s: Enum - cpu_c_un_s: Enum - cpu_c_eq_s: Enum - cpu_c_ueq_s: Enum - cpu_c_olt_s: Enum - cpu_c_ult_s: Enum - cpu_c_ole_s: Enum - cpu_c_ule_s: Enum - cpu_c_f_d: Enum - cpu_c_un_d: Enum - cpu_c_eq_d: Enum - cpu_c_ueq_d: Enum - cpu_c_olt_d: Enum - cpu_c_ult_d: Enum - cpu_c_ole_d: Enum - cpu_c_ule_d: Enum - cpu_c_sf_s: Enum - cpu_c_ngle_s: Enum - cpu_c_seq_s: Enum - cpu_c_ngl_s: Enum - cpu_c_lt_s: Enum - cpu_c_nge_s: Enum - cpu_c_le_s: Enum - cpu_c_ngt_s: Enum - cpu_c_sf_d: Enum - cpu_c_ngle_d: Enum - cpu_c_seq_d: Enum - cpu_c_ngl_d: Enum - cpu_c_lt_d: Enum - cpu_c_nge_d: Enum - cpu_c_le_d: Enum - cpu_c_ngt_d: Enum - cpu_cvt_s_d: Enum - cpu_cvt_s_w: Enum - cpu_cvt_s_l: Enum - cpu_cvt_d_s: Enum - cpu_cvt_d_w: Enum - cpu_cvt_d_l: Enum - cpu_cvt_w_s: Enum - cpu_cvt_w_d: Enum - cpu_cvt_l_s: Enum - cpu_cvt_l_d: Enum - cpu_nop: Enum - cpu_beqz: Enum - cpu_bnez: Enum - cpu_b: Enum - cpu_move: Enum - cpu_not: Enum - cpu_negu: Enum - cpu_MAX: Enum - - rsp_INVALID: Enum - rsp_vmulf: Enum - rsp_vmulu: Enum - rsp_vrndp: Enum - rsp_vmulq: Enum - rsp_vmudl: Enum - rsp_vmudm: Enum - rsp_vmudn: Enum - rsp_vmudh: Enum - rsp_vmacf: Enum - rsp_vmacu: Enum - rsp_vrndn: Enum - rsp_vmacq: Enum - rsp_vmadl: Enum - rsp_vmadm: Enum - rsp_vmadn: Enum - rsp_vmadh: Enum - rsp_vadd: Enum - rsp_vsub: Enum - rsp_vabs: Enum - rsp_vaddc: Enum - rsp_vsubc: Enum - rsp_vsar: Enum - rsp_vand: Enum - rsp_vnand: Enum - rsp_vor: Enum - rsp_vnor: Enum - rsp_vxor: Enum - rsp_vnxor: Enum - rsp_vlt: Enum - rsp_veq: Enum - rsp_vne: Enum - rsp_vge: Enum - rsp_vcl: Enum - rsp_vch: Enum - rsp_vcr: Enum - rsp_vmrg: Enum - rsp_vrcp: Enum - rsp_vrcpl: Enum - rsp_vrcph: Enum - rsp_vmov: Enum - rsp_vrsq: Enum - rsp_vrsql: Enum - rsp_vrsqh: Enum - rsp_vnop: Enum - rsp_mfc2: Enum - rsp_mtc2: Enum - rsp_cfc2: Enum - rsp_ctc2: Enum - rsp_sbv: Enum - rsp_ssv: Enum - rsp_slv: Enum - rsp_sdv: Enum - rsp_sqv: Enum - rsp_srv: Enum - rsp_spv: Enum - rsp_suv: Enum - rsp_swv: Enum - rsp_shv: Enum - rsp_sfv: Enum - rsp_stv: Enum - rsp_lbv: Enum - rsp_lsv: Enum - rsp_llv: Enum - rsp_ldv: Enum - rsp_lqv: Enum - rsp_lrv: Enum - rsp_lpv: Enum - rsp_luv: Enum - rsp_lhv: Enum - rsp_lfv: Enum - rsp_ltv: Enum - rsp_jr: Enum - rsp_jalr: Enum - rsp_jalr_rd: Enum - rsp_movz: Enum - rsp_movn: Enum - rsp_add: Enum - rsp_addu: Enum - rsp_sub: Enum - rsp_subu: Enum - rsp_and: Enum - rsp_or: Enum - rsp_xor: Enum - rsp_nor: Enum - rsp_slt: Enum - rsp_sltu: Enum - rsp_break: Enum - rsp_sllv: Enum - rsp_srlv: Enum - rsp_srav: Enum - rsp_sll: Enum - rsp_srl: Enum - rsp_sra: Enum - rsp_bltz: Enum - rsp_bgez: Enum - rsp_bltzal: Enum - rsp_bgezal: Enum - rsp_bal: Enum - rsp_j: Enum - rsp_jal: Enum - rsp_beq: Enum - rsp_bne: Enum - rsp_blez: Enum - rsp_bgtz: Enum - rsp_lui: Enum - rsp_andi: Enum - rsp_ori: Enum - rsp_xori: Enum - rsp_addi: Enum - rsp_addiu: Enum - rsp_slti: Enum - rsp_sltiu: Enum - rsp_lb: Enum - rsp_lh: Enum - rsp_lw: Enum - rsp_lbu: Enum - rsp_lhu: Enum - rsp_sb: Enum - rsp_sh: Enum - rsp_sw: Enum - rsp_pref: Enum - rsp_lwc1: Enum - rsp_swc1: Enum - rsp_mfc0: Enum - rsp_mtc0: Enum - rsp_nop: Enum - rsp_beqz: Enum - rsp_bnez: Enum - rsp_b: Enum - rsp_move: Enum - rsp_not: Enum - rsp_negu: Enum - rsp_MAX: Enum - - r5900_INVALID: Enum - r5900_lq: Enum - r5900_sq: Enum - r5900_lqc2: Enum - r5900_sqc2: Enum - r5900_sync_p: Enum - r5900_mfsa: Enum - r5900_mtsa: Enum - r5900_mtsab: Enum - r5900_mtsah: Enum - r5900_madd: Enum - r5900_maddu: Enum - r5900_plzcw: Enum - r5900_mfhi1: Enum - r5900_mthi1: Enum - r5900_mflo1: Enum - r5900_mtlo1: Enum - r5900_mult1: Enum - r5900_multu1: Enum - r5900_div1: Enum - r5900_divu1: Enum - r5900_madd1: Enum - r5900_maddu1: Enum - r5900_pmfhl: Enum - r5900_pmthl: Enum - r5900_psllh: Enum - r5900_psrlh: Enum - r5900_psrah: Enum - r5900_psllw: Enum - r5900_psrlw: Enum - r5900_psraw: Enum - r5900_paddw: Enum - r5900_psubw: Enum - r5900_pcgtw: Enum - r5900_pmaxw: Enum - r5900_paddh: Enum - r5900_psubh: Enum - r5900_pcgth: Enum - r5900_pmaxh: Enum - r5900_paddb: Enum - r5900_psubb: Enum - r5900_pcgtb: Enum - r5900_paddsw: Enum - r5900_psubsw: Enum - r5900_pextlw: Enum - r5900_ppacw: Enum - r5900_paddsh: Enum - r5900_psubsh: Enum - r5900_pextlh: Enum - r5900_ppach: Enum - r5900_paddsb: Enum - r5900_psubsb: Enum - r5900_pextlb: Enum - r5900_ppacb: Enum - r5900_pext5: Enum - r5900_ppac5: Enum - r5900_pabsw: Enum - r5900_pceqw: Enum - r5900_pminw: Enum - r5900_padsbh: Enum - r5900_pabsh: Enum - r5900_pceqh: Enum - r5900_pminh: Enum - r5900_pceqb: Enum - r5900_padduw: Enum - r5900_psubuw: Enum - r5900_pextuw: Enum - r5900_padduh: Enum - r5900_psubuh: Enum - r5900_pextuh: Enum - r5900_paddub: Enum - r5900_psubub: Enum - r5900_pextub: Enum - r5900_qfsrv: Enum - r5900_pmaddw: Enum - r5900_psllvw: Enum - r5900_psrlvw: Enum - r5900_pmsubw: Enum - r5900_pmfhi: Enum - r5900_pmflo: Enum - r5900_pinth: Enum - r5900_pmultw: Enum - r5900_pdivw: Enum - r5900_pcpyld: Enum - r5900_pmaddh: Enum - r5900_phmadh: Enum - r5900_pand: Enum - r5900_pxor: Enum - r5900_pmsubh: Enum - r5900_phmsbh: Enum - r5900_pexeh: Enum - r5900_prevh: Enum - r5900_pmulth: Enum - r5900_pdivbw: Enum - r5900_pexew: Enum - r5900_prot3w: Enum - r5900_pmadduw: Enum - r5900_psravw: Enum - r5900_pmthi: Enum - r5900_pmtlo: Enum - r5900_pinteh: Enum - r5900_pmultuw: Enum - r5900_pdivuw: Enum - r5900_pcpyud: Enum - r5900_por: Enum - r5900_pnor: Enum - r5900_pexch: Enum - r5900_pcpyh: Enum - r5900_pexcw: Enum - r5900_ei: Enum - r5900_di: Enum - r5900_rsqrt_s: Enum - r5900_adda_s: Enum - r5900_suba_s: Enum - r5900_mula_s: Enum - r5900_madd_s: Enum - r5900_msub_s: Enum - r5900_madda_s: Enum - r5900_msuba_s: Enum - r5900_max_s: Enum - r5900_min_s: Enum - r5900_qmfc2: Enum - r5900_cfc2: Enum - r5900_qmtc2: Enum - r5900_ctc2: Enum - r5900_bc2f: Enum - r5900_bc2t: Enum - r5900_bc2fl: Enum - r5900_bc2tl: Enum - r5900_vaddx: Enum - r5900_vaddy: Enum - r5900_vaddz: Enum - r5900_vaddw: Enum - r5900_vsubx: Enum - r5900_vsuby: Enum - r5900_vsubz: Enum - r5900_vsubw: Enum - r5900_vmaddx: Enum - r5900_vmaddy: Enum - r5900_vmaddz: Enum - r5900_vmaddw: Enum - r5900_vmsubx: Enum - r5900_vmsuby: Enum - r5900_vmsubz: Enum - r5900_vmsubw: Enum - r5900_vmaxx: Enum - r5900_vmaxy: Enum - r5900_vmaxz: Enum - r5900_vmaxw: Enum - r5900_vminix: Enum - r5900_vminiy: Enum - r5900_vminiz: Enum - r5900_vminiw: Enum - r5900_vmulx: Enum - r5900_vmuly: Enum - r5900_vmulz: Enum - r5900_vmulw: Enum - r5900_vmulq: Enum - r5900_vmaxi: Enum - r5900_vmuli: Enum - r5900_vminii: Enum - r5900_vaddq: Enum - r5900_vmaddq: Enum - r5900_vaddi: Enum - r5900_vmaddi: Enum - r5900_vsubq: Enum - r5900_vmsubq: Enum - r5900_vsubi: Enum - r5900_vmsubi: Enum - r5900_vadd: Enum - r5900_vmadd: Enum - r5900_vmul: Enum - r5900_vmax: Enum - r5900_vsub: Enum - r5900_vmsub: Enum - r5900_vopmsub: Enum - r5900_vmini: Enum - r5900_viadd: Enum - r5900_visub: Enum - r5900_viaddi: Enum - r5900_viand: Enum - r5900_vior: Enum - r5900_vcallms: Enum - r5900_callmsr: Enum - r5900_vaddax: Enum - r5900_vadday: Enum - r5900_vaddaz: Enum - r5900_vaddaw: Enum - r5900_vsubax: Enum - r5900_vsubay: Enum - r5900_vsubaz: Enum - r5900_vsubaw: Enum - r5900_vvmaddx: Enum - r5900_vvmaddy: Enum - r5900_vvmaddz: Enum - r5900_vvmaddw: Enum - r5900_vmsubax: Enum - r5900_vmsubay: Enum - r5900_vmsubaz: Enum - r5900_vmsubaw: Enum - r5900_vitof0: Enum - r5900_vitof4: Enum - r5900_vitof12: Enum - r5900_vitof15: Enum - r5900_vftoi0: Enum - r5900_vftoi4: Enum - r5900_vftoi12: Enum - r5900_vftoi15: Enum - r5900_vmulax: Enum - r5900_vmulay: Enum - r5900_vmulaz: Enum - r5900_vmulaw: Enum - r5900_vmulaq: Enum - r5900_vabs: Enum - r5900_vmulai: Enum - r5900_vclipw: Enum - r5900_vaddaq: Enum - r5900_vmaddaq: Enum - r5900_vaddai: Enum - r5900_vmaddai: Enum - r5900_vsubaq: Enum - r5900_vmsubaq: Enum - r5900_vsubai: Enum - r5900_vmsubai: Enum - r5900_vadda: Enum - r5900_vmadda: Enum - r5900_vmula: Enum - r5900_vsuba: Enum - r5900_vmsuba: Enum - r5900_vopmula: Enum - r5900_vnop: Enum - r5900_vmove: Enum - r5900_vmr32: Enum - r5900_vlqi: Enum - r5900_vsqi: Enum - r5900_vlqd: Enum - r5900_vsqd: Enum - r5900_vdiv: Enum - r5900_vsqrt: Enum - r5900_vrsqrt: Enum - r5900_vwaitq: Enum - r5900_vmtir: Enum - r5900_vmfir: Enum - r5900_vilwr: Enum - r5900_viswr: Enum - r5900_vrnext: Enum - r5900_vrget: Enum - r5900_vrinit: Enum - r5900_vrxor: Enum - r5900_MAX: Enum - - ALL_MAX: Enum diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/LoPairingInfo.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/LoPairingInfo.pyi deleted file mode 100644 index 70e2a1b7..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/LoPairingInfo.pyi +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - - -class LoPairingInfo: - instrOffset: int - value: int - shouldProcess: bool - isGpRel: bool - isGpGot: bool - - def __init__(self): ... diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprN32.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprN32.pyi deleted file mode 100644 index 54443526..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprN32.pyi +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .Enum import Enum - - -class RegGprN32: - zero: Enum - at: Enum - v0: Enum - v1: Enum - a0: Enum - a1: Enum - a2: Enum - a3: Enum - a4: Enum - a5: Enum - a6: Enum - a7: Enum - t0: Enum - t1: Enum - t2: Enum - t3: Enum - s0: Enum - s1: Enum - s2: Enum - s3: Enum - s4: Enum - s5: Enum - s6: Enum - s7: Enum - t8: Enum - t9: Enum - k0: Enum - k1: Enum - gp: Enum - sp: Enum - fp: Enum - ra: Enum diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprO32.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprO32.pyi deleted file mode 100644 index f145ca3d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprO32.pyi +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .Enum import Enum - - -class RegGprO32: - zero: Enum - at: Enum - v0: Enum - v1: Enum - a0: Enum - a1: Enum - a2: Enum - a3: Enum - t0: Enum - t1: Enum - t2: Enum - t3: Enum - t4: Enum - t5: Enum - t6: Enum - t7: Enum - s0: Enum - s1: Enum - s2: Enum - s3: Enum - s4: Enum - s5: Enum - s6: Enum - s7: Enum - t8: Enum - t9: Enum - k0: Enum - k1: Enum - gp: Enum - sp: Enum - fp: Enum - ra: Enum diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegistersTracker.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegistersTracker.pyi deleted file mode 100644 index 967ba493..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegistersTracker.pyi +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .rabbitizer import Instruction -from .LoPairingInfo import LoPairingInfo - - -class RegistersTracker: - def __init__(self, other: RegistersTracker|None=None): ... - - def moveRegisters(self, instr: Instruction) -> bool: ... - def overwriteRegisters(self, instr: Instruction, instructionOffset: int) -> None: ... - def unsetRegistersAfterFuncCall(self, instr: Instruction, prevInstr: Instruction) -> None: ... - def getAddressIfCanSetType(self, instr: Instruction, instrOffset: int) -> int|None: ... - def getJrInfo(self, instr: Instruction) -> tuple[int, int]|None: ... - - def processLui(self, instr: Instruction, instrOffset: int, prevInstr: Instruction|None=None) -> None: ... - def processGpLoad(self, instr: Instruction, instrOffset: int) -> None: ... - def getLuiOffsetForConstant(self, instr: Instruction) -> int|None: ... - def processConstant(self, instr: Instruction, value: int, offset: int) -> None: ... - def getLuiOffsetForLo(self, instr: Instruction, instrOffset: int) -> tuple[int, bool, bool]: ... #! deprecated - def preprocessLoAndGetInfo(self, instr: Instruction, instrOffset: int) -> LoPairingInfo: ... - def processLo(self, instr: Instruction, value: int, offset: int) -> None: ... - def hasLoButNoHi(self, instr: Instruction) -> bool: ... diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/TrackedRegisterState.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/TrackedRegisterState.pyi deleted file mode 100644 index 36ba693e..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/TrackedRegisterState.pyi +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - - -class RegistersTracker: - registerNum: int - - hasLuiValue: bool - luiOffset: int # The offset of last lui which set a value to this register - luiSetOnBranchLikely: bool - - hasGpGot: bool - gpGotOffset: int - - hasLoValue: bool - loOffset: int - dereferenced: bool - dereferenceOffset: int - - value: int diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Utils.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Utils.pyi deleted file mode 100644 index 7215556f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Utils.pyi +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - - -class Utils: - @staticmethod - def from2Complement(number: int, bits: int) -> int: ... - - @staticmethod - def escapeString(src: str) -> str: ... diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/__init__.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/__init__.pyi deleted file mode 100644 index 1bc27a7f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/__init__.pyi +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .Utils import * - -from .Enum import * -from .InstrCategory import * -from .InstrId import * - -from .RegGprO32 import * -from .RegGprN32 import * - -from .Config import * - -from .rabbitizer import * - -from .RegistersTracker import * diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.c deleted file mode 100644 index 081dcdaf..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.c +++ /dev/null @@ -1,38 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "enums_utils.h" - - -int rabbitizer_EnumMetadata_Initialize(PyObject *submodule, RabbitizerEnumMetadata *enumValues) { - for (size_t i = 0; enumValues[i].enumType != 0; i++) { - PyObject *args; - - args = Py_BuildValue("ssi", enumValues[i].enumType, enumValues[i].name, enumValues[i].value); - if (args == NULL) { - goto error; - } - - enumValues[i].instance = PyObject_CallObject((PyObject*)&rabbitizer_type_Enum_TypeObject, args); - Py_DECREF(args); - if (enumValues[i].instance == NULL) { - goto error; - } - - enumValues[i].isInstanced = true; - if (PyModule_AddObject(submodule, enumValues[i].name, enumValues[i].instance) < 0) { - goto error; - } - } - return 0; - -error: - for (size_t i = 0; enumValues[i].enumType != 0; i++) { - if (enumValues[i].isInstanced) { - Py_DECREF(enumValues[i].instance); - } - enumValues[i].isInstanced = false; - } - - return -1; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.h b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.h deleted file mode 100644 index 6cb8604f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.h +++ /dev/null @@ -1,85 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_ENUMS_UTILS_H -#define RABBITIZER_ENUMS_UTILS_H -#pragma once - - -#define PY_SSIZE_T_CLEAN -#include -#include "structmember.h" - -#include - - -extern PyTypeObject rabbitizer_type_Enum_TypeObject; - - -typedef struct PyRabbitizerEnum { - PyObject_HEAD - PyObject *enumType; - PyObject *name; - int value; -} PyRabbitizerEnum; - -typedef struct RabbitizerEnumMetadata { - const char *enumType; - const char *name; - int value; - bool isInstanced; - PyObject *instance; -} RabbitizerEnumMetadata; - - -int rabbitizer_EnumMetadata_Initialize(PyObject *submodule, RabbitizerEnumMetadata *enumValues); - - -#define DECL_ENUM(enumName) \ - extern RabbitizerEnumMetadata rabbitizer_enum_##enumName##_enumvalues[]; \ - PyObject *rabbitizer_enum_##enumName##_Init(void); \ - /* Return true if o is of this enum type */ \ - int rabbitizer_enum_##enumName##_Check(PyObject *o); - -#define DEF_ENUM(enumName, docs) \ - static PyModuleDef rabbitizer_enum_##enumName##_module = { \ - PyModuleDef_HEAD_INIT, \ - .m_name = "rabbitizer." #enumName, \ - .m_doc = PyDoc_STR(docs), \ - .m_size = -1, \ - .m_methods = rabbitizer_enum_##enumName##_methods, \ - }; \ - PyObject *rabbitizer_enum_##enumName##_Init(void) { \ - PyObject *submodule; \ - if (PyType_Ready(&rabbitizer_type_Enum_TypeObject) < 0) { \ - return NULL; \ - } \ - submodule = PyModule_Create(&rabbitizer_enum_##enumName##_module); \ - if (submodule == NULL) { \ - return NULL; \ - } \ - if (rabbitizer_EnumMetadata_Initialize(submodule, rabbitizer_enum_##enumName##_enumvalues) < 0) { \ - Py_DECREF(submodule); \ - return NULL; \ - } \ - return submodule; \ - } \ - /* Return true if o is of this enum type */ \ - int rabbitizer_enum_##enumName##_Check(PyObject *o) { \ - int isInstance = PyObject_IsInstance(o, (PyObject*)&rabbitizer_type_Enum_TypeObject); \ - int enumTypeCmp; \ - if (isInstance < 0) { \ - /* An error happened */ \ - /* PyObject_IsInstance already sets an exception, so nothing else to do here */ \ - return -1; \ - } \ - if (isInstance == 0) { \ - /* `other` isn't an instance of the Enum type */ \ - return 0; \ - } \ - /* Check if both enums have the same `enumType` */ \ - enumTypeCmp = PyUnicode_CompareWithASCIIString(((PyRabbitizerEnum*)o)->enumType, #enumName); \ - return enumTypeCmp == 0; \ - } - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_Abi.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_Abi.c deleted file mode 100644 index a0d5fb09..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_Abi.c +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "enums_utils.h" -#include "common/RabbitizerConfig.h" -#include "common/Utils.h" - - -#define RABBITIZER_DEF_ABI(name) { "Abi", #name, RABBITIZER_ABI_##name, false, NULL } - -RabbitizerEnumMetadata rabbitizer_enum_Abi_enumvalues[] = { - #include "common/Abi.inc" - RABBITIZER_DEF_ABI(MAX), - - { 0 }, -}; - -#undef RABBITIZER_DEF_ABI - - -static PyObject *rabbitizer_enum_Abi_fromStr(UNUSED PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "name", NULL }; - const char *name = NULL; - RabbitizerAbi abi; - PyObject *ret; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "z", kwlist, &name)) { - return NULL; - } - - abi = RabbitizerAbi_fromStr(name); - - ret = rabbitizer_enum_Abi_enumvalues[abi].instance; - Py_INCREF(ret); - return ret; -} - - -#define METHOD_NO_ARGS(name, docs) { #name, (PyCFunction) rabbitizer_enum_Abi_##name, METH_NOARGS, PyDoc_STR(docs) } -#define METHOD_ARGS(name, docs) { #name, (PyCFunction) rabbitizer_enum_Abi_##name, METH_VARARGS | METH_KEYWORDS, PyDoc_STR(docs) } - -static PyMethodDef rabbitizer_enum_Abi_methods[] = { - METHOD_ARGS(fromStr, ""), - - { 0 }, -}; - -DEF_ENUM(Abi, "") diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrCategory.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrCategory.c deleted file mode 100644 index fbc94dda..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrCategory.c +++ /dev/null @@ -1,23 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "enums_utils.h" -#include "instructions/RabbitizerInstruction.h" - - -#define RABBITIZER_DEF_INSTR_CATEGORY(name) { "InstrCategory", #name, RABBITIZER_INSTRCAT_##name, false, NULL } - -RabbitizerEnumMetadata rabbitizer_enum_InstrCategory_enumvalues[] = { - #include "instructions/InstrCategory.inc" - RABBITIZER_DEF_INSTR_CATEGORY(MAX), - - { 0 }, -}; - -#undef RABBITIZER_DEF_INSTR_CATEGORY - -static PyMethodDef rabbitizer_enum_InstrCategory_methods[] = { - { 0 }, -}; - -DEF_ENUM(InstrCategory, "") diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrId.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrId.c deleted file mode 100644 index fabf612d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrId.c +++ /dev/null @@ -1,29 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "enums_utils.h" -#include "instructions/RabbitizerInstrId.h" - - -#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) { "InstrId", #prefix "_" #name, RABBITIZER_INSTR_ID_##prefix##_##name, false, NULL }, -#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__) - -RabbitizerEnumMetadata rabbitizer_enum_InstrId_enumvalues[] = { - #include "instructions/instr_id/RabbitizerInstrId_cpu.inc" - - #include "instructions/instr_id/RabbitizerInstrId_rsp.inc" - - #include "instructions/instr_id/RabbitizerInstrId_r5900.inc" - - RABBITIZER_DEF_INSTR_ID(ALL, , MAX, ) - { 0 }, -}; - -#undef RABBITIZER_DEF_INSTR_ID -#undef RABBITIZER_DEF_INSTR_ID_ALTNAME - -static PyMethodDef rabbitizer_enum_InstrId_methods[] = { - { 0 }, -}; - -DEF_ENUM(InstrId, "") diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_type_Enum.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_type_Enum.c deleted file mode 100644 index 299fb386..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_type_Enum.c +++ /dev/null @@ -1,211 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "rabbitizer_module.h" -#include "enums_utils.h" -#include "common/Utils.h" - - -static void rabbitizer_type_Enum_dealloc(PyRabbitizerEnum *self) { - Py_XDECREF(self->enumType); - Py_XDECREF(self->name); - Py_TYPE(self)->tp_free((PyObject *) self); -} - -static PyObject *rabbitizer_type_Enum_new(PyTypeObject *type, UNUSED PyObject *args, UNUSED PyObject *kwds) { - PyRabbitizerEnum *self = (PyRabbitizerEnum *) type->tp_alloc(type, 0); - - if (self == NULL) { - return NULL; - } - - self->enumType = PyUnicode_FromString(""); - if (self->enumType == NULL) { - Py_DECREF(self); - return NULL; - } - self->name = PyUnicode_FromString(""); - if (self->name == NULL) { - Py_DECREF(self); - return NULL; - } - self->value = 0; - - return (PyObject *) self; -} - -static int rabbitizer_type_Enum_init(PyRabbitizerEnum *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "enumType", "name", "value", NULL }; - PyObject *enumType = NULL; - PyObject *name = NULL; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "UUi", kwlist, &enumType, &name, &self->value)) { - return -1; - } - - if (enumType != NULL) { - PyObject *tmp = NULL; - - tmp = self->enumType; - Py_INCREF(enumType); - self->enumType = enumType; - Py_DECREF(tmp); - } - if (name) { - PyObject *tmp = NULL; - - tmp = self->name; - Py_INCREF(name); - self->name = name; - Py_DECREF(tmp); - } - - return 0; -} - - -#define DEF_MEMBER_GET_INT(name) \ - static PyObject *rabbitizer_type_Enum_member_get_##name(PyRabbitizerEnum *self, PyObject *Py_UNUSED(ignored)) { \ - return PyLong_FromLong(self->name); \ - } - -#define DEF_MEMBER_GET_OBJREF(name) \ - static PyObject *rabbitizer_type_Enum_member_get_##name(PyRabbitizerEnum *self, PyObject *Py_UNUSED(ignored)) { \ - Py_INCREF(self->name); \ - return self->name; \ - } - -DEF_MEMBER_GET_OBJREF(name) -DEF_MEMBER_GET_INT(value) - - -#define MEMBER_GET(name, docs, closure) { #name, (getter) rabbitizer_type_Enum_member_get_##name, (setter) NULL, PyDoc_STR(docs), closure } -#define MEMBER_SET(name, docs, closure) { #name, (getter) NULL, (setter) rabbitizer_type_Enum_member_set_##name, PyDoc_STR(docs), closure } -#define MEMBER_GET_SET(name, docs, closure) { #name, (getter) rabbitizer_type_Enum_member_get_##name, (setter) rabbitizer_type_Enum_member_set_##name, PyDoc_STR(docs), closure } - -static PyGetSetDef rabbitizer_type_Enum_getsetters[] = { - MEMBER_GET(name, "", NULL), - MEMBER_GET(value, "", NULL), - - { 0 }, -}; - - -// Crappy hash -Py_hash_t rabbitizer_type_Enum_hash(PyRabbitizerEnum *self) { - Py_hash_t hash = PyObject_Hash(self->enumType); - - if (hash == -1) { - return -1; - } - - return hash + self->value; -} - -// Checks for the 6 basic comparisons (==, !=, <, <=, >, >=) -PyObject *rabbitizer_type_Enum_richcompare(PyRabbitizerEnum *self, PyObject *other, int op) { - int isInstance = PyObject_IsInstance(other, (PyObject*)&rabbitizer_type_Enum_TypeObject); - int enumTypeCmp; - int otherValue; - - if (isInstance < 0) { - // An error happened - // PyObject_IsInstance already sets an exception, so nothing else to do here - return NULL; - } - - if (isInstance == 0) { - // `other` isn't an instance of the Enum type - Py_RETURN_FALSE; - } - - // Check if both enums have the same `enumType` - enumTypeCmp = PyUnicode_Compare(self->enumType, ((PyRabbitizerEnum*)other)->enumType); - if (enumTypeCmp < 0) { - // Negative could mean it isn't equal or an error occurred, so we need to check for errors - if (PyErr_Occurred() != NULL) { - return NULL; - } - Py_RETURN_FALSE; - } - if (enumTypeCmp != 0) { - Py_RETURN_FALSE; - } - - otherValue = ((PyRabbitizerEnum*)other)->value; - - // Fails to build on ci builds for some reason - // Py_RETURN_RICHCOMPARE(self->value, ((PyRabbitizerEnum*)other)->value, op); - - switch (op) { - case Py_EQ: if ((self->value) == (otherValue)) Py_RETURN_TRUE; Py_RETURN_FALSE; - case Py_NE: if ((self->value) != (otherValue)) Py_RETURN_TRUE; Py_RETURN_FALSE; - case Py_LT: if ((self->value) < (otherValue)) Py_RETURN_TRUE; Py_RETURN_FALSE; - case Py_GT: if ((self->value) > (otherValue)) Py_RETURN_TRUE; Py_RETURN_FALSE; - case Py_LE: if ((self->value) <= (otherValue)) Py_RETURN_TRUE; Py_RETURN_FALSE; - case Py_GE: if ((self->value) >= (otherValue)) Py_RETURN_TRUE; Py_RETURN_FALSE; - default: - //Py_UNREACHABLE(); - UNREACHABLE; - } -} - - -// To allow piclking the object -static PyObject *rabbitizer_type_Enum___reduce__(PyRabbitizerEnum *self, UNUSED PyObject *closure) { - PyObject *args; - PyObject *enumType; - PyObject *name; - PyObject *value; - - enumType = self->enumType; - Py_INCREF(enumType); - name = self->name; - Py_INCREF(name); - value = PyLong_FromLong(self->value); - - - args = PyTuple_Pack(3, enumType, name, value); - - return PyTuple_Pack(2, (PyObject*)&rabbitizer_type_Enum_TypeObject, args); -} - - -#define METHOD_NO_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_Enum_##name, METH_NOARGS, PyDoc_STR(docs) } -#define METHOD_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_Enum_##name, METH_VARARGS | METH_KEYWORDS, PyDoc_STR(docs) } - - -static PyMethodDef rabbitizer_type_Enum_methods[] = { - METHOD_ARGS(__reduce__, ""), - - { 0 }, -}; - -static PyObject *rabbitizer_type_Enum_repr(PyRabbitizerEnum *self) { - return PyUnicode_FromFormat("<%U: %U (%i)>", self->enumType, self->name, self->value); -} - -static PyObject *rabbitizer_type_Enum_str(PyRabbitizerEnum *self) { - return rabbitizer_type_Enum_repr(self); -} - -// TODO: implement hash and int - -PyTypeObject rabbitizer_type_Enum_TypeObject = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "rabbitizer.Enum", - .tp_doc = PyDoc_STR("Enum"), - .tp_basicsize = sizeof(PyRabbitizerEnum), - .tp_itemsize = 0, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_new = rabbitizer_type_Enum_new, - .tp_init = (initproc) rabbitizer_type_Enum_init, - .tp_dealloc = (destructor) rabbitizer_type_Enum_dealloc, - .tp_hash = (hashfunc) rabbitizer_type_Enum_hash, - .tp_richcompare = (richcmpfunc) rabbitizer_type_Enum_richcompare, - .tp_repr = (reprfunc) rabbitizer_type_Enum_repr, - .tp_str = (reprfunc) rabbitizer_type_Enum_str, - //.tp_members = rabbitizer_type_Enum_members, - .tp_methods = rabbitizer_type_Enum_methods, - .tp_getset = rabbitizer_type_Enum_getsetters, -}; diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprN32.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprN32.c deleted file mode 100644 index 6027d78f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprN32.c +++ /dev/null @@ -1,28 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "enums/enums_utils.h" -#include "instructions/RabbitizerRegister.h" - - -#define RABBITIZER_DEF_REG(prefix, name, numeric) \ - { "RegGprN32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL } - -#define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric) \ - { "RegGprN32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL } - -RabbitizerEnumMetadata rabbitizer_enum_RegGprN32_enumvalues[] = { - #include "instructions/registers/RabbitizerRegister_GprN32.inc" - - { 0 }, -}; - -#undef RABBITIZER_DEF_REG -#undef RABBITIZER_DEF_REG_NODOLLAR - - -static PyMethodDef rabbitizer_enum_RegGprN32_methods[] = { - { 0 }, -}; - -DEF_ENUM(RegGprN32, "") diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprO32.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprO32.c deleted file mode 100644 index 50cdabe7..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprO32.c +++ /dev/null @@ -1,28 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "enums/enums_utils.h" -#include "instructions/RabbitizerRegister.h" - - -#define RABBITIZER_DEF_REG(prefix, name, numeric) \ - { "RegGprO32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL } - -#define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric) \ - { "RegGprO32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL } - -RabbitizerEnumMetadata rabbitizer_enum_RegGprO32_enumvalues[] = { - #include "instructions/registers/RabbitizerRegister_GprO32.inc" - - { 0 }, -}; - -#undef RABBITIZER_DEF_REG -#undef RABBITIZER_DEF_REG_NODOLLAR - - -static PyMethodDef rabbitizer_enum_RegGprO32_methods[] = { - { 0 }, -}; - -DEF_ENUM(RegGprO32, "") diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/py.typed b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer.pyi deleted file mode 100644 index 0ff63fac..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer.pyi +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .Enum import Enum -from .InstrCategory import InstrCategory - - -class Instruction: - rs: Enum - """The value of the `rs` register for this instruction. - The type of this attribute will be either a `RegGprO32` or a `RegGprN32` depending on the current `config.regNames_gprAbiNames` value. - If the current instruction does not use the `rs` register, then a Runtime exception will be raised. - Read-only.""" - rt: Enum - """The value of the `rt` register for this instruction. - The type of this attribute will be either a `RegGprO32` or a `RegGprN32` depending on the current `config.regNames_gprAbiNames` value. - If the current instruction does not use the `rt` register, then a Runtime exception will be raised. - Read-only.""" - rd: Enum - """The value of the `rd` register for this instruction. - The type of this attribute will be either a `RegGprO32` or a `RegGprN32` depending on the current `config.regNames_gprAbiNames` value. - If the current instruction does not use the `rd` register, then a Runtime exception will be raised. - Read-only.""" - sa: int - """The value of the `sa` field for this instruction. - If the current instruction does not have a `sa` field, then a Runtime exception will be raised. - Read-only.""" - - uniqueId: Enum - """An unique identificator for the opcode of this instruction. - The type is an `InstrId` enum. - Read-only.""" - - vram: int = 0 - """The vram (virtual ram) address for this instruction""" - inHandwrittenFunction: bool = False - """Boolean value indicating if the current instruction is used on a handwritten function. This is intended to be determined by the user.""" - - - def __init__(self, word: int, vram: int=0, category: Enum=InstrCategory.CPU) -> None: ... - - def getRaw(self) -> int: ... - def getImmediate(self) -> int: ... - def getProcessedImmediate(self) -> int: ... - def getInstrIndexAsVram(self) -> int: ... - def getBranchOffset(self) -> int: ... - def getGenericBranchOffset(self, currentVram: int) -> int: ... - def getOpcodeName(self) -> str: ... - - def blankOut(self) -> None: ... - - def isImplemented(self) -> bool: ... - def isLikelyHandwritten(self) -> bool: ... - def isNop(self) -> bool: ... - def isUnconditionalBranch(self) -> bool: ... - def isJrRa(self) -> bool: ... - def isJrNotRa(self) -> bool: ... - def hasDelaySlot(self) -> bool: ... - def mapInstrToType(self) -> str|None: ... - - def sameOpcode(self, other: Instruction) -> bool: ... - def sameOpcodeButDifferentArguments(self, other: Instruction) -> bool: ... - - def isValid(self) -> bool: ... - - def isUnknownType(self) -> bool: ... - def isJType(self) -> bool: ... - def isIType(self) -> bool: ... - def isRType(self) -> bool: ... - def isRegimmType(self) -> bool: ... - def isBranch(self) -> bool: ... - def isBranchLikely(self) -> bool: ... - def isJump(self) -> bool: ... - def isTrap(self) -> bool: ... - def isFloat(self) -> bool: ... - def isDouble(self) -> bool: ... - def isUnsigned(self) -> bool: ... - def modifiesRt(self) -> bool: ... - def modifiesRd(self) -> bool: ... - def notEmitedByCompilers(self) -> bool: ... - def canBeHi(self) -> bool: ... - def canBeLo(self) -> bool: ... - def doesLink(self) -> bool: ... - def doesDereference(self) -> bool: ... - def doesLoad(self) -> bool: ... - def doesStore(self) -> bool: ... - def maybeIsMove(self) -> bool: ... - def isPseudo(self) -> bool: ... - - def disassemble(self, immOverride: str|None=None, extraLJust: int=0) -> str: ... - - def __reduce__(self) -> tuple: ... - - def __repr__(self) -> str: ... - def __str__(self) -> str: ... diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_global_config.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_global_config.c deleted file mode 100644 index d02fce37..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_global_config.c +++ /dev/null @@ -1,165 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/** - * Wrapper to expose rabbitizer's global configuration - */ - -#include "rabbitizer_module.h" -#include "common/RabbitizerConfig.h" -#include "common/Utils.h" - - -#define DEF_MEMBER_GET_BOOL(category, name) \ - static PyObject *rabbitizer_global_config_get_##category##_##name(UNUSED PyObject *self, UNUSED PyObject *closure) { \ - if (RabbitizerConfig_Cfg.category.name) { \ - Py_RETURN_TRUE; \ - } \ - Py_RETURN_FALSE; \ - } -#define DEF_MEMBER_SET_BOOL(category, name) \ - static int rabbitizer_global_config_set_##category##_##name(UNUSED PyObject *self, PyObject *value, UNUSED void *closure) { \ - if (value == NULL) { \ - PyErr_SetString(PyExc_TypeError, "Cannot delete '" #category "." #name "' attribute"); \ - return -1; \ - } \ - RabbitizerConfig_Cfg.category.name = PyObject_IsTrue(value); \ - return 0; \ - } - -#define DEF_MEMBER_GET_SET_BOOL(category, name) \ - DEF_MEMBER_GET_BOOL(category, name) \ - DEF_MEMBER_SET_BOOL(category, name) - - -#define DEF_MEMBER_GET_INT(category, name) \ - static PyObject *rabbitizer_global_config_get_##category##_##name(UNUSED PyObject *self, UNUSED PyObject *closure) { \ - return PyLong_FromLong(RabbitizerConfig_Cfg.category.name); \ - } -#define DEF_MEMBER_SET_INT(category, name, rangeCheck, minVal, maxVal) \ - static int rabbitizer_global_config_set_##category##_##name(UNUSED PyObject *self, PyObject *value, UNUSED void *closure) { \ - long val; \ - if (value == NULL) { \ - PyErr_SetString(PyExc_TypeError, "Cannot delete '" #category "_" #name "' attribute"); \ - return -1; \ - } \ - val = PyLong_AsLong(value); \ - if (val == -1) { \ - PyObject *err = PyErr_Occurred(); \ - if (err != NULL) { \ - return -1; \ - } \ - } \ - if (rangeCheck && (val < minVal || val > maxVal)) { \ - PyErr_SetString(PyExc_ValueError, "Invalid value for '" #category "_" #name "' attribute"); \ - return -1; \ - } \ - RabbitizerConfig_Cfg.category.name = val;\ - return 0; \ - } - -#define DEF_MEMBER_GET_SET_INT(category, name, rangeCheck, minVal, maxVal) \ - DEF_MEMBER_GET_INT(category, name) \ - DEF_MEMBER_SET_INT(category, name, rangeCheck, minVal, maxVal) - -#define DEF_MEMBER_GET_ABI(category, name) \ - static PyObject *rabbitizer_global_config_get_##category##_##name(UNUSED PyObject *self, UNUSED PyObject *ignored) { \ - PyObject *enumInstance = rabbitizer_enum_Abi_enumvalues[RabbitizerConfig_Cfg.category.name].instance; \ - if (enumInstance == NULL) { \ - PyErr_SetString(PyExc_RuntimeError, "Internal error: invalid enum value for '" #category "_" #name "'"); \ - return NULL; \ - } \ - Py_INCREF(enumInstance); \ - return enumInstance; \ - } -#define DEF_MEMBER_SET_ABI(category, name) \ - static int rabbitizer_global_config_set_##category##_##name(UNUSED PyObject *self, PyObject *value, UNUSED void *closure) { \ - int enumCheck; \ - if (value == NULL) { \ - PyErr_SetString(PyExc_TypeError, "Cannot delete '" #category "_" #name "' attribute"); \ - return -1; \ - } \ - enumCheck = rabbitizer_enum_Abi_Check(value); \ - if (enumCheck <= 0) { \ - if (enumCheck == 0) { \ - PyErr_SetString(PyExc_ValueError, "Invalid value for '" #category "_" #name "' attribute"); \ - } \ - return -1; \ - } \ - RabbitizerConfig_Cfg.category.name = ((PyRabbitizerEnum*)value)->value; \ - return 0; \ - } - -#define DEF_MEMBER_GET_SET_ABI(category, name) \ - DEF_MEMBER_GET_ABI(category, name) \ - DEF_MEMBER_SET_ABI(category, name) - - -#define MEMBER_GET(category, name, docs, closure) { #category "_" #name, (getter) rabbitizer_global_config_get_##category##_##name, (setter) NULL, PyDoc_STR(docs), closure } -#define MEMBER_SET(category, name, docs, closure) { #category "_" #name, (getter) NULL, (setter) rabbitizer_global_config_set_##category##_##name, PyDoc_STR(docs), closure } -#define MEMBER_GET_SET(category, name, docs, closure) { #category "_" #name, (getter) rabbitizer_global_config_get_##category##_##name, (setter) rabbitizer_global_config_set_##category##_##name, PyDoc_STR(docs), closure } - - -DEF_MEMBER_GET_SET_BOOL(regNames, namedRegisters) -DEF_MEMBER_GET_SET_ABI(regNames, gprAbiNames) -DEF_MEMBER_GET_SET_ABI(regNames, fprAbiNames) -DEF_MEMBER_GET_SET_BOOL(regNames, userFpcCsr) -DEF_MEMBER_GET_SET_BOOL(regNames, vr4300Cop0NamedRegisters) -DEF_MEMBER_GET_SET_BOOL(regNames, vr4300RspCop0NamedRegisters) - -DEF_MEMBER_GET_SET_BOOL(pseudos, enablePseudos) -DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoBeqz) -DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoBnez) -DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoB) -DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoMove) -DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoNot) -DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoNegu) -DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoBal) - -DEF_MEMBER_GET_SET_BOOL(toolchainTweaks, treatJAsUnconditionalBranch) -DEF_MEMBER_GET_SET_BOOL(toolchainTweaks, sn64DivFix) - -DEF_MEMBER_GET_SET_INT(misc, opcodeLJust, false, 0, 0) -DEF_MEMBER_GET_SET_BOOL(misc, unknownInstrComment) -DEF_MEMBER_GET_SET_BOOL(misc, omit0XOnSmallImm) -DEF_MEMBER_GET_SET_BOOL(misc, upperCaseImm) - - -static PyGetSetDef rabbitizer_global_config_GetSets[] = { - MEMBER_GET_SET(regNames, namedRegisters, "", NULL), - MEMBER_GET_SET(regNames, gprAbiNames, "", NULL), - MEMBER_GET_SET(regNames, fprAbiNames, "", NULL), - MEMBER_GET_SET(regNames, userFpcCsr, "", NULL), - MEMBER_GET_SET(regNames, vr4300Cop0NamedRegisters, "", NULL), - MEMBER_GET_SET(regNames, vr4300RspCop0NamedRegisters, "", NULL), - - MEMBER_GET_SET(pseudos, enablePseudos, "", NULL), - MEMBER_GET_SET(pseudos, pseudoBeqz, "", NULL), - MEMBER_GET_SET(pseudos, pseudoBnez, "", NULL), - MEMBER_GET_SET(pseudos, pseudoB, "", NULL), - MEMBER_GET_SET(pseudos, pseudoMove, "", NULL), - MEMBER_GET_SET(pseudos, pseudoNot, "", NULL), - MEMBER_GET_SET(pseudos, pseudoNegu, "", NULL), - MEMBER_GET_SET(pseudos, pseudoBal, "", NULL), - - MEMBER_GET_SET(toolchainTweaks, treatJAsUnconditionalBranch, "", NULL), - MEMBER_GET_SET(toolchainTweaks, sn64DivFix, "", NULL), - - MEMBER_GET_SET(misc, opcodeLJust, "", NULL), - MEMBER_GET_SET(misc, unknownInstrComment, "", NULL), - MEMBER_GET_SET(misc, omit0XOnSmallImm, "", NULL), - MEMBER_GET_SET(misc, upperCaseImm, "", NULL), - - { 0 }, -}; - -PyTypeObject rabbitizer_global_config_TypeObject = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "rabbitizer.config", - .tp_doc = PyDoc_STR(""), - .tp_basicsize = sizeof(PyObject), - .tp_itemsize = 0, - .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_new = PyType_GenericNew, - .tp_getset = rabbitizer_global_config_GetSets, -}; diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.c deleted file mode 100644 index 66dec777..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.c +++ /dev/null @@ -1,142 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "rabbitizer_module.h" - -#include - -#include "common/Utils.h" -#include "instructions/RabbitizerInstrId.h" - - -typedef enum ModuleAttributeCategory { - MODULE_ATTRIBUTE_CAT_TYPE, - MODULE_ATTRIBUTE_CAT_INIT, // submodules - MODULE_ATTRIBUTE_CAT_GLOBAL, -} ModuleAttributeCategory; - -typedef struct ModuleAttribute { - union { - PyTypeObject *type; - PyObject *(*init)(void); - PyTypeObject *global; - }; - ModuleAttributeCategory cat; - const char *name; - bool isInstanced; - PyObject *instance; -} ModuleAttributes; - -#define MODULE_ATTRIBUTE_TYPE(name) { {.type = &rabbitizer_type_##name##_TypeObject}, MODULE_ATTRIBUTE_CAT_TYPE, #name, false, NULL } -#define MODULE_ATTRIBUTE_INIT(name) { {.init = rabbitizer_submodule_##name##_Init}, MODULE_ATTRIBUTE_CAT_INIT, #name, false, NULL } -#define MODULE_ATTRIBUTE_ENUM(name) { {.init = rabbitizer_enum_##name##_Init}, MODULE_ATTRIBUTE_CAT_INIT, #name, false, NULL } -#define MODULE_ATTRIBUTE_GLOBAL(name) { {.global = &rabbitizer_global_##name##_TypeObject}, MODULE_ATTRIBUTE_CAT_GLOBAL, #name, false, NULL } - -static ModuleAttributes rabbitizer_module_attributes[] = { - MODULE_ATTRIBUTE_INIT(Utils), - MODULE_ATTRIBUTE_GLOBAL(config), - MODULE_ATTRIBUTE_TYPE(Enum), - MODULE_ATTRIBUTE_ENUM(Abi), - MODULE_ATTRIBUTE_ENUM(InstrCategory), - MODULE_ATTRIBUTE_ENUM(InstrId), - MODULE_ATTRIBUTE_ENUM(RegGprO32), - MODULE_ATTRIBUTE_ENUM(RegGprN32), - MODULE_ATTRIBUTE_TYPE(Instruction), - MODULE_ATTRIBUTE_TYPE(LoPairingInfo), - MODULE_ATTRIBUTE_TYPE(TrackedRegisterState), - MODULE_ATTRIBUTE_TYPE(RegistersTracker), -}; - -static int rabbitizer_module_attributes_Ready(void) { - // Sanity checks and PyType_Ready - for (size_t i = 0; i < ARRAY_COUNT(rabbitizer_module_attributes); i++) { - if (rabbitizer_module_attributes[i].global == NULL || rabbitizer_module_attributes[i].name == NULL) { - return -1; - } - switch (rabbitizer_module_attributes[i].cat) { - case MODULE_ATTRIBUTE_CAT_TYPE: - case MODULE_ATTRIBUTE_CAT_GLOBAL: - if (PyType_Ready(rabbitizer_module_attributes[i].type) < 0) { - return -1; - } - break; - - case MODULE_ATTRIBUTE_CAT_INIT: - break; - - default: - return -1; - } - } - - return 0; -} - -static int rabbitizer_module_attributes_Initialize(PyObject *module) { - for (size_t i = 0; i < ARRAY_COUNT(rabbitizer_module_attributes); i++) { - switch (rabbitizer_module_attributes[i].cat) { - case MODULE_ATTRIBUTE_CAT_TYPE: - rabbitizer_module_attributes[i].instance = (PyObject*) rabbitizer_module_attributes[i].type; - Py_INCREF(rabbitizer_module_attributes[i].instance); - break; - - case MODULE_ATTRIBUTE_CAT_INIT: - rabbitizer_module_attributes[i].instance = rabbitizer_module_attributes[i].init(); - if (rabbitizer_module_attributes[i].instance == NULL) { - goto error; - } - break; - - case MODULE_ATTRIBUTE_CAT_GLOBAL: - rabbitizer_module_attributes[i].instance = PyObject_CallObject((PyObject*)rabbitizer_module_attributes[i].global, NULL); - if (rabbitizer_module_attributes[i].instance == NULL) { - goto error; - } - break; - } - - rabbitizer_module_attributes[i].isInstanced = true; - if (PyModule_AddObject(module, rabbitizer_module_attributes[i].name, rabbitizer_module_attributes[i].instance) < 0) { - goto error; - } - } - - return 0; - -error: - for (size_t i = 0; i < ARRAY_COUNT(rabbitizer_module_attributes); i++) { - if (rabbitizer_module_attributes[i].isInstanced) { - Py_DECREF(rabbitizer_module_attributes[i].instance); - } - rabbitizer_module_attributes[i].isInstanced = false; - } - return -1; -} - - -static PyModuleDef rabbitizer_module = { - PyModuleDef_HEAD_INIT, - .m_name = "rabbitizer", - .m_doc = "", - .m_size = -1, -}; - -PyMODINIT_FUNC PyInit_rabbitizer(void) { - PyObject *module; - - if (rabbitizer_module_attributes_Ready() < 0) { - return NULL; - } - - module = PyModule_Create(&rabbitizer_module); - if (module == NULL) { - return NULL; - } - - if (rabbitizer_module_attributes_Initialize(module) < 0) { - Py_DECREF(module); - return NULL; - } - - return module; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.h b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.h deleted file mode 100644 index 051ea67d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.h +++ /dev/null @@ -1,54 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_MODULE_H -#define RABBITIZER_MODULE_H -#pragma once - -#define PY_SSIZE_T_CLEAN -#include -#include "structmember.h" - -#include "enums/enums_utils.h" - -#include "instructions/RabbitizerInstruction.h" -#include "analysis/RabbitizerTrackedRegisterState.h" -#include "analysis/RabbitizerLoPairingInfo.h" - -// TODO: clean up this... - - -typedef struct PyRabbitizerInstruction { - PyObject_HEAD - RabbitizerInstruction instr; -} PyRabbitizerInstruction; - -typedef struct PyRabbitizerTrackedRegisterState { - PyObject_HEAD - RabbitizerTrackedRegisterState registerState; -} PyRabbitizerTrackedRegisterState; - -typedef struct PyRabbitizerLoPairingInfo { - PyObject_HEAD - RabbitizerLoPairingInfo pairingInfo; -} PyRabbitizerLoPairingInfo; - - -PyObject *rabbitizer_submodule_Utils_Init(void); - -extern PyTypeObject rabbitizer_global_config_TypeObject; - -extern PyTypeObject rabbitizer_type_Enum_TypeObject; -extern PyTypeObject rabbitizer_type_Instruction_TypeObject; -extern PyTypeObject rabbitizer_type_LoPairingInfo_TypeObject; -extern PyTypeObject rabbitizer_type_TrackedRegisterState_TypeObject; -extern PyTypeObject rabbitizer_type_RegistersTracker_TypeObject; - -DECL_ENUM(Abi) -DECL_ENUM(InstrCategory) -DECL_ENUM(InstrId) - -DECL_ENUM(RegGprO32) -DECL_ENUM(RegGprN32) - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_submodule_Utils.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_submodule_Utils.c deleted file mode 100644 index 31b844a8..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_submodule_Utils.c +++ /dev/null @@ -1,81 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "rabbitizer_module.h" - -#include "common/Utils.h" - - -static PyObject *rabbitizer_submodule_Utils_from2Complement(UNUSED PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "number", "bits", NULL }; - uint32_t number = 0; - int bits = 0; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "Ii", kwlist, &number, &bits)) { - return NULL; - } - - return PyLong_FromLong(RabbitizerUtils_From2Complement(number, bits)); -} - -static PyObject *rabbitizer_submodule_Utils_escapeString(UNUSED PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "src", NULL }; - const char *src = NULL; - Py_ssize_t srcSize = 0; - char *dst; - size_t dstSize; - size_t wroteBytes; - PyObject *ret; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#", kwlist, &src, &srcSize)) { - return NULL; - } - - dstSize = 2 * srcSize; - dst = malloc(dstSize * sizeof(char)); - if (dst == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Internal error on 'escapeString'"); - return NULL; - } - - wroteBytes = RabbitizerUtils_escapeString(dst, dstSize, src, srcSize); - if (wroteBytes > dstSize) { - PyErr_SetString(PyExc_RuntimeError, "Internal error on 'escapeString'"); - return NULL; - } - - ret = PyUnicode_FromStringAndSize(dst, wroteBytes); - free(dst); - return ret; -} - - -#define METHOD_NO_ARGS(name, docs) { #name, (PyCFunction) rabbitizer_submodule_Utils_##name, METH_NOARGS, PyDoc_STR(docs) } -#define METHOD_ARGS(name, docs) { #name, (PyCFunction) rabbitizer_submodule_Utils_##name, METH_VARARGS | METH_KEYWORDS, PyDoc_STR(docs) } - -static PyMethodDef rabbitizer_submodule_Utils_methods[] = { - METHOD_ARGS(from2Complement, ""), - METHOD_ARGS(escapeString, ""), - - { 0 }, -}; - - -static PyModuleDef rabbitizer_submodule_Utils_module = { - PyModuleDef_HEAD_INIT, - .m_name = "rabbitizer.Utils", - .m_doc = "", - .m_size = -1, - .m_methods = rabbitizer_submodule_Utils_methods, -}; - -PyObject *rabbitizer_submodule_Utils_Init(void) { - PyObject *submodule; - - submodule = PyModule_Create(&rabbitizer_submodule_Utils_module); - if (submodule == NULL) { - return NULL; - } - - return submodule; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_Instruction.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_Instruction.c deleted file mode 100644 index 5471408d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_Instruction.c +++ /dev/null @@ -1,436 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "rabbitizer_module.h" - -#include "instructions/RabbitizerInstructionRsp.h" -#include "instructions/RabbitizerInstructionR5900.h" -#include "common/RabbitizerConfig.h" - - -static void rabbitizer_type_Instruction_dealloc(PyRabbitizerInstruction *self) { - RabbitizerInstruction_destroy(&self->instr); - Py_TYPE(self)->tp_free((PyObject *) self); -} - -static int rabbitizer_type_Instruction_init(PyRabbitizerInstruction *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "word", "vram", "category", NULL }; - uint32_t word; - uint32_t vram; - PyObject *category = NULL; - int enumCheck; - RabbitizerInstrCategory instrCategory = RABBITIZER_INSTRCAT_CPU; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "I|IO!", kwlist, &word, &vram, &rabbitizer_type_Enum_TypeObject, &category)) { - return -1; - } - - if (category != NULL) { - enumCheck = rabbitizer_enum_InstrCategory_Check(category); - - if (enumCheck <= 0) { - if (enumCheck == 0) { - PyErr_SetString(PyExc_ValueError, "Invalid value for 'category' parameter"); - } - return -1; - } - - instrCategory = ((PyRabbitizerEnum*)category)->value; - } - - switch (instrCategory) { - case RABBITIZER_INSTRCAT_RSP: - RabbitizerInstructionRsp_init(&self->instr, word, vram); - RabbitizerInstructionRsp_processUniqueId(&self->instr); - break; - - case RABBITIZER_INSTRCAT_R5900: - RabbitizerInstructionR5900_init(&self->instr, word, vram); - RabbitizerInstructionR5900_processUniqueId(&self->instr); - break; - - case RABBITIZER_INSTRCAT_CPU: - case RABBITIZER_INSTRCAT_MAX: - RabbitizerInstruction_init(&self->instr, word, vram); - RabbitizerInstruction_processUniqueId(&self->instr); - break; - } - - return 0; -} - -static PyMemberDef rabbitizer_type_Instruction_members[] = { - { "vram", T_UINT, offsetof(PyRabbitizerInstruction, instr.vram), 0, "vram description" }, - { "inHandwrittenFunction", T_BOOL, offsetof(PyRabbitizerInstruction, instr.inHandwrittenFunction), 0, "inHandwrittenFunction description" }, - - { 0 } -}; - - -#define DEF_MEMBER_GET_UINT(name) \ - static PyObject *rabbitizer_type_Instruction_member_get_##name(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { \ - return PyLong_FromUnsignedLong(RAB_INSTR_GET_##name(&self->instr)); \ - } - -#define DEF_MEMBER_GET_REGGPR(name) \ - static PyObject *rabbitizer_type_Instruction_member_get_##name(PyRabbitizerInstruction *self, UNUSED PyObject *closure) { \ - uint32_t reg; \ - PyObject *enumInstance = NULL; \ - \ - if (!RabbitizerInstruction_hasOperandAlias(&self->instr, RAB_OPERAND_cpu_##name)) { \ - PyErr_Format(PyExc_RuntimeError, "'%s' instruction does not reference register '" #name "'", RabbitizerInstrId_getOpcodeName(self->instr.uniqueId)); \ - return NULL; \ - } \ - \ - reg = RAB_INSTR_GET_##name(&self->instr); \ - switch (RabbitizerConfig_Cfg.regNames.gprAbiNames) { \ - case RABBITIZER_ABI_N32: \ - case RABBITIZER_ABI_N64: \ - enumInstance = rabbitizer_enum_RegGprN32_enumvalues[reg].instance; \ - break; \ - \ - default: \ - enumInstance = rabbitizer_enum_RegGprO32_enumvalues[reg].instance; \ - break; \ - } \ - \ - if (enumInstance == NULL) { \ - PyErr_SetString(PyExc_RuntimeError, "Internal error: invalid RegGpr enum value"); \ - return NULL; \ - } \ - \ - Py_INCREF(enumInstance); \ - return enumInstance; \ - } - -DEF_MEMBER_GET_REGGPR(rs) -DEF_MEMBER_GET_REGGPR(rt) -DEF_MEMBER_GET_REGGPR(rd) - -DEF_MEMBER_GET_UINT(sa) - -static PyObject *rabbitizer_type_Instruction_member_get_uniqueId(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { - PyObject *enumInstance = rabbitizer_enum_InstrId_enumvalues[self->instr.uniqueId].instance; - - if (enumInstance == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Internal error: invalid uniqueId enum value"); - return NULL; - } - - Py_INCREF(enumInstance); - return enumInstance; -} - -#define MEMBER_GET(name, docs, closure) { #name, (getter) rabbitizer_type_Instruction_member_get_##name, (setter) NULL, PyDoc_STR(docs), closure } -#define MEMBER_SET(name, docs, closure) { #name, (getter) NULL, (setter) rabbitizer_type_Instruction_member_set_##name, PyDoc_STR(docs), closure } -#define MEMBER_GET_SET(name, docs, closure) { #name, (getter) rabbitizer_type_Instruction_member_get_##name, (setter) rabbitizer_type_Instruction_member_set_##name, PyDoc_STR(docs), closure } - - -static PyGetSetDef rabbitizer_type_Instruction_getsetters[] = { - MEMBER_GET(rs, "", NULL), - MEMBER_GET(rt, "", NULL), - MEMBER_GET(rd, "", NULL), - MEMBER_GET(sa, "", NULL), - MEMBER_GET(uniqueId, "", NULL), - - { 0 } -}; - - -#define DEF_METHOD_GET_UINT(name) \ - static PyObject *rabbitizer_type_Instruction_##name(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { \ - return PyLong_FromUnsignedLong(RabbitizerInstruction_##name(&self->instr)); \ - } - -#define DEF_METHOD_GET_INT(name) \ - static PyObject *rabbitizer_type_Instruction_##name(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { \ - return PyLong_FromLong(RabbitizerInstruction_##name(&self->instr)); \ - } - -DEF_METHOD_GET_UINT(getRaw) -DEF_METHOD_GET_UINT(getImmediate) -DEF_METHOD_GET_INT(getProcessedImmediate) -DEF_METHOD_GET_UINT(getInstrIndexAsVram) -DEF_METHOD_GET_INT(getBranchOffset) - -static PyObject *rabbitizer_type_Instruction_getOpcodeName(PyRabbitizerInstruction *self, UNUSED PyObject *closure) { - return PyUnicode_FromString(RabbitizerInstrId_getOpcodeName(self->instr.uniqueId)); -} - -static PyObject *rabbitizer_type_Instruction_getGenericBranchOffset(PyRabbitizerInstruction *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "currentVram", NULL }; - uint32_t currentVram; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "I", kwlist, ¤tVram)) { - return NULL; - } - - return PyLong_FromLong(RabbitizerInstruction_getGenericBranchOffset(&self->instr, currentVram)); -} - -static PyObject *rabbitizer_type_Instruction_blankOut(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { - RabbitizerInstruction_blankOut(&self->instr); - Py_RETURN_NONE; -} - - -#define DEF_METHOD_BOOL(name) \ - static PyObject *rabbitizer_type_Instruction_##name(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { \ - if (RabbitizerInstruction_##name(&self->instr)) { \ - Py_RETURN_TRUE; \ - } \ - Py_RETURN_FALSE; \ - } - -DEF_METHOD_BOOL(isImplemented) -DEF_METHOD_BOOL(isLikelyHandwritten) -DEF_METHOD_BOOL(isNop) -DEF_METHOD_BOOL(isUnconditionalBranch) -DEF_METHOD_BOOL(isJrRa) -DEF_METHOD_BOOL(isJrNotRa) -DEF_METHOD_BOOL(hasDelaySlot) - -static PyObject *rabbitizer_type_Instruction_mapInstrToType(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { - const char *type = RabbitizerInstruction_mapInstrToType(&self->instr); - - if (type != NULL) { - return PyUnicode_FromString(type); - } - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_Instruction_sameOpcode(PyRabbitizerInstruction *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "other", NULL }; - PyRabbitizerInstruction *other; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &other)) { - return NULL; - } - - if (RabbitizerInstruction_sameOpcode(&self->instr, &other->instr)) { - Py_RETURN_TRUE; - } - Py_RETURN_FALSE; -} - -static PyObject *rabbitizer_type_Instruction_sameOpcodeButDifferentArguments(PyRabbitizerInstruction *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "other", NULL }; - PyRabbitizerInstruction *other; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &other)) { - return NULL; - } - - if (RabbitizerInstruction_sameOpcodeButDifferentArguments(&self->instr, &other->instr)) { - Py_RETURN_TRUE; - } - Py_RETURN_FALSE; -} - -DEF_METHOD_BOOL(isValid) - -#define DEF_DESCRIPTOR_METHOD_BOOL(name) \ - static PyObject *rabbitizer_type_Instruction_##name(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { \ - if (RabbitizerInstrDescriptor_##name(self->instr.descriptor)) { \ - Py_RETURN_TRUE; \ - } \ - Py_RETURN_FALSE; \ - } - -DEF_DESCRIPTOR_METHOD_BOOL(isUnknownType) -DEF_DESCRIPTOR_METHOD_BOOL(isJType) -DEF_DESCRIPTOR_METHOD_BOOL(isIType) -DEF_DESCRIPTOR_METHOD_BOOL(isRType) -DEF_DESCRIPTOR_METHOD_BOOL(isRegimmType) -DEF_DESCRIPTOR_METHOD_BOOL(isBranch) -DEF_DESCRIPTOR_METHOD_BOOL(isBranchLikely) -DEF_DESCRIPTOR_METHOD_BOOL(isJump) -DEF_DESCRIPTOR_METHOD_BOOL(isTrap) -DEF_DESCRIPTOR_METHOD_BOOL(isFloat) -DEF_DESCRIPTOR_METHOD_BOOL(isDouble) -DEF_DESCRIPTOR_METHOD_BOOL(isUnsigned) -DEF_DESCRIPTOR_METHOD_BOOL(modifiesRt) -DEF_DESCRIPTOR_METHOD_BOOL(modifiesRd) -DEF_DESCRIPTOR_METHOD_BOOL(notEmitedByCompilers) -DEF_DESCRIPTOR_METHOD_BOOL(canBeHi) -DEF_DESCRIPTOR_METHOD_BOOL(canBeLo) -DEF_DESCRIPTOR_METHOD_BOOL(doesLink) -DEF_DESCRIPTOR_METHOD_BOOL(doesDereference) -DEF_DESCRIPTOR_METHOD_BOOL(doesLoad) -DEF_DESCRIPTOR_METHOD_BOOL(doesStore) -DEF_DESCRIPTOR_METHOD_BOOL(maybeIsMove) -DEF_DESCRIPTOR_METHOD_BOOL(isPseudo) -// TODO: create an enum type for architectureVersion -// architectureVersion - - -static PyObject *rabbitizer_type_Instruction_disassemble(PyRabbitizerInstruction *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"immOverride", "extraLJust", NULL}; - const char *immOverride = NULL; - size_t immOverrideLength = 0; - int extraLJust = 0; - size_t bufferSize; - char *buffer; - PyObject *ret; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|zi", kwlist, &immOverride, &extraLJust)) { - return NULL; - } - - if (immOverride != NULL) { - immOverrideLength = strlen(immOverride); - } - - bufferSize = RabbitizerInstruction_getSizeForBuffer(&self->instr, immOverrideLength, extraLJust); - - buffer = malloc(bufferSize+1); - if (buffer == NULL) { - // TODO: signal an exception? - return NULL; - } - - RabbitizerInstruction_disassemble(&self->instr, buffer, immOverride, immOverrideLength, extraLJust); - - ret = PyUnicode_FromString(buffer); - free(buffer); - return ret; -} - - -// To allow piclking the object -static PyObject *rabbitizer_type_Instruction___reduce__(PyRabbitizerInstruction *self, UNUSED PyObject *closure) { - PyObject *args; - PyObject *word; - PyObject *vram; - PyObject *category; - - word = PyLong_FromUnsignedLong(RabbitizerInstruction_getRaw(&self->instr)); - vram = PyLong_FromUnsignedLong(self->instr.vram); - category = rabbitizer_enum_InstrCategory_enumvalues[self->instr.category].instance; - - args = PyTuple_Pack(3, word, vram, category); - - return PyTuple_Pack(2, (PyObject*)&rabbitizer_type_Instruction_TypeObject, args); -} - - -#define METHOD_NO_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_Instruction_##name, METH_NOARGS, PyDoc_STR(docs) } -#define METHOD_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_Instruction_##name, METH_VARARGS | METH_KEYWORDS, PyDoc_STR(docs) } - - -static PyMethodDef rabbitizer_type_Instruction_methods[] = { - METHOD_NO_ARGS(getRaw, ""), - METHOD_NO_ARGS(getImmediate, ""), - METHOD_NO_ARGS(getProcessedImmediate, ""), - METHOD_NO_ARGS(getInstrIndexAsVram, ""), - METHOD_NO_ARGS(getBranchOffset, ""), - METHOD_ARGS(getGenericBranchOffset, ""), - METHOD_NO_ARGS(getOpcodeName, ""), - - METHOD_NO_ARGS(blankOut, ""), - - METHOD_NO_ARGS(isImplemented, ""), - METHOD_NO_ARGS(isLikelyHandwritten, ""), - METHOD_NO_ARGS(isNop, ""), - METHOD_NO_ARGS(isUnconditionalBranch, ""), - METHOD_NO_ARGS(isJrRa, ""), - METHOD_NO_ARGS(isJrNotRa, ""), - METHOD_NO_ARGS(hasDelaySlot, ""), - METHOD_NO_ARGS(mapInstrToType, ""), - - METHOD_ARGS(sameOpcode, "description"), - METHOD_ARGS(sameOpcodeButDifferentArguments, "description"), - - METHOD_NO_ARGS(isValid, ""), - - METHOD_NO_ARGS(isUnknownType, ""), - METHOD_NO_ARGS(isJType, ""), - METHOD_NO_ARGS(isIType, ""), - METHOD_NO_ARGS(isRType, ""), - METHOD_NO_ARGS(isRegimmType, ""), - METHOD_NO_ARGS(isBranch, ""), - METHOD_NO_ARGS(isBranchLikely, ""), - METHOD_NO_ARGS(isJump, ""), - METHOD_NO_ARGS(isTrap, ""), - METHOD_NO_ARGS(isFloat, ""), - METHOD_NO_ARGS(isDouble, ""), - METHOD_NO_ARGS(isUnsigned, ""), - METHOD_NO_ARGS(modifiesRt, ""), - METHOD_NO_ARGS(modifiesRd, ""), - METHOD_NO_ARGS(notEmitedByCompilers, ""), - METHOD_NO_ARGS(canBeHi, ""), - METHOD_NO_ARGS(canBeLo, ""), - METHOD_NO_ARGS(doesLink, ""), - METHOD_NO_ARGS(doesDereference, ""), - METHOD_NO_ARGS(doesLoad, ""), - METHOD_NO_ARGS(doesStore, ""), - METHOD_NO_ARGS(maybeIsMove, ""), - METHOD_NO_ARGS(isPseudo, ""), - // METHOD_NO_ARGS(getArchitectureVersion, ""), - - METHOD_ARGS(disassemble, "description"), - - METHOD_ARGS(__reduce__, ""), - - { 0 }, -}; - - -static PyObject *rabbitizer_type_Instruction_repr(PyRabbitizerInstruction *self) { - PyObject *ret; - size_t disasmBufferSize; - char *bufferStart; - char *buffer; - size_t typeNameLength; - size_t extraSize = 3 + 8 + 4; // "(0x" + 32bits hex + ") # " - int len; - - typeNameLength = strlen("rabbitizer.Instruction"); - - disasmBufferSize = RabbitizerInstruction_getSizeForBuffer(&self->instr, 0, 0); - - buffer = bufferStart = malloc(disasmBufferSize+1 + typeNameLength + extraSize); - if (buffer == NULL) { - // TODO: signal an exception? - return NULL; - } - - memcpy(buffer, "rabbitizer.Instruction", typeNameLength); - buffer += typeNameLength; - - len = sprintf(buffer, "(0x%08X) # ", RabbitizerInstruction_getRaw(&self->instr)); - if (len != 15) { - // bad stuff - // TODO: exception? - } - assert(len == 15); - buffer += len; - - RabbitizerInstruction_disassemble(&self->instr, buffer, NULL, 0, 0); - - ret = PyUnicode_FromString(bufferStart); - free(bufferStart); - return ret; -} - -static PyObject *rabbitizer_type_Instruction_str(PyRabbitizerInstruction *self) { - return rabbitizer_type_Instruction_disassemble(self, Py_BuildValue("()"), Py_BuildValue("{}")); -} - - -PyTypeObject rabbitizer_type_Instruction_TypeObject = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "rabbitizer.Instruction", - .tp_doc = PyDoc_STR("Instruction"), - .tp_basicsize = sizeof(PyRabbitizerInstruction), - .tp_itemsize = 0, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_new = PyType_GenericNew, - .tp_init = (initproc) rabbitizer_type_Instruction_init, - .tp_dealloc = (destructor) rabbitizer_type_Instruction_dealloc, - .tp_repr = (reprfunc) rabbitizer_type_Instruction_repr, - .tp_str = (reprfunc) rabbitizer_type_Instruction_str, - .tp_members = rabbitizer_type_Instruction_members, - .tp_methods = rabbitizer_type_Instruction_methods, - .tp_getset = rabbitizer_type_Instruction_getsetters, -}; diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_LoPairingInfo.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_LoPairingInfo.c deleted file mode 100644 index 5a9c62cf..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_LoPairingInfo.c +++ /dev/null @@ -1,50 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "rabbitizer_module.h" - - -static void rabbitizer_type_LoPairingInfo_dealloc(PyRabbitizerLoPairingInfo *self) { - Py_TYPE(self)->tp_free((PyObject *) self); -} - -static int rabbitizer_type_LoPairingInfo_init(PyRabbitizerLoPairingInfo *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "", kwlist)) { - return -1; - } - - RabbitizerLoPairingInfo_Init(&self->pairingInfo); - - return 0; -} - - -static PyMemberDef rabbitizer_type_LoPairingInfo_members[] = { - { "instrOffset", T_INT, offsetof(PyRabbitizerLoPairingInfo, pairingInfo.instrOffset), 0, "" }, - { "value", T_LONG, offsetof(PyRabbitizerLoPairingInfo, pairingInfo.value), 0, "" }, - { "shouldProcess", T_BOOL, offsetof(PyRabbitizerLoPairingInfo, pairingInfo.shouldProcess), 0, "" }, - { "isGpRel", T_BOOL, offsetof(PyRabbitizerLoPairingInfo, pairingInfo.isGpRel), 0, "" }, - { "isGpGot", T_BOOL, offsetof(PyRabbitizerLoPairingInfo, pairingInfo.isGpGot), 0, "" }, - - { 0 } -}; - - -PyTypeObject rabbitizer_type_LoPairingInfo_TypeObject = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "rabbitizer.LoPairingInfo", - .tp_doc = PyDoc_STR("LoPairingInfo"), - .tp_basicsize = sizeof(PyRabbitizerLoPairingInfo), - .tp_itemsize = 0, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_new = PyType_GenericNew, - .tp_init = (initproc) rabbitizer_type_LoPairingInfo_init, - .tp_dealloc = (destructor) rabbitizer_type_LoPairingInfo_dealloc, - // .tp_repr = (reprfunc) rabbitizer_type_LoPairingInfo_repr, - // .tp_str = (reprfunc) rabbitizer_type_LoPairingInfo_str, - .tp_members = rabbitizer_type_LoPairingInfo_members, - // .tp_methods = rabbitizer_type_Instr_methods, - // .tp_getset = Instr_getsetters, -}; diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_RegistersTracker.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_RegistersTracker.c deleted file mode 100644 index ec8f3642..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_RegistersTracker.c +++ /dev/null @@ -1,320 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "rabbitizer_module.h" - -#include "analysis/RabbitizerRegistersTracker.h" - - -typedef struct PyRabbitizerRegistersTracker { - PyObject_HEAD - RabbitizerRegistersTracker tracker; -} PyRabbitizerRegistersTracker; - - -static void rabbitizer_type_RegistersTracker_dealloc(PyRabbitizerRegistersTracker *self) { - RabbitizerRegistersTracker_destroy(&self->tracker); - Py_TYPE(self)->tp_free((PyObject *) self); -} - -static int rabbitizer_type_RegistersTracker_init(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "other", NULL }; - PyRabbitizerRegistersTracker *pyOther = NULL; - RabbitizerRegistersTracker *other = NULL; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O!", kwlist, &rabbitizer_type_RegistersTracker_TypeObject, &pyOther)) { - return -1; - } - - if (pyOther != NULL) { - other = &pyOther->tracker; - } - - RabbitizerRegistersTracker_init(&self->tracker, other); - - return 0; -} - - -static PyObject *rabbitizer_type_RegistersTracker_moveRegisters(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", NULL }; - PyRabbitizerInstruction *instr; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr)) { - return NULL; - } - - if (RabbitizerRegistersTracker_moveRegisters(&self->tracker, &instr->instr)) { - Py_RETURN_TRUE; - } - Py_RETURN_FALSE; -} - -static PyObject *rabbitizer_type_RegistersTracker_overwriteRegisters(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "instrOffset", NULL }; - PyRabbitizerInstruction *instr; - int instrOffset; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &instrOffset)) { - return NULL; - } - - RabbitizerRegistersTracker_overwriteRegisters(&self->tracker, &instr->instr, instrOffset); - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_unsetRegistersAfterFuncCall(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "prevInstr", NULL }; - PyRabbitizerInstruction *instr; - PyRabbitizerInstruction *prevInstr; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &rabbitizer_type_Instruction_TypeObject, &prevInstr)) { - return NULL; - } - - RabbitizerRegistersTracker_unsetRegistersAfterFuncCall(&self->tracker, &instr->instr, &prevInstr->instr); - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_getAddressIfCanSetType(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "instrOffset", NULL }; - PyRabbitizerInstruction *instr; - int instrOffset; - uint32_t dstAddress = 0; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &instrOffset)) { - return NULL; - } - - if (RabbitizerRegistersTracker_getAddressIfCanSetType(&self->tracker, &instr->instr, instrOffset, &dstAddress)) { - return PyLong_FromLong(dstAddress); - } - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_getJrInfo(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", NULL }; - PyRabbitizerInstruction *instr; - int dstOffset = 0; - uint32_t dstAddress = 0; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr)) { - return NULL; - } - - if (RabbitizerRegistersTracker_getJrInfo(&self->tracker, &instr->instr, &dstOffset, &dstAddress)) { - return PyTuple_Pack(2, PyLong_FromLong(dstOffset), PyLong_FromLong(dstAddress)); - } - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_processLui(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "instrOffset", "prevInstr", NULL }; - PyRabbitizerInstruction *instr; - int instrOffset; - PyRabbitizerInstruction *pyPrevInstr = NULL; - RabbitizerInstruction *prevInstr = NULL; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i|O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &instrOffset, &rabbitizer_type_Instruction_TypeObject, &pyPrevInstr)) { - return NULL; - } - - if (pyPrevInstr != NULL) { - prevInstr = &pyPrevInstr->instr; - } - - RabbitizerRegistersTracker_processLui(&self->tracker, &instr->instr, instrOffset, prevInstr); - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_processGpLoad(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "instrOffset", NULL }; - PyRabbitizerInstruction *instr; - int instrOffset; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &instrOffset)) { - return NULL; - } - - RabbitizerRegistersTracker_processGpLoad(&self->tracker, &instr->instr, instrOffset); - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_getLuiOffsetForConstant(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", NULL }; - PyRabbitizerInstruction *instr; - int dstOffset = 0; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr)) { - return NULL; - } - - if (RabbitizerRegistersTracker_getLuiOffsetForConstant(&self->tracker, &instr->instr, &dstOffset)) { - return PyLong_FromLong(dstOffset); - } - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_processConstant(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "value", "instrOffset", NULL }; - PyRabbitizerInstruction *instr; - uint32_t value; - int instrOffset; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!Ii", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &value, &instrOffset)) { - return NULL; - } - - RabbitizerRegistersTracker_processConstant(&self->tracker, &instr->instr, value, instrOffset); - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_getLuiOffsetForLo(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "instrOffset", NULL }; - PyRabbitizerInstruction *instr; - int instrOffset; - int dstOffset = 0; - bool dstIsGp = false; - bool validResults = false; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &instrOffset)) { - return NULL; - } - - validResults = RabbitizerRegistersTracker_getLuiOffsetForLo(&self->tracker, &instr->instr, instrOffset, &dstOffset, &dstIsGp); - - return PyTuple_Pack(3, PyLong_FromLong(dstOffset), PyBool_FromLong(dstIsGp), PyBool_FromLong(validResults)); -} - -static PyObject *rabbitizer_type_RegistersTracker_preprocessLoAndGetInfo(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "instrOffset", NULL }; - PyRabbitizerInstruction *instr; - int instrOffset; - PyRabbitizerLoPairingInfo *ret; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &instrOffset)) { - return NULL; - } - - ret = PyObject_CallObject((PyObject*)&rabbitizer_type_LoPairingInfo_TypeObject, NULL); - if (ret == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Internal error: not able to instance LoPairingInfo object"); - return NULL; - } - - ret->pairingInfo = RabbitizerRegistersTracker_preprocessLoAndGetInfo(&self->tracker, &instr->instr, instrOffset); - - return ret; -} - -static PyObject *rabbitizer_type_RegistersTracker_processLo(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "value", "instrOffset", NULL }; - PyRabbitizerInstruction *instr; - uint32_t value; - int instrOffset; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!Ii", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &value, &instrOffset)) { - return NULL; - } - - RabbitizerRegistersTracker_processLo(&self->tracker, &instr->instr, value, instrOffset); - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_hasLoButNoHi(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", NULL }; - PyRabbitizerInstruction *instr; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr)) { - return NULL; - } - - if (RabbitizerRegistersTracker_hasLoButNoHi(&self->tracker, &instr->instr)) { - Py_RETURN_TRUE; - } - Py_RETURN_FALSE; -} - - -#define METHOD_NO_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_RegistersTracker_##name, METH_NOARGS, PyDoc_STR(docs) } -#define METHOD_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_RegistersTracker_##name, METH_VARARGS | METH_KEYWORDS, PyDoc_STR(docs) } - -static PyMethodDef rabbitizer_type_RegistersTracker_methods[] = { - METHOD_ARGS(moveRegisters, ""), - METHOD_ARGS(overwriteRegisters, ""), - METHOD_ARGS(unsetRegistersAfterFuncCall, ""), - METHOD_ARGS(getAddressIfCanSetType, ""), - METHOD_ARGS(getJrInfo, ""), - METHOD_ARGS(processLui, ""), - METHOD_ARGS(processGpLoad, ""), - METHOD_ARGS(getLuiOffsetForConstant, ""), - METHOD_ARGS(processConstant, ""), - METHOD_ARGS(getLuiOffsetForLo, ""), - METHOD_ARGS(preprocessLoAndGetInfo, ""), - METHOD_ARGS(processLo, ""), - METHOD_ARGS(hasLoButNoHi, ""), - - { 0 }, -}; - - -PyObject *rabbitizer_type_RegistersTracker___getitem__(PyRabbitizerRegistersTracker* self, Py_ssize_t index) { - RabbitizerTrackedRegisterState *state; - PyObject *args; - PyRabbitizerTrackedRegisterState *pyState; - - if (index < 0 || index >= ARRAY_COUNT(self->tracker.registers)) { - PyErr_SetString(PyExc_IndexError, "Index must be a value between 0 and 31"); - return NULL; - } - - state = &self->tracker.registers[index]; - - args = Py_BuildValue("(i)", state->registerNum); - if (args == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Internal error: not able to instance TrackedRegisterState parameters"); - return NULL; - } - - pyState = PyObject_CallObject((PyObject*)&rabbitizer_type_TrackedRegisterState_TypeObject, args); - Py_DECREF(args); - if (pyState == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Internal error: not able to instance TrackedRegisterState object"); - return NULL; - } - - RabbitizerTrackedRegisterState_copyState(&pyState->registerState, state); - return pyState; -} - - -static PySequenceMethods example_classSeqMethods = { - .sq_item = (ssizeargfunc)rabbitizer_type_RegistersTracker___getitem__, // sq_item -}; - - -PyTypeObject rabbitizer_type_RegistersTracker_TypeObject = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "rabbitizer.RegistersTracker", - .tp_doc = PyDoc_STR("RegistersTracker"), - .tp_basicsize = sizeof(PyRabbitizerRegistersTracker), - .tp_itemsize = 0, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_new = PyType_GenericNew, - .tp_init = (initproc) rabbitizer_type_RegistersTracker_init, - .tp_dealloc = (destructor) rabbitizer_type_RegistersTracker_dealloc, - // .tp_repr = (reprfunc) rabbitizer_type_RegistersTracker_repr, - .tp_as_sequence = &example_classSeqMethods, - // .tp_str = (reprfunc) rabbitizer_type_RegistersTracker_str, - .tp_methods = rabbitizer_type_RegistersTracker_methods, - // .tp_getset = rabbitizer_type_RegistersTracker_getsetters, -}; diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_TrackedRegisterState.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_TrackedRegisterState.c deleted file mode 100644 index 1f52e4d0..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_TrackedRegisterState.c +++ /dev/null @@ -1,102 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "rabbitizer_module.h" - - -static void rabbitizer_type_TrackedRegisterState_dealloc(PyRabbitizerTrackedRegisterState *self) { - RabbitizerTrackedRegisterState_destroy(&self->registerState); - Py_TYPE(self)->tp_free((PyObject *) self); -} - -static int rabbitizer_type_TrackedRegisterState_init(PyRabbitizerTrackedRegisterState *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "registerNum", NULL }; - int registerNum; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, ®isterNum)) { - return -1; - } - - RabbitizerTrackedRegisterState_init(&self->registerState, registerNum); - - return 0; -} - - -#define DEF_MEMBER_GET_BOOL(name) \ - static PyObject *rabbitizer_type_TrackedRegisterState_member_get_##name(PyRabbitizerTrackedRegisterState *self, UNUSED PyObject *closure) { \ - if (self->registerState.name) { \ - Py_RETURN_TRUE; \ - } \ - Py_RETURN_FALSE; \ - } - -#define DEF_MEMBER_GET_INT(name) \ - static PyObject *rabbitizer_type_TrackedRegisterState_member_get_##name(PyRabbitizerTrackedRegisterState *self, UNUSED PyObject *closure) { \ - return PyLong_FromLong(self->registerState.name); \ - } - -#define DEF_MEMBER_GET_UINT(name) \ - static PyObject *rabbitizer_type_TrackedRegisterState_member_get_##name(PyRabbitizerTrackedRegisterState *self, UNUSED PyObject *closure) { \ - return PyLong_FromUnsignedLong(self->registerState.name); \ - } - - -DEF_MEMBER_GET_INT(registerNum) - -DEF_MEMBER_GET_BOOL(hasLuiValue) -DEF_MEMBER_GET_INT(luiOffset) -DEF_MEMBER_GET_BOOL(luiSetOnBranchLikely) - -DEF_MEMBER_GET_BOOL(hasGpGot) -DEF_MEMBER_GET_INT(gpGotOffset) - -DEF_MEMBER_GET_BOOL(hasLoValue) -DEF_MEMBER_GET_INT(loOffset) -DEF_MEMBER_GET_BOOL(dereferenced) -DEF_MEMBER_GET_INT(dereferenceOffset) - -DEF_MEMBER_GET_UINT(value) - - -#define MEMBER_GET(name, docs, closure) { #name, (getter) rabbitizer_type_TrackedRegisterState_member_get_##name, (setter) NULL, PyDoc_STR(docs), closure } -#define MEMBER_SET(name, docs, closure) { #name, (getter) NULL, (setter) rabbitizer_type_TrackedRegisterState_member_set_##name, PyDoc_STR(docs), closure } -#define MEMBER_GET_SET(name, docs, closure) { #name, (getter) rabbitizer_type_TrackedRegisterState_member_get_##name, (setter) rabbitizer_type_TrackedRegisterState_member_set_##name, PyDoc_STR(docs), closure } - - -static PyGetSetDef rabbitizer_type_TrackedRegisterState_getsetters[] = { - MEMBER_GET(registerNum, "", NULL), - - MEMBER_GET(hasLuiValue, "", NULL), - MEMBER_GET(luiOffset, "", NULL), - MEMBER_GET(luiSetOnBranchLikely, "", NULL), - - MEMBER_GET(hasGpGot, "", NULL), - MEMBER_GET(gpGotOffset, "", NULL), - - MEMBER_GET(hasLoValue, "", NULL), - MEMBER_GET(loOffset, "", NULL), - MEMBER_GET(dereferenced, "", NULL), - MEMBER_GET(dereferenceOffset, "", NULL), - - MEMBER_GET(value, "", NULL), - - { 0 } -}; - - -PyTypeObject rabbitizer_type_TrackedRegisterState_TypeObject = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "rabbitizer.TrackedRegisterState", - .tp_doc = PyDoc_STR("TrackedRegisterState"), - .tp_basicsize = sizeof(PyRabbitizerTrackedRegisterState), - .tp_itemsize = 0, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_new = PyType_GenericNew, - .tp_init = (initproc) rabbitizer_type_TrackedRegisterState_init, - .tp_dealloc = (destructor) rabbitizer_type_TrackedRegisterState_dealloc, - // .tp_repr = (reprfunc) rabbitizer_type_TrackedRegisterState_repr, - // .tp_str = (reprfunc) rabbitizer_type_TrackedRegisterState_str, - // .tp_methods = rabbitizer_type_TrackedRegisterState_methods, - .tp_getset = rabbitizer_type_TrackedRegisterState_getsetters, -}; diff --git a/tools/ido-static-recomp/tools/rabbitizer/registersTrackerTest.c b/tools/ido-static-recomp/tools/rabbitizer/registersTrackerTest.c deleted file mode 100644 index 5aef0f83..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/registersTrackerTest.c +++ /dev/null @@ -1,41 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstruction.h" -#include "analysis/RabbitizerRegistersTracker.h" - - -int main() { - RabbitizerRegistersTracker regsTracker; - RabbitizerInstruction instr; - uint32_t word = 0x002D0821; // addu $at, $at, $t5 - uint32_t vram = 0x0042F170; - int instrOffset = 220; - - RabbitizerRegistersTracker_init(®sTracker, NULL); - - RabbitizerInstruction_init(&instr, word, vram); - RabbitizerInstruction_processUniqueId(&instr); - - regsTracker.registers[1] = (RabbitizerTrackedRegisterState){ - .dereferenceOffset = 212, - .dereferenced = true, - .gpGotOffset = 212, - .hasGpGot = true, - .hasLoValue = true, - .hasLuiValue = false, - .loOffset = 212, - .luiOffset = 0, - .luiSetOnBranchLikely = false, - .value = 0x10010000, - .registerNum = regsTracker.registers[1].registerNum, - }; - - RabbitizerRegistersTracker_overwriteRegisters(®sTracker, &instr, instrOffset); - - RabbitizerInstruction_destroy(&instr); - - RabbitizerRegistersTracker_destroy(®sTracker); - - return 0; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/rsptest.c b/tools/ido-static-recomp/tools/rabbitizer/rsptest.c deleted file mode 100644 index 7aa04eef..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rsptest.c +++ /dev/null @@ -1,44 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstructionRsp.h" - -#include -#include -#include -#include - - -int main() { - uint32_t word; - RabbitizerInstruction instr; - char *buffer; - int extraLJust = 5; - uint32_t validbits; - - //word = 0x4B01C8E8; // vand $v3, $v25, $v1[0] - word = 0x48952000; // mtc2 $21, $v4[0] - - RabbitizerInstructionRsp_init(&instr, word, 0x80000000); - - RabbitizerInstructionRsp_processUniqueId(&instr); - - buffer = malloc(RabbitizerInstruction_getSizeForBuffer(&instr, 0, extraLJust) + 1); - assert(buffer != NULL); - - RabbitizerInstruction_disassemble(&instr, buffer, NULL, 0, extraLJust); - - printf("%08X: %s\n", word, buffer); - - validbits = RabbitizerInstruction_getValidBits(&instr); - - printf("word: %08X\n", instr.word); - printf("mandatory bits: %08X\n", instr._mandatorybits); - printf("valid bits: %08X\n", validbits); - printf("invalid bits: %08X\n", (~validbits) & instr.word); - - free(buffer); - RabbitizerInstructionRsp_destroy(&instr); - - return 0; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/setup.cfg b/tools/ido-static-recomp/tools/rabbitizer/setup.cfg deleted file mode 100644 index e2bd449e..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/setup.cfg +++ /dev/null @@ -1,24 +0,0 @@ -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -[metadata] -name = rabbitizer -# Version should be synced with include/common/RabbitizerVersion.h -version = 1.2.3 -author = Decompollaborate -license = MIT -description = MIPS instruction decoder -url = https://github.com/Decompollaborate/rabbitizer -project_urls = - Source = https://github.com/Decompollaborate/rabbitizer - Bug Tracker = https://github.com/Decompollaborate/rabbitizer/issues -long_description = file: README.md -long_description_content_type = text/markdown - -[options] -packages = rabbitizer - -[options.package_data] -rabbitizer = - **/*.pyi - **/py.typed diff --git a/tools/ido-static-recomp/tools/rabbitizer/setup.py b/tools/ido-static-recomp/tools/rabbitizer/setup.py deleted file mode 100644 index 2e048e69..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/setup.py +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from setuptools import setup, Extension - - -setup( - ext_modules=[ - Extension( - name="rabbitizer", - sources=["rabbitizer/rabbitizer_module.c", "rabbitizer/rabbitizer_submodule_Utils.c", "rabbitizer/rabbitizer_type_Instruction.c", "rabbitizer/rabbitizer_global_config.c", "rabbitizer/rabbitizer_type_TrackedRegisterState.c", "rabbitizer/rabbitizer_type_RegistersTracker.c", "rabbitizer/rabbitizer_type_LoPairingInfo.c", - "rabbitizer/enums/rabbitizer_type_Enum.c", "rabbitizer/enums/enums_utils.c", "rabbitizer/enums/rabbitizer_enum_InstrCategory.c", "rabbitizer/enums/rabbitizer_enum_InstrId.c", "rabbitizer/enums/rabbitizer_enum_Abi.c", - "rabbitizer/enums/registers/rabbitizer_enum_GprO32.c", "rabbitizer/enums/registers/rabbitizer_enum_GprN32.c", - "src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c", "src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c", "src/instructions/RabbitizerInstruction/RabbitizerInstruction.c", "src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c", - "src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp.c", "src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c", - "src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900.c", "src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_ProcessUniqueId.c", - "src/instructions/RabbitizerInstrDescriptor.c", "src/instructions/RabbitizerInstrId.c", "src/instructions/RabbitizerRegister.c", "src/instructions/RabbitizerInstrSuffix.c", - "src/analysis/RabbitizerTrackedRegisterState.c", "src/analysis/RabbitizerRegistersTracker.c", "src/analysis/RabbitizerLoPairingInfo.c", - "src/common/Utils.c", "src/common/RabbitizerVersion.c", "src/common/RabbitizerConfig.c"], - include_dirs=["include", "rabbitizer"], - extra_compile_args = [ - "-std=c11", - "-Wall", - "-g", - ], - ), - ], -) diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerLoPairingInfo.c b/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerLoPairingInfo.c deleted file mode 100644 index 0b4dc795..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerLoPairingInfo.c +++ /dev/null @@ -1,14 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "analysis/RabbitizerLoPairingInfo.h" - -void RabbitizerLoPairingInfo_Init(RabbitizerLoPairingInfo *self) { - *self = (RabbitizerLoPairingInfo){ - .instrOffset = 0, - .value = 0, - .shouldProcess = false, - .isGpRel = false, - .isGpGot = false, - }; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerRegistersTracker.c b/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerRegistersTracker.c deleted file mode 100644 index 82913688..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerRegistersTracker.c +++ /dev/null @@ -1,425 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "analysis/RabbitizerRegistersTracker.h" - -#include - -#include "common/Utils.h" -#include "common/RabbitizerConfig.h" -#include "instructions/RabbitizerRegister.h" - -// TODO: abi checks - -void RabbitizerRegistersTracker_init(RabbitizerRegistersTracker *self, const RabbitizerRegistersTracker *other) { - size_t i; - - for (i = 0; i < ARRAY_COUNT(self->registers); i++) { - RabbitizerTrackedRegisterState_init(&self->registers[i], i); - if (other != NULL) { - RabbitizerTrackedRegisterState_copyState(&self->registers[i], &other->registers[i]); - } - } -} - -void RabbitizerRegistersTracker_destroy(RabbitizerRegistersTracker *self) { - for (size_t i = 0; i < ARRAY_COUNT(self->registers); i++) { - RabbitizerTrackedRegisterState_destroy(&self->registers[i]); - } -} - -// TODO: simplify logic -bool RabbitizerRegistersTracker_moveRegisters(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr) { - RabbitizerTrackedRegisterState *dstState; - RabbitizerTrackedRegisterState *srcState; - uint8_t reg; - uint8_t rd = RAB_INSTR_GET_rd(instr); - uint8_t rs = RAB_INSTR_GET_rs(instr); - uint8_t rt = RAB_INSTR_GET_rt(instr); - - if (!RabbitizerInstrDescriptor_maybeIsMove(instr->descriptor)) { - return false; - } - if (rt == 0 && rs == 0) { - // ? - // RabbitizerTrackedRegisterState_clear(dstState); - return false; - } - - if (rt == 0) { - reg = rs; - } else if (rs == 0) { - reg = rt; - } else { - if (RabbitizerTrackedRegisterState_hasAnyValue(&self->registers[rs]) && !RabbitizerTrackedRegisterState_hasAnyValue(&self->registers[rt])) { - reg = rs; - } else if (RabbitizerTrackedRegisterState_hasAnyValue(&self->registers[rt]) && !RabbitizerTrackedRegisterState_hasAnyValue(&self->registers[rs])) { - reg = rt; - } else if (rd == rs) { // Check stuff like `addu $3, $3, $2` - reg = rt; - if (self->registers[rs].hasLuiValue || self->registers[rs].hasGpGot) { - reg = rs; - } - } else if (rd == rt) { - reg = rs; - if (self->registers[rt].hasLuiValue || self->registers[rt].hasGpGot) { - reg = rt; - } - } else { - // ? - // RabbitizerTrackedRegisterState_clear(dstState); - return false; - } - - srcState = &self->registers[reg]; - RabbitizerTrackedRegisterState_copyState(&self->registers[rd], srcState); - return true; - } - - srcState = &self->registers[reg]; - dstState = &self->registers[rd]; - - if (RabbitizerTrackedRegisterState_hasAnyValue(srcState)) { - RabbitizerTrackedRegisterState_copyState(dstState, srcState); - return true; - } - - RabbitizerTrackedRegisterState_clear(dstState); - return false; -} - -void RabbitizerRegistersTracker_overwriteRegisters(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset) { - bool shouldRemove = false; - uint8_t reg = 0; - RabbitizerTrackedRegisterState *state = NULL; - - if (RabbitizerRegistersTracker_moveRegisters(self, instr)) { - return; - } - - if (RabbitizerInstrDescriptor_isFloat(instr->descriptor)) { - switch (instr->uniqueId) { - case RABBITIZER_INSTR_ID_cpu_mtc1: - case RABBITIZER_INSTR_ID_cpu_dmtc1: - case RABBITIZER_INSTR_ID_cpu_ctc1: - // IDO usually use a reg as a temp when loading a constant value - // into the float coprocessor, after that IDO never re-uses the value - // in that reg for anything else - shouldRemove = true; - reg = RAB_INSTR_GET_rt(instr); - break; - - default: - break; - } - } else if (RabbitizerInstrDescriptor_isRType(instr->descriptor) || - (RabbitizerInstrDescriptor_isBranch(instr->descriptor) && RabbitizerInstrDescriptor_isIType(instr->descriptor))) { - // $at usually is a one-use reg - uint8_t at = 0; - - if (RAB_INSTR_GET_rs(instr) == 1) { - at = RAB_INSTR_GET_rs(instr); - } else if (RAB_INSTR_GET_rt(instr) == 1) { - at = RAB_INSTR_GET_rt(instr); - } - - state = &self->registers[at]; - if (state->hasLoValue || state->hasLuiValue || state->hasGpGot) { - shouldRemove = true; - reg = at; - } - } - - if (RabbitizerInstrDescriptor_modifiesRt(instr->descriptor)) { - shouldRemove = true; - reg = RAB_INSTR_GET_rt(instr); - if (RabbitizerInstrDescriptor_canBeHi(instr->descriptor)) { - RabbitizerTrackedRegisterState_clearLo(&self->registers[RAB_INSTR_GET_rt(instr)]); - shouldRemove = false; - } - } - if (RabbitizerInstrDescriptor_modifiesRd(instr->descriptor)) { - shouldRemove = true; - reg = RAB_INSTR_GET_rd(instr); - } - - if (shouldRemove) { - state = &self->registers[reg]; -#if 0 - if (state->hasLuiValue) { - self->_printDebugInfo_clearRegister(instr, reg) - } -#endif - - RabbitizerTrackedRegisterState_clearHi(state); - if (!RabbitizerTrackedRegisterState_wasSetInCurrentOffset(state, instrOffset)) { - RabbitizerTrackedRegisterState_clearGp(state); - RabbitizerTrackedRegisterState_clearLo(state); - } - } -} - -void RabbitizerRegistersTracker_unsetRegistersAfterFuncCall(RabbitizerRegistersTracker *self, UNUSED const RabbitizerInstruction *instr, - const RabbitizerInstruction *prevInstr) { - RabbitizerTrackedRegisterState *state = NULL; - - if (!RabbitizerInstrDescriptor_doesLink(prevInstr->descriptor)) { - return; - } - - if (RabbitizerConfig_Cfg.regNames.gprAbiNames == RABBITIZER_ABI_O32 || RabbitizerConfig_Cfg.regNames.gprAbiNames == RABBITIZER_ABI_NUMERIC) { - for (size_t reg = 0; reg < ARRAY_COUNT(self->registers); reg++) { - switch (reg) { - case RABBITIZER_REG_GPR_O32_at: - case RABBITIZER_REG_GPR_O32_v0: - case RABBITIZER_REG_GPR_O32_v1: - case RABBITIZER_REG_GPR_O32_a0: - case RABBITIZER_REG_GPR_O32_a1: - case RABBITIZER_REG_GPR_O32_a2: - case RABBITIZER_REG_GPR_O32_a3: - case RABBITIZER_REG_GPR_O32_t0: - case RABBITIZER_REG_GPR_O32_t1: - case RABBITIZER_REG_GPR_O32_t2: - case RABBITIZER_REG_GPR_O32_t3: - case RABBITIZER_REG_GPR_O32_t4: - case RABBITIZER_REG_GPR_O32_t5: - case RABBITIZER_REG_GPR_O32_t6: - case RABBITIZER_REG_GPR_O32_t7: - case RABBITIZER_REG_GPR_O32_t8: - case RABBITIZER_REG_GPR_O32_t9: - case RABBITIZER_REG_GPR_O32_ra: - state = &self->registers[reg]; -#if 0 - if (state.hasLuiValue) { - self->_printDebugInfo_clearRegister(instr, reg) - } -#endif - RabbitizerTrackedRegisterState_clear(state); - break; - - default: - break; - } - } - } else if (RabbitizerConfig_Cfg.regNames.gprAbiNames == RABBITIZER_ABI_N32 || RabbitizerConfig_Cfg.regNames.gprAbiNames == RABBITIZER_ABI_N64) { - for (size_t reg = 0; reg < ARRAY_COUNT(self->registers); reg++) { - switch (reg) { - case RABBITIZER_REG_GPR_N32_at: - case RABBITIZER_REG_GPR_N32_v0: - case RABBITIZER_REG_GPR_N32_v1: - case RABBITIZER_REG_GPR_N32_a0: - case RABBITIZER_REG_GPR_N32_a1: - case RABBITIZER_REG_GPR_N32_a2: - case RABBITIZER_REG_GPR_N32_a3: - case RABBITIZER_REG_GPR_N32_a4: - case RABBITIZER_REG_GPR_N32_a5: - case RABBITIZER_REG_GPR_N32_a6: - case RABBITIZER_REG_GPR_N32_a7: - case RABBITIZER_REG_GPR_N32_t0: - case RABBITIZER_REG_GPR_N32_t1: - case RABBITIZER_REG_GPR_N32_t2: - case RABBITIZER_REG_GPR_N32_t3: - case RABBITIZER_REG_GPR_N32_t8: - case RABBITIZER_REG_GPR_N32_t9: - case RABBITIZER_REG_GPR_N32_ra: - state = &self->registers[reg]; -#if 0 - if (state.hasLuiValue) { - self->_printDebugInfo_clearRegister(instr, reg) - } -#endif - RabbitizerTrackedRegisterState_clear(state); - break; - - default: - break; - } - } - } -} - -bool RabbitizerRegistersTracker_getAddressIfCanSetType(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, - uint32_t *dstAddress) { - const RabbitizerTrackedRegisterState *state = &self->registers[RAB_INSTR_GET_rs(instr)]; - - if (!state->hasLoValue) { - return false; - } - - if (!state->dereferenced || instrOffset == state->dereferenceOffset) { - *dstAddress = state->value; - return true; - } - - return false; -} - -bool RabbitizerRegistersTracker_getJrInfo(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int *dstOffset, uint32_t *dstAddress) { - const RabbitizerTrackedRegisterState *state = &self->registers[RAB_INSTR_GET_rs(instr)]; - - if (!state->hasLoValue || !state->dereferenced) { - return false; - } - - *dstOffset = state->loOffset; - *dstAddress = state->value; - return true; -} - -// prevInstr can be NULL -void RabbitizerRegistersTracker_processLui(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, - const RabbitizerInstruction *prevInstr) { - RabbitizerTrackedRegisterState *state = NULL; - - assert(RabbitizerInstrDescriptor_canBeHi(instr->descriptor)); - - state = &self->registers[RAB_INSTR_GET_rt(instr)]; - RabbitizerTrackedRegisterState_clear(state); - RabbitizerTrackedRegisterState_setHi(state, RabbitizerInstruction_getImmediate(instr), instrOffset); - - if (prevInstr != NULL) { - // If the previous instructions is a branch likely, then nulify - // the effects of this instruction for future analysis - state->luiSetOnBranchLikely = RabbitizerInstrDescriptor_isBranchLikely(prevInstr->descriptor) || RabbitizerInstruction_isUnconditionalBranch(prevInstr); - } -} - -void RabbitizerRegistersTracker_processGpLoad(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset) { - RabbitizerTrackedRegisterState *state = NULL; - - assert(RabbitizerInstrDescriptor_canBeLo(instr->descriptor)); - - state = &self->registers[RAB_INSTR_GET_rt(instr)]; - - RabbitizerTrackedRegisterState_clear(state); - RabbitizerTrackedRegisterState_setGpLoad(state, RabbitizerInstruction_getImmediate(instr), instrOffset); -} - -bool RabbitizerRegistersTracker_getLuiOffsetForConstant(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int *dstOffset) { - const RabbitizerTrackedRegisterState *state = &self->registers[RAB_INSTR_GET_rs(instr)]; - - if (!state->hasLuiValue) { - return false; - } - - *dstOffset = state->luiOffset; - return true; -} - -void RabbitizerRegistersTracker_processConstant(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, uint32_t value, int offset) { - RabbitizerTrackedRegisterState *stateDst = &self->registers[RAB_INSTR_GET_rt(instr)]; - - RabbitizerTrackedRegisterState_setLo(stateDst, value, offset); -} - -// TODO: this function should not be changing the state of the tracker -bool RabbitizerRegistersTracker_getLuiOffsetForLo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, int *dstOffset, - bool *dstIsGp) { - const RabbitizerTrackedRegisterState *state = &self->registers[RAB_INSTR_GET_rs(instr)]; - - if (state->hasLuiValue && !state->luiSetOnBranchLikely) { - *dstOffset = state->luiOffset; - *dstIsGp = false; - return true; - } - - // TODO: abi - if (RAB_INSTR_GET_rs(instr) == 28) { // $gp - *dstOffset = 0; - *dstIsGp = true; - return true; - } - - if (RabbitizerInstrDescriptor_modifiesRt(instr->descriptor) && RabbitizerInstrDescriptor_doesDereference(instr->descriptor)) { - if (state->hasLoValue && !state->dereferenced) { - // Simulate a dereference - RabbitizerTrackedRegisterState_dereferenceState(&self->registers[RAB_INSTR_GET_rt(instr)], state, instrOffset); - } - } - - return false; -} - -RabbitizerLoPairingInfo RabbitizerRegistersTracker_preprocessLoAndGetInfo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, - int instrOffset) { - const RabbitizerTrackedRegisterState *state = &self->registers[RAB_INSTR_GET_rs(instr)]; - RabbitizerLoPairingInfo pairingInfo; - - RabbitizerLoPairingInfo_Init(&pairingInfo); - - if (state->hasLuiValue && !state->luiSetOnBranchLikely) { - pairingInfo.instrOffset = state->luiOffset; - pairingInfo.value = state->value; - pairingInfo.shouldProcess = true; - return pairingInfo; - } - - if ((RAB_INSTR_GET_rs(instr) == RABBITIZER_REG_GPR_O32_gp) || (RAB_INSTR_GET_rs(instr) == RABBITIZER_REG_GPR_N32_gp)) { - pairingInfo.value = state->value; - pairingInfo.isGpRel = true; - pairingInfo.shouldProcess = true; - return pairingInfo; - } - - if (state->hasGpGot) { - pairingInfo.instrOffset = state->gpGotOffset; - pairingInfo.value = state->value; - pairingInfo.shouldProcess = true; - pairingInfo.isGpGot = true; - return pairingInfo; - } - - if (RabbitizerInstrDescriptor_modifiesRt(instr->descriptor) && RabbitizerInstrDescriptor_doesDereference(instr->descriptor)) { - if (state->hasLoValue && !state->dereferenced) { - // Simulate a dereference - RabbitizerTrackedRegisterState_dereferenceState(&self->registers[RAB_INSTR_GET_rt(instr)], state, instrOffset); - } - } - - return pairingInfo; -} - -void RabbitizerRegistersTracker_processLo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, uint32_t value, int offset) { - RabbitizerTrackedRegisterState *stateDst; - - if (!RabbitizerInstrDescriptor_modifiesRt(instr->descriptor)) { - return; - } - - stateDst = &self->registers[RAB_INSTR_GET_rt(instr)]; - RabbitizerTrackedRegisterState_setLo(stateDst, value, offset); - if (RabbitizerInstrDescriptor_doesDereference(instr->descriptor)) { - RabbitizerTrackedRegisterState_deref(stateDst, offset); - } - if (RAB_INSTR_GET_rt(instr) == RAB_INSTR_GET_rs(instr)) { - RabbitizerTrackedRegisterState_clearHi(stateDst); - RabbitizerTrackedRegisterState_clearGp(stateDst); - } -} - -bool RabbitizerRegistersTracker_hasLoButNoHi(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr) { - const RabbitizerTrackedRegisterState *state; - - assert(instr != NULL); - - state = &self->registers[RAB_INSTR_GET_rs(instr)]; - return state->hasLoValue && !state->hasLuiValue; -} - -#if 0 -def _printDebugInfo_clearRegister(self, instr: rabbitizer.Instruction, reg: int, currentVram: int|None=None) -> None: - if not common.GlobalConfig.PRINT_SYMBOL_FINDER_DEBUG_INFO: - return - - if currentVram is None: - return - - print("Clearing reg:") - // print() - print(f"vram: {currentVram:X}") - print(instr) - print(self->registers) - // TODO - // print(f"deleting {reg} / {instr->getRegisterName(reg)}") - print() -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerTrackedRegisterState.c b/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerTrackedRegisterState.c deleted file mode 100644 index 91298945..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerTrackedRegisterState.c +++ /dev/null @@ -1,142 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "analysis/RabbitizerTrackedRegisterState.h" - -#include - -#include "common/Utils.h" -#include "instructions/RabbitizerRegister.h" - -void RabbitizerTrackedRegisterState_init(RabbitizerTrackedRegisterState *self, int registerNum) { - self->registerNum = registerNum; - - self->hasLuiValue = false; - self->luiOffset = 0; - self->luiSetOnBranchLikely = false; - - self->hasGpGot = false; - self->gpGotOffset = 0; - - self->hasLoValue = false; - self->loOffset = 0; - self->dereferenced = false; - self->dereferenceOffset = 0; - - self->value = 0; -} - -void RabbitizerTrackedRegisterState_destroy(UNUSED RabbitizerTrackedRegisterState *self) { -} - -void RabbitizerTrackedRegisterState_clear(RabbitizerTrackedRegisterState *self) { - self->hasLuiValue = false; - self->luiOffset = 0; - self->luiSetOnBranchLikely = false; - - self->hasGpGot = false; - self->gpGotOffset = 0; - - self->hasLoValue = false; - self->loOffset = 0; - self->dereferenced = false; - self->dereferenceOffset = 0; - self->value = 0; -} - -void RabbitizerTrackedRegisterState_clearHi(RabbitizerTrackedRegisterState *self) { - self->hasLuiValue = false; - self->luiOffset = 0; - self->luiSetOnBranchLikely = false; -} - -void RabbitizerTrackedRegisterState_clearGp(RabbitizerTrackedRegisterState *self) { - self->hasGpGot = false; - self->gpGotOffset = 0; -} - -void RabbitizerTrackedRegisterState_clearLo(RabbitizerTrackedRegisterState *self) { - self->hasLoValue = false; - self->loOffset = 0; - self->dereferenced = false; - self->dereferenceOffset = 0; -} - -void RabbitizerTrackedRegisterState_copyState(RabbitizerTrackedRegisterState *self, const RabbitizerTrackedRegisterState *other) { - self->hasLuiValue = other->hasLuiValue; - self->luiOffset = other->luiOffset; - self->luiSetOnBranchLikely = other->luiSetOnBranchLikely; - - self->hasGpGot = other->hasGpGot; - self->gpGotOffset = other->gpGotOffset; - - self->hasLoValue = other->hasLoValue; - self->loOffset = other->loOffset; - self->dereferenced = other->dereferenced; - self->dereferenceOffset = other->dereferenceOffset; - - self->value = other->value; -} - -void RabbitizerTrackedRegisterState_setHi(RabbitizerTrackedRegisterState *self, uint32_t value, int offset) { - assert(!self->hasGpGot); - - self->hasLuiValue = true; - self->luiOffset = offset; - self->value = value << 16; -} - -void RabbitizerTrackedRegisterState_setGpLoad(RabbitizerTrackedRegisterState *self, uint32_t value, int offset) { - assert(!self->hasLuiValue); - - self->hasGpGot = true; - self->gpGotOffset = offset; - self->value = value; -} - -void RabbitizerTrackedRegisterState_setLo(RabbitizerTrackedRegisterState *self, uint32_t value, int offset) { - self->value = value; - self->loOffset = offset; - self->hasLoValue = true; - self->dereferenced = false; - self->dereferenceOffset = 0; -} - -void RabbitizerTrackedRegisterState_deref(RabbitizerTrackedRegisterState *self, int offset) { - self->dereferenced = true; - self->dereferenceOffset = offset; -} - -void RabbitizerTrackedRegisterState_dereferenceState(RabbitizerTrackedRegisterState *self, const RabbitizerTrackedRegisterState *other, int offset) { - assert(other->hasLoValue); - assert(!other->dereferenced); - - RabbitizerTrackedRegisterState_copyState(self, other); - RabbitizerTrackedRegisterState_deref(self, offset); -} - -bool RabbitizerTrackedRegisterState_hasAnyValue(const RabbitizerTrackedRegisterState *self) { - return self->hasLuiValue || self->hasLoValue || self->hasGpGot; -} - -bool RabbitizerTrackedRegisterState_wasSetInCurrentOffset(const RabbitizerTrackedRegisterState *self, int offset) { - return self->loOffset == offset || self->dereferenceOffset == offset; -} - -void RabbitizerTrackedRegisterState_fprint(const RabbitizerTrackedRegisterState *self, FILE *outFile) { - fprintf(outFile, "TrackedRegisterState(%i / %s)\n", self->registerNum, RabbitizerRegister_getNameGpr(self->registerNum)); - - fprintf(outFile, " hasLuiValue: %s\n", self->hasLuiValue ? "true" : "false"); - fprintf(outFile, " luiOffset: 0x%X\n", self->luiOffset); - fprintf(outFile, " luiSetOnBranchLikely: %s\n", self->luiSetOnBranchLikely ? "true" : "false"); - - fprintf(outFile, " hasGpGot: %s\n", self->hasGpGot ? "true" : "false"); - fprintf(outFile, " gpGotOffset: 0x%X\n", self->gpGotOffset); - - fprintf(outFile, " hasLoValue: %s\n", self->hasLoValue ? "true" : "false"); - fprintf(outFile, " loOffset: %X\n", self->loOffset); - fprintf(outFile, " dereferenced: %s\n", self->dereferenced ? "true" : "false"); - fprintf(outFile, " dereferenceOffset: %X\n", self->dereferenceOffset); - - fprintf(outFile, " value: %X\n", self->value); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerConfig.c b/tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerConfig.c deleted file mode 100644 index 88b554db..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerConfig.c +++ /dev/null @@ -1,50 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "common/RabbitizerConfig.h" - -#include - -RabbitizerAbi RabbitizerAbi_fromStr(const char *name) { - if (name == NULL || strcmp(name, "32") == 0 || strcmp(name, "o32") == 0 || strcmp(name, "O32") == 0) { - return RABBITIZER_ABI_O32; - } - if (strcmp(name, "n32") == 0 || strcmp(name, "N32") == 0) { - return RABBITIZER_ABI_N32; - } - if (strcmp(name, "64") == 0 || strcmp(name, "n64") == 0 || strcmp(name, "N64") == 0) { - return RABBITIZER_ABI_N64; - } - return RABBITIZER_ABI_NUMERIC; -} - -RabbitizerConfig RabbitizerConfig_Cfg = { - .regNames = { - .namedRegisters = true, - .gprAbiNames = RABBITIZER_ABI_O32, - .fprAbiNames = RABBITIZER_ABI_NUMERIC, - .userFpcCsr = true, - .vr4300Cop0NamedRegisters = true, - .vr4300RspCop0NamedRegisters = true, - }, - .pseudos = { - .enablePseudos = true, - .pseudoBeqz = true, - .pseudoBnez = true, - .pseudoB = true, - .pseudoMove = true, - .pseudoNot = true, - .pseudoNegu = true, - .pseudoBal = true, - }, - .toolchainTweaks = { - .treatJAsUnconditionalBranch = false, - .sn64DivFix = false, - }, - .misc = { - .opcodeLJust = 7+4, - .unknownInstrComment = true, - .omit0XOnSmallImm = false, - .upperCaseImm = true, - } -}; diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerVersion.c b/tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerVersion.c deleted file mode 100644 index f700fbfe..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerVersion.c +++ /dev/null @@ -1,10 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "common/RabbitizerVersion.h" - -const int RabVersion_Major = RAB_VERSION_MAJOR; -const int RabVersion_Minor = RAB_VERSION_MINOR; -const int RabVersion_Patch = RAB_VERSION_PATCH; - -const char RabVersion_Str[] = RAB_VERSION_STR; diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/common/Utils.c b/tools/ido-static-recomp/tools/rabbitizer/src/common/Utils.c deleted file mode 100644 index 7dd02622..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/common/Utils.c +++ /dev/null @@ -1,78 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "common/Utils.h" - -#include -#include - -int32_t RabbitizerUtils_From2Complement(uint32_t number, int bits) { - bool isNegative = number & (1ULL << (bits - 1)); - - if (isNegative) { - return -((~number + 1) & ((1ULL << bits) - 1)); - } - - return number; -} - -size_t RabbitizerUtils_CharFill(char *dst, int count, char fillchar) { - if (count <= 0) { - return 0; - } - - memset(dst, fillchar, count); - - return count; -} - -size_t RabbitizerUtils_escapeString(char *dst, size_t dstSize, const char *src, size_t srcSize) { - size_t srcPos = 0; - size_t dstpos = 0; - - for (; srcPos < srcSize && dstpos < dstSize; srcPos++, src++) { - // The cases of this switch are sorted by ASCII order - switch (*src) { - case '\a': - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 'a'); - break; - - case '\t': - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 't'); - break; - - case '\n': - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 'n'); - break; - - case '\f': - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 'f'); - break; - - case '\r': - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 'r'); - break; - - case '"': - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '"'); - break; - - case '\\': - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - break; - - default: - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, *src); - break; - } - } - - return dstpos; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrDescriptor.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrDescriptor.c deleted file mode 100644 index a6e143f9..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrDescriptor.c +++ /dev/null @@ -1,104 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstrDescriptor.h" - -#include "instructions/RabbitizerInstruction.h" - -#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) [RABBITIZER_INSTR_ID_##prefix##_##name] = { __VA_ARGS__ }, - -#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__) - -const RabbitizerInstrDescriptor RabbitizerInstrDescriptor_Descriptors[] = { -#include "instructions/instr_id/RabbitizerInstrId_cpu.inc" -#include "instructions/instr_id/RabbitizerInstrId_rsp.inc" -#include "instructions/instr_id/RabbitizerInstrId_r5900.inc" -}; - -#undef RABBITIZER_DEF_INSTR_ID -#undef RABBITIZER_DEF_INSTR_ID_ALTNAME - -bool RabbitizerInstrDescriptor_isUnknownType(const RabbitizerInstrDescriptor *self) { - return self->instrType == RABBITIZER_INSTR_TYPE_UNKNOWN; -} -bool RabbitizerInstrDescriptor_isJType(const RabbitizerInstrDescriptor *self) { - return self->instrType == RABBITIZER_INSTR_TYPE_J; -} -bool RabbitizerInstrDescriptor_isIType(const RabbitizerInstrDescriptor *self) { - return self->instrType == RABBITIZER_INSTR_TYPE_I; -} -bool RabbitizerInstrDescriptor_isRType(const RabbitizerInstrDescriptor *self) { - return self->instrType == RABBITIZER_INSTR_TYPE_R; -} -bool RabbitizerInstrDescriptor_isRegimmType(const RabbitizerInstrDescriptor *self) { - return self->instrType == RABBITIZER_INSTR_TYPE_REGIMM; -} - -RabbitizerInstrSuffix RabbitizerInstrDescriptor_instrSuffix(const RabbitizerInstrDescriptor *self) { - return self->instrSuffix; -} - -bool RabbitizerInstrDescriptor_isBranch(const RabbitizerInstrDescriptor *self) { - return self->isBranch; -} -bool RabbitizerInstrDescriptor_isBranchLikely(const RabbitizerInstrDescriptor *self) { - return self->isBranchLikely; -} -bool RabbitizerInstrDescriptor_isJump(const RabbitizerInstrDescriptor *self) { - return self->isJump; -} -bool RabbitizerInstrDescriptor_isTrap(const RabbitizerInstrDescriptor *self) { - return self->isTrap; -} - -bool RabbitizerInstrDescriptor_isFloat(const RabbitizerInstrDescriptor *self) { - return self->isFloat; -} -bool RabbitizerInstrDescriptor_isDouble(const RabbitizerInstrDescriptor *self) { - return self->isDouble; -} - -bool RabbitizerInstrDescriptor_isUnsigned(const RabbitizerInstrDescriptor *self) { - return self->isUnsigned; -} - -bool RabbitizerInstrDescriptor_modifiesRt(const RabbitizerInstrDescriptor *self) { - return self->modifiesRt; -} -bool RabbitizerInstrDescriptor_modifiesRd(const RabbitizerInstrDescriptor *self) { - return self->modifiesRd; -} - -bool RabbitizerInstrDescriptor_notEmitedByCompilers(const RabbitizerInstrDescriptor *self) { - return self->notEmitedByCompilers; -} - -bool RabbitizerInstrDescriptor_canBeHi(const RabbitizerInstrDescriptor *self) { - return self->canBeHi; -} -bool RabbitizerInstrDescriptor_canBeLo(const RabbitizerInstrDescriptor *self) { - return self->canBeLo; -} -bool RabbitizerInstrDescriptor_doesLink(const RabbitizerInstrDescriptor *self) { - return self->doesLink; -} -bool RabbitizerInstrDescriptor_doesDereference(const RabbitizerInstrDescriptor *self) { - return self->doesDereference; -} -bool RabbitizerInstrDescriptor_doesLoad(const RabbitizerInstrDescriptor *self) { - return self->doesLoad; -} -bool RabbitizerInstrDescriptor_doesStore(const RabbitizerInstrDescriptor *self) { - return self->doesStore; -} -bool RabbitizerInstrDescriptor_maybeIsMove(const RabbitizerInstrDescriptor *self) { - return self->maybeIsMove; -} - -bool RabbitizerInstrDescriptor_isPseudo(const RabbitizerInstrDescriptor *self) { - return self->isPseudo; -} - -RabbitizerArchitectureVersion RabbitizerInstrDescriptor_getArchitectureVersion(const RabbitizerInstrDescriptor *self) { - return self->architectureVersion; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrId.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrId.c deleted file mode 100644 index b8643314..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrId.c +++ /dev/null @@ -1,28 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstrId.h" - -#include - -#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) [RABBITIZER_INSTR_ID_##prefix##_##name] = #name, - -#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) [RABBITIZER_INSTR_ID_##prefix##_##name] = #altname, - -const char *RabbitizerInstrId_Names[] = { -#include "instructions/instr_id/RabbitizerInstrId_cpu.inc" -#include "instructions/instr_id/RabbitizerInstrId_rsp.inc" -#include "instructions/instr_id/RabbitizerInstrId_r5900.inc" -}; - -#undef RABBITIZER_DEF_INSTR_ID -#undef RABBITIZER_DEF_INSTR_ID_ALTNAME - -const char *RabbitizerInstrId_getOpcodeName(RabbitizerInstrId uniqueId) { - assert(uniqueId >= RABBITIZER_INSTR_ID_cpu_INVALID && uniqueId < RABBITIZER_INSTR_ID_ALL_MAX); - assert(uniqueId != RABBITIZER_INSTR_ID_cpu_MAX); - assert(uniqueId != RABBITIZER_INSTR_ID_rsp_MAX); - assert(uniqueId != RABBITIZER_INSTR_ID_r5900_MAX); - - return RabbitizerInstrId_Names[uniqueId]; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrSuffix.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrSuffix.c deleted file mode 100644 index cef16b30..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrSuffix.c +++ /dev/null @@ -1,62 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstrSuffix.h" - -#include - -#include "common/Utils.h" -#include "instructions/RabbitizerInstruction.h" -#include "instructions/RabbitizerInstructionRsp.h" -#include "instructions/RabbitizerInstructionR5900.h" - -typedef size_t (*InstrSuffixCallback)(const RabbitizerInstruction *self, char *dst); - -size_t RabbitizerInstrSuffix_None(UNUSED const RabbitizerInstruction *self, UNUSED char *dst) { - return 0; -} - -size_t RabbitizerInstrSuffixR5900_xyzw(const RabbitizerInstruction *self, char *dst) { - size_t totalSize = 0; - - if (RAB_INSTR_R5900_GET_xyzw_x(self) || RAB_INSTR_R5900_GET_xyzw_y(self) || RAB_INSTR_R5900_GET_xyzw_z(self) || RAB_INSTR_R5900_GET_xyzw_w(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '.'); - } - - if (RAB_INSTR_R5900_GET_xyzw_x(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x'); - } - if (RAB_INSTR_R5900_GET_xyzw_y(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y'); - } - if (RAB_INSTR_R5900_GET_xyzw_z(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z'); - } - if (RAB_INSTR_R5900_GET_xyzw_w(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w'); - } - - return totalSize; -} -const InstrSuffixCallback instrSuffixCallbacks[] = { - [RABINSTRSUFFIX_NONE] = RabbitizerInstrSuffix_None, - - [RABINSTRSUFFIX_R5900_xyzw] = RabbitizerInstrSuffixR5900_xyzw, -}; - -size_t RabbitizerInstrSuffix_getSizeForBuffer(UNUSED const RabbitizerInstruction *self, UNUSED RabbitizerInstrSuffix instrSuffix) { - // Just hardcode the size of the bigger possible suffix, faster than actually computing it. - return 5; -} - -size_t RabbitizerInstrSuffix_processSuffix(const RabbitizerInstruction *self, char *dst, RabbitizerInstrSuffix instrSuffix) { - InstrSuffixCallback callback; - - assert(instrSuffix >= RABINSTRSUFFIX_NONE); - assert(instrSuffix < RABINSTRSUFFIX_MAX); - - callback = instrSuffixCallbacks[instrSuffix]; - assert(callback != NULL); - - return callback(self, dst); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction.c deleted file mode 100644 index 5e0bf056..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction.c +++ /dev/null @@ -1,368 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstruction.h" - -#include - -#include "common/RabbitizerConfig.h" -#include "instructions/RabbitizerRegister.h" -#include "instructions/RabbitizerInstructionRsp.h" -#include "instructions/RabbitizerInstructionR5900.h" - -void RabbitizerInstruction_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram) { - self->word = word; - self->_mandatorybits = 0; - - self->uniqueId = RABBITIZER_INSTR_ID_cpu_INVALID; - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - - self->vram = vram; - self->_handwrittenCategory = false; - self->inHandwrittenFunction = false; - self->category = RABBITIZER_INSTRCAT_CPU; -} - -void RabbitizerInstruction_destroy(UNUSED RabbitizerInstruction *self) { -} - -/* General getters */ - -uint32_t RabbitizerInstruction_getRaw(const RabbitizerInstruction *self) { - return self->word; -} - -uint32_t RabbitizerInstruction_getImmediate(const RabbitizerInstruction *self) { - return RAB_INSTR_GET_immediate(self); -} -int32_t RabbitizerInstruction_getProcessedImmediate(const RabbitizerInstruction *self) { - if (RabbitizerInstrDescriptor_isUnsigned(self->descriptor)) { - return RAB_INSTR_GET_immediate(self); - } - return RabbitizerUtils_From2Complement(RAB_INSTR_GET_immediate(self), 16); -} - -uint32_t RabbitizerInstruction_getInstrIndex(const RabbitizerInstruction *self) { - return RAB_INSTR_GET_instr_index(self); -} - -uint32_t RabbitizerInstruction_getInstrIndexAsVram(const RabbitizerInstruction *self) { - uint32_t vram = RabbitizerInstruction_getInstrIndex(self) << 2; - - if (self->vram == 0) { - vram |= 0x80000000; - } else { - // Jumps are PC-region branches. The upper bits are filled with the address in the delay slot - vram |= (self->vram + 4) & 0xFF000000; - } - return vram; -} - -int32_t RabbitizerInstruction_getBranchOffset(const RabbitizerInstruction *self) { - int32_t diff = RabbitizerUtils_From2Complement(RabbitizerInstruction_getImmediate(self), 16); - - return diff * 4 + 4; -} - -int32_t RabbitizerInstruction_getGenericBranchOffset(const RabbitizerInstruction *self, uint32_t currentVram) { - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_j) { - return RabbitizerInstruction_getInstrIndexAsVram(self) - currentVram; - } - return RabbitizerInstruction_getBranchOffset(self); -} - -/* General getters */ - -void RabbitizerInstruction_blankOut(RabbitizerInstruction *self) { - size_t i; - - for (i = 0; i < ARRAY_COUNT(self->descriptor->operands) && self->descriptor->operands[i] != RAB_OPERAND_ALL_INVALID; i++) { - switch (self->descriptor->operands[i]) { - case RAB_OPERAND_cpu_rs: - self->word = RAB_INSTR_PACK_rs(self->word, 0); - break; - - case RAB_OPERAND_cpu_rt: - self->word = RAB_INSTR_PACK_rt(self->word, 0); - break; - - case RAB_OPERAND_cpu_rd: - self->word = RAB_INSTR_PACK_rd(self->word, 0); - break; - - case RAB_OPERAND_cpu_sa: - self->word = RAB_INSTR_PACK_sa(self->word, 0); - break; - - case RAB_OPERAND_cpu_zero: - break; - - case RAB_OPERAND_cpu_cop0d: - self->word = RAB_INSTR_PACK_cop0d(self->word, 0); - break; - - case RAB_OPERAND_cpu_fs: - self->word = RAB_INSTR_PACK_fs(self->word, 0); - break; - - case RAB_OPERAND_cpu_ft: - self->word = RAB_INSTR_PACK_ft(self->word, 0); - break; - - case RAB_OPERAND_cpu_fd: - self->word = RAB_INSTR_PACK_fd(self->word, 0); - break; - - case RAB_OPERAND_cpu_cop1cs: - self->word = RAB_INSTR_PACK_cop1cs(self->word, 0); - break; - - case RAB_OPERAND_cpu_cop2t: - self->word = RAB_INSTR_PACK_cop2t(self->word, 0); - break; - - case RAB_OPERAND_cpu_op: - self->word = RAB_INSTR_PACK_op(self->word, 0); - break; - - case RAB_OPERAND_cpu_code: - self->word = RAB_INSTR_PACK_code(self->word, 0); - break; - - case RAB_OPERAND_cpu_code_lower: - self->word = RAB_INSTR_PACK_code_lower(self->word, 0); - break; - - case RAB_OPERAND_cpu_copraw: - self->word = RAB_INSTR_PACK_copraw(self->word, 0); - break; - - case RAB_OPERAND_cpu_label: - self->word = RAB_INSTR_PACK_instr_index(self->word, 0); - break; - - case RAB_OPERAND_cpu_immediate: - self->word = RAB_INSTR_PACK_immediate(self->word, 0); - break; - - case RAB_OPERAND_cpu_branch_target_label: - self->word = RAB_INSTR_PACK_immediate(self->word, 0); - break; - - case RAB_OPERAND_cpu_immediate_base: - self->word = RAB_INSTR_PACK_rs(self->word, 0); - self->word = RAB_INSTR_PACK_immediate(self->word, 0); - break; - - /* rsp */ - case RAB_OPERAND_rsp_rs: - self->word = RAB_INSTR_PACK_rs(self->word, 0); - break; - - case RAB_OPERAND_rsp_rt: - self->word = RAB_INSTR_PACK_rt(self->word, 0); - break; - - case RAB_OPERAND_rsp_rd: - self->word = RAB_INSTR_PACK_rd(self->word, 0); - break; - - case RAB_OPERAND_rsp_cop0d: - self->word = RAB_INSTR_PACK_cop0d(self->word, 0); - break; - - case RAB_OPERAND_rsp_cop2t: - self->word = RAB_INSTR_RSP_PACK_cop2t(self->word, 0); - break; - - case RAB_OPERAND_rsp_cop2cd: - self->word = RAB_INSTR_RSP_PACK_cop2cd(self->word, 0); - break; - - case RAB_OPERAND_rsp_vs: - self->word = RAB_INSTR_RSP_PACK_vs(self->word, 0); - break; - - case RAB_OPERAND_rsp_vt: - self->word = RAB_INSTR_RSP_PACK_vt(self->word, 0); - break; - - case RAB_OPERAND_rsp_vd: - self->word = RAB_INSTR_RSP_PACK_vd(self->word, 0); - break; - - case RAB_OPERAND_rsp_vt_elementhigh: - self->word = RAB_INSTR_RSP_PACK_vt(self->word, 0); - self->word = RAB_INSTR_RSP_PACK_elementhigh(self->word, 0); - break; - - case RAB_OPERAND_rsp_vt_elementlow: - self->word = RAB_INSTR_RSP_PACK_vt(self->word, 0); - self->word = RAB_INSTR_RSP_PACK_elementlow(self->word, 0); - break; - - case RAB_OPERAND_rsp_vd_de: - self->word = RAB_INSTR_RSP_PACK_vd(self->word, 0); - self->word = RAB_INSTR_RSP_PACK_de(self->word, 0); - break; - - case RAB_OPERAND_rsp_vs_index: - self->word = RAB_INSTR_RSP_PACK_vs(self->word, 0); - self->word = RAB_INSTR_RSP_PACK_index(self->word, 0); - break; - - case RAB_OPERAND_rsp_offset_rs: - self->word = RAB_INSTR_RSP_PACK_offset(self->word, 0); - self->word = RAB_INSTR_PACK_rs(self->word, 0); - break; - - case RAB_OPERAND_rsp_immediate_base: - self->word = RAB_INSTR_PACK_rs(self->word, 0); - self->word = RAB_INSTR_PACK_immediate(self->word, 0); - break; - /* rsp */ - - /* r5900 */ - case RAB_OPERAND_r5900_I: - case RAB_OPERAND_r5900_Q: - case RAB_OPERAND_r5900_R: - case RAB_OPERAND_r5900_ACC: - // Not real registers encoded on the instruction itself - break; - - case RAB_OPERAND_r5900_ACCxyzw: - self->word = RAB_INSTR_R5900_PACK_xyzw_x(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_y(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_z(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_w(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfs: - self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0); - break; - - case RAB_OPERAND_r5900_vft: - self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfd: - self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfsxyzw: - self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_x(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_y(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_z(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_w(self->word, 0); - break; - - case RAB_OPERAND_r5900_vftxyzw: - self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_x(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_y(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_z(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_w(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfdxyzw: - self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_x(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_y(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_z(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_w(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfsn: - self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_n(self->word, 0); - break; - - case RAB_OPERAND_r5900_vftn: - self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_n(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfdn: - self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_n(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfsl: - self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_l(self->word, 0); - break; - - case RAB_OPERAND_r5900_vftl: - self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_l(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfdl: - self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_l(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfsm: - self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_m(self->word, 0); - break; - - case RAB_OPERAND_r5900_vftm: - self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_m(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfdm: - self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_m(self->word, 0); - break; - - case RAB_OPERAND_r5900_vis: - self->word = RAB_INSTR_R5900_PACK_vis(self->word, 0); - break; - - case RAB_OPERAND_r5900_vit: - self->word = RAB_INSTR_R5900_PACK_vit(self->word, 0); - break; - - case RAB_OPERAND_r5900_vid: - self->word = RAB_INSTR_R5900_PACK_vid(self->word, 0); - break; - - case RAB_OPERAND_r5900_vis_predecr: - self->word = RAB_INSTR_R5900_PACK_vis(self->word, 0); - break; - - case RAB_OPERAND_r5900_vit_predecr: - self->word = RAB_INSTR_R5900_PACK_vit(self->word, 0); - break; - - case RAB_OPERAND_r5900_vid_predecr: - self->word = RAB_INSTR_R5900_PACK_vid(self->word, 0); - break; - - case RAB_OPERAND_r5900_vis_postincr: - self->word = RAB_INSTR_R5900_PACK_vis(self->word, 0); - break; - - case RAB_OPERAND_r5900_vit_postincr: - self->word = RAB_INSTR_R5900_PACK_vit(self->word, 0); - break; - - case RAB_OPERAND_r5900_vid_postincr: - self->word = RAB_INSTR_R5900_PACK_vid(self->word, 0); - break; - - case RAB_OPERAND_r5900_immediate5: - self->word = RAB_INSTR_R5900_PACK_imm5(self->word, 0); - break; - /* r5900 */ - - case RAB_OPERAND_ALL_INVALID: - case RAB_OPERAND_ALL_MAX: - assert(self->descriptor->operands[i] != RAB_OPERAND_ALL_INVALID && self->descriptor->operands[i] != RAB_OPERAND_ALL_MAX); - break; - } - } -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c deleted file mode 100644 index 3f94401c..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c +++ /dev/null @@ -1,986 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstruction.h" -#include "instructions/RabbitizerInstructionRsp.h" -#include "instructions/RabbitizerInstructionR5900.h" - -#include -#include -#include - -#include "common/Utils.h" -#include "common/RabbitizerConfig.h" -#include "instructions/RabbitizerRegister.h" -#include "instructions/RabbitizerInstrSuffix.h" - -typedef size_t (*OperandCallback)(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength); - -size_t RabbitizerOperandType_process_cpu_rs(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameGpr(RAB_INSTR_GET_rs(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_rt(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameGpr(RAB_INSTR_GET_rt(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_rd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameGpr(RAB_INSTR_GET_rd(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_zero(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, - UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameGpr(0); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_cop0d(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameCop0(RAB_INSTR_GET_cop0d(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_fs(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameCop1(RAB_INSTR_GET_fs(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_ft(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameCop1(RAB_INSTR_GET_ft(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_fd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameCop1(RAB_INSTR_GET_fd(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_cop1cs(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameCop1Control(RAB_INSTR_GET_cop1cs(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_cop2t(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameCop2(RAB_INSTR_GET_cop2t(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_sa(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - -// TODO: consider making this a proper configuration -#if 0 - if (RAB_INSTR_GET_sa(self) < 10) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", RAB_INSTR_GET_sa(self)); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%x", RAB_INSTR_GET_sa(self)); - } -#endif - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", RAB_INSTR_GET_sa(self)); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_op(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - -// TODO: consider making this a proper configuration -#if 0 - if (RAB_INSTR_GET_op(self) < 10) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", RAB_INSTR_GET_op(self)); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%x", RAB_INSTR_GET_op(self)); - } -#endif - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%02X", RAB_INSTR_GET_op(self)); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_code(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - int code = RAB_INSTR_GET_code_upper(self); - int lower = RAB_INSTR_GET_code_lower(self); - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", code); - if (lower) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, ", %i", lower); - } - - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_code_lower(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, - UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - int code_lower = RAB_INSTR_GET_code_lower(self); - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", code_lower); - - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_copraw(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%X", RAB_INSTR_GET_copraw(self)); - - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_label(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - if ((immOverride != NULL) && (immOverrideLength > 0)) { - memcpy(dst, immOverride, immOverrideLength); - return immOverrideLength; - } - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "func_%06X", RabbitizerInstruction_getInstrIndexAsVram(self)); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_immediate(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - int32_t number; - - if ((immOverride != NULL) && (immOverrideLength > 0)) { - memcpy(dst, immOverride, immOverrideLength); - return immOverrideLength; - } - - number = RabbitizerInstruction_getProcessedImmediate(self); - if (RabbitizerConfig_Cfg.misc.omit0XOnSmallImm) { - if (number > -10 && number < 10) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", number); - return totalSize; - } - } - if (number < 0) { - if (RabbitizerConfig_Cfg.misc.upperCaseImm) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "-0x%X", -number); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "-0x%x", -number); - } - } else { - if (RabbitizerConfig_Cfg.misc.upperCaseImm) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%X", number); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%x", number); - } - } - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_branch_target_label(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - if ((immOverride != NULL) && (immOverrideLength > 0)) { - memcpy(dst, immOverride, immOverrideLength); - return immOverrideLength; - } - - RABUTILS_BUFFER_CPY(dst, totalSize, ". + 4 + ("); - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_cpu_immediate(self, dst, NULL, 0)); - RABUTILS_BUFFER_CPY(dst, totalSize, " << 2)"); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_immediate_base(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - -// TODO: consider making this a proper configuration -#if 0 - if ((immOverride != NULL) && (immOverrideLength > 0) || RAB_INSTR_GET_immediate(self) != 0) { - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_cpu_immediate(self, dst, immOverride, immOverrideLength)); - } -#endif - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_cpu_immediate(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_cpu_rs(self, dst, immOverride, immOverrideLength)); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_rs(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspGpr(RAB_INSTR_GET_rs(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_rt(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspGpr(RAB_INSTR_GET_rt(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_rd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspGpr(RAB_INSTR_GET_rd(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_cop0d(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspCop0(RAB_INSTR_GET_cop0d(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_cop2t(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspCop2(RAB_INSTR_RSP_GET_cop2t(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_cop2cd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspCop2Control(RAB_INSTR_RSP_GET_cop2cd(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_vs(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspVector(RAB_INSTR_RSP_GET_vs(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_vt(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspVector(RAB_INSTR_RSP_GET_vt(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_vd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspVector(RAB_INSTR_RSP_GET_vd(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_vt_elementhigh(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t element; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_rsp_vt(self, dst, immOverride, immOverrideLength)); - - element = RAB_INSTR_RSP_GET_elementhigh(self); - if (element != 0) { - if ((element & 0x8) == 0x8) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", element & 7); - } else if ((element & 0xC) == 0x4) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%ih]", element & (~0xC)); - } else if ((element & 0xE) == 0x2) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%iq]", element & (~0xE)); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", element); - } - } - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_vt_elementlow(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_rsp_vt(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", RAB_INSTR_RSP_GET_elementlow(self)); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_vd_de(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t de; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_rsp_vd(self, dst, immOverride, immOverrideLength)); - - de = RAB_INSTR_RSP_GET_de(self); - if ((de & 0x8) == 0x8) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", de & (~0x8)); - } else if ((de & 0xC) == 0x4) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%ih]", de & (~0xC)); - } else if ((de & 0xE) == 0x2) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%iq]", de & (~0xE)); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", de); - } - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_vs_index(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_rsp_vs(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", RAB_INSTR_RSP_GET_index(self)); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_offset_rs(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%X", RabbitizerInstructionRsp_GetOffsetVector(self)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_rsp_rs(self, dst, immOverride, immOverrideLength)); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_immediate_base(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - -// TODO: consider making this a proper configuration -#if 0 - if ((immOverride != NULL) && (immOverrideLength > 0) || RAB_INSTR_GET_immediate(self) != 0) { - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_cpu_immediate(self, dst, immOverride, immOverrideLength)); - } -#endif - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_cpu_immediate(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_rsp_rs(self, dst, immOverride, immOverrideLength)); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_I(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, - UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_CPY(dst, totalSize, "$I"); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_Q(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, - UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_CPY(dst, totalSize, "$Q"); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_R(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, - UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_CPY(dst, totalSize, "$R"); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_ACC(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, - UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_CPY(dst, totalSize, "$ACC"); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_ACCxyzw(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_ACC(self, dst, immOverride, immOverrideLength)); - -#if 0 - if (RAB_INSTR_R5900_GET_xyzw_x(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x'); - } - if (RAB_INSTR_R5900_GET_xyzw_y(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y'); - } - if (RAB_INSTR_R5900_GET_xyzw_z(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z'); - } - if (RAB_INSTR_R5900_GET_xyzw_w(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w'); - } -#endif - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfs(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameR5900VF(RAB_INSTR_R5900_GET_vfs(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vft(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameR5900VF(RAB_INSTR_R5900_GET_vft(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameR5900VF(RAB_INSTR_R5900_GET_vfd(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfsxyzw(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfs(self, dst, immOverride, immOverrideLength)); - -#if 0 - if (RAB_INSTR_R5900_GET_xyzw_x(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x'); - } - if (RAB_INSTR_R5900_GET_xyzw_y(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y'); - } - if (RAB_INSTR_R5900_GET_xyzw_z(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z'); - } - if (RAB_INSTR_R5900_GET_xyzw_w(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w'); - } -#endif - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vftxyzw(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vft(self, dst, immOverride, immOverrideLength)); - -#if 0 - if (RAB_INSTR_R5900_GET_xyzw_x(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x'); - } - if (RAB_INSTR_R5900_GET_xyzw_y(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y'); - } - if (RAB_INSTR_R5900_GET_xyzw_z(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z'); - } - if (RAB_INSTR_R5900_GET_xyzw_w(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w'); - } -#endif - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfdxyzw(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfd(self, dst, immOverride, immOverrideLength)); - -#if 0 - if (RAB_INSTR_R5900_GET_xyzw_x(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x'); - } - if (RAB_INSTR_R5900_GET_xyzw_y(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y'); - } - if (RAB_INSTR_R5900_GET_xyzw_z(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z'); - } - if (RAB_INSTR_R5900_GET_xyzw_w(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w'); - } -#endif - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfsn(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfs(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_n(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vftn(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vft(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_n(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfdn(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfd(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_n(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfsl(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfs(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_l(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vftl(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vft(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_l(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfdl(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfd(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_l(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfsm(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfs(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_m(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vftm(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vft(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_m(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfdm(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfd(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_m(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vis(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameR5900VI(RAB_INSTR_R5900_GET_vis(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vit(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameR5900VI(RAB_INSTR_R5900_GET_vit(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vid(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameR5900VI(RAB_INSTR_R5900_GET_vid(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vis_predecr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-'); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vis(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vit_predecr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-'); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vit(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vid_predecr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-'); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vid(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vis_postincr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vis(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vit_postincr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vit(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vid_postincr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vid(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_immediate5(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - int32_t number; - - if ((immOverride != NULL) && (immOverrideLength > 0)) { - memcpy(dst, immOverride, immOverrideLength); - return immOverrideLength; - } - - number = RAB_INSTR_R5900_GET_imm5(self); - if (RabbitizerConfig_Cfg.misc.omit0XOnSmallImm) { - if (number > -10 && number < 10) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", number); - return totalSize; - } - } - if (number < 0) { - if (RabbitizerConfig_Cfg.misc.upperCaseImm) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "-0x%X", -number); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "-0x%x", -number); - } - } else { - if (RabbitizerConfig_Cfg.misc.upperCaseImm) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%X", number); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%x", number); - } - } - return totalSize; -} - -#define RAB_DEF_OPERAND(prefix, operand) [RAB_OPERAND_##prefix##_##operand] = RabbitizerOperandType_process_##prefix##_##operand, - -const OperandCallback instrOpercandCallbacks[] = { -#include "instructions/operands/RabbitizerOperandType_cpu.inc" -#include "instructions/operands/RabbitizerOperandType_rsp.inc" -#include "instructions/operands/RabbitizerOperandType_r5900.inc" -}; - -#undef RAB_DEF_OPERAND - -size_t RabbitizerInstruction_getSizeForBufferOperandsDisasm(const RabbitizerInstruction *self, size_t immOverrideLength) { - size_t totalSize = 0; - char auxBuffer[0x100] = { 0 }; - char immOverride[0x100] = { 0 }; - - for (size_t i = 0; i < ARRAY_COUNT(self->descriptor->operands) && self->descriptor->operands[i] != RAB_OPERAND_ALL_INVALID; i++) { - RabbitizerOperandType operand; - OperandCallback callback; - - if (i != 0) { - totalSize += 2; - } - - operand = self->descriptor->operands[i]; - assert(operand > RAB_OPERAND_ALL_INVALID); - assert(operand < RAB_OPERAND_ALL_MAX); - - callback = instrOpercandCallbacks[operand]; - assert(callback != NULL); - totalSize += callback(self, auxBuffer, immOverride, immOverrideLength); - } - - return totalSize; -} - -size_t RabbitizerInstruction_disassembleOperands(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - for (size_t i = 0; i < ARRAY_COUNT(self->descriptor->operands) && self->descriptor->operands[i] != RAB_OPERAND_ALL_INVALID; i++) { - RabbitizerOperandType operand; - OperandCallback callback; - - if (i != 0) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ','); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ' '); - } - - operand = self->descriptor->operands[i]; - assert(operand > RAB_OPERAND_ALL_INVALID); - assert(operand < RAB_OPERAND_ALL_MAX); - - callback = instrOpercandCallbacks[operand]; - assert(callback != NULL); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, callback(self, dst, immOverride, immOverrideLength)); - } - - *dst = '\0'; - return totalSize; -} - -size_t RabbitizerInstruction_getSizeForBufferInstrDisasm(const RabbitizerInstruction *self, size_t immOverrideLength, int extraLJust) { - size_t totalSize = 0; - size_t opcodeNameLength; - - opcodeNameLength = strlen(RabbitizerInstrId_getOpcodeName(self->uniqueId)); - - totalSize += opcodeNameLength; - - totalSize += RabbitizerInstrSuffix_getSizeForBuffer(self, self->descriptor->instrSuffix); - - if (self->descriptor->operands[0] == RAB_OPERAND_ALL_INVALID) { - // There are no operands - return totalSize; - } - - if (RabbitizerConfig_Cfg.misc.opcodeLJust > 0) { - totalSize += RabbitizerConfig_Cfg.misc.opcodeLJust; - } - if (extraLJust > 0) { - totalSize += extraLJust; - } - totalSize++; - - totalSize += RabbitizerInstruction_getSizeForBufferOperandsDisasm(self, immOverrideLength); - - return totalSize; -} - -size_t RabbitizerInstruction_disassembleInstruction(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength, - int extraLJust) { - size_t totalSize = 0; - const char *opcodeName = RabbitizerInstrId_getOpcodeName(self->uniqueId); - - RABUTILS_BUFFER_CPY(dst, totalSize, opcodeName); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerInstrSuffix_processSuffix(self, dst, self->descriptor->instrSuffix)); - - if (self->descriptor->operands[0] == RAB_OPERAND_ALL_INVALID) { - // There are no operands - *dst = '\0'; - return totalSize; - } - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerUtils_CharFill(dst, RabbitizerConfig_Cfg.misc.opcodeLJust + extraLJust - totalSize, ' ')); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ' '); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerInstruction_disassembleOperands(self, dst, immOverride, immOverrideLength)); - - *dst = '\0'; - return totalSize; -} - -size_t RabbitizerInstruction_getSizeForBufferDataDisasm(UNUSED const RabbitizerInstruction *self, int extraLJust) { - size_t totalSize = 0; - - totalSize += strlen(".word"); - totalSize += RabbitizerConfig_Cfg.misc.opcodeLJust + extraLJust; - totalSize += 11; - return totalSize; -} - -size_t RabbitizerInstruction_disassembleAsData(const RabbitizerInstruction *self, char *dst, int extraLJust) { - size_t totalSize = 0; - - RABUTILS_BUFFER_CPY(dst, totalSize, ".word"); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerUtils_CharFill(dst, RabbitizerConfig_Cfg.misc.opcodeLJust + extraLJust - totalSize, ' ')); - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, " 0x%08X", RabbitizerInstruction_getRaw(self)); - return totalSize; -} - -bool RabbitizerInstruction_mustDisasmAsData(const RabbitizerInstruction *self) { - if (RabbitizerConfig_Cfg.toolchainTweaks.sn64DivFix) { - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_break) { - return true; - } - } - - if (!RabbitizerInstruction_isValid(self)) { - return true; - } - return false; -} - -size_t RabbitizerInstruction_getSizeForBuffer(const RabbitizerInstruction *self, size_t immOverrideLength, int extraLJust) { - if (!RabbitizerInstruction_isImplemented(self) || RabbitizerInstruction_mustDisasmAsData(self)) { - size_t totalSize = RabbitizerInstruction_getSizeForBufferDataDisasm(self, extraLJust); - - if (RabbitizerConfig_Cfg.misc.unknownInstrComment) { - totalSize += 40; - totalSize += 3; - totalSize += RabbitizerInstruction_getSizeForBufferInstrDisasm(self, immOverrideLength, extraLJust); - totalSize += 11; - } - return totalSize; - } - - return RabbitizerInstruction_getSizeForBufferInstrDisasm(self, immOverrideLength, extraLJust); -} - -size_t RabbitizerInstruction_disassemble(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength, int extraLJust) { - assert(dst != NULL); - - if (!RabbitizerInstruction_isImplemented(self) || RabbitizerInstruction_mustDisasmAsData(self)) { - size_t totalSize = 0; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerInstruction_disassembleAsData(self, dst, extraLJust)); - - if (RabbitizerConfig_Cfg.misc.unknownInstrComment) { - uint32_t validBits; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerUtils_CharFill(dst, 40 - totalSize, ' ')); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ' '); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '#'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ' '); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerInstruction_disassembleInstruction(self, dst, immOverride, immOverrideLength, extraLJust)); - - validBits = RabbitizerInstruction_getValidBits(self); - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, " # %08X", ((~validBits) & self->word)); - } - - return totalSize; - } - - return RabbitizerInstruction_disassembleInstruction(self, dst, immOverride, immOverrideLength, extraLJust); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c deleted file mode 100644 index 136e4aa6..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c +++ /dev/null @@ -1,840 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstruction.h" - -#include - -#include "common/RabbitizerConfig.h" -#include "instructions/RabbitizerInstructionRsp.h" -#include "instructions/RabbitizerInstructionR5900.h" -#include "instructions/RabbitizerRegister.h" - -bool RabbitizerInstruction_isImplemented(const RabbitizerInstruction *self) { - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_cpu_INVALID: - case RABBITIZER_INSTR_ID_rsp_INVALID: - case RABBITIZER_INSTR_ID_r5900_INVALID: - return false; - - default: - return true; - } -} - -bool RabbitizerInstruction_isLikelyHandwritten(const RabbitizerInstruction *self) { - if (self->_handwrittenCategory) { - return true; - } - - if (RabbitizerInstrDescriptor_isIType(self->descriptor) && !RabbitizerInstrDescriptor_isFloat(self->descriptor)) { - if (RAB_INSTR_GET_rs(self) == RABBITIZER_REG_GPR_O32_k0 || RAB_INSTR_GET_rs(self) == RABBITIZER_REG_GPR_O32_k1) { - return true; - } - if (RAB_INSTR_GET_rt(self) == RABBITIZER_REG_GPR_O32_k0 || RAB_INSTR_GET_rt(self) == RABBITIZER_REG_GPR_O32_k1) { - return true; - } - } - - if (RabbitizerInstrDescriptor_notEmitedByCompilers(self->descriptor)) { - return true; - } - - return false; -} - -bool RabbitizerInstruction_isNop(const RabbitizerInstruction *self) { - return self->word == 0; -} - -bool RabbitizerInstruction_isUnconditionalBranch(const RabbitizerInstruction *self) { - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_b) { - return true; - } - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_beq && RAB_INSTR_GET_rt(self) == 0 && RAB_INSTR_GET_rs(self) == 0) { - return true; - } - if (RabbitizerConfig_Cfg.toolchainTweaks.treatJAsUnconditionalBranch && self->uniqueId == RABBITIZER_INSTR_ID_cpu_j) { - return true; - } - return false; -} - -bool RabbitizerInstruction_isJrRa(const RabbitizerInstruction *self) { - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_jr) { - // TODO: abi stuffs - return RAB_INSTR_GET_rs(self) == RABBITIZER_REG_GPR_O32_ra; - } - return false; -} - -bool RabbitizerInstruction_isJrNotRa(const RabbitizerInstruction *self) { - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_jr) { - // TODO: abi stuffs - return RAB_INSTR_GET_rs(self) != RABBITIZER_REG_GPR_O32_ra; - } - return false; -} - -bool RabbitizerInstruction_hasDelaySlot(const RabbitizerInstruction *self) { - return RabbitizerInstrDescriptor_isBranch(self->descriptor) || RabbitizerInstrDescriptor_isJump(self->descriptor); -} - -const char *RabbitizerInstruction_mapInstrToType(const RabbitizerInstruction *self) { - if (RabbitizerInstrDescriptor_isDouble(self->descriptor)) { - return "f64"; - } - if (RabbitizerInstrDescriptor_isFloat(self->descriptor)) { - return "f32"; - } - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_lwu) { - return "u32"; - } - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_lh || self->uniqueId == RABBITIZER_INSTR_ID_cpu_sh) { - return "s16"; - } - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_lhu) { - return "u16"; - } - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_lb || self->uniqueId == RABBITIZER_INSTR_ID_cpu_sb) { - return "s8"; - } - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_lbu) { - return "u8"; - } - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_ld || self->uniqueId == RABBITIZER_INSTR_ID_cpu_sd) { - return "s64"; - } - return NULL; -} - -bool RabbitizerInstruction_sameOpcode(const RabbitizerInstruction *self, const RabbitizerInstruction *other) { - if (!RabbitizerInstruction_isImplemented(self) || !RabbitizerInstruction_isImplemented(other)) { - return false; - } - return self->uniqueId == other->uniqueId; -} - -bool RabbitizerInstruction_sameOpcodeButDifferentArguments(const RabbitizerInstruction *self, const RabbitizerInstruction *other) { - if (!RabbitizerInstruction_sameOpcode(self, other)) { - return false; - } - return RabbitizerInstruction_getRaw(self) != RabbitizerInstruction_getRaw(other); -} - -bool RabbitizerInstruction_hasOperand(const RabbitizerInstruction *self, RabbitizerOperandType operand) { - size_t i; - - for (i = 0; i < ARRAY_COUNT(self->descriptor->operands) && self->descriptor->operands[i] != RAB_OPERAND_ALL_INVALID; i++) { - if (self->descriptor->operands[i] == operand) { - return true; - } - } - - return false; -} - -bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, RabbitizerOperandType operand) { - switch (operand) { - case RAB_OPERAND_cpu_rs: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_cpu_immediate_base)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_rs)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_offset_rs)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_immediate_base)) { - return true; - } - break; - - case RAB_OPERAND_cpu_immediate: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_cpu_immediate_base)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_cpu_branch_target_label)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_immediate_base)) { - return true; - } - break; - - case RAB_OPERAND_cpu_rt: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_rt)) { - return true; - } - break; - - case RAB_OPERAND_cpu_rd: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_rd)) { - return true; - } - break; - - case RAB_OPERAND_cpu_sa: - case RAB_OPERAND_cpu_zero: - // case RAB_OPERAND_cpu_function: - case RAB_OPERAND_cpu_cop0d: - case RAB_OPERAND_cpu_fs: - case RAB_OPERAND_cpu_ft: - case RAB_OPERAND_cpu_fd: - case RAB_OPERAND_cpu_cop1cs: - case RAB_OPERAND_cpu_cop2t: - case RAB_OPERAND_cpu_op: - case RAB_OPERAND_cpu_code: - case RAB_OPERAND_cpu_code_lower: - case RAB_OPERAND_cpu_copraw: - case RAB_OPERAND_cpu_label: - break; - - case RAB_OPERAND_cpu_branch_target_label: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_cpu_immediate)) { - return true; - } - break; - - case RAB_OPERAND_cpu_immediate_base: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_cpu_rs)) { - return true; - } - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_cpu_immediate)) { - return true; - } - break; - - /* rsp */ - case RAB_OPERAND_rsp_rs: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_cpu_rs)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_offset_rs)) { - return true; - } - break; - - case RAB_OPERAND_rsp_rt: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_cpu_rt)) { - return true; - } - break; - - case RAB_OPERAND_rsp_rd: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_cpu_rd)) { - return true; - } - break; - - case RAB_OPERAND_rsp_cop0d: - case RAB_OPERAND_rsp_cop2t: - case RAB_OPERAND_rsp_cop2cd: - break; - - // case RAB_OPERAND_rsp_elementhigh: - // case RAB_OPERAND_rsp_elementlow: - // case RAB_OPERAND_rsp_index: - // case RAB_OPERAND_rsp_offset: - - case RAB_OPERAND_rsp_vs: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_vs_index)) { - return true; - } - break; - - case RAB_OPERAND_rsp_vt: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_vt_elementhigh)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_vt_elementlow)) { - return true; - } - break; - - case RAB_OPERAND_rsp_vd: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_vd_de)) { - return true; - } - break; - - case RAB_OPERAND_rsp_vt_elementhigh: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_rsp_vt)) { - return true; - } - break; - - case RAB_OPERAND_rsp_vt_elementlow: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_rsp_vt)) { - return true; - } - break; - - case RAB_OPERAND_rsp_vd_de: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_rsp_vd)) { - return true; - } - break; - - case RAB_OPERAND_rsp_vs_index: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_rsp_vs)) { - return true; - } - break; - - case RAB_OPERAND_rsp_offset_rs: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_rsp_rs)) { - return true; - } - break; - - case RAB_OPERAND_rsp_immediate_base: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_rsp_rs)) { - return true; - } - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_cpu_rs)) { - return true; - } - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_cpu_immediate)) { - return true; - } - break; - /* rsp */ - - /* r5900 */ - case RAB_OPERAND_r5900_I: - case RAB_OPERAND_r5900_Q: - case RAB_OPERAND_r5900_R: - break; - - case RAB_OPERAND_r5900_ACC: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_ACCxyzw)) { - return true; - } - break; - - case RAB_OPERAND_r5900_ACCxyzw: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_ACC)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfs: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfsxyzw)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfsn)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfsl)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfsm)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vft: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vftxyzw)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vftn)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vftl)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vftm)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfd: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfdxyzw)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfdn)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfdl)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfdm)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfsxyzw: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfs)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfsn)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vftxyzw: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vft)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vftn)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfdxyzw: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfd)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfdn)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfsn: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfs)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfsxyzw)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vftn: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vft)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vftxyzw)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfdn: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfd)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfdxyzw)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfsl: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vfs)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vftl: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vft)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfdl: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vfd)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfsm: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vfs)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vftm: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vft)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfdm: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vfd)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vis: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vis_predecr)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vis_postincr)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vit: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vit_predecr)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vit_postincr)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vid: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vid_predecr)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vid_postincr)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vis_predecr: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vis)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vit_predecr: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vit)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vid_predecr: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vid)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vis_postincr: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vis)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vit_postincr: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vit)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vid_postincr: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vid)) { - return true; - } - break; - - case RAB_OPERAND_r5900_immediate5: - break; - /* r5900 */ - - case RAB_OPERAND_ALL_INVALID: - case RAB_OPERAND_ALL_MAX: - assert(operand != RAB_OPERAND_ALL_INVALID && operand != RAB_OPERAND_ALL_MAX); - break; - } - - return RabbitizerInstruction_hasOperand(self, operand); -} - -uint32_t RabbitizerInstruction_getValidBits(const RabbitizerInstruction *self) { - size_t i; - uint32_t validbits; - - validbits = self->_mandatorybits; - - for (i = 0; i < ARRAY_COUNT(self->descriptor->operands) && self->descriptor->operands[i] != RAB_OPERAND_ALL_INVALID; i++) { - - switch (self->descriptor->operands[i]) { - case RAB_OPERAND_cpu_rs: - validbits = RAB_INSTR_PACK_rs(validbits, ~0); - break; - - case RAB_OPERAND_cpu_rt: - validbits = RAB_INSTR_PACK_rt(validbits, ~0); - break; - - case RAB_OPERAND_cpu_rd: - validbits = RAB_INSTR_PACK_rd(validbits, ~0); - break; - - case RAB_OPERAND_cpu_sa: - validbits = RAB_INSTR_PACK_sa(validbits, ~0); - break; - - case RAB_OPERAND_cpu_zero: - break; - - case RAB_OPERAND_cpu_cop0d: - validbits = RAB_INSTR_PACK_cop0d(validbits, ~0); - break; - - case RAB_OPERAND_cpu_fs: - validbits = RAB_INSTR_PACK_fs(validbits, ~0); - break; - - case RAB_OPERAND_cpu_ft: - validbits = RAB_INSTR_PACK_ft(validbits, ~0); - break; - - case RAB_OPERAND_cpu_fd: - validbits = RAB_INSTR_PACK_fd(validbits, ~0); - break; - - case RAB_OPERAND_cpu_cop1cs: - validbits = RAB_INSTR_PACK_cop1cs(validbits, ~0); - break; - - case RAB_OPERAND_cpu_cop2t: - validbits = RAB_INSTR_PACK_cop2t(validbits, ~0); - break; - - case RAB_OPERAND_cpu_op: - validbits = RAB_INSTR_PACK_op(validbits, ~0); - break; - - case RAB_OPERAND_cpu_code: - validbits = RAB_INSTR_PACK_code(validbits, ~0); - break; - - case RAB_OPERAND_cpu_code_lower: - validbits = RAB_INSTR_PACK_code_lower(validbits, ~0); - break; - - case RAB_OPERAND_cpu_copraw: - validbits = RAB_INSTR_PACK_copraw(validbits, ~0); - break; - - case RAB_OPERAND_cpu_label: - validbits = RAB_INSTR_PACK_instr_index(validbits, ~0); - break; - - case RAB_OPERAND_cpu_immediate: - validbits = RAB_INSTR_PACK_immediate(validbits, ~0); - break; - - case RAB_OPERAND_cpu_branch_target_label: - validbits = RAB_INSTR_PACK_immediate(validbits, ~0); - break; - - case RAB_OPERAND_cpu_immediate_base: - validbits = RAB_INSTR_PACK_immediate(validbits, ~0); - validbits = RAB_INSTR_PACK_rs(validbits, ~0); - break; - - /* rsp */ - case RAB_OPERAND_rsp_rs: - validbits = RAB_INSTR_PACK_rs(validbits, ~0); - break; - - case RAB_OPERAND_rsp_rt: - validbits = RAB_INSTR_PACK_rt(validbits, ~0); - break; - - case RAB_OPERAND_rsp_rd: - validbits = RAB_INSTR_PACK_rd(validbits, ~0); - break; - - case RAB_OPERAND_rsp_cop0d: - validbits = RAB_INSTR_PACK_cop0d(validbits, ~0); - break; - - case RAB_OPERAND_rsp_cop2t: - validbits = RAB_INSTR_RSP_PACK_cop2t(validbits, ~0); - break; - - case RAB_OPERAND_rsp_cop2cd: - validbits = RAB_INSTR_RSP_PACK_cop2cd(validbits, ~0); - break; - - case RAB_OPERAND_rsp_vs: - validbits = RAB_INSTR_RSP_PACK_vs(validbits, ~0); - break; - - case RAB_OPERAND_rsp_vt: - validbits = RAB_INSTR_RSP_PACK_vt(validbits, ~0); - break; - - case RAB_OPERAND_rsp_vd: - validbits = RAB_INSTR_RSP_PACK_vd(validbits, ~0); - break; - - case RAB_OPERAND_rsp_vt_elementhigh: - validbits = RAB_INSTR_RSP_PACK_vt(validbits, ~0); - validbits = RAB_INSTR_RSP_PACK_elementhigh(validbits, ~0); - break; - - case RAB_OPERAND_rsp_vt_elementlow: - validbits = RAB_INSTR_RSP_PACK_vt(validbits, ~0); - validbits = RAB_INSTR_RSP_PACK_elementlow(validbits, ~0); - break; - - case RAB_OPERAND_rsp_vd_de: - validbits = RAB_INSTR_RSP_PACK_vd(validbits, ~0); - validbits = RAB_INSTR_RSP_PACK_de(validbits, ~0); - break; - - case RAB_OPERAND_rsp_vs_index: - validbits = RAB_INSTR_RSP_PACK_vs(validbits, ~0); - validbits = RAB_INSTR_RSP_PACK_index(validbits, ~0); - break; - - case RAB_OPERAND_rsp_offset_rs: - validbits = RAB_INSTR_RSP_PACK_offset(validbits, ~0); - validbits = RAB_INSTR_PACK_rs(validbits, ~0); - break; - - case RAB_OPERAND_rsp_immediate_base: - validbits = RAB_INSTR_PACK_immediate(validbits, ~0); - validbits = RAB_INSTR_PACK_rs(validbits, ~0); - break; - /* rsp */ - - /* r5900 */ - case RAB_OPERAND_r5900_I: - case RAB_OPERAND_r5900_Q: - case RAB_OPERAND_r5900_R: - case RAB_OPERAND_r5900_ACC: - // Not real registers encoded on the instruction itself - break; - - case RAB_OPERAND_r5900_ACCxyzw: - validbits = RAB_INSTR_R5900_PACK_xyzw_x(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_y(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_z(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_w(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfs: - validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vft: - validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfd: - validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfsxyzw: - validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_x(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_y(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_z(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_w(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vftxyzw: - validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_x(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_y(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_z(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_w(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfdxyzw: - validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_x(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_y(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_z(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_w(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfsn: - validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_n(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vftn: - validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_n(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfdn: - validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_n(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfsl: - validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_l(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vftl: - validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_l(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfdl: - validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_l(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfsm: - validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_m(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vftm: - validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_m(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfdm: - validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_m(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vis: - validbits = RAB_INSTR_R5900_PACK_vis(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vit: - validbits = RAB_INSTR_R5900_PACK_vit(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vid: - validbits = RAB_INSTR_R5900_PACK_vid(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vis_predecr: - validbits = RAB_INSTR_R5900_PACK_vis(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vit_predecr: - validbits = RAB_INSTR_R5900_PACK_vit(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vid_predecr: - validbits = RAB_INSTR_R5900_PACK_vid(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vis_postincr: - validbits = RAB_INSTR_R5900_PACK_vis(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vit_postincr: - validbits = RAB_INSTR_R5900_PACK_vit(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vid_postincr: - validbits = RAB_INSTR_R5900_PACK_vid(validbits, ~0); - break; - - case RAB_OPERAND_r5900_immediate5: - validbits = RAB_INSTR_R5900_PACK_imm5(validbits, ~0); - break; - /* r5900 */ - - case RAB_OPERAND_ALL_INVALID: - case RAB_OPERAND_ALL_MAX: - assert(self->descriptor->operands[i] != RAB_OPERAND_ALL_INVALID && self->descriptor->operands[i] != RAB_OPERAND_ALL_MAX); - break; - } - } - - return validbits; -} - -bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self) { - uint32_t validbits; - - validbits = RabbitizerInstruction_getValidBits(self); - - return ((~validbits) & self->word) == 0; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c deleted file mode 100644 index 0d71c6dd..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c +++ /dev/null @@ -1,319 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstruction.h" - -#include "common/RabbitizerConfig.h" -#include "instructions/RabbitizerRegister.h" - -#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \ - case (caseBits): \ - self->uniqueId = RABBITIZER_INSTR_ID_##prefix##_##name; \ - break; -#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__) - -void RabbitizerInstruction_processUniqueId_Normal(RabbitizerInstruction *self) { - uint32_t opcode = RAB_INSTR_GET_opcode(self); - - self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode); - - switch (opcode) { -#include "instructions/instr_id/cpu/cpu_normal.inc" - } - - if (RabbitizerConfig_Cfg.pseudos.enablePseudos) { - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_cpu_beq: - if (RAB_INSTR_GET_rt(self) == 0) { - if (RAB_INSTR_GET_rs(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoB) { - self->uniqueId = RABBITIZER_INSTR_ID_cpu_b; - } - } else { - if (RabbitizerConfig_Cfg.pseudos.pseudoBeqz) { - self->uniqueId = RABBITIZER_INSTR_ID_cpu_beqz; - } - } - } - break; - - case RABBITIZER_INSTR_ID_cpu_bne: - if (RAB_INSTR_GET_rt(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoBnez) { - self->uniqueId = RABBITIZER_INSTR_ID_cpu_bnez; - } - } - break; - - default: - break; - } - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstruction_processUniqueId_Special(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/cpu/cpu_special.inc" - } - - if (RabbitizerInstruction_isNop(self)) { - // NOP is special enough - self->uniqueId = RABBITIZER_INSTR_ID_cpu_nop; - } else if (RabbitizerConfig_Cfg.pseudos.enablePseudos) { - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_cpu_or: - if (RAB_INSTR_GET_rt(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoMove) { - self->uniqueId = RABBITIZER_INSTR_ID_cpu_move; - } - } - break; - - case RABBITIZER_INSTR_ID_cpu_nor: - if (RAB_INSTR_GET_rt(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoNot) { - self->uniqueId = RABBITIZER_INSTR_ID_cpu_not; - } - } - break; - - case RABBITIZER_INSTR_ID_cpu_subu: - if (RAB_INSTR_GET_rs(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoNegu) { - self->uniqueId = RABBITIZER_INSTR_ID_cpu_negu; - } - } - break; - - default: - break; - } - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_cpu_jalr: - self->_mandatorybits = RAB_INSTR_PACK_rd(self->_mandatorybits, RAB_INSTR_GET_rd(self)); - - if (RabbitizerConfig_Cfg.regNames.gprAbiNames == RABBITIZER_ABI_NUMERIC || RabbitizerConfig_Cfg.regNames.gprAbiNames == RABBITIZER_ABI_O32) { - if (RAB_INSTR_GET_rd(self) != RABBITIZER_REG_GPR_O32_ra) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[RABBITIZER_INSTR_ID_cpu_jalr_rd]; - } - } else { - if (RAB_INSTR_GET_rd(self) != RABBITIZER_REG_GPR_N32_ra) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[RABBITIZER_INSTR_ID_cpu_jalr_rd]; - } - } - break; - - case RABBITIZER_INSTR_ID_cpu_div: - if (RabbitizerConfig_Cfg.toolchainTweaks.sn64DivFix && !self->inHandwrittenFunction) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[RABBITIZER_INSTR_ID_cpu_sn64_div]; - } - break; - - case RABBITIZER_INSTR_ID_cpu_divu: - if (RabbitizerConfig_Cfg.toolchainTweaks.sn64DivFix && !self->inHandwrittenFunction) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[RABBITIZER_INSTR_ID_cpu_sn64_divu]; - } - break; - - default: - break; - } -} - -void RabbitizerInstruction_processUniqueId_Regimm(RabbitizerInstruction *self) { - uint32_t rt = RAB_INSTR_GET_rt(self); - - self->_mandatorybits = RAB_INSTR_PACK_rt(self->_mandatorybits, rt); - - switch (rt) { -#include "instructions/instr_id/cpu/cpu_regimm.inc" - } - - if (RabbitizerConfig_Cfg.pseudos.enablePseudos) { - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_cpu_bgezal: - if (RAB_INSTR_GET_rs(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoBal) { - self->uniqueId = RABBITIZER_INSTR_ID_cpu_bal; - } - } - break; - - default: - break; - } - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstruction_processUniqueId_Coprocessor0_BC0(RabbitizerInstruction *self) { - uint32_t fmt = RAB_INSTR_GET_bc_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_bc_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop0_bc0.inc" - } -} - -void RabbitizerInstruction_processUniqueId_Coprocessor0_Tlb(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/cpu/cpu_cop0_tlb.inc" - } -} - -void RabbitizerInstruction_processUniqueId_Coprocessor0(RabbitizerInstruction *self) { - uint32_t fmt = RAB_INSTR_GET_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt); - self->_handwrittenCategory = true; - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop0.inc" - - case 0x08: - RabbitizerInstruction_processUniqueId_Coprocessor0_BC0(self); - break; - - case 0x10: - RabbitizerInstruction_processUniqueId_Coprocessor0_Tlb(self); - break; - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstruction_processUniqueId_Coprocessor1_BC1(RabbitizerInstruction *self) { - uint32_t fmt = RAB_INSTR_GET_bc_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_bc_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop1_bc1.inc" - } -} - -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuS(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/cpu/cpu_cop1_fpu_s.inc" - } -} - -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuD(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/cpu/cpu_cop1_fpu_d.inc" - } -} - -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuW(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/cpu/cpu_cop1_fpu_w.inc" - } -} - -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuL(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/cpu/cpu_cop1_fpu_l.inc" - } -} - -void RabbitizerInstruction_processUniqueId_Coprocessor1(RabbitizerInstruction *self) { - uint8_t fmt = RAB_INSTR_GET_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop1.inc" - - case 0x08: // fmt = BC - RabbitizerInstruction_processUniqueId_Coprocessor1_BC1(self); - break; - - case 0x10: - RabbitizerInstruction_processUniqueId_Coprocessor1_FpuS(self); - break; - - case 0x11: - RabbitizerInstruction_processUniqueId_Coprocessor1_FpuD(self); - break; - - case 0x14: - RabbitizerInstruction_processUniqueId_Coprocessor1_FpuW(self); - break; - - case 0x15: - RabbitizerInstruction_processUniqueId_Coprocessor1_FpuL(self); - break; - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstruction_processUniqueId_Coprocessor2(RabbitizerInstruction *self) { - self->_handwrittenCategory = true; - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -#undef RABBITIZER_DEF_INSTR_ID -#undef RABBITIZER_DEF_INSTR_ID_ALTNAME - -void RabbitizerInstruction_processUniqueId(RabbitizerInstruction *self) { - uint32_t opcode = RAB_INSTR_GET_opcode(self); - - self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode); - - self->uniqueId = RABBITIZER_INSTR_ID_cpu_INVALID; - - switch (opcode) { - default: - RabbitizerInstruction_processUniqueId_Normal(self); - break; - case 0x00: - RabbitizerInstruction_processUniqueId_Special(self); - break; - case 0x01: - RabbitizerInstruction_processUniqueId_Regimm(self); - break; - case 0x10: - RabbitizerInstruction_processUniqueId_Coprocessor0(self); - break; - case 0x11: - RabbitizerInstruction_processUniqueId_Coprocessor1(self); - break; - case 0x12: - RabbitizerInstruction_processUniqueId_Coprocessor2(self); - break; - } -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900.c deleted file mode 100644 index 3b9bd2ce..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900.c +++ /dev/null @@ -1,17 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstructionR5900.h" - -void RabbitizerInstructionR5900_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram) { - RabbitizerInstruction_init(self, word, vram); - - self->uniqueId = RABBITIZER_INSTR_ID_r5900_INVALID; - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - - self->category = RABBITIZER_INSTRCAT_R5900; -} - -void RabbitizerInstructionR5900_destroy(RabbitizerInstruction *self) { - RabbitizerInstruction_destroy(self); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_ProcessUniqueId.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_ProcessUniqueId.c deleted file mode 100644 index 1972f3fa..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_ProcessUniqueId.c +++ /dev/null @@ -1,328 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstructionR5900.h" - -#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \ - case (caseBits): \ - self->uniqueId = RABBITIZER_INSTR_ID_##prefix##_##name; \ - break; -#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__) - -void RabbitizerInstructionR5900_processUniqueId_Normal(RabbitizerInstruction *self) { - uint32_t opcode = RAB_INSTR_GET_opcode(self); - bool fetchDescriptor = true; - - self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode); - - switch (opcode) { -#include "instructions/instr_id/r5900/r5900_normal.inc" - - default: - RabbitizerInstruction_processUniqueId_Normal(self); - fetchDescriptor = false; - break; - } - - if (fetchDescriptor) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - } -} - -void RabbitizerInstructionR5900_processUniqueId_Special(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - bool fetchDescriptor = true; - uint32_t stype; - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_special.inc" - - default: - RabbitizerInstruction_processUniqueId_Special(self); - fetchDescriptor = false; - break; - } - - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_cpu_sync: - stype = RAB_INSTR_GET_stype(self); - self->_mandatorybits = RAB_INSTR_PACK_stype(self->_mandatorybits, stype); - if ((stype & 0x10) == 0x10) { - self->uniqueId = RABBITIZER_INSTR_ID_r5900_sync_p; - fetchDescriptor = true; - } - break; - - default: - break; - } - - if (fetchDescriptor) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - } -} - -void RabbitizerInstructionR5900_processUniqueId_Regimm(RabbitizerInstruction *self) { - uint32_t rt = RAB_INSTR_GET_rt(self); - bool fetchDescriptor = true; - - self->_mandatorybits = RAB_INSTR_PACK_rt(self->_mandatorybits, rt); - - switch (rt) { -#include "instructions/instr_id/r5900/r5900_regimm.inc" - - default: - RabbitizerInstruction_processUniqueId_Regimm(self); - fetchDescriptor = false; - break; - } - - if (fetchDescriptor) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - } -} - -void RabbitizerInstructionR5900_processUniqueId_Coprocessor0_Tlb(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_cop0_tlb.inc" - - default: - RabbitizerInstruction_processUniqueId_Coprocessor0_Tlb(self); - break; - } -} - -void RabbitizerInstructionR5900_processUniqueId_Coprocessor0(RabbitizerInstruction *self) { - uint32_t fmt = RAB_INSTR_GET_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt); - self->_handwrittenCategory = true; - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop0.inc" - - case 0x08: - RabbitizerInstruction_processUniqueId_Coprocessor0_BC0(self); - break; - - case 0x10: - RabbitizerInstructionR5900_processUniqueId_Coprocessor0_Tlb(self); - break; - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstructionR5900_processUniqueId_Coprocessor1_FpuS(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_cop1_fpu_s.inc" - - default: - RabbitizerInstruction_processUniqueId_Coprocessor1_FpuS(self); - break; - } -} - -void RabbitizerInstructionR5900_processUniqueId_Coprocessor1(RabbitizerInstruction *self) { - uint8_t fmt = RAB_INSTR_GET_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop1.inc" - - case 0x08: // fmt = BC - RabbitizerInstruction_processUniqueId_Coprocessor1_BC1(self); - break; - - case 0x10: - RabbitizerInstructionR5900_processUniqueId_Coprocessor1_FpuS(self); - break; - - case 0x14: - RabbitizerInstruction_processUniqueId_Coprocessor1_FpuW(self); - break; - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstruction_processUniqueId_Coprocessor2_BC2(RabbitizerInstruction *self) { - uint32_t fmt = RAB_INSTR_GET_bc_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_bc_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/r5900/r5900_cop2_bc2.inc" - } -} - -void RabbitizerInstructionR5900_processUniqueId_Coprocessor2_Special2(UNUSED RabbitizerInstruction *self) { - uint32_t fhiflo = RAB_INSTR_R5900_GET_fhi_flo(self); - - self->_mandatorybits = RAB_INSTR_R5900_PACK_fhi_flo(self->_mandatorybits, fhiflo); - - switch (fhiflo) { -#include "instructions/instr_id/r5900/r5900_cop2_special2.inc" - } -} - -void RabbitizerInstructionR5900_processUniqueId_Coprocessor2_Special1(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_cop2_special1.inc" - - case 0x3C: - case 0x3D: - case 0x3E: - case 0x3F: - RabbitizerInstructionR5900_processUniqueId_Coprocessor2_Special2(self); - break; - } -} - -void RabbitizerInstructionR5900_processUniqueId_Coprocessor2(RabbitizerInstruction *self) { - uint8_t fmt = RAB_INSTR_GET_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/r5900/r5900_cop2.inc" - - case 0x08: - RabbitizerInstruction_processUniqueId_Coprocessor2_BC2(self); - break; - - case 0x10: - case 0x11: - case 0x12: - case 0x13: - case 0x14: - case 0x15: - case 0x16: - case 0x17: - case 0x18: - case 0x19: - case 0x1A: - case 0x1B: - case 0x1C: - case 0x1D: - case 0x1E: - case 0x1F: - RabbitizerInstructionR5900_processUniqueId_Coprocessor2_Special1(self); - break; - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstructionR5900_processUniqueId_MMI_0(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_R5900_GET_mmi_function(self); - - self->_mandatorybits = RAB_INSTR_R5900_PACK_mmi_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_mmi_0.inc" - } -} - -void RabbitizerInstructionR5900_processUniqueId_MMI_1(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_R5900_GET_mmi_function(self); - - self->_mandatorybits = RAB_INSTR_R5900_PACK_mmi_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_mmi_1.inc" - } -} - -void RabbitizerInstructionR5900_processUniqueId_MMI_2(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_R5900_GET_mmi_function(self); - - self->_mandatorybits = RAB_INSTR_R5900_PACK_mmi_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_mmi_2.inc" - } -} - -void RabbitizerInstructionR5900_processUniqueId_MMI_3(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_R5900_GET_mmi_function(self); - - self->_mandatorybits = RAB_INSTR_R5900_PACK_mmi_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_mmi_3.inc" - } -} - -void RabbitizerInstructionR5900_processUniqueId_MMI(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_mmi.inc" - - case 0x08: - RabbitizerInstructionR5900_processUniqueId_MMI_0(self); - break; - case 0x09: - RabbitizerInstructionR5900_processUniqueId_MMI_2(self); - break; - case 0x28: - RabbitizerInstructionR5900_processUniqueId_MMI_1(self); - break; - case 0x29: - RabbitizerInstructionR5900_processUniqueId_MMI_3(self); - break; - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -#undef RABBITIZER_DEF_INSTR_ID -#undef RABBITIZER_DEF_INSTR_ID_ALTNAME - -void RabbitizerInstructionR5900_processUniqueId(RabbitizerInstruction *self) { - uint32_t opcode = RAB_INSTR_GET_opcode(self); - - self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode); - - switch (opcode) { - default: - RabbitizerInstructionR5900_processUniqueId_Normal(self); - break; - case 0x00: - RabbitizerInstructionR5900_processUniqueId_Special(self); - break; - case 0x01: - RabbitizerInstructionR5900_processUniqueId_Regimm(self); - break; - case 0x10: - RabbitizerInstructionR5900_processUniqueId_Coprocessor0(self); - break; - case 0x11: - RabbitizerInstructionR5900_processUniqueId_Coprocessor1(self); - break; - case 0x12: - RabbitizerInstructionR5900_processUniqueId_Coprocessor2(self); - break; - case 0x1C: - RabbitizerInstructionR5900_processUniqueId_MMI(self); - break; - } -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp.c deleted file mode 100644 index 1e63453c..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp.c +++ /dev/null @@ -1,56 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstructionRsp.h" - -void RabbitizerInstructionRsp_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram) { - RabbitizerInstruction_init(self, word, vram); - - self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID; - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - - self->_handwrittenCategory = true; - self->category = RABBITIZER_INSTRCAT_RSP; -} - -void RabbitizerInstructionRsp_destroy(RabbitizerInstruction *self) { - RabbitizerInstruction_destroy(self); -} - -uint16_t RabbitizerInstructionRsp_GetOffsetVector(const RabbitizerInstruction *self) { - uint16_t offset = RAB_INSTR_RSP_GET_OFFSET_VECTOR_RAW(self); - - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_rsp_lsv: - case RABBITIZER_INSTR_ID_rsp_ssv: - return offset << 1; - - case RABBITIZER_INSTR_ID_rsp_llv: - case RABBITIZER_INSTR_ID_rsp_slv: - return offset << 2; - - case RABBITIZER_INSTR_ID_rsp_ldv: - case RABBITIZER_INSTR_ID_rsp_sdv: - case RABBITIZER_INSTR_ID_rsp_lpv: - case RABBITIZER_INSTR_ID_rsp_spv: - case RABBITIZER_INSTR_ID_rsp_luv: - case RABBITIZER_INSTR_ID_rsp_suv: - return offset << 3; - - case RABBITIZER_INSTR_ID_rsp_lqv: - case RABBITIZER_INSTR_ID_rsp_sqv: - case RABBITIZER_INSTR_ID_rsp_lrv: - case RABBITIZER_INSTR_ID_rsp_srv: - case RABBITIZER_INSTR_ID_rsp_lhv: - case RABBITIZER_INSTR_ID_rsp_shv: - case RABBITIZER_INSTR_ID_rsp_lfv: - case RABBITIZER_INSTR_ID_rsp_sfv: - case RABBITIZER_INSTR_ID_rsp_ltv: - case RABBITIZER_INSTR_ID_rsp_stv: - case RABBITIZER_INSTR_ID_rsp_swv: - return offset << 4; - - default: - return offset; - } -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c deleted file mode 100644 index e491f1be..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c +++ /dev/null @@ -1,233 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstructionRsp.h" - -#include "common/RabbitizerConfig.h" - -#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \ - case (caseBits): \ - self->uniqueId = RABBITIZER_INSTR_ID_##prefix##_##name; \ - break; -#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__) - -void RabbitizerInstructionRsp_processUniqueId_Normal_Lwc2(RabbitizerInstruction *self) { - uint32_t rd = RAB_INSTR_GET_rd(self); - - self->_mandatorybits = RAB_INSTR_PACK_rd(self->_mandatorybits, rd); - - switch (rd) { -#include "instructions/instr_id/rsp/rsp_normal_lwc2.inc" - } -} - -void RabbitizerInstructionRsp_processUniqueId_Normal_Swc2(RabbitizerInstruction *self) { - uint32_t rd = RAB_INSTR_GET_rd(self); - uint32_t elementlow; - - self->_mandatorybits = RAB_INSTR_PACK_rd(self->_mandatorybits, rd); - - switch (rd) { -#include "instructions/instr_id/rsp/rsp_normal_swc2.inc" - } - - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_rsp_suv: - elementlow = RAB_INSTR_RSP_GET_elementlow(self); - self->_mandatorybits = RAB_INSTR_RSP_PACK_elementlow(self->_mandatorybits, elementlow); - if (elementlow != 0) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_swv; - } - break; - - default: - break; - } -} - -void RabbitizerInstructionRsp_processUniqueId_Normal(RabbitizerInstruction *self) { - uint32_t opcode = RAB_INSTR_GET_opcode(self); - - self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode); - - switch (opcode) { -#include "instructions/instr_id/rsp/rsp_normal.inc" - - // new rsp stuff - case 0x32: - RabbitizerInstructionRsp_processUniqueId_Normal_Lwc2(self); - break; - - case 0x3A: - RabbitizerInstructionRsp_processUniqueId_Normal_Swc2(self); - break; - } - - if (RabbitizerConfig_Cfg.pseudos.enablePseudos) { - if (RAB_INSTR_GET_rt(self) == 0) { - if (self->uniqueId == RABBITIZER_INSTR_ID_rsp_beq) { - if (RAB_INSTR_GET_rs(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoB) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_b; - } - } else { - if (RabbitizerConfig_Cfg.pseudos.pseudoBeqz) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_beqz; - } - } - } else if (self->uniqueId == RABBITIZER_INSTR_ID_rsp_bne) { - if (RabbitizerConfig_Cfg.pseudos.pseudoBnez) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_bnez; - } - } - } - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstructionRsp_processUniqueId_Special(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/rsp/rsp_special.inc" - } - - if (RabbitizerInstruction_isNop(self)) { - // NOP is special enough - self->uniqueId = RABBITIZER_INSTR_ID_rsp_nop; - } else if (RabbitizerConfig_Cfg.pseudos.enablePseudos) { - if (RAB_INSTR_GET_rt(self) == 0) { - if (self->uniqueId == RABBITIZER_INSTR_ID_rsp_or) { - if (RabbitizerConfig_Cfg.pseudos.pseudoMove) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_move; - } - } else if (self->uniqueId == RABBITIZER_INSTR_ID_rsp_nor) { - if (RabbitizerConfig_Cfg.pseudos.pseudoNot) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_not; - } - } - } else if (self->uniqueId == RABBITIZER_INSTR_ID_rsp_subu) { - if (RAB_INSTR_GET_rs(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoNegu) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_negu; - } - } - } - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - - if (self->uniqueId == RABBITIZER_INSTR_ID_rsp_jalr) { - // $ra - if (RAB_INSTR_GET_rd(self) != 31) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[RABBITIZER_INSTR_ID_rsp_jalr_rd]; - } - } -} - -void RabbitizerInstructionRsp_processUniqueId_Regimm(RabbitizerInstruction *self) { - uint32_t rt = RAB_INSTR_GET_rt(self); - - self->_mandatorybits = RAB_INSTR_PACK_rt(self->_mandatorybits, rt); - - switch (rt) { -#include "instructions/instr_id/rsp/rsp_regimm.inc" - } - - if (RabbitizerConfig_Cfg.pseudos.enablePseudos) { - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_rsp_bgezal: - if (RAB_INSTR_GET_rs(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoBal) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_bal; - } - } - break; - - default: - break; - } - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstructionRsp_processUniqueId_Coprocessor0(RabbitizerInstruction *self) { - uint32_t fmt = RAB_INSTR_GET_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop0.inc" - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstructionRsp_processUniqueId_Coprocessor2_Vu(RabbitizerInstruction *self) { - uint32_t aux = SHIFTR(self->word, 25, 1); - uint32_t function = RAB_INSTR_GET_function(self); - - if (aux != 1) { - return; - } - - // TODO: name this bit range - self->_mandatorybits = BITREPACK(self->_mandatorybits, aux, 25, 1); - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/rsp/rsp_cop2_vu.inc" - } -} - -void RabbitizerInstructionRsp_processUniqueId_Coprocessor2(RabbitizerInstruction *self) { - uint32_t fmt = RAB_INSTR_GET_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop0.inc" - - default: - RabbitizerInstructionRsp_processUniqueId_Coprocessor2_Vu(self); - break; - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -#undef RABBITIZER_DEF_INSTR_ID -#undef RABBITIZER_DEF_INSTR_ID_ALTNAME - -void RabbitizerInstructionRsp_processUniqueId(RabbitizerInstruction *self) { - uint32_t opcode = RAB_INSTR_GET_opcode(self); - - self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode); - - self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID; - - switch (opcode) { - default: - RabbitizerInstructionRsp_processUniqueId_Normal(self); - break; - case 0x00: - RabbitizerInstructionRsp_processUniqueId_Special(self); - break; - case 0x01: - RabbitizerInstructionRsp_processUniqueId_Regimm(self); - break; - case 0x10: - RabbitizerInstructionRsp_processUniqueId_Coprocessor0(self); - break; - // case 0x11: - // RabbitizerInstructionRsp_processUniqueId_Coprocessor1(self); - // break; - case 0x12: - RabbitizerInstructionRsp_processUniqueId_Coprocessor2(self); - break; - } -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerRegister.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerRegister.c deleted file mode 100644 index 4d16024f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerRegister.c +++ /dev/null @@ -1,181 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerRegister.h" - -#include - -#include "common/Utils.h" -#include "common/RabbitizerConfig.h" - -#define RABBITIZER_DEF_REG(prefix, name, numeric) [RABBITIZER_REG_##prefix##_##name] = { "$" #numeric, "$" #name } - -#define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric) [RABBITIZER_REG_##prefix##_##name] = { "$" #numeric, #name } - -// numeric, named - -const char *RabbitizerRegister_GprO32_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_GprO32.inc" -}; - -const char *RabbitizerRegister_GprN32_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_GprN32.inc" -}; - -const char *RabbitizerRegister_Cop0_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_Cop0.inc" -}; - -const char *RabbitizerRegister_Cop1O32_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_Cop1O32.inc" -}; - -const char *RabbitizerRegister_Cop1N32_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_Cop1N32.inc" -}; - -const char *RabbitizerRegister_Cop1N64_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_Cop1N64.inc" -}; - -const char *RabbitizerRegister_Cop1Control_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_Cop1Control.inc" -}; - -const char *RabbitizerRegister_Cop2_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_Cop2.inc" -}; - -/* RSP */ - -const char *RabbitizerRegister_RspGpr_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_RspGpr.inc" -}; - -const char *RabbitizerRegister_RspCop0_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_RspCop0.inc" -}; - -const char *RabbitizerRegister_RspCop2_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_RspCop2.inc" -}; - -const char *RabbitizerRegister_RspCop2Control_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_RspCop2Control.inc" -}; - -const char *RabbitizerRegister_RspVector_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_RspVector.inc" -}; - -/* RSP */ - -/* R5900 */ - -const char *RabbitizerRegister_R5900VF_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_R5900VF.inc" -}; - -const char *RabbitizerRegister_R5900VI_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_R5900VI.inc" -}; - -/* R5900 */ - -const char *RabbitizerRegister_getNameGpr(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_GprO32_Names)); - - switch (RabbitizerConfig_Cfg.regNames.gprAbiNames) { - case RABBITIZER_ABI_NUMERIC: - return RabbitizerRegister_GprO32_Names[regValue][0]; - - default: - case RABBITIZER_ABI_O32: - return RabbitizerRegister_GprO32_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; - - case RABBITIZER_ABI_N32: - case RABBITIZER_ABI_N64: - return RabbitizerRegister_GprN32_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; - } -} - -const char *RabbitizerRegister_getNameCop0(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_Cop0_Names)); - - return RabbitizerRegister_Cop0_Names[regValue] - [RabbitizerConfig_Cfg.regNames.namedRegisters && RabbitizerConfig_Cfg.regNames.vr4300Cop0NamedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameCop1(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_Cop1O32_Names)); - - switch (RabbitizerConfig_Cfg.regNames.fprAbiNames) { - default: - case RABBITIZER_ABI_NUMERIC: - return RabbitizerRegister_Cop1O32_Names[regValue][0]; - - case RABBITIZER_ABI_O32: - return RabbitizerRegister_Cop1O32_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; - - case RABBITIZER_ABI_N32: - return RabbitizerRegister_Cop1N32_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; - - case RABBITIZER_ABI_N64: - return RabbitizerRegister_Cop1N64_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; - } -} - -const char *RabbitizerRegister_getNameCop1Control(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_Cop1Control_Names)); - - return RabbitizerRegister_Cop1Control_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters && RabbitizerConfig_Cfg.regNames.userFpcCsr ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameCop2(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_Cop2_Names)); - - return RabbitizerRegister_Cop2_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameRspGpr(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_RspGpr_Names)); - - return RabbitizerRegister_RspGpr_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameRspCop0(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_RspCop0_Names)); - - return RabbitizerRegister_RspCop0_Names[regValue] - [RabbitizerConfig_Cfg.regNames.namedRegisters && RabbitizerConfig_Cfg.regNames.vr4300RspCop0NamedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameRspCop2(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_RspCop2_Names)); - - return RabbitizerRegister_RspCop2_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameRspCop2Control(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_RspCop2Control_Names)); - - return RabbitizerRegister_RspCop2Control_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameRspVector(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_RspVector_Names)); - - return RabbitizerRegister_RspVector_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameR5900VF(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_R5900VF_Names)); - - return RabbitizerRegister_R5900VF_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameR5900VI(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_R5900VI_Names)); - - return RabbitizerRegister_R5900VI_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/test.c b/tools/ido-static-recomp/tools/rabbitizer/test.c deleted file mode 100644 index e968dfaf..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/test.c +++ /dev/null @@ -1,40 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstruction.h" - -#include -#include -#include -#include - - -int main() { - uint32_t word; - RabbitizerInstruction instr; - char *buffer; - int extraLJust = 5; - size_t bufferSize; - size_t disassembledSize; - - word = 0x8D4A7E18; // lw - //word = 0x00004010; // mfhi - - RabbitizerInstruction_init(&instr, word, 0x80000000); - - RabbitizerInstruction_processUniqueId(&instr); - - bufferSize = RabbitizerInstruction_getSizeForBuffer(&instr, 0, extraLJust); - buffer = malloc(bufferSize + 1); - assert(buffer != NULL); - - disassembledSize = RabbitizerInstruction_disassemble(&instr, buffer, NULL, 0, extraLJust); - assert(disassembledSize <= bufferSize); - - printf("%08X: %s\n", word, buffer); - - free(buffer); - RabbitizerInstruction_destroy(&instr); - - return 0; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/tests/cplusplus/test.cpp b/tools/ido-static-recomp/tools/rabbitizer/tests/cplusplus/test.cpp deleted file mode 100644 index 689e12b3..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/tests/cplusplus/test.cpp +++ /dev/null @@ -1,16 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/InstructionCpu.hpp" - - -int main() { - uint32_t word = 0x8D4A7E18; // lw - uint32_t vram = 0x80000000; - int extraLJust = 5; - rabbitizer::InstructionCpu instr(word, vram); - - printf("%08X: %s\n", word, instr.disassemble(extraLJust).c_str()); - - return 0; -} diff --git a/tools/ido5.3_compiler/LICENSE.md b/tools/ido5.3_compiler/LICENSE.md deleted file mode 100644 index 015107d4..00000000 --- a/tools/ido5.3_compiler/LICENSE.md +++ /dev/null @@ -1,18 +0,0 @@ -# Silicon Graphics Freeware Legal Notice -## Copyright 1995, Silicon Graphics, Inc. -- ALL RIGHTS RESERVED - -You may copy, modify, use and distribute this software, (i) provided that you include the entirety of this reservation of rights notice in all such copies, and (ii) you comply with any additional or different obligations and/or use restrictions specified by any third party owner or supplier of the software in other notices that may be included with the software. - -**SGI DISCLAIMS ALL WARRANTIES WITH RESPECT TO THIS SOFTWARE, EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ALL WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. SGI SHALL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING, WITHOUT LIMITATION, LOST REVENUES, LOST PROFITS, OR LOSS OF PROSPECTIVE ECONOMIC ADVANTAGE, RESULTING FROM THE USE OR MISUSE OF THIS SOFTWARE.** - -**U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND:** - -Use, duplication or disclosure by the Government is subject to restrictions as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or in similar or successor clauses in the FAR, or the DOD or NASA FAR Supplement. Unpublished - rights reserved under the Copyright Laws of United States. Contractor/manufacturer is Silicon Graphics, Inc., 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. - -## Product Support - -Freeware products are not supported by Silicon Graphics or any of its support providers. The software contained in this package is made available through the generous efforts of their authors. Although they are interested in your feedback, they are under no obligation to address bugs, enhancements, or answer questions. - ----- - -**NOTE:** This license was copied verbatim from https://web.archive.org/web/19991008090202/http://toolbox.sgi.com/TasteOfDT/public/freeware1.0/legal_notice.html . diff --git a/tools/ido5.3_compiler/lib/libmalloc.so b/tools/ido5.3_compiler/lib/libmalloc.so deleted file mode 100644 index a58e1034503f5194557a7e8a96d2904acd7560a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28216 zcmb<-^>JflVq|~=W(E!h1_nm{Xc2r&p0KomdV zpT+>j3=9ksP|U)>zyQKb3=E74{L>(qfq_#2g28ei{frC@2@q4jB#S8n0|-MnAp1cq z{%H&hAk4sEzyQGvtPBhSASp%=pMN?70|-OJz~XEWHb@BsZ?^yc55hu_{L>p05Ilk` zJ_ZH`p#la5CcUl86bcv^nE!>YUs3?^r+fhe0|);!CXhHc0|Nt30RsalFhQ7we;P+a z0Rsa&|1_om1_lOJ{%Ony7#JAX_@}XMU|?Y2Vqjpr!N9-((g$)pGyil3g8~KyK?Vi} z-2$*W28IH#ItK9q1_ogU1_qFQA`A=+Vg(Egy8PQVgXBSa84DN~IQgeBfjk4U8-#g4 z90mpkUJzZt017)6!2$*bAqEBpPLLQBGwN+!I>~+4Of{%mpu%v9p8*o6Ap1dfi!v}U zNHH)lNHZ`n$TBc6$T2W5s53AyXfQA^XhL-{GMKLU0**(M3!Y%wlogaN7#U1fEClhH zBcOC7gl1s&TnrLtFr5jeS!CQ(!Tj$_SV1)Ne03EN&9L*gD~M*^w*%x^MxL7&TS0tw z3*%rA&A@hJD~RTv5qcRyn}KPL9mdKaKHCh4I@TG+#vnd(vl-Z3%*_TMzcF$cE&2}< z=P+gl(+rsq^VlLGG|$E@UqSLb78>s$v?rM6u+u#a;@Wqpk9FRGLXbSq#%)hQG+*kr4~voSITvlp0@LQk0pO9$%7}l#|MUBn}mbPbtoiPsuDU z$Vp62%}vcK!B7)loLQC15FekKlNO(mnwXMW#1IcMC%q^!7b*ZX9pY|=w4&5hhWMh? zWUx0FkQfjFsCYb-2J0#)VTeazWag#iGk`?EjAV$JPzofRpPZDF4R%>>YHngqW_lh& zJc1RU3sIAkpPbDQUkah(ON--+ic2zzQWH}kmL)U9L!^q6in1AUQ*)CGDjDLFs#1&c zLA>Hrn5&W*;vp_5N`?3#K0Y}kH95Nw>_miH;?oPjfeDXZA{c7?)3_WU>i&cBy$=60 zeP|I4<{P2$Eg)qkNXLIr9(7UB z8KC?IH2!1;1_n?W0+Rp8z`(E)QpPiY_#pRe}NEBw>AD?nyK z`8WBe@qo$(1|f+2V;CPQ|Av2>s2qpd$0!HmL+oQz=bxrhf}~#;#)s-R;h&}^1CodGo%yG!F97kO`h8%0sC*bm z4unA!0|NtN3WyEDP<}Ru4Z=`9JiMX&HvVZ`p!x?~@G~$l_V7>R0$0AEihzNEaWelj zE^vB*@@Mf+;{uxjVnimF}S`0)p3wI5-N&H$)j=^RMGgLI!hc)44F%){s+}{pn4g(o^yBy8v`l@YL`Hn;5GxOP6kC8s2)>< zN`UHRP`wV~N`eSzy$wo#p!ynAcY}mMb(Io`fdj+pbqs0d2jKQ1T)cl~g8=h`3Pomx zADku<49aMH6*Rso8eh#uhJjIiPU!^ZnGY2E`x;8r_x``pdyau&{eA|S^?Mj31P?H9 ztF$s`^v`Ul=x=Gr>9=HH=xJeK0NJ;GDT7A;9tMg2r3@MZpf;<6gsKWN1EW9!1K98V zGaE!07AUByTk?DXsRub4q@KY+LbboY0i0)h--ARM7z7`H+Gh+5{WBX1Fzi{xpaRm@ zznB3Wp8^aF91IBpAirQYpMim)e?Nna`d$VNSa?DFS+WAjpAXRd$+>Lx<}6Jq!vA3=Kj^?oeP-PymI?6eb1@Rgn1lMc_D6U~uRF ziO*qhPymZV?N{hu%%CBpz#z!rV4%v7#Gx&q07+l{GaFi%loi0~iosb!xqlCX0w~=3 z_cMUfR11>o+mTtl!8Wv3>)CNdJU}i2jKU5&e@IBKjvcMD$N-i0JQbi0JQXi0E%`h*-a$ zL1+CQ1`UP=164Hv1_?Do1{Sp-MhCTGMhmqmi~_3J3>Q?r7)?~3GkoZI2l0dG0dPl# zp}(aeVx0px-GcHegG$r?{|qh_Dxwb{of}X(UFXEWpl&Ib0S>ce3to6O z42)}Z7;QujFffC{R)B#?hk-#rwGYf=U|>k&&=yf(*w2ulq1xZs5YeZ^z|iNxz|gD7 z=py34U<%UH-_#HR@>`D+g9s=OG9+avs;*;TW<10oy-t~dLBxRpRR1$Duru(kV_;xd zzl@<^{R)PN^(z@d7#J#q82Aq~tjmYwb#)d77I>II;{+T(D;OgBS2Bcv!ep%z0|SG@ z2~|)Si8wGYgThFF;s2a<3JeT=xeN?_It&b|>lhd{4>B;RFflNSC@^rZ<6&S>VP;_I z^=DvEabjR(e0)H0Jp%(nUnK*BN-_frvl54vfWrSDApi6_gF9=GI^slvqG~S#3!`oa zJA+_B14CYgV($lV$4P|Ia0Uw~&Ov&5S{T4_&T!;_qPiplGqVbVG(&@cDze`h7&?R) z1QQwv%oFff4PmqGAE1G8j;q5uPf@Y;R`hCW^f5r$w1MU@H$ z7AD>TMP@#5{$pVfK5<|jGXswR0|Vzeke!hgit88{IM(qq@bvmJF!X_J5-ez7Tz5cm zJr4tenIr?V00V>Gx=02FaK4$@Afh&ffuXM-l%{#UFn(r`WMEJbQfXmO0Htq`r$BKD zvKy4Yz;WfpXd=MCI2n}2gh2gOL4}4j0bnL5QF)^_8_%W~uFfcH$J;cDU z#)*MtjS~YyuMaq`WEfixD6VH>U{I_4|7VRe1IHR?2A(yM3<4l`nD{U-gWRDK#2~ZA zhe3vcAwx)Y9fQIeKL!y{-T=Ev0+JtvK`9bcp3ZET0TM@XGq{px%v5t?VCkRP5CMwk zeoF=g6^{QunAK(|s^v4VGrpLiqL;`Z*wexwBcK3E;}WVW!VCg7j13GXiVTbl2f=xV znc+c$ssICH7|73k0t_4sDFRv|4h-rl$qbBYO#eR!xHEw2e}-c07-T^9tv$=Y z(es0Wqvs8SjJhQw!+IVDo<4pC9#9@%`;&pAkCy=yI}B^yGRUlBXW&`$fq|p<93yBz zg`xKXcsz!o50dK`415?EMH?8{7y=F`GYdoA1oj^TFUWpynb_12p(elx3K$L*Cx#Dw z;F^_zf!Ux!nej77&;N^{FaoI;ac9^LV)xH%s9|70Dd#l|Tp8H=n;~UsPcowcDDU%-nEPdpt5zHF9Qpc11R1Z+Se#C8uaObe8|9Hc!q&duz|r4 z!~^*ovzh^M8Gjk}YfcyyZD=424@Z&a+A3<-6V-@pt_!ifuqlofu~O&lHS(-WZ+q+ z04@h*)+sP>^f5v5m&y+YfwhYmIQsY)c=~vtYWo;?)-f>f2t+Ulg38LCp9~y5?-^vk zVFqHqW8mm{%OIoL!^p7qECWwZ1SFq=?Cgnzu-E)#kXhr-z_aEN*e(Vp;SNQH08l3jY+z$fT3li(?ftW4W02u=W z)yE7EKy6~#E1RH}%L&#uvjHZLVlK!mko-CWaJkO3-jIQ19jGnR3$dqnEvV>WU=Uouzz$N|kE2Wm zg$YQ$_Z+BA%D}+HC!pBBpFyV|)VABmAkn{xL8gB*gF^on1{G+#umI97%oKsP3m<^` z90Cmtb3y$MB=f*+e!&9}cYwkV)J|8oRA&K&56DhX+Z@y;?{5XScRD64W%K~cIT(P# zRstjkQrFY}|Bp)R|38L57?^|^81z*b|NmoHctWLL3Dm~XP&M#iU=(Cvs8wP7|A)cR zL#0=Xfdk|YQ*Q>QHLDpIdUY5C)~bTaa|RJ`+hZMrG$_w9DhR0dzGpNMJpig}7(lfb zFQ~p{U^&ph_`^W4=P<~21_ps7hA0qg%^?Pco=66k9uE+YfnlvA151w=14|ERhMsIleX+)yfn`k+151w&IF3BmHbKfZko$YrLc*J&S3|jH5yU(LKL$p@ z0}S2_juk3v)-y2lK8A`{FffWk$ESOLGH~?1fTW?dk_;TZFBy1xUqSPdCj-yg2Vl&x zW-$Z9np6gso<$J1^ms$eGRy(jUEm>)9$yBI9zUpAp!(4toWDTx8Vu|C8FfH6nU zPKe$$kqitypb;Vm4b`UVWZNM2ECVfX-wYfwJ~q#l$O zpz`1}4U-4UbwSgw7bM*XIxuiR`(o&A3h-C}NKSn(16m&}tpb`hPk_=UC|!y)FmSA2 z!eG%qv!Msnw*{v&Q2yJ)AR)lO@DXH=$O1?>_RnmX(7%Mi0!__xXgP`A|K;xA0X7#~ zKidZ6@BXC>;Bp3}4ixwO9RL5QbN&Bg$jQJYsKB7k=oq2Wn*%9BKxvqlZPY^si&E=wHvEBY22m2`KD(A2A4k>MVvu;Pxmp zsBb6$nrB&H0O~_F^e;vA6UdLCxB%%z?-vU&Fo4G0!F@0l#{WNhS{M}iS1?#Gv>GU? z9AjW-ICw%uUy(ro)J|hoFi=%tV-R3ukx+)VqyHIrGBAoNFz|rd(>)ao96ebKJSM&j zjB6tpIC`=fczSXmVZFASfoDwu7;~)2Wnkz%!oa|IKtR=?pMg>I0fP`jvxPFlGjRDV zz~HQ)+Y#X(h#9;DGSX{5P49%g5(7l7-ZJ3XE0%C1^XY;id|p!!=kbK+$9ajREKH&Z$ zS3f9?&%_*80-FyTgINR_0|(__^}P%hpgIa9zh(&oPfs5tU94Hhz|qqWVXuA4zyngV zrj>z1rH?@XDhC?pV_37EfoJVg1`epa45Xe*0*`+%v@%G7$_~&t8>~zL)fMZPFld1D zC$uc-U&f#T>X(7S3sT;J$Gch>4nW6smO#hE7BPV9N2t5u<6Qy`p!r7$RR)#gMm?nks(E(kpVRC3lh%|XatR638;e7h6*DCBd9$pz`#(nMwLN8V<8iRfC2-v z$~p#i0S1O#P@f-E1~4A1Pywj}m4gBd4C!n1890#m$!jbactCss28M(+stht9HfU^R zjU@wEp8x|x)B;sTkNyrw+UVtg)J=j6u(1+`Adp=GjSQSBj0{WyjSONcj10^IjSMm> zj0`LSjSQf1Q-}h!1@~-A_N#14A!VJFvu)mU{+ZR_P;Jj4&;BZ`E3mm zj0+W1U}I4#$qXVY#~2;fq%bguK44H>a{y9~gW3wPaVd};pnL_UA$Ev^$Do=UB2*+8 z1i-RI5tY5;=v3?JO!TPNXI_tMEXsqANpt61w zg92!*5;Sh9zJwtJl)hD1!Q+wO{xE2~8RS~fI4p=pDyJ~&K#+X@9_V;pKQ!LoGl0j1 zL?3|CBiL`?IB4M*WK!5gfC43hmj7;^g8GQ@z!>X?}v z6d4y6D6U_@kh6XrLkzQ#f+8fo0)!Z~A`}^u5|r1kVaVv|XJF_9t)Ku+IPw2~2C_>n z=>H!rM+O!Fh5xryTK@k5iS_Sbh+rsXknCT@P|&}IA%lTg(Se!SLAie&Lr(vChKl~C zh7v}X2xV2y|Nj|tGL#wDols_AI3UFM!vWOqWmvzGA!7Yb@OWm$`Xvl00uBsZ{fiko z@QlSn(&S=>4t3CYrVfJ&LqdjXuOb73swM-^+Jy`Zy^8;TsICRE|NrP!{QpN(=l_qj z3;+KCsR7MLfYkKwXE5pC%AnJ~g+Zf#GlNS1CI$tx@$e2%ebUp)Akfp#z@x(c|1aZl z0Tl)Y300M)3@jjbGCns@5paXlGd-Z*UaEv5GrNF_fCHqQ5^?+g3ly(CO`tM^frX*z zgd)RD&^RdrGee4lA|sQBBBPpwGN`NvxeHR(N3VhA*$1F@DX6RmmGkSDGC;;EmN966 z@;az|0qFy^g`xUNp!#lr(iLd_K_!{t18D96dHfz^4`{qWC67Ts#P9!KkoyFjL3I!V zLyr@r9U|fk5eJzAl2=J)6oBi?XAltahsfj8r^538pGq>rg`Nrq0hJ5}0cI8r6ieIfTU?q7=Y@Vp1%KoRA&7DV|bo{N$>#! z52&BR%n0eDgZea}KDsEVo_F*Bk0XHe^eQt52rw}4gVGXcJR78^*9%gvF?0zi_kdO~ zfmXDwW?&ReU|?ogm;l$y*dn0}(g(4hfdLW+5e*=>;fMoX&>R%{JmLDK3_75+upX3; zAakNRpf((+EC+=##=PhO1yyxRjR_zJAp{h5{mU2v`j<0=fZELK7csa9Ffi7F+{fSsYTNw(&*;V=4eB$2 z(gvsxisDumaNT6V*pQ*hzz_i+%Vtai)#VyO>z6V(^nzOx3=9m31u7!04C@&WNT@O% ztx#rsen45D5#0Zq2#QCBx`WP7ccQSzM-Ze8BSb9$|Fswboz+%V=?#qJ9kls@a z9KEL@<>J~b29Dk{3_QJOA!YvBHQ;_Hr0?0mz_1oH_co&;q6cKI1fvb(kqTwT9~@dD z3Jg{tJ3(W|VA>L5p0EOVy&$Nbb^(=DjA{Xjs^0(qGp0ep05qNg3O~?z2}(FHBq03W z2J(A`5aV(U@EkCxo&bmQQU(=JSPL*P1oy9Hu;^dM-~tL)#$y$Vsz3h!XJ%uN#%}fr zxY^8V;64zv&nLTqfx$zFQ5~l}mSB4j<2jJNvIEqQs~I4EOasja{{PRo4Bd~60;qm0 zfV+e77|4$mLX6LG+ARgPdk4gi%xotV)iwYBXH;X528AogpP;_7N(;Ij0SG(XKz2k3 zF{Wd;0~~K_87xfJFfguN!@vLz&(4Mjt22g)S+hivLBa-?Jp!AGKy*yYw=2$y8?;@FV1=SqL zcu7Afk3j6@1)GC3u7XcJ$d4fP0t^i7Yb6;N)?_fS^sj`JBfVN6Sq6r+Tnr5Ts~Idn z<=9$o2A2Lc3>KiUV`LOi0gVgyo@2CO@PUUPWK0A!C$p5n0xA5sK&B!4gRucJt^f-= z(0l}%8t9l1d<+&chBc!h0yG|oG#`OtHb@Q>KcKQ2lutnM0vXSM^lzc@2Q?cKeo%Ws zEnfztaUYKUMGOw0^bL{+nFpdl=7H%&kn{?wPt^A^1i<#{{awqt=$_wysl{><}W`hO)>O&>` zYxr9DSO3W1pT;$Ze;RiS|1`-h{L@r+@K00IfUPA2J8qO14S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(Gb8I0tKARpe36Y3=GU07#PyQ`w*cDg&7zeK>Gw;7#Li@ zYlWcVNem3`ISdSpZx|RnzA!K_Zed{XdH~t??=uCmT-9^`c#aiR&mS~B3Q#@%3=E8*ec$}h zJ)fY}=&2K!85pqGV*u3?&%nS4+M_DXKaB^p4-~YIedYvtu%10=_7p(%>|kJE2JQ3H z;-4lC8t;{5U|^QV?>1&V1_tI#1_s7B=>AA~1_tJ1P(4r3?6H8@!(7C`!2F1TfpIGT zG|)ISgAxM+%L!1JfH0aK(C&MXna>#*nBOrlFoO2AUSVJWt-oObuffNo=Mw`1^G^l_ z#-Gr=uWAeoEH|NU!x2BAZ5J#Y3=E9__@~KbK=%8yd;{45!r0vg+M2;4!oa}93Ee}h z#lXPw4{8sNIAsZBU|?C!z`(=}-B+u_z`)uw!5$nxYtZcJfP@>%76t~E?+gq~1^m-g zKn~SsU|@>{xeJ8R^gzRnm6?Ho738*a(EYiF3=C|Q_}#`T&%nT{$iTq#2)f7Bn1O+< zeF8h!ZRq}irfXI$1_su61_q{A(0#C`3=C|Kq4wYiYu0222G(o_24*h)Y3d;Vm@_c2 zgVGwvTl>D-e&&kj5bhq5C3#V2Pk_o|8zzd zD0@EtbOsfu-j)2*89kulJ3wWdgaQL-ukj8B28I_33Jjof?f|I#k^t>tWMDYJz`(FZ zK>@r5{}`x@l28Dj<8h3Ef#HIJ0%$IV;R2`}vViElz`(#Ip`ZXhTjM6Etg(RTy~)79 zG)Dnc>M?-MT#;NM0nz&s<`=F#HFV0}>FuptMz@pa9xa#>fuJ>lO+OiVO^lp!N13^%@Ke zj69(HETO=l3}Q1dFj*)lfc8E!ih}a2gaT+kHlsYkZH%BPau)>!P@TZ249cSx3ZOGX z7(x4v3ltO>^cff!!TaPT6hLQ)FoO1jgUmE!U|=)>7wg(Cd4A!u;tpEvI@VK}Rc<&Yim`#p2Xn`td0URhpvw{wS0WZx5 zZ61b9OoOZfZQKS;Sb#R4gD_}QH#pNXFo?537?Mz08cNGTX?ZBE1f^A=v>KGwfYMq} zS_ew&Luo@OZ49MNp|m-awuI8wP}&wmQ{tzA(hEIvLob;ju_!e!5q#cAK}iuqW_n(J zQEFNNL^w4sg&`w9Ck1q52}53KZVu?Y5QgN8#Ju!Wh9uCjAH`J+i76>1`6Y>&ISje+ zDXB@N=?v*biJ5r}xrr5NiNz%#8hp+NLvCgs*dUN-atYL`;wp%8BPdmzk(pM)kepML zp9elI1kNf;%qdNU9&mzmlnC?yl=vLTVI>UlIbdz^utP>5Rwt%F`~Y$*$fdAzQ}Rmk zi=k%1PEP@!m6Bgt0uGYmg2d!hhIr_iDX{ZO;vsf{0t0-k3)F5nA903C4xGuLpOv3k zT%vEPXY3oKUzDF;qF-8Eq@S6WoKu>Tst++yFN1-AI`AZ2 z26FxlC2nA`fo3{9q@g+?(hM+5!A=8<6@ZdtP7XMpArT8dT?cLk{0th< zAwAGTfS`x{AWj7W3qViyL5M;^9(tNjJP{}U#A6;G1UmBzeD)Z)oMm8O1f72bD)~Td z3?yeGYc!+9Ax(}&V;mk!E?K~%yD4=t^I-&>$uE02sH<^Lmihn!BBHR{S6dz zpbiIx4@fVlN&yLxzz4Up7(nL+3Fw2^Ak4r6IwwdN+y(>l*+6`u^B^_|GYEm&XaWd% zdC)mQg6~0cAj}{E=C22_L6|`Y)E*Q7w+F#|H4tAAZXRPY$k8Hj^C0_Ckofb_R10&O#?LF5^^plu@P$_R!%X#Atlwvi50y$~8-8q^Pg zv`@h1pGV_ggSK}}q58F;?HNn3Y6ga>~pMV-2Wm0%?HCcY?|$1RvB71J`k&P8lZy z10x$KZ-C^LAYFk1P+0`x3xWBJN-#cD{vRmsfaIb451_ILiN6)bhw6u)VFp#d7gRQZ z)I;PMj)BS|1fNkD#)qh9lmV4RAbAKM)Mtg9aR$|Y9h6r=@(@0wHmEED@uBLU!T1n) zhER|k2n&J;1_p3l0AfP<;B}-(e18xdgrV}FGbBM=&{-%T8gyI?h=%bYYhNMzNkHPu zK?Ddx7eX3=$|fkElYxOD3l{!R_jSO+7s{UjDw~khSHb)X@gJiJsB8ksL(en=F-P%e z2#kinXb6mkz-S1JhQMeDjE2By2n^W}0JWE)^Mar`bC^G%bDZG$DzF%+9Sv0n-s1`u z1nubt&+&uiiy$JP{tRrM9wGuJp>y=0IUq2f0W>!To12G-fJx}QJeUn8Kyzhy>;H zG0c~_5Fd)6^X3foP(A}_P7cOKp)u@LDZyiJCrmG>zXY2X zhlzp5JR#-j5;T1v3vc z2cZVNO9W(I00RT)4iS)(!R~{p1KF#?0NQ^Jwik522naKR?uY;>gsB6uO`!LCFhTAg z0o_5u1UlCrkQ+g3y+G5`OrZNq7#KJjKqps0r>bG9XmG)TSxkaeP=k?4;Df+Nfe+%M60E{Z z4hI6ZI0%V}Dm*X}Q#Iw_;9zhz_#mqAL4rB)fxrg=K?MVa4F(qk1Ox;`6$Moq7#4;2IiJ{$=6WWglZ zz`%XMpyB`51_o|Hfeir*5}Fx!3?4cN2}uZi6%r9vR8n}LR@lP8Cm`@Z;emp{MS%|n z7g`y(MT8X+78F`A2^tt&a5PYOBp_t)KtMp@f#C-gg@DZ>!io|Mf({@JA0B}05>R+x z@IXMY;DN#eMG;{|4JMGJ!39Mj0Rh7g;t2u)TLU&^ur)An6igIsV326||GnY=cf}G3 z4rUDwCW8-x1{O>b%q$5DS{XPbSQQ!=I2!-|Xl39KR4}+`@IXmmLBeMtAq8P!1t9^U zgn&%~N{Sxr9vmzZ984Na!mI`t+yq4gEm#!-HUw-8Y+&GQ{QtdyfwSTN_Z9|Dfe!`( zA0?PHni#kYE(v}RP!K5C7;sSGnS#Ru#Q>pnfsYD;4uT(o0tFiwI2H(mKwM;GEGF3IZPt z3?3>xR8Tyqpzr~dU>+zaJkSvMAT02~P=&dHfwSZP_htr83075c5fKGY`Y^m;93b#P zP#|HUg2O?F3!oGzs9^9xELcK7NJv28gRs&E1%V5oxH+J#()|Bh0|Q@z!p98`0s;aL zJ_rg5fYP7@qXY+Qf`CB7{~rkl0t_A~Dtr(z_#h-C$Sm+l;Df>kK@P?O10h2JQ3D96 z@IXk=-C0aP$VB*q;Nn&WZuFc`C@4@cu}I*fz(=J3Py{J_6i|YxVTI%tHb|T_GjJL_ z)DUlA;Qb)*QSgI;27|x{#UcZN50?xDjye@gXkp-X6mqy=!73)f0Rl`KAd-W@D1(DV zut+eVfq}c>|5t@}22Mu-m@<$WMk51}0D%tz2@6vsI9N0|m@SyVa{$o%J5ni7xdobA zWMW{*0hO8HaCiYa5M>$4Cm&jI2;0M&wwrJ#A(2?-nwRt$_KD-t*uv>6zS|0HlQ zm@qIF>m+b6wJ|VeiX?C_EN5U$t4QEr6lP#d(n;W8P-S3DoRPr6(8s_SpOC=8@Rorw qdQAcc10MrpbV&jSLkt6B6br=MNSOo<26YC;h=v3X1{(&(@Cg6_Ag!?g diff --git a/tools/ido5.3_compiler/lib/libmalloc_old.so b/tools/ido5.3_compiler/lib/libmalloc_old.so deleted file mode 100644 index 2a14987d1d4f22c62ae7259033b8c380e69c6103..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28216 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 diff --git a/tools/ido5.3_compiler/lib/rld b/tools/ido5.3_compiler/lib/rld deleted file mode 100755 index 727b42699729e82eef4c893255c39f1ad83ce59d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 585876 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 z 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%0A4%O-`Wh?TZ+5f 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

*3Xz5%LN)-Peu0QFP) zLG&Kz*=idYK<73}fXXRQd8Wp~zzB+OkbBlIVo>Q{#{kMN5`qUH`MiH-V@Ur}2Jm_> z(7t?7KMj5+B&ZIb*|-KKuhNnL+V=&ii$VP;ka-&zM4;uV2BbXwEdh1o35@cA`enm@ zRj-5vc*+LQTmmG1Nh=#R(4}mErH5WfI$6J#!KAkv!d9(dU|c(cfd!P#KylZv&%n~J z2P!)~8W>LoD6Vy2U;v+?w}C;We-VQTG!CHW=>41mje{HOmoXUhuVXM+zn?*6{T>Dd zP?}*qz`(J7DT7Y`ddQiUy+0s!GTs2^Y4ABHDw5{+K;xd!wK{7+^_(h4!VyqAfB}34 z0;G%tr7e}`37|8Q6hLJ&sNM&;7bFg%`}aWlApNTtG(cxN_IfjL^si*lVc^MVV9c#h zT>BF24;A&j4B)c>L3$wR=*I=9AHeAdbarR|PH@>~0WaG?e%D}Nfz>z693G0GGL+FD z><`G@pWrc;h8>KrH53_G6B~hL--Wh7Qo!251}uK91_zXM zv5LW?AC@+}8CXDR160Q|Y9}bF_A)Rst_Qh;0kYr2f`OselYxQphl3&`rv|9qy@P=@ zq5(7?fs$6%FgT#JRWRx_3uV=Fi7ena#o7i>0PRPI#$!WEe?PPh2tCgX)K(HufUZph z-MP^LX#=WDB!cgK1=ndFko%#)X%kyp1#+f2)D9eNz%}6T0)?9cs67b^mwqh<2FCRV z6d5BN6jeDHMAmCEF!Zlx@L0cq!KOC{61S2K4B+#bd-EW5NAFosEP~gxD1%u2>lr-2 zb>bQZhu&8V9KC%EEDRD34ZYnA9E>1$TQV>(@ImwaPjH;~s0@M#CVXBjvccuq7h?yOMk1>b_gz#!`I|326qD;QkX zFJQ3fg`U|h%>Yg7E5ZJ@=+$Q6VBkw=V9d!-?A-~{!N4F4yIXHPs2tQisyPgdYtJySfXk2-3@)nc85q~EXRrXZlR&02z5=B&Xj55CDz zT)O~VF6;Co+W!uaa``i?{eNNo612KyDTB%SjSMpDH!w)_o(I|0pvuG#jx#Bc`}%h< z7%&JpH1tbC(hswSha#xY29gs}fZsm=Iy)9T#{%j%gX#~&U5cP{QUz4|S1}l<2{17B zdV}m>U|`|~`v<)0T!o2&v41~L=|PJ#AaWI*G*>oHER45EwIGw4s=3BIF6UtAH?M}U-lpfVLS2EBd- zgGT>K25`F>R0pjGm4B-tZO4f@3=FEd42+Bo4XW$cGFXT){C~T64TFCFdWd?>hYZXD z3Xr=A1sFj0P70`k+y*+2f8ve*e?j3R4n5y^;?4j6R2UhY#TDV|qg9v~*kI-GM5h1$ z1Q-~?Kzb1F`TtMSfq`%RDh7l8H4Ga4s~HSHW;1qYC{6?wwhRmmf)63>e{dXu`ssZC z|H~fu|7HC;27~^c4B-0~#1U?^V*vH5S1=g#uVm2Z?`|q#UScFTGOgZ{pz5(fSQ2blRzC_?XDO98cAL3J@$%^n5`5!e~$AhWxgN*Fji4uI|$ znApU?E&$8Np!1+-G?jqDl!3S6!1}ce28=%n6nnup88R@4EBpuVr-hD{!tGF5nh4q> z2C{=0WS;;71CI(5LmC!!;PH5*bjPH^1X_PNJBq3x{?D$usdiuFqwVkWO+ zhzHe0ng+Q|^o-`P~cAn9-b z6rP~;J$VfS_}(s2Xc^q=%K#c!;$FWNTtT-jZZSIU&P?EegT6||IEfWpt~qQXG4SH925rY z7cqGBuVVm>cWbO)$KbMl9fJc}{&RumKkLam!FMVl=RZ(69|FyP4zRO@Rkaxy*RN&> z>0bjmFMDDa=*(mWMn(s4{&NB6zf}y@{m}gap!_GI06k-N9fJ!fZy@D6@OtveJ0bC) zt;oP306jwt+IIr`SM|vMf1tL300RSflzs9FhWP%K5c?Nu{QuX#ngKL+?6NT7|9{Z^ z8=&w}_4)r#vVnnb{TgsP)S-VpLjcHbP(2KrUjm&!3sT#^4sy=2>WTmVWf}f|S-*lI zpnoMqOjH3iUi%^YgVv~UTijIjN{j)=>uS_7DV67m;PH0on4JdRcwNg7(7&F+0hF#m zZUc=AfYP>r0t4szoeU1pIc`ut5*!v__d?F;dl0F4KN`VXKmWQ4R4AY)gcJloUI!@v>Ipz4)4101Id7zDs=n00vi4(q`8ltS#l z)pr1m0f6otSjqt28vwE!-2Mjn9dsW7q748o?_QgL!mq!jT?Sfq?or?SA9Oyu3}~JY zR-c0Ab--b@G!Zm64;zzM0~^Z)+XJ2#Hc;*FYxe<}xAqX&FW~hHAhV$QLHiEz>+gr^ ze*`X{(Dj4*r}*{HfaqV(#J~YwQ`bA!D2sX>>t1WE~tJd1_>+go@Phyb4qW=$QTnUta z`e!y^kN+O1{w4+mO#Mk51oihq^@GNwKrpngR9)4*asWWL>@K^3R_5$O+f zcL-YgOM=Xgxw4_Zf$-+n~;gY0oZwI6i;2!8#D^cR4|e$aX* z{Q42;57bUV4}Z{FM*R8_=`RF}{hwANY(8P`QpMf097wmEhNpNPjU{><8^@ z#IGNb{t~e0CtQ9a(q9S|{e;U;MEc9XqMva2iAaArSo9MvKN0D#0E>RYm zCR~0Z(q9D@{e;U;MEa}2q91Sh2|CBTAC&%Pw!5rnVrT))i-Ot););;*COqd{LiU$; zHiO%luy&KE0t4jk_m-wF{WBZ3z|%1+cuyv%{|DYn1Zr=9(mBYzAT@~gN-|`963+65 zfuX;v9kh0VWvvrKLw|QWxaGPwfuRAde+ZoudBg&0FRAbSAJN~}!U1Y)g4f@H+L}uk zKz+tF>z6TXSihWMi{JqU4^UqbbgvG?ZQ%QWR;a-5T1p1>6F_S^G*o{uu&m#~u%!1V zWE@0T0eY{|3Wg=f`g_?J7*shKSk|v(Sb}7ZOaCecP`RMd3+}Oi?#}!VX*aK70PoEb zY=Dl*Am3xuV1RUoQ8KvS28yfxwUG63f(x+dS%9JkRF^>7qe$i=xeK)Z2O>YS3A}~^ z)CL3F0UDg&{~>^Z;xugy}7KTw+EmxIX|}+W_1D-QUuX(?7Feg-Xj3 z@OoB|UQnNn#SwacNJfXoHmuPLqwnPUOZDa>qKqsoz70-8&}XExYfgys^u8zTC9L30TS4XWA6 z9qU(v$FBq!dkYkMZ-Cp-Yp~8`??Chi1Q?hWg8i_b0lYt1^Z_GeZ{AF3_<_c28Ng$s z;QR$T+Xv(}b<0%n{!_i-zj@MGRB=S22LrI%$By zMbr^8_60ukVkN@{P(MjEJGlqs5A?7BjeCR4S&uwl+tbj}-`mgu+CvMw>w>WtJk|*5 zFTv(ocn&nEo=aW<9+O|dAi&IjLa`sz2L-K}!8U#l*~bn`e_(%u><0UB4+E&5%!qUR zqpM*;|IEgW{v`}kCb}~4BI^U|Uk%M839v9~%wdF{bF9M3xNZF+h6(*E8NhRv;4o5z zh7oAp!a9a6;4oU7yau#p0cRK?_xC_y1X}0Q!@vN`3yd?6!U&Y!L30c|CmK}WC!b-~ z2v7v2dr)|T$^?*oSkn;7977XnVblo^qX`pL8DufSXe|SHeX!sHq%eZs9Rm%cp8jFPT8qOI z(4fkZ`~j4ALE*#b?V;F@z>NerVtco_9eJj$Sp5k@l`dHR07I6Iui8 zh8~C;K=~G=Rr`$@o8z6ZXl4l_L*QNvz zoo8k=wDiwx=m3QgEIlwwBBcjVo&k-+NH{d8zE8=3q6*#DB!gr4NFv7 zQo#E>VCM8MVF2ChQJ})gzzNb16Bl4$WCPVTDgq1wLeTT+)dc?kXAmf8P~XX5!g#Yn zQHi1{i0dWHrLFC3;jzOz3dUk#j zc)S|oKk#};h(CIv=>c(u4=30hNO}O3B{k}n=_up3AbIt53=N=p6%|H?dSiWt|Dq2e zXQeYp9%44;VE8Y{zyLY32&paCzl>qU`V|Z_RN!sa6wtnOjs9f}GmzV*Nb;cZJ&^ny z9P*$w$r}BO7(jd7O2F<~!vLCB1~C~7vl#x1IzZ;+7`TO)4LlkC3otNbF)9eCs;^~e z=!Kq>W_X_AzvKhRz32>lr;nApmoa{{Y$}q0QHe0R9aG= zz{7bB1E`MtZG7rft&^ddc@*a|gu&V)=7oZ3N zxfSGRcvwN^2ADu{;PyIboE|a8yaF;te+9PwX9lQ^jkG2^WBpPFaGA4y8AAd1KJ#_p z`^+uC`R^dKy$vd-LGA7LsSThq8oez5ato*qgP*HGsN4s&1G*Y|7$iIzR5?;-z}o>@ z5sE~t-2s>30t}2S;4%Svey`{P2Jl^*{e3Mppg4#3XAUwz=1gZc{^?)Jkkh}6p#bDw z^(EkY-a&UUf$k2D=H<}-)Ftaz zG01@0&g&O2D5!((4SJxU3c3>!oY*0`It*cTwmI~fO0NZ;Hx)&Z4$Nf7QGWut^>IcT34u~~eptYa4`W29V7sL+Cc^J^X70CUlkn$dU?=!TX zw^$FF!-9x|>j5Nj&{!p?egdC=2MX);iy-rYpgBfRyb5YT>!;PAxyAqgMHAumQzAGm zLh3hE{h;|iXr2;Xhf+U5?k!+pU;>%lzm&lPqke*{k+LxCXZSDpfWc(_dIld*+7^7s zU~Hl=~qz(V5!qiqh_Lkk*%1+RI4+Yj1%0UCSQ0r8JGBhK>KLWP9^TloyJZxLj@ zje+NX22lOfzn{TIeJ?`>XnqppPe|E!{t9Hg==*{7OE?_**KvT>wn5f!F6D4pzl_5J zw$4U{pFw;5Iu4VC=RxbKI86Fm+B!hlbk#<^fl5faV?)G#NP<1QZ~3tolj@1JL>e(7nkE z9l(1!3>GG^|LcOe6tfC8f`cpn)2e&QDjT4TlM6?FTr#c5oPg)_tvC%V7drI{;c=HBk#{mp228U;@KI zuz71ZO#0VC>|*RKP}V%iz%8Qi{~1V5fC19~?gz!eP7Vw86$}QdKNuK6W-)VeXp1QP zpSgYq2WVdyxK-7^n!`eU6@vj|R)Qj<4=DZ^R)G8q8M|zRg%KY#j6nM=5n;3z6y6O} zRM#=^tzXAs09y9}as#MLohSiuw=pLJi=YC-WRQ6OY7UeBRZw?lB`9k)g2M=Wnqfc4 zto0lwpfhnn;l2>OzXhBgOw>6+Yfw21`d4!psB17Vu3y1nGBFEeA_D`XPlh5|e1QAH z{h<7_0%8}l#sOt*MwBqh2kGty#mg!V3-vV&2B0-3AhQ^A!C`b@{c3O+rGnM1=de&; z$6&zt?t~)aO>h{AgZzsYMr_b90=3gXVZ;X3yMhB;4yj5oun90QaDu`fZ0{Nl3-#3u z2B5WOpmkh~zF>P_gTsCuhXpA9)ORu%Fy3@fWPAa((+O-IYTAX_2|5!1WG5u;?%*)! z?{1i)&dI>GekF&&MCiTajNJi>6MZ4^Vz`chMeqQFF4#;^SgnVKl|DS}s)6M|X072c znas(+&<{$xouEB2;J7eRUB|!(4u_o_2C7-0J*pfglffrvGcYi|IG{M06KaBYBvLDAB#59 z+B^1zpglHgIZRZz7z`J#0QUYAGw}ZU&f$-RKLc6<~U$xg8ln|frEMB3q?rXbrQV)12o0~ z-cP@uK?dX|P#A#RfVFM}?Ii*2UxDm1Q-GLr0^I)Z?`shOtt|nyjX_~4dVt|Q*sT6G zaN8NQhY{o-#9h#h9EkfRz~wq*zsig@@Hsr7wk1ftFav`;i0+@+_yqZmyv2(c)F=&_A=0 z12nh9tndSpHo@y%K=Vg!kh`uBcMm}BhU;zvmuH}J)j;kOOn~0+JF}4kHdYK02e}VS z_q2icV#CJM5O;Jpa)8?9820wIfluOrjhPEBKr$aX&I&dc=FYx0@VN(|@CS(_?z(H_ z0PPpTFu%VIJRd?rynydfMv52cI7TA}a=gI(+tCI-%LlYh3hW-}SQ03l5%Ud5@jkN+ ze1|z~EKe93H_$a};26d5LucC@klC>KMBLHZ$bmTT8_ABYHt_rjY|jVcp3X)N&>15b z=6AP&$GC})<5ozVfl~%}eH=WDu*Y#r4cPsNu^v$nAJjGkg%f&u1hvmWeNd1ZSUig! zgsjo-2hHowY~<*D!T`Q&45S7g7c<&HYb6Mzc0i~yY*tkRMO zK95%ASQ=<-LPCH6+Wv#Mkp;<(;JL$o>}G)b*(%4tgv(|3SG~Q!yV8wZPLK&<^&iRWWZtA2{wZbmM%r{y90X8 ze;R167~~Fauo>9>4L;*qqTuK)UHHdesO{Qj0!@R@d?cmt^i>uYSi0^5@h+QSbi=MTLA$2~;v1lTwa$UgNY zkUk%1e?$Mw)*ImcC7rD|K=IJ4$-n`szd&teM$Q1`{?67b>lZQP^sivZ0fmoCmjY=2 zic9|*1|J(nhe(i`^{W^%K<#grMh^y;Mh%dBh6KQ?^W_Wy z&zCWXJYNo4dtD&l(g*GaFt|0ifY&#;88tGy^fxfLsRc2(Gr3?xn zzku8XieERCNzGtd%dy$bz@+K|eg7O}pUVmcoBp=eBhYs5p8n+w7QHMC z44^wEU}G^VOVdI7Zd@?g8=P+X>C0MTIJqwmLYRU}2=vk`6xSSY>It0LaatJrU~{F&Ok?p5F=CH-z6TaNA5}X*y`!40QGg zFW4;ndcb>gRFA zj1(qlcB6&K-U_JQ;5|_5H!?`{Pi)8m?Kgt&5#9ve!zChkfPq!ba4vX16evtZA3(?5 zW;8@Ff#y~u(j6ugU6AW6u@_h!SeJ2Tu<=-)|KOA2L2T&0Fp++cpEtqxhC$Qmo&+j}iwl-;38Y21 zfI=TVT*L$+<;Wy%1_p3ACPL$_2NG|pJ?S138$miD@iws!9B-Nn{1_O81R-+|llY-w z`j9~a6sBT=P%~yi%uu&X_n8c?ogijR)&QF!0rKM{PN==meR4?d`wKD)6hEN&1ns{9 zr6Vyx=zgtkh}o*y=>ZcHk=&O983$P41Mh?5h{IiTpmBI%{Za;#{&fr{p!^QX=Yj_q zSit)g*MsW>p7rY)RQhK&c7W;@P#vJc%AgNEA7KaNd<0?8QJA29u_OcI`kf3aDjWK>5m;B#cF7@8i#06L$JYyCO~h5q#nI{hQXkg|)pv)j~paFTW*7}v;b?+(tOBhu8q5XZ39iX<8hyyh2aoMwofdhVK!#W0? z{v8Y&pm9OanLZ*4|F5iH&!7V;6F_Y+^}P%RsAc5N3{aRs>*OPd_FMZBP`H7^W@(lR zNH54Ou=X3sJV+V4Qvz-Mpv&unY~omBw#11k$?j2ki*05Z1=WG{yp*FYf6 zXZ9RpjR3Xlz-BDXf~@0*w~s;VAF{ypA;|4;e__tqN`U5`K=Ys=bs)1qG+aHT?m|0< zZ98QAV`h^9s2>ChQ&4z<^n%WC=wHVG8Vi>IjhTY;_(N#lYi8pfM12Gv^9Q&6!D+jt zAp;uEd-|6#X!Nvz{B8kmSE($`0_|;=0ILIy$1Gxi?U{nM@wYpm#xoNS%uS-8^CUp$ zCeCa;(%;g420i_P{fgC(+unf8RNs3YG!NJSS{Do1FRAeY?9UD0ya+y<0pjk41xySE zs_IJ^pl6R|f%Y{(+Ma#TG;ofI1!SM-0mxhh!4Au8p9&7ZOSo&u`)b&d+f&2dA z43IhpI_I?FC=G(byWbL`e==AF1A`zVv`q+4ix78! z#_YlFae&(cnv>kq)4~Lu+XBZC*c4FOhMb4S3c7~`6jv~{EImtM>LF`ZKxTr}gXlF% zAoYm7SfIS7zKmfHs9g*8%hId_(7KWSB^ob4dirNJnXFM_4FSo4^n>KqFJia?niJ_? z!T>&Z4N3e$e>Zfk33N^veji|aLk6tx1MUYcW4O}u93{Vi_FZVKU!d`%zo#8M_tV=0 zS*t7wy%(duxBX22I*lj2Ye9SRD;ki^1MM~JXJcSM%736fwMPF=jVJw`?PoywzgH7< zW|+nk&|Wzah5z6aj*-nk(hFW!3HBE}A2b~4X@P`;%F?VU>lbM}=wGD)I&V%x)PX?- zthT2i1H48RdLC784{L~OcGd>;^=P2}i^}sX@ELueejO-G!TLdV&1_iG)540f<`^u8 zSx(?zUkWj6PfrVLfC?)kQoB^+M*lhu&>ja3)`QTpufHJ!e3ui<-S1fgRM%$xKwk$3 zbvNV=Jmhte5WBFu8!QJJ*Mx)}*e|fP*`)euX5*CpB^uzd0#I8U6mBezP(Ogmd(gU0 zOV$9;c`WO9g7>DaQJ2Ve0j*mAm8qco3honv*7hp=;8b~@4JxA{`3dY!9AOWZqnaN| zV17^swLA7OXu$o@*^mKV`wfc+P1XQaj_eN5`Vn;Zt31yJk3WIdYJkE49Ijw@(!md_ z7*as?iNf~ZgZrKhSNfM|fYXM`(rnNkN=UeZ77UsE zK7#=y4ps|ZpR578UmH9YgeDHU9~@JB6JgvdPrT_zgz>PUIr9)ptUd{vsBnL z7}hV+c+$UG1GHC5Loxxf&Z2*2qeTBQjVJxfk>i(vv40Ijoq!KgS_Q2chUHUGT3wrC zfW5rTkpS5_Fln_>2IPONeqRsqlk9{4hrnSzv*Ans5)JU30bo8P4j%N+Z1@7=gZu!Z zL2(AA!TAkGnFy9^cmk?>uU;lxSigXQXUzfzh6#P(wk6}@ zbqw5-mqFU+0tXntr=RtJM`#%sL?1xbtxev+z^%f_pf1eFpsvEmP$SI9psK>ipeD@7 zpsd2kpe4-6ps2#gU@y$bAg{v65G~BeAgjX25G%~cAg#j4U@gqZAgRL0peW49Ag;p5 zpdrl2AgaR1pefAAAgsd35GTyYAgIE~U?a@Pz^}r{U?ks(Hy5qw`-0%+V%g^@u;oDnjQt0Kw3xMnB#Y$EU+l`1C#)B2SRJd;;} z%~29`gylk<@^#A`4 z3ggA=5n(2B;6HedxPK7?4`^&beJ_ImB(JaJf#&rK{WF_9K;tjq^ag4pEnzSK^=H>Z z&RqhJ$Eq&{pS1z**MiQc1ouUEFqo+DGbk=SHZX8=-z~g!Y-&F_@_EGQ=!A3qF$-YzJt~ z)A}6@CZIE)KmcipLH+>g z?Z@X2Xnz~&Tp{RrRm;yn!w-Dk9q0@e6+Q+=&4&z3;Bef-AOSuD4-$qppfk@v=TV6$ zFu1|aZR+2_;KCs309uET0;=!9=isR@fbTn1S(*b{?+w}y3t6kPn!y2dww7wn|No3W z;I$%aC|m4 zOAfXo5M3+TMV{uPk3Fc}2`6xV~!?A*g30XD}Uv=$1Ira@<;t>3|*0a`cIzY;R{ zqiP8r{}ly?G05+rvzK@yAnxsUPz25M^)H3YMS{W&G#(0$w+~=@Kz%j|6+Q-qg?^xQ ztf28q1_sEwJq8_6xPZb~U6+B8aSb>wSAfp^0>u}|Eby61pge>)mkV0oErHGdtmyA+ zs9C?C!35M+SigtCVEqz?i1k|;bk=WS&{)5jL1q0W1_jufT2P){zkmUBj)M;9yeg!0 z0-8^h0q;40-mL^X!%JQA|Nph1GYwZj)~15a9R|6LRS{ao%xrW(Tb}|livtt}{i~pQ zyct+}eHd6K7C_FcTI zyf}ytTjSC{vk|NN!FIyj{}QBwfk9Q{|Npfwz-Kdo$6-Nx8bC6vurdOp)# z=(-%-Zl0hDx_c3%7IrqG>YM-n*YY5_ISVAqz`*K=6y{jnJOgyT9>kxZv&zphuuK+a zU{Kx3z_|7%0}E5a1l9GM7(zhjiGkWVqKc3--ro;(Gh)6LJcfwd%?ngPXK{gC)eFA; zih)6u>;M0?T}W;QuQp|1V27=p!5PjgRQqA!yb}`6lT8^IR8KN6u3gE%!n9z4>iR7V zA^qzi;Vk+PGM}l!0b1|M5CGZ_pu)(&CFsat2u@3m4B(ZP{XI}WA=Vb*^%FSlL+@nm z2hY|qFsN4k|GyqoH?D)G@fU2}k1*^G9vpcB z>@VnDj=kWLmw^FvKg3#na9awJR=~53Xz2@jF9Fz1@H~O!uQd#ybKhAeP5^}y1LNAA zP=A5*@c;kfjQ_#yG*})NJqT&X_0Mbs^#PE_48d)k{{0Ll{m`>5`!_Kt^lxTR>EFVj z(Z7{J2io?6o^dvR0<`S_YI~``+Fqdk1E}2vD$_u1FHn63uKOVU8}M2Ys9z-dmoUKZ z*IB;^RQ5yG!>cUK=>Y2iwcVlf5TG%H$&%o+DfPq^A$v|HbAaa%^F?8MB|00x;i#&a z(=!n|cet4G|Nn{FkompE+zbp86&aWW7#O$~GcquO$L`lK=%~KWnb5zML8J2_1H;UR z49uW24ptsyVAy#Ow9ldmw0{%42LR@7aQO!5i-6`ibU^dXh_UdTDWLuV$lsXlt$8uf zFk8_-vnc{xM}Wc`R9ArNjE#``YyAfB+zV)5YzU}L1zuCKgdqep4hafZm8ChL^B+L# zR-p0?M?m{>pmHlf=OOm5V*t%B7ziF>{%4b&fCet$o7>>W|&K++4S4~aBS z)xVq}1g(z?T1x>j0~{6&NBWmAfY1C>S(*b{D+M~M7j%Ayfj9$foU0)MG*+i>nezj- z@4J5mLjdMjT@HAhY(3h?OxOTqCYJdynEH_ZB@8~uVF6mB(cjq) zS^Eh+LswK0IxpJQ{09_fu=SUs4v;=!|HOs}&^iD$!(0sz8>B|fFjuF)yL}4Cyxwex zI?+UEp6h{{gD49j>nwXAZN1*LOTgjnk^m8H4h{mr1WDL`c+NFF@@2#K#NJ;zwU>nBu} z=7RQ?fYKB6{;h^9Dob;b_v%8z4S)TF5}x2Sg`o3ob})d?uIWeIXZC+R2lx&Huz0T) zDAdr(JmmXq;ALKiYX548S)lWxLH+WH6B$7FB`~hdgSP`*`qzWb*Zluq@F4?aT^45B z1+q?hW}{305(XF09y8>0AOKspy@CO}*QggfD!{;?4yso{_ie0%ibMA-AhlmSK<0tW zVg%hG193MbFM-Yw z;JaHwK;!zVJ-I2^$MkbuKyw+OFbD151f_AX8B{GR8lHgeYy{Z>HhT}aj|W;;g*yHW zD#t-`pt2iOjzjhuK=9oci26Dl7e}UA3 z>!Bq~*v?GAyJkQI;~a&G2K5~bDvUo)D1y#W0NoX%4jNYjt;Jz26f)IfU;^Jq13p`U zX%5H_>dV0M>k=%E814hhQ{q0vSwU&w_0ULW%>kXmpu$?n40QweY(Fe+SOJnp(noR_ zwXbH#QDJ0Y7EHwOA9%epMP{#I$OElS7i`2Z8$3ruiP`;Y8Np?b-~z}xE~Iqx1vyM` z)S=)K5!}WBr9*h1m}voIOl~T8{U4})0<9|n@Aur#06qg<_1uz(-XoAP8kqalmoljL z_k+&OYV1*cza#=S_M^haz-SS{z{ntRKpVX8dM5*D4XFhD9DUIG)tR8Qo(Em$0NF2r z*Ug}@j+u=KsvJuqK;s2)zk>SqptYiqJPTcqGGzm(t%k=R;4v;N{;+}i13cyd@&_mn zg4zQDuyeo=ZkK_(0W=N*-oModu4|FS!FJ35hf#vM#FB`97Nju5>h{U7^`9O6eXXE9 z+!mm536L8=>)#plDzw(`VX#=ggaLB@+-`a2tP7$hAVR5hCg)-PZvVB`dk;q$04a_}1F zfcjJnTwSFft09MhJF!94t66}tD?_n&9fLss4u%X+pN#PagCuBdZ2d|Gh&lQWps}lvesJDY zU>1et%{2@q{h)RhPhf-U+GYVpU&uLTHjDxc%#7gui{Rc@?@b1Q{`CwQptG-;^%*2p zc)(}Q7cek52r+6zD6U@(?(0JGJ!Gt#5jxh*4IS&|6or*{YZ*#F>4$;$V1w$pW&!ZI z^!f}8AUhc!BJAwfWDw|I!I06vhQWhTgF#Y-mw|EpT9AJtgg|>DL3hvf?*N6%_y5d{ z1u80x3e2D~fBia!oc{ID@aI1X4u57%2gP0sRm*e5V%F-WTL zgU3M&7#K2yn0X68XAC6t?*!SQAS|v3Ept{fl=OEr!oVPkWsiRUGKLZr_?a+ypf)Xdy&ia+ zl!1W(c7{v;YN#0r4B+{%{v8Y@pfZR-BC|pDeX{`L`V)%%>Y%fh5PL6}8IaEy%mbYv zXwkopp`^d3A%}s_vq80|Spa!m5TlNRVlO)b3*!M4eW1BFi~dy%CH*rRau~QG8`LGx z^i^ai_AY1OV01vy2Wks|&gFolCs162(vu!&E(_ttUUdc@#s?_+K#yP6MK5mz#T66pt=i^7NOw=Qj18d`G~X%N>ghX zYCz*|j5?sP=zq)CgYw}HhM4|U3<;odoPN;Qszg>({~8AHxnm4mQB4edUQPXL8GP2S zWRO|Enn8ep|5Q`|N(K+mnkELGsHXlE3@PhZGbk|do@xTEH)i0BY66YTGjg3!WVVP< zWZPnUnI9%faXs?;UdVu z03IRjU&fGvoW>Z~ikeX4J0Egq`!a?ERCPg3sPUT*T2p7yzloU;2 z@eLCg*iJPuD;R*z(!K&}ZzH)CwEqlbUI?mrSxt;6XNcy5*1Cbzf!0Y*0GR=bF9x2`K77cc!KEuV6^%U&Rp94=M*= z6exnm;~7sSfaYB+`d2dqFwV?S>|ep)!??pk5p=%+qjrTNBS;<6UNOc~28s-9=;2fV zTF(kehmdnYDnMg;p!NkaR^R*o2WTE}{W=Dg=JgCLpmqafyjMU~fPsM#wC@C@Pkk?> zKZ&dt#0JTMXbLfOe-10?+%!f323FAeF%X@>zyKPBVz`%L|rVd04FtFYbU|@Y9z`zP##|jb~ zU<~&M0e28m2a|`+FvJ8HSidkZGJx{o z9|q_e5s>2q7}!83dNKT`00SF%JOd>8|373s2#f}a!LR@W zn}h%Zn~VTMGw8~Dm@u3cU0bmG(*FoB zWUvS@WQYhbWXK3GWGDzQWEcoAWH<;gWcUa$WF!bMWMl|1WE2Q6WV8q{Wb_CyWK0lX z$XFo2kg-C5A!CC8L&gCChKv&e3>g;$7&0CRFl4+CV959&z>vuxz>vuyz>p~-z>ujS zz>sMmz>sMoz>w)8z>pasz>pauz>t|Ez>wJ>z>wJ@z>qmXfFW~<07K>)0fx*y0t}f) z1Q;^U2ry(m5n#v!nfFJ4Aq(7JhX)D+14BWMAwxkQu{nFwh{iMu1{ah0UIJ+pZBrU%P>@Sesf@B8p#AKSeIhY3d z7c8D*2;t`^<%22~kXW$0XMAv25P1Cri0$mmz~Gu!mRXdamz$bbqEMDtl$n^6ld1rb zRLCq=NX;!MskBnaOwY?NN=@NnV9-rY&MpFlIRgWOZem_>CX8JH;eb2~7B9#z&a7Yn zcTDivk({4blA2ditWcU)l$xBMo|jn#c0yua3d~k(1tryDC562F5{3M{RE7LBD+RDC z6u|Z<=z?vAaKM&=`@JClg2DoZLE!|$ps<4B#9{^p7>1-HP+Bqsr6q8m}xtFd)$ke$LKdF&OQhU!staT9gWM2u#ccss^3TOHKxv1;&2P&LFeE*u~kI0fqIoV1fIWbSYM4`MWvm{la zBws-VqSs16wU~h+$R{}7(D$;;Il3MTB<58r=sGE+f_$L1LikB9J+zP=i5YAU>3fVGqbH$YD$rJ2^2Y2No%yutekML}zV zWu+#UfI_-7IX@*;AuTf}RiU^bH90da6H;!K8#3sYGcdsQfR%7Dz{*}wnWnCrlN?{H zj?ky45DZQc3T3H9#hLke3i)XY&I&o1Nkxf8l?o~Osm0(@DLFqcEx#xil*SzWf;|-? zjP(pnEp-hoEiCmwaSIAxUGD%-X9bOtj8uh`)U?FXoDxk?`I?`XQ>l=gpIeYvk_jq# z%QH(d6m;Dc40IHdGZORCGxO3x#)3rj6yRnd(kjRdP{D{{L}F4Vnh}XfnR;B{g*mz| z@xGn`!LFbK&U9ViOa@(-`1s%u7w7nRTkyGNx-Rhn{=uFR@xlI~LC&sVL0wlT2BI+3 z4$y=h%svPkY#)e8q4prtQRzmYbgdf! zrPGZ-V&HRMbtBRtbhiJMHMph6kJksN)mOQwY5R% z0HOv|OX?OUqNy#(Pfsn$NG$@X(}k20pt4XQ2`Nh`fKy(1MrxiyqC!q)UN*=fCHWvV z1*t`#47zR#5KD3si%LMIfKnTZK``5_6m*Nhir|d}P`U5sALQ&B?;ijzV_iz~ zKy3m@c;#kRD1bx82o_r9`30cN3vxDtt_!H3wS|N~gbfLA2pbYtE*bg7CGjAI43I!& zK+q{r(?I10G8?4Ym;o9m4B$iFb&=(f+1S+j8!+hl8#3tn8$rr?e-j4X#L|-d+{BVh zQ2AI~0%qt!Y3KaBw4BW35>Q447xvZ)x_S9I`N`RkaLp;m1alx^l9XSP0g3|Tl8b=> z995vE52UmMmt3HzKv4+^L{(5_0&35I>Oj?E1=V5@1h?D3OOrv#nE|9IIWZ3ullcXy zd7$zqH!&{-TxP1P7OR6Ipj0ovv_#LILC>CnLABTlB*dT>!oX1Aot9OcTb7@km{d|( zMFt;LJ3|4<{M2k@2Na}{$VXLZ2rr2vE9(l%er%0l}^zwuWY)$b*)p@t(nskn$L+2E+$t7G!x)hS7D2cXaafH#V|0 z1eLd-!Z$wH)7KU%iV%zP^b4^y1{r}Q=Hu_@4iSWz8ypo75(E)~tAn@?RWHar;93Uc zQZU09t{!YZ%q1X)n3*8taJ$0{)IdRX2Uv(9G%q_ZzdTQ&EHS4vRUs|ENCA{_;}erI ztrS#21u7^k!ELh4ykrpDB|hFYBE;1%*wf!HI39doux@x_4yd1`TT+ymk_n2mL=cxj zx1=aDy(qCDqnLp~w=^#$HI0Emw}1iUUQ9D0T^V!}amcyE`#Ac!hdR2u#yiIc_=E<7 z30NG)Cl}@)umKn}1M9kfR?+4B;=Bpf18p$KYUBUniePPFB!Fa=v%ix+$ayGc!305V7f(MQPe0dqPrr~LPrqPKXHZ{5*QGce)G*g| z2@VSamHVJJ4wwbDD;^{Z(hH*@su&n_RTvm_Q}T0i5{n>gXx#;=mq2=v>K>Q)cu36# z5|58Z$bk8vE;qCZ1?KzuySN7V#XE!i0qSW(T36t(h!5~|2CIp83HApkOpx2iG#iUq z!I8lskpZspU_0O(T^ATLI5Id4MGha=d~1ke~(`hz6HIuy843V9<>$XGjFKB|v_U^kdMCbYTF;TP_0wsqqbt zqZtZ=tc&i#z#qMacT+!gKi15{tE%=^=Hs^0-2x8pd0B9KC~LN zc>o-5kYPUfI3Q&7jl_JLmk;tXC@dj#L>VYALh`9&ZensqW?rfWs07hu&~+@XEG|jS z)c_@SO$G*CcLwm71=jQy0cx4$msA#{g2yOyBZ3)pBa(AdtU%)y@tJu!nR%cC#*<3& zOF`)r(&i?veFtu#F)%QI8fqZDx*#`4_=19kK{on*?g6D+kUX+I`AOLI7Njufrlc_FrZO<(nlLb=rsbgafb|rdA>A8LpIi?z8dS{1 z03AAKfD{toZY`*=%#=&Suuky$azJn#l^Peka90CpFuadw74WcH?_!? zfk8LFC^J1X50q6hb5ipXb5m^@bfJv{TkvEDlmp6Bu<{bEtPOB;L=3{=js^yN>X4!V zuR5e?Kvf6wXMRx$u4q898$~T53JTH^8E78%Ir+9Zp!}7XmzYyooLLNtgS>ngkMg)F z0Cz_ibW4lC4A3Z8K~ZW!VsSBOsF=YSJQiP&SOgj+D@aR(%E6N%l6nTG#1sW2CB>C_ zC5aVQ3VHboiACuOiD@ONMUXKIE(V6QnU|QGnH&!q8)RT$h%d@XiO)+dkI&32Ni9lCOipEB(9L!NyAR|qNR|c7nLyh4 zD03A0*uw)fUx2PIxu_&h4-~dOn0*J3T2L6l^r5ridh_z*9ZO5{-SbKzX``ShwK%n? zEHyqQH8CX~9RI~-MWEpk2Hl*bV$eby-JFutqTJ*}P$8z9lbu+Qna_ZrljA`R3f-J! z2Hl)o&@>_gc&Y#t51=UnBpNi209D7Jo0FDUT$0P6o1M=9>fC3RKU~gHfYM%W zYEe2U%%N$IBr`zzL1ib%o#g7zFDL=m0U-Tkv>m`h;V}D2)emYbz}oRp`*rj30}^vG z!3`SS?1D^qJ3lWU&LcI9VC|dI^i)tbhqOyT?ahMBWN>@4ATt>>K&A_dlN=J;Px-V} zPm*6jeG5|E14_Fkskxy1kyvbi2%CHc20aqvlO(r-)^ZdZGU%3oo7A8_1323Avq9?* zK$F5qWqv_sGB}Mw=WBISb3ntn47%v?2a|`Ga++=py7WFBTZeJ5(3r7CW|~4~ zi2_(dv8F<5S!$j_Nk)EYdWJ$`v7tg*VrC9_76@!U)U-r}qSW-#oWvsVh_ep3wF@&3 zw*er}L&6$;t_3nFq@z$$RH;x}44RujnvVsK^&|8_CRB}$bdxemAQLvmkilz+AzZL@ z4YmUmqR6s1tw5Ns3!X(MN)xF61#U-x?Sj}3(TL)FB(qV}B zOEZ(Ri%SxVO5!u~(!h6N!P6#a-B5XaR%vcQd}2v_YCdReIR!M+2WlfjF?i0^2i(2@ z)wQtt541i6nGbI@U}N4m;S>RPtkhBaH0gZzp z+BuN63R!I(q;?S4epvemM#IOLlC`zdGIL50{QM$Na|>L5z{^um9g>#BpbHx6sVo2u z7r@z&RWlihWuPT9p!R<$X#R|g0k&QRJU0r}rvMUE0B0!hgacK_H zv@3(IGHg;2+Nn%U(NhQob*{=l3r31lQ$by%g3O%MA_Y(?)&7eYG*Ax=kxYj6v{DZvS2fU`o%nUK-4qn&*?b5-VSD9J@Uiko>_tb%|>I2&c zQJ)C5L}^P5gq^T92)S-9El5c$No8PwRBJFgB@NuUYyoSgjf)D(rJN`*vl15*Js9>>L?>z|XEn_0qOYG440UT{3a#Go{! zz`)Fk47kz)#7G5jEbICQK=Pe`KnTt>8dwRL*9Z;|0H^2R@Bo}@L(uYC2#&l4T6+qb z69CaT4ATv9^$P>5arFzsr6vqk$ia(Ia6OgRB8$a1W*#GK3& z&{8kxOgd<3h%>YtPXw(=CdHf>vKXkHM?q_EK?`i5v_fiL8E9QNtQgb*710Xl z3wXivabQ6Y|6s_PUU2#DLYuM@G@uBYivrU`)(x;VBA~huwRi$2MbJDEX!QkX{E$I6 zq69q01WNR}5y@aSxc?uK2xf!oXkCoCoxGHs{N%)(l*AIyRV=y@2%c_4UP=;Zl@}3G7Gk)B{u;vi1j}7HJFstd3Z{NbB}Meg(x(B6xTYY6r3AWI_6EdHL~0CI$uu z@oAuCjtsgFv=_PS_my%BvHP%j5M?}VYI2s}oaTvTEJ8bb!{qX98M^`0(hPYnYDe7!e_3sVEy zdjnCESe#m%npX@OX9X|6PK{5_&jWAd(Z%5B=YVF#bd&RQ%#A>P12tlbz>9}ja(3hOd2s@sa1a!GpPwkqq6GN(SAO zJP^jwm~@Ar41pOKJsZjWtLghz3OojGdYi59t+v3L#yHI=C2e z;6YTO1Rczb;&@QVg3>TVKZK9086=Mu@*qEeHfBKW1#i+IpanedjncLNH(N1FdEL~C z#N?8A=;j4bctOWQQ!7eR^HSm=%ZWka6$OcTDeziAH#G&+O=JMgXD8{u6P!sAHFzBY`7bT}c(-&wQuRO5`G~llrf#B$tr4}XSgGvGh2HkSd!rjbdP@w3h6(#1T z7UYAc!NBI`l9JPV?bjupuCB73?|cvK{wNcK{wNaK{vA?u_S{5jmGU>-OS?BG)Oan z0UH~aPTj1;9I#unatlCHVkmQ8+4&0P`K3823WzmLpw_K!b^(KKb}2(6CnS9_Vt0PFyi(2g7QCN3;{F-3*SQs zb_XcGgWPUHnz_2U1@W+b!^ms}SSJRwkp#4j5j4J(TM%EIoROLWTJ;86(?N)jG(QTO zt3V$YN1xHq&C7@6K8RmSq0_)1zar-0kk{6O*`VErpf!s5C=2p*L2EByW7K(mATyw; z7_1f%cDTYcFF!u9C^;juEES|T9yAlLo0pGPn}N;B1n(8d%Lnh<2CD(*7O)&>>n}(@ zxJRa&m!F#k>$BzM7v&<@;I)b5w8z2zOo6x&KFpQ1>Ea41hfwrKx`3vxKy@p4EC;g%K%ftppOX?_l*6ElM1wp{ zmY?&XeKW{TOz?JhT?89aq9mm%q-TQWJE6l&iACwq;d}<&dwRIffHyLgFzRxa2PC}oCxs|&f=FL%{!7ox1fXpG>MUy4^Bc1ppkP>`T&hR zfO0XkSg0W_En8mKMEtjJ6S@wga34K=Lusf9TVx`hP{y5J5t1A}gn8Fgvj%Tbu}<4}@-)W(Wpv2ULKqvr|aP1U0Agiz*cobBa67?R5%vln`x7F985VEbU}Frc(QXmd1dUJj&a zkj(9&&x3*Z&=EB3``%%5S)jZDV}qImSf;&T4JCcZ210O}fUH*rhjwCFVrC8~K|0$5BND{fI~>@bm;vqu{aznr5-ZDXf`|ZC(;I zj!~?D7`a5}8VAaDibt}1zzgF zpj%p;npTjR0-6*6vExCN3#j%&3}G_pMizmx8dxn>`O@N4usEowfsTCYMizmxG(r!u z9Au&~9zN&@iW@XBq>2XId;?cL$nCze{G7y+%pB074_z1=hd-^slTV;gDY(MI(!?Cl z5g$bgnR&$}sfmzz`m)5L#G-W25EO%M1cHMyrh`1bQK3OKBo-xtmJ)(m*`QIQ)S{yNBIv|C+N6qZ1jrBu z2HnVTO!GkFUZBN)&?$Y5{37sS5TJ#OX`mK(t|qA1gU{20k|4C(iB*g&KSQ=eLFRob z((^$Jm~@je)8ipb^5P&1H2Q&8HD^kvYE zEMd^~b%CUEkeIIvY)Ty@j!=t34dh&feE51OG_&C5dV-eO=Yf}@GPr`Gmw|yHJh3P* zGcTRN6S{`b4Lr*P>f>1{fYn$jKvIH+rjCMYij{(YX$dHKC)aw@Be0t{Uvoc;5B z-8_RsOS~gNM^S*+4g|OwI{W*&d4>i@iWCqiyVfu<6X`RL~sf#k^53+nbj zrzpXDl0kJ2$S=s^ps@w?J%6bw>B$9Yso=A|plk-vv>j|;9c(WOY|mRVbpIO2tuQ-4 z<|6aa?SRR-I6H&70-&|3*zGJX(ubJ|bql7ukkr832s0n#UzmH5#b9nn7K8btAjc4# zzCe1B5NJ3^dq^BnOKhke%q^0T+YrBY@cj*MlYw)(;f}t*wWt z2Z@9DiN%I+zrf5u7K5lW1f>=Dx@MReF!ji5o{_h zT#$O07mxa9D!E8F^iKP9{ViInH2WAUekoq#HEH06I+(5m)GDz|^6e z0~1Gf6U=QOv7F4L)QV)N9k4aoFggc(JSS*vGAL={az9)@n%!`5kUcOvb25`s%JmXK z=jo-C>m`BL%fs{``$<6;vKI~}2TGgR#6V^vtAVkR&4Ss9TP_LiH;_H(>JefP_rlzf zlbHlPrxY4~IZ!TAxrXKrr~-(3n0uh+qsZlCCKcxwm4FrM=75+u;~pdlR)=ODTpSce zNNxrV1?qvuH9_gCC_fF%Mv~738J3folnXwL#0V@6iZ2)+e3lbj-WW~Z7^EANUUT7L ziWUZ7^U>UjB8ILW*&Q%_IMjgM22%qKSD3p&UWU5~O%6pLRd?%Ei>E=`9Og;n0jO}kX{siGPrE>G&hgWEr67B$q*JOPe6o0@dDcK3flaKb$mm&L^YWU5^koD zsXvr+e?X0g)Fgd|)Es>Vl+FQYU$MIZLp+HXR1SdL1j@;f`hbA}$_7_DP&Vi|XqY&t zY=N=CV}npN-~r2ng<>sF3DGboJtK|aZ_AU z1nTO8W^+JCH^hU7{&3q@oLT}=0`(JExdPNy=sZYbN($UlP#IWP6YOU~@}P69-TZ?X zaY(~#IXFhwA}NaDFj?0jT)F_e>BlAD}_#D+3K zb|oUQVM;*aIY{EUCQwdtNp3pqxZ~uK+)S9F` za({rQzq7AnKs;zyD~KKJ8Ua4HEjYwKAi&i{0W<@Xn4WtAvqB=RSnu}QdF7;8qNZRGH8^lxID2yp%_%gDd_4d zfS1lfrUVjGa`l5FgMIwn^|%LA;-!KS0c13B)5kK!>fFhED+AY*@^ZHS;9016BYu0cWmK?)2E3ZSD76+meRoYoXH zRExobwV>7Os>KR$KIni1WIkx|3o;*6VIuQk=iH-+B{MK^`eqgsD>&!p7L>YkGZSr8KspffXHG6)lw@}0~0;NGzC>XgEUoDP+;qWHXVcZIwJKoKx2HM zwgId?0&gFps$&3MFAl;WwIB>)!^X|vlSWVh(7Blk&WLlm;PTLeyI}IL@jtjcQ~)NQ zTu=aM!+<)#APxfqgG*{zYEFIuXag#Asugkm4BQ;(pc-^$7JLR1D9s?`A&ohhJg7Ye zmjiJa7#ITb%TtRKU@Aas)|2yd<3X)2=-Nb(o522s2tw35gU==diNMVR`57btH`AE` z)NX{!gE&ZXu=XNc9x4C}6WACcTplVAkXW1y8mWej9m3_I0s%hy;5j7ZaYAG@;35>{ z4yZcNm=|0g#K95vpfNBcbznQN#Sv&Q0In`41#3LQ#yH{XpaQV-MWJJ?h%^Bj)Pf0u z-Ir66sNk%v&A;#lTQRR9K~@U=J;X-@xZ_gYJz{Ee6+11pNw{za`*TPg2gV1L zJK%9F&>HG|1_lKM1%}K_(7BtL4EmXwkQmozV9@h(1x?3*_oai(gG@rjXXX``fR?*~ z=lsD3SAcauECNmH;8zE(Q}aO+vyf;9c?1y_&b}_78q5|PCRolW4+wX$1+`~%b#-+? z>6K`^ia>|Sf$UN(2Gz$J5_A*wrs2C=#?!*xxxE z)KCKLe=EvQFG|c+$Vkiq&9oL2rRFA|kQb9YxLHQ&x1yq$IwOJWJQJjh{2%1*}t-;B)QV7kiT7N;uYrh?k2IVm9u zsyQhxAi@bm1cQhY5Rn2Rl0ZZ*C?Hb2LE0HgQY%Wpp#c_C@CI$c1FiOktn|yQN<|Y- zD$2&D9CUs_GB%mw{CHeeFcjy<o)=4{`K~5B7|5MRoKC`#BjO z?B|qxu%FZL!G2E92m3iQKG?6Y`Cz}s0D@PxKxhzu`4a>i#7D*}kmQ#4d~gU*`Cz|E z=7U4!5ikvA_pgDoL3|i?$Tb0rJ2YH@&`>=NnFqjp`wb2#=D_q3q}Tlc>vzz7@WFol z127w`XMG5Qy-5a@y?z3i57Gm|AoUJu4Ik_u#C&iNF8JVJX!5~+{e%w=(iI;Z)c$<1 z-`()Re&37__IuYrFo;bE?+roH^Wua3g_IBWmn1&eUlf2~5StLbumeet57>S7_iljQ z2X^DV8y`S?d>G^(kUU7eLpKY=43Iw!O~B@W{7eXg&4B6YX8GW7s^Np<+5p0M5)X0ou96oz|aQJ-YgToht4-Q|h zd~o=d@WJ7`#RrEU2_GC;dm!%UiGa}9{Kt9cgQM`7500WT9~_lJJ~*n!d~h`M_~2-M z;e(^an-7jQ6FxXPt9)>Dk@?{0mhi#R{lN#vP=ODQi4q?iQ_p;G%s=wMu^{GyV~N2B z$IdGs948xmaGXBlgX63j9~>9^d~jUM@WF9O&j*KJB_AAFW_)n?vj9wk*tEh9KR1Bw zaQOQMOjFAqhrbpd9R9|9aQG|o!QoF0*ld`;V0JkCKJmff_mU3|e;YnH{4s&3`E%rh z!_S@%4u2w`d;tjk8{$5P-whue{t0|=_zTi^;)5gepAU{KUm%!K1VXcX`QY#`1kMJ_ zGv}c4VS1=RGePaAhFKsp7^Zx1>{;-^apIZ}jy*3RG>F}6@WHWP1HlK0A>-Z(h+OXh z2;KJpLW9)waUj?rJ~_BA;Dcj-1jL-a84wzmIsG0V94AacRWsoPDt}_i2gl_ii2SyW z1;NIa|Hu(THgj3S2ghX-h__>D4R*E53O+b4OZeb;ch3jMZyZ#>5fC%(UHIVm_6&p# zGWUG~g#Gyqgnr2ap`Y#e;CROZ!Un1P@C3sClmVe1W_)mbYVyJHYYl`CQiBbjDfr-c zR^x*ss60Nt;)CPikPnV~G$49*K=mFu^1<;4&j-iz1|J+xBz$mue&&PY$qOGGcXNDj zJoe#(r;;g#EJvO27Ev_)7x92FX(udwg*G zUGl;4ZwTf1_Y#O1zg<2!g33vlnSW9s;&46-g#Y`>2glzc5H?8e&k+dw&lCs^68o!y z#HNB9!DfbhaQyS-gOi~Q1RLG?;AA@CgOdpZ2!r~XFzleAtf}IWnwXMWWTgN)Yu2Xlul`!XzoxZ^fAxe;w-* z{W<(KZZ@dwUoh5B*_qJfgwiw62H2Y25+_ zr%eeAP9OI$IDNXo;Pm4FgVV1o3{HPo7@YpjU~u~1z~IcF!r;ufg29<7hryYpfx(%B zg~6HQ0E08P1cNi*2?l2Y4hCmQ3kGMk90q6Y3}L1836`H1px*|6#)iD z4FLv59RUVL0|5p`69EQB3jqd38vzDJ2LT2~7Xb!F4*>>79{~o&009QZ5CI0p2muDh z7y$;x1OW!d6afat3;_nl903N#0s#ib5&;Ir3IPVj8UY5z1_1`f76Asv4gm(n9svf% z2?7j^Qv?_oX9zGb&Jkc>Tp+-}xI}<~afJW_;~D`5#ti}tj9Ua471LG9|2F4o#42*XK7#JT2Ffcw5U|@V9z`*!MfPwLY00ZL}0S3k&0t`$d z0t`$N0t`$t0t`$F0t`$l0t`$V0t`$#0t`$B0t`$h0t`$R0t`$x0t`$J0t`$p0t`$Z z0t`$(0t`$60t`$c0t`$M0t`$s0t`$E0t`$k0t`$U0t`$!0t`$A0t`$g0t`$Q0t`$w z0t`$I0t`$o0t`$Y0t`$&0t`$O1Q?j62rw|s5MW@MBf!A4K!Aa1i2wuB3IPVDH3AGw z8w41bwg@mV?Ga#LIv~KnbVPuG>5Kpa(**$rrYiyrOg97=nC=KLFg*}pV0t3J!1O|Z zf$5C^1Jefq2Bt3p3``*Z{SjbbW)NUtW)Wau<`7_D<`H0E77$=y77<`zmJncImJwiJ zRuEudRuN!e)(~J|))8P}HV|N7HW6T8wh&-owh>@pb`W4-b`fA;_7GrT_7PxU4iI2q z4iR8rjuBvBP7q*VP7z>W&JbW=&Jkc>E)ZZ~E)ig0t`J~gt`T5hZV+H#ZV_N$?hs&L z?h#;Mo*=-$JVk(kd4>Q3^8x_|<|P6Q%qs*KnAZp}Fdq?MV7?>3!2Cdff%%C51M>?3 z2Ie;c49p({7?{5ZFfjiRU|{|uz`(*Fz`(*Hz`(*Gz`(*Iz`!CPz`!CRz`!CQz`!CS zz`&v)z`&v+z`&v*z`&v-z`$Z7z`&9qz%WNZfMJe=0K*&&0fvPjtRuj%&_IA;p@{&) zLK^{wg$@D?3ta>l7J3LUEc6jzSQsF{urNe`VPT8_!@>jshJ`5t3=1;^7#8LTFf1$( zU|3ipz_74FfMH>a0K>u#0fvPW1Q-@h5nxz2Lx5r7907)f3j`PzE)if@xI%zo;Ti#k zg&PDI7H$z>Shz!gVc`J*hJ{xI7#7|TU|4uZfMMYS0fvRo1Q-^+5MWsNMu1`A2LXnK zUj!Hy{t#eT_(ys)Ff2VGz_9d!0K?J;0t`z(2rw*T5MWrwBEaw)y#EN+P8g*}Ltr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhoO0X^_(kp&ETppz0no455~R}tvtWF~>u&@<@e z7FXsnfW(VSiXb$IpOILc!Jr3PWx${Z+O)`^2U=CYpjVU+p+URk^+1P6>*c1TCY7c$ z=oOa~l_VxH=oMGyf@#nxcc4>1i&AqK^olc}(!>Tac<7Z_#iQy*Ltr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz5lZ2#ogshh(&kI(jq&MnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3TrfzkdyNx?O$cr*k?Ltr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1O`P2FfuSOfG`t-1ET^10|+w+Be@K8BnF7fS-`-+#=yV;Qs=}FHV*>*N!vUxmC+N5p1_lNW1_lP{0*FQ?1_vew1_lsj039(7vIFEE zka;2u3=Ap-aQ87KFff2H{|AUx24wTJ7#J9sA?_0jU|;}YVUT$sr7(3Mwh;pZ12;sS zY5@ZS2+Kb}b05fVD+UGzR){*+00ssS1_?8;GcdsI1(^p52atQ&7#u3ZxFi=!Awdh|RzN(#gOu8NvaRAh$CB0Qb;~<^TWy diff --git a/tools/ido5.3_compiler/usr/lib/acpp b/tools/ido5.3_compiler/usr/lib/acpp deleted file mode 100755 index d5392cf67a880790560d854df4886fc8479a4384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93440 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 diff --git a/tools/ido5.3_compiler/usr/lib/as0 b/tools/ido5.3_compiler/usr/lib/as0 deleted file mode 100755 index badf8c83beaa359d2c413886d60b05f0a2eddf98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175296 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 Dw8l9a<*zLihNC8+_pX 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

F7e57-TT0pQ4}&vOPIJ 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�*w#B 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 diff --git a/tools/ido5.3_compiler/usr/bin/cc b/tools/ido5.3_compiler/usr/bin/cc deleted file mode 100755 index 2936fc3fda571fd738734a8d764797a45de66fee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275168 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