Fix some instructions missing their corresponding AccessType

This commit is contained in:
angie 2024-10-13 11:54:05 -03:00
parent 21a849cfd3
commit 02302f29b6
13 changed files with 119 additions and 58 deletions

View File

@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Fixed
- Fix some instructions missing their corresponding AccessType.
## [1.12.0] - 2024-07-21
### Added

View File

@ -4,7 +4,7 @@
[package]
name = "rabbitizer"
# Version should be synced with include/common/RabbitizerVersion.h
version = "1.12.0"
version = "1.12.1"
edition = "2021"
authors = ["Anghelo Carvajal <angheloalf95@gmail.com>"]
description = "MIPS instruction decoder"

View File

@ -12,8 +12,13 @@ enum class AccessType {
SHORT,
WORD,
DOUBLEWORD,
QUADWORD,
FLOAT,
DOUBLEFLOAT,
WORD_LEFT,
WORD_RIGHT,
DOUBLEWORD_LEFT,
DOUBLEWORD_RIGHT,
MAX,
};

View File

@ -12,8 +12,13 @@ typedef enum RabbitizerAccessType {
RAB_ACCESSTYPE_SHORT,
RAB_ACCESSTYPE_WORD,
RAB_ACCESSTYPE_DOUBLEWORD,
RAB_ACCESSTYPE_QUADWORD,
RAB_ACCESSTYPE_FLOAT,
RAB_ACCESSTYPE_DOUBLEFLOAT,
RAB_ACCESSTYPE_WORD_LEFT,
RAB_ACCESSTYPE_WORD_RIGHT,
RAB_ACCESSTYPE_DOUBLEWORD_LEFT,
RAB_ACCESSTYPE_DOUBLEWORD_RIGHT,
RAB_ACCESSTYPE_MAX,
} RabbitizerAccessType;

View File

