mirror of
https://github.com/Decompollaborate/rabbitizer.git
synced 2025-02-05 18:40:12 +00:00
Merge pull request #10 from Decompollaborate/develop
1.2.2: `bal` and proper `\\` escape
This commit is contained in:
commit
28a24464bb
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -6,6 +6,10 @@
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#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
|
||||
|
@ -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
|
||||
|
@ -7,6 +7,10 @@
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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),
|
||||
|
@ -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
|
||||
|
@ -35,6 +35,7 @@ RabbitizerConfig RabbitizerConfig_Cfg = {
|
||||
.pseudoMove = true,
|
||||
.pseudoNot = true,
|
||||
.pseudoNegu = true,
|
||||
.pseudoBal = true,
|
||||
},
|
||||
.toolchainTweaks = {
|
||||
.treatJAsUnconditionalBranch = false,
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user