First batch of rsp stuff

This commit is contained in:
angie 2022-06-06 22:19:42 -04:00
parent 3acf9fceb0
commit 185a934081
10 changed files with 544 additions and 51 deletions

View File

@ -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);

View 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

View File

@ -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;

View File

@ -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}),

View File

@ -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"],

View File

@ -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);

View File

@ -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,
};

View File

@ -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;

View 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;
}

View File

@ -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;
}
}