@ -28,39 +28,39 @@ const RabbitizerInstrDescriptor RabbitizerInstrDescriptor_Descriptors[] = {
[RABBITIZER_INSTR_ID_cpu_daddi] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true },
[RABBITIZER_INSTR_ID_cpu_daddiu] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true },
[RABBITIZER_INSTR_ID_cpu_lui] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeHi=true },
[RABBITIZER_INSTR_ID_cpu_ldl] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_cpu_ldr] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_cpu_ldl] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_DOUBLEWORD_LEFT },
[RABBITIZER_INSTR_ID_cpu_ldr] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_DOUBLEWORD_RIGHT },
[RABBITIZER_INSTR_ID_cpu_lb] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_BYTE },
[RABBITIZER_INSTR_ID_cpu_lh] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_SHORT },
[RABBITIZER_INSTR_ID_cpu_lwl] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_cpu_lwl] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_WORD_LEFT },
[RABBITIZER_INSTR_ID_cpu_lw] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_WORD },
[RABBITIZER_INSTR_ID_cpu_lbu] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_BYTE, .doesUnsignedMemoryAccess=true },
[RABBITIZER_INSTR_ID_cpu_lhu] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_SHORT, .doesUnsignedMemoryAccess=true },
[RABBITIZER_INSTR_ID_cpu_lwr] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_cpu_lwr] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_WORD_RIGHT },
[RABBITIZER_INSTR_ID_cpu_lwu] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_WORD, .doesUnsignedMemoryAccess=true },
[RABBITIZER_INSTR_ID_cpu_sb] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_BYTE },
[RABBITIZER_INSTR_ID_cpu_sh] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_SHORT },
[RABBITIZER_INSTR_ID_cpu_swl] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .canBeLo=true, .doesDereference=true, .doesStore=true },
[RABBITIZER_INSTR_ID_cpu_swl] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_WORD_LEFT },
[RABBITIZER_INSTR_ID_cpu_sw] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_WORD },
[RABBITIZER_INSTR_ID_cpu_sdl] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .canBeLo=true, .doesDereference=true, .doesStore=true },
[RABBITIZER_INSTR_ID_cpu_sdr] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .canBeLo=true, .doesDereference=true, .doesStore=true },
[RABBITIZER_INSTR_ID_cpu_swr] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .canBeLo=true, .doesDereference=true, .doesStore=true },
[RABBITIZER_INSTR_ID_cpu_ll] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .notEmittedByCompilers=true, .canBeLo=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_cpu_sdl] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_DOUBLEWORD_LEFT },
[RABBITIZER_INSTR_ID_cpu_sdr] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_DOUBLEWORD_RIGHT },
[RABBITIZER_INSTR_ID_cpu_swr] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_WORD_RIGHT },
[RABBITIZER_INSTR_ID_cpu_ll] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .notEmittedByCompilers=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_WORD },
[RABBITIZER_INSTR_ID_cpu_pref] = { .operands={RAB_OPERAND_cpu_hint, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true },
[RABBITIZER_INSTR_ID_cpu_lld] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .notEmittedByCompilers=true, .canBeLo=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_cpu_lld] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .notEmittedByCompilers=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_DOUBLEWORD },
[RABBITIZER_INSTR_ID_cpu_ld] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_DOUBLEWORD },
[RABBITIZER_INSTR_ID_cpu_sc] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .notEmittedByCompilers=true, .canBeLo=true, .doesDereference=true, .doesStore=true },
[RABBITIZER_INSTR_ID_cpu_scd] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .notEmittedByCompilers=true, .canBeLo=true, .doesDereference=true, .doesStore=true },
[RABBITIZER_INSTR_ID_cpu_sc] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .notEmittedByCompilers=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_WORD },
[RABBITIZER_INSTR_ID_cpu_scd] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .notEmittedByCompilers=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_DOUBLEWORD },
[RABBITIZER_INSTR_ID_cpu_sd] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_DOUBLEWORD },
[RABBITIZER_INSTR_ID_cpu_cache] = { .operands={RAB_OPERAND_cpu_op, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .notEmittedByCompilers=true },
[RABBITIZER_INSTR_ID_cpu_lwc1] = { .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .readsRs=true, .modifiesFt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_FLOAT },
[RABBITIZER_INSTR_ID_cpu_ldc1] = { .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .isDouble=true, .readsRs=true, .modifiesFt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_DOUBLEFLOAT },
[RABBITIZER_INSTR_ID_cpu_swc1] = { .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .readsRs=true, .readsFt=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_FLOAT },
[RABBITIZER_INSTR_ID_cpu_sdc1] = { .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .isDouble=true, .readsRs=true, .readsFt=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_DOUBLEFLOAT },
[RABBITIZER_INSTR_ID_cpu_lwc2] = { .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_cpu_ldc2] = { .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_cpu_swc2] = { .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesStore=true },
[RABBITIZER_INSTR_ID_cpu_sdc2] = { .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesStore=true },
[RABBITIZER_INSTR_ID_cpu_lwc2] = { .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_WORD },
[RABBITIZER_INSTR_ID_cpu_ldc2] = { .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_DOUBLEWORD },
[RABBITIZER_INSTR_ID_cpu_swc2] = { .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_WORD },
[RABBITIZER_INSTR_ID_cpu_sdc2] = { .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_DOUBLEWORD },
[RABBITIZER_INSTR_ID_cpu_b] = { .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true },
[RABBITIZER_INSTR_ID_cpu_beqz] = { .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .isBranch=true, .isPseudo=true },
[RABBITIZER_INSTR_ID_cpu_bnez] = { .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .isBranch=true, .isPseudo=true },
@ -776,10 +776,10 @@ const RabbitizerInstrDescriptor RabbitizerInstrDescriptor_Descriptors[] = {
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_19] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_MAX] = { .operands={0} },
[RABBITIZER_INSTR_ID_r5900_INVALID] = { .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN },
[RABBITIZER_INSTR_ID_r5900_lq] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_r5900_sq] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .canBeLo=true, .doesDereference=true, .doesStore=true },
[RABBITIZER_INSTR_ID_r5900_lqc2] = { .operands={RAB_OPERAND_r5900_vft, RAB_OPERAND_cpu_immediate_base}, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_r5900_sqc2] = { .operands={RAB_OPERAND_r5900_vft, RAB_OPERAND_cpu_immediate_base}, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesStore=true },
[RABBITIZER_INSTR_ID_r5900_lq] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_QUADWORD },
[RABBITIZER_INSTR_ID_r5900_sq] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true, .readsRt=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_QUADWORD },
[RABBITIZER_INSTR_ID_r5900_lqc2] = { .operands={RAB_OPERAND_r5900_vft, RAB_OPERAND_cpu_immediate_base}, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_QUADWORD },
[RABBITIZER_INSTR_ID_r5900_sqc2] = { .operands={RAB_OPERAND_r5900_vft, RAB_OPERAND_cpu_immediate_base}, .readsRs=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .accessType=RAB_ACCESSTYPE_QUADWORD },
[RABBITIZER_INSTR_ID_r5900_sync_p] = { .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r5900_mult] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .readsRs=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r5900_mfsa] = { .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true },
@ -1030,14 +1030,14 @@ const RabbitizerInstrDescriptor RabbitizerInstrDescriptor_Descriptors[] = {
[RABBITIZER_INSTR_ID_r5900_vrget] = { .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_R}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true },
[RABBITIZER_INSTR_ID_r5900_vrinit] = { .operands={RAB_OPERAND_r5900_R, RAB_OPERAND_r5900_vfsl} },
[RABBITIZER_INSTR_ID_r5900_vrxor] = { .operands={RAB_OPERAND_r5900_R, RAB_OPERAND_r5900_vfsl} },
[RABBITIZER_INSTR_ID_r5900_vilwr_w] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_r5900_vilwr_z] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_r5900_vilwr_y] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_r5900_vilwr_x] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_r5900_viswr_w] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_r5900_viswr_z] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_r5900_viswr_y] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_r5900_viswr_x] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true },
[RABBITIZER_INSTR_ID_r5900_vilwr_w] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_WORD },
[RABBITIZER_INSTR_ID_r5900_vilwr_z] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_WORD },
[RABBITIZER_INSTR_ID_r5900_vilwr_y] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_WORD },
[RABBITIZER_INSTR_ID_r5900_vilwr_x] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_WORD },
[RABBITIZER_INSTR_ID_r5900_viswr_w] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_WORD },
[RABBITIZER_INSTR_ID_r5900_viswr_z] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_WORD },
[RABBITIZER_INSTR_ID_r5900_viswr_y] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_WORD },
[RABBITIZER_INSTR_ID_r5900_viswr_x] = { .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis}, .isFloat=true, .doesDereference=true, .doesLoad=true, .accessType=RAB_ACCESSTYPE_WORD },
[RABBITIZER_INSTR_ID_r5900_USERDEF_00] = { .operands={0} },
[RABBITIZER_INSTR_ID_r5900_USERDEF_01] = { .operands={0} },
[RABBITIZER_INSTR_ID_r5900_USERDEF_02] = { .operands={0} },

