Merge pull request #6 from Decompollaborate/develop

1.1.0: RSP and R5900 support
This commit is contained in:
Anghelo Carvajal 2022-08-27 12:46:15 -04:00 committed by GitHub
commit 7d6635273b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
74 changed files with 3781 additions and 1828 deletions

View File

@ -9,8 +9,8 @@ IINC := -I include
CSTD := -std=c11
CFLAGS :=
LDFLAGS :=
WARNINGS := -Wall -Wextra
# WARNINGS := -Wall -Wextra -Wpedantic -Wpadded # binary constants :s
WARNINGS := -Wall -Wextra -Wpedantic
# WARNINGS := -Wall -Wextra -Wpedantic -Wpadded
WARNINGS += -Werror=implicit-function-declaration -Werror=incompatible-pointer-types -Werror=vla -Werror=switch -Werror=implicit-fallthrough -Werror=unused-function -Werror=unused-parameter -Werror=shadow
ifeq ($(CC),gcc)
@ -64,7 +64,7 @@ format:
tidy:
clang-tidy-11 -p . --fix --fix-errors $(C_FILES) $(H_FILES) -- $(CSTD) $(OPTFLAGS) $(IINC) $(WARNINGS) $(CFLAGS)
tests: build/test.elf
tests: build/test.elf build/rsptest.elf build/r5900test.elf
.PHONY: all clean distclean format tidy tests
.DEFAULT_GOAL := all

View File

