mirror of
https://github.com/Decompollaborate/rabbitizer.git
synced 2025-02-15 21:41:47 +00:00
First batch of rsp stuff
This commit is contained in:
parent
3acf9fceb0
commit
185a934081
@ -12,6 +12,15 @@
|
||||
#include "RabbitizerInstrId.h"
|
||||
#include "RabbitizerInstrDescriptor.h"
|
||||
|
||||
|
||||
typedef enum RabbitizerInstrCategory {
|
||||
RABBITIZER_INSTRCAT_CPU,
|
||||
RABBITIZER_INSTRCAT_RSP,
|
||||
// RABBITIZER_INSTRCAT_PS2,
|
||||
RABBITIZER_INSTRCAT_MAX,
|
||||
} RabbitizerInstrCategory;
|
||||
|
||||
// TODO: consider renaming to RabbitizerInstruction
|
||||
typedef struct RabbitizerInstr {
|
||||
uint8_t opcode;
|
||||
uint8_t rs;
|
||||
@ -26,8 +35,11 @@ typedef struct RabbitizerInstr {
|
||||
uint32_t vram;
|
||||
bool _handwrittenCategory;
|
||||
bool inHandwrittenFunction;
|
||||
RabbitizerInstrCategory category;
|
||||
} RabbitizerInstr;
|
||||
|
||||
#define RAB_INSTR_GET_IMMEDIATE(self) (((self)->rd << 11) | ((self)->sa << 6) | ((self)->function))
|
||||
|
||||
|
||||
void RabbitizerInstr_init(RabbitizerInstr *self, uint32_t word);
|
||||
void RabbitizerInstr_destroy(RabbitizerInstr* self);
|
||||
@ -87,9 +99,13 @@ void RabbitizerInstr_blankOut(RabbitizerInstr *self);
|
||||
bool RabbitizerInstr_isImplemented(const RabbitizerInstr *self);
|
||||
bool RabbitizerInstr_isLikelyHandwritten(const RabbitizerInstr *self);
|
||||
bool RabbitizerInstr_isNop(const RabbitizerInstr *self);
|
||||
bool RabbitizerInstr_isLui(const RabbitizerInstr *self);
|
||||
bool RabbitizerInstr_isOri(const RabbitizerInstr *self);
|
||||
bool RabbitizerInstr_isLo(const RabbitizerInstr *self);
|
||||
bool RabbitizerInstr_isUnconditionalBranch(const RabbitizerInstr *self);
|
||||
bool RabbitizerInstr_isJrRa(const RabbitizerInstr *self);
|
||||
bool RabbitizerInstr_isJrNotRa(const RabbitizerInstr *self);
|
||||
bool RabbitizerInstr_isAndLink(const RabbitizerInstr *self);
|
||||
|
||||
const char *RabbitizerInstr_mapInstrToType(const RabbitizerInstr *self);
|
||||
|
||||
|
28
include/instructions/RabbitizerInstrRsp.h
Normal file
28
include/instructions/RabbitizerInstrRsp.h
Normal file
@ -0,0 +1,28 @@
|
||||
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
|
||||
#ifndef RABBITIZER_INSTR_RSP_H
|
||||
#define RABBITIZER_INSTR_RSP_H
|
||||
#pragma once
|
||||
|
||||
#include "RabbitizerInstr.h"
|
||||
|
||||
|
||||
#define RAB_INSTR_RSP_GET_ELEMENT_LOW(self) ((((self)->sa) >> 1) & 0xF)
|
||||
#define RAB_INSTR_RSP_GET_OFFSET_VECTOR_RAW(self) (RAB_INSTR_GET_IMMEDIATE(self) & 0x7F)
|
||||
|
||||
|
||||
void RabbitizerInstrRsp_init(RabbitizerInstr *self, uint32_t word);
|
||||
void RabbitizerInstrRsp_destroy(RabbitizerInstr *self);
|
||||
|
||||
|
||||
void RabbitizerInstrRsp_processUniqueId_Normal(RabbitizerInstr *self);
|
||||
void RabbitizerInstrRsp_processUniqueId(RabbitizerInstr *self);
|
||||
|
||||
|
||||
uint16_t RabbitizerInstrRsp_GetOffsetVector(const RabbitizerInstr *self);
|
||||
|
||||
uint8_t RabbitizerInstrRsp_processVectorElement(const RabbitizerInstr *self, uint8_t element);
|
||||
|
||||
|
||||
#endif
|
@ -22,6 +22,8 @@ typedef enum RabbitizerRegisterType {
|
||||
RABBITIZER_REGISTER_TYPE_LABEL,
|
||||
RABBITIZER_REGISTER_TYPE_IMM,
|
||||
RABBITIZER_REGISTER_TYPE_IMM_base,
|
||||
RABBITIZER_REGISTER_TYPE_vt_element, // rsp
|
||||
RABBITIZER_REGISTER_TYPE_offset_vs, // rsp
|
||||
RABBITIZER_REGISTER_TYPE_MAX,
|
||||
} RabbitizerRegisterType;
|
||||
|
||||
|
@ -58,37 +58,27 @@
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, cfc2, ),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, ctc2, ),
|
||||
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, sbv, ),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, ssv, ),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, slv, ),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, sdv, ),
|
||||
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, sqv, ),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, srv, ),
|
||||
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, spv, ),
|
||||
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, suv, ),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, swv, ),
|
||||
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, shv, ),
|
||||
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, sfv, ),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, stv, ),
|
||||
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, lbv, ),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, lsv, ),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, llv, ),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, ldv, ),
|
||||
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, lqv, ),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, lrv, ),
|
||||
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, lpv, ),
|
||||
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, luv, ),
|
||||
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, lhv, ),
|
||||
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, lfv, ),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, ltv, ),
|
||||
// OP vt[element] offset(vs)
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, sbv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, ssv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, slv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, sdv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, sqv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, srv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, spv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, suv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, swv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, shv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, sfv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, stv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, lbv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, lsv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, llv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, ldv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, lqv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, lrv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, lpv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, luv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, lhv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, lfv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
RABBITIZER_DEF_INSTR_ID(rsp, ltv, .operands={RABBITIZER_REGISTER_TYPE_vt_element, RABBITIZER_REGISTER_TYPE_offset_vs}),
|
||||
|
1
setup.py
1
setup.py
@ -10,6 +10,7 @@ setup(
|
||||
"rabbitizer",
|
||||
["rabbitizer/rabbitizer_module.c", "rabbitizer/rabbitizer_type_Instr.c", "rabbitizer/rabbitizer_global_instr_id.c", "rabbitizer/rabbitizer_global_config.c",
|
||||
"src/instructions/RabbitizerInstr/RabbitizerInstr_Disassemble.c", "src/instructions/RabbitizerInstr/RabbitizerInstr_ProcessUniqueId.c", "src/instructions/RabbitizerInstr/RabbitizerInstr.c", "src/instructions/RabbitizerInstr/RabbitizerInstr_Examination.c",
|
||||
"src/instructions/RabbitizerInstrRsp/RabbitizerInstrRsp.c", "src/instructions/RabbitizerInstrRsp/RabbitizerInstrRsp_ProcessUniqueId.c",
|
||||
"src/instructions/RabbitizerInstrDescriptor.c", "src/instructions/RabbitizerInstrId.c", "src/instructions/RabbitizerRegister.c",
|
||||
"src/common/Utils.c", "src/common/RabbitizerConfig.c"],
|
||||
include_dirs=["include"],
|
||||
|
@ -24,6 +24,7 @@ void RabbitizerInstr_init(RabbitizerInstr *self, uint32_t word) {
|
||||
self->vram = 0;
|
||||
self->_handwrittenCategory = false;
|
||||
self->inHandwrittenFunction = false;
|
||||
self->category = RABBITIZER_INSTRCAT_CPU;
|
||||
}
|
||||
|
||||
void RabbitizerInstr_destroy(RabbitizerInstr *self) {
|
||||
@ -75,7 +76,8 @@ uint32_t RabbitizerInstr_getRaw(const RabbitizerInstr *self) {
|
||||
}
|
||||
|
||||
uint32_t RabbitizerInstr_getImmediate(const RabbitizerInstr *self) {
|
||||
return (self->rd << 11) | (self->sa << 6) | (self->function);
|
||||
//return (self->rd << 11) | (self->sa << 6) | (self->function);
|
||||
return RAB_INSTR_GET_IMMEDIATE(self);
|
||||
}
|
||||
|
||||
uint32_t RabbitizerInstr_getInstrIndex(const RabbitizerInstr *self) {
|
||||
@ -152,6 +154,17 @@ void RabbitizerInstr_blankOut(RabbitizerInstr *self) {
|
||||
self->function = 0;
|
||||
break;
|
||||
|
||||
case RABBITIZER_REGISTER_TYPE_vt_element:
|
||||
self->rt = 0;
|
||||
self->sa &= ~0x1E;
|
||||
break;
|
||||
|
||||
case RABBITIZER_REGISTER_TYPE_offset_vs:
|
||||
self->function = 0;
|
||||
self->sa &= ~0x1;
|
||||
self->rs = 0;
|
||||
break;
|
||||
|
||||
case RABBITIZER_REGISTER_TYPE_INVALID:
|
||||
case RABBITIZER_REGISTER_TYPE_MAX:
|
||||
assert(self->descriptor->operands[i] != RABBITIZER_REGISTER_TYPE_INVALID && self->descriptor->operands[i] != RABBITIZER_REGISTER_TYPE_MAX);
|
||||
|
@ -2,6 +2,7 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
|
||||
#include "instructions/RabbitizerInstr.h"
|
||||
#include "instructions/RabbitizerInstrRsp.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
@ -258,22 +259,90 @@ size_t RabbitizerRegisterType_processImmediateBase(const RabbitizerInstr *self,
|
||||
return totalSize;
|
||||
}
|
||||
|
||||
size_t RabbitizerRegisterType_processVtElement(const RabbitizerInstr *self, char *dst, const char *immOverride, size_t immOverrideLength) {
|
||||
size_t totalSize = 0;
|
||||
const char *reg;
|
||||
size_t regLen;
|
||||
int len;
|
||||
uint8_t element;
|
||||
|
||||
(void)immOverride;
|
||||
(void)immOverrideLength;
|
||||
|
||||
reg = RabbitizerRegister_getNameRspVector(self->rt);
|
||||
|
||||
regLen = strlen(reg);
|
||||
memcpy(dst, reg, regLen);
|
||||
dst += regLen;
|
||||
totalSize += regLen;
|
||||
|
||||
*dst = '[';
|
||||
dst++;
|
||||
totalSize++;
|
||||
|
||||
element = RabbitizerInstrRsp_processVectorElement(self, RAB_INSTR_RSP_GET_ELEMENT_LOW(self));
|
||||
len = sprintf(dst, "%i", element);
|
||||
assert(len > 0);
|
||||
dst += len;
|
||||
totalSize += len;
|
||||
|
||||
*dst = ']';
|
||||
dst++;
|
||||
totalSize++;
|
||||
|
||||
return totalSize;
|
||||
}
|
||||
|
||||
size_t RabbitizerRegisterType_processOffsetVs(const RabbitizerInstr *self, char *dst, const char *immOverride, size_t immOverrideLength) {
|
||||
size_t totalSize = 0;
|
||||
const char *reg;
|
||||
size_t regLen;
|
||||
int len;
|
||||
|
||||
(void)immOverride;
|
||||
(void)immOverrideLength;
|
||||
|
||||
len = sprintf(dst, "0x%X", RabbitizerInstrRsp_GetOffsetVector(self));
|
||||
assert(len > 0);
|
||||
dst += len;
|
||||
totalSize += len;
|
||||
|
||||
*dst = '(';
|
||||
dst++;
|
||||
totalSize++;
|
||||
|
||||
reg = RabbitizerRegister_getNameRspGpr(self->rs);
|
||||
|
||||
regLen = strlen(reg);
|
||||
memcpy(dst, reg, regLen);
|
||||
dst += regLen;
|
||||
totalSize += regLen;
|
||||
|
||||
*dst = ')';
|
||||
dst++;
|
||||
totalSize++;
|
||||
|
||||
return totalSize;
|
||||
}
|
||||
|
||||
const OperandCallback instrOpercandCallbacks[] = {
|
||||
[RABBITIZER_REGISTER_TYPE_rs] = RabbitizerRegisterType_processRs,
|
||||
[RABBITIZER_REGISTER_TYPE_rt] = RabbitizerRegisterType_processRt,
|
||||
[RABBITIZER_REGISTER_TYPE_rd] = RabbitizerRegisterType_processRd,
|
||||
[RABBITIZER_REGISTER_TYPE_cop0d] = RabbitizerRegisterType_processCop0d,
|
||||
[RABBITIZER_REGISTER_TYPE_fs] = RabbitizerRegisterType_processFs,
|
||||
[RABBITIZER_REGISTER_TYPE_ft] = RabbitizerRegisterType_processFt,
|
||||
[RABBITIZER_REGISTER_TYPE_fd] = RabbitizerRegisterType_processFd,
|
||||
[RABBITIZER_REGISTER_TYPE_cop1cs] = RabbitizerRegisterType_processCop1Cs,
|
||||
[RABBITIZER_REGISTER_TYPE_cop2t] = RabbitizerRegisterType_processCop2t,
|
||||
[RABBITIZER_REGISTER_TYPE_sa] = RabbitizerRegisterType_processSa,
|
||||
[RABBITIZER_REGISTER_TYPE_op] = RabbitizerRegisterType_processOp,
|
||||
[RABBITIZER_REGISTER_TYPE_code] = RabbitizerRegisterType_processCode,
|
||||
[RABBITIZER_REGISTER_TYPE_LABEL] = RabbitizerRegisterType_processLabel,
|
||||
[RABBITIZER_REGISTER_TYPE_IMM] = RabbitizerRegisterType_processImmediate,
|
||||
[RABBITIZER_REGISTER_TYPE_IMM_base] = RabbitizerRegisterType_processImmediateBase,
|
||||
[RABBITIZER_REGISTER_TYPE_rs] = RabbitizerRegisterType_processRs,
|
||||
[RABBITIZER_REGISTER_TYPE_rt] = RabbitizerRegisterType_processRt,
|
||||
[RABBITIZER_REGISTER_TYPE_rd] = RabbitizerRegisterType_processRd,
|
||||
[RABBITIZER_REGISTER_TYPE_cop0d] = RabbitizerRegisterType_processCop0d,
|
||||
[RABBITIZER_REGISTER_TYPE_fs] = RabbitizerRegisterType_processFs,
|
||||
[RABBITIZER_REGISTER_TYPE_ft] = RabbitizerRegisterType_processFt,
|
||||
[RABBITIZER_REGISTER_TYPE_fd] = RabbitizerRegisterType_processFd,
|
||||
[RABBITIZER_REGISTER_TYPE_cop1cs] = RabbitizerRegisterType_processCop1Cs,
|
||||
[RABBITIZER_REGISTER_TYPE_cop2t] = RabbitizerRegisterType_processCop2t,
|
||||
[RABBITIZER_REGISTER_TYPE_sa] = RabbitizerRegisterType_processSa,
|
||||
[RABBITIZER_REGISTER_TYPE_op] = RabbitizerRegisterType_processOp,
|
||||
[RABBITIZER_REGISTER_TYPE_code] = RabbitizerRegisterType_processCode,
|
||||
[RABBITIZER_REGISTER_TYPE_LABEL] = RabbitizerRegisterType_processLabel,
|
||||
[RABBITIZER_REGISTER_TYPE_IMM] = RabbitizerRegisterType_processImmediate,
|
||||
[RABBITIZER_REGISTER_TYPE_IMM_base] = RabbitizerRegisterType_processImmediateBase,
|
||||
[RABBITIZER_REGISTER_TYPE_vt_element] = RabbitizerRegisterType_processVtElement,
|
||||
[RABBITIZER_REGISTER_TYPE_offset_vs] = RabbitizerRegisterType_processOffsetVs,
|
||||
};
|
||||
|
||||
|
||||
|
@ -69,8 +69,8 @@ void RabbitizerInstr_processUniqueId_Normal(RabbitizerInstr *self) {
|
||||
break;
|
||||
case 0b010111:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bgtzl;
|
||||
|
||||
break;
|
||||
|
||||
case 0b011000:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_daddi;
|
||||
break;
|
||||
|
73
src/instructions/RabbitizerInstrRsp/RabbitizerInstrRsp.c
Normal file
73
src/instructions/RabbitizerInstrRsp/RabbitizerInstrRsp.c
Normal file
@ -0,0 +1,73 @@
|
||||
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
|
||||
#include "instructions/RabbitizerInstrRsp.h"
|
||||
|
||||
|
||||
void RabbitizerInstrRsp_init(RabbitizerInstr *self, uint32_t word) {
|
||||
RabbitizerInstr_init(self, word);
|
||||
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID;
|
||||
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
|
||||
|
||||
self->_handwrittenCategory = true;
|
||||
self->category = RABBITIZER_INSTRCAT_RSP;
|
||||
}
|
||||
|
||||
void RabbitizerInstrRsp_destroy(RabbitizerInstr *self) {
|
||||
RabbitizerInstr_destroy(self);
|
||||
}
|
||||
|
||||
|
||||
uint16_t RabbitizerInstrRsp_GetOffsetVector(const RabbitizerInstr *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;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t RabbitizerInstrRsp_processVectorElement(const RabbitizerInstr *self, uint8_t element) {
|
||||
(void)self;
|
||||
|
||||
if ((element & 0x8) == 0x8) {
|
||||
return element & 7;
|
||||
}
|
||||
if ((element & 0xC) == 0x4) {
|
||||
return element & 4;
|
||||
}
|
||||
if ((element & 0xE) == 0x2) {
|
||||
return element & 2;
|
||||
}
|
||||
return element;
|
||||
}
|
@ -0,0 +1,301 @@
|
||||
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
|
||||
#include "instructions/RabbitizerInstrRsp.h"
|
||||
|
||||
//#include "common/RabbitizerConfig.h"
|
||||
|
||||
|
||||
|
||||
|
||||
void RabbitizerInstrRsp_processUniqueId_Normal(RabbitizerInstr *self) {
|
||||
switch (self->opcode) {
|
||||
case 0b000010:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_j;
|
||||
break;
|
||||
case 0b000011:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_jal;
|
||||
break;
|
||||
case 0b000100:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_beq;
|
||||
break;
|
||||
case 0b000101:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bne;
|
||||
break;
|
||||
case 0b000110:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_blez;
|
||||
break;
|
||||
case 0b000111:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bgtz;
|
||||
break;
|
||||
|
||||
case 0b001000:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_addi;
|
||||
break;
|
||||
case 0b001001:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_addiu;
|
||||
break;
|
||||
case 0b001010:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_slti;
|
||||
break;
|
||||
case 0b001011:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_sltiu;
|
||||
break;
|
||||
case 0b001100:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_andi;
|
||||
break;
|
||||
case 0b001101:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_ori;
|
||||
break;
|
||||
case 0b001110:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_xori;
|
||||
break;
|
||||
case 0b001111:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_lui;
|
||||
break;
|
||||
|
||||
//case 0b010100:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_beql;
|
||||
// break;
|
||||
//case 0b010101:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_bnel;
|
||||
// break;
|
||||
//case 0b010110:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_blezl;
|
||||
// break;
|
||||
//case 0b010111:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_bgtzl;
|
||||
// break;
|
||||
|
||||
//case 0b011000:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_daddi;
|
||||
// break;
|
||||
//case 0b011001:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_daddiu;
|
||||
// break;
|
||||
//case 0b011010:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_ldl;
|
||||
// break;
|
||||
//case 0b011011:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_ldr;
|
||||
// break;
|
||||
|
||||
case 0b100000:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_lb;
|
||||
break;
|
||||
case 0b100001:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_lh;
|
||||
break;
|
||||
//case 0b100010:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_lwl;
|
||||
// break;
|
||||
case 0b100011:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_lw;
|
||||
break;
|
||||
case 0b100100:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_lbu;
|
||||
break;
|
||||
case 0b100101:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_lhu;
|
||||
break;
|
||||
//case 0b100110:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_lwr;
|
||||
// break;
|
||||
//case 0b100111:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_lwu;
|
||||
// break;
|
||||
|
||||
case 0b101000:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_sb;
|
||||
break;
|
||||
case 0b101001:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_sh;
|
||||
break;
|
||||
//case 0b101010:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_swl;
|
||||
// break;
|
||||
case 0b101011:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_sw;
|
||||
break;
|
||||
//case 0b101100:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_sdl;
|
||||
// break;
|
||||
//case 0b101101:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_sdr;
|
||||
// break;
|
||||
//case 0b101110:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_swr;
|
||||
// break;
|
||||
case 0b101111:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_cache;
|
||||
break;
|
||||
|
||||
//case 0b110000:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_ll;
|
||||
// break;
|
||||
case 0b110001:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_lwc1;
|
||||
break;
|
||||
//case 0b110010:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_lwc2;
|
||||
// break;
|
||||
case 0b110011:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_pref;
|
||||
break;
|
||||
//case 0b110100:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_lld;
|
||||
// break;
|
||||
//case 0b110101:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_ldc1;
|
||||
// break;
|
||||
//case 0b110110:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_ldc2;
|
||||
// break;
|
||||
//case 0b110111:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_ld;
|
||||
// break;
|
||||
|
||||
//case 0b111000:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_sc;
|
||||
// break;
|
||||
case 0b111001:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_cpu_swc1;
|
||||
break;
|
||||
//case 0b111010:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_swc2;
|
||||
// break;
|
||||
|
||||
//case 0b111100:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_scd;
|
||||
// break;
|
||||
//case 0b111101:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_sdc1;
|
||||
// break;
|
||||
//case 0b111110:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_sdc2;
|
||||
// break;
|
||||
//case 0b111111:
|
||||
// self->uniqueId = RABBITIZER_INSTR_ID_cpu_sd;
|
||||
// break;
|
||||
|
||||
default:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID;
|
||||
break;
|
||||
|
||||
// new rsp stuff
|
||||
case 0b111010:
|
||||
switch (self->rd) {
|
||||
case 0b00000:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_sbv;
|
||||
break;
|
||||
case 0b00001:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_ssv;
|
||||
break;
|
||||
case 0b00010:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_slv;
|
||||
break;
|
||||
case 0b00011:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_sdv;
|
||||
break;
|
||||
case 0b00100:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_sqv;
|
||||
break;
|
||||
case 0b00101:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_srv;
|
||||
break;
|
||||
case 0b00110:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_spv;
|
||||
break;
|
||||
case 0b00111:
|
||||
if (RAB_INSTR_RSP_GET_ELEMENT_LOW(self) == 0) {
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_suv;
|
||||
} else {
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_swv;
|
||||
}
|
||||
break;
|
||||
case 0b01000:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_shv;
|
||||
break;
|
||||
case 0b01001:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_sfv;
|
||||
break;
|
||||
case 0b01011:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_stv;
|
||||
break;
|
||||
|
||||
default:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0b110010:
|
||||
switch (self->rd) {
|
||||
case 0b00000:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_lbv;
|
||||
break;
|
||||
case 0b00001:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_lsv;
|
||||
break;
|
||||
case 0b00010:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_llv;
|
||||
break;
|
||||
case 0b00011:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_ldv;
|
||||
break;
|
||||
case 0b00100:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_lqv;
|
||||
break;
|
||||
case 0b00101:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_lrv;
|
||||
break;
|
||||
case 0b00110:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_lpv;
|
||||
break;
|
||||
case 0b00111:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_luv;
|
||||
break;
|
||||
case 0b01000:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_lhv;
|
||||
break;
|
||||
case 0b01001:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_lfv;
|
||||
break;
|
||||
case 0b01011:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_ltv;
|
||||
break;
|
||||
|
||||
default:
|
||||
self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
|
||||
}
|
||||
|
||||
|
||||
|
||||
void RabbitizerInstrRsp_processUniqueId(RabbitizerInstr *self) {
|
||||
switch (self->opcode) {
|
||||
default:
|
||||
RabbitizerInstrRsp_processUniqueId_Normal(self);
|
||||
break;
|
||||
case 0x00:
|
||||
//RabbitizerInstrRsp_processUniqueId_Special(self);
|
||||
break;
|
||||
case 0x01:
|
||||
//RabbitizerInstrRsp_processUniqueId_Regimm(self);
|
||||
break;
|
||||
case 0x10:
|
||||
//RabbitizerInstrRsp_processUniqueId_Coprocessor0(self);
|
||||
break;
|
||||
//case 0x11:
|
||||
// RabbitizerInstrRsp_processUniqueId_Coprocessor1(self);
|
||||
// break;
|
||||
case 0x12:
|
||||
//RabbitizerInstrRsp_processUniqueId_Coprocessor2(self);
|
||||
break;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user