diff --git a/include/analysis/RabbitizerLoPairingInfo.h b/include/analysis/RabbitizerLoPairingInfo.h index 1d4fa50..b6a70ed 100644 --- a/include/analysis/RabbitizerLoPairingInfo.h +++ b/include/analysis/RabbitizerLoPairingInfo.h @@ -9,6 +9,10 @@ #include "common/Utils.h" +#ifdef __cplusplus +extern "C" { +#endif + typedef struct RabbitizerLoPairingInfo { int instrOffset; @@ -23,4 +27,8 @@ NON_NULL(1) void RabbitizerLoPairingInfo_Init(RabbitizerLoPairingInfo *self); +#ifdef __cplusplus +} +#endif + #endif diff --git a/include/analysis/RabbitizerRegistersTracker.h b/include/analysis/RabbitizerRegistersTracker.h index 7125ace..da2e76c 100644 --- a/include/analysis/RabbitizerRegistersTracker.h +++ b/include/analysis/RabbitizerRegistersTracker.h @@ -10,6 +10,10 @@ #include "RabbitizerLoPairingInfo.h" #include "instructions/RabbitizerInstruction.h" +#ifdef __cplusplus +extern "C" { +#endif + typedef struct RabbitizerRegistersTracker { RabbitizerTrackedRegisterState registers[32]; @@ -51,4 +55,8 @@ NON_NULL(1, 2) bool RabbitizerRegistersTracker_hasLoButNoHi(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr); +#ifdef __cplusplus +} +#endif + #endif diff --git a/include/analysis/RabbitizerTrackedRegisterState.h b/include/analysis/RabbitizerTrackedRegisterState.h index 6ae9d6e..daf4b2d 100644 --- a/include/analysis/RabbitizerTrackedRegisterState.h +++ b/include/analysis/RabbitizerTrackedRegisterState.h @@ -11,6 +11,10 @@ #include "common/Utils.h" +#ifdef __cplusplus +extern "C" { +#endif + typedef struct RabbitizerTrackedRegisterState { int registerNum; @@ -68,4 +72,9 @@ bool RabbitizerTrackedRegisterState_wasSetInCurrentOffset(const RabbitizerTracke NON_NULL(1) void RabbitizerTrackedRegisterState_fprint(const RabbitizerTrackedRegisterState *self, FILE* outFile); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/include/common/RabbitizerConfig.h b/include/common/RabbitizerConfig.h index 8a881a9..8b9def7 100644 --- a/include/common/RabbitizerConfig.h +++ b/include/common/RabbitizerConfig.h @@ -6,6 +6,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + #define RABBITIZER_DEF_ABI(name) RABBITIZER_ABI_##name @@ -37,6 +41,7 @@ typedef struct RabbitizerConfig_PseudoInstr { bool pseudoMove; bool pseudoNot; bool pseudoNegu; + bool pseudoBal; } RabbitizerConfig_PseudoInstr; typedef struct RabbitizerConfig_ToolchainTweaks { @@ -70,4 +75,9 @@ typedef struct RabbitizerConfig { extern RabbitizerConfig RabbitizerConfig_Cfg; + +#ifdef __cplusplus +} +#endif + #endif diff --git a/include/common/RabbitizerVersion.h b/include/common/RabbitizerVersion.h index 414ae35..dfb3a22 100644 --- a/include/common/RabbitizerVersion.h +++ b/include/common/RabbitizerVersion.h @@ -6,10 +6,15 @@ #include "Utils.h" +#ifdef __cplusplus +extern "C" { +#endif + + // Header version #define RAB_VERSION_MAJOR 1 #define RAB_VERSION_MINOR 2 -#define RAB_VERSION_PATCH 1 +#define RAB_VERSION_PATCH 2 #define RAB_VERSION_STR RAB_STRINGIFY(RAB_VERSION_MAJOR) "." RAB_STRINGIFY(RAB_VERSION_MINOR) "." RAB_STRINGIFY(RAB_VERSION_PATCH) @@ -20,4 +25,9 @@ extern const int RabVersion_Patch; extern const char RabVersion_Str[]; + +#ifdef __cplusplus +} +#endif + #endif diff --git a/include/common/Utils.h b/include/common/Utils.h index e9edb07..6255a04 100644 --- a/include/common/Utils.h +++ b/include/common/Utils.h @@ -7,6 +7,10 @@ #include #include +#ifdef __cplusplus +extern "C" { +#endif + #if !defined(__GNUC__) && !defined(__clang__) #define __attribute__(x) @@ -104,4 +108,9 @@ 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/include/instructions/RabbitizerInstrDescriptor.h b/include/instructions/RabbitizerInstrDescriptor.h index 4a8b270..e92f797 100644 --- a/include/instructions/RabbitizerInstrDescriptor.h +++ b/include/instructions/RabbitizerInstrDescriptor.h @@ -12,6 +12,11 @@ #include "RabbitizerInstrId.h" #include "RabbitizerInstrSuffix.h" +#ifdef __cplusplus +extern "C" { +#endif + + typedef enum RabbitizerInstrType { RABBITIZER_INSTR_TYPE_UNKNOWN, RABBITIZER_INSTR_TYPE_J, @@ -128,4 +133,9 @@ bool RabbitizerInstrDescriptor_isPseudo(const RabbitizerInstrDescriptor *self); NODISCARD NON_NULL(1) PURE RabbitizerArchitectureVersion RabbitizerInstrDescriptor_getArchitectureVersion(const RabbitizerInstrDescriptor *self); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/include/instructions/RabbitizerInstrId.h b/include/instructions/RabbitizerInstrId.h index 1f93ac7..c383821 100644 --- a/include/instructions/RabbitizerInstrId.h +++ b/include/instructions/RabbitizerInstrId.h @@ -7,6 +7,10 @@ #include "common/Utils.h" +#ifdef __cplusplus +extern "C" { +#endif + #define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \ RABBITIZER_INSTR_ID_##prefix##_##name, @@ -34,4 +38,9 @@ extern const char *RabbitizerInstrId_Names[]; CONST NODISCARD RETURNS_NON_NULL const char *RabbitizerInstrId_getOpcodeName(RabbitizerInstrId uniqueId); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/include/instructions/RabbitizerInstrSuffix.h b/include/instructions/RabbitizerInstrSuffix.h index d90099c..7c59e33 100644 --- a/include/instructions/RabbitizerInstrSuffix.h +++ b/include/instructions/RabbitizerInstrSuffix.h @@ -7,6 +7,10 @@ #include "common/Utils.h" +#ifdef __cplusplus +extern "C" { +#endif + struct RabbitizerInstruction; @@ -24,4 +28,9 @@ size_t RabbitizerInstrSuffix_getSizeForBuffer(const struct RabbitizerInstruction 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/include/instructions/RabbitizerInstruction.h b/include/instructions/RabbitizerInstruction.h index 7d6daef..75a60ad 100644 --- a/include/instructions/RabbitizerInstruction.h +++ b/include/instructions/RabbitizerInstruction.h @@ -14,6 +14,10 @@ #include "RabbitizerInstrId.h" #include "RabbitizerInstrDescriptor.h" +#ifdef __cplusplus +extern "C" { +#endif + #define RABBITIZER_DEF_INSTR_CATEGORY(name) RABBITIZER_INSTRCAT_##name @@ -249,4 +253,9 @@ size_t RabbitizerInstruction_disassemble(const RabbitizerInstruction *self, char /* Disassembly */ + +#ifdef __cplusplus +} +#endif + #endif diff --git a/include/instructions/RabbitizerInstructionR5900.h b/include/instructions/RabbitizerInstructionR5900.h index 64da97a..af5e809 100644 --- a/include/instructions/RabbitizerInstructionR5900.h +++ b/include/instructions/RabbitizerInstructionR5900.h @@ -7,6 +7,10 @@ #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)) @@ -75,4 +79,9 @@ void RabbitizerInstructionR5900_processUniqueId_MMI(RabbitizerInstruction *self) NON_NULL(1) void RabbitizerInstructionR5900_processUniqueId(RabbitizerInstruction *self); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/include/instructions/RabbitizerInstructionRsp.h b/include/instructions/RabbitizerInstructionRsp.h index ed59ec0..b2fb40d 100644 --- a/include/instructions/RabbitizerInstructionRsp.h +++ b/include/instructions/RabbitizerInstructionRsp.h @@ -7,6 +7,10 @@ #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)) @@ -59,4 +63,8 @@ NODISCARD NON_NULL(1) PURE uint16_t RabbitizerInstructionRsp_GetOffsetVector(const RabbitizerInstruction *self); +#ifdef __cplusplus +} +#endif + #endif diff --git a/include/instructions/RabbitizerOperandType.h b/include/instructions/RabbitizerOperandType.h index 37ef065..58c2659 100644 --- a/include/instructions/RabbitizerOperandType.h +++ b/include/instructions/RabbitizerOperandType.h @@ -5,6 +5,10 @@ #define RABBITIZER_OPERAND_TYPE_H #pragma once +#ifdef __cplusplus +extern "C" { +#endif + #define RAB_DEF_OPERAND(prefix, operand) \ RAB_OPERAND_##prefix##_##operand, @@ -21,4 +25,9 @@ typedef enum RabbitizerOperandType { #undef RAB_DEF_OPERAND + +#ifdef __cplusplus +} +#endif + #endif diff --git a/include/instructions/RabbitizerRegister.h b/include/instructions/RabbitizerRegister.h index 9e4a001..1c6421c 100644 --- a/include/instructions/RabbitizerRegister.h +++ b/include/instructions/RabbitizerRegister.h @@ -9,6 +9,10 @@ #include "common/Utils.h" +#ifdef __cplusplus +extern "C" { +#endif + #define RABBITIZER_DEF_REG(prefix, name, numeric) \ RABBITIZER_REG_##prefix##_##name @@ -131,4 +135,9 @@ 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/include/instructions/instr_id/cpu/cpu_cop0_bc0.inc b/include/instructions/instr_id/cpu/cpu_cop0_bc0.inc index 35c77fd..0165039 100644 --- a/include/instructions/instr_id/cpu/cpu_cop0_bc0.inc +++ b/include/instructions/instr_id/cpu/cpu_cop0_bc0.inc @@ -2,7 +2,7 @@ /* SPDX-License-Identifier: MIT */ // OP IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, bc0f, .operands={RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true) // Branch on FP False -RABBITIZER_DEF_INSTR_ID(cpu, 0x01, bc0t, .operands={RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true) // Branch on FP True -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, bc0fl, .operands={RAB_OPERAND_cpu_immediate}, .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_immediate}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true) // Branch on FP True Likely +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/include/instructions/instr_id/cpu/cpu_cop1_bc1.inc b/include/instructions/instr_id/cpu/cpu_cop1_bc1.inc index 1f0c0a9..e339cd4 100644 --- a/include/instructions/instr_id/cpu/cpu_cop1_bc1.inc +++ b/include/instructions/instr_id/cpu/cpu_cop1_bc1.inc @@ -2,7 +2,7 @@ /* SPDX-License-Identifier: MIT */ // OP IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, bc1f, .operands={RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true) -RABBITIZER_DEF_INSTR_ID(cpu, 0x01, bc1t, .operands={RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true) -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, bc1fl, .operands={RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true) -RABBITIZER_DEF_INSTR_ID(cpu, 0x03, bc1tl, .operands={RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true) +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/include/instructions/instr_id/cpu/cpu_normal.inc b/include/instructions/instr_id/cpu/cpu_normal.inc index e570c68..cc93fa5 100644 --- a/include/instructions/instr_id/cpu/cpu_normal.inc +++ b/include/instructions/instr_id/cpu/cpu_normal.inc @@ -6,16 +6,16 @@ RABBITIZER_DEF_INSTR_ID(cpu, 0x02, j, .operands={RAB_OPERAND_cpu_label}, . 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_immediate}, .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_immediate}, .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_immediate}, .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_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Not Equal Likely +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_immediate}, .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_immediate}, .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_immediate}, .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_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Greater Than Zero Likely +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 @@ -76,8 +76,8 @@ RABBITIZER_DEF_INSTR_ID(cpu, 0x3E, sdc2, .operands={RAB_OPERAND_cpu_cop2t, RA // Pseudo-Instruction Unique IDs // OP IMM -RABBITIZER_DEF_INSTR_ID(cpu, -0x03, b, .operands={RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true) // Branch (unconditional) +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_immediate}, .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_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true) // Branch on Not Equal Zero +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/include/instructions/instr_id/cpu/cpu_regimm.inc b/include/instructions/instr_id/cpu/cpu_regimm.inc index 987a565..4d47123 100644 --- a/include/instructions/instr_id/cpu/cpu_regimm.inc +++ b/include/instructions/instr_id/cpu/cpu_regimm.inc @@ -2,10 +2,10 @@ /* SPDX-License-Identifier: MIT */ // OP rs, IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, bltz, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .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_immediate}, .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_immediate}, .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_immediate}, .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, 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) @@ -14,7 +14,12 @@ RABBITIZER_DEF_INSTR_ID(cpu, 0x0B, tltiu, .operands={RAB_OPERAND_cpu_rs, RAB_O 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_immediate}, .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_immediate}, .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_immediate}, .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_immediate}, .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 +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/include/instructions/instr_id/r5900/r5900_cop2_bc2.inc b/include/instructions/instr_id/r5900/r5900_cop2_bc2.inc index 0ec2e25..734e0d4 100644 --- a/include/instructions/instr_id/r5900/r5900_cop2_bc2.inc +++ b/include/instructions/instr_id/r5900/r5900_cop2_bc2.inc @@ -15,7 +15,7 @@ // TODO: operands and properties -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, bc2f, .operands={RAB_OPERAND_cpu_immediate}, .isBranch=true) -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, bc2t, .operands={RAB_OPERAND_cpu_immediate}, .isBranch=true) -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, bc2fl, .operands={RAB_OPERAND_cpu_immediate}, .isBranch=true, .isBranchLikely=true) -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, bc2tl, .operands={RAB_OPERAND_cpu_immediate}, .isBranch=true, .isBranchLikely=true) +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/include/instructions/instr_id/rsp/rsp_normal.inc b/include/instructions/instr_id/rsp/rsp_normal.inc index 10d5346..be73f5a 100644 --- a/include/instructions/instr_id/rsp/rsp_normal.inc +++ b/include/instructions/instr_id/rsp/rsp_normal.inc @@ -6,12 +6,12 @@ RABBITIZER_DEF_INSTR_ID(rsp, 0x02, j, .operands={RAB_OPERAND_cpu_label}, . 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_immediate}, .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_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Not Equal +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_immediate}, .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_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Greater Than Zero +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 @@ -46,8 +46,8 @@ RABBITIZER_DEF_INSTR_ID(rsp, 0x39, swc1, .operands={RAB_OPERAND_cpu_ft, RAB_O // Pseudo-Instruction Unique IDs // OP IMM -RABBITIZER_DEF_INSTR_ID(rsp, -0x03, b, .operands={RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch (unconditional) +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_immediate}, .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_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Not Equal Zero +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/include/instructions/instr_id/rsp/rsp_regimm.inc b/include/instructions/instr_id/rsp/rsp_regimm.inc index 5a7c086..c2132f9 100644 --- a/include/instructions/instr_id/rsp/rsp_regimm.inc +++ b/include/instructions/instr_id/rsp/rsp_regimm.inc @@ -2,8 +2,13 @@ /* SPDX-License-Identifier: MIT */ // OP rs, IMM -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, bltz, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .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_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Greater than or Equal to Zero +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_immediate}, .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_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true) // Branch on Greater Than or Equal to Zero and Link +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/include/instructions/operands/RabbitizerOperandType_cpu.inc b/include/instructions/operands/RabbitizerOperandType_cpu.inc index ef6e989..7542bdb 100644 --- a/include/instructions/operands/RabbitizerOperandType_cpu.inc +++ b/include/instructions/operands/RabbitizerOperandType_cpu.inc @@ -18,6 +18,7 @@ RAB_DEF_OPERAND(cpu, code) 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/rabbitizer/Config.pyi b/rabbitizer/Config.pyi index 786642f..c639b4f 100644 --- a/rabbitizer/Config.pyi +++ b/rabbitizer/Config.pyi @@ -33,6 +33,7 @@ class _RabbitizerConfig: pseudos_pseudoMove: bool = True pseudos_pseudoNot: bool = True pseudos_pseudoNegu: bool = True + pseudos_pseudoBal: bool = True toolchainTweaks_sn64DivFix: bool = False toolchainTweaks_treatJAsUnconditionalBranch: bool = False diff --git a/rabbitizer/InstrId.pyi b/rabbitizer/InstrId.pyi index 6c1abf7..87e87bf 100644 --- a/rabbitizer/InstrId.pyi +++ b/rabbitizer/InstrId.pyi @@ -79,6 +79,7 @@ class InstrId: cpu_bgezal: Enum cpu_bltzall: Enum cpu_bgezall: Enum + cpu_bal: Enum cpu_teqi: Enum cpu_tnei: Enum cpu_j: Enum @@ -339,6 +340,7 @@ class InstrId: rsp_bgez: Enum rsp_bltzal: Enum rsp_bgezal: Enum + rsp_bal: Enum rsp_j: Enum rsp_jal: Enum rsp_beq: Enum diff --git a/rabbitizer/rabbitizer_global_config.c b/rabbitizer/rabbitizer_global_config.c index 62ca47b..d02fce3 100644 --- a/rabbitizer/rabbitizer_global_config.c +++ b/rabbitizer/rabbitizer_global_config.c @@ -114,6 +114,7 @@ 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) @@ -139,6 +140,7 @@ static PyGetSetDef rabbitizer_global_config_GetSets[] = { 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), diff --git a/setup.cfg b/setup.cfg index 334c91a..3b1ba95 100644 --- a/setup.cfg +++ b/setup.cfg @@ -4,7 +4,7 @@ [metadata] name = rabbitizer # Version should be synced with include/common/RabbitizerVersion.h -version = 1.2.1 +version = 1.2.2 author = Decompollaborate license = MIT description = MIPS instruction decoder diff --git a/src/common/RabbitizerConfig.c b/src/common/RabbitizerConfig.c index 37d43e2..88b554d 100644 --- a/src/common/RabbitizerConfig.c +++ b/src/common/RabbitizerConfig.c @@ -35,6 +35,7 @@ RabbitizerConfig RabbitizerConfig_Cfg = { .pseudoMove = true, .pseudoNot = true, .pseudoNegu = true, + .pseudoBal = true, }, .toolchainTweaks = { .treatJAsUnconditionalBranch = false, diff --git a/src/common/Utils.c b/src/common/Utils.c index 96a577b..7dd0262 100644 --- a/src/common/Utils.c +++ b/src/common/Utils.c @@ -31,6 +31,7 @@ size_t RabbitizerUtils_escapeString(char *dst, size_t dstSize, const char *src, 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, '\\'); @@ -62,6 +63,11 @@ size_t RabbitizerUtils_escapeString(char *dst, size_t dstSize, const char *src, 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; diff --git a/src/instructions/RabbitizerInstruction/RabbitizerInstruction.c b/src/instructions/RabbitizerInstruction/RabbitizerInstruction.c index a79ac90..34f9a10 100644 --- a/src/instructions/RabbitizerInstruction/RabbitizerInstruction.c +++ b/src/instructions/RabbitizerInstruction/RabbitizerInstruction.c @@ -137,12 +137,16 @@ void RabbitizerInstruction_blankOut(RabbitizerInstruction *self) { self->word = RAB_INSTR_PACK_instr_index(self->word, 0); break; - case RAB_OPERAND_cpu_immediate_base: - self->word = RAB_INSTR_PACK_rs(self->word, 0); + case RAB_OPERAND_cpu_immediate: self->word = RAB_INSTR_PACK_immediate(self->word, 0); break; - case RAB_OPERAND_cpu_immediate: + 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; diff --git a/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c b/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c index c3085e9..672be04 100644 --- a/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c +++ b/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c @@ -192,6 +192,20 @@ size_t RabbitizerOperandType_process_cpu_immediate(const RabbitizerInstruction * 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) { + 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; diff --git a/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c b/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c index f9e5324..0753284 100644 --- a/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c +++ b/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c @@ -187,6 +187,12 @@ bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, Ra 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; @@ -593,6 +599,10 @@ uint32_t RabbitizerInstruction_getValidBits(const RabbitizerInstruction *self) { 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); diff --git a/src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c b/src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c index a5e3ab5..0d71c6d 100644 --- a/src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c +++ b/src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c @@ -139,6 +139,21 @@ void RabbitizerInstruction_processUniqueId_Regimm(RabbitizerInstruction *self) { #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]; } diff --git a/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c b/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c index 0d88a78..e491f1b 100644 --- a/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c +++ b/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c @@ -137,6 +137,21 @@ void RabbitizerInstructionRsp_processUniqueId_Regimm(RabbitizerInstruction *self #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]; }