View File

@ -4,7 +4,7 @@
[project]
name = "rabbitizer"
# Version should be synced with include/common/RabbitizerVersion.h
version = "1.12.0"
version = "1.12.1"
description = "MIPS instruction decoder"
# license = "MIT"
readme = "README.md"

View File

@ -13,6 +13,11 @@ class AccessType:
SHORT: Enum
WORD: Enum
DOUBLEWORD: Enum
QUADWORD: Enum
FLOAT: Enum
DOUBLEFLOAT: Enum
WORD_LEFT: Enum
WORD_RIGHT: Enum
DOUBLEWORD_LEFT: Enum
DOUBLEWORD_RIGHT: Enum
MAX: Enum

View File

@ -12,7 +12,12 @@ pub enum AccessType {
SHORT,
WORD,
DOUBLEWORD,
QUADWORD,
FLOAT,
DOUBLEFLOAT,
WORD_LEFT,
WORD_RIGHT,
DOUBLEWORD_LEFT,
DOUBLEWORD_RIGHT,
MAX,
}

View File

@ -7,5 +7,10 @@
RAB_DEF_ACCESSTYPE(SHORT)
RAB_DEF_ACCESSTYPE(WORD)
RAB_DEF_ACCESSTYPE(DOUBLEWORD)
RAB_DEF_ACCESSTYPE(QUADWORD)
RAB_DEF_ACCESSTYPE(FLOAT)
RAB_DEF_ACCESSTYPE(DOUBLEFLOAT)
RAB_DEF_ACCESSTYPE(WORD_LEFT)
RAB_DEF_ACCESSTYPE(WORD_RIGHT)
RAB_DEF_ACCESSTYPE(DOUBLEWORD_LEFT)
RAB_DEF_ACCESSTYPE(DOUBLEWORD_RIGHT)