@ -42,5 +42,14 @@ NOTE: Installing the development version is not recommended. Proceed at your own
- Some workarounds for some specific compilers/assemblers:
- `SN64`:
- `div`/`divu` fix: tweaks a bit the produced `div`, `divu` and `break` instructions.
- (Experimental) N64 RSP disassembly support.
- NOTE: This mode has not been tested to even be assemblable.
- N64 RSP instruction decoding support.
- RSP decoding has been tested to build back to matching assemblies with [armips](https://github.com/Kingcom/armips/).
- R5900 (PS2's Emotion Engine processor) decoding support.
## References
- R5900:
- EmotionEngine instruction decoding: <https://psi-rockin.github.io/ps2tek/#eeinstructiondecoding>
- Official documentation from Toshiba: <https://wiki.qemu.org/images/2/2a/C790.pdf>
- VU instruction manual: <http://lukasz.dk/files/vu-instruction-manual.pdf>
- GNU binutils: <https://github.com/bminor/binutils-gdb/blob/master/opcodes/mips-opc.c>

View File

@ -2,5 +2,5 @@
/* SPDX-License-Identifier: MIT */
RABBITIZER_DEF_INSTR_CATEGORY(CPU),
RABBITIZER_DEF_INSTR_CATEGORY(RSP),
// RABBITIZER_DEF_INSTR_CATEGORY(PS2),
RABBITIZER_DEF_INSTR_CATEGORY(RSP), // N64
RABBITIZER_DEF_INSTR_CATEGORY(R5900), // PS2's Emotion Engine

View File

@ -10,6 +10,7 @@
#include "common/Utils.h"
#include "RabbitizerOperandType.h"
#include "RabbitizerInstrId.h"
#include "RabbitizerInstrSuffix.h"
typedef enum RabbitizerInstrType {
RABBITIZER_INSTR_TYPE_UNKNOWN,
@ -33,6 +34,8 @@ typedef struct RabbitizerInstrDescriptor {
RabbitizerOperandType operands[4];
RabbitizerInstrType instrType;
RabbitizerInstrSuffix instrSuffix;
bool isBranch;
bool isBranchLikely;
bool isJump;
@ -58,7 +61,7 @@ typedef struct RabbitizerInstrDescriptor {
bool isPseudo;
RabbitizerArchitectureVersion architectureVersion;
RabbitizerArchitectureVersion architectureVersion; // TODO: consider removing
} RabbitizerInstrDescriptor;
// TODO: less redundant name
@ -76,6 +79,9 @@ bool RabbitizerInstrDescriptor_isRType(const RabbitizerInstrDescriptor *self);
NODISCARD NON_NULL(1) PURE
bool RabbitizerInstrDescriptor_isRegimmType(const RabbitizerInstrDescriptor *self);
NODISCARD NON_NULL(1) PURE
RabbitizerInstrSuffix RabbitizerInstrDescriptor_instrSuffix(const RabbitizerInstrDescriptor *self);
NODISCARD NON_NULL(1) PURE
bool RabbitizerInstrDescriptor_isBranch(const RabbitizerInstrDescriptor *self);
NODISCARD NON_NULL(1) PURE

View File

@ -8,20 +8,20 @@
#include "common/Utils.h"
#define RABBITIZER_DEF_INSTR_ID(prefix, name, ...) \
RABBITIZER_INSTR_ID_##prefix##_##name
#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \
RABBITIZER_INSTR_ID_##prefix##_##name,
#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, name, altname, ...) \
RABBITIZER_INSTR_ID_##prefix##_##name
#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) \
RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__)
typedef enum RabbitizerInstrId {
#include "instructions/instr_id/RabbitizerInstrId_cpu.inc"
RABBITIZER_DEF_INSTR_ID(cpu, MAX, ),
#include "instructions/instr_id/RabbitizerInstrId_rsp.inc"
RABBITIZER_DEF_INSTR_ID(rsp, MAX, ),
RABBITIZER_DEF_INSTR_ID(ALL, MAX, ) = RABBITIZER_DEF_INSTR_ID(rsp, MAX, ),
#include "instructions/instr_id/RabbitizerInstrId_r5900.inc"
RABBITIZER_INSTR_ID_ALL_MAX = RABBITIZER_DEF_INSTR_ID(r5900, , MAX, )
} RabbitizerInstrId;
#undef RABBITIZER_DEF_INSTR_ID

View File

@ -0,0 +1,27 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
#ifndef RABBITIZER_INSTRSUFFIX_H
#define RABBITIZER_INSTRSUFFIX_H
#pragma once
#include "common/Utils.h"
struct RabbitizerInstruction;
typedef enum RabbitizerInstrSuffix {
RABINSTRSUFFIX_NONE,
RABINSTRSUFFIX_R5900_xyzw,
RABINSTRSUFFIX_MAX
} RabbitizerInstrSuffix;
CONST NODISCARD NON_NULL(1)
size_t RabbitizerInstrSuffix_getSizeForBuffer(const struct RabbitizerInstruction *self, RabbitizerInstrSuffix instrSuffix);
CONST NODISCARD NON_NULL(1, 2)
size_t RabbitizerInstrSuffix_processSuffix(const struct RabbitizerInstruction *self, char *dst, RabbitizerInstrSuffix instrSuffix);
#endif

View File

@ -63,6 +63,8 @@ typedef struct RabbitizerInstruction {
#define RAB_INSTR_GET_code_upper(self) (SHIFTR((self)->word, 16, 10))
#define RAB_INSTR_GET_code_lower(self) (SHIFTR((self)->word, 6, 10))
#define RAB_INSTR_GET_copraw(self) (SHIFTR((self)->word, 0, 25))
#define RAB_INSTR_GET_fmt(self) (SHIFTR((self)->word, 21, 5))
#define RAB_INSTR_GET_fc(self) (SHIFTR((self)->word, 4, 2))
#define RAB_INSTR_GET_cond(self) (SHIFTR((self)->word, 0, 4))
@ -71,6 +73,9 @@ typedef struct RabbitizerInstruction {
#define RAB_INSTR_GET_tf(self) (SHIFTR((self)->word, 16, 1))
#define RAB_INSTR_GET_nd(self) (SHIFTR((self)->word, 17, 1))
#define RAB_INSTR_GET_bc_fmt(self) (SHIFTR((self)->word, 16, 5))
#define RAB_INSTR_GET_stype(self) (SHIFTR((self)->word, 6, 5))
#define RAB_INSTR_PACK_opcode(word, value) (BITREPACK_RIGHT((word), (value), 26, 6))
@ -87,6 +92,8 @@ typedef struct RabbitizerInstruction {
#define RAB_INSTR_PACK_code(word, value) (BITREPACK((word), (value), 6, 20))
#define RAB_INSTR_PACK_copraw(word, value) (BITREPACK((word), (value), 0, 25))
#define RAB_INSTR_PACK_fmt(word, value) (BITREPACK((word), (value), 21, 5))
#define RAB_INSTR_PACK_fc(word, value) (BITREPACK((word), (value), 4, 2))
#define RAB_INSTR_PACK_cond(word, value) (BITREPACK((word), (value), 0, 4))
@ -102,6 +109,9 @@ typedef struct RabbitizerInstruction {
#define RAB_INSTR_PACK_tf(word, value) (BITREPACK((word), (value), 16, 1))
#define RAB_INSTR_PACK_nd(word, value) (BITREPACK((word), (value), 17, 1))
#define RAB_INSTR_PACK_bc_fmt(word, value) (BITREPACK((word), (value), 16, 5))
#define RAB_INSTR_PACK_stype(word, value) (BITREPACK((word), (value), 6, 5))
NON_NULL(1)
@ -118,10 +128,29 @@ NON_NULL(1)
void RabbitizerInstruction_processUniqueId_Special(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstruction_processUniqueId_Regimm(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstruction_processUniqueId_Coprocessor0_BC0(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstruction_processUniqueId_Coprocessor0_Tlb(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstruction_processUniqueId_Coprocessor0(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstruction_processUniqueId_Coprocessor1_BC1(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuS(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuD(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuW(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuL(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstruction_processUniqueId_Coprocessor1(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstruction_processUniqueId_Coprocessor2(RabbitizerInstruction *self);
NON_NULL(1)
@ -185,6 +214,8 @@ bool RabbitizerInstruction_hasOperand(const RabbitizerInstruction *self, Rabbiti
NODISCARD NON_NULL(1) PURE
bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, RabbitizerOperandType operand);
NODISCARD NON_NULL(1) PURE
uint32_t RabbitizerInstruction_getValidBits(const RabbitizerInstruction *self);
NODISCARD NON_NULL(1) PURE
bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self);

View File

@ -0,0 +1,78 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
#ifndef RABBITIZER_INSTRUCTION_R5900_H
#define RABBITIZER_INSTRUCTION_R5900_H
#pragma once
#include "RabbitizerInstruction.h"
#define RAB_INSTR_R5900_GET_mmi_function(self) (SHIFTR((self)->word, 6, 5))
#define RAB_INSTR_R5900_GET_fhi_flo(self) ((SHIFTR((self)->word, 6, 5) << 2) | SHIFTR((self)->word, 0, 2))
#define RAB_INSTR_R5900_GET_vfs(self) (SHIFTR((self)->word, 11, 5))
#define RAB_INSTR_R5900_GET_vft(self) (SHIFTR((self)->word, 16, 5))
#define RAB_INSTR_R5900_GET_vfd(self) (SHIFTR((self)->word, 6, 5))
#define RAB_INSTR_R5900_GET_xyzw_x(self) (SHIFTR((self)->word, 24, 1))
#define RAB_INSTR_R5900_GET_xyzw_y(self) (SHIFTR((self)->word, 23, 1))
#define RAB_INSTR_R5900_GET_xyzw_z(self) (SHIFTR((self)->word, 22, 1))
#define RAB_INSTR_R5900_GET_xyzw_w(self) (SHIFTR((self)->word, 21, 1))
#define RAB_INSTR_R5900_GET_n(self) (SHIFTR((self)->word, 0, 2))
#define RAB_INSTR_R5900_GET_l(self) (SHIFTR((self)->word, 21, 2))
#define RAB_INSTR_R5900_GET_m(self) (SHIFTR((self)->word, 23, 2))
#define RAB_INSTR_R5900_GET_vis(self) (SHIFTR((self)->word, 11, 5))
#define RAB_INSTR_R5900_GET_vit(self) (SHIFTR((self)->word, 16, 5))
#define RAB_INSTR_R5900_GET_vid(self) (SHIFTR((self)->word, 6, 5))
#define RAB_INSTR_R5900_GET_imm5(self) (SHIFTR((self)->word, 6, 5))
#define RAB_INSTR_R5900_PACK_mmi_function(word, value) (BITREPACK((word), (value), 6, 5))
#define RAB_INSTR_R5900_PACK_fhi_flo(word, value) (BITREPACK(BITREPACK((word), (value) >> 2, 6, 5), (value), 0, 2))
#define RAB_INSTR_R5900_PACK_vfs(word, value) (BITREPACK((word), (value), 11, 5))
#define RAB_INSTR_R5900_PACK_vft(word, value) (BITREPACK((word), (value), 16, 5))
#define RAB_INSTR_R5900_PACK_vfd(word, value) (BITREPACK((word), (value), 6, 5))
#define RAB_INSTR_R5900_PACK_xyzw_x(word, value) (BITREPACK((word), (value), 24, 1))
#define RAB_INSTR_R5900_PACK_xyzw_y(word, value) (BITREPACK((word), (value), 23, 1))
#define RAB_INSTR_R5900_PACK_xyzw_z(word, value) (BITREPACK((word), (value), 22, 1))
#define RAB_INSTR_R5900_PACK_xyzw_w(word, value) (BITREPACK((word), (value), 21, 1))
#define RAB_INSTR_R5900_PACK_n(word, value) (BITREPACK((word), (value), 0, 2))
#define RAB_INSTR_R5900_PACK_l(word, value) (BITREPACK((word), (value), 21, 2))
#define RAB_INSTR_R5900_PACK_m(word, value) (BITREPACK((word), (value), 23, 2))
#define RAB_INSTR_R5900_PACK_vis(word, value) (BITREPACK((word), (value), 11, 5))
#define RAB_INSTR_R5900_PACK_vit(word, value) (BITREPACK((word), (value), 16, 5))
#define RAB_INSTR_R5900_PACK_vid(word, value) (BITREPACK((word), (value), 6, 5))
#define RAB_INSTR_R5900_PACK_imm5(word, value) (BITREPACK((word), (value), 6, 5))
NON_NULL(1)
void RabbitizerInstructionR5900_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram);
NON_NULL(1)
void RabbitizerInstructionR5900_destroy(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR5900_processUniqueId_Normal(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR5900_processUniqueId_Special(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR5900_processUniqueId_Regimm(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR5900_processUniqueId_Coprocessor0(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR5900_processUniqueId_Coprocessor1(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR5900_processUniqueId_Coprocessor2(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR5900_processUniqueId_MMI(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR5900_processUniqueId(RabbitizerInstruction *self);
#endif

View File

@ -8,26 +8,34 @@
#include "RabbitizerInstruction.h"
#define RAB_INSTR_RSP_GET_VS(self) (SHIFTR((self)->word, 11, 5))
#define RAB_INSTR_RSP_GET_VT(self) (SHIFTR((self)->word, 16, 5))
#define RAB_INSTR_RSP_GET_VD(self) (SHIFTR((self)->word, 6, 5))
#define RAB_INSTR_RSP_GET_cop2t(self) (SHIFTR((self)->word, 16, 5))
#define RAB_INSTR_RSP_GET_cop2cd(self) (SHIFTR((self)->word, 11, 5))
#define RAB_INSTR_RSP_GET_vs(self) (SHIFTR((self)->word, 11, 5))
#define RAB_INSTR_RSP_GET_vt(self) (SHIFTR((self)->word, 16, 5))
#define RAB_INSTR_RSP_GET_vd(self) (SHIFTR((self)->word, 6, 5))
#define RAB_INSTR_RSP_GET_elementhigh(self) (SHIFTR((self)->word, 21, 4))
#define RAB_INSTR_RSP_GET_elementlow(self) (SHIFTR((self)->word, 7, 4))
#define RAB_INSTR_RSP_GET_OFFSET_VECTOR_RAW(self) (SHIFTR((self)->word, 0, 7))
#define RAB_INSTR_RSP_GET_index(self) (SHIFTR((self)->word, 7, 4))
#define RAB_INSTR_RSP_GET_de(self) (SHIFTR((self)->word, 11, 5))
#define RAB_INSTR_RSP_PACK_cop2t(word, value) (BITREPACK((word), value, 16, 5))
#define RAB_INSTR_RSP_PACK_cop2cd(word, value) (BITREPACK((word), value, 11, 5))
#define RAB_INSTR_RSP_PACK_vs(word, value) (BITREPACK((word), value, 11, 5))
#define RAB_INSTR_RSP_PACK_vt(word, value) (BITREPACK((word), value, 16, 5))
#define RAB_INSTR_RSP_PACK_vd(word, value) (BITREPACK((word), value, 6, 5))
#define RAB_INSTR_RSP_PACK_elementhigh(word, value) (BITREPACK((word), value, 16, 4))
#define RAB_INSTR_RSP_PACK_elementhigh(word, value) (BITREPACK((word), value, 21, 4))
#define RAB_INSTR_RSP_PACK_elementlow(word, value) (BITREPACK((word), value, 7, 4))
#define RAB_INSTR_RSP_PACK_index(word, value) (BITREPACK((word), value, 7, 4))
#define RAB_INSTR_RSP_PACK_offset(word, value) (BITREPACK((word), value, 0, 7))
#define RAB_INSTR_RSP_PACK_de(word, value) (BITREPACK((word), value, 11, 5))
NON_NULL(1)
@ -50,8 +58,5 @@ void RabbitizerInstructionRsp_processUniqueId(RabbitizerInstruction *self);
NODISCARD NON_NULL(1) PURE
uint16_t RabbitizerInstructionRsp_GetOffsetVector(const RabbitizerInstruction *self);
NODISCARD NON_NULL(1) PURE
uint8_t RabbitizerInstructionRsp_processVectorElement(const RabbitizerInstruction *self, uint8_t element);
#endif

View File

@ -13,6 +13,7 @@ typedef enum RabbitizerOperandType {
RABBITIZER_OPERAND_TYPE_rt,
RABBITIZER_OPERAND_TYPE_rd,
RABBITIZER_OPERAND_TYPE_sa,
RABBITIZER_OPERAND_TYPE_zero, // $zero
// RABBITIZER_OPERAND_TYPE_function,
RABBITIZER_OPERAND_TYPE_cop0d,
RABBITIZER_OPERAND_TYPE_fs,
@ -22,6 +23,7 @@ typedef enum RabbitizerOperandType {
RABBITIZER_OPERAND_TYPE_cop2t,
RABBITIZER_OPERAND_TYPE_op,
RABBITIZER_OPERAND_TYPE_code,
RABBITIZER_OPERAND_TYPE_copraw,
RABBITIZER_OPERAND_TYPE_LABEL,
RABBITIZER_OPERAND_TYPE_IMM,
// composed/aliased operands
@ -32,6 +34,8 @@ typedef enum RabbitizerOperandType {
RABBITIZER_OPERAND_TYPE_RSP_rt,
RABBITIZER_OPERAND_TYPE_RSP_rd,
RABBITIZER_OPERAND_TYPE_RSP_cop0d,
RABBITIZER_OPERAND_TYPE_RSP_cop2t,
RABBITIZER_OPERAND_TYPE_RSP_cop2cd, // Coprocessor 2 control rd
RABBITIZER_OPERAND_TYPE_RSP_vs,
RABBITIZER_OPERAND_TYPE_RSP_vt,
RABBITIZER_OPERAND_TYPE_RSP_vd,
@ -42,12 +46,46 @@ typedef enum RabbitizerOperandType {
// composed/aliased operands
RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh,
RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow,
RABBITIZER_OPERAND_TYPE_RSP_vd_vs,
RABBITIZER_OPERAND_TYPE_RSP_vd_index,
RABBITIZER_OPERAND_TYPE_RSP_vd_de,
RABBITIZER_OPERAND_TYPE_RSP_vs_index,
RABBITIZER_OPERAND_TYPE_RSP_offset_rs,
RABBITIZER_OPERAND_TYPE_RSP_IMM_base,
/* rsp */
RABBITIZER_OPERAND_TYPE_MAX,
/* R5900 */
RABBITIZER_OPERAND_TYPE_R5900_I,
RABBITIZER_OPERAND_TYPE_R5900_Q,
RABBITIZER_OPERAND_TYPE_R5900_R,
RABBITIZER_OPERAND_TYPE_R5900_ACC,
RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw,
RABBITIZER_OPERAND_TYPE_R5900_vfs,
RABBITIZER_OPERAND_TYPE_R5900_vft,
RABBITIZER_OPERAND_TYPE_R5900_vfd,
RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw,
RABBITIZER_OPERAND_TYPE_R5900_vftxyzw,
RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw,
RABBITIZER_OPERAND_TYPE_R5900_vfsn,
RABBITIZER_OPERAND_TYPE_R5900_vftn,
RABBITIZER_OPERAND_TYPE_R5900_vfdn,
RABBITIZER_OPERAND_TYPE_R5900_vfsl,
RABBITIZER_OPERAND_TYPE_R5900_vftl,
RABBITIZER_OPERAND_TYPE_R5900_vfdl,
RABBITIZER_OPERAND_TYPE_R5900_vfsm,
RABBITIZER_OPERAND_TYPE_R5900_vftm,
RABBITIZER_OPERAND_TYPE_R5900_vfdm,
RABBITIZER_OPERAND_TYPE_R5900_vis,
RABBITIZER_OPERAND_TYPE_R5900_vit,
RABBITIZER_OPERAND_TYPE_R5900_vid,
RABBITIZER_OPERAND_TYPE_R5900_vis_predecr,
RABBITIZER_OPERAND_TYPE_R5900_vit_predecr,
RABBITIZER_OPERAND_TYPE_R5900_vid_predecr,
RABBITIZER_OPERAND_TYPE_R5900_vis_postincr,
RABBITIZER_OPERAND_TYPE_R5900_vit_postincr,
RABBITIZER_OPERAND_TYPE_R5900_vid_postincr,
RABBITIZER_OPERAND_TYPE_R5900_imm5,
/* R5900 */
RABBITIZER_OPERAND_TYPE_MAX
} RabbitizerOperandType;
#endif

View File

@ -50,6 +50,9 @@ typedef enum RabbitizerRegister_Cop2 {
#include "instructions/registers/RabbitizerRegister_Cop2.inc"
} RabbitizerRegister_Cop2;
/* RSP */
typedef enum RabbitizerRegister_RspGpr {
#include "instructions/registers/RabbitizerRegister_RspGpr.inc"
} RabbitizerRegister_RspGpr;
@ -58,10 +61,33 @@ typedef enum RabbitizerRegister_RspCop0 {
#include "instructions/registers/RabbitizerRegister_RspCop0.inc"
} RabbitizerRegister_RspCop0;
typedef enum RabbitizerRegister_RspCop2 {
#include "instructions/registers/RabbitizerRegister_RspCop2.inc"
} RabbitizerRegister_RspCop2;
typedef enum RabbitizerRegister_RspCop2Control {
#include "instructions/registers/RabbitizerRegister_RspCop2Control.inc"
} RabbitizerRegister_RspCop2Control;
typedef enum RabbitizerRegister_RspVector {
#include "instructions/registers/RabbitizerRegister_RspVector.inc"
} RabbitizerRegister_RspVector;
/* RSP */
/* R5900 */
typedef enum RabbitizerRegister_R5900VF {
#include "instructions/registers/RabbitizerRegister_R5900VF.inc"
} RabbitizerRegister_R5900VF;
typedef enum RabbitizerRegister_R5900VI {
#include "instructions/registers/RabbitizerRegister_R5900VI.inc"
} RabbitizerRegister_R5900VI;
/* R5900 */
#undef RABBITIZER_DEF_REG
#undef RABBITIZER_DEF_REG_NODOLLAR
@ -88,11 +114,21 @@ NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameCop1Control(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameCop2(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameRspGpr(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameRspCop0(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameRspCop2(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameRspCop2Control(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameRspVector(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameR5900VF(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameR5900VI(uint8_t regValue);
#endif

View File

@ -1,304 +1,19 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
RABBITIZER_DEF_INSTR_ID(cpu, INVALID, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .architectureVersion=-1),
RABBITIZER_DEF_INSTR_ID(cpu, , INVALID, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM})
// OP rs
RABBITIZER_DEF_INSTR_ID(cpu, mthi, .operands={RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Move To HI register
RABBITIZER_DEF_INSTR_ID(cpu, mtlo, .operands={RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Move To LO register
RABBITIZER_DEF_INSTR_ID(cpu, jr, .operands={RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Jump Register
RABBITIZER_DEF_INSTR_ID(cpu, jalr, .operands={RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Jump And Link Register
#include "instructions/instr_id/cpu/cpu_normal.inc"
#include "instructions/instr_id/cpu/cpu_special.inc"
#include "instructions/instr_id/cpu/cpu_regimm.inc"
#include "instructions/instr_id/cpu/cpu_cop0.inc"
#include "instructions/instr_id/cpu/cpu_cop0_bc0.inc"
#include "instructions/instr_id/cpu/cpu_cop0_tlb.inc"
#include "instructions/instr_id/cpu/cpu_cop1.inc"
#include "instructions/instr_id/cpu/cpu_cop1_bc1.inc"
#include "instructions/instr_id/cpu/cpu_cop1_fpu_s.inc"
#include "instructions/instr_id/cpu/cpu_cop1_fpu_d.inc"
#include "instructions/instr_id/cpu/cpu_cop1_fpu_w.inc"
#include "instructions/instr_id/cpu/cpu_cop1_fpu_l.inc"
// OP rd, rs
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, jalr_rd, jalr, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Jump And Link Register // Special case for rd != 31
// OP rd
RABBITIZER_DEF_INSTR_ID(cpu, mfhi, .operands={RABBITIZER_OPERAND_TYPE_rd}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Move From HI register
RABBITIZER_DEF_INSTR_ID(cpu, mflo, .operands={RABBITIZER_OPERAND_TYPE_rd}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Move From LO register
// OP rs, rt
RABBITIZER_DEF_INSTR_ID(cpu, mult, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // MULTtiply word
RABBITIZER_DEF_INSTR_ID(cpu, multu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // MULTtiply Unsigned word
RABBITIZER_DEF_INSTR_ID(cpu, dmult, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword MULTiply
RABBITIZER_DEF_INSTR_ID(cpu, dmultu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword MULTiply Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, tge, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Trap if Greater or Equal
RABBITIZER_DEF_INSTR_ID(cpu, tgeu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Trap if Greater or Equal Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, tlt, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Trap if Less Than
RABBITIZER_DEF_INSTR_ID(cpu, tltu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Trap if Less Than Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, teq, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Trap if EQual
RABBITIZER_DEF_INSTR_ID(cpu, tne, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Trap if Not Equal
// OP rd, rs, rt
RABBITIZER_DEF_INSTR_ID(cpu, movz, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV), // MOVe conditional on Zero
RABBITIZER_DEF_INSTR_ID(cpu, movn, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV), // MOVe conditional on Not zero
RABBITIZER_DEF_INSTR_ID(cpu, div, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // DIVide word
RABBITIZER_DEF_INSTR_ID(cpu, divu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // DIVide Unsigned word
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, sn64_div, div, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // DIVide word
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, sn64_divu, divu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // DIVide Unsigned word
RABBITIZER_DEF_INSTR_ID(cpu, ddiv, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword DIVide
RABBITIZER_DEF_INSTR_ID(cpu, ddivu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword DIVide Unsigned
// RABBITIZER_DEF_INSTR_ID(cpu, ddiv, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III),
// RABBITIZER_DEF_INSTR_ID(cpu, ddivu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III),
RABBITIZER_DEF_INSTR_ID(cpu, add, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .notEmitedByCompilers=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // ADD word
RABBITIZER_DEF_INSTR_ID(cpu, addu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // ADD Unsigned word
RABBITIZER_DEF_INSTR_ID(cpu, sub, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Subtract word
RABBITIZER_DEF_INSTR_ID(cpu, subu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // SUBtract Unsigned word
RABBITIZER_DEF_INSTR_ID(cpu, and, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // AND
RABBITIZER_DEF_INSTR_ID(cpu, or, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // OR
RABBITIZER_DEF_INSTR_ID(cpu, xor, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // eXclusive OR
RABBITIZER_DEF_INSTR_ID(cpu, nor, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Not OR
RABBITIZER_DEF_INSTR_ID(cpu, slt, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Set on Less Than
RABBITIZER_DEF_INSTR_ID(cpu, sltu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Set on Less Than Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, dadd, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword Add
RABBITIZER_DEF_INSTR_ID(cpu, daddu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword Add Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, dsub, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword SUBtract
RABBITIZER_DEF_INSTR_ID(cpu, dsubu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword SUBtract Unsigned
// OP code
RABBITIZER_DEF_INSTR_ID(cpu, syscall, .operands={RABBITIZER_OPERAND_TYPE_code}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // SYStem CALL
RABBITIZER_DEF_INSTR_ID(cpu, break, .operands={RABBITIZER_OPERAND_TYPE_code}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Break
RABBITIZER_DEF_INSTR_ID(cpu, sync, .operands={RABBITIZER_OPERAND_TYPE_code}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Sync
// OP rd, rt, rs
RABBITIZER_DEF_INSTR_ID(cpu, dsllv, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword Shift Left Logical Variable
RABBITIZER_DEF_INSTR_ID(cpu, dsrlv, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword Shift Right Logical Variable
RABBITIZER_DEF_INSTR_ID(cpu, dsrav, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword Shift Right Arithmetic Variable
RABBITIZER_DEF_INSTR_ID(cpu, sllv, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Shift word Left Logical Variable
RABBITIZER_DEF_INSTR_ID(cpu, srlv, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Shift word Right Logical Variable
RABBITIZER_DEF_INSTR_ID(cpu, srav, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Shift word Right Arithmetic Variable
// OP rd, rt, sa
RABBITIZER_DEF_INSTR_ID(cpu, sll, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Shift word Left Logical
RABBITIZER_DEF_INSTR_ID(cpu, srl, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Shift word Right Logical
RABBITIZER_DEF_INSTR_ID(cpu, sra, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Shift word Right Arithmetic
RABBITIZER_DEF_INSTR_ID(cpu, dsll, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword Shift Left Logical
RABBITIZER_DEF_INSTR_ID(cpu, dsrl, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword Shift Right Logical
RABBITIZER_DEF_INSTR_ID(cpu, dsra, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword Shift Right Arithmetic
RABBITIZER_DEF_INSTR_ID(cpu, dsll32, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword Shift Left Logical plus 32
RABBITIZER_DEF_INSTR_ID(cpu, dsrl32, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword Shift Right Logical plus 32
RABBITIZER_DEF_INSTR_ID(cpu, dsra32, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword Shift Right Arithmetic plus 32
// OP rs, IMM
RABBITIZER_DEF_INSTR_ID(cpu, bltz, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Branch on Less Than Zero
RABBITIZER_DEF_INSTR_ID(cpu, bgez, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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, bltzl, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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, bgezl, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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, tgei, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II),
RABBITIZER_DEF_INSTR_ID(cpu, tgeiu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II),
RABBITIZER_DEF_INSTR_ID(cpu, tlti, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II),
RABBITIZER_DEF_INSTR_ID(cpu, tltiu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II),
RABBITIZER_DEF_INSTR_ID(cpu, bltzal, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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, bgezal, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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, bltzall, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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, bgezall, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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, teqi, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II),
RABBITIZER_DEF_INSTR_ID(cpu, tnei, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II),
// OP LABEL
RABBITIZER_DEF_INSTR_ID(cpu, j, .operands={RABBITIZER_OPERAND_TYPE_LABEL}, .instrType=RABBITIZER_INSTR_TYPE_J, .isJump=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Jump
RABBITIZER_DEF_INSTR_ID(cpu, jal, .operands={RABBITIZER_OPERAND_TYPE_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, beq, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Branch on EQual
RABBITIZER_DEF_INSTR_ID(cpu, bne, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Branch on Not Equal
RABBITIZER_DEF_INSTR_ID(cpu, beql, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Branch on EQual Likely
RABBITIZER_DEF_INSTR_ID(cpu, bnel, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .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, blez, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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, bgtz, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Branch on Greater Than Zero
RABBITIZER_DEF_INSTR_ID(cpu, blezl, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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, bgtzl, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Branch on Greater Than Zero Likely
// OP rt, IMM
RABBITIZER_DEF_INSTR_ID(cpu, lui, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeHi=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Upper Immediate
// OP rt, rs, IMM
RABBITIZER_DEF_INSTR_ID(cpu, andi, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // And Immediate
RABBITIZER_DEF_INSTR_ID(cpu, ori, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Or Immediate
RABBITIZER_DEF_INSTR_ID(cpu, xori, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // eXclusive OR Immediate
RABBITIZER_DEF_INSTR_ID(cpu, addi, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .notEmitedByCompilers=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Add Immediate
RABBITIZER_DEF_INSTR_ID(cpu, addiu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Add Immediate Unsigned Word
RABBITIZER_DEF_INSTR_ID(cpu, daddi, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword add Immediate
RABBITIZER_DEF_INSTR_ID(cpu, daddiu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Doubleword add Immediate Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, slti, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Set on Less Than Immediate
RABBITIZER_DEF_INSTR_ID(cpu, sltiu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Set on Less Than Immediate Unsigned
// OP rt, IMM(base)
RABBITIZER_DEF_INSTR_ID(cpu, ldl, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Load Doubleword Left
RABBITIZER_DEF_INSTR_ID(cpu, ldr, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Load Doubleword Right
RABBITIZER_DEF_INSTR_ID(cpu, lb, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Byte
RABBITIZER_DEF_INSTR_ID(cpu, lh, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Halfword
RABBITIZER_DEF_INSTR_ID(cpu, lwl, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Word Left
RABBITIZER_DEF_INSTR_ID(cpu, lw, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Word
RABBITIZER_DEF_INSTR_ID(cpu, lbu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Byte Insigned
RABBITIZER_DEF_INSTR_ID(cpu, lhu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Halfword Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, lwr, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Word Right
RABBITIZER_DEF_INSTR_ID(cpu, lwu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Load Word Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, ll, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Load Linked word
RABBITIZER_DEF_INSTR_ID(cpu, ld, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Load Doubleword
RABBITIZER_DEF_INSTR_ID(cpu, lld, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Load Linked Doubleword
RABBITIZER_DEF_INSTR_ID(cpu, sb, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Store Byte
RABBITIZER_DEF_INSTR_ID(cpu, sh, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Store Halfword
RABBITIZER_DEF_INSTR_ID(cpu, swl, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Store Word Left
RABBITIZER_DEF_INSTR_ID(cpu, sw, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Store Word
RABBITIZER_DEF_INSTR_ID(cpu, sdl, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Store Doubleword Left
RABBITIZER_DEF_INSTR_ID(cpu, sdr, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Store Doubleword Right
RABBITIZER_DEF_INSTR_ID(cpu, swr, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Store Word Right
RABBITIZER_DEF_INSTR_ID(cpu, sd, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Store Doubleword
RABBITIZER_DEF_INSTR_ID(cpu, sc, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Store Conditional word
RABBITIZER_DEF_INSTR_ID(cpu, scd, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III), // Store Conditional Doubleword
RABBITIZER_DEF_INSTR_ID(cpu, pref, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV), // Prefetch
RABBITIZER_DEF_INSTR_ID(cpu, cache, .operands={RABBITIZER_OPERAND_TYPE_op, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .notEmitedByCompilers=true), // Cache
// OP ft, IMM(base)
RABBITIZER_DEF_INSTR_ID(cpu, lwc1, .operands={RABBITIZER_OPERAND_TYPE_ft, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Word to Coprocessor z
RABBITIZER_DEF_INSTR_ID(cpu, ldc1, .operands={RABBITIZER_OPERAND_TYPE_ft, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .isDouble=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Load Doubleword to Coprocessor z
RABBITIZER_DEF_INSTR_ID(cpu, swc1, .operands={RABBITIZER_OPERAND_TYPE_ft, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Store Word from Coprocessor z
RABBITIZER_DEF_INSTR_ID(cpu, sdc1, .operands={RABBITIZER_OPERAND_TYPE_ft, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .isDouble=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Store Doubleword from Coprocessor z
// OP cop2t, IMM(base)
RABBITIZER_DEF_INSTR_ID(cpu, lwc2, .operands={RABBITIZER_OPERAND_TYPE_cop2t, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Word to Coprocessor z
RABBITIZER_DEF_INSTR_ID(cpu, ldc2, .operands={RABBITIZER_OPERAND_TYPE_cop2t, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Load Doubleword to Coprocessor z
RABBITIZER_DEF_INSTR_ID(cpu, swc2, .operands={RABBITIZER_OPERAND_TYPE_cop2t, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Store Word from Coprocessor z
RABBITIZER_DEF_INSTR_ID(cpu, sdc2, .operands={RABBITIZER_OPERAND_TYPE_cop2t, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II), // Store Doubleword from Coprocessor z
// OP rt, cop0d
RABBITIZER_DEF_INSTR_ID(cpu, mfc0, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true, .notEmitedByCompilers=true), // Move word From CP0
RABBITIZER_DEF_INSTR_ID(cpu, dmfc0, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true), // Doubleword Move From CP0
RABBITIZER_DEF_INSTR_ID(cpu, cfc0, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true), // Move control word From CP0
RABBITIZER_DEF_INSTR_ID(cpu, mtc0, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true), // Move word to CP0
RABBITIZER_DEF_INSTR_ID(cpu, dmtc0, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN), // Doubleword Move To CP0
RABBITIZER_DEF_INSTR_ID(cpu, ctc0, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN), // Move control word To CP0
// OP
RABBITIZER_DEF_INSTR_ID(cpu, tlbr, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true), // Read Indexed TLB Entry
RABBITIZER_DEF_INSTR_ID(cpu, tlbwi, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true), // Write Indexed TLB Entry
RABBITIZER_DEF_INSTR_ID(cpu, tlbwr, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN), // Write Random TLB Entry
RABBITIZER_DEF_INSTR_ID(cpu, tlbp, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true), // Probe TLB for Matching Entry
RABBITIZER_DEF_INSTR_ID(cpu, eret, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true), // Return from Exception
// OP IMM
RABBITIZER_DEF_INSTR_ID(cpu, bc0t, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true), // Branch on FP True
RABBITIZER_DEF_INSTR_ID(cpu, bc0f, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true), // Branch on FP False
RABBITIZER_DEF_INSTR_ID(cpu, bc0tl, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true), // Branch on FP True Likely
RABBITIZER_DEF_INSTR_ID(cpu, bc0fl, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true), // Branch on FP False Likely
// OP rt, fs
RABBITIZER_DEF_INSTR_ID(cpu, mfc1, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .modifiesRt=true), // Move Word From Floating-Point
RABBITIZER_DEF_INSTR_ID(cpu, dmfc1, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .modifiesRt=true), // Doubleword Move From Floating-Point
RABBITIZER_DEF_INSTR_ID(cpu, mtc1, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Move Word to Floating-Point
RABBITIZER_DEF_INSTR_ID(cpu, dmtc1, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Doubleword Move To Floating-Point
// OP rt, cop1cs
RABBITIZER_DEF_INSTR_ID(cpu, cfc1, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop1cs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .modifiesRt=true), // Move Control Word from Floating-Point
RABBITIZER_DEF_INSTR_ID(cpu, ctc1, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop1cs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Move Control Word to Floating-Point
// OP IMM
RABBITIZER_DEF_INSTR_ID(cpu, bc1f, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true),
RABBITIZER_DEF_INSTR_ID(cpu, bc1t, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true),
RABBITIZER_DEF_INSTR_ID(cpu, bc1fl, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true),
RABBITIZER_DEF_INSTR_ID(cpu, bc1tl, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true),
// OP fd, fs, ft
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, add_s, add.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Add
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, sub_s, sub.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Sub
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, mul_s, mul.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Multiply
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, div_s, div.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Divide
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, add_d, add.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Add
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, sub_d, sub.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Sub
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, mul_d, mul.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Multiply
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, div_d, div.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Divide
// OP fd, fs
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, sqrt_s, sqrt.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Square Root
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, abs_s, abs.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Absolute Value
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, mov_s, mov.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Move
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, neg_s, neg.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Negate
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, sqrt_d, sqrt.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Square Root
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, abs_d, abs.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Absolute Value
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, mov_d, mov.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Move
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, neg_d, neg.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Negate
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, round_l_s, round.l.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Round to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, trunc_l_s, trunc.l.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Truncate to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, ceil_l_s, ceil.l.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Ceiling Convert to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, floor_l_s, floor.l.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Floor Convert to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, round_l_d, round.l.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Round to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, trunc_l_d, trunc.l.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Truncate to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, ceil_l_d, ceil.l.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Ceiling Convert to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, floor_l_d, floor.l.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Floor Convert to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, round_w_s, round.w.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Round to Word Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, trunc_w_s, trunc.w.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Truncate to Word Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, ceil_w_s, ceil.w.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Ceiling Convert to Word Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, floor_w_s, floor.w.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true), // Floating-Point Floor Convert to Word Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, round_w_d, round.w.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Round to Word Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, trunc_w_d, trunc.w.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Truncate to Word Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, ceil_w_d, ceil.w.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Ceiling Convert to Word Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, floor_w_d, floor.w.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true), // Floating-Point Floor Convert to Word Fixed-Point
// OP fs, ft
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_f_s, c.f.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_un_s, c.un.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_eq_s, c.eq.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_ueq_s, c.ueq.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_olt_s, c.olt.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_ult_s, c.ult.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_ole_s, c.ole.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_ule_s, c.ule.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_f_d, c.f.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_un_d, c.un.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_eq_d, c.eq.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_ueq_d, c.ueq.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_olt_d, c.olt.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_ult_d, c.ult.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_ole_d, c.ole.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_ule_d, c.ule.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_sf_s, c.sf.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_ngle_s, c.ngle.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_seq_s, c.seq.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_ngl_s, c.ngl.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_lt_s, c.lt.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_nge_s, c.nge.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_le_s, c.le.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_ngt_s, c.ngt.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_sf_d, c.sf.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_ngle_d, c.ngle.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_seq_d, c.seq.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_ngl_d, c.ngl.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_lt_d, c.lt.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_nge_d, c.nge.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_le_d, c.le.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, c_ngt_d, c.ngt.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
// OP fd, fs
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, cvt_s_d, cvt.s.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, cvt_s_w, cvt.s.w, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, cvt_s_l, cvt.s.l, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, cvt_d_s, cvt.d.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, cvt_d_w, cvt.d.w, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, cvt_d_l, cvt.d.l, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, cvt_w_s, cvt.w.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, cvt_w_d, cvt.w.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, cvt_l_s, cvt.l.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true),
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, cvt_l_d, cvt.l.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true),
// Pseudo-Instruction Unique IDs
// OP
RABBITIZER_DEF_INSTR_ID(cpu, nop, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R, .isPseudo=true), // No OPeration
// OP rs, IMM
RABBITIZER_DEF_INSTR_ID(cpu, beqz, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true), // Branch on EQual Zero
RABBITIZER_DEF_INSTR_ID(cpu, bnez, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true), // Branch on Not Equal Zero
// OP IMM
RABBITIZER_DEF_INSTR_ID(cpu, b, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true), // Branch (unconditional)
// OP rd, rs
RABBITIZER_DEF_INSTR_ID(cpu, move, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .isPseudo=true), // Move
RABBITIZER_DEF_INSTR_ID(cpu, not, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .isPseudo=true), // Not
// OP rd, rt
RABBITIZER_DEF_INSTR_ID(cpu, negu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .isPseudo=true),
RABBITIZER_DEF_INSTR_ID(cpu, , MAX, 0)

View File

@ -0,0 +1,26 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
RABBITIZER_DEF_INSTR_ID(r5900, , INVALID, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .architectureVersion=-1)
#include "instructions/instr_id/r5900/r5900_normal.inc"
#include "instructions/instr_id/r5900/r5900_special.inc"
#include "instructions/instr_id/r5900/r5900_regimm.inc"
#include "instructions/instr_id/r5900/r5900_mmi.inc"
#include "instructions/instr_id/r5900/r5900_mmi_0.inc"
#include "instructions/instr_id/r5900/r5900_mmi_1.inc"
#include "instructions/instr_id/r5900/r5900_mmi_2.inc"
#include "instructions/instr_id/r5900/r5900_mmi_3.inc"
#include "instructions/instr_id/r5900/r5900_cop0_tlb.inc"
#include "instructions/instr_id/r5900/r5900_cop1_fpu_s.inc"
#include "instructions/instr_id/r5900/r5900_cop2.inc"
#include "instructions/instr_id/r5900/r5900_cop2_bc2.inc"
#include "instructions/instr_id/r5900/r5900_cop2_special1.inc"
#include "instructions/instr_id/r5900/r5900_cop2_special2.inc"
RABBITIZER_DEF_INSTR_ID(r5900, , MAX, 0)

View File

@ -1,194 +1,20 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// RSP instructions
RABBITIZER_DEF_INSTR_ID(rsp, INVALID, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
// RSP instructions
RABBITIZER_DEF_INSTR_ID(rsp, , INVALID, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
// OP vd, vs, vt[elementhigh]
RABBITIZER_DEF_INSTR_ID(rsp, vmulf, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmulu, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vrndp, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmulq, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmudl, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmudm, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmudn, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmudh, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmacf, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmacu, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vrndn, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmacq, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmadl, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmadm, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmadn, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmadh, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vadd, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vsub, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vabs, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vaddc, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vsubc, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vsar, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vand, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vnand, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vor, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vnor, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vxor, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vnxor, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vlt, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, veq, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vne, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vge, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vcl, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vch, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vcr, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmrg, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
#include "instructions/instr_id/rsp/rsp_cop2.inc"
#include "instructions/instr_id/rsp/rsp_cop2_vu.inc"
// OP vd[vs], vt[elementhigh]
RABBITIZER_DEF_INSTR_ID(rsp, vrcp, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vrcpl, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}), // operands may be wrong
RABBITIZER_DEF_INSTR_ID(rsp, vrcph, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vmov, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vrsq, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vrsql, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
RABBITIZER_DEF_INSTR_ID(rsp, vrsqh, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}),
#include "instructions/instr_id/rsp/rsp_normal_lwc2.inc"
#include "instructions/instr_id/rsp/rsp_normal_swc2.inc"
// OP
RABBITIZER_DEF_INSTR_ID(rsp, vnop, .operands={0}),
// CPU instructions but with rsp registers
// OP rt, vd[index]
RABBITIZER_DEF_INSTR_ID(rsp, mfc2, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_RSP_vd_index}, .modifiesRt=true),
RABBITIZER_DEF_INSTR_ID(rsp, mtc2, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_RSP_vd_index}),
#include "instructions/instr_id/rsp/rsp_normal.inc"
#include "instructions/instr_id/rsp/rsp_special.inc"
#include "instructions/instr_id/rsp/rsp_regimm.inc"
#include "instructions/instr_id/rsp/rsp_cop0.inc"
// OP rt, rd
RABBITIZER_DEF_INSTR_ID(rsp, cfc2, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rd}, .modifiesRt=true),
RABBITIZER_DEF_INSTR_ID(rsp, ctc2, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rd}),
// OP vt[elementlow], offset(vs)
RABBITIZER_DEF_INSTR_ID(rsp, sbv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, ssv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, slv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, sdv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, sqv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, srv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, spv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, suv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, swv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, shv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, sfv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, stv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, lbv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, lsv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, llv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, ldv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, lqv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, lrv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, lpv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, luv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, lhv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, lfv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
RABBITIZER_DEF_INSTR_ID(rsp, ltv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs}),
// CPU instructions but with rsp registers
// OP rs
RABBITIZER_DEF_INSTR_ID(rsp, jr, .operands={RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true), // Jump Register
RABBITIZER_DEF_INSTR_ID(rsp, jalr, .operands={RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true), // Jump And Link Register
// OP rd, rs
RABBITIZER_DEF_INSTR_ID_ALTNAME(rsp, jalr_rd, jalr, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true), // Jump And Link Register // Special case for rd != 31
// OP rd, rs, rt
RABBITIZER_DEF_INSTR_ID(rsp, movz, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // MOVe conditional on Zero
RABBITIZER_DEF_INSTR_ID(rsp, movn, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // MOVe conditional on Not zero
RABBITIZER_DEF_INSTR_ID(rsp, add, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .notEmitedByCompilers=true), // ADD word
RABBITIZER_DEF_INSTR_ID(rsp, addu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // ADD Unsigned word
RABBITIZER_DEF_INSTR_ID(rsp, sub, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // Subtract word
RABBITIZER_DEF_INSTR_ID(rsp, subu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // SUBtract Unsigned word
RABBITIZER_DEF_INSTR_ID(rsp, and, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // AND
RABBITIZER_DEF_INSTR_ID(rsp, or, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // OR
RABBITIZER_DEF_INSTR_ID(rsp, xor, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // eXclusive OR
RABBITIZER_DEF_INSTR_ID(rsp, nor, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // Not OR
RABBITIZER_DEF_INSTR_ID(rsp, slt, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // Set on Less Than
RABBITIZER_DEF_INSTR_ID(rsp, sltu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // Set on Less Than Unsigned
// OP code
RABBITIZER_DEF_INSTR_ID(rsp, break, .operands={RABBITIZER_OPERAND_TYPE_code}, .instrType=RABBITIZER_INSTR_TYPE_R), // Break
// OP rd, rt, rs
RABBITIZER_DEF_INSTR_ID(rsp, sllv, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // Shift word Left Logical Variable
RABBITIZER_DEF_INSTR_ID(rsp, srlv, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // Shift word Right Logical Variable
RABBITIZER_DEF_INSTR_ID(rsp, srav, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // Shift word Right Arithmetic Variable
// OP rd, rt, sa
RABBITIZER_DEF_INSTR_ID(rsp, sll, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // Shift word Left Logical
RABBITIZER_DEF_INSTR_ID(rsp, srl, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // Shift word Right Logical
RABBITIZER_DEF_INSTR_ID(rsp, sra, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // Shift word Right Arithmetic
// OP rs, IMM
RABBITIZER_DEF_INSTR_ID(rsp, bltz, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true), // Branch on Less Than Zero
RABBITIZER_DEF_INSTR_ID(rsp, bgez, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true), // Branch on Greater than or Equal to Zero
RABBITIZER_DEF_INSTR_ID(rsp, bltzal, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true), // Branch on Less Than Zero and Link
RABBITIZER_DEF_INSTR_ID(rsp, bgezal, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true), // Branch on Greater Than or Equal to Zero and Link
// OP LABEL
RABBITIZER_DEF_INSTR_ID(rsp, j, .operands={RABBITIZER_OPERAND_TYPE_LABEL}, .instrType=RABBITIZER_INSTR_TYPE_J, .isJump=true), // Jump
RABBITIZER_DEF_INSTR_ID(rsp, jal, .operands={RABBITIZER_OPERAND_TYPE_LABEL}, .instrType=RABBITIZER_INSTR_TYPE_J, .isJump=true, .doesLink=true), // Jump And Link
// OP rs, rt, IMM
RABBITIZER_DEF_INSTR_ID(rsp, beq, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true), // Branch on EQual
RABBITIZER_DEF_INSTR_ID(rsp, bne, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true), // Branch on Not Equal
// OP rs, IMM
RABBITIZER_DEF_INSTR_ID(rsp, blez, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true), // Branch on Less than or Equal to Zero
RABBITIZER_DEF_INSTR_ID(rsp, bgtz, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true), // Branch on Greater Than Zero
// OP rt, IMM
RABBITIZER_DEF_INSTR_ID(rsp, lui, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeHi=true), // Load Upper Immediate
// OP rt, rs, IMM
RABBITIZER_DEF_INSTR_ID(rsp, andi, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true), // And Immediate
RABBITIZER_DEF_INSTR_ID(rsp, ori, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeLo=true), // Or Immediate
RABBITIZER_DEF_INSTR_ID(rsp, xori, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true), // eXclusive OR Immediate
RABBITIZER_DEF_INSTR_ID(rsp, addi, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .notEmitedByCompilers=true, .canBeLo=true), // Add Immediate
RABBITIZER_DEF_INSTR_ID(rsp, addiu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true), // Add Immediate Unsigned Word
RABBITIZER_DEF_INSTR_ID(rsp, slti, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true), // Set on Less Than Immediate
RABBITIZER_DEF_INSTR_ID(rsp, sltiu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true), // Set on Less Than Immediate Unsigned
// OP rt, IMM(base)
RABBITIZER_DEF_INSTR_ID(rsp, lb, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Byte
RABBITIZER_DEF_INSTR_ID(rsp, lh, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Halfword
RABBITIZER_DEF_INSTR_ID(rsp, lw, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Word
RABBITIZER_DEF_INSTR_ID(rsp, lbu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Byte Insigned
RABBITIZER_DEF_INSTR_ID(rsp, lhu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Halfword Unsigned
RABBITIZER_DEF_INSTR_ID(rsp, sb, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Store Byte
RABBITIZER_DEF_INSTR_ID(rsp, sh, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Store Halfword
RABBITIZER_DEF_INSTR_ID(rsp, sw, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Store Word
RABBITIZER_DEF_INSTR_ID(rsp, pref, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV), // Prefetch
RABBITIZER_DEF_INSTR_ID(rsp, cache, .operands={RABBITIZER_OPERAND_TYPE_op, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .notEmitedByCompilers=true), // Cache
// OP ft, IMM(base)
RABBITIZER_DEF_INSTR_ID(rsp, lwc1, .operands={RABBITIZER_OPERAND_TYPE_ft, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Load Word to Coprocessor z
RABBITIZER_DEF_INSTR_ID(rsp, swc1, .operands={RABBITIZER_OPERAND_TYPE_ft, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I), // Store Word from Coprocessor z
// OP rt, cop0d
RABBITIZER_DEF_INSTR_ID(rsp, mfc0, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true, .notEmitedByCompilers=true), // Move word From CP0
RABBITIZER_DEF_INSTR_ID(rsp, mtc0, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true), // Move word to CP0
// Pseudo-Instruction Unique IDs
// OP
RABBITIZER_DEF_INSTR_ID(rsp, nop, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R), // No OPeration
// OP rs, IMM
RABBITIZER_DEF_INSTR_ID(rsp, beqz, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true), // Branch on EQual Zero
RABBITIZER_DEF_INSTR_ID(rsp, bnez, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true), // Branch on Not Equal Zero
// OP IMM
RABBITIZER_DEF_INSTR_ID(rsp, b, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true), // Branch (unconditional)
// OP rd, rs
RABBITIZER_DEF_INSTR_ID(rsp, move, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // Move
RABBITIZER_DEF_INSTR_ID(rsp, not, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true), // Not
// OP rd, rt
RABBITIZER_DEF_INSTR_ID(rsp, negu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true),
RABBITIZER_DEF_INSTR_ID(rsp, , MAX, 0)

View File

@ -0,0 +1,10 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP rt, cop0d
RABBITIZER_DEF_INSTR_ID(cpu, 0x00, mfc0, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true, .notEmitedByCompilers=true) // Move word From CP0
RABBITIZER_DEF_INSTR_ID(cpu, 0x01, dmfc0, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true) // Doubleword Move From CP0
RABBITIZER_DEF_INSTR_ID(cpu, 0x02, cfc0, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true) // Move control word From CP0
RABBITIZER_DEF_INSTR_ID(cpu, 0x04, mtc0, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Move word to CP0
RABBITIZER_DEF_INSTR_ID(cpu, 0x05, dmtc0, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN) // Doubleword Move To CP0
RABBITIZER_DEF_INSTR_ID(cpu, 0x06, ctc0, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN) // Move control word To CP0

View File

@ -0,0 +1,8 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP IMM
RABBITIZER_DEF_INSTR_ID(cpu, 0x00, bc0f, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true) // Branch on FP False
RABBITIZER_DEF_INSTR_ID(cpu, 0x01, bc0t, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true) // Branch on FP True
RABBITIZER_DEF_INSTR_ID(cpu, 0x02, bc0fl, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true) // Branch on FP False Likely
RABBITIZER_DEF_INSTR_ID(cpu, 0x03, bc0tl, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true) // Branch on FP True Likely

View File

@ -0,0 +1,12 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP
RABBITIZER_DEF_INSTR_ID(cpu, 0x01, tlbr, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Read Indexed TLB Entry
RABBITIZER_DEF_INSTR_ID(cpu, 0x02, tlbwi, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Write Indexed TLB Entry
RABBITIZER_DEF_INSTR_ID(cpu, 0x06, tlbwr, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN) // Write Random TLB Entry
RABBITIZER_DEF_INSTR_ID(cpu, 0x08, tlbp, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Probe TLB for Matching Entry
RABBITIZER_DEF_INSTR_ID(cpu, 0x18, eret, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Return from Exception

View File

@ -0,0 +1,12 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP rt, fs
RABBITIZER_DEF_INSTR_ID(cpu, 0x00, mfc1, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .modifiesRt=true) // Move Word From Floating-Point
RABBITIZER_DEF_INSTR_ID(cpu, 0x01, dmfc1, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .modifiesRt=true) // Doubleword Move From Floating-Point
RABBITIZER_DEF_INSTR_ID(cpu, 0x04, mtc1, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Move Word to Floating-Point
RABBITIZER_DEF_INSTR_ID(cpu, 0x05, dmtc1, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Doubleword Move To Floating-Point
// OP rt, cop1cs
RABBITIZER_DEF_INSTR_ID(cpu, 0x02, cfc1, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop1cs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .modifiesRt=true) // Move Control Word from Floating-Point
RABBITIZER_DEF_INSTR_ID(cpu, 0x06, ctc1, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_cop1cs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Move Control Word to Floating-Point

View File

@ -0,0 +1,8 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP IMM
RABBITIZER_DEF_INSTR_ID(cpu, 0x00, bc1f, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true)
RABBITIZER_DEF_INSTR_ID(cpu, 0x01, bc1t, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true)
RABBITIZER_DEF_INSTR_ID(cpu, 0x02, bc1fl, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true)
RABBITIZER_DEF_INSTR_ID(cpu, 0x03, bc1tl, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true)

View File

@ -0,0 +1,48 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP fd, fs, ft
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x00, add_d, add.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Add
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x01, sub_d, sub.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Sub
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x02, mul_d, mul.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Multiply
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x03, div_d, div.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Divide
// OP fd, fs
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x04, sqrt_d, sqrt.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Square Root
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x05, abs_d, abs.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Absolute Value
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x06, mov_d, mov.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Move
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x07, neg_d, neg.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Negate
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x08, round_l_d, round.l.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Round to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x09, trunc_l_d, trunc.l.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Truncate to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0A, ceil_l_d, ceil.l.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Ceiling Convert to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0B, floor_l_d, floor.l.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Floor Convert to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0C, round_w_d, round.w.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Round to Word Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0D, trunc_w_d, trunc.w.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Truncate to Word Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0E, ceil_w_d, ceil.w.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Ceiling Convert to Word Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0F, floor_w_d, floor.w.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Floor Convert to Word Fixed-Point
// OP fd, fs
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x20, cvt_s_d, cvt.s.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x24, cvt_w_d, cvt.w.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x25, cvt_l_d, cvt.l.d, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true)
// OP fs, ft
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x30, c_f_d, c.f.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x31, c_un_d, c.un.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x32, c_eq_d, c.eq.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x33, c_ueq_d, c.ueq.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x34, c_olt_d, c.olt.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x35, c_ult_d, c.ult.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x36, c_ole_d, c.ole.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x37, c_ule_d, c.ule.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x38, c_df_d, c.df.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x39, c_ngle_d, c.ngle.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3A, c_deq_d, c.deq.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3B, c_ngl_d, c.ngl.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3C, c_lt_d, c.lt.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3D, c_nge_d, c.nge.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3E, c_le_d, c.le.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3F, c_ngt_d, c.ngt.d, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)

View File

@ -0,0 +1,6 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP fd, fs
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x20, cvt_s_l, cvt.s.l, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x21, cvt_d_l, cvt.d.l, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true)

View File

@ -0,0 +1,48 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP fd, fs, ft
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x00, add_s, add.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Add
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x01, sub_s, sub.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Sub
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x02, mul_s, mul.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Multiply
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x03, div_s, div.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Divide
// OP fd, fs
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x04, sqrt_s, sqrt.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Square Root
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x05, abs_s, abs.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Absolute Value
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x06, mov_s, mov.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Move
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x07, neg_s, neg.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Negate
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x08, round_l_s, round.l.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Round to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x09, trunc_l_s, trunc.l.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Truncate to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0A, ceil_l_s, ceil.l.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Ceiling Convert to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0B, floor_l_s, floor.l.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Floor Convert to Long Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0C, round_w_s, round.w.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Round to Word Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0D, trunc_w_s, trunc.w.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Truncate to Word Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0E, ceil_w_s, ceil.w.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Ceiling Convert to Word Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0F, floor_w_s, floor.w.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Floor Convert to Word Fixed-Point
// OP fd, fs
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x21, cvt_d_s, cvt.d.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x24, cvt_w_s, cvt.w.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x25, cvt_l_s, cvt.l.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
// OP fs, ft
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x30, c_f_s, c.f.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x31, c_un_s, c.un.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x32, c_eq_s, c.eq.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x33, c_ueq_s, c.ueq.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x34, c_olt_s, c.olt.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x35, c_ult_s, c.ult.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x36, c_ole_s, c.ole.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x37, c_ule_s, c.ule.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x38, c_sf_s, c.sf.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x39, c_ngle_s, c.ngle.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3A, c_seq_s, c.seq.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3B, c_ngl_s, c.ngl.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3C, c_lt_s, c.lt.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3D, c_nge_s, c.nge.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3E, c_le_s, c.le.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3F, c_ngt_s, c.ngt.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)

View File

@ -0,0 +1,6 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP fd, fs
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x20, cvt_s_w, cvt.s.w, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x21, cvt_d_w, cvt.d.w, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true)

View File

@ -0,0 +1,83 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP LABEL
RABBITIZER_DEF_INSTR_ID(cpu, 0x02, j, .operands={RABBITIZER_OPERAND_TYPE_LABEL}, .instrType=RABBITIZER_INSTR_TYPE_J, .isJump=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Jump
RABBITIZER_DEF_INSTR_ID(cpu, 0x03, jal, .operands={RABBITIZER_OPERAND_TYPE_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={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on EQual
RABBITIZER_DEF_INSTR_ID(cpu, 0x05, bne, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Not Equal
RABBITIZER_DEF_INSTR_ID(cpu, 0x14, beql, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .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={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .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={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .notEmitedByCompilers=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Add Immediate
RABBITIZER_DEF_INSTR_ID(cpu, 0x09, addiu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Add Immediate Unsigned Word
RABBITIZER_DEF_INSTR_ID(cpu, 0x0A, slti, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Set on Less Than Immediate
RABBITIZER_DEF_INSTR_ID(cpu, 0x0B, sltiu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Set on Less Than Immediate Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, 0x0C, andi, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // And Immediate
RABBITIZER_DEF_INSTR_ID(cpu, 0x0D, ori, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Or Immediate
RABBITIZER_DEF_INSTR_ID(cpu, 0x0E, xori, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // eXclusive OR Immediate
RABBITIZER_DEF_INSTR_ID(cpu, 0x18, daddi, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword add Immediate
RABBITIZER_DEF_INSTR_ID(cpu, 0x19, daddiu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword add Immediate Unsigned
// OP rt, IMM
RABBITIZER_DEF_INSTR_ID(cpu, 0x0F, lui, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeHi=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Upper Immediate
// OP rt, IMM(base)
RABBITIZER_DEF_INSTR_ID(cpu, 0x1A, ldl, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Doubleword Left
RABBITIZER_DEF_INSTR_ID(cpu, 0x1B, ldr, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Doubleword Right
RABBITIZER_DEF_INSTR_ID(cpu, 0x20, lb, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Byte
RABBITIZER_DEF_INSTR_ID(cpu, 0x21, lh, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Halfword
RABBITIZER_DEF_INSTR_ID(cpu, 0x22, lwl, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word Left
RABBITIZER_DEF_INSTR_ID(cpu, 0x23, lw, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word
RABBITIZER_DEF_INSTR_ID(cpu, 0x24, lbu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Byte Insigned
RABBITIZER_DEF_INSTR_ID(cpu, 0x25, lhu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Halfword Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, 0x26, lwr, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word Right
RABBITIZER_DEF_INSTR_ID(cpu, 0x27, lwu, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Word Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, 0x28, sb, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Byte
RABBITIZER_DEF_INSTR_ID(cpu, 0x29, sh, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Halfword
RABBITIZER_DEF_INSTR_ID(cpu, 0x2A, swl, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word Left
RABBITIZER_DEF_INSTR_ID(cpu, 0x2B, sw, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word
RABBITIZER_DEF_INSTR_ID(cpu, 0x2C, sdl, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Store Doubleword Left
RABBITIZER_DEF_INSTR_ID(cpu, 0x2D, sdr, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Store Doubleword Right
RABBITIZER_DEF_INSTR_ID(cpu, 0x2E, swr, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word Right
RABBITIZER_DEF_INSTR_ID(cpu, 0x30, ll, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Load Linked word
RABBITIZER_DEF_INSTR_ID(cpu, 0x33, pref, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV) // Prefetch
RABBITIZER_DEF_INSTR_ID(cpu, 0x34, lld, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Linked Doubleword
RABBITIZER_DEF_INSTR_ID(cpu, 0x37, ld, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Doubleword
RABBITIZER_DEF_INSTR_ID(cpu, 0x38, sc, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Store Conditional word
RABBITIZER_DEF_INSTR_ID(cpu, 0x3C, scd, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Store Conditional Doubleword
RABBITIZER_DEF_INSTR_ID(cpu, 0x3F, sd, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Store Doubleword
// OP op, IMM(base)
RABBITIZER_DEF_INSTR_ID(cpu, 0x2F, cache, .operands={RABBITIZER_OPERAND_TYPE_op, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .notEmitedByCompilers=true) // Cache
// OP ft, IMM(base)
RABBITIZER_DEF_INSTR_ID(cpu, 0x31, lwc1, .operands={RABBITIZER_OPERAND_TYPE_ft, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word to Coprocessor z
RABBITIZER_DEF_INSTR_ID(cpu, 0x35, ldc1, .operands={RABBITIZER_OPERAND_TYPE_ft, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .isDouble=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Load Doubleword to Coprocessor z
RABBITIZER_DEF_INSTR_ID(cpu, 0x39, swc1, .operands={RABBITIZER_OPERAND_TYPE_ft, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word from Coprocessor z
RABBITIZER_DEF_INSTR_ID(cpu, 0x3D, sdc1, .operands={RABBITIZER_OPERAND_TYPE_ft, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .isDouble=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Store Doubleword from Coprocessor z
// OP cop2t, IMM(base)
RABBITIZER_DEF_INSTR_ID(cpu, 0x32, lwc2, .operands={RABBITIZER_OPERAND_TYPE_cop2t, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word to Coprocessor z
RABBITIZER_DEF_INSTR_ID(cpu, 0x36, ldc2, .operands={RABBITIZER_OPERAND_TYPE_cop2t, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Load Doubleword to Coprocessor z
RABBITIZER_DEF_INSTR_ID(cpu, 0x3A, swc2, .operands={RABBITIZER_OPERAND_TYPE_cop2t, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word from Coprocessor z
RABBITIZER_DEF_INSTR_ID(cpu, 0x3E, sdc2, .operands={RABBITIZER_OPERAND_TYPE_cop2t, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Store Doubleword from Coprocessor z
// Pseudo-Instruction Unique IDs
// OP IMM
RABBITIZER_DEF_INSTR_ID(cpu, -0x03, b, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true) // Branch (unconditional)
// OP rs, IMM
RABBITIZER_DEF_INSTR_ID(cpu, -0x04, beqz, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true) // Branch on EQual Zero
RABBITIZER_DEF_INSTR_ID(cpu, -0x05, bnez, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true) // Branch on Not Equal Zero

View File

@ -0,0 +1,20 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP rs, IMM
RABBITIZER_DEF_INSTR_ID(cpu, 0x00, bltz, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II)
RABBITIZER_DEF_INSTR_ID(cpu, 0x09, tgeiu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II)
RABBITIZER_DEF_INSTR_ID(cpu, 0x0A, tlti, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II)
RABBITIZER_DEF_INSTR_ID(cpu, 0x0B, tltiu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II)
RABBITIZER_DEF_INSTR_ID(cpu, 0x0C, teqi, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II)
RABBITIZER_DEF_INSTR_ID(cpu, 0x0E, tnei, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II)
RABBITIZER_DEF_INSTR_ID(cpu, 0x10, bltzal, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .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

View File

@ -0,0 +1,93 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP rd, rt, sa
RABBITIZER_DEF_INSTR_ID(cpu, 0x00, sll, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Left Logical
RABBITIZER_DEF_INSTR_ID(cpu, 0x02, srl, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Right Logical
RABBITIZER_DEF_INSTR_ID(cpu, 0x03, sra, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Right Arithmetic
RABBITIZER_DEF_INSTR_ID(cpu, 0x38, dsll, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Left Logical
RABBITIZER_DEF_INSTR_ID(cpu, 0x3A, dsrl, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Logical
RABBITIZER_DEF_INSTR_ID(cpu, 0x3B, dsra, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Arithmetic
RABBITIZER_DEF_INSTR_ID(cpu, 0x3C, dsll32, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Left Logical plus 32
RABBITIZER_DEF_INSTR_ID(cpu, 0x3E, dsrl32, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Logical plus 32
RABBITIZER_DEF_INSTR_ID(cpu, 0x3F, dsra32, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Arithmetic plus 32
// OP rd, rt, rs
RABBITIZER_DEF_INSTR_ID(cpu, 0x14, dsllv, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Left Logical Variable
RABBITIZER_DEF_INSTR_ID(cpu, 0x16, dsrlv, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Logical Variable
RABBITIZER_DEF_INSTR_ID(cpu, 0x17, dsrav, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Arithmetic Variable
RABBITIZER_DEF_INSTR_ID(cpu, 0x04, sllv, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Left Logical Variable
RABBITIZER_DEF_INSTR_ID(cpu, 0x06, srlv, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Right Logical Variable
RABBITIZER_DEF_INSTR_ID(cpu, 0x07, srav, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Right Arithmetic Variable
// OP rs
RABBITIZER_DEF_INSTR_ID(cpu, 0x11, mthi, .operands={RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Move To HI register
RABBITIZER_DEF_INSTR_ID(cpu, 0x13, mtlo, .operands={RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Move To LO register
RABBITIZER_DEF_INSTR_ID(cpu, 0x08, jr, .operands={RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Jump Register
RABBITIZER_DEF_INSTR_ID(cpu, 0x09, jalr, .operands={RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Jump And Link Register
// OP rd, rs
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, -0x09, jalr_rd, jalr, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Jump And Link Register // Special case for rd != 31
// OP rd
RABBITIZER_DEF_INSTR_ID(cpu, 0x10, mfhi, .operands={RABBITIZER_OPERAND_TYPE_rd}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Move From HI register
RABBITIZER_DEF_INSTR_ID(cpu, 0x12, mflo, .operands={RABBITIZER_OPERAND_TYPE_rd}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Move From LO register
// OP rd, rs, rt
RABBITIZER_DEF_INSTR_ID(cpu, 0x0A, movz, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV) // MOVe conditional on Zero
RABBITIZER_DEF_INSTR_ID(cpu, 0x0B, movn, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV) // MOVe conditional on Not zero
RABBITIZER_DEF_INSTR_ID(cpu, 0x1A, div, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // DIVide word
RABBITIZER_DEF_INSTR_ID(cpu, 0x1B, divu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // DIVide Unsigned word
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, -0x1A, sn64_div, div, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // DIVide word
RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, -0x1B, sn64_divu, divu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // DIVide Unsigned word
RABBITIZER_DEF_INSTR_ID(cpu, 0x1E, ddiv, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword DIVide
RABBITIZER_DEF_INSTR_ID(cpu, 0x1F, ddivu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword DIVide Unsigned
// RABBITIZER_DEF_INSTR_ID(cpu, , ddiv, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III)
// RABBITIZER_DEF_INSTR_ID(cpu, , ddivu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III)
RABBITIZER_DEF_INSTR_ID(cpu, 0x20, add, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .notEmitedByCompilers=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // ADD word
RABBITIZER_DEF_INSTR_ID(cpu, 0x21, addu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // ADD Unsigned word
RABBITIZER_DEF_INSTR_ID(cpu, 0x22, sub, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Subtract word
RABBITIZER_DEF_INSTR_ID(cpu, 0x23, subu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // SUBtract Unsigned word
RABBITIZER_DEF_INSTR_ID(cpu, 0x24, and, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // AND
RABBITIZER_DEF_INSTR_ID(cpu, 0x25, or, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // OR
RABBITIZER_DEF_INSTR_ID(cpu, 0x26, xor, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // eXclusive OR
RABBITIZER_DEF_INSTR_ID(cpu, 0x27, nor, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Not OR
RABBITIZER_DEF_INSTR_ID(cpu, 0x2A, slt, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Set on Less Than
RABBITIZER_DEF_INSTR_ID(cpu, 0x2B, sltu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Set on Less Than Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, 0x2C, dadd, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Add
RABBITIZER_DEF_INSTR_ID(cpu, 0x2D, daddu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Add Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, 0x2E, dsub, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword SUBtract
RABBITIZER_DEF_INSTR_ID(cpu, 0x2F, dsubu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword SUBtract Unsigned
// OP code
RABBITIZER_DEF_INSTR_ID(cpu, 0x0C, syscall, .operands={RABBITIZER_OPERAND_TYPE_code}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // SYStem CALL
RABBITIZER_DEF_INSTR_ID(cpu, 0x0D, break, .operands={RABBITIZER_OPERAND_TYPE_code}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Break
RABBITIZER_DEF_INSTR_ID(cpu, 0x0F, sync, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Sync
// OP rs, rt
RABBITIZER_DEF_INSTR_ID(cpu, 0x18, mult, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // MULTtiply word
RABBITIZER_DEF_INSTR_ID(cpu, 0x19, multu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // MULTtiply Unsigned word
RABBITIZER_DEF_INSTR_ID(cpu, 0x1C, dmult, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword MULTiply
RABBITIZER_DEF_INSTR_ID(cpu, 0x1D, dmultu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword MULTiply Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, 0x30, tge, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Greater or Equal
RABBITIZER_DEF_INSTR_ID(cpu, 0x31, tgeu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Greater or Equal Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, 0x32, tlt, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Less Than
RABBITIZER_DEF_INSTR_ID(cpu, 0x33, tltu, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Less Than Unsigned
RABBITIZER_DEF_INSTR_ID(cpu, 0x34, teq, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if EQual
RABBITIZER_DEF_INSTR_ID(cpu, 0x36, tne, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Not Equal
// Pseudo-Instruction Unique IDs
// OP
RABBITIZER_DEF_INSTR_ID(cpu, -0x01, nop, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R, .isPseudo=true) // No OPeration
// OP rd, rs
RABBITIZER_DEF_INSTR_ID(cpu, -0x25, move, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .isPseudo=true) // Move
RABBITIZER_DEF_INSTR_ID(cpu, -0x27, not, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .isPseudo=true) // Not
// OP rd, rt
RABBITIZER_DEF_INSTR_ID(cpu, -0x23, negu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .isPseudo=true)

View File

@ -0,0 +1,23 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25------21--------------------------------5--------0
| = COP0 | TLB | | fmt |
------6----------5-----------------------------------------------
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
000 | --- | TLBR | TLBWI | --- | --- | --- | TLBWR | --- |
001 | TLBP | --- | --- | --- | --- | --- | --- | --- |
010 | --- | --- | --- | --- | --- | --- | --- | --- |
011 | ERET | --- | --- | --- | --- | --- | --- | --- |
100 | --- | --- | --- | --- | --- | --- | --- | --- |
101 | --- | --- | --- | --- | --- | --- | --- | --- |
110 | --- | --- | --- | --- | --- | --- | --- | --- |
111 | EI | DI | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
// The other instructions are implemented using the main CPU table
RABBITIZER_DEF_INSTR_ID(r5900, 0x38, ei, .operands={0})
RABBITIZER_DEF_INSTR_ID(r5900, 0x39, di, .operands={0})

View File

@ -0,0 +1,46 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25------21 -------------------------------5--------0
| = COP1 | = S | | function|
------6----------5-----------------------------------------6-----
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
000 | ADD.S | SUB.S | MUL.S | DIV.S | SQRT.S| ABS.S | MOV.S | NEG.S |
001 | --- | --- | --- | --- | --- | --- | --- | --- |
010 | --- | --- | --- | --- | --- | --- |RSQRT.S| --- |
011 | ADDA.S| SUBA.S| MULA.S| --- | MADD.S| MSUB.S|MADDA.S|MSUBA.S|
100 | --- | --- | --- | --- | CVT.W | --- | --- | --- |
101 | MAX.S | MIN.S | --- | --- | --- | --- | --- | --- |
110 | C.F | --- | C.EQ | --- | C.LT | --- | C.LE | --- |
111 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
// The other instructions are implemented using the main CPU table
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x04, c1__sqrt_s, c1, .operands={RABBITIZER_OPERAND_TYPE_copraw})
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x16, rsqrt_s, rsqrt.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .isFloat=true) // floating point Reciprocal SQuare RooT
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x18, adda_s, adda.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .isFloat=true) // floating point ADD to Accumulator
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x19, suba_s, suba.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .isFloat=true) // floating point SUBtract to Accumulator
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1A, mula_s, mula.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .isFloat=true) // floating point MULtiply to Accumulator
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1C, madd_s, madd.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .isFloat=true) // floating point Multiply-ADD
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1D, msub_s, msub.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .isFloat=true) // floating point Multiply abd SUBtract
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1E, madda_s, madda.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .isFloat=true) // floating point Multiply-ADD Accumulator
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1F, msuba_s, msuba.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .isFloat=true) // floating point Multiply SUBtract from Accumulator
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x28, max_s, max.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .isFloat=true) // floating point MAXimum
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x29, min_s, min.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .isFloat=true) // floating point MINimum
// Due to the R5900's FPU being non properly complaint the instruction cvt.w.s always behaves as trunc.w.s because is because EE can only do round-to-zero.
// Assemblers like GAS workaround this issue by decoding cvt.w.s as trunc.w.s, so we mimic that behaviour to allow assembling with GAS.
// Here's some reading about the binutils rationale:
// https://sourceware.org/legacy-ml/binutils/2012-11/msg00360.html
// https://sourceware.org/pipermail/binutils/2013-January/079863.html
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x24, trunc_w_s, trunc.w.s, .operands={RABBITIZER_OPERAND_TYPE_fd, RABBITIZER_OPERAND_TYPE_fs}, .isFloat=true) // Floating-Point Truncate to Word Fixed-Point
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x34, c_lt_s, c.lt.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .isFloat=true)
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x36, c_le_s, c.le.s, .operands={RABBITIZER_OPERAND_TYPE_fs, RABBITIZER_OPERAND_TYPE_ft}, .isFloat=true)

View File

@ -0,0 +1,21 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25------21 ----------------------------------------0
| = COP2 | fmt | |
------6----------5-----------------------------------------------
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
00 | --- | QMFC2 | CFC2 | --- | --- | QMTC2 | CTC2 | --- |
01 | *1 | --- | --- | --- | --- | --- | --- | --- |
10 | *2 | *2 | *2 | *2 | *2 | *2 | *2 | *2 |
11 | *2 | *2 | *2 | *2 | *2 | *2 | *2 | *2 |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*1 = BC instructions, see BC2 list *2 =see special1 table
*/
// TODO: properties
RABBITIZER_DEF_INSTR_ID(r5900, 0x01, qmfc2, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_R5900_vfs})
RABBITIZER_DEF_INSTR_ID(r5900, 0x02, cfc2, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_R5900_vis})
RABBITIZER_DEF_INSTR_ID(r5900, 0x05, qmtc2, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_R5900_vfs})
RABBITIZER_DEF_INSTR_ID(r5900, 0x06, ctc2, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_R5900_vis})

View File

@ -0,0 +1,21 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25------21-20------16------------------------------0
| = COP0 | BC2 | fmt | |
------6----------5----------5------------------------------------
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
00 | BC2F | BC2T | BC2FL | BC2TL | --- | --- | --- | --- |
01 | --- | --- | --- | --- | --- | --- | --- | --- |
10 | --- | --- | --- | --- | --- | --- | --- | --- |
11 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
// TODO: operands and properties
RABBITIZER_DEF_INSTR_ID(r5900, 0x00, bc2f, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .isBranch=true)
RABBITIZER_DEF_INSTR_ID(r5900, 0x01, bc2t, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .isBranch=true)
RABBITIZER_DEF_INSTR_ID(r5900, 0x02, bc2fl, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .isBranch=true, .isBranchLikely=true)
RABBITIZER_DEF_INSTR_ID(r5900, 0x03, bc2tl, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .isBranch=true, .isBranchLikely=true)

View File

@ -0,0 +1,82 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26-25-----21-20-----------------------------5--------0
| =COP2 | Special1 | |function|
------6----------5------------------------------------------6----
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
000 |VADDx |VADDy |VADDz |VADDw |VSUBx |VSUBy |VSUBz |VSUBw |
001 |VMADDx |VMADDy |VMADDz |VMADDw |VMSUBx |VMSUBy |VMSUBz |VMSUBw |
010 |VMAXx |VMAXy |VMAXz |VMAXw |VMINIx |VMINIy |VMINIz |VMINIw |
011 |VMULx |VMULy |VMULz |VMULw |VMULq |VMAXi |VMULi |VMINIi |
100 |VADDq |VMADDq |VADDi |VMADDi |VSUBq |VMSUBq |VSUbi |VMSUBi |
101 |VADD |VMADD |VMUL |VMAX |VSUB |VMSUB |VOPMSUB|VMINI |
110 |VIADD |VISUB |VIADDI | --- |VIAND |VIOR | --- | --- |
111 |VCALLMS|VCALLMSR| --- | --- | *1 | *1 | *1 | *1 |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*1=see special2 table
*/
// TODO: properties
RABBITIZER_DEF_INSTR_ID(r5900, 0x00, vaddx, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x01, vaddy, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x02, vaddz, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x03, vaddw, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x04, vsubx, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x05, vsuby, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x06, vsubz, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x07, vsubw, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x08, vmaddx, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x09, vmaddy, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, vmaddz, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x0B, vmaddw, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x0C, vmsubx, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x0D, vmsuby, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x0E, vmsubz, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x0F, vmsubw, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x10, vmaxx, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x11, vmaxy, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x12, vmaxz, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x13, vmaxw, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x14, vminix, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINimum broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x15, vminiy, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINimum broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x16, vminiz, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINimum broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x17, vminiw, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINimum broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x18, vmulx, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x19, vmuly, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, vmulz, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, vmulw, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x1C, vmulq, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply Q
RABBITIZER_DEF_INSTR_ID(r5900, 0x1D, vmaxi, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum I
RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, vmuli, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply I
RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, vminii, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINImum I
RABBITIZER_DEF_INSTR_ID(r5900, 0x20, vaddq, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD Q
RABBITIZER_DEF_INSTR_ID(r5900, 0x21, vmaddq, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD Q
RABBITIZER_DEF_INSTR_ID(r5900, 0x22, vaddi, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD I
RABBITIZER_DEF_INSTR_ID(r5900, 0x23, vmaddi, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD I
RABBITIZER_DEF_INSTR_ID(r5900, 0x24, vsubq, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract Q
RABBITIZER_DEF_INSTR_ID(r5900, 0x25, vmsubq, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract Q
RABBITIZER_DEF_INSTR_ID(r5900, 0x26, vsubi, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract I
RABBITIZER_DEF_INSTR_ID(r5900, 0x27, vmsubi, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract I
RABBITIZER_DEF_INSTR_ID(r5900, 0x28, vadd, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD
RABBITIZER_DEF_INSTR_ID(r5900, 0x29, vmadd, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD
RABBITIZER_DEF_INSTR_ID(r5900, 0x2A, vmul, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply
RABBITIZER_DEF_INSTR_ID(r5900, 0x2B, vmax, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum
RABBITIZER_DEF_INSTR_ID(r5900, 0x2C, vsub, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract
RABBITIZER_DEF_INSTR_ID(r5900, 0x2D, vmsub, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract
RABBITIZER_DEF_INSTR_ID(r5900, 0x2E, vopmsub, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Outer product post decrement
RABBITIZER_DEF_INSTR_ID(r5900, 0x2F, vmini, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINImum
RABBITIZER_DEF_INSTR_ID(r5900, 0x30, viadd, .operands={RABBITIZER_OPERAND_TYPE_R5900_vid, RABBITIZER_OPERAND_TYPE_R5900_vis, RABBITIZER_OPERAND_TYPE_R5900_vit}) // Integer ADD
RABBITIZER_DEF_INSTR_ID(r5900, 0x31, visub, .operands={RABBITIZER_OPERAND_TYPE_R5900_vid, RABBITIZER_OPERAND_TYPE_R5900_vis, RABBITIZER_OPERAND_TYPE_R5900_vit}) // Integer SUBtract
RABBITIZER_DEF_INSTR_ID(r5900, 0x32, viaddi, .operands={RABBITIZER_OPERAND_TYPE_R5900_vit, RABBITIZER_OPERAND_TYPE_R5900_vis, RABBITIZER_OPERAND_TYPE_R5900_imm5}) // Integer ADD Immediate
RABBITIZER_DEF_INSTR_ID(r5900, 0x34, viand, .operands={RABBITIZER_OPERAND_TYPE_R5900_vid, RABBITIZER_OPERAND_TYPE_R5900_vis, RABBITIZER_OPERAND_TYPE_R5900_vit}) // Integer AND
RABBITIZER_DEF_INSTR_ID(r5900, 0x35, vior, .operands={RABBITIZER_OPERAND_TYPE_R5900_vid, RABBITIZER_OPERAND_TYPE_R5900_vis, RABBITIZER_OPERAND_TYPE_R5900_vit}) // Integer OR
// TODO: operands and properties
RABBITIZER_DEF_INSTR_ID(r5900, 0x38, vcallms, .operands={0})
RABBITIZER_DEF_INSTR_ID(r5900, 0x39, vcallmsr, .operands={RABBITIZER_OPERAND_TYPE_R5900_vis})

View File

@ -0,0 +1,125 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26-25-----21-20------------------11-10------6-5-2-1--0
| =COP2 | Special2 | | fhi |1111|flo|
------6----------5-----------------------------------------------
Note: opcode is flo | (fhi * 4).
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
0000 |VADDAx |VADDAy |VADDAz |VADDAw |VSUBAx |VSUBAy |VSUBAz |VSUBAw |
0001 |VMADDAx|VMADDAy|VMADDAz|VMADDAw|VMSUBAx|VMSUBAy|VMSUBAz|VMSUBAw|
0010 |VITOF0 |VITOF4 |VITOF12|VITOF15|VFTOI0 |VFTOI4 |VFTOI12|VFTOI15|
0011 |VMULAx |VMULAy |VMULAz |VMULAw |VMULAq |VABS |VMULAi |VCLIPw |
0100 |VADDAq |VMADDAq|VADDAi |VMADDAi|VSUBAq |VMSUBAq|VSUBAi |VMSUBAi|
0101 |VADDA |VMADDA |VMULA | --- |VSUBA |VMSUBA |VOPMULA|VNOP |
0110 |VMOVE |VMR32 | --- | --- |VLQI |VSQI |VLQD |VSQD |
0111 |VDIV |VSQRT |VRSQRT |VWAITQ |VMTIR |VMFIR |VILWR |VISWR |
1000 |VRNEXT |VRGET |VRINIT |VRXOR | --- | --- | --- | --- |
1001 | --- | --- | --- | --- | --- | --- | --- | --- |
1010 | --- | --- | --- | --- | --- | --- | --- | --- |
1011 | --- | --- | --- | --- | --- | --- | --- | --- |
1100 | --- | --- | --- | --- | --- | --- | --- | --- |
1101 | --- | --- | --- | --- | --- | --- | --- | --- |
1110 | --- | --- | --- | --- | --- | --- | --- | --- |
1111 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
// TODO: operands and properties
RABBITIZER_DEF_INSTR_ID(r5900, 0x00, vaddax, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x01, vadday, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x02, vaddaz, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x03, vaddaw, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x04, vsubax, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x05, vsubay, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x06, vsubaz, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x07, vsubaw, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x08, vmaddax, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) // Multiply and add accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x09, vmadday, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) // Multiply and add accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, vmaddaz, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) // Multiply and add accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x0B, vmaddaw, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) // Multiply and add accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x0C, vmsubax, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x0D, vmsubay, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x0E, vmsubaz, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x0F, vmsubaw, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast
RABBITIZER_DEF_INSTR_ID(r5900, 0x10, vitof0, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Integer to floating point
RABBITIZER_DEF_INSTR_ID(r5900, 0x11, vitof4, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Integer to floating point
RABBITIZER_DEF_INSTR_ID(r5900, 0x12, vitof12, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Integer to floating point
RABBITIZER_DEF_INSTR_ID(r5900, 0x13, vitof15, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Integer to floating point
RABBITIZER_DEF_INSTR_ID(r5900, 0x14, vftoi0, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Floating to integer
RABBITIZER_DEF_INSTR_ID(r5900, 0x15, vftoi4, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Floating to integer
RABBITIZER_DEF_INSTR_ID(r5900, 0x16, vftoi12, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Floating to integer
RABBITIZER_DEF_INSTR_ID(r5900, 0x17, vftoi15, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Floating to integer
RABBITIZER_DEF_INSTR_ID(r5900, 0x18, vmulax, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw)
RABBITIZER_DEF_INSTR_ID(r5900, 0x19, vmulay, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw)
RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, vmulaz, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw)
RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, vmulaw, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw)
// TODO
RABBITIZER_DEF_INSTR_ID(r5900, 0x1C, vmulaq, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw)
RABBITIZER_DEF_INSTR_ID(r5900, 0x1D, vabs, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Absolute
// TODO
RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, vmulai, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw)
RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, vclipw, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Clip
RABBITIZER_DEF_INSTR_ID(r5900, 0x20, vaddaq, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator Q
RABBITIZER_DEF_INSTR_ID(r5900, 0x21, vmaddaq, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and add accumulator Q
RABBITIZER_DEF_INSTR_ID(r5900, 0x22, vaddai, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator I
RABBITIZER_DEF_INSTR_ID(r5900, 0x23, vmaddai, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and add accumulator I
RABBITIZER_DEF_INSTR_ID(r5900, 0x24, vsubaq, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Subtract accumulator Q
RABBITIZER_DEF_INSTR_ID(r5900, 0x25, vmsubaq, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and Subtract accumulator Q
RABBITIZER_DEF_INSTR_ID(r5900, 0x26, vsubai, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Subtract accumulator I
RABBITIZER_DEF_INSTR_ID(r5900, 0x27, vmsubai, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and Subtract accumulator I
RABBITIZER_DEF_INSTR_ID(r5900, 0x28, vadda, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator
RABBITIZER_DEF_INSTR_ID(r5900, 0x29, vmadda, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and add accumulator
// TODO
RABBITIZER_DEF_INSTR_ID(r5900, 0x2A, vmula, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw)
RABBITIZER_DEF_INSTR_ID(r5900, 0x2C, vsuba, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true)
RABBITIZER_DEF_INSTR_ID(r5900, 0x2D, vmsuba, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator
RABBITIZER_DEF_INSTR_ID(r5900, 0x2E, vopmula, .operands={RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Outer product pre increment
RABBITIZER_DEF_INSTR_ID(r5900, 0x2F, vnop, .operands={0}) // No operation
RABBITIZER_DEF_INSTR_ID(r5900, 0x30, vmove, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Move floating point registers
RABBITIZER_DEF_INSTR_ID(r5900, 0x31, vmr32, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Move and rotate per word
RABBITIZER_DEF_INSTR_ID(r5900, 0x34, vlqi, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vis_postincr}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Load quadraword post increment
RABBITIZER_DEF_INSTR_ID(r5900, 0x35, vsqi, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vit_postincr}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Store quadraword post increment
RABBITIZER_DEF_INSTR_ID(r5900, 0x36, vlqd, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vis_predecr}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Load quadraword pre decrement
RABBITIZER_DEF_INSTR_ID(r5900, 0x37, vsqd, .operands={RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw, RABBITIZER_OPERAND_TYPE_R5900_vit_predecr}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Store quadraword pre decrement
RABBITIZER_DEF_INSTR_ID(r5900, 0x38, vdiv, .operands={RABBITIZER_OPERAND_TYPE_R5900_Q, RABBITIZER_OPERAND_TYPE_R5900_vfsl, RABBITIZER_OPERAND_TYPE_R5900_vftm})
RABBITIZER_DEF_INSTR_ID(r5900, 0x39, vsqrt, .operands={RABBITIZER_OPERAND_TYPE_R5900_Q, RABBITIZER_OPERAND_TYPE_R5900_vftm})
RABBITIZER_DEF_INSTR_ID(r5900, 0x3A, vrsqrt, .operands={RABBITIZER_OPERAND_TYPE_R5900_Q, RABBITIZER_OPERAND_TYPE_R5900_vfsl,RABBITIZER_OPERAND_TYPE_R5900_vftm})
RABBITIZER_DEF_INSTR_ID(r5900, 0x3B, vwaitq, .operands={0}) // Wait Q operation
RABBITIZER_DEF_INSTR_ID(r5900, 0x3C, vmtir, .operands={RABBITIZER_OPERAND_TYPE_R5900_vit, RABBITIZER_OPERAND_TYPE_R5900_vfsl})
RABBITIZER_DEF_INSTR_ID(r5900, 0x3D, vmfir, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_vis}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Move from integer register
RABBITIZER_DEF_INSTR_ID(r5900, 0x3E, vilwr, .operands={RABBITIZER_OPERAND_TYPE_R5900_vit, RABBITIZER_OPERAND_TYPE_R5900_vis}, .isFloat=true, .doesDereference=true, .doesLoad=true) // Integer load word register
RABBITIZER_DEF_INSTR_ID(r5900, 0x3F, viswr, .operands={RABBITIZER_OPERAND_TYPE_R5900_vit, RABBITIZER_OPERAND_TYPE_R5900_vis}, .isFloat=true, .doesDereference=true, .doesStore=true) // Integer store word register
/*
"vilwr.w", RABBITIZER_OPERAND_TYPE_R5900_vit,(RABBITIZER_OPERAND_TYPE_R5900_vis)
"vilwr.x", RABBITIZER_OPERAND_TYPE_R5900_vit,(RABBITIZER_OPERAND_TYPE_R5900_vis)
"vilwr.y", RABBITIZER_OPERAND_TYPE_R5900_vit,(RABBITIZER_OPERAND_TYPE_R5900_vis)
"vilwr.z", RABBITIZER_OPERAND_TYPE_R5900_vit,(RABBITIZER_OPERAND_TYPE_R5900_vis)
"viswr.w", RABBITIZER_OPERAND_TYPE_R5900_vit,(RABBITIZER_OPERAND_TYPE_R5900_vis)
"viswr.x", RABBITIZER_OPERAND_TYPE_R5900_vit,(RABBITIZER_OPERAND_TYPE_R5900_vis)
"viswr.y", RABBITIZER_OPERAND_TYPE_R5900_vit,(RABBITIZER_OPERAND_TYPE_R5900_vis)
"viswr.z", RABBITIZER_OPERAND_TYPE_R5900_vit,(RABBITIZER_OPERAND_TYPE_R5900_vis)
*/
RABBITIZER_DEF_INSTR_ID(r5900, 0x40, vrnext, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_R}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // R next
RABBITIZER_DEF_INSTR_ID(r5900, 0x41, vrget, .operands={RABBITIZER_OPERAND_TYPE_R5900_vftxyzw, RABBITIZER_OPERAND_TYPE_R5900_R}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // R move
// TODO
RABBITIZER_DEF_INSTR_ID(r5900, 0x42, vrinit, .operands={RABBITIZER_OPERAND_TYPE_R5900_R, RABBITIZER_OPERAND_TYPE_R5900_vfsl})
RABBITIZER_DEF_INSTR_ID(r5900, 0x43, vrxor, .operands={RABBITIZER_OPERAND_TYPE_R5900_R, RABBITIZER_OPERAND_TYPE_R5900_vfsl})

View File

@ -0,0 +1,49 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26------------------------------------------5--------0
| = MMI | | function|
------6----------------------------------------------------6-----
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
000 | MADD | MADDU | --- | --- | PLZCW | --- | --- | --- |
001 | *1 | *2 | --- | --- | --- | --- | --- | --- |
010 | MFHI1 | MTHI1 | MFLO1 | MTLO1 | --- | --- | --- | --- |
011 | MULT1 | MULTU1| DIV1 | DIVU1 | --- | --- | --- | --- |
100 | MADD1 | MADDU1| --- | --- | --- | --- | --- | --- |
101 | *3 | *4 | --- | --- | --- | --- | --- | --- |
110 | PMFHL | PMTHL | --- | --- | PSLLH | --- | PSRLH | PSRAH |
111 | --- | --- | --- | --- | PSLLW | --- | PSRLW | PSRAW |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*1 = MMI0 list *2 = MMI2 list
*3 = MMI1 list *4 = MMI3 list
*/
RABBITIZER_DEF_INSTR_ID(r5900, 0x00, madd, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Multiply-ADD word
RABBITIZER_DEF_INSTR_ID(r5900, 0x01, maddu, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Multiply-ADD Unsigned word
RABBITIZER_DEF_INSTR_ID(r5900, 0x04, plzcw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs}, .modifiesRd=true) // Parallel Leading Zero or one Count Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x10, mfhi1, .operands={RABBITIZER_OPERAND_TYPE_rd}, .modifiesRd=true) // Move From HI1 register
RABBITIZER_DEF_INSTR_ID(r5900, 0x11, mthi1, .operands={RABBITIZER_OPERAND_TYPE_rs}) // Move To HI1 register
RABBITIZER_DEF_INSTR_ID(r5900, 0x12, mflo1, .operands={RABBITIZER_OPERAND_TYPE_rd}) // Move From LO1 register
RABBITIZER_DEF_INSTR_ID(r5900, 0x13, mtlo1, .operands={RABBITIZER_OPERAND_TYPE_rs}) // Move To LO1 register
RABBITIZER_DEF_INSTR_ID(r5900, 0x18, mult1, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // MULTiply word pipeline 1
RABBITIZER_DEF_INSTR_ID(r5900, 0x19, multu1, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // MULTiply Unsigned word pipeline 1
RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, div1, .operands={RABBITIZER_OPERAND_TYPE_zero, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}) // DIVide word pipeline 1
RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, divu1, .operands={RABBITIZER_OPERAND_TYPE_zero, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}) // DIVide Unsigned word pipeline 1
RABBITIZER_DEF_INSTR_ID(r5900, 0x20, madd1, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Multiply-ADD word pipeline 1
RABBITIZER_DEF_INSTR_ID(r5900, 0x21, maddu1, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Multiply-ADD Unsigned word pipeline 1
// TODO: check this two instruction, it is supposed to have an extra .fmt
RABBITIZER_DEF_INSTR_ID(r5900, 0x30, pmfhl, .operands={RABBITIZER_OPERAND_TYPE_rd}, .modifiesRd=true) // Parallel Move From Hi/Lo register
RABBITIZER_DEF_INSTR_ID(r5900, 0x31, pmthl, .operands={RABBITIZER_OPERAND_TYPE_rs}) // Parallel Move To Hi/Lo register
RABBITIZER_DEF_INSTR_ID(r5900, 0x34, psllh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .modifiesRd=true) // Parallel Shift Left Logical Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x36, psrlh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .modifiesRd=true) // Parallel Shift Right Logical Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x37, psrah, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .modifiesRd=true) // Parallel Shift Right Arithmetic Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x3C, psllw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .modifiesRd=true) // Parallel Shift Left Logical Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x3E, psrlw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .modifiesRd=true) // Parallel Shift Right Logical Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x3F, psraw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_sa}, .modifiesRd=true) // Parallel Shift Right Arithmetic Word

View File

@ -0,0 +1,50 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26------------------------------10--------6-5--------0
| | |function | MMI0 |
------6----------------------------------------------------6-----
|---00--|---01--|---10--|---11--| lo
000 |PADDW | PSUBW | PCGTW | PMAXW |
001 |PADDH | PSUBH | PCGTH | PMAXH |
010 |PADDB | PSUBB | PCGTB | --- |
011 | --- | --- | --- | --- |
100 |PADDSW |PSUBSW |PEXTLW | PPACW |
101 |PADDSH |PSUBSH |PEXTLH | PPACH |
110 |PADDSB |PSUBSB |PEXTLB | PPACB |
111 | --- | --- | PEXT5 | PPAC5 |
hi |-------|-------|-------|-------|
*/
RABBITIZER_DEF_INSTR_ID(r5900, 0x00, paddw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel ADD Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x01, psubw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel SUBtract Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x02, pcgtw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Compare for Greater Than Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x03, pmaxw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel MAXimum Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x04, paddh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel ADD Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x05, psubh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel SUBtract Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x06, pcgth, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Compare for Greater Than Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x07, pmaxh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel MAXimum Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x08, paddb, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel ADD Byte
RABBITIZER_DEF_INSTR_ID(r5900, 0x09, psubb, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel SUBtract Byte
RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, pcgtb, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Compare for Greater Than Byte
RABBITIZER_DEF_INSTR_ID(r5900, 0x10, paddsw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel ADD with Signed saturation Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x11, psubsw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel SUBtract with Signed saturation Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x12, pextlw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel EXTend Lower from Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x13, ppacw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel PACk to Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x14, paddsh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel ADD with Signed saturation Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x15, psubsh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel SUBtract with Signed saturation Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x16, pextlh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel EXTend Lower from Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x17, ppach, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel PACk to Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x18, paddsb, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel ADD with Signed saturation Bytes
RABBITIZER_DEF_INSTR_ID(r5900, 0x19, psubsb, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel SUBtract with Signed saturation Bytes
RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, pextlb, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel EXTend Lower from Bytes
RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, ppacb, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel PACk to Bytes
RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, pext5, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel EXTend from 5-bits
RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, ppac5, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel PACk to 5-bits

View File

@ -0,0 +1,43 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26------------------------------------------5--------0
| | |function | MMI1 |
------6----------------------------------------------------6-----
|---00--|---01--|---10--|---11--| lo
000 | --- | PABSW | PCEQW | PMINW |
001 |PADSBH | PABSH | PCEQH | PMINH |
010 | --- | --- | PCEQB | --- |
011 | --- | --- | --- | --- |
100 |PADDUW |PSUBUW |PEXTUW | --- |
101 |PADDUH |PSUBUH |PEXTUH | --- |
110 |PADDUB |PSUBUB |PEXTUB | QFSRV |
111 | --- | --- | --- | --- |
hi |-------|-------|-------|-------|
*/
// TODO: operands and properties
RABBITIZER_DEF_INSTR_ID(r5900, 0x01, pabsw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel ABSolute Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x02, pceqw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Compare for EQual Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x03, pminw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel MINimum Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x04, padsbh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel ADd/SuBtract Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x05, pabsh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel ABSolute Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x06, pceqh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Compare for EQual Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x07, pminh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel MINimum Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, pceqb, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Compare for EQual Byte
RABBITIZER_DEF_INSTR_ID(r5900, 0x10, padduw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel ADD Unsigned saturation Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x11, psubuw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel SUBtract Unsigned saturation Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x12, pextuw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel EXTend Upper from Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x14, padduh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel ADD Unsigned saturation Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x15, psubuh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel SUBtract Unsigned saturation Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x16, pextuh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel EXTend Upper from Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x18, paddub, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel ADD Unsigned saturation Byte
RABBITIZER_DEF_INSTR_ID(r5900, 0x19, psubub, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel SUBtract Unsigned saturation Byte
RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, pextub, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel EXTend Upper from Byte
RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, qfsrv, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Quadword Funnel Shift Right Variable

View File

@ -0,0 +1,48 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26------------------------------------------5--------0
| | |function | MMI2 |
------6----------------------------------------------------6-----
|---00--|---01--|---10--|---11--| lo
000 |PMADDW | --- |PSLLVW |PSRLVW |
001 |PMSUBW | --- | --- | --- |
010 |PMFHI |PMFLO |PINTH | --- |
011 |PMULTW |PDIVW |PCPYLD | --- |
100 |PMADDH |PHMADH | PAND | PXOR |
101 |PMSUBH |PHMSBH | --- | --- |
110 | --- | --- | PEXEH | PREVH |
111 |PMULTH |PDIVBW | PEXEW |PROT3W |
hi |-------|-------|-------|-------|
*/
RABBITIZER_DEF_INSTR_ID(r5900, 0x00, pmaddw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Multiply-ADD Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x02, psllvw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .modifiesRd=true) // Parallel Shift Left Logical Variable Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x03, psrlvw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .modifiesRd=true) // Parallel Shift Right Logical Variable Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x04, pmsubw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Multiply-SUBtract Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x08, pmfhi, .operands={RABBITIZER_OPERAND_TYPE_rd}, .modifiesRd=true) // Parallel Move From HI register
RABBITIZER_DEF_INSTR_ID(r5900, 0x09, pmflo, .operands={RABBITIZER_OPERAND_TYPE_rd}, .modifiesRd=true) // Parallel Move From LO register
RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, pinth, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel INTerleave Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x0C, pmultw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel MULTiply Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x0D, pdivw, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}) // Parallel DIVide Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x0E, pcpyld, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel CoPY Lower Doubleword
RABBITIZER_DEF_INSTR_ID(r5900, 0x10, pmaddh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Multiply-ADD Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x11, phmadh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Horizontal Multiply-ADd Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x12, pand, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel AND
RABBITIZER_DEF_INSTR_ID(r5900, 0x13, pxor, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel eXclusive OR
RABBITIZER_DEF_INSTR_ID(r5900, 0x14, pmsubh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Multiply-SUBtract Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x15, phmsbh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Horizontal Multiply-Subtract Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, pexeh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel EXchange Even Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, prevh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel REVerse Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x1C, pmulth, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Multiply Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x1D, pdivbw, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel DIVide Broadcast Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, pexew, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel EXchange Even Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, prot3w, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel ROTate 3 Words left

View File

@ -0,0 +1,37 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26------------------------------------------5--------0
| | |function | MMI3 |
------6----------------------------------------------------6-----
|---00--|---01--|---10--|---11--| lo
000 |PMADDUW| --- | --- |PSRAVW |
001 | --- | --- | --- | --- |
010 |PMTHI | PMTLO |PINTEH | --- |
011 |PMULTUW| PDIVUW|PCPYUD | --- |
100 | --- | --- | POR | PNOR |
101 | --- | --- | --- | --- |
110 | --- | --- | PEXCH | PCPYH |
111 | --- | --- | PEXCW | --- |
hi |-------|-------|-------|-------|
*/
RABBITIZER_DEF_INSTR_ID(r5900, 0x00, pmadduw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Multiply-ADD Unsigned Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x03, psravw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_rs}, .modifiesRd=true) // Parallel Shift Right Arithmetic Variable Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x08, pmthi, .operands={RABBITIZER_OPERAND_TYPE_rs}) // Parallel Move To HI register
RABBITIZER_DEF_INSTR_ID(r5900, 0x09, pmtlo, .operands={RABBITIZER_OPERAND_TYPE_rs}) // Parallel Move To LO register
RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, pinteh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel INTerleave Even Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x0C, pmultuw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel MULTiply Unsigned Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x0D, pdivuw, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}) // Prallel DIVide Unsigned Word
RABBITIZER_DEF_INSTR_ID(r5900, 0x0E, pcpyud, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel CoPY Upper Doubleword
RABBITIZER_DEF_INSTR_ID(r5900, 0x12, por, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel OR
RABBITIZER_DEF_INSTR_ID(r5900, 0x13, pnor, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel Not OR
RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, pexch, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel EXchange Center Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, pcpyh, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel CoPY Halfword
RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, pexcw, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rt}, .modifiesRd=true) // Parallel EXchange Center Word

View File

@ -0,0 +1,31 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26---------------------------------------------------0
| opcode | |
------6----------------------------------------------------------
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
000 | *1 | *2 | J | JAL | BEQ | BNE | BLEZ | BGTZ |
001 | ADDI | ADDIU | SLTI | SLTIU | ANDI | ORI | XORI | LUI |
010 | *3 | *4 | *5 | --- | BEQL | BNEL | BLEZL | BGTZL |
011 | DADDI |DADDIU | LDL | LDR | *6 | --- | LQ | SQ |
100 | LB | LH | LWL | LW | LBU | LHU | LWR | LWU |
101 | SB | SH | SWL | SW | SDL | SDR | SWR | CACHE |
110 | --- | LWC1 | --- | PREF | --- | --- | LQC2 | LD |
111 | --- | SWC1 | --- | --- | --- | --- | SQC2 | SD |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*1 = SPECIAL, see SPECIAL list *2 = REGIMM, see REGIMM list
*3 = COP0 *4 = COP1
*5 = COP2 *6 = MMI table
*/
// The other instructions are implemented using the main CPU table
RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, lq, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true) // Load Quadword
RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, sq, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true) // Store Quadword
RABBITIZER_DEF_INSTR_ID(r5900, 0x36, lqc2, .operands={RABBITIZER_OPERAND_TYPE_R5900_vft, RABBITIZER_OPERAND_TYPE_IMM_base}, .canBeLo=true, .doesDereference=true, .doesLoad=true)
RABBITIZER_DEF_INSTR_ID(r5900, 0x3E, sqc2, .operands={RABBITIZER_OPERAND_TYPE_R5900_vft, RABBITIZER_OPERAND_TYPE_IMM_base}, .canBeLo=true, .doesDereference=true, .doesStore=true)

View File

@ -0,0 +1,20 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26----------20-------16------------------------------0
| = REGIMM | | rt | |
------6---------------------5------------------------------------
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
00 | BLTZ | BGEZ | BLTZL | BGEZL | --- | --- | --- | --- |
01 | TGEI | TGEIU | TLTI | TLTIU | TEQI | --- | TNEI | --- |
10 | BLTZAL| BGEZAL|BLTZALL|BGEZALL| --- | --- | --- | --- |
11 | MTSAB | MTSAH | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
// The other instructions are implemented using the main CPU table
// OP rs, IMM
RABBITIZER_DEF_INSTR_ID(r5900, 0x18, mtsab, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM)
RABBITIZER_DEF_INSTR_ID(r5900, 0x19, mtsah, .operands={RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM)

View File

@ -0,0 +1,27 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26------------------------------------------5--------0
| = SPECIAL | | function|
------6----------------------------------------------------6-----
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
000 | SLL | --- | SRL | SRA | SLLV | --- | SRLV | SRAV |
001 | JR | JALR | MOVZ | MOVN |SYSCALL| BREAK | --- | SYNC |
010 | MFHI | MTHI | MFLO | MTLO | DSLLV | --- | DSRLV | DSRAV |
011 | MULT | MULTU | DIV | DIVU | ---- | --- | ---- | ----- |
100 | ADD | ADDU | SUB | SUBU | AND | OR | XOR | NOR |
101 | MFSA | MTSA | SLT | SLTU | DADD | DADDU | DSUB | DSUBU |
110 | TGE | TGEU | TLT | TLTU | TEQ | --- | TNE | --- |
111 | DSLL | --- | DSRL | DSRA |DSLL32 | --- |DSRL32 |DSRA32 |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
// The other instructions are implemented using the main CPU table
RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, -0x0F, sync_p, sync.p, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Sync
RABBITIZER_DEF_INSTR_ID(r5900, 0x18, mult, .operands={RABBITIZER_OPERAND_TYPE_rd, RABBITIZER_OPERAND_TYPE_rs, RABBITIZER_OPERAND_TYPE_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // MULTtiply word
RABBITIZER_DEF_INSTR_ID(r5900, 0x28, mfsa, .operands={RABBITIZER_OPERAND_TYPE_rd}, .modifiesRd=true) // Move From Shift Amount register
RABBITIZER_DEF_INSTR_ID(r5900, 0x29, mtsa, .operands={RABBITIZER_OPERAND_TYPE_rs}) // Move To Shift Amount register

View File

@ -0,0 +1,6 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP rt, cop0d
RABBITIZER_DEF_INSTR_ID(rsp, 0x00, mfc0, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true, .notEmitedByCompilers=true) // Move word From CP0
RABBITIZER_DEF_INSTR_ID(rsp, 0x04, mtc0, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Move word to CP0

View File

@ -0,0 +1,10 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP cop2t, vd[index]
RABBITIZER_DEF_INSTR_ID(rsp, 0x00, mfc2, .operands={RABBITIZER_OPERAND_TYPE_RSP_cop2t, RABBITIZER_OPERAND_TYPE_RSP_vs_index}, .modifiesRt=true)
RABBITIZER_DEF_INSTR_ID(rsp, 0x04, mtc2, .operands={RABBITIZER_OPERAND_TYPE_RSP_cop2t, RABBITIZER_OPERAND_TYPE_RSP_vs_index})
// OP rt, cop2cd
RABBITIZER_DEF_INSTR_ID(rsp, 0x02, cfc2, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_RSP_cop2cd}, .modifiesRt=true)
RABBITIZER_DEF_INSTR_ID(rsp, 0x06, ctc2, .operands={RABBITIZER_OPERAND_TYPE_rt, RABBITIZER_OPERAND_TYPE_RSP_cop2cd})

View File

@ -0,0 +1,53 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP vd, vs, vt[elementhigh]
RABBITIZER_DEF_INSTR_ID(rsp, 0x00, vmulf, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x01, vmulu, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x02, vrndp, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x03, vmulq, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x04, vmudl, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x05, vmudm, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x06, vmudn, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x07, vmudh, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x08, vmacf, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x09, vmacu, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x0A, vrndn, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, vmacq, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x0C, vmadl, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x0D, vmadm, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x0E, vmadn, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x0F, vmadh, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x10, vadd, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x11, vsub, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x13, vabs, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x14, vaddc, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x15, vsubc, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x1D, vsar, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x28, vand, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x29, vnand, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x2A, vor, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x2B, vnor, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x2C, vxor, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x2D, vnxor, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x20, vlt, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x21, veq, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x22, vne, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x23, vge, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x24, vcl, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x25, vch, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x26, vcr, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x27, vmrg, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd, RABBITIZER_OPERAND_TYPE_RSP_vs, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
// OP vd[de], vt[elementhigh]
RABBITIZER_DEF_INSTR_ID(rsp, 0x30, vrcp, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd_de, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x31, vrcpl, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd_de, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh}) // operands may be wrong
RABBITIZER_DEF_INSTR_ID(rsp, 0x32, vrcph, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd_de, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x33, vmov, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd_de, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x34, vrsq, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd_de, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x35, vrsql, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd_de, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
RABBITIZER_DEF_INSTR_ID(rsp, 0x36, vrsqh, .operands={RABBITIZER_OPERAND_TYPE_RSP_vd_de, RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh})
// OP
RABBITIZER_DEF_INSTR_ID(rsp, 0x37, vnop, .operands={0})

View File

@ -0,0 +1,53 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP LABEL
RABBITIZER_DEF_INSTR_ID(rsp, 0x02, j, .operands={RABBITIZER_OPERAND_TYPE_LABEL}, .instrType=RABBITIZER_INSTR_TYPE_J, .isJump=true) // Jump
RABBITIZER_DEF_INSTR_ID(rsp, 0x03, jal, .operands={RABBITIZER_OPERAND_TYPE_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={RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on EQual
RABBITIZER_DEF_INSTR_ID(rsp, 0x05, bne, .operands={RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Not Equal
// OP rs, IMM
RABBITIZER_DEF_INSTR_ID(rsp, 0x06, blez, .operands={RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Less than or Equal to Zero
RABBITIZER_DEF_INSTR_ID(rsp, 0x07, bgtz, .operands={RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Greater Than Zero
// OP rt, rs, IMM
RABBITIZER_DEF_INSTR_ID(rsp, 0x08, addi, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .notEmitedByCompilers=true, .canBeLo=true) // Add Immediate
RABBITIZER_DEF_INSTR_ID(rsp, 0x09, addiu, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true) // Add Immediate Unsigned Word
RABBITIZER_DEF_INSTR_ID(rsp, 0x0A, slti, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true) // Set on Less Than Immediate
RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, sltiu, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true) // Set on Less Than Immediate Unsigned
RABBITIZER_DEF_INSTR_ID(rsp, 0x0C, andi, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true) // And Immediate
RABBITIZER_DEF_INSTR_ID(rsp, 0x0D, ori, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeLo=true) // Or Immediate
RABBITIZER_DEF_INSTR_ID(rsp, 0x0E, xori, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true) // eXclusive OR Immediate
// OP rt, IMM
RABBITIZER_DEF_INSTR_ID(rsp, 0x0F, lui, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeHi=true) // Load Upper Immediate
// OP rt, IMM(base)
RABBITIZER_DEF_INSTR_ID(rsp, 0x20, lb, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Byte
RABBITIZER_DEF_INSTR_ID(rsp, 0x21, lh, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Halfword
RABBITIZER_DEF_INSTR_ID(rsp, 0x23, lw, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word
RABBITIZER_DEF_INSTR_ID(rsp, 0x24, lbu, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Byte Insigned
RABBITIZER_DEF_INSTR_ID(rsp, 0x25, lhu, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Halfword Unsigned
RABBITIZER_DEF_INSTR_ID(rsp, 0x28, sb, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Byte
RABBITIZER_DEF_INSTR_ID(rsp, 0x29, sh, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Halfword
RABBITIZER_DEF_INSTR_ID(rsp, 0x2B, sw, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word
RABBITIZER_DEF_INSTR_ID(rsp, 0x33, pref, .operands={RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV) // Prefetch
RABBITIZER_DEF_INSTR_ID(rsp, 0x2F, cache, .operands={RABBITIZER_OPERAND_TYPE_op, RABBITIZER_OPERAND_TYPE_RSP_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .notEmitedByCompilers=true) // Cache
// OP ft, IMM(base)
RABBITIZER_DEF_INSTR_ID(rsp, 0x31, lwc1, .operands={RABBITIZER_OPERAND_TYPE_ft, RABBITIZER_OPERAND_TYPE_RSP_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word to Coprocessor z
RABBITIZER_DEF_INSTR_ID(rsp, 0x39, swc1, .operands={RABBITIZER_OPERAND_TYPE_ft, RABBITIZER_OPERAND_TYPE_RSP_IMM_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word from Coprocessor z
// Pseudo-Instruction Unique IDs
// OP IMM
RABBITIZER_DEF_INSTR_ID(rsp, -0x03, b, .operands={RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch (unconditional)
// OP rs, IMM
RABBITIZER_DEF_INSTR_ID(rsp, -0x04, beqz, .operands={RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on EQual Zero
RABBITIZER_DEF_INSTR_ID(rsp, -0x05, bnez, .operands={RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Not Equal Zero

View File

@ -0,0 +1,15 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP vt[elementlow], offset(vs)
RABBITIZER_DEF_INSTR_ID(rsp, 0x00, lbv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x01, lsv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x02, llv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x03, ldv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x04, lqv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x05, lrv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x06, lpv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x07, luv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x08, lhv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x09, lfv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, ltv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})

View File

@ -0,0 +1,17 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP vt[elementlow], offset(vs)
RABBITIZER_DEF_INSTR_ID(rsp, 0x00, sbv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x01, ssv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x02, slv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x03, sdv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x04, sqv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x05, srv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x06, spv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x07, suv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x08, shv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x09, sfv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, stv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})
RABBITIZER_DEF_INSTR_ID(rsp, -0x07, swv, .operands={RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow, RABBITIZER_OPERAND_TYPE_RSP_offset_rs})

View File

@ -0,0 +1,9 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP rs, IMM
RABBITIZER_DEF_INSTR_ID(rsp, 0x00, bltz, .operands={RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Less Than Zero
RABBITIZER_DEF_INSTR_ID(rsp, 0x01, bgez, .operands={RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Greater than or Equal to Zero
RABBITIZER_DEF_INSTR_ID(rsp, 0x10, bltzal, .operands={RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true) // Branch on Less Than Zero and Link
RABBITIZER_DEF_INSTR_ID(rsp, 0x11, bgezal, .operands={RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_IMM}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true) // Branch on Greater Than or Equal to Zero and Link

View File

@ -0,0 +1,49 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
// OP rd, rt, sa
RABBITIZER_DEF_INSTR_ID(rsp, 0x00, sll, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Left Logical
RABBITIZER_DEF_INSTR_ID(rsp, 0x02, srl, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Right Logical
RABBITIZER_DEF_INSTR_ID(rsp, 0x03, sra, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Right Arithmetic
// OP rd, rt, rs
RABBITIZER_DEF_INSTR_ID(rsp, 0x04, sllv, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Left Logical Variable
RABBITIZER_DEF_INSTR_ID(rsp, 0x06, srlv, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Right Logical Variable
RABBITIZER_DEF_INSTR_ID(rsp, 0x07, srav, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rt, RABBITIZER_OPERAND_TYPE_RSP_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Right Arithmetic Variable
// OP rs
RABBITIZER_DEF_INSTR_ID(rsp, 0x08, jr, .operands={RABBITIZER_OPERAND_TYPE_RSP_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true) // Jump Register
RABBITIZER_DEF_INSTR_ID(rsp, 0x09, jalr, .operands={RABBITIZER_OPERAND_TYPE_RSP_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true) // Jump And Link Register
// OP rd, rs
RABBITIZER_DEF_INSTR_ID_ALTNAME(rsp, -0x09, jalr_rd, jalr, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true) // Jump And Link Register // Special case for rd != 31
// OP rd, rs, rt
RABBITIZER_DEF_INSTR_ID(rsp, 0x0A, movz, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_RSP_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // MOVe conditional on Zero
RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, movn, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_RSP_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // MOVe conditional on Not zero
RABBITIZER_DEF_INSTR_ID(rsp, 0x20, add, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_RSP_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .notEmitedByCompilers=true) // ADD word
RABBITIZER_DEF_INSTR_ID(rsp, 0x21, addu, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_RSP_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // ADD Unsigned word
RABBITIZER_DEF_INSTR_ID(rsp, 0x22, sub, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_RSP_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Subtract word
RABBITIZER_DEF_INSTR_ID(rsp, 0x23, subu, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_RSP_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // SUBtract Unsigned word
RABBITIZER_DEF_INSTR_ID(rsp, 0x24, and, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_RSP_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // AND
RABBITIZER_DEF_INSTR_ID(rsp, 0x25, or, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_RSP_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // OR
RABBITIZER_DEF_INSTR_ID(rsp, 0x26, xor, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_RSP_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // eXclusive OR
RABBITIZER_DEF_INSTR_ID(rsp, 0x27, nor, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_RSP_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Not OR
RABBITIZER_DEF_INSTR_ID(rsp, 0x2A, slt, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_RSP_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Set on Less Than
RABBITIZER_DEF_INSTR_ID(rsp, 0x2B, sltu, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs, RABBITIZER_OPERAND_TYPE_RSP_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Set on Less Than Unsigned
// OP code
RABBITIZER_DEF_INSTR_ID(rsp, 0x0D, break, .operands={RABBITIZER_OPERAND_TYPE_code}, .instrType=RABBITIZER_INSTR_TYPE_R) // Break
// Pseudo-Instruction Unique IDs
// OP
RABBITIZER_DEF_INSTR_ID(rsp, -0x01, nop, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R) // No OPeration
// OP rd, rs
RABBITIZER_DEF_INSTR_ID(rsp, -0x25, move, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Move
RABBITIZER_DEF_INSTR_ID(rsp, -0x27, not, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Not
// OP rd, rt
RABBITIZER_DEF_INSTR_ID(rsp, -0x23, negu, .operands={RABBITIZER_OPERAND_TYPE_RSP_rd, RABBITIZER_OPERAND_TYPE_RSP_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true)

View File

@ -0,0 +1,35 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
RABBITIZER_DEF_REG(R5900_VF, vf0, 0),
RABBITIZER_DEF_REG(R5900_VF, vf1, 1),
RABBITIZER_DEF_REG(R5900_VF, vf2, 2),
RABBITIZER_DEF_REG(R5900_VF, vf3, 3),
RABBITIZER_DEF_REG(R5900_VF, vf4, 4),
RABBITIZER_DEF_REG(R5900_VF, vf5, 5),
RABBITIZER_DEF_REG(R5900_VF, vf6, 6),
RABBITIZER_DEF_REG(R5900_VF, vf7, 7),
RABBITIZER_DEF_REG(R5900_VF, vf8, 8),
RABBITIZER_DEF_REG(R5900_VF, vf9, 9),
RABBITIZER_DEF_REG(R5900_VF, vf10, 10),
RABBITIZER_DEF_REG(R5900_VF, vf11, 11),
RABBITIZER_DEF_REG(R5900_VF, vf12, 12),
RABBITIZER_DEF_REG(R5900_VF, vf13, 13),
RABBITIZER_DEF_REG(R5900_VF, vf14, 14),
RABBITIZER_DEF_REG(R5900_VF, vf15, 15),
RABBITIZER_DEF_REG(R5900_VF, vf16, 16),
RABBITIZER_DEF_REG(R5900_VF, vf17, 17),
RABBITIZER_DEF_REG(R5900_VF, vf18, 18),
RABBITIZER_DEF_REG(R5900_VF, vf19, 19),
RABBITIZER_DEF_REG(R5900_VF, vf20, 20),
RABBITIZER_DEF_REG(R5900_VF, vf21, 21),
RABBITIZER_DEF_REG(R5900_VF, vf22, 22),
RABBITIZER_DEF_REG(R5900_VF, vf23, 23),
RABBITIZER_DEF_REG(R5900_VF, vf24, 24),
RABBITIZER_DEF_REG(R5900_VF, vf25, 25),
RABBITIZER_DEF_REG(R5900_VF, vf26, 26),
RABBITIZER_DEF_REG(R5900_VF, vf27, 27),
RABBITIZER_DEF_REG(R5900_VF, vf28, 28),
RABBITIZER_DEF_REG(R5900_VF, vf29, 29),
RABBITIZER_DEF_REG(R5900_VF, vf30, 30),
RABBITIZER_DEF_REG(R5900_VF, vf31, 31),

View File

@ -0,0 +1,35 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
RABBITIZER_DEF_REG(R5900_VI, vi0, 0),
RABBITIZER_DEF_REG(R5900_VI, vi1, 1),
RABBITIZER_DEF_REG(R5900_VI, vi2, 2),
RABBITIZER_DEF_REG(R5900_VI, vi3, 3),
RABBITIZER_DEF_REG(R5900_VI, vi4, 4),
RABBITIZER_DEF_REG(R5900_VI, vi5, 5),
RABBITIZER_DEF_REG(R5900_VI, vi6, 6),
RABBITIZER_DEF_REG(R5900_VI, vi7, 7),
RABBITIZER_DEF_REG(R5900_VI, vi8, 8),
RABBITIZER_DEF_REG(R5900_VI, vi9, 9),
RABBITIZER_DEF_REG(R5900_VI, vi10, 10),
RABBITIZER_DEF_REG(R5900_VI, vi11, 11),
RABBITIZER_DEF_REG(R5900_VI, vi12, 12),
RABBITIZER_DEF_REG(R5900_VI, vi13, 13),
RABBITIZER_DEF_REG(R5900_VI, vi14, 14),
RABBITIZER_DEF_REG(R5900_VI, vi15, 15),
RABBITIZER_DEF_REG(R5900_VI, vi16, 16),
RABBITIZER_DEF_REG(R5900_VI, vi17, 17),
RABBITIZER_DEF_REG(R5900_VI, vi18, 18),
RABBITIZER_DEF_REG(R5900_VI, vi19, 19),
RABBITIZER_DEF_REG(R5900_VI, vi20, 20),
RABBITIZER_DEF_REG(R5900_VI, vi21, 21),
RABBITIZER_DEF_REG(R5900_VI, vi22, 22),
RABBITIZER_DEF_REG(R5900_VI, vi23, 23),
RABBITIZER_DEF_REG(R5900_VI, vi24, 24),
RABBITIZER_DEF_REG(R5900_VI, vi25, 25),
RABBITIZER_DEF_REG(R5900_VI, vi26, 26),
RABBITIZER_DEF_REG(R5900_VI, vi27, 27),
RABBITIZER_DEF_REG(R5900_VI, vi28, 28),
RABBITIZER_DEF_REG(R5900_VI, vi29, 29),
RABBITIZER_DEF_REG(R5900_VI, vi30, 30),
RABBITIZER_DEF_REG(R5900_VI, vi31, 31),

View File

@ -0,0 +1,35 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
RABBITIZER_DEF_REG(RSP_COP2, 0, 0),
RABBITIZER_DEF_REG(RSP_COP2, 1, 1),
RABBITIZER_DEF_REG(RSP_COP2, 2, 2),
RABBITIZER_DEF_REG(RSP_COP2, 3, 3),
RABBITIZER_DEF_REG(RSP_COP2, 4, 4),
RABBITIZER_DEF_REG(RSP_COP2, 5, 5),
RABBITIZER_DEF_REG(RSP_COP2, 6, 6),
RABBITIZER_DEF_REG(RSP_COP2, 7, 7),
RABBITIZER_DEF_REG(RSP_COP2, 8, 8),
RABBITIZER_DEF_REG(RSP_COP2, 9, 9),
RABBITIZER_DEF_REG(RSP_COP2, 10, 10),
RABBITIZER_DEF_REG(RSP_COP2, 11, 11),
RABBITIZER_DEF_REG(RSP_COP2, 12, 12),
RABBITIZER_DEF_REG(RSP_COP2, 13, 13),
RABBITIZER_DEF_REG(RSP_COP2, 14, 14),
RABBITIZER_DEF_REG(RSP_COP2, 15, 15),
RABBITIZER_DEF_REG(RSP_COP2, 16, 16),
RABBITIZER_DEF_REG(RSP_COP2, 17, 17),
RABBITIZER_DEF_REG(RSP_COP2, 18, 18),
RABBITIZER_DEF_REG(RSP_COP2, 19, 19),
RABBITIZER_DEF_REG(RSP_COP2, 20, 20),
RABBITIZER_DEF_REG(RSP_COP2, 21, 21),
RABBITIZER_DEF_REG(RSP_COP2, 22, 22),
RABBITIZER_DEF_REG(RSP_COP2, 23, 23),
RABBITIZER_DEF_REG(RSP_COP2, 24, 24),
RABBITIZER_DEF_REG(RSP_COP2, 25, 25),
RABBITIZER_DEF_REG(RSP_COP2, 26, 26),
RABBITIZER_DEF_REG(RSP_COP2, 27, 27),
RABBITIZER_DEF_REG(RSP_COP2, 28, 28),
RABBITIZER_DEF_REG(RSP_COP2, 29, 29),
RABBITIZER_DEF_REG(RSP_COP2, 30, 30),
RABBITIZER_DEF_REG(RSP_COP2, 31, 31),

View File

@ -0,0 +1,35 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 0, 0),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 1, 1),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 2, 2),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 3, 3),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 4, 4),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 5, 5),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 6, 6),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 7, 7),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 8, 8),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 9, 9),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 10, 10),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 11, 11),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 12, 12),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 13, 13),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 14, 14),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 15, 15),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 16, 16),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 17, 17),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 18, 18),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 19, 19),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 20, 20),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 21, 21),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 22, 22),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 23, 23),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 24, 24),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 25, 25),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 26, 26),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 27, 27),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 28, 28),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 29, 29),
RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 30, 30),
RABBITIZER_DEF_REG(COP1_CONTROL, 31, 31),

View File

@ -32,4 +32,4 @@
RABBITIZER_DEF_REG(RSP_GPR, 28, 28),
RABBITIZER_DEF_REG(RSP_GPR, 29, 29),
RABBITIZER_DEF_REG(RSP_GPR, 30, 30),
RABBITIZER_DEF_REG(RSP_GPR, 31, 31),
RABBITIZER_DEF_REG(RSP_GPR, ra, 31),

47
r5900test.c Normal file
View File

@ -0,0 +1,47 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
#include "instructions/RabbitizerInstructionR5900.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
uint32_t word;
RabbitizerInstruction instr;
char *buffer;
int extraLJust = 5;
#if 1
uint32_t validbits;
#endif
word = 0x4BE1634B;
RabbitizerInstructionR5900_init(&instr, word, 0x00100000);
RabbitizerInstructionR5900_processUniqueId(&instr);
buffer = malloc(RabbitizerInstruction_getSizeForBuffer(&instr, 0, extraLJust) + 1);
assert(buffer != NULL);
RabbitizerInstruction_disassemble(&instr, buffer, NULL, 0, extraLJust);
printf("%08X: %s\n", word, buffer);
#if 1
validbits = RabbitizerInstruction_getValidBits(&instr);
printf("word: %08X\n", instr.word);
printf("mandatory bits: %08X\n", instr._mandatorybits);
printf("valid bits: %08X\n", validbits);
printf("invalid bits: %08X\n", (~validbits) & instr.word);
#endif
free(buffer);
RabbitizerInstructionR5900_destroy(&instr);
return 0;
}

View File

@ -11,5 +11,5 @@ from .Enum import Enum
class InstrCategory:
CPU: Enum
RSP: Enum
# PS2: Enum
R5900: Enum
MAX: Enum

View File

@ -375,4 +375,255 @@ class InstrId:
rsp_negu: Enum
rsp_MAX: Enum
r5900_INVALID: Enum
r5900_lq: Enum
r5900_sq: Enum
r5900_lqc2: Enum
r5900_sqc2: Enum
r5900_sync_p: Enum
r5900_mfsa: Enum
r5900_mtsa: Enum
r5900_mtsab: Enum
r5900_mtsah: Enum
r5900_madd: Enum
r5900_maddu: Enum
r5900_plzcw: Enum
r5900_mfhi1: Enum
r5900_mthi1: Enum
r5900_mflo1: Enum
r5900_mtlo1: Enum
r5900_mult1: Enum
r5900_multu1: Enum
r5900_div1: Enum
r5900_divu1: Enum
r5900_madd1: Enum
r5900_maddu1: Enum
r5900_pmfhl: Enum
r5900_pmthl: Enum
r5900_psllh: Enum
r5900_psrlh: Enum
r5900_psrah: Enum
r5900_psllw: Enum
r5900_psrlw: Enum
r5900_psraw: Enum
r5900_paddw: Enum
r5900_psubw: Enum
r5900_pcgtw: Enum
r5900_pmaxw: Enum
r5900_paddh: Enum
r5900_psubh: Enum
r5900_pcgth: Enum
r5900_pmaxh: Enum
r5900_paddb: Enum
r5900_psubb: Enum
r5900_pcgtb: Enum
r5900_paddsw: Enum
r5900_psubsw: Enum
r5900_pextlw: Enum
r5900_ppacw: Enum
r5900_paddsh: Enum
r5900_psubsh: Enum
r5900_pextlh: Enum
r5900_ppach: Enum
r5900_paddsb: Enum
r5900_psubsb: Enum
r5900_pextlb: Enum
r5900_ppacb: Enum
r5900_pext5: Enum
r5900_ppac5: Enum
r5900_pabsw: Enum
r5900_pceqw: Enum
r5900_pminw: Enum
r5900_padsbh: Enum
r5900_pabsh: Enum
r5900_pceqh: Enum
r5900_pminh: Enum
r5900_pceqb: Enum
r5900_padduw: Enum
r5900_psubuw: Enum
r5900_pextuw: Enum
r5900_padduh: Enum
r5900_psubuh: Enum
r5900_pextuh: Enum
r5900_paddub: Enum
r5900_psubub: Enum
r5900_pextub: Enum
r5900_qfsrv: Enum
r5900_pmaddw: Enum
r5900_psllvw: Enum
r5900_psrlvw: Enum
r5900_pmsubw: Enum
r5900_pmfhi: Enum
r5900_pmflo: Enum
r5900_pinth: Enum
r5900_pmultw: Enum
r5900_pdivw: Enum
r5900_pcpyld: Enum
r5900_pmaddh: Enum
r5900_phmadh: Enum
r5900_pand: Enum
r5900_pxor: Enum
r5900_pmsubh: Enum
r5900_phmsbh: Enum
r5900_pexeh: Enum
r5900_prevh: Enum
r5900_pmulth: Enum
r5900_pdivbw: Enum
r5900_pexew: Enum
r5900_prot3w: Enum
r5900_pmadduw: Enum
r5900_psravw: Enum
r5900_pmthi: Enum
r5900_pmtlo: Enum
r5900_pinteh: Enum
r5900_pmultuw: Enum
r5900_pdivuw: Enum
r5900_pcpyud: Enum
r5900_por: Enum
r5900_pnor: Enum
r5900_pexch: Enum
r5900_pcpyh: Enum
r5900_pexcw: Enum
r5900_ei: Enum
r5900_di: Enum
r5900_rsqrt_s: Enum
r5900_adda_s: Enum
r5900_suba_s: Enum
r5900_mula_s: Enum
r5900_madd_s: Enum
r5900_msub_s: Enum
r5900_madda_s: Enum
r5900_msuba_s: Enum
r5900_max_s: Enum
r5900_min_s: Enum
r5900_qmfc2: Enum
r5900_cfc2: Enum
r5900_qmtc2: Enum
r5900_ctc2: Enum
r5900_bc2f: Enum
r5900_bc2t: Enum
r5900_bc2fl: Enum
r5900_bc2tl: Enum
r5900_vaddx: Enum
r5900_vaddy: Enum
r5900_vaddz: Enum
r5900_vaddw: Enum
r5900_vsubx: Enum
r5900_vsuby: Enum
r5900_vsubz: Enum
r5900_vsubw: Enum
r5900_vmaddx: Enum
r5900_vmaddy: Enum
r5900_vmaddz: Enum
r5900_vmaddw: Enum
r5900_vmsubx: Enum
r5900_vmsuby: Enum
r5900_vmsubz: Enum
r5900_vmsubw: Enum
r5900_vmaxx: Enum
r5900_vmaxy: Enum
r5900_vmaxz: Enum
r5900_vmaxw: Enum
r5900_vminix: Enum
r5900_vminiy: Enum
r5900_vminiz: Enum
r5900_vminiw: Enum
r5900_vmulx: Enum
r5900_vmuly: Enum
r5900_vmulz: Enum
r5900_vmulw: Enum
r5900_vmulq: Enum
r5900_vmaxi: Enum
r5900_vmuli: Enum
r5900_vminii: Enum
r5900_vaddq: Enum
r5900_vmaddq: Enum
r5900_vaddi: Enum
r5900_vmaddi: Enum
r5900_vsubq: Enum
r5900_vmsubq: Enum
r5900_vsubi: Enum
r5900_vmsubi: Enum
r5900_vadd: Enum
r5900_vmadd: Enum
r5900_vmul: Enum
r5900_vmax: Enum
r5900_vsub: Enum
r5900_vmsub: Enum
r5900_vopmsub: Enum
r5900_vmini: Enum
r5900_viadd: Enum
r5900_visub: Enum
r5900_viaddi: Enum
r5900_viand: Enum
r5900_vior: Enum
r5900_vcallms: Enum
r5900_callmsr: Enum
r5900_vaddax: Enum
r5900_vadday: Enum
r5900_vaddaz: Enum
r5900_vaddaw: Enum
r5900_vsubax: Enum
r5900_vsubay: Enum
r5900_vsubaz: Enum
r5900_vsubaw: Enum
r5900_vvmaddx: Enum
r5900_vvmaddy: Enum
r5900_vvmaddz: Enum
r5900_vvmaddw: Enum
r5900_vmsubax: Enum
r5900_vmsubay: Enum
r5900_vmsubaz: Enum
r5900_vmsubaw: Enum
r5900_vitof0: Enum
r5900_vitof4: Enum
r5900_vitof12: Enum
r5900_vitof15: Enum
r5900_vftoi0: Enum
r5900_vftoi4: Enum
r5900_vftoi12: Enum
r5900_vftoi15: Enum
r5900_vmulax: Enum
r5900_vmulay: Enum
r5900_vmulaz: Enum
r5900_vmulaw: Enum
r5900_vmulaq: Enum
r5900_vabs: Enum
r5900_vmulai: Enum
r5900_vclipw: Enum
r5900_vaddaq: Enum
r5900_vmaddaq: Enum
r5900_vaddai: Enum
r5900_vmaddai: Enum
r5900_vsubaq: Enum
r5900_vmsubaq: Enum
r5900_vsubai: Enum
r5900_vmsubai: Enum
r5900_vadda: Enum
r5900_vmadda: Enum
r5900_vmula: Enum
r5900_vsuba: Enum
r5900_vmsuba: Enum
r5900_vopmula: Enum
r5900_vnop: Enum
r5900_vmove: Enum
r5900_vmr32: Enum
r5900_vlqi: Enum
r5900_vsqi: Enum
r5900_vlqd: Enum
r5900_vsqd: Enum
r5900_vdiv: Enum
r5900_vsqrt: Enum
r5900_vrsqrt: Enum
r5900_vwaitq: Enum
r5900_vmtir: Enum
r5900_vmfir: Enum
r5900_vilwr: Enum
r5900_viswr: Enum
r5900_vrnext: Enum
r5900_vrget: Enum
r5900_vrinit: Enum
r5900_vrxor: Enum
r5900_MAX: Enum
ALL_MAX: Enum

View File

@ -5,17 +5,17 @@
#include "instructions/RabbitizerInstrId.h"
#define RABBITIZER_DEF_INSTR_ID(prefix, name, ...) { "InstrId", #prefix "_" #name, RABBITIZER_INSTR_ID_##prefix##_##name, false, NULL }
#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, name, altname, ...) { "InstrId", #prefix "_" #name, RABBITIZER_INSTR_ID_##prefix##_##name, false, NULL }
#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) { "InstrId", #prefix "_" #name, RABBITIZER_INSTR_ID_##prefix##_##name, false, NULL },
#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__)
RabbitizerEnumMetadata rabbitizer_enum_InstrId_enumvalues[] = {
#include "instructions/instr_id/RabbitizerInstrId_cpu.inc"
RABBITIZER_DEF_INSTR_ID(cpu, MAX, ),
#include "instructions/instr_id/RabbitizerInstrId_rsp.inc"
RABBITIZER_DEF_INSTR_ID(rsp, MAX, ),
RABBITIZER_DEF_INSTR_ID(ALL, MAX, ),
#include "instructions/instr_id/RabbitizerInstrId_r5900.inc"
RABBITIZER_DEF_INSTR_ID(ALL, , MAX, )
{ 0 },
};

View File

@ -11,14 +11,34 @@ from .InstrCategory import InstrCategory
class Instruction:
rs: Enum
"""The value of the `rs` register for this instruction.
The type of this attribute will be either a `RegGprO32` or a `RegGprN32` depending on the current `config.regNames_gprAbiNames` value.
If the current instruction does not use the `rs` register, then a Runtime exception will be raised.
Read-only."""
rt: Enum
"""The value of the `rt` register for this instruction.
The type of this attribute will be either a `RegGprO32` or a `RegGprN32` depending on the current `config.regNames_gprAbiNames` value.
If the current instruction does not use the `rt` register, then a Runtime exception will be raised.
Read-only."""
rd: Enum
"""The value of the `rd` register for this instruction.
The type of this attribute will be either a `RegGprO32` or a `RegGprN32` depending on the current `config.regNames_gprAbiNames` value.
If the current instruction does not use the `rd` register, then a Runtime exception will be raised.
Read-only."""
sa: int
"""The value of the `sa` field for this instruction.
If the current instruction does not have a `sa` field, then a Runtime exception will be raised.
Read-only."""
uniqueId: Enum
"""An unique identificator for the opcode of this instruction.
The type is an `InstrId` enum.
Read-only."""
vram: int = 0
"""The vram (virtual ram) address for this instruction"""
inHandwrittenFunction: bool = False
"""Boolean value indicating if the current instruction is used on a handwritten function. This is intended to be determined by the user."""
def __init__(self, word: int, vram: int=0, category: Enum=InstrCategory.CPU) -> None: ...

View File

@ -4,6 +4,7 @@
#include "rabbitizer_module.h"
#include "instructions/RabbitizerInstructionRsp.h"
#include "instructions/RabbitizerInstructionR5900.h"
#include "common/RabbitizerConfig.h"
@ -43,6 +44,11 @@ static int rabbitizer_type_Instruction_init(PyRabbitizerInstruction *self, PyObj
RabbitizerInstructionRsp_processUniqueId(&self->instr);
break;
case RABBITIZER_INSTRCAT_R5900:
RabbitizerInstructionR5900_init(&self->instr, word, vram);
RabbitizerInstructionR5900_processUniqueId(&self->instr);
break;
case RABBITIZER_INSTRCAT_CPU:
case RABBITIZER_INSTRCAT_MAX:
RabbitizerInstruction_init(&self->instr, word, vram);

44
rsptest.c Normal file
View File

@ -0,0 +1,44 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
#include "instructions/RabbitizerInstructionRsp.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
uint32_t word;
RabbitizerInstruction instr;
char *buffer;
int extraLJust = 5;
uint32_t validbits;
//word = 0x4B01C8E8; // vand $v3, $v25, $v1[0]
word = 0x48952000; // mtc2 $21, $v4[0]
RabbitizerInstructionRsp_init(&instr, word, 0x80000000);
RabbitizerInstructionRsp_processUniqueId(&instr);
buffer = malloc(RabbitizerInstruction_getSizeForBuffer(&instr, 0, extraLJust) + 1);
assert(buffer != NULL);
RabbitizerInstruction_disassemble(&instr, buffer, NULL, 0, extraLJust);
printf("%08X: %s\n", word, buffer);
validbits = RabbitizerInstruction_getValidBits(&instr);
printf("word: %08X\n", instr.word);
printf("mandatory bits: %08X\n", instr._mandatorybits);
printf("valid bits: %08X\n", validbits);
printf("invalid bits: %08X\n", (~validbits) & instr.word);
free(buffer);
RabbitizerInstructionRsp_destroy(&instr);
return 0;
}

View File

@ -3,7 +3,7 @@
[metadata]
name = rabbitizer
version = 1.0.1
version = 1.1.0
author = Decompollaborate
license = MIT
description = MIPS instruction decoder

View File

@ -13,7 +13,8 @@ setup(
"rabbitizer/enums/registers/rabbitizer_enum_GprO32.c", "rabbitizer/enums/registers/rabbitizer_enum_GprN32.c",
"src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c", "src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c", "src/instructions/RabbitizerInstruction/RabbitizerInstruction.c", "src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c",
"src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp.c", "src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c",
"src/instructions/RabbitizerInstrDescriptor.c", "src/instructions/RabbitizerInstrId.c", "src/instructions/RabbitizerRegister.c",
"src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900.c", "src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_ProcessUniqueId.c",
"src/instructions/RabbitizerInstrDescriptor.c", "src/instructions/RabbitizerInstrId.c", "src/instructions/RabbitizerRegister.c", "src/instructions/RabbitizerInstrSuffix.c",
"src/analysis/RabbitizerTrackedRegisterState.c", "src/analysis/RabbitizerRegistersTracker.c",
"src/common/Utils.c", "src/common/RabbitizerConfig.c"],
include_dirs=["include", "rabbitizer"],

View File

@ -5,13 +5,14 @@
#include "instructions/RabbitizerInstruction.h"
#define RABBITIZER_DEF_INSTR_ID(prefix, name, ...) [RABBITIZER_INSTR_ID_##prefix##_##name] = { __VA_ARGS__ }
#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) [RABBITIZER_INSTR_ID_##prefix##_##name] = { __VA_ARGS__ },
#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, name, altname, ...) [RABBITIZER_INSTR_ID_##prefix##_##name] = { __VA_ARGS__ }
#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__)
const RabbitizerInstrDescriptor RabbitizerInstrDescriptor_Descriptors[] = {
#include "instructions/instr_id/RabbitizerInstrId_cpu.inc"
#include "instructions/instr_id/RabbitizerInstrId_rsp.inc"
#include "instructions/instr_id/RabbitizerInstrId_r5900.inc"
};
#undef RABBITIZER_DEF_INSTR_ID
@ -33,6 +34,10 @@ bool RabbitizerInstrDescriptor_isRegimmType(const RabbitizerInstrDescriptor *sel
return self->instrType == RABBITIZER_INSTR_TYPE_REGIMM;
}
RabbitizerInstrSuffix RabbitizerInstrDescriptor_instrSuffix(const RabbitizerInstrDescriptor *self) {
return self->instrSuffix;
}
bool RabbitizerInstrDescriptor_isBranch(const RabbitizerInstrDescriptor *self) {
return self->isBranch;
}

View File

@ -5,13 +5,14 @@
#include <assert.h>
#define RABBITIZER_DEF_INSTR_ID(prefix, name, ...) [RABBITIZER_INSTR_ID_##prefix##_##name] = #name
#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) [RABBITIZER_INSTR_ID_##prefix##_##name] = #name,
#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, name, altname, ...) [RABBITIZER_INSTR_ID_##prefix##_##name] = #altname
#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) [RABBITIZER_INSTR_ID_##prefix##_##name] = #altname,
const char *RabbitizerInstrId_Names[] = {
#include "instructions/instr_id/RabbitizerInstrId_cpu.inc"
#include "instructions/instr_id/RabbitizerInstrId_rsp.inc"
#include "instructions/instr_id/RabbitizerInstrId_r5900.inc"
};
#undef RABBITIZER_DEF_INSTR_ID
@ -21,6 +22,7 @@ const char *RabbitizerInstrId_getOpcodeName(RabbitizerInstrId uniqueId) {
assert(uniqueId >= RABBITIZER_INSTR_ID_cpu_INVALID && uniqueId < RABBITIZER_INSTR_ID_ALL_MAX);
assert(uniqueId != RABBITIZER_INSTR_ID_cpu_MAX);
assert(uniqueId != RABBITIZER_INSTR_ID_rsp_MAX);
assert(uniqueId != RABBITIZER_INSTR_ID_r5900_MAX);
return RabbitizerInstrId_Names[uniqueId];
}

View File

@ -0,0 +1,62 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
#include "instructions/RabbitizerInstrSuffix.h"
#include <assert.h>
#include "common/Utils.h"
#include "instructions/RabbitizerInstruction.h"
#include "instructions/RabbitizerInstructionRsp.h"
#include "instructions/RabbitizerInstructionR5900.h"
typedef size_t (*InstrSuffixCallback)(const RabbitizerInstruction *self, char *dst);
size_t RabbitizerInstrSuffix_None(UNUSED const RabbitizerInstruction *self, UNUSED char *dst) {
return 0;
}
size_t RabbitizerInstrSuffixR5900_xyzw(const RabbitizerInstruction *self, char *dst) {
size_t totalSize = 0;
if (RAB_INSTR_R5900_GET_xyzw_x(self) || RAB_INSTR_R5900_GET_xyzw_y(self) || RAB_INSTR_R5900_GET_xyzw_z(self) || RAB_INSTR_R5900_GET_xyzw_w(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '.');
}
if (RAB_INSTR_R5900_GET_xyzw_x(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x');
}
if (RAB_INSTR_R5900_GET_xyzw_y(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y');
}
if (RAB_INSTR_R5900_GET_xyzw_z(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z');
}
if (RAB_INSTR_R5900_GET_xyzw_w(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w');
}
return totalSize;
}
const InstrSuffixCallback instrSuffixCallbacks[] = {
[RABINSTRSUFFIX_NONE] = RabbitizerInstrSuffix_None,
[RABINSTRSUFFIX_R5900_xyzw] = RabbitizerInstrSuffixR5900_xyzw,
};
size_t RabbitizerInstrSuffix_getSizeForBuffer(UNUSED const RabbitizerInstruction *self, UNUSED RabbitizerInstrSuffix instrSuffix) {
// Just hardcode the size of the bigger possible suffix, faster than actually computing it.
return 5;
}
size_t RabbitizerInstrSuffix_processSuffix(const RabbitizerInstruction *self, char *dst, RabbitizerInstrSuffix instrSuffix) {
InstrSuffixCallback callback;
assert(instrSuffix >= RABINSTRSUFFIX_NONE);
assert(instrSuffix < RABINSTRSUFFIX_MAX);
callback = instrSuffixCallbacks[instrSuffix];
assert(callback != NULL);
return callback(self, dst);
}

View File

@ -8,6 +8,7 @@
#include "common/RabbitizerConfig.h"
#include "instructions/RabbitizerRegister.h"
#include "instructions/RabbitizerInstructionRsp.h"
#include "instructions/RabbitizerInstructionR5900.h"
void RabbitizerInstruction_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram) {
self->word = word;
@ -93,6 +94,9 @@ void RabbitizerInstruction_blankOut(RabbitizerInstruction *self) {
self->word = RAB_INSTR_PACK_sa(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_zero:
break;
case RABBITIZER_OPERAND_TYPE_cop0d:
self->word = RAB_INSTR_PACK_cop0d(self->word, 0);
break;
@ -125,6 +129,10 @@ void RabbitizerInstruction_blankOut(RabbitizerInstruction *self) {
self->word = RAB_INSTR_PACK_code(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_copraw:
self->word = RAB_INSTR_PACK_copraw(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_LABEL:
self->word = RAB_INSTR_PACK_instr_index(self->word, 0);
break;
@ -138,6 +146,7 @@ void RabbitizerInstruction_blankOut(RabbitizerInstruction *self) {
self->word = RAB_INSTR_PACK_immediate(self->word, 0);
break;
/* rsp */
case RABBITIZER_OPERAND_TYPE_RSP_rs:
self->word = RAB_INSTR_PACK_rs(self->word, 0);
break;
@ -154,6 +163,14 @@ void RabbitizerInstruction_blankOut(RabbitizerInstruction *self) {
self->word = RAB_INSTR_PACK_cop0d(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_RSP_cop2t:
self->word = RAB_INSTR_RSP_PACK_cop2t(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_RSP_cop2cd:
self->word = RAB_INSTR_RSP_PACK_cop2cd(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_RSP_vs:
self->word = RAB_INSTR_RSP_PACK_vs(self->word, 0);
break;
@ -176,13 +193,13 @@ void RabbitizerInstruction_blankOut(RabbitizerInstruction *self) {
self->word = RAB_INSTR_RSP_PACK_elementlow(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_RSP_vd_vs:
case RABBITIZER_OPERAND_TYPE_RSP_vd_de:
self->word = RAB_INSTR_RSP_PACK_vd(self->word, 0);
self->word = RAB_INSTR_RSP_PACK_vs(self->word, 0);
self->word = RAB_INSTR_RSP_PACK_de(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_RSP_vd_index:
self->word = RAB_INSTR_RSP_PACK_vd(self->word, 0);
case RABBITIZER_OPERAND_TYPE_RSP_vs_index:
self->word = RAB_INSTR_RSP_PACK_vs(self->word, 0);
self->word = RAB_INSTR_RSP_PACK_index(self->word, 0);
break;
@ -191,6 +208,149 @@ void RabbitizerInstruction_blankOut(RabbitizerInstruction *self) {
self->word = RAB_INSTR_PACK_rs(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_RSP_IMM_base:
self->word = RAB_INSTR_PACK_rs(self->word, 0);
self->word = RAB_INSTR_PACK_immediate(self->word, 0);
break;
/* rsp */
/* r5900 */
case RABBITIZER_OPERAND_TYPE_R5900_I:
case RABBITIZER_OPERAND_TYPE_R5900_Q:
case RABBITIZER_OPERAND_TYPE_R5900_R:
case RABBITIZER_OPERAND_TYPE_R5900_ACC:
// Not real registers encoded on the instruction itself
break;
case RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw:
self->word = RAB_INSTR_R5900_PACK_xyzw_x(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_y(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_z(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_w(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfs:
self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vft:
self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfd:
self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw:
self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_x(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_y(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_z(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_w(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vftxyzw:
self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_x(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_y(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_z(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_w(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw:
self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_x(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_y(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_z(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_xyzw_w(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfsn:
self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_n(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vftn:
self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_n(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfdn:
self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_n(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfsl:
self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_l(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vftl:
self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_l(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfdl:
self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_l(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfsm:
self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_m(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vftm:
self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_m(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfdm:
self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0);
self->word = RAB_INSTR_R5900_PACK_m(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vis:
self->word = RAB_INSTR_R5900_PACK_vis(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vit:
self->word = RAB_INSTR_R5900_PACK_vit(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vid:
self->word = RAB_INSTR_R5900_PACK_vid(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vis_predecr:
self->word = RAB_INSTR_R5900_PACK_vis(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vit_predecr:
self->word = RAB_INSTR_R5900_PACK_vit(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vid_predecr:
self->word = RAB_INSTR_R5900_PACK_vid(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vis_postincr:
self->word = RAB_INSTR_R5900_PACK_vis(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vit_postincr:
self->word = RAB_INSTR_R5900_PACK_vit(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vid_postincr:
self->word = RAB_INSTR_R5900_PACK_vid(self->word, 0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_imm5:
self->word = RAB_INSTR_R5900_PACK_imm5(self->word, 0);
break;
/* r5900 */
case RABBITIZER_OPERAND_TYPE_INVALID:
case RABBITIZER_OPERAND_TYPE_MAX:
assert(self->descriptor->operands[i] != RABBITIZER_OPERAND_TYPE_INVALID && self->descriptor->operands[i] != RABBITIZER_OPERAND_TYPE_MAX);

View File

@ -3,6 +3,7 @@
#include "instructions/RabbitizerInstruction.h"
#include "instructions/RabbitizerInstructionRsp.h"
#include "instructions/RabbitizerInstructionR5900.h"
#include <assert.h>
#include <string.h>
@ -11,6 +12,7 @@
#include "common/Utils.h"
#include "common/RabbitizerConfig.h"
#include "instructions/RabbitizerRegister.h"
#include "instructions/RabbitizerInstrSuffix.h"
typedef size_t (*OperandCallback)(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
@ -38,6 +40,14 @@ size_t RabbitizerOperandType_processRd(const RabbitizerInstruction *self, char *
return totalSize;
}
size_t RabbitizerOperandType_processZero(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
const char *reg = RabbitizerRegister_getNameGpr(0);
RABUTILS_BUFFER_CPY(dst, totalSize, reg);
return totalSize;
}
size_t RabbitizerOperandType_processCop0d(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
const char *reg = RabbitizerRegister_getNameCop0(RAB_INSTR_GET_cop0d(self));
@ -129,6 +139,14 @@ size_t RabbitizerOperandType_processCode(const RabbitizerInstruction *self, char
return totalSize;
}
size_t RabbitizerOperandType_processCopraw(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%X", RAB_INSTR_GET_copraw(self));
return totalSize;
}
size_t RabbitizerOperandType_processLabel(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
@ -209,7 +227,7 @@ size_t RabbitizerOperandTypeRsp_processRt(const RabbitizerInstruction *self, cha
size_t RabbitizerOperandTypeRsp_processRd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
const char *reg = RabbitizerRegister_getNameRspVector(RAB_INSTR_GET_rd(self));
const char *reg = RabbitizerRegister_getNameRspGpr(RAB_INSTR_GET_rd(self));
RABUTILS_BUFFER_CPY(dst, totalSize, reg);
return totalSize;
@ -223,9 +241,25 @@ size_t RabbitizerOperandTypeRsp_processCop0d(const RabbitizerInstruction *self,
return totalSize;
}
size_t RabbitizerOperandTypeRsp_processCop2t(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
const char *reg = RabbitizerRegister_getNameRspCop2(RAB_INSTR_RSP_GET_cop2t(self));
RABUTILS_BUFFER_CPY(dst, totalSize, reg);
return totalSize;
}
size_t RabbitizerOperandTypeRsp_processcop2cd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
const char *reg = RabbitizerRegister_getNameRspCop2Control(RAB_INSTR_RSP_GET_cop2cd(self));
RABUTILS_BUFFER_CPY(dst, totalSize, reg);
return totalSize;
}
size_t RabbitizerOperandTypeRsp_processVs(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
const char *reg = RabbitizerRegister_getNameRspVector(RAB_INSTR_RSP_GET_VS(self));
const char *reg = RabbitizerRegister_getNameRspVector(RAB_INSTR_RSP_GET_vs(self));
RABUTILS_BUFFER_CPY(dst, totalSize, reg);
return totalSize;
@ -233,7 +267,7 @@ size_t RabbitizerOperandTypeRsp_processVs(const RabbitizerInstruction *self, cha
size_t RabbitizerOperandTypeRsp_processVt(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
const char *reg = RabbitizerRegister_getNameRspVector(RAB_INSTR_RSP_GET_VT(self));
const char *reg = RabbitizerRegister_getNameRspVector(RAB_INSTR_RSP_GET_vt(self));
RABUTILS_BUFFER_CPY(dst, totalSize, reg);
return totalSize;
@ -241,7 +275,7 @@ size_t RabbitizerOperandTypeRsp_processVt(const RabbitizerInstruction *self, cha
size_t RabbitizerOperandTypeRsp_processVd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
const char *reg = RabbitizerRegister_getNameRspVector(RAB_INSTR_RSP_GET_VD(self));
const char *reg = RabbitizerRegister_getNameRspVector(RAB_INSTR_RSP_GET_vd(self));
RABUTILS_BUFFER_CPY(dst, totalSize, reg);
return totalSize;
@ -253,37 +287,53 @@ size_t RabbitizerOperandTypeRsp_processVtElementhigh(const RabbitizerInstruction
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeRsp_processVt(self, dst, immOverride, immOverrideLength));
element = RabbitizerInstructionRsp_processVectorElement(self, RAB_INSTR_RSP_GET_elementhigh(self));
element = RAB_INSTR_RSP_GET_elementhigh(self);
if (element != 0) {
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", element);
if ((element & 0x8) == 0x8) {
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", element & 7);
} else if ((element & 0xC) == 0x4) {
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%ih]", element & (~0xC));
} else if ((element & 0xE) == 0x2) {
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%iq]", element & (~0xE));
} else {
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", element);
}
}
return totalSize;
}
size_t RabbitizerOperandTypeRsp_processVtElementlow(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
uint8_t element;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeRsp_processVt(self, dst, immOverride, immOverrideLength));
element = RabbitizerInstructionRsp_processVectorElement(self, RAB_INSTR_RSP_GET_elementlow(self));
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", element);
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", RAB_INSTR_RSP_GET_elementlow(self));
return totalSize;
}
size_t RabbitizerOperandTypeRsp_processVdVs(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t RabbitizerOperandTypeRsp_processVdDe(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
uint8_t de;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeRsp_processVd(self, dst, immOverride, immOverrideLength));
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", RAB_INSTR_RSP_GET_VS(self));
de = RAB_INSTR_RSP_GET_de(self);
if ((de & 0x8) == 0x8) {
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", de & (~0x8));
} else if ((de & 0xC) == 0x4) {
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%ih]", de & (~0xC));
} else if ((de & 0xE) == 0x2) {
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%iq]", de & (~0xE));
} else {
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", de);
}
return totalSize;
}
size_t RabbitizerOperandTypeRsp_processVdIndex(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t RabbitizerOperandTypeRsp_processVsIndex(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeRsp_processVd(self, dst, immOverride, immOverrideLength));
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeRsp_processVs(self, dst, immOverride, immOverrideLength));
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", RAB_INSTR_RSP_GET_index(self));
return totalSize;
@ -300,10 +350,429 @@ size_t RabbitizerOperandTypeRsp_processOffsetVs(const RabbitizerInstruction *sel
return totalSize;
}
size_t RabbitizerOperandTypeRsp_processImmediateBase(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
// TODO: consider making this a proper configuration
#if 0
if (immOverride != NULL || RAB_INSTR_GET_immediate(self) != 0) {
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_processImmediate(self, dst, immOverride, immOverrideLength));
}
#endif
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_processImmediate(self, dst, immOverride, immOverrideLength));
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '(');
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeRsp_processRs(self, dst, immOverride, immOverrideLength));
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')');
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processI(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride,
UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_CPY(dst, totalSize, "$I");
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processQ(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride,
UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_CPY(dst, totalSize, "$Q");
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processR(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride,
UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_CPY(dst, totalSize, "$R");
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processACC(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride,
UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_CPY(dst, totalSize, "$ACC");
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processACCxyzw(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processACC(self, dst, immOverride, immOverrideLength));
#if 0
if (RAB_INSTR_R5900_GET_xyzw_x(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x');
}
if (RAB_INSTR_R5900_GET_xyzw_y(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y');
}
if (RAB_INSTR_R5900_GET_xyzw_z(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z');
}
if (RAB_INSTR_R5900_GET_xyzw_w(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w');
}
#endif
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVfs(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
const char *reg = RabbitizerRegister_getNameR5900VF(RAB_INSTR_R5900_GET_vfs(self));
RABUTILS_BUFFER_CPY(dst, totalSize, reg);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVft(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
const char *reg = RabbitizerRegister_getNameR5900VF(RAB_INSTR_R5900_GET_vft(self));
RABUTILS_BUFFER_CPY(dst, totalSize, reg);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVfd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
const char *reg = RabbitizerRegister_getNameR5900VF(RAB_INSTR_R5900_GET_vfd(self));
RABUTILS_BUFFER_CPY(dst, totalSize, reg);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVfsxyzw(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVfs(self, dst, immOverride, immOverrideLength));
#if 0
if (RAB_INSTR_R5900_GET_xyzw_x(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x');
}
if (RAB_INSTR_R5900_GET_xyzw_y(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y');
}
if (RAB_INSTR_R5900_GET_xyzw_z(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z');
}
if (RAB_INSTR_R5900_GET_xyzw_w(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w');
}
#endif
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVftxyzw(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVft(self, dst, immOverride, immOverrideLength));
#if 0
if (RAB_INSTR_R5900_GET_xyzw_x(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x');
}
if (RAB_INSTR_R5900_GET_xyzw_y(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y');
}
if (RAB_INSTR_R5900_GET_xyzw_z(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z');
}
if (RAB_INSTR_R5900_GET_xyzw_w(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w');
}
#endif
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVfdxyzw(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVfd(self, dst, immOverride, immOverrideLength));
#if 0
if (RAB_INSTR_R5900_GET_xyzw_x(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x');
}
if (RAB_INSTR_R5900_GET_xyzw_y(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y');
}
if (RAB_INSTR_R5900_GET_xyzw_z(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z');
}
if (RAB_INSTR_R5900_GET_xyzw_w(self)) {
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w');
}
#endif
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVfsn(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
uint8_t n;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVfs(self, dst, immOverride, immOverrideLength));
n = RAB_INSTR_R5900_GET_n(self);
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVftn(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
uint8_t n;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVft(self, dst, immOverride, immOverrideLength));
n = RAB_INSTR_R5900_GET_n(self);
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVfdn(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
uint8_t n;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVfd(self, dst, immOverride, immOverrideLength));
n = RAB_INSTR_R5900_GET_n(self);
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVfsl(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
uint8_t n;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVfs(self, dst, immOverride, immOverrideLength));
n = RAB_INSTR_R5900_GET_l(self);
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVftl(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
uint8_t n;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVft(self, dst, immOverride, immOverrideLength));
n = RAB_INSTR_R5900_GET_l(self);
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVfdl(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
uint8_t n;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVfd(self, dst, immOverride, immOverrideLength));
n = RAB_INSTR_R5900_GET_l(self);
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVfsm(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
uint8_t n;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVfs(self, dst, immOverride, immOverrideLength));
n = RAB_INSTR_R5900_GET_m(self);
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVftm(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
uint8_t n;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVft(self, dst, immOverride, immOverrideLength));
n = RAB_INSTR_R5900_GET_m(self);
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVfdm(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
uint8_t n;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVfd(self, dst, immOverride, immOverrideLength));
n = RAB_INSTR_R5900_GET_m(self);
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVis(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
const char *reg = RabbitizerRegister_getNameR5900VI(RAB_INSTR_R5900_GET_vis(self));
RABUTILS_BUFFER_CPY(dst, totalSize, reg);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVit(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
const char *reg = RabbitizerRegister_getNameR5900VI(RAB_INSTR_R5900_GET_vit(self));
RABUTILS_BUFFER_CPY(dst, totalSize, reg);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVid(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) {
size_t totalSize = 0;
const char *reg = RabbitizerRegister_getNameR5900VI(RAB_INSTR_R5900_GET_vid(self));
RABUTILS_BUFFER_CPY(dst, totalSize, reg);
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVis_predecr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '(');
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-');
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-');
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVis(self, dst, immOverride, immOverrideLength));
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')');
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVit_predecr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '(');
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-');
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-');
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVit(self, dst, immOverride, immOverrideLength));
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')');
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVid_predecr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '(');
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-');
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-');
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVid(self, dst, immOverride, immOverrideLength));
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')');
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVis_postincr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '(');
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVis(self, dst, immOverride, immOverrideLength));
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+');
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+');
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')');
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVit_postincr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '(');
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVit(self, dst, immOverride, immOverrideLength));
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+');
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+');
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')');
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processVid_postincr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '(');
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandTypeR5900_processVid(self, dst, immOverride, immOverrideLength));
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+');
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+');
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')');
return totalSize;
}
size_t RabbitizerOperandTypeR5900_processImm5(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) {
size_t totalSize = 0;
int32_t number;
if (immOverride != NULL) {
memcpy(dst, immOverride, immOverrideLength);
return immOverrideLength;
}
number = RAB_INSTR_R5900_GET_imm5(self);
if (RabbitizerConfig_Cfg.misc.omit0XOnSmallImm) {
if (number > -10 && number < 10) {
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", number);
return totalSize;
}
}
if (number < 0) {
if (RabbitizerConfig_Cfg.misc.upperCaseImm) {
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "-0x%X", -number);
} else {
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "-0x%x", -number);
}
} else {
if (RabbitizerConfig_Cfg.misc.upperCaseImm) {
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%X", number);
} else {
RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%x", number);
}
}
return totalSize;
}
const OperandCallback instrOpercandCallbacks[] = {
[RABBITIZER_OPERAND_TYPE_rs] = RabbitizerOperandType_processRs,
[RABBITIZER_OPERAND_TYPE_rt] = RabbitizerOperandType_processRt,
[RABBITIZER_OPERAND_TYPE_rd] = RabbitizerOperandType_processRd,
[RABBITIZER_OPERAND_TYPE_zero] = RabbitizerOperandType_processZero,
[RABBITIZER_OPERAND_TYPE_cop0d] = RabbitizerOperandType_processCop0d,
[RABBITIZER_OPERAND_TYPE_fs] = RabbitizerOperandType_processFs,
[RABBITIZER_OPERAND_TYPE_ft] = RabbitizerOperandType_processFt,
@ -313,6 +782,7 @@ const OperandCallback instrOpercandCallbacks[] = {
[RABBITIZER_OPERAND_TYPE_sa] = RabbitizerOperandType_processSa,
[RABBITIZER_OPERAND_TYPE_op] = RabbitizerOperandType_processOp,
[RABBITIZER_OPERAND_TYPE_code] = RabbitizerOperandType_processCode,
[RABBITIZER_OPERAND_TYPE_copraw] = RabbitizerOperandType_processCopraw,
[RABBITIZER_OPERAND_TYPE_LABEL] = RabbitizerOperandType_processLabel,
[RABBITIZER_OPERAND_TYPE_IMM] = RabbitizerOperandType_processImmediate,
[RABBITIZER_OPERAND_TYPE_IMM_base] = RabbitizerOperandType_processImmediateBase,
@ -322,14 +792,49 @@ const OperandCallback instrOpercandCallbacks[] = {
[RABBITIZER_OPERAND_TYPE_RSP_rt] = RabbitizerOperandTypeRsp_processRt,
[RABBITIZER_OPERAND_TYPE_RSP_rd] = RabbitizerOperandTypeRsp_processRd,
[RABBITIZER_OPERAND_TYPE_RSP_cop0d] = RabbitizerOperandTypeRsp_processCop0d,
[RABBITIZER_OPERAND_TYPE_RSP_cop2t] = RabbitizerOperandTypeRsp_processCop2t,
[RABBITIZER_OPERAND_TYPE_RSP_cop2cd] = RabbitizerOperandTypeRsp_processcop2cd,
[RABBITIZER_OPERAND_TYPE_RSP_vs] = RabbitizerOperandTypeRsp_processVs,
[RABBITIZER_OPERAND_TYPE_RSP_vt] = RabbitizerOperandTypeRsp_processVt,
[RABBITIZER_OPERAND_TYPE_RSP_vd] = RabbitizerOperandTypeRsp_processVd,
[RABBITIZER_OPERAND_TYPE_RSP_vt_elementhigh] = RabbitizerOperandTypeRsp_processVtElementhigh,
[RABBITIZER_OPERAND_TYPE_RSP_vt_elementlow] = RabbitizerOperandTypeRsp_processVtElementlow,
[RABBITIZER_OPERAND_TYPE_RSP_vd_vs] = RabbitizerOperandTypeRsp_processVdVs,
[RABBITIZER_OPERAND_TYPE_RSP_vd_index] = RabbitizerOperandTypeRsp_processVdIndex,
[RABBITIZER_OPERAND_TYPE_RSP_vd_de] = RabbitizerOperandTypeRsp_processVdDe,
[RABBITIZER_OPERAND_TYPE_RSP_vs_index] = RabbitizerOperandTypeRsp_processVsIndex,
[RABBITIZER_OPERAND_TYPE_RSP_offset_rs] = RabbitizerOperandTypeRsp_processOffsetVs,
[RABBITIZER_OPERAND_TYPE_RSP_IMM_base] = RabbitizerOperandTypeRsp_processImmediateBase,
// r5900
[RABBITIZER_OPERAND_TYPE_R5900_I] = RabbitizerOperandTypeR5900_processI,
[RABBITIZER_OPERAND_TYPE_R5900_Q] = RabbitizerOperandTypeR5900_processQ,
[RABBITIZER_OPERAND_TYPE_R5900_R] = RabbitizerOperandTypeR5900_processR,
[RABBITIZER_OPERAND_TYPE_R5900_ACC] = RabbitizerOperandTypeR5900_processACC,
[RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw] = RabbitizerOperandTypeR5900_processACCxyzw,
[RABBITIZER_OPERAND_TYPE_R5900_vfs] = RabbitizerOperandTypeR5900_processVfs,
[RABBITIZER_OPERAND_TYPE_R5900_vft] = RabbitizerOperandTypeR5900_processVft,
[RABBITIZER_OPERAND_TYPE_R5900_vfd] = RabbitizerOperandTypeR5900_processVfd,
[RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw] = RabbitizerOperandTypeR5900_processVfsxyzw,
[RABBITIZER_OPERAND_TYPE_R5900_vftxyzw] = RabbitizerOperandTypeR5900_processVftxyzw,
[RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw] = RabbitizerOperandTypeR5900_processVfdxyzw,
[RABBITIZER_OPERAND_TYPE_R5900_vfsn] = RabbitizerOperandTypeR5900_processVfsn,
[RABBITIZER_OPERAND_TYPE_R5900_vftn] = RabbitizerOperandTypeR5900_processVftn,
[RABBITIZER_OPERAND_TYPE_R5900_vfdn] = RabbitizerOperandTypeR5900_processVfdn,
[RABBITIZER_OPERAND_TYPE_R5900_vfsl] = RabbitizerOperandTypeR5900_processVfsl,
[RABBITIZER_OPERAND_TYPE_R5900_vftl] = RabbitizerOperandTypeR5900_processVftl,
[RABBITIZER_OPERAND_TYPE_R5900_vfdl] = RabbitizerOperandTypeR5900_processVfdl,
[RABBITIZER_OPERAND_TYPE_R5900_vfsm] = RabbitizerOperandTypeR5900_processVfsm,
[RABBITIZER_OPERAND_TYPE_R5900_vftm] = RabbitizerOperandTypeR5900_processVftm,
[RABBITIZER_OPERAND_TYPE_R5900_vfdm] = RabbitizerOperandTypeR5900_processVfdm,
[RABBITIZER_OPERAND_TYPE_R5900_vis] = RabbitizerOperandTypeR5900_processVis,
[RABBITIZER_OPERAND_TYPE_R5900_vit] = RabbitizerOperandTypeR5900_processVit,
[RABBITIZER_OPERAND_TYPE_R5900_vid] = RabbitizerOperandTypeR5900_processVid,
[RABBITIZER_OPERAND_TYPE_R5900_vis_predecr] = RabbitizerOperandTypeR5900_processVis_predecr,
[RABBITIZER_OPERAND_TYPE_R5900_vit_predecr] = RabbitizerOperandTypeR5900_processVit_predecr,
[RABBITIZER_OPERAND_TYPE_R5900_vid_predecr] = RabbitizerOperandTypeR5900_processVid_predecr,
[RABBITIZER_OPERAND_TYPE_R5900_vis_postincr] = RabbitizerOperandTypeR5900_processVis_postincr,
[RABBITIZER_OPERAND_TYPE_R5900_vit_postincr] = RabbitizerOperandTypeR5900_processVit_postincr,
[RABBITIZER_OPERAND_TYPE_R5900_vid_postincr] = RabbitizerOperandTypeR5900_processVid_postincr,
[RABBITIZER_OPERAND_TYPE_R5900_imm5] = RabbitizerOperandTypeR5900_processImm5,
};
size_t RabbitizerInstruction_getSizeForBufferOperandsDisasm(const RabbitizerInstruction *self, size_t immOverrideLength) {
@ -382,6 +887,8 @@ size_t RabbitizerInstruction_getSizeForBufferInstrDisasm(const RabbitizerInstruc
totalSize += opcodeNameLength;
totalSize += RabbitizerInstrSuffix_getSizeForBuffer(self, self->descriptor->instrSuffix);
if (self->descriptor->operands[0] == RABBITIZER_OPERAND_TYPE_INVALID) {
// There are no operands
return totalSize;
@ -402,6 +909,8 @@ size_t RabbitizerInstruction_disassembleInstruction(const RabbitizerInstruction
RABUTILS_BUFFER_CPY(dst, totalSize, opcodeName);
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerInstrSuffix_processSuffix(self, dst, self->descriptor->instrSuffix));
if (self->descriptor->operands[0] == RABBITIZER_OPERAND_TYPE_INVALID) {
// There are no operands
*dst = '\0';
@ -458,6 +967,7 @@ size_t RabbitizerInstruction_getSizeForBuffer(const RabbitizerInstruction *self,
totalSize += 40;
totalSize += 3;
totalSize += RabbitizerInstruction_getSizeForBufferInstrDisasm(self, immOverrideLength, extraLJust);
totalSize += 11;
}
return totalSize;
}
@ -474,6 +984,8 @@ size_t RabbitizerInstruction_disassemble(const RabbitizerInstruction *self, char
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerInstruction_disassembleAsData(self, dst, extraLJust));
if (RabbitizerConfig_Cfg.misc.unknownInstrComment) {
uint32_t validBits;
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerUtils_CharFill(dst, 40 - totalSize, ' '));
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ' ');
@ -481,6 +993,10 @@ size_t RabbitizerInstruction_disassemble(const RabbitizerInstruction *self, char
RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ' ');
RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerInstruction_disassembleInstruction(self, dst, immOverride, immOverrideLength, extraLJust));
validBits = RabbitizerInstruction_getValidBits(self);
RABUTILS_BUFFER_SPRINTF(dst, totalSize, " # %08X", ((~validBits) & self->word));
}
return totalSize;

View File

@ -7,16 +7,19 @@
#include "common/RabbitizerConfig.h"
#include "instructions/RabbitizerInstructionRsp.h"
#include "instructions/RabbitizerInstructionR5900.h"
#include "instructions/RabbitizerRegister.h"
bool RabbitizerInstruction_isImplemented(const RabbitizerInstruction *self) {
if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_INVALID) {
return false;
switch (self->uniqueId) {
case RABBITIZER_INSTR_ID_cpu_INVALID:
case RABBITIZER_INSTR_ID_rsp_INVALID:
case RABBITIZER_INSTR_ID_r5900_INVALID:
return false;
default:
return true;
}
if (self->uniqueId == RABBITIZER_INSTR_ID_rsp_INVALID) {
return false;
}
return true;
}
bool RabbitizerInstruction_isLikelyHandwritten(const RabbitizerInstruction *self) {
@ -143,12 +146,18 @@ bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, Ra
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_offset_rs)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_IMM_base)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_IMM:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_IMM_base)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_IMM_base)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_rt:
@ -164,6 +173,7 @@ bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, Ra
break;
case RABBITIZER_OPERAND_TYPE_sa:
case RABBITIZER_OPERAND_TYPE_zero:
// case RABBITIZER_OPERAND_TYPE_function:
case RABBITIZER_OPERAND_TYPE_cop0d:
case RABBITIZER_OPERAND_TYPE_fs:
@ -173,6 +183,7 @@ bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, Ra
case RABBITIZER_OPERAND_TYPE_cop2t:
case RABBITIZER_OPERAND_TYPE_op:
case RABBITIZER_OPERAND_TYPE_code:
case RABBITIZER_OPERAND_TYPE_copraw:
case RABBITIZER_OPERAND_TYPE_LABEL:
break;
@ -208,6 +219,8 @@ bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, Ra
break;
case RABBITIZER_OPERAND_TYPE_RSP_cop0d:
case RABBITIZER_OPERAND_TYPE_RSP_cop2t:
case RABBITIZER_OPERAND_TYPE_RSP_cop2cd:
break;
// case RABBITIZER_OPERAND_TYPE_RSP_elementhigh:
@ -216,7 +229,7 @@ bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, Ra
// case RABBITIZER_OPERAND_TYPE_RSP_offset:
case RABBITIZER_OPERAND_TYPE_RSP_vs:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_vd_vs)) {
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_vs_index)) {
return true;
}
break;
@ -231,10 +244,7 @@ bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, Ra
break;
case RABBITIZER_OPERAND_TYPE_RSP_vd:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_vd_vs)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_vd_index)) {
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_RSP_vd_de)) {
return true;
}
break;
@ -251,17 +261,14 @@ bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, Ra
}
break;
case RABBITIZER_OPERAND_TYPE_RSP_vd_vs:
case RABBITIZER_OPERAND_TYPE_RSP_vd_de:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_RSP_vd)) {
return true;
}
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_RSP_vs)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_RSP_vd_index:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_RSP_vd)) {
case RABBITIZER_OPERAND_TYPE_RSP_vs_index:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_RSP_vs)) {
return true;
}
break;
@ -271,8 +278,240 @@ bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, Ra
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_RSP_IMM_base:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_RSP_rs)) {
return true;
}
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_rs)) {
return true;
}
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_IMM)) {
return true;
}
break;
/* rsp */
/* r5900 */
case RABBITIZER_OPERAND_TYPE_R5900_I:
case RABBITIZER_OPERAND_TYPE_R5900_Q:
case RABBITIZER_OPERAND_TYPE_R5900_R:
break;
case RABBITIZER_OPERAND_TYPE_R5900_ACC:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_ACC)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfs:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfsn)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfsl)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfsm)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vft:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vftn)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vftl)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vftm)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfd:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfdn)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfdl)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfdm)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfs)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfsn)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vftxyzw:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vft)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vftn)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfd)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfdn)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfsn:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfs)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vftn:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vft)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vftxyzw)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfdn:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfd)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfsl:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_R5900_vfs)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vftl:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_R5900_vft)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfdl:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_R5900_vfd)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfsm:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_R5900_vfs)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vftm:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_R5900_vft)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfdm:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_R5900_vfd)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vis:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vis_predecr)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vis_postincr)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vit:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vit_predecr)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vit_postincr)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vid:
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vid_predecr)) {
return true;
}
if (RabbitizerInstruction_hasOperand(self, RABBITIZER_OPERAND_TYPE_R5900_vid_postincr)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vis_predecr:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_R5900_vis)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vit_predecr:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_R5900_vit)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vid_predecr:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_R5900_vid)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vis_postincr:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_R5900_vis)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vit_postincr:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_R5900_vit)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_vid_postincr:
if (RabbitizerInstruction_hasOperandAlias(self, RABBITIZER_OPERAND_TYPE_R5900_vid)) {
return true;
}
break;
case RABBITIZER_OPERAND_TYPE_R5900_imm5:
break;
/* r5900 */
case RABBITIZER_OPERAND_TYPE_INVALID:
case RABBITIZER_OPERAND_TYPE_MAX:
assert(operand != RABBITIZER_OPERAND_TYPE_INVALID && operand != RABBITIZER_OPERAND_TYPE_MAX);
@ -282,7 +521,7 @@ bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, Ra
return RabbitizerInstruction_hasOperand(self, operand);
}
bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self) {
uint32_t RabbitizerInstruction_getValidBits(const RabbitizerInstruction *self) {
size_t i;
uint32_t validbits;
@ -307,6 +546,9 @@ bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self) {
validbits = RAB_INSTR_PACK_sa(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_zero:
break;
case RABBITIZER_OPERAND_TYPE_cop0d:
validbits = RAB_INSTR_PACK_cop0d(validbits, ~0);
break;
@ -339,6 +581,10 @@ bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self) {
validbits = RAB_INSTR_PACK_code(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_copraw:
validbits = RAB_INSTR_PACK_copraw(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_LABEL:
validbits = RAB_INSTR_PACK_instr_index(validbits, ~0);
break;
@ -352,6 +598,7 @@ bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self) {
validbits = RAB_INSTR_PACK_rs(validbits, ~0);
break;
/* rsp */
case RABBITIZER_OPERAND_TYPE_RSP_rs:
validbits = RAB_INSTR_PACK_rs(validbits, ~0);
break;
@ -368,6 +615,14 @@ bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self) {
validbits = RAB_INSTR_PACK_cop0d(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_RSP_cop2t:
validbits = RAB_INSTR_RSP_PACK_cop2t(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_RSP_cop2cd:
validbits = RAB_INSTR_RSP_PACK_cop2cd(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_RSP_vs:
validbits = RAB_INSTR_RSP_PACK_vs(validbits, ~0);
break;
@ -390,13 +645,13 @@ bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self) {
validbits = RAB_INSTR_RSP_PACK_elementlow(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_RSP_vd_vs:
case RABBITIZER_OPERAND_TYPE_RSP_vd_de:
validbits = RAB_INSTR_RSP_PACK_vd(validbits, ~0);
validbits = RAB_INSTR_RSP_PACK_vs(validbits, ~0);
validbits = RAB_INSTR_RSP_PACK_de(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_RSP_vd_index:
validbits = RAB_INSTR_RSP_PACK_vd(validbits, ~0);
case RABBITIZER_OPERAND_TYPE_RSP_vs_index:
validbits = RAB_INSTR_RSP_PACK_vs(validbits, ~0);
validbits = RAB_INSTR_RSP_PACK_index(validbits, ~0);
break;
@ -405,6 +660,149 @@ bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self) {
validbits = RAB_INSTR_PACK_rs(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_RSP_IMM_base:
validbits = RAB_INSTR_PACK_immediate(validbits, ~0);
validbits = RAB_INSTR_PACK_rs(validbits, ~0);
break;
/* rsp */
/* r5900 */
case RABBITIZER_OPERAND_TYPE_R5900_I:
case RABBITIZER_OPERAND_TYPE_R5900_Q:
case RABBITIZER_OPERAND_TYPE_R5900_R:
case RABBITIZER_OPERAND_TYPE_R5900_ACC:
// Not real registers encoded on the instruction itself
break;
case RABBITIZER_OPERAND_TYPE_R5900_ACCxyzw:
validbits = RAB_INSTR_R5900_PACK_xyzw_x(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_y(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_z(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_w(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfs:
validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vft:
validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfd:
validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfsxyzw:
validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_x(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_y(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_z(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_w(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vftxyzw:
validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_x(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_y(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_z(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_w(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfdxyzw:
validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_x(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_y(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_z(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_xyzw_w(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfsn:
validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_n(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vftn:
validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_n(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfdn:
validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_n(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfsl:
validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_l(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vftl:
validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_l(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfdl:
validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_l(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfsm:
validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_m(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vftm:
validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_m(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vfdm:
validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0);
validbits = RAB_INSTR_R5900_PACK_m(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vis:
validbits = RAB_INSTR_R5900_PACK_vis(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vit:
validbits = RAB_INSTR_R5900_PACK_vit(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vid:
validbits = RAB_INSTR_R5900_PACK_vid(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vis_predecr:
validbits = RAB_INSTR_R5900_PACK_vis(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vit_predecr:
validbits = RAB_INSTR_R5900_PACK_vit(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vid_predecr:
validbits = RAB_INSTR_R5900_PACK_vid(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vis_postincr:
validbits = RAB_INSTR_R5900_PACK_vis(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vit_postincr:
validbits = RAB_INSTR_R5900_PACK_vit(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_vid_postincr:
validbits = RAB_INSTR_R5900_PACK_vid(validbits, ~0);
break;
case RABBITIZER_OPERAND_TYPE_R5900_imm5:
validbits = RAB_INSTR_R5900_PACK_imm5(validbits, ~0);
break;
/* r5900 */
case RABBITIZER_OPERAND_TYPE_INVALID:
case RABBITIZER_OPERAND_TYPE_MAX:
assert(self->descriptor->operands[i] != RABBITIZER_OPERAND_TYPE_INVALID && self->descriptor->operands[i] != RABBITIZER_OPERAND_TYPE_MAX);
@ -412,5 +810,13 @@ bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self) {
}
}
return validbits;
}
bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self) {
uint32_t validbits;
validbits = RabbitizerInstruction_getValidBits(self);
return ((~validbits) & self->word) == 0;
}

View File

@ -6,8 +6,11 @@
#include "common/RabbitizerConfig.h"
#include "instructions/RabbitizerRegister.h"
// NOLINTBEGIN(readability-magic-numbers)
#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \
case (caseBits): \
self->uniqueId = RABBITIZER_INSTR_ID_##prefix##_##name; \
break;
#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__)
void RabbitizerInstruction_processUniqueId_Normal(RabbitizerInstruction *self) {
uint32_t opcode = RAB_INSTR_GET_opcode(self);
@ -15,183 +18,7 @@ void RabbitizerInstruction_processUniqueId_Normal(RabbitizerInstruction *self) {
self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode);
switch (opcode) {
// 0b000000: "SPECIAL",
// 0b000001: "REGIMM",
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;
// 0b010000: "COP0", // Coprocessor OPeration z
// 0b010001: "COP1", // Coprocessor OPeration z
// 0b010010: "COP2", // Coprocessor OPeration z
// 0b010011: "COP3", // Coprocessor OPeration z
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;
// 0b111011: "",
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_cpu_INVALID;
break;
#include "instructions/instr_id/cpu/cpu_normal.inc"
}
if (RabbitizerConfig_Cfg.pseudos.enablePseudos) {
@ -232,190 +59,7 @@ void RabbitizerInstruction_processUniqueId_Special(RabbitizerInstruction *self)
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
case 0b000000:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_sll;
break;
// 0b000_001: "MOVCI", // TODO
case 0b000010:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_srl;
break;
case 0b000011:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_sra;
break;
case 0b000100:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_sllv;
break;
// 0b000_101: "",
case 0b000110:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_srlv;
break;
case 0b000111:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_srav;
break;
case 0b001000:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_jr;
break;
case 0b001001:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_jalr;
self->_mandatorybits = RAB_INSTR_PACK_rd(self->_mandatorybits, RAB_INSTR_GET_rd(self));
break;
case 0b001010:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_movz;
break;
case 0b001011:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_movn;
break;
case 0b001100:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_syscall;
break;
case 0b001101:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_break;
break;
// 0b001_110: "",
case 0b001111:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_sync;
break;
case 0b010000:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_mfhi;
break;
case 0b010001:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_mthi;
break;
case 0b010010:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_mflo;
break;
case 0b010011:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_mtlo;
break;
case 0b010100:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dsllv;
break;
// 0b010_101: "",
case 0b010110:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dsrlv;
break;
case 0b010111:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dsrav;
break;
case 0b011000:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_mult;
break;
case 0b011001:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_multu;
break;
case 0b011010:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_div;
break;
case 0b011011:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_divu;
break;
case 0b011100:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dmult;
break;
case 0b011101:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dmultu;
break;
case 0b011110:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_ddiv;
break;
case 0b011111:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_ddivu;
break;
case 0b100000:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_add;
break;
case 0b100001:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_addu;
break;
case 0b100010:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_sub;
break;
case 0b100011:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_subu;
break;
case 0b100100:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_and;
break;
case 0b100101:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_or;
break;
case 0b100110:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_xor;
break;
case 0b100111:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_nor;
break;
// 0b101_000: "",
// 0b101_001: "",
case 0b101010:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_slt;
break;
case 0b101011:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_sltu;
break;
case 0b101100:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dadd;
break;
case 0b101101:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_daddu;
break;
case 0b101110:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dsub;
break;
case 0b101111:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dsubu;
break;
case 0b110000:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_tge;
break;
case 0b110001:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_tgeu;
break;
case 0b110010:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_tlt;
break;
case 0b110011:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_tltu;
break;
case 0b110100:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_teq;
break;
// 0b110_101: "",
case 0b110110:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_tne;
break;
// 0b110_111: "",
case 0b111000:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dsll;
break;
// 0b111_001: "",
case 0b111010:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dsrl;
break;
case 0b111011:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dsra;
break;
case 0b111100:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dsll32;
break;
// 0b111_101: "",
case 0b111110:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dsrl32;
break;
case 0b111111:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dsra32;
break;
default:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_INVALID;
break;
#include "instructions/instr_id/cpu/cpu_special.inc"
}
if (RabbitizerInstruction_isNop(self)) {
@ -456,6 +100,8 @@ void RabbitizerInstruction_processUniqueId_Special(RabbitizerInstruction *self)
switch (self->uniqueId) {
case RABBITIZER_INSTR_ID_cpu_jalr:
self->_mandatorybits = RAB_INSTR_PACK_rd(self->_mandatorybits, RAB_INSTR_GET_rd(self));
if (RabbitizerConfig_Cfg.regNames.gprAbiNames == RABBITIZER_ABI_NUMERIC || RabbitizerConfig_Cfg.regNames.gprAbiNames == RABBITIZER_ABI_O32) {
if (RAB_INSTR_GET_rd(self) != RABBITIZER_REG_GPR_O32_ra) {
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[RABBITIZER_INSTR_ID_cpu_jalr_rd];
@ -490,476 +136,130 @@ void RabbitizerInstruction_processUniqueId_Regimm(RabbitizerInstruction *self) {
self->_mandatorybits = RAB_INSTR_PACK_rt(self->_mandatorybits, rt);
switch (rt) {
case 0b00000:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bltz;
break;
case 0b00001:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bgez;
break;
case 0b00010:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bltzl;
break;
case 0b00011:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bgezl;
break;
case 0b01000:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_tgei;
break;
case 0b01001:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_tgeiu;
break;
case 0b01010:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_tlti;
break;
case 0b01011:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_tltiu;
break;
case 0b10000:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bltzal;
break;
case 0b10001:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bgezal;
break;
case 0b10010:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bltzall;
break;
case 0b10011:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bgezall;
break;
case 0b01100:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_teqi;
break;
case 0b01110:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_tnei;
break;
default:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_INVALID;
break;
#include "instructions/instr_id/cpu/cpu_regimm.inc"
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
void RabbitizerInstruction_processUniqueId_Coprocessor0_BC0(RabbitizerInstruction *self) {
uint32_t fmt = RAB_INSTR_GET_bc_fmt(self);
self->_mandatorybits = RAB_INSTR_PACK_bc_fmt(self->_mandatorybits, fmt);
switch (fmt) {
#include "instructions/instr_id/cpu/cpu_cop0_bc0.inc"
}
}
void RabbitizerInstruction_processUniqueId_Coprocessor0_Tlb(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_GET_function(self);
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
#include "instructions/instr_id/cpu/cpu_cop0_tlb.inc"
}
}
void RabbitizerInstruction_processUniqueId_Coprocessor0(RabbitizerInstruction *self) {
uint32_t fmt = RAB_INSTR_GET_fmt(self);
uint32_t tf;
uint32_t nd;
uint32_t function;
self->_handwrittenCategory = true;
self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt);
self->_handwrittenCategory = true;
switch (fmt) {
case 0b00000:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_mfc0;
break;
case 0b00001:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dmfc0;
break;
case 0b00010:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_cfc0;
break;
// 0b00_011: "",
case 0b00100:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_mtc0;
break;
case 0b00101:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dmtc0;
break;
case 0b00110:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_ctc0;
break;
// 0b00_111: "",
#include "instructions/instr_id/cpu/cpu_cop0.inc"
case 0b01000:
tf = RAB_INSTR_GET_tf(self);
nd = RAB_INSTR_GET_nd(self);
self->_mandatorybits = RAB_INSTR_PACK_tf(self->_mandatorybits, tf);
self->_mandatorybits = RAB_INSTR_PACK_nd(self->_mandatorybits, nd);
if (tf) {
if (nd) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bc0tl;
} else {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bc0t;
}
} else {
if (nd) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bc0fl;
} else {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bc0f;
}
}
case 0x08:
RabbitizerInstruction_processUniqueId_Coprocessor0_BC0(self);
break;
default:
function = RAB_INSTR_GET_function(self);
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
case 0b000001:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_tlbr;
break;
case 0b000010:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_tlbwi;
break;
case 0b000110:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_tlbwr;
break;
case 0b001000:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_tlbp;
break;
case 0b011000:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_eret;
break;
default:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_INVALID;
break;
}
case 0x10:
RabbitizerInstruction_processUniqueId_Coprocessor0_Tlb(self);
break;
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
void RabbitizerInstruction_processUniqueId_Coprocessor1(RabbitizerInstruction *self) {
uint8_t fmt = RAB_INSTR_GET_fmt(self);
uint8_t fc;
uint32_t tf;
uint32_t nd;
uint32_t function;
uint32_t cond;
void RabbitizerInstruction_processUniqueId_Coprocessor1_BC1(RabbitizerInstruction *self) {
uint32_t fmt = RAB_INSTR_GET_bc_fmt(self);
self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt);
// TODO
self->_mandatorybits = RAB_INSTR_PACK_bc_fmt(self->_mandatorybits, fmt);
switch (fmt) {
case 0b00000:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_mfc1;
break;
case 0b00001:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dmfc1;
break;
case 0b00010:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_cfc1;
#include "instructions/instr_id/cpu/cpu_cop1_bc1.inc"
}
}
void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuS(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_GET_function(self);
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
#include "instructions/instr_id/cpu/cpu_cop1_fpu_s.inc"
}
}
void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuD(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_GET_function(self);
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
#include "instructions/instr_id/cpu/cpu_cop1_fpu_d.inc"
}
}
void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuW(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_GET_function(self);
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
#include "instructions/instr_id/cpu/cpu_cop1_fpu_w.inc"
}
}
void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuL(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_GET_function(self);
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
#include "instructions/instr_id/cpu/cpu_cop1_fpu_l.inc"
}
}
void RabbitizerInstruction_processUniqueId_Coprocessor1(RabbitizerInstruction *self) {
uint8_t fmt = RAB_INSTR_GET_fmt(self);
self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt);
switch (fmt) {
#include "instructions/instr_id/cpu/cpu_cop1.inc"
case 0x08: // fmt = BC
RabbitizerInstruction_processUniqueId_Coprocessor1_BC1(self);
break;
case 0b00100:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_mtc1;
break;
case 0b00101:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_dmtc1;
break;
case 0b00110:
self->uniqueId = RABBITIZER_INSTR_ID_cpu_ctc1;
case 0x10:
RabbitizerInstruction_processUniqueId_Coprocessor1_FpuS(self);
break;
case 0b01000: // fmt = BC
tf = RAB_INSTR_GET_tf(self);
nd = RAB_INSTR_GET_nd(self);
self->_mandatorybits = RAB_INSTR_PACK_tf(self->_mandatorybits, tf);
self->_mandatorybits = RAB_INSTR_PACK_nd(self->_mandatorybits, nd);
if (tf) {
if (nd) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bc1tl;
} else {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bc1t;
}
} else {
if (nd) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bc1fl;
} else {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_bc1f;
}
}
case 0x11:
RabbitizerInstruction_processUniqueId_Coprocessor1_FpuD(self);
break;
default:
fmt = fmt & 0x07;
function = RAB_INSTR_GET_function(self);
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
case 0b000000:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_add_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_add_d;
}
break;
case 0b000001:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_sub_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_sub_d;
}
break;
case 0b000010:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_mul_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_mul_d;
}
break;
case 0b000011:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_div_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_div_d;
}
break;
case 0x14:
RabbitizerInstruction_processUniqueId_Coprocessor1_FpuW(self);
break;
case 0b000100:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_sqrt_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_sqrt_d;
}
break;
case 0b000101:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_abs_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_abs_d;
}
break;
case 0b000110:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_mov_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_mov_d;
}
break;
case 0b000111:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_neg_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_neg_d;
}
break;
case 0b001000:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_round_l_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_round_l_d;
}
break;
case 0b001001:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_trunc_l_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_trunc_l_d;
}
break;
case 0b001010:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_ceil_l_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_ceil_l_d;
}
break;
case 0b001011:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_floor_l_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_floor_l_d;
}
break;
case 0b001100:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_round_w_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_round_w_d;
}
break;
case 0b001101:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_trunc_w_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_trunc_w_d;
}
break;
case 0b001110:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_ceil_w_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_ceil_w_d;
}
break;
case 0b001111:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_floor_w_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_floor_w_d;
}
break;
default:
fc = RAB_INSTR_GET_fc(self);
self->_mandatorybits = RAB_INSTR_PACK_fc(self->_mandatorybits, fc);
if (fc == 0b11) {
// Compare conditions codes
cond = RAB_INSTR_GET_cond(self);
self->_mandatorybits = RAB_INSTR_PACK_cond(self->_mandatorybits, cond);
switch (cond) {
case 0b0000:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_f_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_f_d;
}
break;
case 0b0001:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_un_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_un_d;
}
break;
case 0b0010:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_eq_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_eq_d;
}
break;
case 0b0011:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_ueq_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_ueq_d;
}
break;
case 0b0100:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_olt_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_olt_d;
}
break;
case 0b0101:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_ult_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_ult_d;
}
break;
case 0b0110:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_ole_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_ole_d;
}
break;
case 0b0111:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_ule_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_ule_d;
}
break;
case 0b1000:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_sf_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_sf_d;
}
break;
case 0b1001:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_ngle_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_ngle_d;
}
break;
case 0b1010:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_seq_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_seq_d;
}
break;
case 0b1011:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_ngl_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_ngl_d;
}
break;
case 0b1100:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_lt_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_lt_d;
}
break;
case 0b1101:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_nge_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_nge_d;
}
break;
case 0b1110:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_le_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_le_d;
}
break;
case 0b1111:
if (fmt == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_ngt_s;
} else if (fmt == 1) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_c_ngt_d;
}
break;
}
} else if (fc == 0b10) {
// Convert codes
switch (function & 0x07) {
case 0b000:
if (fmt == 0b001) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_cvt_s_d;
} else if (fmt == 0b100) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_cvt_s_w;
} else if (fmt == 0b101) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_cvt_s_l;
}
break;
case 0b001:
if (fmt == 0b000) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_cvt_d_s;
} else if (fmt == 0b100) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_cvt_d_w;
} else if (fmt == 0b101) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_cvt_d_l;
}
break;
case 0b100:
if (fmt == 0b000) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_cvt_w_s;
} else if (fmt == 0b001) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_cvt_w_d;
}
break;
case 0b101:
if (fmt == 0b000) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_cvt_l_s;
} else if (fmt == 0b001) {
self->uniqueId = RABBITIZER_INSTR_ID_cpu_cvt_l_d;
}
break;
}
}
break;
}
case 0x15:
RabbitizerInstruction_processUniqueId_Coprocessor1_FpuL(self);
break;
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
@ -971,11 +271,16 @@ void RabbitizerInstruction_processUniqueId_Coprocessor2(RabbitizerInstruction *s
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
#undef RABBITIZER_DEF_INSTR_ID
#undef RABBITIZER_DEF_INSTR_ID_ALTNAME
void RabbitizerInstruction_processUniqueId(RabbitizerInstruction *self) {
uint32_t opcode = RAB_INSTR_GET_opcode(self);
self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode);
self->uniqueId = RABBITIZER_INSTR_ID_cpu_INVALID;
switch (opcode) {
default:
RabbitizerInstruction_processUniqueId_Normal(self);
@ -997,5 +302,3 @@ void RabbitizerInstruction_processUniqueId(RabbitizerInstruction *self) {
break;
}
}
// NOLINTEND(readability-magic-numbers)

View File

@ -0,0 +1,17 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
#include "instructions/RabbitizerInstructionR5900.h"
void RabbitizerInstructionR5900_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram) {
RabbitizerInstruction_init(self, word, vram);
self->uniqueId = RABBITIZER_INSTR_ID_r5900_INVALID;
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
self->category = RABBITIZER_INSTRCAT_R5900;
}
void RabbitizerInstructionR5900_destroy(RabbitizerInstruction *self) {
RabbitizerInstruction_destroy(self);
}

View File

@ -0,0 +1,328 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
#include "instructions/RabbitizerInstructionR5900.h"
#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \
case (caseBits): \
self->uniqueId = RABBITIZER_INSTR_ID_##prefix##_##name; \
break;
#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__)
void RabbitizerInstructionR5900_processUniqueId_Normal(RabbitizerInstruction *self) {
uint32_t opcode = RAB_INSTR_GET_opcode(self);
bool fetchDescriptor = true;
self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode);
switch (opcode) {
#include "instructions/instr_id/r5900/r5900_normal.inc"
default:
RabbitizerInstruction_processUniqueId_Normal(self);
fetchDescriptor = false;
break;
}
if (fetchDescriptor) {
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
}
void RabbitizerInstructionR5900_processUniqueId_Special(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_GET_function(self);
bool fetchDescriptor = true;
uint32_t stype;
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
#include "instructions/instr_id/r5900/r5900_special.inc"
default:
RabbitizerInstruction_processUniqueId_Special(self);
fetchDescriptor = false;
break;
}
switch (self->uniqueId) {
case RABBITIZER_INSTR_ID_cpu_sync:
stype = RAB_INSTR_GET_stype(self);
self->_mandatorybits = RAB_INSTR_PACK_stype(self->_mandatorybits, stype);
if ((stype & 0x10) == 0x10) {
self->uniqueId = RABBITIZER_INSTR_ID_r5900_sync_p;
fetchDescriptor = true;
}
break;
default:
break;
}
if (fetchDescriptor) {
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
}
void RabbitizerInstructionR5900_processUniqueId_Regimm(RabbitizerInstruction *self) {
uint32_t rt = RAB_INSTR_GET_rt(self);
bool fetchDescriptor = true;
self->_mandatorybits = RAB_INSTR_PACK_rt(self->_mandatorybits, rt);
switch (rt) {
#include "instructions/instr_id/r5900/r5900_regimm.inc"
default:
RabbitizerInstruction_processUniqueId_Regimm(self);
fetchDescriptor = false;
break;
}
if (fetchDescriptor) {
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
}
void RabbitizerInstructionR5900_processUniqueId_Coprocessor0_Tlb(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_GET_function(self);
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
#include "instructions/instr_id/r5900/r5900_cop0_tlb.inc"
default:
RabbitizerInstruction_processUniqueId_Coprocessor0_Tlb(self);
break;
}
}
void RabbitizerInstructionR5900_processUniqueId_Coprocessor0(RabbitizerInstruction *self) {
uint32_t fmt = RAB_INSTR_GET_fmt(self);
self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt);
self->_handwrittenCategory = true;
switch (fmt) {
#include "instructions/instr_id/cpu/cpu_cop0.inc"
case 0x08:
RabbitizerInstruction_processUniqueId_Coprocessor0_BC0(self);
break;
case 0x10:
RabbitizerInstructionR5900_processUniqueId_Coprocessor0_Tlb(self);
break;
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
void RabbitizerInstructionR5900_processUniqueId_Coprocessor1_FpuS(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_GET_function(self);
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
#include "instructions/instr_id/r5900/r5900_cop1_fpu_s.inc"
default:
RabbitizerInstruction_processUniqueId_Coprocessor1_FpuS(self);
break;
}
}
void RabbitizerInstructionR5900_processUniqueId_Coprocessor1(RabbitizerInstruction *self) {
uint8_t fmt = RAB_INSTR_GET_fmt(self);
self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt);
switch (fmt) {
#include "instructions/instr_id/cpu/cpu_cop1.inc"
case 0x08: // fmt = BC
RabbitizerInstruction_processUniqueId_Coprocessor1_BC1(self);
break;
case 0x10:
RabbitizerInstructionR5900_processUniqueId_Coprocessor1_FpuS(self);
break;
case 0x14:
RabbitizerInstruction_processUniqueId_Coprocessor1_FpuW(self);
break;
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
void RabbitizerInstruction_processUniqueId_Coprocessor2_BC2(RabbitizerInstruction *self) {
uint32_t fmt = RAB_INSTR_GET_bc_fmt(self);
self->_mandatorybits = RAB_INSTR_PACK_bc_fmt(self->_mandatorybits, fmt);
switch (fmt) {
#include "instructions/instr_id/r5900/r5900_cop2_bc2.inc"
}
}
void RabbitizerInstructionR5900_processUniqueId_Coprocessor2_Special2(UNUSED RabbitizerInstruction *self) {
uint32_t fhiflo = RAB_INSTR_R5900_GET_fhi_flo(self);
self->_mandatorybits = RAB_INSTR_R5900_PACK_fhi_flo(self->_mandatorybits, fhiflo);
switch (fhiflo) {
#include "instructions/instr_id/r5900/r5900_cop2_special2.inc"
}
}
void RabbitizerInstructionR5900_processUniqueId_Coprocessor2_Special1(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_GET_function(self);
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
#include "instructions/instr_id/r5900/r5900_cop2_special1.inc"
case 0x3C:
case 0x3D:
case 0x3E:
case 0x3F:
RabbitizerInstructionR5900_processUniqueId_Coprocessor2_Special2(self);
break;
}
}
void RabbitizerInstructionR5900_processUniqueId_Coprocessor2(RabbitizerInstruction *self) {
uint8_t fmt = RAB_INSTR_GET_fmt(self);
self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt);
switch (fmt) {
#include "instructions/instr_id/r5900/r5900_cop2.inc"
case 0x08:
RabbitizerInstruction_processUniqueId_Coprocessor2_BC2(self);
break;
case 0x10:
case 0x11:
case 0x12:
case 0x13:
case 0x14:
case 0x15:
case 0x16:
case 0x17:
case 0x18:
case 0x19:
case 0x1A:
case 0x1B:
case 0x1C:
case 0x1D:
case 0x1E:
case 0x1F:
RabbitizerInstructionR5900_processUniqueId_Coprocessor2_Special1(self);
break;
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
void RabbitizerInstructionR5900_processUniqueId_MMI_0(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_R5900_GET_mmi_function(self);
self->_mandatorybits = RAB_INSTR_R5900_PACK_mmi_function(self->_mandatorybits, function);
switch (function) {
#include "instructions/instr_id/r5900/r5900_mmi_0.inc"
}
}
void RabbitizerInstructionR5900_processUniqueId_MMI_1(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_R5900_GET_mmi_function(self);
self->_mandatorybits = RAB_INSTR_R5900_PACK_mmi_function(self->_mandatorybits, function);
switch (function) {
#include "instructions/instr_id/r5900/r5900_mmi_1.inc"
}
}
void RabbitizerInstructionR5900_processUniqueId_MMI_2(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_R5900_GET_mmi_function(self);
self->_mandatorybits = RAB_INSTR_R5900_PACK_mmi_function(self->_mandatorybits, function);
switch (function) {
#include "instructions/instr_id/r5900/r5900_mmi_2.inc"
}
}
void RabbitizerInstructionR5900_processUniqueId_MMI_3(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_R5900_GET_mmi_function(self);
self->_mandatorybits = RAB_INSTR_R5900_PACK_mmi_function(self->_mandatorybits, function);
switch (function) {
#include "instructions/instr_id/r5900/r5900_mmi_3.inc"
}
}
void RabbitizerInstructionR5900_processUniqueId_MMI(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_GET_function(self);
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
#include "instructions/instr_id/r5900/r5900_mmi.inc"
case 0x08:
RabbitizerInstructionR5900_processUniqueId_MMI_0(self);
break;
case 0x09:
RabbitizerInstructionR5900_processUniqueId_MMI_2(self);
break;
case 0x28:
RabbitizerInstructionR5900_processUniqueId_MMI_1(self);
break;
case 0x29:
RabbitizerInstructionR5900_processUniqueId_MMI_3(self);
break;
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
#undef RABBITIZER_DEF_INSTR_ID
#undef RABBITIZER_DEF_INSTR_ID_ALTNAME
void RabbitizerInstructionR5900_processUniqueId(RabbitizerInstruction *self) {
uint32_t opcode = RAB_INSTR_GET_opcode(self);
self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode);
switch (opcode) {
default:
RabbitizerInstructionR5900_processUniqueId_Normal(self);
break;
case 0x00:
RabbitizerInstructionR5900_processUniqueId_Special(self);
break;
case 0x01:
RabbitizerInstructionR5900_processUniqueId_Regimm(self);
break;
case 0x10:
RabbitizerInstructionR5900_processUniqueId_Coprocessor0(self);
break;
case 0x11:
RabbitizerInstructionR5900_processUniqueId_Coprocessor1(self);
break;
case 0x12:
RabbitizerInstructionR5900_processUniqueId_Coprocessor2(self);
break;
case 0x1C:
RabbitizerInstructionR5900_processUniqueId_MMI(self);
break;
}
}

View File

@ -54,16 +54,3 @@ uint16_t RabbitizerInstructionRsp_GetOffsetVector(const RabbitizerInstruction *s
return offset;
}
}
uint8_t RabbitizerInstructionRsp_processVectorElement(UNUSED const RabbitizerInstruction *self, uint8_t element) {
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

@ -5,198 +5,61 @@
#include "common/RabbitizerConfig.h"
#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \
case (caseBits): \
self->uniqueId = RABBITIZER_INSTR_ID_##prefix##_##name; \
break;
#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__)
// NOLINTBEGIN(readability-magic-numbers)
void RabbitizerInstructionRsp_processUniqueId_Normal_Lwc2(RabbitizerInstruction *self) {
uint32_t rd = RAB_INSTR_GET_rd(self);
self->_mandatorybits = RAB_INSTR_PACK_rd(self->_mandatorybits, rd);
switch (rd) {
#include "instructions/instr_id/rsp/rsp_normal_lwc2.inc"
}
}
void RabbitizerInstructionRsp_processUniqueId_Normal_Swc2(RabbitizerInstruction *self) {
uint32_t rd = RAB_INSTR_GET_rd(self);
uint32_t elementlow;
self->_mandatorybits = RAB_INSTR_PACK_rd(self->_mandatorybits, rd);
switch (rd) {
#include "instructions/instr_id/rsp/rsp_normal_swc2.inc"
}
switch (self->uniqueId) {
case RABBITIZER_INSTR_ID_rsp_suv:
elementlow = RAB_INSTR_RSP_GET_elementlow(self);
self->_mandatorybits = RAB_INSTR_RSP_PACK_elementlow(self->_mandatorybits, elementlow);
if (elementlow != 0) {
self->uniqueId = RABBITIZER_INSTR_ID_rsp_swv;
}
break;
default:
break;
}
}
void RabbitizerInstructionRsp_processUniqueId_Normal(RabbitizerInstruction *self) {
uint32_t opcode = RAB_INSTR_GET_opcode(self);
uint32_t rd;
uint32_t elementlow;
self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode);
switch (opcode) {
case 0b000010:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_j;
break;
case 0b000011:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_jal;
break;
case 0b000100:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_beq;
break;
case 0b000101:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_bne;
break;
case 0b000110:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_blez;
break;
case 0b000111:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_bgtz;
break;
case 0b001000:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_addi;
break;
case 0b001001:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_addiu;
break;
case 0b001010:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_slti;
break;
case 0b001011:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_sltiu;
break;
case 0b001100:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_andi;
break;
case 0b001101:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_ori;
break;
case 0b001110:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_xori;
break;
case 0b001111:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_lui;
break;
case 0b100000:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_lb;
break;
case 0b100001:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_lh;
break;
case 0b100011:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_lw;
break;
case 0b100100:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_lbu;
break;
case 0b100101:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_lhu;
break;
case 0b101000:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_sb;
break;
case 0b101001:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_sh;
break;
case 0b101011:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_sw;
break;
case 0b101111:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_cache;
break;
case 0b110001:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_lwc1;
break;
case 0b110011:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_pref;
break;
case 0b111001:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_swc1;
break;
default:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID;
break;
#include "instructions/instr_id/rsp/rsp_normal.inc"
// new rsp stuff
case 0b111010:
rd = RAB_INSTR_GET_rd(self);
self->_mandatorybits = RAB_INSTR_PACK_rd(self->_mandatorybits, rd);
switch (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:
elementlow = RAB_INSTR_RSP_GET_elementlow(self);
self->_mandatorybits = RAB_INSTR_RSP_PACK_elementlow(self->_mandatorybits, elementlow);
if (elementlow == 0) {
self->uniqueId = RABBITIZER_INSTR_ID_rsp_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;
}
case 0x32:
RabbitizerInstructionRsp_processUniqueId_Normal_Lwc2(self);
break;
case 0b110010:
rd = RAB_INSTR_GET_rd(self);
self->_mandatorybits = RAB_INSTR_PACK_rd(self->_mandatorybits, rd);
switch (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;
}
case 0x3A:
RabbitizerInstructionRsp_processUniqueId_Normal_Swc2(self);
break;
}
@ -229,76 +92,7 @@ void RabbitizerInstructionRsp_processUniqueId_Special(RabbitizerInstruction *sel
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
case 0b000000:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_sll;
break;
case 0b000010:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_srl;
break;
case 0b000011:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_sra;
break;
case 0b000100:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_sllv;
break;
case 0b000110:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_srlv;
break;
case 0b000111:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_srav;
break;
case 0b001000:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_jr;
break;
case 0b001001:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_jalr;
break;
case 0b001010:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_movz;
break;
case 0b001011:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_movn;
break;
case 0b001101:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_break;
break;
case 0b100000:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_add;
break;
case 0b100001:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_addu;
break;
case 0b100010:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_sub;
break;
case 0b100011:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_subu;
break;
case 0b100100:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_and;
break;
case 0b100101:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_or;
break;
case 0b100110:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_xor;
break;
case 0b100111:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_nor;
break;
case 0b101010:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_slt;
break;
case 0b101011:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_sltu;
break;
default:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID;
break;
#include "instructions/instr_id/rsp/rsp_special.inc"
}
if (RabbitizerInstruction_isNop(self)) {
@ -340,23 +134,7 @@ void RabbitizerInstructionRsp_processUniqueId_Regimm(RabbitizerInstruction *self
self->_mandatorybits = RAB_INSTR_PACK_rt(self->_mandatorybits, rt);
switch (rt) {
case 0b00000:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_bltz;
break;
case 0b00001:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_bgez;
break;
case 0b10000:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_bltzal;
break;
case 0b10001:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_bgezal;
break;
default:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID;
break;
#include "instructions/instr_id/rsp/rsp_regimm.inc"
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
@ -368,207 +146,55 @@ void RabbitizerInstructionRsp_processUniqueId_Coprocessor0(RabbitizerInstruction
self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt);
switch (fmt) {
case 0b00000:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_mfc0;
break;
case 0b00100:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_mtc0;
break;
default:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID;
break;
#include "instructions/instr_id/cpu/cpu_cop0.inc"
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
void RabbitizerInstructionRsp_processUniqueId_Coprocessor2(RabbitizerInstruction *self) {
void RabbitizerInstructionRsp_processUniqueId_Coprocessor2_Vu(RabbitizerInstruction *self) {
uint32_t aux = SHIFTR(self->word, 25, 1);
uint32_t elementhigh;
uint32_t function;
uint32_t function = RAB_INSTR_GET_function(self);
if (aux != 1) {
return;
}
// TODO: name this bit range
self->_mandatorybits = BITREPACK(self->_mandatorybits, aux, 25, 1);
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
if (aux == 0) {
elementhigh = RAB_INSTR_RSP_GET_elementhigh(self);
self->_mandatorybits = RAB_INSTR_RSP_PACK_elementhigh(self->_mandatorybits, elementhigh);
switch (elementhigh) {
case 0b00000:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_mfc2;
break;
switch (function) {
#include "instructions/instr_id/rsp/rsp_cop2_vu.inc"
}
}
case 0b00100:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_mtc2;
break;
void RabbitizerInstructionRsp_processUniqueId_Coprocessor2(RabbitizerInstruction *self) {
uint32_t fmt = RAB_INSTR_GET_fmt(self);
case 0b00010:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_cfc2;
break;
self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt);
case 0b00110:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_ctc2;
break;
switch (fmt) {
#include "instructions/instr_id/cpu/cpu_cop0.inc"
default:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID;
break;
}
} else {
function = RAB_INSTR_GET_function(self);
self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function);
switch (function) {
case 0x00:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmulf;
break;
case 0x01:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmulu;
break;
case 0b000010:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vrndp;
break;
case 0b000011:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmulq;
break;
case 0x04:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmudl;
break;
case 0x05:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmudm;
break;
case 0x06:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmudn;
break;
case 0x07:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmudh;
break;
case 0x08:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmacf;
break;
case 0x09:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmacu;
break;
case 0b001010:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vrndn;
break;
case 0b001011:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmacq;
break;
case 0x0C:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmadl;
break;
case 0x0D:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmadm;
break;
case 0x0E:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmadn;
break;
case 0x0F:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmadh;
break;
case 0x10:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vadd;
break;
case 0b010001:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vsub;
break;
case 0b010011:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vabs;
break;
case 0x14:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vaddc;
break;
case 0b010101:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vsubc;
break;
case 0x1D:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vsar;
break;
case 0x28:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vand;
break;
case 0x29:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vnand;
break;
case 0x2A:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vor;
break;
case 0x2B:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vnor;
break;
case 0x2C:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vxor;
break;
case 0x2D:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vnxor;
break;
case 0x20:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vlt;
break;
case 0x21:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_veq;
break;
case 0x22:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vne;
break;
case 0x23:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vge;
break;
case 0x24:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vcl;
break;
case 0x25:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vch;
break;
case 0x26:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vcr;
break;
case 0x27:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmrg;
break;
case 0b110000:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vrcp;
break;
case 0b110001:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vrcpl;
break;
case 0b110010:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vrcph;
break;
case 0b110011:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vmov;
break;
case 0b110100:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vrsq;
break;
case 0b110101:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vrsql;
break;
case 0b110110:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vrsqh;
break;
case 0b110111:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_vnop;
break;
default:
self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID;
break;
}
default:
RabbitizerInstructionRsp_processUniqueId_Coprocessor2_Vu(self);
break;
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
#undef RABBITIZER_DEF_INSTR_ID
#undef RABBITIZER_DEF_INSTR_ID_ALTNAME
void RabbitizerInstructionRsp_processUniqueId(RabbitizerInstruction *self) {
uint32_t opcode = RAB_INSTR_GET_opcode(self);
self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode);
self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID;
switch (opcode) {
default:
RabbitizerInstructionRsp_processUniqueId_Normal(self);
@ -590,5 +216,3 @@ void RabbitizerInstructionRsp_processUniqueId(RabbitizerInstruction *self) {
break;
}
}
// NOLINTEND(readability-magic-numbers)

View File

@ -46,6 +46,8 @@ const char *RabbitizerRegister_Cop2_Names[][2] = {
#include "instructions/registers/RabbitizerRegister_Cop2.inc"
};
/* RSP */
const char *RabbitizerRegister_RspGpr_Names[][2] = {
#include "instructions/registers/RabbitizerRegister_RspGpr.inc"
};
@ -54,10 +56,32 @@ const char *RabbitizerRegister_RspCop0_Names[][2] = {
#include "instructions/registers/RabbitizerRegister_RspCop0.inc"
};
const char *RabbitizerRegister_RspCop2_Names[][2] = {
#include "instructions/registers/RabbitizerRegister_RspCop2.inc"
};
const char *RabbitizerRegister_RspCop2Control_Names[][2] = {
#include "instructions/registers/RabbitizerRegister_RspCop2Control.inc"
};
const char *RabbitizerRegister_RspVector_Names[][2] = {
#include "instructions/registers/RabbitizerRegister_RspVector.inc"
};
/* RSP */
/* R5900 */
const char *RabbitizerRegister_R5900VF_Names[][2] = {
#include "instructions/registers/RabbitizerRegister_R5900VF.inc"
};
const char *RabbitizerRegister_R5900VI_Names[][2] = {
#include "instructions/registers/RabbitizerRegister_R5900VI.inc"
};
/* R5900 */
const char *RabbitizerRegister_getNameGpr(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_GprO32_Names));
@ -126,8 +150,32 @@ const char *RabbitizerRegister_getNameRspCop0(uint8_t regValue) {
[RabbitizerConfig_Cfg.regNames.namedRegisters && RabbitizerConfig_Cfg.regNames.vr4300RspCop0NamedRegisters ? 1 : 0];
}
const char *RabbitizerRegister_getNameRspCop2(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_RspCop2_Names));
return RabbitizerRegister_RspCop2_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0];
}
const char *RabbitizerRegister_getNameRspCop2Control(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_RspCop2Control_Names));
return RabbitizerRegister_RspCop2Control_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0];
}
const char *RabbitizerRegister_getNameRspVector(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_RspVector_Names));
return RabbitizerRegister_RspVector_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0];
}
const char *RabbitizerRegister_getNameR5900VF(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R5900VF_Names));
return RabbitizerRegister_R5900VF_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0];
}
const char *RabbitizerRegister_getNameR5900VI(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R5900VI_Names));
return RabbitizerRegister_R5900VI_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0];
}