View File

@ -198,7 +198,8 @@
.readsRs=true,
.canBeLo=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_DOUBLEWORD_LEFT
) // Load Doubleword Left
RABBITIZER_DEF_INSTR_ID(
cpu, 0x1B, ldr,
@ -208,7 +209,8 @@
.readsRs=true,
.canBeLo=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_DOUBLEWORD_RIGHT
) // Load Doubleword Right
RABBITIZER_DEF_INSTR_ID(
cpu, 0x20, lb,
@ -240,7 +242,8 @@
.readsRs=true,
.canBeLo=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_WORD_LEFT
) // Load Word Left
RABBITIZER_DEF_INSTR_ID(
cpu, 0x23, lw,
@ -285,7 +288,8 @@
.readsRs=true,
.canBeLo=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_WORD_RIGHT
) // Load Word Right
RABBITIZER_DEF_INSTR_ID(
cpu, 0x27, lwu,
@ -329,7 +333,8 @@
.readsRt=true,
.canBeLo=true,
.doesDereference=true,
.doesStore=true
.doesStore=true,
.accessType=RAB_ACCESSTYPE_WORD_LEFT
) // Store Word Left
RABBITIZER_DEF_INSTR_ID(
cpu, 0x2B, sw,
@ -350,7 +355,8 @@
.readsRt=true,
.canBeLo=true,
.doesDereference=true,
.doesStore=true
.doesStore=true,
.accessType=RAB_ACCESSTYPE_DOUBLEWORD_LEFT
) // Store Doubleword Left
RABBITIZER_DEF_INSTR_ID(
cpu, 0x2D, sdr,
@ -360,7 +366,8 @@
.readsRt=true,
.canBeLo=true,
.doesDereference=true,
.doesStore=true
.doesStore=true,
.accessType=RAB_ACCESSTYPE_DOUBLEWORD_RIGHT
) // Store Doubleword Right
RABBITIZER_DEF_INSTR_ID(
cpu, 0x2E, swr,
@ -370,7 +377,8 @@
.readsRt=true,
.canBeLo=true,
.doesDereference=true,
.doesStore=true
.doesStore=true,
.accessType=RAB_ACCESSTYPE_WORD_RIGHT
) // Store Word Right
RABBITIZER_DEF_INSTR_ID(
cpu, 0x30, ll,
@ -381,7 +389,8 @@
.notEmittedByCompilers=true,
.canBeLo=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_WORD
) // Load Linked word
RABBITIZER_DEF_INSTR_ID(
cpu, 0x33, pref,
@ -398,7 +407,8 @@
.notEmittedByCompilers=true,
.canBeLo=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_DOUBLEWORD
) // Load Linked Doubleword
RABBITIZER_DEF_INSTR_ID(
cpu, 0x37, ld,
@ -420,7 +430,8 @@
.notEmittedByCompilers=true,
.canBeLo=true,
.doesDereference=true,
.doesStore=true
.doesStore=true,
.accessType=RAB_ACCESSTYPE_WORD
) // Store Conditional word
RABBITIZER_DEF_INSTR_ID(
cpu, 0x3C, scd,
@ -431,7 +442,8 @@
.notEmittedByCompilers=true,
.canBeLo=true,
.doesDereference=true,
.doesStore=true
.doesStore=true,
.accessType=RAB_ACCESSTYPE_DOUBLEWORD
) // Store Conditional Doubleword
RABBITIZER_DEF_INSTR_ID(
cpu, 0x3F, sd,
@ -514,7 +526,8 @@
.readsRs=true,
.canBeLo=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_WORD
) // Load Word to Coprocessor z
RABBITIZER_DEF_INSTR_ID(
cpu, 0x36, ldc2,
@ -523,7 +536,8 @@
.readsRs=true,
.canBeLo=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_DOUBLEWORD
) // Load Doubleword to Coprocessor z
RABBITIZER_DEF_INSTR_ID(
cpu, 0x3A, swc2,
@ -532,7 +546,8 @@
.readsRs=true,
.canBeLo=true,
.doesDereference=true,
.doesStore=true
.doesStore=true,
.accessType=RAB_ACCESSTYPE_WORD
) // Store Word from Coprocessor z
RABBITIZER_DEF_INSTR_ID(
cpu, 0x3E, sdc2,
@ -541,7 +556,8 @@
.readsRs=true,
.canBeLo=true,
.doesDereference=true,
.doesStore=true
.doesStore=true,
.accessType=RAB_ACCESSTYPE_DOUBLEWORD
) // Store Doubleword from Coprocessor z

View File

@ -30,28 +30,32 @@
.operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis},
.isFloat=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_WORD
) // Integer load word register
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r5900, (0x02 << 2) | 0x02, vilwr_z, vilwr.z,
.operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis},
.isFloat=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_WORD
) // Integer load word register
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r5900, (0x04 << 2) | 0x02, vilwr_y, vilwr.y,
.operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis},
.isFloat=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_WORD
) // Integer load word register
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r5900, (0x08 << 2) | 0x02, vilwr_x, vilwr.x,
.operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis},
.isFloat=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_WORD
) // Integer load word register
RABBITIZER_DEF_INSTR_ID_ALTNAME(
@ -59,26 +63,30 @@
.operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis},
.isFloat=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_WORD
) // Integer store word register
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r5900, (0x02 << 2) | 0x03, viswr_z, viswr.z,
.operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis},
.isFloat=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_WORD
) // Integer store word register
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r5900, (0x04 << 2) | 0x03, viswr_y, viswr.y,
.operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis},
.isFloat=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_WORD
) // Integer store word register
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r5900, (0x08 << 2) | 0x03, viswr_x, viswr.x,
.operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis_parenthesis},
.isFloat=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_WORD
) // Integer store word register

View File

@ -31,7 +31,8 @@
.readsRs=true,
.canBeLo=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_QUADWORD
) // Load Quadword
RABBITIZER_DEF_INSTR_ID(
r5900, 0x1F, sq,
@ -41,7 +42,8 @@
.readsRt=true,
.canBeLo=true,
.doesDereference=true,
.doesStore=true
.doesStore=true,
.accessType=RAB_ACCESSTYPE_QUADWORD
) // Store Quadword
RABBITIZER_DEF_INSTR_ID(
@ -50,7 +52,8 @@
.readsRs=true,
.canBeLo=true,
.doesDereference=true,
.doesLoad=true
.doesLoad=true,
.accessType=RAB_ACCESSTYPE_QUADWORD
)
RABBITIZER_DEF_INSTR_ID(
@ -59,5 +62,6 @@
.readsRs=true,
.canBeLo=true,
.doesDereference=true,
.doesStore=true
.doesStore=true,
.accessType=RAB_ACCESSTYPE_QUADWORD
)

View File

@ -87,6 +87,10 @@ int main() {
// A instruction should not have both doesLoad and doesStore
LOGIC_ERROR(uniqueId, errorCount, !(descriptor->doesLoad && descriptor->doesStore));
// A dereference must do a non INVALID memory access
LOGIC_ERROR(uniqueId, errorCount, !(descriptor->doesDereference ^ (descriptor->accessType != RAB_ACCESSTYPE_INVALID)));
LOGIC_ERROR_A_IMPLIES_B(uniqueId, errorCount, descriptor->doesUnsignedMemoryAccess, descriptor->doesDereference);
switch (uniqueId) {
case RABBITIZER_INSTR_ID_cpu_move:
case RABBITIZER_INSTR_ID_rsp_move: