ALLEGREX support (#60)

* setup ALLEGREX

* more setup

* clo

* fix

* Implement SPECIAL_RS and SPECIAL_SA instructions

* more table placeholders

* Implement bshfl instructions

* Rename to R4000Allegrex

* Implement SPECIAL instructions

* Add tests

* Remove some duplicated tests

* Implement SPECIAL3 instructions

* fix bug in test

* update

* Implement COPz

* Implement SPECIAL2 instructions

* Implement COP1

* Yeet cop3

* som tests

* bvf, bvfl, bvt, bvtl

* fix bshfl prefix

* need to implement the vfpu registers

* implement vt_7?

* R4000AllegrexVF -> R4000AllegrexVScalar

* Add test suite to compare with the sn toolchain decoding

* more vfpu test cases

* forgor this

* I can't decide how to name these registers

* Prepare tables for all register types

* Fix typo

* Implement vector scalar register operands

* Implement quad registers

* Fix tests?

* svl.q, svr.q

* Implement a bunch of vfpu0 instructions

* implement registers for `.t` and `.p` instructions

* Implement VFPU1 instructions

* bleh

* VFPU1, VFPU3 and `vcmp.`

* Fix wrong register type on some instructions

* start vfpu3

* Implement VFPU3 instructions

* start categorizing VFPU4

* Categorize VFPU5

* VFPU6 identification

* Identify VFPU7

* COP2 is weird

* organize COP2 a bit

* Add test cases for VFPU4 FMT

* VFPU4 FMT2 stuff

* VFPU4 FMT3 stuff

* VFPU5 stuff

* VFPU6 stuff

* VFPU7 stuff

* Implement COP2 instructions

* Implement vmov, vabs and vneg

* VPFU4 FMT0 FMT0 FMT0 implemented

* VFPU FMT0 FMT0 FMT2

* vnrcp, vnsin, vrexp2

* vrnds, vrndi, vrndf1, vrndf2

* Change tests a bit

* vf2h, vh2f, vsbz, vlgb

* vuc2ifs, vc2i, vus2i, vs2i, vi2uc, vi2c, vi2us, vi2s

* vsrt1, vsrt2, vbfy1, vbfy2, vocp, vsocp, vfad, vavg

* vsrt3, vsrt4, vsgn

* vmfvc and vmtvc placeholders

* vt4444, vt5551, vt5650

* vcst placeholder

* vf2in

* vf2iz

* vf2iu, vf2id, vi2f

* vcmovt, vcmovf

* vwbn.s, viim.s, vfim.s

* vpfxs, vpfxt, vpfxd, vnop, vsync, vflush

* vmmov, vmidt, vmzero, vmone

* vrot

* vmmul, vhtfm2, vtfm2, vhtfm3, vtfm3, vhtfm4, vtfm4, vmscl, vcrsp, vqmul

* Implement matrix operands

* fix matrix operands

* Fix `illegal` tests

* hack out a way to check the test cases are assemblable

* test-fixing: branches

* fix more test cases

* fix vmfvc and vmtvc

* more test fixing

* vdiv and fix operand R323

* more test fixing

* Fix matrix operands

* implement vcmp comparisons

* fix vsync2

* vsqrt and vrndf1 fixes

* Implement "constant" operand for `vcst`

* Add missing operand of vf2in, vf2iz, vf2iu, vf2id, vi2f

* Add missing vcmovt and vcmovf operands

* Add missing vwbn operand

* Tests cases for vmmul

* Fix vtfm2

* Implement "transpose matrix register"

* Add placeholders for the remaining missing operands

* Implement viim operand

* Implement vrot code operand

* placeholders for rp and wp operands

* test cases for vpfxs, vpfxt and vpfxd

* Properly implement rpx, rpy, rpz and rpw

* Properly implement wpx, wpy, wpz and wpw operands

* Implement vfim

* changelog

* readme

* some cleanup

* Restructure some tables

* more table restructure

* fix tests

* more table yeeting

* more cleanup

* more cleanup

* reanming

* moar

* fmt
This commit is contained in:
Anghelo Carvajal 2024-04-22 13:15:58 -04:00 committed by GitHub
parent 9bf73dd20b
commit b51b62da45
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
154 changed files with 44120 additions and 32 deletions

View File

@ -149,6 +149,48 @@ jobs:
- name: Run instruction check - r3000gte_disasm
run: ./build/tests/c/instruction_checks/r3000gte_disasm.elf
instruction_checks_r4000allegrex_disasm:
name: Test - instruction_checks_r4000allegrex_disasm
needs: [build_repo]
runs-on: ubuntu-latest
steps:
- name: Checkout reposistory
uses: actions/checkout@v4
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
name: artifact
path: build/
- name: Make tests executable
run: chmod --recursive +x build/
- name: Run instruction check - r4000allegrex_disasm
run: ./build/tests/c/instruction_checks/r4000allegrex_disasm.elf
instruction_checks_r4000allegrex_vfpu_disasm:
name: Test - instruction_checks_r4000allegrex_vfpu_disasm
needs: [build_repo]
runs-on: ubuntu-latest
steps:
- name: Checkout reposistory
uses: actions/checkout@v4
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
name: artifact
path: build/
- name: Make tests executable
run: chmod --recursive +x build/
- name: Run instruction check - r4000allegrex_vfpu_disasm
run: ./build/tests/c/instruction_checks/r4000allegrex_vfpu_disasm.elf
instruction_checks_r5900_trunc_cvt:
name: Test - instruction_checks_r5900_trunc_cvt
needs: [build_repo]

View File

@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Added
- Add PSP's ALLEGREX instruction set support.
- The global `regNames.r4000AllegrexVfpuControlNamedRegisters` option controls
if named registers should be used for the VFPU control registers of the R4000
ALLEGREX.
- `Utils.floatRepr_32From16` function.
- Converts a half float to a single precision float.
- Both the argument and the return value correspond to their hex
representation instead of an actual float.
### Changed
- Cleanups in tests code.

View File

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

View File

@ -72,7 +72,7 @@ CXX_FILES := $(foreach dir,$(SRCXX_DIRS),$(wildcard $(dir)/*.cpp))
HXX_FILES := $(foreach dir,$(IINC_XX),$(wildcard $(dir)/**/*.hpp))
OXX_FILES := $(foreach f,$(CXX_FILES:.cpp=.o),build/$f)
TESTS_DIRS := $(shell find tests -type d)
TESTS_DIRS := $(shell find tests -mindepth 1 -type d -not -path "tests/asm*")
TESTS_C := $(foreach dir,$(TESTS_DIRS),$(wildcard $(dir)/*.c))
TESTS_CXX := $(foreach dir,$(TESTS_DIRS),$(wildcard $(dir)/*.cpp))
TESTS_ELFS := $(foreach f,$(TESTS_C:.c=.elf) $(TESTS_CXX:.cpp=.elf),build/$f)

View File

@ -41,6 +41,8 @@ MIPS instruction decoder API.
- Main focus on MIPS I, II and III architectures. Partial support for MIPS IV too.
- N64 RSP instruction decoding support.
- RSP decoding has been tested to build back to matching assemblies with [armips](https://github.com/Kingcom/armips/).
- R3000 GTE (PSX's CPU) decoding support.
- R4000 ALLEGREX (PSP's CPU) decoding support.
- R5900 (PS2's Emotion Engine processor) decoding support.
## Non-features
@ -63,7 +65,7 @@ If you use a `requirements.txt` file in your repository, then you can add this
library with the following line:
```txt
rabbitizer>=1.9.5,<2.0.0
rabbitizer>=1.10.0,<2.0.0
```
### Development version
@ -72,6 +74,13 @@ The unstable development version is located at the
[develop](https://github.com/Decompollaborate/rabbitizer/tree/develop)
branch. PRs should be made into that branch instead of the main one.
Note that building the Python bindings from source require the Python
development package. Under Ubuntu/Debian based distros it can be installed with:
```bash
apt install python3-dev
```
In case you want to mess with the latest development version without wanting to
clone the repository, then you could use the following command:
@ -96,7 +105,7 @@ cargo add rabbitizer
Or you can add it manually to your `Cargo.toml`:
```toml
rabbitizer = "1.9.5"
rabbitizer = "1.10.0"
```
See this crate at <https://crates.io/crates/rabbitizer>.
@ -118,6 +127,15 @@ See this crate at <https://crates.io/crates/rabbitizer>.
- no$psx documentation: <http://problemkaputt.de/psx-spx.htm#geometrytransformationenginegte>
- <http://www.raphnet.net/electronique/psx_adaptor/Playstation.txt>
- R4000 ALLEGREX:
- ALLEGREX-Instruction_Manual-English <https://github.com/Decompollaborate/rabbitizer/files/11356332/ALLEGREX-Instruction_Manual-English.pdf>
- FPU-Instruction_Manual-English <https://github.com/Decompollaborate/rabbitizer/files/14950191/FPU-Instruction_Manual-English.pdf>
- VFPU-Instruction_Manual-English <https://github.com/Decompollaborate/rabbitizer/files/11356335/VFPU-Instruction_Manual-English.pdf>
- VFPU-Users_Manual-English <https://github.com/Decompollaborate/rabbitizer/files/11356333/VFPU-Users_Manual-English.pdf>
- yet another PlayStationPortable Documentation <http://hitmen.c02.at/files/yapspd/psp_doc/frames.html>
- Chapter "4.8 Allegrex Instructions" <http://hitmen.c02.at/files/yapspd/psp_doc/chap4.html#sec4.8>
- GNU binutils: <https://github.com/bminor/binutils-gdb/compare/011365b...a0176d8>
- R5900:
- EmotionEngine instruction decoding: <https://psi-rockin.github.io/ps2tek/#eeinstructiondecoding>
- Official documentation from Toshiba: <https://wiki.qemu.org/images/2/2a/C790.pdf>

View File

@ -40,6 +40,52 @@ enum class IdType {
R3000GTE_COP1,
R3000GTE_COP2,
R3000GTE_COP2_GTE,
R4000ALLEGREX_INVALID,
R4000ALLEGREX_NORMAL,
R4000ALLEGREX_SPECIAL,
R4000ALLEGREX_SPECIAL_RS,
R4000ALLEGREX_SPECIAL_SA,
R4000ALLEGREX_REGIMM,
R4000ALLEGREX_SPECIAL2,
R4000ALLEGREX_SPECIAL3,
R4000ALLEGREX_SPECIAL3_BSHFL,
R4000ALLEGREX_COP0,
R4000ALLEGREX_COP0_BC0,
R4000ALLEGREX_COP0_TLB,
R4000ALLEGREX_COP1,
R4000ALLEGREX_COP1_BC1,
R4000ALLEGREX_COP1_FPUS,
R4000ALLEGREX_COP1_FPUW,
R4000ALLEGREX_COP2,
R4000ALLEGREX_COP2_BC2,
R4000ALLEGREX_COP2_MFHC2,
R4000ALLEGREX_COP2_MFHC2_P,
R4000ALLEGREX_COP2_MFHC2_P_S,
R4000ALLEGREX_COP2_MTHC2,
R4000ALLEGREX_VFPU0,
R4000ALLEGREX_VFPU1,
R4000ALLEGREX_VFPU3,
R4000ALLEGREX_VFPU4,
R4000ALLEGREX_VFPU4_FMT0,
R4000ALLEGREX_VFPU4_FMT0_FMT0,
R4000ALLEGREX_VFPU4_FMT0_FMT2,
R4000ALLEGREX_VFPU4_FMT0_FMT3,
R4000ALLEGREX_VFPU4_FMT0_RND,
R4000ALLEGREX_VFPU4_FMT0_CVTFLT,
R4000ALLEGREX_VFPU4_FMT0_CVTINT,
R4000ALLEGREX_VFPU4_FMT0_FMT8,
R4000ALLEGREX_VFPU4_FMT0_FMT9,
R4000ALLEGREX_VFPU4_FMT0_CONTROL,
R4000ALLEGREX_VFPU4_FMT0_COLOR,
R4000ALLEGREX_VFPU4_FMT0_CST,
R4000ALLEGREX_VFPU4_FMT2,
R4000ALLEGREX_VFPU4_FMT2_CNDMOVE,
R4000ALLEGREX_VFPU5,
R4000ALLEGREX_VFPU6,
R4000ALLEGREX_VFPU6_FMT7,
R4000ALLEGREX_VFPU6_FMT7_FMT0,
R4000ALLEGREX_VFPU7,
R4000ALLEGREX_QUADLR,
R5900_INVALID,
R5900_NORMAL,
R5900_SPECIAL,

View File

@ -52,6 +52,63 @@ enum class OperandType {
r3000gte_v,
r3000gte_cv,
r3000gte_lm,
r4000allegrex_s_vs,
r4000allegrex_s_vt,
r4000allegrex_s_vd,
r4000allegrex_s_vt_imm,
r4000allegrex_s_vd_imm,
r4000allegrex_p_vs,
r4000allegrex_p_vt,
r4000allegrex_p_vd,
r4000allegrex_t_vs,
r4000allegrex_t_vt,
r4000allegrex_t_vd,
r4000allegrex_q_vs,
r4000allegrex_q_vt,
r4000allegrex_q_vd,
r4000allegrex_q_vt_imm,
r4000allegrex_mp_vs,
r4000allegrex_mp_vt,
r4000allegrex_mp_vd,
r4000allegrex_mp_vs_transpose,
r4000allegrex_mt_vs,
r4000allegrex_mt_vt,
r4000allegrex_mt_vd,
r4000allegrex_mt_vs_transpose,
r4000allegrex_mq_vs,
r4000allegrex_mq_vt,
r4000allegrex_mq_vd,
r4000allegrex_mq_vs_transpose,
r4000allegrex_cop2cs,
r4000allegrex_cop2cd,
r4000allegrex_pos,
r4000allegrex_size,
r4000allegrex_size_plus_pos,
r4000allegrex_imm3,
r4000allegrex_offset14_base,
r4000allegrex_offset14_base_maybe_wb,
r4000allegrex_vcmp_cond,
r4000allegrex_vcmp_cond_s_maybe_vs_maybe_vt,
r4000allegrex_vcmp_cond_p_maybe_vs_maybe_vt,
r4000allegrex_vcmp_cond_t_maybe_vs_maybe_vt,
r4000allegrex_vcmp_cond_q_maybe_vs_maybe_vt,
r4000allegrex_vconstant,
r4000allegrex_power_of_two,
r4000allegrex_vfpu_cc_bit,
r4000allegrex_bn,
r4000allegrex_int16,
r4000allegrex_float16,
r4000allegrex_p_vrot_code,
r4000allegrex_t_vrot_code,
r4000allegrex_q_vrot_code,
r4000allegrex_rpx,
r4000allegrex_rpy,
r4000allegrex_rpz,
r4000allegrex_rpw,
r4000allegrex_wpx,
r4000allegrex_wpy,
r4000allegrex_wpz,
r4000allegrex_wpw,
r5900_I,
r5900_Q,
r5900_R,

File diff suppressed because it is too large Load Diff

View File

@ -460,6 +460,320 @@ enum class UniqueId {
r3000gte_USERDEF_18,
r3000gte_USERDEF_19,
r3000gte_MAX,
r4000allegrex_INVALID,
r4000allegrex_lv_s,
r4000allegrex_sv_s,
r4000allegrex_lv_q,
r4000allegrex_sv_q,
r4000allegrex_clz,
r4000allegrex_clo,
r4000allegrex_madd,
r4000allegrex_maddu,
r4000allegrex_msub,
r4000allegrex_msubu,
r4000allegrex_max,
r4000allegrex_min,
r4000allegrex_srl,
r4000allegrex_rotr,
r4000allegrex_srlv,
r4000allegrex_rotrv,
r4000allegrex_sleep,
r4000allegrex_mfie,
r4000allegrex_mtie,
r4000allegrex_ext,
r4000allegrex_ins,
r4000allegrex_wsbh,
r4000allegrex_wsbw,
r4000allegrex_seb,
r4000allegrex_seh,
r4000allegrex_bitrev,
r4000allegrex_bvf,
r4000allegrex_bvt,
r4000allegrex_bvfl,
r4000allegrex_bvtl,
r4000allegrex_mfv,
r4000allegrex_mfvc,
r4000allegrex_vsync2,
r4000allegrex_mtv,
r4000allegrex_mtvc,
r4000allegrex_vadd_s,
r4000allegrex_vadd_p,
r4000allegrex_vadd_t,
r4000allegrex_vadd_q,
r4000allegrex_vsub_s,
r4000allegrex_vsub_p,
r4000allegrex_vsub_t,
r4000allegrex_vsub_q,
r4000allegrex_vsbn_s,
r4000allegrex_vdiv_s,
r4000allegrex_vdiv_p,
r4000allegrex_vdiv_t,
r4000allegrex_vdiv_q,
r4000allegrex_vmul_s,
r4000allegrex_vmul_p,
r4000allegrex_vmul_t,
r4000allegrex_vmul_q,
r4000allegrex_vdot_p,
r4000allegrex_vdot_t,
r4000allegrex_vdot_q,
r4000allegrex_vscl_p,
r4000allegrex_vscl_t,
r4000allegrex_vscl_q,
r4000allegrex_vhdp_p,
r4000allegrex_vhdp_t,
r4000allegrex_vhdp_q,
r4000allegrex_vcrs_t,
r4000allegrex_vdet_p,
r4000allegrex_vcmp_s,
r4000allegrex_vcmp_p,
r4000allegrex_vcmp_t,
r4000allegrex_vcmp_q,
r4000allegrex_vmin_s,
r4000allegrex_vmin_p,
r4000allegrex_vmin_t,
r4000allegrex_vmin_q,
r4000allegrex_vmax_s,
r4000allegrex_vmax_p,
r4000allegrex_vmax_t,
r4000allegrex_vmax_q,
r4000allegrex_vscmp_s,
r4000allegrex_vscmp_p,
r4000allegrex_vscmp_t,
r4000allegrex_vscmp_q,
r4000allegrex_vsge_s,
r4000allegrex_vsge_p,
r4000allegrex_vsge_t,
r4000allegrex_vsge_q,
r4000allegrex_vslt_s,
r4000allegrex_vslt_p,
r4000allegrex_vslt_t,
r4000allegrex_vslt_q,
r4000allegrex_vwbn_s,
r4000allegrex_vmov_s,
r4000allegrex_vmov_p,
r4000allegrex_vmov_t,
r4000allegrex_vmov_q,
r4000allegrex_vabs_s,
r4000allegrex_vabs_p,
r4000allegrex_vabs_t,
r4000allegrex_vabs_q,
r4000allegrex_vneg_s,
r4000allegrex_vneg_p,
r4000allegrex_vneg_t,
r4000allegrex_vneg_q,
r4000allegrex_vidt_p,
r4000allegrex_vidt_q,
r4000allegrex_vsat0_s,
r4000allegrex_vsat0_p,
r4000allegrex_vsat0_t,
r4000allegrex_vsat0_q,
r4000allegrex_vsat1_s,
r4000allegrex_vsat1_p,
r4000allegrex_vsat1_t,
r4000allegrex_vsat1_q,
r4000allegrex_vzero_s,
r4000allegrex_vzero_p,
r4000allegrex_vzero_t,
r4000allegrex_vzero_q,
r4000allegrex_vone_s,
r4000allegrex_vone_p,
r4000allegrex_vone_t,
r4000allegrex_vone_q,
r4000allegrex_vrcp_s,
r4000allegrex_vrcp_p,
r4000allegrex_vrcp_t,
r4000allegrex_vrcp_q,
r4000allegrex_vrsq_s,
r4000allegrex_vrsq_p,
r4000allegrex_vrsq_t,
r4000allegrex_vrsq_q,
r4000allegrex_vsin_s,
r4000allegrex_vsin_p,
r4000allegrex_vsin_t,
r4000allegrex_vsin_q,
r4000allegrex_vcos_s,
r4000allegrex_vcos_p,
r4000allegrex_vcos_t,
r4000allegrex_vcos_q,
r4000allegrex_vexp2_s,
r4000allegrex_vexp2_p,
r4000allegrex_vexp2_t,
r4000allegrex_vexp2_q,
r4000allegrex_vlog2_s,
r4000allegrex_vlog2_p,
r4000allegrex_vlog2_t,
r4000allegrex_vlog2_q,
r4000allegrex_vsqrt_s,
r4000allegrex_vsqrt_p,
r4000allegrex_vsqrt_t,
r4000allegrex_vsqrt_q,
r4000allegrex_vasin_s,
r4000allegrex_vasin_p,
r4000allegrex_vasin_t,
r4000allegrex_vasin_q,
r4000allegrex_vnrcp_s,
r4000allegrex_vnrcp_p,
r4000allegrex_vnrcp_t,
r4000allegrex_vnrcp_q,
r4000allegrex_vnsin_s,
r4000allegrex_vnsin_p,
r4000allegrex_vnsin_t,
r4000allegrex_vnsin_q,
r4000allegrex_vrexp2_s,
r4000allegrex_vrexp2_p,
r4000allegrex_vrexp2_t,
r4000allegrex_vrexp2_q,
r4000allegrex_vrnds_s,
r4000allegrex_vrndi_s,
r4000allegrex_vrndi_p,
r4000allegrex_vrndi_t,
r4000allegrex_vrndi_q,
r4000allegrex_vrndf1_s,
r4000allegrex_vrndf1_p,
r4000allegrex_vrndf1_t,
r4000allegrex_vrndf1_q,
r4000allegrex_vrndf2_s,
r4000allegrex_vrndf2_p,
r4000allegrex_vrndf2_t,
r4000allegrex_vrndf2_q,
r4000allegrex_vf2h_p,
r4000allegrex_vf2h_q,
r4000allegrex_vh2f_s,
r4000allegrex_vh2f_p,
r4000allegrex_vsbz_s,
r4000allegrex_vlgb_s,
r4000allegrex_vuc2ifs_s,
r4000allegrex_vc2i_s,
r4000allegrex_vus2i_s,
r4000allegrex_vus2i_p,
r4000allegrex_vs2i_s,
r4000allegrex_vs2i_p,
r4000allegrex_vi2uc_q,
r4000allegrex_vi2c_q,
r4000allegrex_vi2us_p,
r4000allegrex_vi2us_q,
r4000allegrex_vi2s_p,
r4000allegrex_vi2s_q,
r4000allegrex_vsrt1_q,
r4000allegrex_vsrt2_q,
r4000allegrex_vbfy1_p,
r4000allegrex_vbfy1_q,
r4000allegrex_vbfy2_q,
r4000allegrex_vocp_s,
r4000allegrex_vocp_p,
r4000allegrex_vocp_t,
r4000allegrex_vocp_q,
r4000allegrex_vsocp_s,
r4000allegrex_vsocp_p,
r4000allegrex_vfad_p,
r4000allegrex_vfad_t,
r4000allegrex_vfad_q,
r4000allegrex_vavg_p,
r4000allegrex_vavg_t,
r4000allegrex_vavg_q,
r4000allegrex_vsrt3_q,
r4000allegrex_vsrt4_q,
r4000allegrex_vsgn_s,
r4000allegrex_vsgn_p,
r4000allegrex_vsgn_t,
r4000allegrex_vsgn_q,
r4000allegrex_vmfvc,
r4000allegrex_vmtvc,
r4000allegrex_vt4444_q,
r4000allegrex_vt5551_q,
r4000allegrex_vt5650_q,
r4000allegrex_vcst_s,
r4000allegrex_vcst_p,
r4000allegrex_vcst_t,
r4000allegrex_vcst_q,
r4000allegrex_vf2in_s,
r4000allegrex_vf2in_p,
r4000allegrex_vf2in_t,
r4000allegrex_vf2in_q,
r4000allegrex_vf2iz_s,
r4000allegrex_vf2iz_p,
r4000allegrex_vf2iz_t,
r4000allegrex_vf2iz_q,
r4000allegrex_vf2iu_s,
r4000allegrex_vf2iu_p,
r4000allegrex_vf2iu_t,
r4000allegrex_vf2iu_q,
r4000allegrex_vf2id_s,
r4000allegrex_vf2id_p,
r4000allegrex_vf2id_t,
r4000allegrex_vf2id_q,
r4000allegrex_vi2f_s,
r4000allegrex_vi2f_p,
r4000allegrex_vi2f_t,
r4000allegrex_vi2f_q,
r4000allegrex_vcmovt_s,
r4000allegrex_vcmovt_p,
r4000allegrex_vcmovt_t,
r4000allegrex_vcmovt_q,
r4000allegrex_vcmovf_s,
r4000allegrex_vcmovf_p,
r4000allegrex_vcmovf_t,
r4000allegrex_vcmovf_q,
r4000allegrex_vpfxs,
r4000allegrex_vpfxt,
r4000allegrex_vpfxd,
r4000allegrex_viim_s,
r4000allegrex_vfim_s,
r4000allegrex_vmmul_p,
r4000allegrex_vmmul_t,
r4000allegrex_vmmul_q,
r4000allegrex_vhtfm2_p,
r4000allegrex_vtfm2_p,
r4000allegrex_vhtfm3_t,
r4000allegrex_vtfm3_t,
r4000allegrex_vhtfm4_q,
r4000allegrex_vtfm4_q,
r4000allegrex_vmscl_p,
r4000allegrex_vmscl_t,
r4000allegrex_vmscl_q,
r4000allegrex_vcrsp_t,
r4000allegrex_vqmul_q,
r4000allegrex_vrot_p,
r4000allegrex_vrot_t,
r4000allegrex_vrot_q,
r4000allegrex_vmmov_p,
r4000allegrex_vmmov_t,
r4000allegrex_vmmov_q,
r4000allegrex_vmidt_p,
r4000allegrex_vmidt_t,
r4000allegrex_vmidt_q,
r4000allegrex_vmzero_p,
r4000allegrex_vmzero_t,
r4000allegrex_vmzero_q,
r4000allegrex_vmone_p,
r4000allegrex_vmone_t,
r4000allegrex_vmone_q,
r4000allegrex_vnop,
r4000allegrex_vsync,
r4000allegrex_vflush,
r4000allegrex_svl_q,
r4000allegrex_svr_q,
r4000allegrex_USERDEF_00,
r4000allegrex_USERDEF_01,
r4000allegrex_USERDEF_02,
r4000allegrex_USERDEF_03,
r4000allegrex_USERDEF_04,
r4000allegrex_USERDEF_05,
r4000allegrex_USERDEF_06,
r4000allegrex_USERDEF_07,
r4000allegrex_USERDEF_08,
r4000allegrex_USERDEF_09,
r4000allegrex_USERDEF_10,
r4000allegrex_USERDEF_11,
r4000allegrex_USERDEF_12,
r4000allegrex_USERDEF_13,
r4000allegrex_USERDEF_14,
r4000allegrex_USERDEF_15,
r4000allegrex_USERDEF_16,
r4000allegrex_USERDEF_17,
r4000allegrex_USERDEF_18,
r4000allegrex_USERDEF_19,
r4000allegrex_MAX,
r5900_INVALID,
r5900_lq,
r5900_sq,

View File

@ -0,0 +1,85 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
#ifndef RABBITIZER_INSTRUCTION_R4000ALLEGREX_HPP
#define RABBITIZER_INSTRUCTION_R4000ALLEGREX_HPP
#pragma once
#include "InstructionBase.hpp"
namespace rabbitizer {
class InstructionR4000Allegrex : public InstructionBase {
public:
InstructionR4000Allegrex(uint32_t word, uint32_t vram);
virtual ~InstructionR4000Allegrex();
Registers::R4000Allegrex::S GetR4000Allegrex_s_vs() const;
Registers::R4000Allegrex::S GetR4000Allegrex_s_vt() const;
Registers::R4000Allegrex::S GetR4000Allegrex_s_vd() const;
Registers::R4000Allegrex::S GetR4000Allegrex_s_vt_imm() const;
Registers::R4000Allegrex::S GetR4000Allegrex_s_vd_imm() const;
Registers::R4000Allegrex::V2D GetR4000Allegrex_p_vs() const;
Registers::R4000Allegrex::V2D GetR4000Allegrex_p_vt() const;
Registers::R4000Allegrex::V2D GetR4000Allegrex_p_vd() const;
Registers::R4000Allegrex::V3D GetR4000Allegrex_t_vs() const;
Registers::R4000Allegrex::V3D GetR4000Allegrex_t_vt() const;
Registers::R4000Allegrex::V3D GetR4000Allegrex_t_vd() const;
Registers::R4000Allegrex::V4D GetR4000Allegrex_q_vs() const;
Registers::R4000Allegrex::V4D GetR4000Allegrex_q_vt() const;
Registers::R4000Allegrex::V4D GetR4000Allegrex_q_vd() const;
Registers::R4000Allegrex::V4D GetR4000Allegrex_q_vt_imm() const;
Registers::R4000Allegrex::M2x2 GetR4000Allegrex_mp_vs() const;
Registers::R4000Allegrex::M2x2 GetR4000Allegrex_mp_vt() const;
Registers::R4000Allegrex::M2x2 GetR4000Allegrex_mp_vd() const;
Registers::R4000Allegrex::M2x2 GetR4000Allegrex_mp_vs_transpose() const;
Registers::R4000Allegrex::M3x3 GetR4000Allegrex_mt_vs() const;
Registers::R4000Allegrex::M3x3 GetR4000Allegrex_mt_vt() const;
Registers::R4000Allegrex::M3x3 GetR4000Allegrex_mt_vd() const;
Registers::R4000Allegrex::M3x3 GetR4000Allegrex_mt_vs_transpose() const;
Registers::R4000Allegrex::M4x4 GetR4000Allegrex_mq_vs() const;
Registers::R4000Allegrex::M4x4 GetR4000Allegrex_mq_vt() const;
Registers::R4000Allegrex::M4x4 GetR4000Allegrex_mq_vd() const;
Registers::R4000Allegrex::M4x4 GetR4000Allegrex_mq_vs_transpose() const;
Registers::R4000Allegrex::VfpuControl GetR4000Allegrex_cop2cs() const;
Registers::R4000Allegrex::VfpuControl GetR4000Allegrex_cop2cd() const;
uint8_t GetR4000Allegrex_pos() const;
uint8_t GetR4000Allegrex_size() const;
uint8_t GetR4000Allegrex_size_plus_pos() const;
uint8_t GetR4000Allegrex_imm3() const;
uint16_t GetR4000Allegrex_offset14() const;
uint8_t GetR4000Allegrex_vcmp_cond() const;
Registers::R4000Allegrex::VConstant GetR4000Allegrex_vconstant() const;
uint8_t GetR4000Allegrex_power_of_two() const;
uint8_t GetR4000Allegrex_vfpu_cc_bit() const;
uint8_t GetR4000Allegrex_bn() const;
uint16_t GetR4000Allegrex_intfloat16() const;
uint8_t GetR4000Allegrex_vrot_code() const;
uint8_t GetR4000Allegrex_rpx() const;
uint8_t GetR4000Allegrex_rpy() const;
uint8_t GetR4000Allegrex_rpz() const;
uint8_t GetR4000Allegrex_rpw() const;
uint8_t GetR4000Allegrex_wpx() const;
uint8_t GetR4000Allegrex_wpy() const;
uint8_t GetR4000Allegrex_wpz() const;
uint8_t GetR4000Allegrex_wpw() const;
};
};
#endif

View File

@ -20,6 +20,7 @@
#include "instructions/InstructionCpu.hpp"
#include "instructions/InstructionRsp.hpp"
#include "instructions/InstructionR3000GTE.hpp"
#include "instructions/InstructionR4000Allegrex.hpp"
#include "instructions/InstructionR5900.hpp"
#include "analysis/LoPairingInfo.hpp"

View File

@ -0,0 +1,560 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
#include "instructions/InstructionR4000Allegrex.hpp"
#include <stdexcept>
#include "instructions/RabbitizerInstructionR4000Allegrex.h"
using namespace rabbitizer;
InstructionR4000Allegrex::InstructionR4000Allegrex(uint32_t word, uint32_t vram) : InstructionBase() {
RabbitizerInstructionR4000Allegrex_init(&this->instr, word, vram);
RabbitizerInstructionR4000Allegrex_processUniqueId(&this->instr);
}
InstructionR4000Allegrex::~InstructionR4000Allegrex() {
RabbitizerInstructionR4000Allegrex_destroy(&this->instr);
}
Registers::R4000Allegrex::S InstructionR4000Allegrex::GetR4000Allegrex_s_vs() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_s_vs)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 's_vs' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::S>(RAB_INSTR_R4000ALLEGREX_GET_vs(&this->instr));
}
Registers::R4000Allegrex::S InstructionR4000Allegrex::GetR4000Allegrex_s_vt() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_s_vt)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 's_vt' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::S>(RAB_INSTR_R4000ALLEGREX_GET_vt(&this->instr));
}
Registers::R4000Allegrex::S InstructionR4000Allegrex::GetR4000Allegrex_s_vd() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_s_vd)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 's_vd' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::S>(RAB_INSTR_R4000ALLEGREX_GET_vd(&this->instr));
}
Registers::R4000Allegrex::S InstructionR4000Allegrex::GetR4000Allegrex_s_vt_imm() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_s_vt_imm)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 's_vt_imm' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::S>(RAB_INSTR_R4000ALLEGREX_GET_vt_imm(&this->instr));
}
Registers::R4000Allegrex::S InstructionR4000Allegrex::GetR4000Allegrex_s_vd_imm() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_s_vd_imm)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 's_vd_imm' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::S>(RAB_INSTR_R4000ALLEGREX_GET_vd_imm(&this->instr));
}
Registers::R4000Allegrex::V2D InstructionR4000Allegrex::GetR4000Allegrex_p_vs() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_p_vs)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'p_vs' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::V2D>(RAB_INSTR_R4000ALLEGREX_GET_vs(&this->instr));
}
Registers::R4000Allegrex::V2D InstructionR4000Allegrex::GetR4000Allegrex_p_vt() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_s_vt)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 's_vt' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::V2D>(RAB_INSTR_R4000ALLEGREX_GET_vt(&this->instr));
}
Registers::R4000Allegrex::V2D InstructionR4000Allegrex::GetR4000Allegrex_p_vd() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_p_vd)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'p_vd' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::V2D>(RAB_INSTR_R4000ALLEGREX_GET_vd(&this->instr));
}
Registers::R4000Allegrex::V3D InstructionR4000Allegrex::GetR4000Allegrex_t_vs() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_t_vs)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 't_vs' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::V3D>(RAB_INSTR_R4000ALLEGREX_GET_vs(&this->instr));
}
Registers::R4000Allegrex::V3D InstructionR4000Allegrex::GetR4000Allegrex_t_vt() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_t_vt)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 't_vt' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::V3D>(RAB_INSTR_R4000ALLEGREX_GET_vt(&this->instr));
}
Registers::R4000Allegrex::V3D InstructionR4000Allegrex::GetR4000Allegrex_t_vd() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_t_vd)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 't_vd' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::V3D>(RAB_INSTR_R4000ALLEGREX_GET_vd(&this->instr));
}
Registers::R4000Allegrex::V4D InstructionR4000Allegrex::GetR4000Allegrex_q_vs() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_q_vs)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'q_vs' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::V4D>(RAB_INSTR_R4000ALLEGREX_GET_vs(&this->instr));
}
Registers::R4000Allegrex::V4D InstructionR4000Allegrex::GetR4000Allegrex_q_vt() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_q_vt)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'q_vt' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::V4D>(RAB_INSTR_R4000ALLEGREX_GET_vt(&this->instr));
}
Registers::R4000Allegrex::V4D InstructionR4000Allegrex::GetR4000Allegrex_q_vd() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_q_vd)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'q_vd' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::V4D>(RAB_INSTR_R4000ALLEGREX_GET_vd(&this->instr));
}
Registers::R4000Allegrex::V4D InstructionR4000Allegrex::GetR4000Allegrex_q_vt_imm() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_q_vt_imm)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'q_vt_imm' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::V4D>(RAB_INSTR_R4000ALLEGREX_GET_vt_imm(&this->instr));
}
Registers::R4000Allegrex::M2x2 InstructionR4000Allegrex::GetR4000Allegrex_mp_vs() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_mp_vs)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'mp_vs' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::M2x2>(RAB_INSTR_R4000ALLEGREX_GET_vs(&this->instr));
}
Registers::R4000Allegrex::M2x2 InstructionR4000Allegrex::GetR4000Allegrex_mp_vt() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_mp_vt)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'mp_vt' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::M2x2>(RAB_INSTR_R4000ALLEGREX_GET_vt(&this->instr));
}
Registers::R4000Allegrex::M2x2 InstructionR4000Allegrex::GetR4000Allegrex_mp_vd() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_mp_vd)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'mp_vd' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::M2x2>(RAB_INSTR_R4000ALLEGREX_GET_vd(&this->instr));
}
Registers::R4000Allegrex::M2x2 InstructionR4000Allegrex::GetR4000Allegrex_mp_vs_transpose() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_mp_vs_transpose)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'mp_vs_transpose' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::M2x2>(RAB_INSTR_R4000ALLEGREX_GET_vs_transpose(&this->instr));
}
Registers::R4000Allegrex::M3x3 InstructionR4000Allegrex::GetR4000Allegrex_mt_vs() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_mt_vs)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'mt_vs' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::M3x3>(RAB_INSTR_R4000ALLEGREX_GET_vs(&this->instr));
}
Registers::R4000Allegrex::M3x3 InstructionR4000Allegrex::GetR4000Allegrex_mt_vt() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_mt_vt)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'mt_vt' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::M3x3>(RAB_INSTR_R4000ALLEGREX_GET_vt(&this->instr));
}
Registers::R4000Allegrex::M3x3 InstructionR4000Allegrex::GetR4000Allegrex_mt_vd() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_mt_vd)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'mt_vd' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::M3x3>(RAB_INSTR_R4000ALLEGREX_GET_vd(&this->instr));
}
Registers::R4000Allegrex::M3x3 InstructionR4000Allegrex::GetR4000Allegrex_mt_vs_transpose() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_mt_vs_transpose)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'mt_vs_transpose' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::M3x3>(RAB_INSTR_R4000ALLEGREX_GET_vs_transpose(&this->instr));
}
Registers::R4000Allegrex::M4x4 InstructionR4000Allegrex::GetR4000Allegrex_mq_vs() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_mq_vs)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'mq_vs' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::M4x4>(RAB_INSTR_R4000ALLEGREX_GET_vs(&this->instr));
}
Registers::R4000Allegrex::M4x4 InstructionR4000Allegrex::GetR4000Allegrex_mq_vt() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_mq_vt)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'mq_vt' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::M4x4>(RAB_INSTR_R4000ALLEGREX_GET_vt(&this->instr));
}
Registers::R4000Allegrex::M4x4 InstructionR4000Allegrex::GetR4000Allegrex_mq_vd() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_mq_vd)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'mq_vd' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::M4x4>(RAB_INSTR_R4000ALLEGREX_GET_vd(&this->instr));
}
Registers::R4000Allegrex::M4x4 InstructionR4000Allegrex::GetR4000Allegrex_mq_vs_transpose() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_mq_vs_transpose)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'mq_vs_transpose' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::M4x4>(RAB_INSTR_R4000ALLEGREX_GET_vs_transpose(&this->instr));
}
Registers::R4000Allegrex::VfpuControl InstructionR4000Allegrex::GetR4000Allegrex_cop2cs() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_cop2cs)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop2cs' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::VfpuControl>(RAB_INSTR_R4000ALLEGREX_GET_cop2cs(&this->instr));
}
Registers::R4000Allegrex::VfpuControl InstructionR4000Allegrex::GetR4000Allegrex_cop2cd() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_cop2cd)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop2cd' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::VfpuControl>(RAB_INSTR_R4000ALLEGREX_GET_cop2cd(&this->instr));
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_pos() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_pos)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'pos' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_pos(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_size() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_size)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'size' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_size(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_size_plus_pos() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_size_plus_pos)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'size_plus_pos' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_size_plus_pos(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_imm3() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_imm3)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'imm3' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_imm3(&this->instr);
}
uint16_t InstructionR4000Allegrex::GetR4000Allegrex_offset14() const {
#if 0
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_offset14)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'offset14' operand.");
}
#endif
#endif
return RAB_INSTR_R4000ALLEGREX_GET_offset14(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_vcmp_cond() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_vcmp_cond)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vcmp_cond' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_vcmp_cond(&this->instr);
}
Registers::R4000Allegrex::VConstant InstructionR4000Allegrex::GetR4000Allegrex_vconstant() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_vconstant)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vconstant' operand.");
}
#endif
return static_cast<Registers::R4000Allegrex::VConstant>(RAB_INSTR_R4000ALLEGREX_GET_vconstant(&this->instr));
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_power_of_two() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_power_of_two)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'power_of_two' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_power_of_two(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_vfpu_cc_bit() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_vfpu_cc_bit)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vfpu_cc_bit' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_vfpu_cc_bit(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_bn() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_bn)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'bn' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_bn(&this->instr);
}
uint16_t InstructionR4000Allegrex::GetR4000Allegrex_intfloat16() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_int16) && !hasOperandAlias(OperandType::r4000allegrex_float16)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'intfloat16' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_intfloat16(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_vrot_code() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_p_vrot_code) &&
!hasOperandAlias(OperandType::r4000allegrex_t_vrot_code) &&
!hasOperandAlias(OperandType::r4000allegrex_q_vrot_code)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vrot_code' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_vrot_code(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_rpx() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_rpx)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rpx' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_rpx(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_rpy() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_rpy)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rpy' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_rpy(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_rpz() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_rpz)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rpz' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_rpz(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_rpw() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_rpw)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rpw' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_rpw(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_wpx() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_wpx)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'wpx' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_wpx(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_wpy() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_wpy)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'wpy' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_wpy(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_wpz() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_wpz)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'wpz' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_wpz(&this->instr);
}
uint8_t InstructionR4000Allegrex::GetR4000Allegrex_wpw() const {
#ifdef RAB_SANITY_CHECKS
if (!hasOperandAlias(OperandType::r4000allegrex_wpw)) {
// TODO: make a rabbitizer exception class
throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'wpw' operand.");
}
#endif
return RAB_INSTR_R4000ALLEGREX_GET_wpw(&this->instr);
}

View File

@ -23,6 +23,7 @@ typedef struct RabbitizerConfig_RegisterNames {
bool userFpcCsr; // Use FpcCsr as register $31 for the FP control/status register
bool vr4300Cop0NamedRegisters; // Use named registers for VR4300's coprocessor 0 registers
bool vr4300RspCop0NamedRegisters; // Use named registers for VR4300's RSP's coprocessor 0 registers
bool r4000AllegrexVfpuControlNamedRegisters; // Use named registers for R4000 Allegrex's VFPU control registers
} RabbitizerConfig_RegisterNames;
typedef struct RabbitizerConfig_PseudoInstr {

View File

@ -13,8 +13,8 @@ extern "C" {
// Header version
#define RAB_VERSION_MAJOR 1
#define RAB_VERSION_MINOR 9
#define RAB_VERSION_PATCH 6
#define RAB_VERSION_MINOR 10
#define RAB_VERSION_PATCH 0
#define RAB_VERSION_STR RAB_STRINGIFY(RAB_VERSION_MAJOR) "." RAB_STRINGIFY(RAB_VERSION_MINOR) "." RAB_STRINGIFY(RAB_VERSION_PATCH)

View File

@ -61,7 +61,7 @@ typedef enum RabTrinaryValue {
#define RAB_STRINGIFY2(x) #x
#define RAB_STRINGIFY(x) RAB_STRINGIFY2(x)
#define MASK(v, w) ((v) & ((1 << (w)) - 1))
#define MASK(v, w) ((v) & ((1U << (w)) - 1U))
/*
* the SHIFT macros take a value, a shift amount, and a width.
@ -78,7 +78,7 @@ typedef enum RabTrinaryValue {
#define SHIFTL(v, s, w) (MASK((v), (w)) << (s))
#define SHIFTR(v, s, w) (MASK((v) >> (s), (w)))
#define BITREPACK(fullword, v, s, w) ((SHIFTR((fullword), (s)+(w), 32-((s)+(w))) << ((s)+(w))) | SHIFTL((v), (s), (w)) | MASK((fullword), (s)))
#define BITREPACK(fullword, v, s, w) ((SHIFTR((fullword), (s)+(w), 32U-((s)+(w))) << ((s)+(w))) | SHIFTL((v), (s), (w)) | MASK((fullword), (s)))
#define BITREPACK_RIGHT(fullword, v, s, w) (SHIFTL((v), (s), (w)) | MASK((fullword), (s)))
#define RABUTILS_BUFFER_ADVANCE(buffer, totalSize, expression) \
@ -125,6 +125,8 @@ NON_NULL(1)
size_t RabbitizerUtils_CharFill(char *dst, int count, char fillchar);
NON_NULL(1, 3)
size_t RabbitizerUtils_escapeString(char *dst, size_t dstSize, const char *src, size_t srcSize);
CONST NODISCARD
uint32_t RabbitizerUtils_floatRepr_32From16(uint16_t arg);
#ifdef __cplusplus

View File

@ -10,6 +10,7 @@ const char *const RabbitizerInstrCategory_Names[] = {
[RABBITIZER_INSTRCAT_CPU] = "CPU",
[RABBITIZER_INSTRCAT_RSP] = "RSP",
[RABBITIZER_INSTRCAT_R3000GTE] = "R3000GTE",
[RABBITIZER_INSTRCAT_R4000ALLEGREX] = "R4000ALLEGREX",
[RABBITIZER_INSTRCAT_R5900] = "R5900",
};

View File

@ -10,6 +10,7 @@ typedef enum RabbitizerInstrCategory {
RABBITIZER_INSTRCAT_CPU,
RABBITIZER_INSTRCAT_RSP,
RABBITIZER_INSTRCAT_R3000GTE,
RABBITIZER_INSTRCAT_R4000ALLEGREX,
RABBITIZER_INSTRCAT_R5900,
RABBITIZER_INSTRCAT_MAX,
} RabbitizerInstrCategory;

View File

@ -460,6 +460,320 @@ const RabbitizerInstrDescriptor RabbitizerInstrDescriptor_Descriptors[] = {
[RABBITIZER_INSTR_ID_r3000gte_USERDEF_18] = { .operands={0} },
[RABBITIZER_INSTR_ID_r3000gte_USERDEF_19] = { .operands={0} },
[RABBITIZER_INSTR_ID_r3000gte_MAX] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_INVALID] = { .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN },
[RABBITIZER_INSTR_ID_r4000allegrex_lv_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vt_imm, RAB_OPERAND_r4000allegrex_offset14_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true },
[RABBITIZER_INSTR_ID_r4000allegrex_sv_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vt_imm, RAB_OPERAND_r4000allegrex_offset14_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRs=true },
[RABBITIZER_INSTR_ID_r4000allegrex_lv_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vt_imm, RAB_OPERAND_r4000allegrex_offset14_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true },
[RABBITIZER_INSTR_ID_r4000allegrex_sv_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vt_imm, RAB_OPERAND_r4000allegrex_offset14_base_maybe_wb}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRs=true },
[RABBITIZER_INSTR_ID_r4000allegrex_clz] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .readsRs=true },
[RABBITIZER_INSTR_ID_r4000allegrex_clo] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .readsRs=true },
[RABBITIZER_INSTR_ID_r4000allegrex_madd] = { .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .readsRs=true, .readsRt=true, .modifiesHI=true, .modifiesLO=true },
[RABBITIZER_INSTR_ID_r4000allegrex_maddu] = { .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .readsRs=true, .readsRt=true, .modifiesHI=true, .modifiesLO=true },
[RABBITIZER_INSTR_ID_r4000allegrex_msub] = { .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .readsRs=true, .readsRt=true, .modifiesHI=true, .modifiesLO=true },
[RABBITIZER_INSTR_ID_r4000allegrex_msubu] = { .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .readsRs=true, .readsRt=true, .modifiesHI=true, .modifiesLO=true },
[RABBITIZER_INSTR_ID_r4000allegrex_max] = { .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_r4000allegrex_min] = { .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_r4000allegrex_srl] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_rotr] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_srlv] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .readsRs=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_rotrv] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .readsRs=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_sleep] = { .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_mfie] = { .operands={RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_mtie] = { .operands={RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .readsRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_ext] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_r4000allegrex_pos, RAB_OPERAND_r4000allegrex_size}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRt=true, .readsRs=true },
[RABBITIZER_INSTR_ID_r4000allegrex_ins] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_r4000allegrex_pos, RAB_OPERAND_r4000allegrex_size_plus_pos}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRt=true, .readsRs=true },
[RABBITIZER_INSTR_ID_r4000allegrex_wsbh] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_wsbw] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_seb] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_seh] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_bitrev] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_bvf] = { .operands={RAB_OPERAND_r4000allegrex_imm3, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true },
[RABBITIZER_INSTR_ID_r4000allegrex_bvt] = { .operands={RAB_OPERAND_r4000allegrex_imm3, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true },
[RABBITIZER_INSTR_ID_r4000allegrex_bvfl] = { .operands={RAB_OPERAND_r4000allegrex_imm3, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true },
[RABBITIZER_INSTR_ID_r4000allegrex_bvtl] = { .operands={RAB_OPERAND_r4000allegrex_imm3, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true },
[RABBITIZER_INSTR_ID_r4000allegrex_mfv] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r4000allegrex_s_vd}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_mfvc] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r4000allegrex_cop2cd}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_vsync2] = { .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_mtv] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r4000allegrex_s_vd}, .instrType=RABBITIZER_INSTR_TYPE_R, .readsRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_mtvc] = { .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r4000allegrex_cop2cd}, .instrType=RABBITIZER_INSTR_TYPE_R, .readsRt=true },
[RABBITIZER_INSTR_ID_r4000allegrex_vadd_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vadd_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_p_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vadd_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vadd_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_q_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsub_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsub_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_p_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsub_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsub_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_q_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsbn_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vdiv_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vdiv_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_p_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vdiv_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vdiv_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_q_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmul_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmul_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_p_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmul_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmul_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_q_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vdot_p] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_p_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vdot_t] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vdot_q] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_q_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vscl_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vscl_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vscl_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vhdp_p] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_p_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vhdp_t] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vhdp_q] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_q_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcrs_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vdet_p] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_p_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcmp_s] = { .operands={RAB_OPERAND_r4000allegrex_vcmp_cond_s_maybe_vs_maybe_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcmp_p] = { .operands={RAB_OPERAND_r4000allegrex_vcmp_cond_p_maybe_vs_maybe_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcmp_t] = { .operands={RAB_OPERAND_r4000allegrex_vcmp_cond_t_maybe_vs_maybe_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcmp_q] = { .operands={RAB_OPERAND_r4000allegrex_vcmp_cond_q_maybe_vs_maybe_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmin_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmin_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_p_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmin_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmin_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_q_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmax_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmax_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_p_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmax_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmax_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_q_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vscmp_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vscmp_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_p_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vscmp_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vscmp_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_q_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsge_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsge_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_p_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsge_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsge_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_q_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vslt_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vslt_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_p_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vslt_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vslt_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_q_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vwbn_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_bn}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmov_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmov_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmov_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmov_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vabs_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vabs_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vabs_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vabs_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vneg_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vneg_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vneg_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vneg_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vidt_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vidt_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsat0_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsat0_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsat0_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsat0_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsat1_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsat1_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsat1_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsat1_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vzero_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vzero_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vzero_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vzero_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vone_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vone_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vone_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vone_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrcp_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrcp_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrcp_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrcp_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrsq_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrsq_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrsq_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrsq_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsin_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsin_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsin_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsin_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcos_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcos_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcos_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcos_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vexp2_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vexp2_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vexp2_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vexp2_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vlog2_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vlog2_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vlog2_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vlog2_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsqrt_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsqrt_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsqrt_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsqrt_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vasin_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vasin_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vasin_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vasin_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vnrcp_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vnrcp_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vnrcp_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vnrcp_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vnsin_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vnsin_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vnsin_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vnsin_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrexp2_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrexp2_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrexp2_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrexp2_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrnds_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrndi_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrndi_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrndi_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrndi_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf1_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf1_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf1_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf1_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf2_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf2_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf2_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf2_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2h_p] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2h_q] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vh2f_s] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vh2f_p] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsbz_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vlgb_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vuc2ifs_s] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vc2i_s] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vus2i_s] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vus2i_p] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vs2i_s] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vs2i_p] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vi2uc_q] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vi2c_q] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vi2us_p] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vi2us_q] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vi2s_p] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vi2s_q] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsrt1_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsrt2_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vbfy1_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vbfy1_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vbfy2_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vocp_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vocp_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vocp_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vocp_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsocp_s] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsocp_p] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vfad_p] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vfad_t] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vfad_q] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vavg_p] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vavg_t] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vavg_q] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsrt3_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsrt4_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsgn_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsgn_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsgn_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vsgn_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmfvc] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_cop2cs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmtvc] = { .operands={RAB_OPERAND_r4000allegrex_cop2cd, RAB_OPERAND_r4000allegrex_s_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vt4444_q] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vt5551_q] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vt5650_q] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_q_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcst_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_vconstant}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcst_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_vconstant}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcst_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_vconstant}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcst_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_vconstant}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2in_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2in_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2in_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2in_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iz_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iz_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iz_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iz_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iu_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iu_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iu_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iu_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2id_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2id_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2id_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vf2id_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vi2f_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vi2f_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vi2f_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vi2f_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_power_of_two}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovt_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_vfpu_cc_bit}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovt_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_vfpu_cc_bit}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovt_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_vfpu_cc_bit}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovt_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_vfpu_cc_bit}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovf_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_vfpu_cc_bit}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovf_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_p_vs, RAB_OPERAND_r4000allegrex_vfpu_cc_bit}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovf_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_vfpu_cc_bit}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovf_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_vfpu_cc_bit}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vpfxs] = { .operands={RAB_OPERAND_r4000allegrex_rpx, RAB_OPERAND_r4000allegrex_rpy, RAB_OPERAND_r4000allegrex_rpz, RAB_OPERAND_r4000allegrex_rpw}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN },
[RABBITIZER_INSTR_ID_r4000allegrex_vpfxt] = { .operands={RAB_OPERAND_r4000allegrex_rpx, RAB_OPERAND_r4000allegrex_rpy, RAB_OPERAND_r4000allegrex_rpz, RAB_OPERAND_r4000allegrex_rpw}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN },
[RABBITIZER_INSTR_ID_r4000allegrex_vpfxd] = { .operands={RAB_OPERAND_r4000allegrex_wpx, RAB_OPERAND_r4000allegrex_wpy, RAB_OPERAND_r4000allegrex_wpz, RAB_OPERAND_r4000allegrex_wpw}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN },
[RABBITIZER_INSTR_ID_r4000allegrex_viim_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vt, RAB_OPERAND_r4000allegrex_int16}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vfim_s] = { .operands={RAB_OPERAND_r4000allegrex_s_vt, RAB_OPERAND_r4000allegrex_float16}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmmul_p] = { .operands={RAB_OPERAND_r4000allegrex_mp_vd, RAB_OPERAND_r4000allegrex_mp_vs_transpose, RAB_OPERAND_r4000allegrex_mp_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmmul_t] = { .operands={RAB_OPERAND_r4000allegrex_mt_vd, RAB_OPERAND_r4000allegrex_mt_vs_transpose, RAB_OPERAND_r4000allegrex_mt_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmmul_q] = { .operands={RAB_OPERAND_r4000allegrex_mq_vd, RAB_OPERAND_r4000allegrex_mq_vs_transpose, RAB_OPERAND_r4000allegrex_mq_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vhtfm2_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_mp_vs, RAB_OPERAND_r4000allegrex_p_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vtfm2_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_mp_vs, RAB_OPERAND_r4000allegrex_p_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vhtfm3_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_mt_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vtfm3_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_mt_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vhtfm4_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_mq_vs, RAB_OPERAND_r4000allegrex_q_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vtfm4_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_mq_vs, RAB_OPERAND_r4000allegrex_q_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmscl_p] = { .operands={RAB_OPERAND_r4000allegrex_mp_vd, RAB_OPERAND_r4000allegrex_mp_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmscl_t] = { .operands={RAB_OPERAND_r4000allegrex_mt_vd, RAB_OPERAND_r4000allegrex_mt_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmscl_q] = { .operands={RAB_OPERAND_r4000allegrex_mq_vd, RAB_OPERAND_r4000allegrex_mq_vs, RAB_OPERAND_r4000allegrex_s_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vcrsp_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_t_vs, RAB_OPERAND_r4000allegrex_t_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vqmul_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_q_vs, RAB_OPERAND_r4000allegrex_q_vt}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrot_p] = { .operands={RAB_OPERAND_r4000allegrex_p_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_p_vrot_code}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrot_t] = { .operands={RAB_OPERAND_r4000allegrex_t_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_t_vrot_code}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vrot_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vd, RAB_OPERAND_r4000allegrex_s_vs, RAB_OPERAND_r4000allegrex_q_vrot_code}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmmov_p] = { .operands={RAB_OPERAND_r4000allegrex_mp_vd, RAB_OPERAND_r4000allegrex_mp_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmmov_t] = { .operands={RAB_OPERAND_r4000allegrex_mt_vd, RAB_OPERAND_r4000allegrex_mt_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmmov_q] = { .operands={RAB_OPERAND_r4000allegrex_mq_vd, RAB_OPERAND_r4000allegrex_mq_vs}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmidt_p] = { .operands={RAB_OPERAND_r4000allegrex_mp_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmidt_t] = { .operands={RAB_OPERAND_r4000allegrex_mt_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmidt_q] = { .operands={RAB_OPERAND_r4000allegrex_mq_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmzero_p] = { .operands={RAB_OPERAND_r4000allegrex_mp_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmzero_t] = { .operands={RAB_OPERAND_r4000allegrex_mt_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmzero_q] = { .operands={RAB_OPERAND_r4000allegrex_mq_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmone_p] = { .operands={RAB_OPERAND_r4000allegrex_mp_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmone_t] = { .operands={RAB_OPERAND_r4000allegrex_mt_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vmone_q] = { .operands={RAB_OPERAND_r4000allegrex_mq_vd}, .instrType=RABBITIZER_INSTR_TYPE_R },
[RABBITIZER_INSTR_ID_r4000allegrex_vnop] = { .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN },
[RABBITIZER_INSTR_ID_r4000allegrex_vsync] = { .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN },
[RABBITIZER_INSTR_ID_r4000allegrex_vflush] = { .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN },
[RABBITIZER_INSTR_ID_r4000allegrex_svl_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vt_imm, RAB_OPERAND_r4000allegrex_offset14_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true },
[RABBITIZER_INSTR_ID_r4000allegrex_svr_q] = { .operands={RAB_OPERAND_r4000allegrex_q_vt_imm, RAB_OPERAND_r4000allegrex_offset14_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .readsRs=true },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_00] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_01] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_02] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_03] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_04] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_05] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_06] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_07] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_08] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_09] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_10] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_11] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_12] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_13] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_14] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_15] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_16] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_17] = { .operands={0} },
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_18] = { .operands={0} },
[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 },

View File

@ -40,6 +40,52 @@ const char *RabInstrIdType_Names[] = {
[RAB_INSTR_ID_TYPE_R3000GTE_COP1] = "R3000GTE" "_" "COP1",
[RAB_INSTR_ID_TYPE_R3000GTE_COP2] = "R3000GTE" "_" "COP2",
[RAB_INSTR_ID_TYPE_R3000GTE_COP2_GTE] = "R3000GTE" "_" "COP2_GTE",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_INVALID] = "R4000ALLEGREX" "_" "INVALID",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_NORMAL] = "R4000ALLEGREX" "_" "NORMAL",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_SPECIAL] = "R4000ALLEGREX" "_" "SPECIAL",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_SPECIAL_RS] = "R4000ALLEGREX" "_" "SPECIAL_RS",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_SPECIAL_SA] = "R4000ALLEGREX" "_" "SPECIAL_SA",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_REGIMM] = "R4000ALLEGREX" "_" "REGIMM",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_SPECIAL2] = "R4000ALLEGREX" "_" "SPECIAL2",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_SPECIAL3] = "R4000ALLEGREX" "_" "SPECIAL3",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_SPECIAL3_BSHFL] = "R4000ALLEGREX" "_" "SPECIAL3_BSHFL",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP0] = "R4000ALLEGREX" "_" "COP0",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP0_BC0] = "R4000ALLEGREX" "_" "COP0_BC0",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP0_TLB] = "R4000ALLEGREX" "_" "COP0_TLB",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP1] = "R4000ALLEGREX" "_" "COP1",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP1_BC1] = "R4000ALLEGREX" "_" "COP1_BC1",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP1_FPUS] = "R4000ALLEGREX" "_" "COP1_FPUS",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP1_FPUW] = "R4000ALLEGREX" "_" "COP1_FPUW",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP2] = "R4000ALLEGREX" "_" "COP2",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP2_BC2] = "R4000ALLEGREX" "_" "COP2_BC2",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP2_MFHC2] = "R4000ALLEGREX" "_" "COP2_MFHC2",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP2_MFHC2_P] = "R4000ALLEGREX" "_" "COP2_MFHC2_P",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP2_MFHC2_P_S] = "R4000ALLEGREX" "_" "COP2_MFHC2_P_S",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP2_MTHC2] = "R4000ALLEGREX" "_" "COP2_MTHC2",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU0] = "R4000ALLEGREX" "_" "VFPU0",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU1] = "R4000ALLEGREX" "_" "VFPU1",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU3] = "R4000ALLEGREX" "_" "VFPU3",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4] = "R4000ALLEGREX" "_" "VFPU4",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0] = "R4000ALLEGREX" "_" "VFPU4_FMT0",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_FMT0] = "R4000ALLEGREX" "_" "VFPU4_FMT0_FMT0",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_FMT2] = "R4000ALLEGREX" "_" "VFPU4_FMT0_FMT2",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_FMT3] = "R4000ALLEGREX" "_" "VFPU4_FMT0_FMT3",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_RND] = "R4000ALLEGREX" "_" "VFPU4_FMT0_RND",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_CVTFLT] = "R4000ALLEGREX" "_" "VFPU4_FMT0_CVTFLT",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_CVTINT] = "R4000ALLEGREX" "_" "VFPU4_FMT0_CVTINT",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_FMT8] = "R4000ALLEGREX" "_" "VFPU4_FMT0_FMT8",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_FMT9] = "R4000ALLEGREX" "_" "VFPU4_FMT0_FMT9",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_CONTROL] = "R4000ALLEGREX" "_" "VFPU4_FMT0_CONTROL",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_COLOR] = "R4000ALLEGREX" "_" "VFPU4_FMT0_COLOR",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_CST] = "R4000ALLEGREX" "_" "VFPU4_FMT0_CST",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT2] = "R4000ALLEGREX" "_" "VFPU4_FMT2",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT2_CNDMOVE] = "R4000ALLEGREX" "_" "VFPU4_FMT2_CNDMOVE",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU5] = "R4000ALLEGREX" "_" "VFPU5",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU6] = "R4000ALLEGREX" "_" "VFPU6",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU6_FMT7] = "R4000ALLEGREX" "_" "VFPU6_FMT7",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU6_FMT7_FMT0] = "R4000ALLEGREX" "_" "VFPU6_FMT7_FMT0",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU7] = "R4000ALLEGREX" "_" "VFPU7",
[RAB_INSTR_ID_TYPE_R4000ALLEGREX_QUADLR] = "R4000ALLEGREX" "_" "QUADLR",
[RAB_INSTR_ID_TYPE_R5900_INVALID] = "R5900" "_" "INVALID",
[RAB_INSTR_ID_TYPE_R5900_NORMAL] = "R5900" "_" "NORMAL",
[RAB_INSTR_ID_TYPE_R5900_SPECIAL] = "R5900" "_" "SPECIAL",

View File

@ -40,6 +40,52 @@ typedef enum RabInstrIdType {
RAB_INSTR_ID_TYPE_R3000GTE_COP1,
RAB_INSTR_ID_TYPE_R3000GTE_COP2,
RAB_INSTR_ID_TYPE_R3000GTE_COP2_GTE,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_INVALID,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_NORMAL,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_SPECIAL,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_SPECIAL_RS,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_SPECIAL_SA,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_REGIMM,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_SPECIAL2,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_SPECIAL3,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_SPECIAL3_BSHFL,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP0,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP0_BC0,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP0_TLB,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP1,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP1_BC1,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP1_FPUS,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP1_FPUW,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP2,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP2_BC2,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP2_MFHC2,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP2_MFHC2_P,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP2_MFHC2_P_S,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_COP2_MTHC2,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU0,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU1,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU3,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_FMT0,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_FMT2,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_FMT3,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_RND,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_CVTFLT,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_CVTINT,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_FMT8,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_FMT9,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_CONTROL,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_COLOR,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT0_CST,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT2,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU4_FMT2_CNDMOVE,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU5,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU6,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU6_FMT7,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU6_FMT7_FMT0,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_VFPU7,
RAB_INSTR_ID_TYPE_R4000ALLEGREX_QUADLR,
RAB_INSTR_ID_TYPE_R5900_INVALID,
RAB_INSTR_ID_TYPE_R5900_NORMAL,
RAB_INSTR_ID_TYPE_R5900_SPECIAL,

View File

@ -460,6 +460,320 @@ const char *RabbitizerInstrId_Names[] = {
[RABBITIZER_INSTR_ID_r3000gte_USERDEF_18] = "USERDEF_18",
[RABBITIZER_INSTR_ID_r3000gte_USERDEF_19] = "USERDEF_19",
[RABBITIZER_INSTR_ID_r3000gte_MAX] = "MAX",
[RABBITIZER_INSTR_ID_r4000allegrex_INVALID] = "INVALID",
[RABBITIZER_INSTR_ID_r4000allegrex_lv_s] = "lv.s",
[RABBITIZER_INSTR_ID_r4000allegrex_sv_s] = "sv.s",
[RABBITIZER_INSTR_ID_r4000allegrex_lv_q] = "lv.q",
[RABBITIZER_INSTR_ID_r4000allegrex_sv_q] = "sv.q",
[RABBITIZER_INSTR_ID_r4000allegrex_clz] = "clz",
[RABBITIZER_INSTR_ID_r4000allegrex_clo] = "clo",
[RABBITIZER_INSTR_ID_r4000allegrex_madd] = "madd",
[RABBITIZER_INSTR_ID_r4000allegrex_maddu] = "maddu",
[RABBITIZER_INSTR_ID_r4000allegrex_msub] = "msub",
[RABBITIZER_INSTR_ID_r4000allegrex_msubu] = "msubu",
[RABBITIZER_INSTR_ID_r4000allegrex_max] = "max",
[RABBITIZER_INSTR_ID_r4000allegrex_min] = "min",
[RABBITIZER_INSTR_ID_r4000allegrex_srl] = "srl",
[RABBITIZER_INSTR_ID_r4000allegrex_rotr] = "rotr",
[RABBITIZER_INSTR_ID_r4000allegrex_srlv] = "srlv",
[RABBITIZER_INSTR_ID_r4000allegrex_rotrv] = "rotrv",
[RABBITIZER_INSTR_ID_r4000allegrex_sleep] = "sleep",
[RABBITIZER_INSTR_ID_r4000allegrex_mfie] = "mfie",
[RABBITIZER_INSTR_ID_r4000allegrex_mtie] = "mtie",
[RABBITIZER_INSTR_ID_r4000allegrex_ext] = "ext",
[RABBITIZER_INSTR_ID_r4000allegrex_ins] = "ins",
[RABBITIZER_INSTR_ID_r4000allegrex_wsbh] = "wsbh",
[RABBITIZER_INSTR_ID_r4000allegrex_wsbw] = "wsbw",
[RABBITIZER_INSTR_ID_r4000allegrex_seb] = "seb",
[RABBITIZER_INSTR_ID_r4000allegrex_seh] = "seh",
[RABBITIZER_INSTR_ID_r4000allegrex_bitrev] = "bitrev",
[RABBITIZER_INSTR_ID_r4000allegrex_bvf] = "bvf",
[RABBITIZER_INSTR_ID_r4000allegrex_bvt] = "bvt",
[RABBITIZER_INSTR_ID_r4000allegrex_bvfl] = "bvfl",
[RABBITIZER_INSTR_ID_r4000allegrex_bvtl] = "bvtl",
[RABBITIZER_INSTR_ID_r4000allegrex_mfv] = "mfv",
[RABBITIZER_INSTR_ID_r4000allegrex_mfvc] = "mfvc",
[RABBITIZER_INSTR_ID_r4000allegrex_vsync2] = "vsync2",
[RABBITIZER_INSTR_ID_r4000allegrex_mtv] = "mtv",
[RABBITIZER_INSTR_ID_r4000allegrex_mtvc] = "mtvc",
[RABBITIZER_INSTR_ID_r4000allegrex_vadd_s] = "vadd.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vadd_p] = "vadd.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vadd_t] = "vadd.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vadd_q] = "vadd.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vsub_s] = "vsub.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vsub_p] = "vsub.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vsub_t] = "vsub.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vsub_q] = "vsub.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vsbn_s] = "vsbn.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vdiv_s] = "vdiv.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vdiv_p] = "vdiv.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vdiv_t] = "vdiv.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vdiv_q] = "vdiv.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vmul_s] = "vmul.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vmul_p] = "vmul.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vmul_t] = "vmul.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vmul_q] = "vmul.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vdot_p] = "vdot.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vdot_t] = "vdot.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vdot_q] = "vdot.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vscl_p] = "vscl.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vscl_t] = "vscl.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vscl_q] = "vscl.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vhdp_p] = "vhdp.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vhdp_t] = "vhdp.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vhdp_q] = "vhdp.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vcrs_t] = "vcrs.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vdet_p] = "vdet.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vcmp_s] = "vcmp.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vcmp_p] = "vcmp.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vcmp_t] = "vcmp.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vcmp_q] = "vcmp.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vmin_s] = "vmin.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vmin_p] = "vmin.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vmin_t] = "vmin.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vmin_q] = "vmin.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vmax_s] = "vmax.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vmax_p] = "vmax.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vmax_t] = "vmax.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vmax_q] = "vmax.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vscmp_s] = "vscmp.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vscmp_p] = "vscmp.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vscmp_t] = "vscmp.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vscmp_q] = "vscmp.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vsge_s] = "vsge.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vsge_p] = "vsge.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vsge_t] = "vsge.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vsge_q] = "vsge.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vslt_s] = "vslt.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vslt_p] = "vslt.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vslt_t] = "vslt.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vslt_q] = "vslt.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vwbn_s] = "vwbn.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vmov_s] = "vmov.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vmov_p] = "vmov.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vmov_t] = "vmov.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vmov_q] = "vmov.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vabs_s] = "vabs.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vabs_p] = "vabs.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vabs_t] = "vabs.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vabs_q] = "vabs.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vneg_s] = "vneg.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vneg_p] = "vneg.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vneg_t] = "vneg.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vneg_q] = "vneg.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vidt_p] = "vidt.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vidt_q] = "vidt.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vsat0_s] = "vsat0.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vsat0_p] = "vsat0.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vsat0_t] = "vsat0.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vsat0_q] = "vsat0.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vsat1_s] = "vsat1.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vsat1_p] = "vsat1.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vsat1_t] = "vsat1.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vsat1_q] = "vsat1.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vzero_s] = "vzero.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vzero_p] = "vzero.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vzero_t] = "vzero.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vzero_q] = "vzero.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vone_s] = "vone.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vone_p] = "vone.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vone_t] = "vone.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vone_q] = "vone.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vrcp_s] = "vrcp.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vrcp_p] = "vrcp.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vrcp_t] = "vrcp.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vrcp_q] = "vrcp.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vrsq_s] = "vrsq.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vrsq_p] = "vrsq.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vrsq_t] = "vrsq.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vrsq_q] = "vrsq.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vsin_s] = "vsin.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vsin_p] = "vsin.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vsin_t] = "vsin.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vsin_q] = "vsin.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vcos_s] = "vcos.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vcos_p] = "vcos.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vcos_t] = "vcos.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vcos_q] = "vcos.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vexp2_s] = "vexp2.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vexp2_p] = "vexp2.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vexp2_t] = "vexp2.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vexp2_q] = "vexp2.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vlog2_s] = "vlog2.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vlog2_p] = "vlog2.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vlog2_t] = "vlog2.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vlog2_q] = "vlog2.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vsqrt_s] = "vsqrt.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vsqrt_p] = "vsqrt.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vsqrt_t] = "vsqrt.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vsqrt_q] = "vsqrt.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vasin_s] = "vasin.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vasin_p] = "vasin.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vasin_t] = "vasin.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vasin_q] = "vasin.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vnrcp_s] = "vnrcp.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vnrcp_p] = "vnrcp.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vnrcp_t] = "vnrcp.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vnrcp_q] = "vnrcp.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vnsin_s] = "vnsin.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vnsin_p] = "vnsin.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vnsin_t] = "vnsin.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vnsin_q] = "vnsin.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vrexp2_s] = "vrexp2.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vrexp2_p] = "vrexp2.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vrexp2_t] = "vrexp2.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vrexp2_q] = "vrexp2.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vrnds_s] = "vrnds.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vrndi_s] = "vrndi.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vrndi_p] = "vrndi.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vrndi_t] = "vrndi.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vrndi_q] = "vrndi.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf1_s] = "vrndf1.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf1_p] = "vrndf1.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf1_t] = "vrndf1.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf1_q] = "vrndf1.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf2_s] = "vrndf2.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf2_p] = "vrndf2.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf2_t] = "vrndf2.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vrndf2_q] = "vrndf2.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2h_p] = "vf2h.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2h_q] = "vf2h.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vh2f_s] = "vh2f.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vh2f_p] = "vh2f.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vsbz_s] = "vsbz.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vlgb_s] = "vlgb.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vuc2ifs_s] = "vuc2ifs.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vc2i_s] = "vc2i.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vus2i_s] = "vus2i.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vus2i_p] = "vus2i.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vs2i_s] = "vs2i.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vs2i_p] = "vs2i.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vi2uc_q] = "vi2uc.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vi2c_q] = "vi2c.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vi2us_p] = "vi2us.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vi2us_q] = "vi2us.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vi2s_p] = "vi2s.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vi2s_q] = "vi2s.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vsrt1_q] = "vsrt1.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vsrt2_q] = "vsrt2.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vbfy1_p] = "vbfy1.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vbfy1_q] = "vbfy1.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vbfy2_q] = "vbfy2.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vocp_s] = "vocp.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vocp_p] = "vocp.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vocp_t] = "vocp.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vocp_q] = "vocp.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vsocp_s] = "vsocp.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vsocp_p] = "vsocp.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vfad_p] = "vfad.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vfad_t] = "vfad.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vfad_q] = "vfad.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vavg_p] = "vavg.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vavg_t] = "vavg.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vavg_q] = "vavg.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vsrt3_q] = "vsrt3.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vsrt4_q] = "vsrt4.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vsgn_s] = "vsgn.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vsgn_p] = "vsgn.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vsgn_t] = "vsgn.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vsgn_q] = "vsgn.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vmfvc] = "vmfvc",
[RABBITIZER_INSTR_ID_r4000allegrex_vmtvc] = "vmtvc",
[RABBITIZER_INSTR_ID_r4000allegrex_vt4444_q] = "vt4444.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vt5551_q] = "vt5551.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vt5650_q] = "vt5650.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vcst_s] = "vcst.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vcst_p] = "vcst.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vcst_t] = "vcst.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vcst_q] = "vcst.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2in_s] = "vf2in.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2in_p] = "vf2in.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2in_t] = "vf2in.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2in_q] = "vf2in.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iz_s] = "vf2iz.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iz_p] = "vf2iz.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iz_t] = "vf2iz.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iz_q] = "vf2iz.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iu_s] = "vf2iu.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iu_p] = "vf2iu.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iu_t] = "vf2iu.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2iu_q] = "vf2iu.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2id_s] = "vf2id.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2id_p] = "vf2id.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2id_t] = "vf2id.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vf2id_q] = "vf2id.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vi2f_s] = "vi2f.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vi2f_p] = "vi2f.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vi2f_t] = "vi2f.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vi2f_q] = "vi2f.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovt_s] = "vcmovt.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovt_p] = "vcmovt.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovt_t] = "vcmovt.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovt_q] = "vcmovt.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovf_s] = "vcmovf.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovf_p] = "vcmovf.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovf_t] = "vcmovf.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vcmovf_q] = "vcmovf.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vpfxs] = "vpfxs",
[RABBITIZER_INSTR_ID_r4000allegrex_vpfxt] = "vpfxt",
[RABBITIZER_INSTR_ID_r4000allegrex_vpfxd] = "vpfxd",
[RABBITIZER_INSTR_ID_r4000allegrex_viim_s] = "viim.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vfim_s] = "vfim.s",
[RABBITIZER_INSTR_ID_r4000allegrex_vmmul_p] = "vmmul.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vmmul_t] = "vmmul.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vmmul_q] = "vmmul.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vhtfm2_p] = "vhtfm2.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vtfm2_p] = "vtfm2.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vhtfm3_t] = "vhtfm3.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vtfm3_t] = "vtfm3.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vhtfm4_q] = "vhtfm4.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vtfm4_q] = "vtfm4.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vmscl_p] = "vmscl.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vmscl_t] = "vmscl.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vmscl_q] = "vmscl.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vcrsp_t] = "vcrsp.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vqmul_q] = "vqmul.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vrot_p] = "vrot.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vrot_t] = "vrot.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vrot_q] = "vrot.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vmmov_p] = "vmmov.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vmmov_t] = "vmmov.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vmmov_q] = "vmmov.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vmidt_p] = "vmidt.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vmidt_t] = "vmidt.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vmidt_q] = "vmidt.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vmzero_p] = "vmzero.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vmzero_t] = "vmzero.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vmzero_q] = "vmzero.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vmone_p] = "vmone.p",
[RABBITIZER_INSTR_ID_r4000allegrex_vmone_t] = "vmone.t",
[RABBITIZER_INSTR_ID_r4000allegrex_vmone_q] = "vmone.q",
[RABBITIZER_INSTR_ID_r4000allegrex_vnop] = "vnop",
[RABBITIZER_INSTR_ID_r4000allegrex_vsync] = "vsync",
[RABBITIZER_INSTR_ID_r4000allegrex_vflush] = "vflush",
[RABBITIZER_INSTR_ID_r4000allegrex_svl_q] = "svl.q",
[RABBITIZER_INSTR_ID_r4000allegrex_svr_q] = "svr.q",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_00] = "USERDEF_00",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_01] = "USERDEF_01",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_02] = "USERDEF_02",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_03] = "USERDEF_03",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_04] = "USERDEF_04",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_05] = "USERDEF_05",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_06] = "USERDEF_06",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_07] = "USERDEF_07",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_08] = "USERDEF_08",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_09] = "USERDEF_09",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_10] = "USERDEF_10",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_11] = "USERDEF_11",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_12] = "USERDEF_12",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_13] = "USERDEF_13",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_14] = "USERDEF_14",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_15] = "USERDEF_15",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_16] = "USERDEF_16",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_17] = "USERDEF_17",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_18] = "USERDEF_18",
[RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_19] = "USERDEF_19",
[RABBITIZER_INSTR_ID_r4000allegrex_MAX] = "MAX",
[RABBITIZER_INSTR_ID_r5900_INVALID] = "INVALID",
[RABBITIZER_INSTR_ID_r5900_lq] = "lq",
[RABBITIZER_INSTR_ID_r5900_sq] = "sq",

View File

@ -460,6 +460,320 @@ typedef enum RabbitizerInstrId {
RABBITIZER_INSTR_ID_r3000gte_USERDEF_18,
RABBITIZER_INSTR_ID_r3000gte_USERDEF_19,
RABBITIZER_INSTR_ID_r3000gte_MAX,
RABBITIZER_INSTR_ID_r4000allegrex_INVALID,
RABBITIZER_INSTR_ID_r4000allegrex_lv_s,
RABBITIZER_INSTR_ID_r4000allegrex_sv_s,
RABBITIZER_INSTR_ID_r4000allegrex_lv_q,
RABBITIZER_INSTR_ID_r4000allegrex_sv_q,
RABBITIZER_INSTR_ID_r4000allegrex_clz,
RABBITIZER_INSTR_ID_r4000allegrex_clo,
RABBITIZER_INSTR_ID_r4000allegrex_madd,
RABBITIZER_INSTR_ID_r4000allegrex_maddu,
RABBITIZER_INSTR_ID_r4000allegrex_msub,
RABBITIZER_INSTR_ID_r4000allegrex_msubu,
RABBITIZER_INSTR_ID_r4000allegrex_max,
RABBITIZER_INSTR_ID_r4000allegrex_min,
RABBITIZER_INSTR_ID_r4000allegrex_srl,
RABBITIZER_INSTR_ID_r4000allegrex_rotr,
RABBITIZER_INSTR_ID_r4000allegrex_srlv,
RABBITIZER_INSTR_ID_r4000allegrex_rotrv,
RABBITIZER_INSTR_ID_r4000allegrex_sleep,
RABBITIZER_INSTR_ID_r4000allegrex_mfie,
RABBITIZER_INSTR_ID_r4000allegrex_mtie,
RABBITIZER_INSTR_ID_r4000allegrex_ext,
RABBITIZER_INSTR_ID_r4000allegrex_ins,
RABBITIZER_INSTR_ID_r4000allegrex_wsbh,
RABBITIZER_INSTR_ID_r4000allegrex_wsbw,
RABBITIZER_INSTR_ID_r4000allegrex_seb,
RABBITIZER_INSTR_ID_r4000allegrex_seh,
RABBITIZER_INSTR_ID_r4000allegrex_bitrev,
RABBITIZER_INSTR_ID_r4000allegrex_bvf,
RABBITIZER_INSTR_ID_r4000allegrex_bvt,
RABBITIZER_INSTR_ID_r4000allegrex_bvfl,
RABBITIZER_INSTR_ID_r4000allegrex_bvtl,
RABBITIZER_INSTR_ID_r4000allegrex_mfv,
RABBITIZER_INSTR_ID_r4000allegrex_mfvc,
RABBITIZER_INSTR_ID_r4000allegrex_vsync2,
RABBITIZER_INSTR_ID_r4000allegrex_mtv,
RABBITIZER_INSTR_ID_r4000allegrex_mtvc,
RABBITIZER_INSTR_ID_r4000allegrex_vadd_s,
RABBITIZER_INSTR_ID_r4000allegrex_vadd_p,
RABBITIZER_INSTR_ID_r4000allegrex_vadd_t,
RABBITIZER_INSTR_ID_r4000allegrex_vadd_q,
RABBITIZER_INSTR_ID_r4000allegrex_vsub_s,
RABBITIZER_INSTR_ID_r4000allegrex_vsub_p,
RABBITIZER_INSTR_ID_r4000allegrex_vsub_t,
RABBITIZER_INSTR_ID_r4000allegrex_vsub_q,
RABBITIZER_INSTR_ID_r4000allegrex_vsbn_s,
RABBITIZER_INSTR_ID_r4000allegrex_vdiv_s,
RABBITIZER_INSTR_ID_r4000allegrex_vdiv_p,
RABBITIZER_INSTR_ID_r4000allegrex_vdiv_t,
RABBITIZER_INSTR_ID_r4000allegrex_vdiv_q,
RABBITIZER_INSTR_ID_r4000allegrex_vmul_s,
RABBITIZER_INSTR_ID_r4000allegrex_vmul_p,
RABBITIZER_INSTR_ID_r4000allegrex_vmul_t,
RABBITIZER_INSTR_ID_r4000allegrex_vmul_q,
RABBITIZER_INSTR_ID_r4000allegrex_vdot_p,
RABBITIZER_INSTR_ID_r4000allegrex_vdot_t,
RABBITIZER_INSTR_ID_r4000allegrex_vdot_q,
RABBITIZER_INSTR_ID_r4000allegrex_vscl_p,
RABBITIZER_INSTR_ID_r4000allegrex_vscl_t,
RABBITIZER_INSTR_ID_r4000allegrex_vscl_q,
RABBITIZER_INSTR_ID_r4000allegrex_vhdp_p,
RABBITIZER_INSTR_ID_r4000allegrex_vhdp_t,
RABBITIZER_INSTR_ID_r4000allegrex_vhdp_q,
RABBITIZER_INSTR_ID_r4000allegrex_vcrs_t,
RABBITIZER_INSTR_ID_r4000allegrex_vdet_p,
RABBITIZER_INSTR_ID_r4000allegrex_vcmp_s,
RABBITIZER_INSTR_ID_r4000allegrex_vcmp_p,
RABBITIZER_INSTR_ID_r4000allegrex_vcmp_t,
RABBITIZER_INSTR_ID_r4000allegrex_vcmp_q,
RABBITIZER_INSTR_ID_r4000allegrex_vmin_s,
RABBITIZER_INSTR_ID_r4000allegrex_vmin_p,
RABBITIZER_INSTR_ID_r4000allegrex_vmin_t,
RABBITIZER_INSTR_ID_r4000allegrex_vmin_q,
RABBITIZER_INSTR_ID_r4000allegrex_vmax_s,
RABBITIZER_INSTR_ID_r4000allegrex_vmax_p,
RABBITIZER_INSTR_ID_r4000allegrex_vmax_t,
RABBITIZER_INSTR_ID_r4000allegrex_vmax_q,
RABBITIZER_INSTR_ID_r4000allegrex_vscmp_s,
RABBITIZER_INSTR_ID_r4000allegrex_vscmp_p,
RABBITIZER_INSTR_ID_r4000allegrex_vscmp_t,
RABBITIZER_INSTR_ID_r4000allegrex_vscmp_q,
RABBITIZER_INSTR_ID_r4000allegrex_vsge_s,
RABBITIZER_INSTR_ID_r4000allegrex_vsge_p,
RABBITIZER_INSTR_ID_r4000allegrex_vsge_t,
RABBITIZER_INSTR_ID_r4000allegrex_vsge_q,
RABBITIZER_INSTR_ID_r4000allegrex_vslt_s,
RABBITIZER_INSTR_ID_r4000allegrex_vslt_p,
RABBITIZER_INSTR_ID_r4000allegrex_vslt_t,
RABBITIZER_INSTR_ID_r4000allegrex_vslt_q,
RABBITIZER_INSTR_ID_r4000allegrex_vwbn_s,
RABBITIZER_INSTR_ID_r4000allegrex_vmov_s,
RABBITIZER_INSTR_ID_r4000allegrex_vmov_p,
RABBITIZER_INSTR_ID_r4000allegrex_vmov_t,
RABBITIZER_INSTR_ID_r4000allegrex_vmov_q,
RABBITIZER_INSTR_ID_r4000allegrex_vabs_s,
RABBITIZER_INSTR_ID_r4000allegrex_vabs_p,
RABBITIZER_INSTR_ID_r4000allegrex_vabs_t,
RABBITIZER_INSTR_ID_r4000allegrex_vabs_q,
RABBITIZER_INSTR_ID_r4000allegrex_vneg_s,
RABBITIZER_INSTR_ID_r4000allegrex_vneg_p,
RABBITIZER_INSTR_ID_r4000allegrex_vneg_t,
RABBITIZER_INSTR_ID_r4000allegrex_vneg_q,
RABBITIZER_INSTR_ID_r4000allegrex_vidt_p,
RABBITIZER_INSTR_ID_r4000allegrex_vidt_q,
RABBITIZER_INSTR_ID_r4000allegrex_vsat0_s,
RABBITIZER_INSTR_ID_r4000allegrex_vsat0_p,
RABBITIZER_INSTR_ID_r4000allegrex_vsat0_t,
RABBITIZER_INSTR_ID_r4000allegrex_vsat0_q,
RABBITIZER_INSTR_ID_r4000allegrex_vsat1_s,
RABBITIZER_INSTR_ID_r4000allegrex_vsat1_p,
RABBITIZER_INSTR_ID_r4000allegrex_vsat1_t,
RABBITIZER_INSTR_ID_r4000allegrex_vsat1_q,
RABBITIZER_INSTR_ID_r4000allegrex_vzero_s,
RABBITIZER_INSTR_ID_r4000allegrex_vzero_p,
RABBITIZER_INSTR_ID_r4000allegrex_vzero_t,
RABBITIZER_INSTR_ID_r4000allegrex_vzero_q,
RABBITIZER_INSTR_ID_r4000allegrex_vone_s,
RABBITIZER_INSTR_ID_r4000allegrex_vone_p,
RABBITIZER_INSTR_ID_r4000allegrex_vone_t,
RABBITIZER_INSTR_ID_r4000allegrex_vone_q,
RABBITIZER_INSTR_ID_r4000allegrex_vrcp_s,
RABBITIZER_INSTR_ID_r4000allegrex_vrcp_p,
RABBITIZER_INSTR_ID_r4000allegrex_vrcp_t,
RABBITIZER_INSTR_ID_r4000allegrex_vrcp_q,
RABBITIZER_INSTR_ID_r4000allegrex_vrsq_s,
RABBITIZER_INSTR_ID_r4000allegrex_vrsq_p,
RABBITIZER_INSTR_ID_r4000allegrex_vrsq_t,
RABBITIZER_INSTR_ID_r4000allegrex_vrsq_q,
RABBITIZER_INSTR_ID_r4000allegrex_vsin_s,
RABBITIZER_INSTR_ID_r4000allegrex_vsin_p,
RABBITIZER_INSTR_ID_r4000allegrex_vsin_t,
RABBITIZER_INSTR_ID_r4000allegrex_vsin_q,
RABBITIZER_INSTR_ID_r4000allegrex_vcos_s,
RABBITIZER_INSTR_ID_r4000allegrex_vcos_p,
RABBITIZER_INSTR_ID_r4000allegrex_vcos_t,
RABBITIZER_INSTR_ID_r4000allegrex_vcos_q,
RABBITIZER_INSTR_ID_r4000allegrex_vexp2_s,
RABBITIZER_INSTR_ID_r4000allegrex_vexp2_p,
RABBITIZER_INSTR_ID_r4000allegrex_vexp2_t,
RABBITIZER_INSTR_ID_r4000allegrex_vexp2_q,
RABBITIZER_INSTR_ID_r4000allegrex_vlog2_s,
RABBITIZER_INSTR_ID_r4000allegrex_vlog2_p,
RABBITIZER_INSTR_ID_r4000allegrex_vlog2_t,
RABBITIZER_INSTR_ID_r4000allegrex_vlog2_q,
RABBITIZER_INSTR_ID_r4000allegrex_vsqrt_s,
RABBITIZER_INSTR_ID_r4000allegrex_vsqrt_p,
RABBITIZER_INSTR_ID_r4000allegrex_vsqrt_t,
RABBITIZER_INSTR_ID_r4000allegrex_vsqrt_q,
RABBITIZER_INSTR_ID_r4000allegrex_vasin_s,
RABBITIZER_INSTR_ID_r4000allegrex_vasin_p,
RABBITIZER_INSTR_ID_r4000allegrex_vasin_t,
RABBITIZER_INSTR_ID_r4000allegrex_vasin_q,
RABBITIZER_INSTR_ID_r4000allegrex_vnrcp_s,
RABBITIZER_INSTR_ID_r4000allegrex_vnrcp_p,
RABBITIZER_INSTR_ID_r4000allegrex_vnrcp_t,
RABBITIZER_INSTR_ID_r4000allegrex_vnrcp_q,
RABBITIZER_INSTR_ID_r4000allegrex_vnsin_s,
RABBITIZER_INSTR_ID_r4000allegrex_vnsin_p,
RABBITIZER_INSTR_ID_r4000allegrex_vnsin_t,
RABBITIZER_INSTR_ID_r4000allegrex_vnsin_q,
RABBITIZER_INSTR_ID_r4000allegrex_vrexp2_s,
RABBITIZER_INSTR_ID_r4000allegrex_vrexp2_p,
RABBITIZER_INSTR_ID_r4000allegrex_vrexp2_t,
RABBITIZER_INSTR_ID_r4000allegrex_vrexp2_q,
RABBITIZER_INSTR_ID_r4000allegrex_vrnds_s,
RABBITIZER_INSTR_ID_r4000allegrex_vrndi_s,
RABBITIZER_INSTR_ID_r4000allegrex_vrndi_p,
RABBITIZER_INSTR_ID_r4000allegrex_vrndi_t,
RABBITIZER_INSTR_ID_r4000allegrex_vrndi_q,
RABBITIZER_INSTR_ID_r4000allegrex_vrndf1_s,
RABBITIZER_INSTR_ID_r4000allegrex_vrndf1_p,
RABBITIZER_INSTR_ID_r4000allegrex_vrndf1_t,
RABBITIZER_INSTR_ID_r4000allegrex_vrndf1_q,
RABBITIZER_INSTR_ID_r4000allegrex_vrndf2_s,
RABBITIZER_INSTR_ID_r4000allegrex_vrndf2_p,
RABBITIZER_INSTR_ID_r4000allegrex_vrndf2_t,
RABBITIZER_INSTR_ID_r4000allegrex_vrndf2_q,
RABBITIZER_INSTR_ID_r4000allegrex_vf2h_p,
RABBITIZER_INSTR_ID_r4000allegrex_vf2h_q,
RABBITIZER_INSTR_ID_r4000allegrex_vh2f_s,
RABBITIZER_INSTR_ID_r4000allegrex_vh2f_p,
RABBITIZER_INSTR_ID_r4000allegrex_vsbz_s,
RABBITIZER_INSTR_ID_r4000allegrex_vlgb_s,
RABBITIZER_INSTR_ID_r4000allegrex_vuc2ifs_s,
RABBITIZER_INSTR_ID_r4000allegrex_vc2i_s,
RABBITIZER_INSTR_ID_r4000allegrex_vus2i_s,
RABBITIZER_INSTR_ID_r4000allegrex_vus2i_p,
RABBITIZER_INSTR_ID_r4000allegrex_vs2i_s,
RABBITIZER_INSTR_ID_r4000allegrex_vs2i_p,
RABBITIZER_INSTR_ID_r4000allegrex_vi2uc_q,
RABBITIZER_INSTR_ID_r4000allegrex_vi2c_q,
RABBITIZER_INSTR_ID_r4000allegrex_vi2us_p,
RABBITIZER_INSTR_ID_r4000allegrex_vi2us_q,
RABBITIZER_INSTR_ID_r4000allegrex_vi2s_p,
RABBITIZER_INSTR_ID_r4000allegrex_vi2s_q,
RABBITIZER_INSTR_ID_r4000allegrex_vsrt1_q,
RABBITIZER_INSTR_ID_r4000allegrex_vsrt2_q,
RABBITIZER_INSTR_ID_r4000allegrex_vbfy1_p,
RABBITIZER_INSTR_ID_r4000allegrex_vbfy1_q,
RABBITIZER_INSTR_ID_r4000allegrex_vbfy2_q,
RABBITIZER_INSTR_ID_r4000allegrex_vocp_s,
RABBITIZER_INSTR_ID_r4000allegrex_vocp_p,
RABBITIZER_INSTR_ID_r4000allegrex_vocp_t,
RABBITIZER_INSTR_ID_r4000allegrex_vocp_q,
RABBITIZER_INSTR_ID_r4000allegrex_vsocp_s,
RABBITIZER_INSTR_ID_r4000allegrex_vsocp_p,
RABBITIZER_INSTR_ID_r4000allegrex_vfad_p,
RABBITIZER_INSTR_ID_r4000allegrex_vfad_t,
RABBITIZER_INSTR_ID_r4000allegrex_vfad_q,
RABBITIZER_INSTR_ID_r4000allegrex_vavg_p,
RABBITIZER_INSTR_ID_r4000allegrex_vavg_t,
RABBITIZER_INSTR_ID_r4000allegrex_vavg_q,
RABBITIZER_INSTR_ID_r4000allegrex_vsrt3_q,
RABBITIZER_INSTR_ID_r4000allegrex_vsrt4_q,
RABBITIZER_INSTR_ID_r4000allegrex_vsgn_s,
RABBITIZER_INSTR_ID_r4000allegrex_vsgn_p,
RABBITIZER_INSTR_ID_r4000allegrex_vsgn_t,
RABBITIZER_INSTR_ID_r4000allegrex_vsgn_q,
RABBITIZER_INSTR_ID_r4000allegrex_vmfvc,
RABBITIZER_INSTR_ID_r4000allegrex_vmtvc,
RABBITIZER_INSTR_ID_r4000allegrex_vt4444_q,
RABBITIZER_INSTR_ID_r4000allegrex_vt5551_q,
RABBITIZER_INSTR_ID_r4000allegrex_vt5650_q,
RABBITIZER_INSTR_ID_r4000allegrex_vcst_s,
RABBITIZER_INSTR_ID_r4000allegrex_vcst_p,
RABBITIZER_INSTR_ID_r4000allegrex_vcst_t,
RABBITIZER_INSTR_ID_r4000allegrex_vcst_q,
RABBITIZER_INSTR_ID_r4000allegrex_vf2in_s,
RABBITIZER_INSTR_ID_r4000allegrex_vf2in_p,
RABBITIZER_INSTR_ID_r4000allegrex_vf2in_t,
RABBITIZER_INSTR_ID_r4000allegrex_vf2in_q,
RABBITIZER_INSTR_ID_r4000allegrex_vf2iz_s,
RABBITIZER_INSTR_ID_r4000allegrex_vf2iz_p,
RABBITIZER_INSTR_ID_r4000allegrex_vf2iz_t,
RABBITIZER_INSTR_ID_r4000allegrex_vf2iz_q,
RABBITIZER_INSTR_ID_r4000allegrex_vf2iu_s,
RABBITIZER_INSTR_ID_r4000allegrex_vf2iu_p,
RABBITIZER_INSTR_ID_r4000allegrex_vf2iu_t,
RABBITIZER_INSTR_ID_r4000allegrex_vf2iu_q,
RABBITIZER_INSTR_ID_r4000allegrex_vf2id_s,
RABBITIZER_INSTR_ID_r4000allegrex_vf2id_p,
RABBITIZER_INSTR_ID_r4000allegrex_vf2id_t,
RABBITIZER_INSTR_ID_r4000allegrex_vf2id_q,
RABBITIZER_INSTR_ID_r4000allegrex_vi2f_s,
RABBITIZER_INSTR_ID_r4000allegrex_vi2f_p,
RABBITIZER_INSTR_ID_r4000allegrex_vi2f_t,
RABBITIZER_INSTR_ID_r4000allegrex_vi2f_q,
RABBITIZER_INSTR_ID_r4000allegrex_vcmovt_s,
RABBITIZER_INSTR_ID_r4000allegrex_vcmovt_p,
RABBITIZER_INSTR_ID_r4000allegrex_vcmovt_t,
RABBITIZER_INSTR_ID_r4000allegrex_vcmovt_q,
RABBITIZER_INSTR_ID_r4000allegrex_vcmovf_s,
RABBITIZER_INSTR_ID_r4000allegrex_vcmovf_p,
RABBITIZER_INSTR_ID_r4000allegrex_vcmovf_t,
RABBITIZER_INSTR_ID_r4000allegrex_vcmovf_q,
RABBITIZER_INSTR_ID_r4000allegrex_vpfxs,
RABBITIZER_INSTR_ID_r4000allegrex_vpfxt,
RABBITIZER_INSTR_ID_r4000allegrex_vpfxd,
RABBITIZER_INSTR_ID_r4000allegrex_viim_s,
RABBITIZER_INSTR_ID_r4000allegrex_vfim_s,
RABBITIZER_INSTR_ID_r4000allegrex_vmmul_p,
RABBITIZER_INSTR_ID_r4000allegrex_vmmul_t,
RABBITIZER_INSTR_ID_r4000allegrex_vmmul_q,
RABBITIZER_INSTR_ID_r4000allegrex_vhtfm2_p,
RABBITIZER_INSTR_ID_r4000allegrex_vtfm2_p,
RABBITIZER_INSTR_ID_r4000allegrex_vhtfm3_t,
RABBITIZER_INSTR_ID_r4000allegrex_vtfm3_t,
RABBITIZER_INSTR_ID_r4000allegrex_vhtfm4_q,
RABBITIZER_INSTR_ID_r4000allegrex_vtfm4_q,
RABBITIZER_INSTR_ID_r4000allegrex_vmscl_p,
RABBITIZER_INSTR_ID_r4000allegrex_vmscl_t,
RABBITIZER_INSTR_ID_r4000allegrex_vmscl_q,
RABBITIZER_INSTR_ID_r4000allegrex_vcrsp_t,
RABBITIZER_INSTR_ID_r4000allegrex_vqmul_q,
RABBITIZER_INSTR_ID_r4000allegrex_vrot_p,
RABBITIZER_INSTR_ID_r4000allegrex_vrot_t,
RABBITIZER_INSTR_ID_r4000allegrex_vrot_q,
RABBITIZER_INSTR_ID_r4000allegrex_vmmov_p,
RABBITIZER_INSTR_ID_r4000allegrex_vmmov_t,
RABBITIZER_INSTR_ID_r4000allegrex_vmmov_q,
RABBITIZER_INSTR_ID_r4000allegrex_vmidt_p,
RABBITIZER_INSTR_ID_r4000allegrex_vmidt_t,
RABBITIZER_INSTR_ID_r4000allegrex_vmidt_q,
RABBITIZER_INSTR_ID_r4000allegrex_vmzero_p,
RABBITIZER_INSTR_ID_r4000allegrex_vmzero_t,
RABBITIZER_INSTR_ID_r4000allegrex_vmzero_q,
RABBITIZER_INSTR_ID_r4000allegrex_vmone_p,
RABBITIZER_INSTR_ID_r4000allegrex_vmone_t,
RABBITIZER_INSTR_ID_r4000allegrex_vmone_q,
RABBITIZER_INSTR_ID_r4000allegrex_vnop,
RABBITIZER_INSTR_ID_r4000allegrex_vsync,
RABBITIZER_INSTR_ID_r4000allegrex_vflush,
RABBITIZER_INSTR_ID_r4000allegrex_svl_q,
RABBITIZER_INSTR_ID_r4000allegrex_svr_q,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_00,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_01,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_02,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_03,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_04,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_05,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_06,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_07,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_08,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_09,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_10,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_11,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_12,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_13,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_14,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_15,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_16,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_17,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_18,
RABBITIZER_INSTR_ID_r4000allegrex_USERDEF_19,
RABBITIZER_INSTR_ID_r4000allegrex_MAX,
RABBITIZER_INSTR_ID_r5900_INVALID,
RABBITIZER_INSTR_ID_r5900_lq,
RABBITIZER_INSTR_ID_r5900_sq,
@ -734,7 +1048,8 @@ typedef enum RabbitizerInstrId {
RABBITIZER_INSTR_ID_r5900_USERDEF_18,
RABBITIZER_INSTR_ID_r5900_USERDEF_19,
RABBITIZER_INSTR_ID_r5900_MAX,
RABBITIZER_INSTR_ID_ALL_MAX = RABBITIZER_INSTR_ID_r5900_MAX,
RABBITIZER_INSTR_ID_ALL_LAST,
RABBITIZER_INSTR_ID_ALL_MAX = RABBITIZER_INSTR_ID_ALL_LAST - 1
} RabbitizerInstrId;
#endif

View File

@ -52,6 +52,63 @@ typedef enum RabbitizerOperandType {
RAB_OPERAND_r3000gte_v,
RAB_OPERAND_r3000gte_cv,
RAB_OPERAND_r3000gte_lm,
RAB_OPERAND_r4000allegrex_s_vs,
RAB_OPERAND_r4000allegrex_s_vt,
RAB_OPERAND_r4000allegrex_s_vd,
RAB_OPERAND_r4000allegrex_s_vt_imm,
RAB_OPERAND_r4000allegrex_s_vd_imm,
RAB_OPERAND_r4000allegrex_p_vs,
RAB_OPERAND_r4000allegrex_p_vt,
RAB_OPERAND_r4000allegrex_p_vd,
RAB_OPERAND_r4000allegrex_t_vs,
RAB_OPERAND_r4000allegrex_t_vt,
RAB_OPERAND_r4000allegrex_t_vd,
RAB_OPERAND_r4000allegrex_q_vs,
RAB_OPERAND_r4000allegrex_q_vt,
RAB_OPERAND_r4000allegrex_q_vd,
RAB_OPERAND_r4000allegrex_q_vt_imm,
RAB_OPERAND_r4000allegrex_mp_vs,
RAB_OPERAND_r4000allegrex_mp_vt,
RAB_OPERAND_r4000allegrex_mp_vd,
RAB_OPERAND_r4000allegrex_mp_vs_transpose,
RAB_OPERAND_r4000allegrex_mt_vs,
RAB_OPERAND_r4000allegrex_mt_vt,
RAB_OPERAND_r4000allegrex_mt_vd,
RAB_OPERAND_r4000allegrex_mt_vs_transpose,
RAB_OPERAND_r4000allegrex_mq_vs,
RAB_OPERAND_r4000allegrex_mq_vt,
RAB_OPERAND_r4000allegrex_mq_vd,
RAB_OPERAND_r4000allegrex_mq_vs_transpose,
RAB_OPERAND_r4000allegrex_cop2cs,
RAB_OPERAND_r4000allegrex_cop2cd,
RAB_OPERAND_r4000allegrex_pos,
RAB_OPERAND_r4000allegrex_size,
RAB_OPERAND_r4000allegrex_size_plus_pos,
RAB_OPERAND_r4000allegrex_imm3,
RAB_OPERAND_r4000allegrex_offset14_base,
RAB_OPERAND_r4000allegrex_offset14_base_maybe_wb,
RAB_OPERAND_r4000allegrex_vcmp_cond,
RAB_OPERAND_r4000allegrex_vcmp_cond_s_maybe_vs_maybe_vt,
RAB_OPERAND_r4000allegrex_vcmp_cond_p_maybe_vs_maybe_vt,
RAB_OPERAND_r4000allegrex_vcmp_cond_t_maybe_vs_maybe_vt,
RAB_OPERAND_r4000allegrex_vcmp_cond_q_maybe_vs_maybe_vt,
RAB_OPERAND_r4000allegrex_vconstant,
RAB_OPERAND_r4000allegrex_power_of_two,
RAB_OPERAND_r4000allegrex_vfpu_cc_bit,
RAB_OPERAND_r4000allegrex_bn,
RAB_OPERAND_r4000allegrex_int16,
RAB_OPERAND_r4000allegrex_float16,
RAB_OPERAND_r4000allegrex_p_vrot_code,
RAB_OPERAND_r4000allegrex_t_vrot_code,
RAB_OPERAND_r4000allegrex_q_vrot_code,
RAB_OPERAND_r4000allegrex_rpx,
RAB_OPERAND_r4000allegrex_rpy,
RAB_OPERAND_r4000allegrex_rpz,
RAB_OPERAND_r4000allegrex_rpw,
RAB_OPERAND_r4000allegrex_wpx,
RAB_OPERAND_r4000allegrex_wpy,
RAB_OPERAND_r4000allegrex_wpz,
RAB_OPERAND_r4000allegrex_wpw,
RAB_OPERAND_r5900_I,
RAB_OPERAND_r5900_Q,
RAB_OPERAND_r5900_R,

View File

@ -50,6 +50,63 @@
size_t RabbitizerOperandType_process_r3000gte_v (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r3000gte_cv (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r3000gte_lm (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_s_vs (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_s_vt (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_s_vd (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_s_vt_imm (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_s_vd_imm (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_p_vs (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_p_vt (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_p_vd (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_t_vs (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_t_vt (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_t_vd (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_q_vs (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_q_vt (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_q_vd (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_q_vt_imm (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_mp_vs (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_mp_vt (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_mp_vd (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_mp_vs_transpose (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_mt_vs (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_mt_vt (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_mt_vd (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_mt_vs_transpose (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_mq_vs (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_mq_vt (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_mq_vd (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_mq_vs_transpose (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_cop2cs (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_cop2cd (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_pos (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_size (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_size_plus_pos (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_imm3 (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_offset14_base (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_offset14_base_maybe_wb (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_vcmp_cond (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_vcmp_cond_s_maybe_vs_maybe_vt (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_vcmp_cond_p_maybe_vs_maybe_vt (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_vcmp_cond_t_maybe_vs_maybe_vt (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_vcmp_cond_q_maybe_vs_maybe_vt (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_vconstant (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_power_of_two (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_vfpu_cc_bit (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_bn (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_int16 (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_float16 (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_p_vrot_code (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_t_vrot_code (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_q_vrot_code (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_rpx (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_rpy (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_rpz (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_rpw (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_wpx (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_wpy (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_wpz (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r4000allegrex_wpw (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r5900_I (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r5900_Q (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);
size_t RabbitizerOperandType_process_r5900_R (const struct RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -51,6 +51,63 @@ const OperandCallback instrOpercandCallbacks[] = {
[RAB_OPERAND_r3000gte_v] = RabbitizerOperandType_process_r3000gte_v,
[RAB_OPERAND_r3000gte_cv] = RabbitizerOperandType_process_r3000gte_cv,
[RAB_OPERAND_r3000gte_lm] = RabbitizerOperandType_process_r3000gte_lm,
[RAB_OPERAND_r4000allegrex_s_vs] = RabbitizerOperandType_process_r4000allegrex_s_vs,
[RAB_OPERAND_r4000allegrex_s_vt] = RabbitizerOperandType_process_r4000allegrex_s_vt,
[RAB_OPERAND_r4000allegrex_s_vd] = RabbitizerOperandType_process_r4000allegrex_s_vd,
[RAB_OPERAND_r4000allegrex_s_vt_imm] = RabbitizerOperandType_process_r4000allegrex_s_vt_imm,
[RAB_OPERAND_r4000allegrex_s_vd_imm] = RabbitizerOperandType_process_r4000allegrex_s_vd_imm,
[RAB_OPERAND_r4000allegrex_p_vs] = RabbitizerOperandType_process_r4000allegrex_p_vs,
[RAB_OPERAND_r4000allegrex_p_vt] = RabbitizerOperandType_process_r4000allegrex_p_vt,
[RAB_OPERAND_r4000allegrex_p_vd] = RabbitizerOperandType_process_r4000allegrex_p_vd,
[RAB_OPERAND_r4000allegrex_t_vs] = RabbitizerOperandType_process_r4000allegrex_t_vs,
[RAB_OPERAND_r4000allegrex_t_vt] = RabbitizerOperandType_process_r4000allegrex_t_vt,
[RAB_OPERAND_r4000allegrex_t_vd] = RabbitizerOperandType_process_r4000allegrex_t_vd,
[RAB_OPERAND_r4000allegrex_q_vs] = RabbitizerOperandType_process_r4000allegrex_q_vs,
[RAB_OPERAND_r4000allegrex_q_vt] = RabbitizerOperandType_process_r4000allegrex_q_vt,
[RAB_OPERAND_r4000allegrex_q_vd] = RabbitizerOperandType_process_r4000allegrex_q_vd,
[RAB_OPERAND_r4000allegrex_q_vt_imm] = RabbitizerOperandType_process_r4000allegrex_q_vt_imm,
[RAB_OPERAND_r4000allegrex_mp_vs] = RabbitizerOperandType_process_r4000allegrex_mp_vs,
[RAB_OPERAND_r4000allegrex_mp_vt] = RabbitizerOperandType_process_r4000allegrex_mp_vt,
[RAB_OPERAND_r4000allegrex_mp_vd] = RabbitizerOperandType_process_r4000allegrex_mp_vd,
[RAB_OPERAND_r4000allegrex_mp_vs_transpose] = RabbitizerOperandType_process_r4000allegrex_mp_vs_transpose,
[RAB_OPERAND_r4000allegrex_mt_vs] = RabbitizerOperandType_process_r4000allegrex_mt_vs,
[RAB_OPERAND_r4000allegrex_mt_vt] = RabbitizerOperandType_process_r4000allegrex_mt_vt,
[RAB_OPERAND_r4000allegrex_mt_vd] = RabbitizerOperandType_process_r4000allegrex_mt_vd,
[RAB_OPERAND_r4000allegrex_mt_vs_transpose] = RabbitizerOperandType_process_r4000allegrex_mt_vs_transpose,
[RAB_OPERAND_r4000allegrex_mq_vs] = RabbitizerOperandType_process_r4000allegrex_mq_vs,
[RAB_OPERAND_r4000allegrex_mq_vt] = RabbitizerOperandType_process_r4000allegrex_mq_vt,
[RAB_OPERAND_r4000allegrex_mq_vd] = RabbitizerOperandType_process_r4000allegrex_mq_vd,
[RAB_OPERAND_r4000allegrex_mq_vs_transpose] = RabbitizerOperandType_process_r4000allegrex_mq_vs_transpose,
[RAB_OPERAND_r4000allegrex_cop2cs] = RabbitizerOperandType_process_r4000allegrex_cop2cs,
[RAB_OPERAND_r4000allegrex_cop2cd] = RabbitizerOperandType_process_r4000allegrex_cop2cd,
[RAB_OPERAND_r4000allegrex_pos] = RabbitizerOperandType_process_r4000allegrex_pos,
[RAB_OPERAND_r4000allegrex_size] = RabbitizerOperandType_process_r4000allegrex_size,
[RAB_OPERAND_r4000allegrex_size_plus_pos] = RabbitizerOperandType_process_r4000allegrex_size_plus_pos,
[RAB_OPERAND_r4000allegrex_imm3] = RabbitizerOperandType_process_r4000allegrex_imm3,
[RAB_OPERAND_r4000allegrex_offset14_base] = RabbitizerOperandType_process_r4000allegrex_offset14_base,
[RAB_OPERAND_r4000allegrex_offset14_base_maybe_wb] = RabbitizerOperandType_process_r4000allegrex_offset14_base_maybe_wb,
[RAB_OPERAND_r4000allegrex_vcmp_cond] = RabbitizerOperandType_process_r4000allegrex_vcmp_cond,
[RAB_OPERAND_r4000allegrex_vcmp_cond_s_maybe_vs_maybe_vt] = RabbitizerOperandType_process_r4000allegrex_vcmp_cond_s_maybe_vs_maybe_vt,
[RAB_OPERAND_r4000allegrex_vcmp_cond_p_maybe_vs_maybe_vt] = RabbitizerOperandType_process_r4000allegrex_vcmp_cond_p_maybe_vs_maybe_vt,
[RAB_OPERAND_r4000allegrex_vcmp_cond_t_maybe_vs_maybe_vt] = RabbitizerOperandType_process_r4000allegrex_vcmp_cond_t_maybe_vs_maybe_vt,
[RAB_OPERAND_r4000allegrex_vcmp_cond_q_maybe_vs_maybe_vt] = RabbitizerOperandType_process_r4000allegrex_vcmp_cond_q_maybe_vs_maybe_vt,
[RAB_OPERAND_r4000allegrex_vconstant] = RabbitizerOperandType_process_r4000allegrex_vconstant,
[RAB_OPERAND_r4000allegrex_power_of_two] = RabbitizerOperandType_process_r4000allegrex_power_of_two,
[RAB_OPERAND_r4000allegrex_vfpu_cc_bit] = RabbitizerOperandType_process_r4000allegrex_vfpu_cc_bit,
[RAB_OPERAND_r4000allegrex_bn] = RabbitizerOperandType_process_r4000allegrex_bn,
[RAB_OPERAND_r4000allegrex_int16] = RabbitizerOperandType_process_r4000allegrex_int16,
[RAB_OPERAND_r4000allegrex_float16] = RabbitizerOperandType_process_r4000allegrex_float16,
[RAB_OPERAND_r4000allegrex_p_vrot_code] = RabbitizerOperandType_process_r4000allegrex_p_vrot_code,
[RAB_OPERAND_r4000allegrex_t_vrot_code] = RabbitizerOperandType_process_r4000allegrex_t_vrot_code,
[RAB_OPERAND_r4000allegrex_q_vrot_code] = RabbitizerOperandType_process_r4000allegrex_q_vrot_code,
[RAB_OPERAND_r4000allegrex_rpx] = RabbitizerOperandType_process_r4000allegrex_rpx,
[RAB_OPERAND_r4000allegrex_rpy] = RabbitizerOperandType_process_r4000allegrex_rpy,
[RAB_OPERAND_r4000allegrex_rpz] = RabbitizerOperandType_process_r4000allegrex_rpz,
[RAB_OPERAND_r4000allegrex_rpw] = RabbitizerOperandType_process_r4000allegrex_rpw,
[RAB_OPERAND_r4000allegrex_wpx] = RabbitizerOperandType_process_r4000allegrex_wpx,
[RAB_OPERAND_r4000allegrex_wpy] = RabbitizerOperandType_process_r4000allegrex_wpy,
[RAB_OPERAND_r4000allegrex_wpz] = RabbitizerOperandType_process_r4000allegrex_wpz,
[RAB_OPERAND_r4000allegrex_wpw] = RabbitizerOperandType_process_r4000allegrex_wpw,
[RAB_OPERAND_r5900_I] = RabbitizerOperandType_process_r5900_I,
[RAB_OPERAND_r5900_Q] = RabbitizerOperandType_process_r5900_Q,
[RAB_OPERAND_r5900_R] = RabbitizerOperandType_process_r5900_R,

View File

@ -0,0 +1,248 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
#ifndef RABBITIZER_INSTRUCTION_R4000ALLEGREX_H
#define RABBITIZER_INSTRUCTION_R4000ALLEGREX_H
#pragma once
#include "RabbitizerInstruction.h"
#ifdef __cplusplus
extern "C" {
#endif
#define RAB_INSTR_R4000ALLEGREX_GET_vt(self) (SHIFTR((self)->word, 16, 7))
#define RAB_INSTR_R4000ALLEGREX_GET_vs(self) (SHIFTR((self)->word, 8, 7))
#define RAB_INSTR_R4000ALLEGREX_GET_vd(self) (SHIFTR((self)->word, 0, 7))
// For whatever reason the transpose just toggles bit 5, no clue why.
#define RAB_INSTR_R4000ALLEGREX_GET_vs_transpose(self) (SHIFTR((self)->word, 8, 7) ^ 0x20)
#define RAB_INSTR_R4000ALLEGREX_GET_vt_imm(self) ((SHIFTR((self)->word, 0, 2) << 5) | (SHIFTR((self)->word, 16, 5)))
#define RAB_INSTR_R4000ALLEGREX_GET_vd_imm(self) (SHIFTR((self)->word, 16, 7))
#define RAB_INSTR_R4000ALLEGREX_GET_vt_6_imm(self) ((SHIFTR((self)->word, 0, 1) << 5) | (SHIFTR((self)->word, 16, 5)))
#define RAB_INSTR_R4000ALLEGREX_GET_cop2cs(self) (SHIFTR((self)->word, 8, 7))
#define RAB_INSTR_R4000ALLEGREX_GET_cop2cd(self) (SHIFTR((self)->word, 0, 7))
#define RAB_INSTR_R4000ALLEGREX_GET_pos(self) (SHIFTR((self)->word, 6, 5))
#define RAB_INSTR_R4000ALLEGREX_GET_size(self) (SHIFTR((self)->word, 11, 5))
#define RAB_INSTR_R4000ALLEGREX_GET_size_plus_pos(self) (SHIFTR((self)->word, 11, 5))
#define RAB_INSTR_R4000ALLEGREX_GET_bc2_fmt(self) (SHIFTR((self)->word, 16, 2))
#define RAB_INSTR_R4000ALLEGREX_GET_mxhc2(self) (SHIFTR((self)->word, 7, 1))
#define RAB_INSTR_R4000ALLEGREX_GET_mfhc2_p_fmt(self) (SHIFTR((self)->word, 4, 3))
#define RAB_INSTR_R4000ALLEGREX_GET_mfhc2_p_s_fmt(self) (SHIFTR((self)->word, 0, 4))
#define RAB_INSTR_R4000ALLEGREX_GET_imm3(self) (SHIFTR((self)->word, 18, 3))
#define RAB_INSTR_R4000ALLEGREX_GET_offset14(self) (SHIFTR((self)->word, 2, 14))
#define RAB_INSTR_R4000ALLEGREX_GET_wb(self) (SHIFTR((self)->word, 1, 1))
#define RAB_INSTR_R4000ALLEGREX_GET_tp(self) ((SHIFTR((self)->word, 15, 1) << 1) | (SHIFTR((self)->word, 7, 1)))
#define RAB_INSTR_R4000ALLEGREX_GET_vfpu0_fmt(self) ((SHIFTR((self)->word, 23, 3) << 2) | RAB_INSTR_R4000ALLEGREX_GET_tp(self))
#define RAB_INSTR_R4000ALLEGREX_GET_vfpu4_fmt(self) ((SHIFTR((self)->word, 24, 2) << 2) | RAB_INSTR_R4000ALLEGREX_GET_tp(self))
#define RAB_INSTR_R4000ALLEGREX_GET_vfpu4_fmt0_fmt(self) (SHIFTR((self)->word, 19, 5))
#define RAB_INSTR_R4000ALLEGREX_GET_vfpu4_fmt0_fmt0_fmt(self) ((SHIFTR((self)->word, 16, 3) << 2) | RAB_INSTR_R4000ALLEGREX_GET_tp(self))
#define RAB_INSTR_R4000ALLEGREX_GET_vfpu4_fmt2_fmt(self) ((SHIFTR((self)->word, 21, 3) << 2) | RAB_INSTR_R4000ALLEGREX_GET_tp(self))
#define RAB_INSTR_R4000ALLEGREX_GET_vfpu4_fmt2_cndmove_fmt(self) ((SHIFTR((self)->word, 19, 2) << 2) | RAB_INSTR_R4000ALLEGREX_GET_tp(self))
#define RAB_INSTR_R4000ALLEGREX_GET_vfpu5_fmt(self) (SHIFTR((self)->word, 23, 3))
#define RAB_INSTR_R4000ALLEGREX_GET_vfpu6_fmt(self) ((SHIFTR((self)->word, 23, 3) << 2) | RAB_INSTR_R4000ALLEGREX_GET_tp(self))
#define RAB_INSTR_R4000ALLEGREX_GET_vfpu6_fmt7_fmt(self) ((SHIFTR((self)->word, 21, 2) << 2) | RAB_INSTR_R4000ALLEGREX_GET_tp(self))
#define RAB_INSTR_R4000ALLEGREX_GET_vfpu6_fmt7_fmt0_fmt(self) ((SHIFTR((self)->word, 16, 3) << 2) | RAB_INSTR_R4000ALLEGREX_GET_tp(self))
#define RAB_INSTR_R4000ALLEGREX_GET_vfpu7_fmt(self) (SHIFTR((self)->word, 0, 26))
#define RAB_INSTR_R4000ALLEGREX_GET_vcmp_cond(self) (SHIFTR((self)->word, 0, 4))
#define RAB_INSTR_R4000ALLEGREX_GET_vconstant(self) (SHIFTR((self)->word, 16, 5))
#define RAB_INSTR_R4000ALLEGREX_GET_power_of_two(self) (SHIFTR((self)->word, 16, 5))
#define RAB_INSTR_R4000ALLEGREX_GET_vfpu_cc_bit(self) (SHIFTR((self)->word, 16, 3))
#define RAB_INSTR_R4000ALLEGREX_GET_bn(self) (SHIFTR((self)->word, 16, 8))
#define RAB_INSTR_R4000ALLEGREX_GET_intfloat16(self) (SHIFTR((self)->word, 0, 16))
#define RAB_INSTR_R4000ALLEGREX_GET_vrot_code(self) (SHIFTR((self)->word, 16, 5))
#define RAB_INSTR_R4000ALLEGREX_GET_rpx(self) ((SHIFTR((self)->word, 16, 1) << 4) | (SHIFTR((self)->word, 12, 1) << 3) | (SHIFTR((self)->word, 8, 1) << 2) | (SHIFTR((self)->word, 0, 2) << 0))
#define RAB_INSTR_R4000ALLEGREX_GET_rpy(self) ((SHIFTR((self)->word, 17, 1) << 4) | (SHIFTR((self)->word, 13, 1) << 3) | (SHIFTR((self)->word, 9, 1) << 2) | (SHIFTR((self)->word, 2, 2) << 0))
#define RAB_INSTR_R4000ALLEGREX_GET_rpz(self) ((SHIFTR((self)->word, 18, 1) << 4) | (SHIFTR((self)->word, 14, 1) << 3) | (SHIFTR((self)->word, 10, 1) << 2) | (SHIFTR((self)->word, 4, 2) << 0))
#define RAB_INSTR_R4000ALLEGREX_GET_rpw(self) ((SHIFTR((self)->word, 19, 1) << 4) | (SHIFTR((self)->word, 15, 1) << 3) | (SHIFTR((self)->word, 11, 1) << 2) | (SHIFTR((self)->word, 6, 2) << 0))
#define RAB_INSTR_R4000ALLEGREX_GET_wpx(self) ((SHIFTR((self)->word, 8, 1) << 2) | (SHIFTR((self)->word, 0, 2) << 0))
#define RAB_INSTR_R4000ALLEGREX_GET_wpy(self) ((SHIFTR((self)->word, 9, 1) << 2) | (SHIFTR((self)->word, 2, 2) << 0))
#define RAB_INSTR_R4000ALLEGREX_GET_wpz(self) ((SHIFTR((self)->word, 10, 1) << 2) | (SHIFTR((self)->word, 4, 2) << 0))
#define RAB_INSTR_R4000ALLEGREX_GET_wpw(self) ((SHIFTR((self)->word, 11, 1) << 2) | (SHIFTR((self)->word, 6, 2) << 0))
#define RAB_INSTR_R4000ALLEGREX_PACK_vt(word, value) (BITREPACK((word), (value), 16, 7))
#define RAB_INSTR_R4000ALLEGREX_PACK_vs(word, value) (BITREPACK((word), (value), 8, 7))
#define RAB_INSTR_R4000ALLEGREX_PACK_vd(word, value) (BITREPACK((word), (value), 0, 7))
#define RAB_INSTR_R4000ALLEGREX_PACK_vt_imm(word, value) (BITREPACK(BITREPACK((word), (value) >> 5, 0, 2), (value), 16, 5))
#define RAB_INSTR_R4000ALLEGREX_PACK_vd_imm(word, value) (BITREPACK((word), (value), 16, 7))
#define RAB_INSTR_R4000ALLEGREX_PACK_vt_6_imm(word, value) (BITREPACK(BITREPACK((word), (value) >> 5, 0, 1), (value), 16, 5))
#define RAB_INSTR_R4000ALLEGREX_PACK_cop2cs(word, value) (BITREPACK((word), (value), 8, 7))
#define RAB_INSTR_R4000ALLEGREX_PACK_cop2cd(word, value) (BITREPACK((word), (value), 0, 7))
#define RAB_INSTR_R4000ALLEGREX_PACK_pos(word, value) (BITREPACK((word), (value), 6, 5))
#define RAB_INSTR_R4000ALLEGREX_PACK_size(word, value) (BITREPACK((word), (value), 11, 5))
#define RAB_INSTR_R4000ALLEGREX_PACK_size_plus_pos(word, value) (BITREPACK((word), (value), 11, 5))
#define RAB_INSTR_R4000ALLEGREX_PACK_bc2_fmt(word, value) (BITREPACK((word), (value), 16, 2))
#define RAB_INSTR_R4000ALLEGREX_PACK_mxhc2(word, value) (BITREPACK((word), (value), 7, 1))
#define RAB_INSTR_R4000ALLEGREX_PACK_mfhc2_p_fmt(word, value) (BITREPACK((word), (value), 4, 3))
#define RAB_INSTR_R4000ALLEGREX_PACK_mfhc2_p_s_fmt(word, value) (BITREPACK((word), (value), 0, 4))
#define RAB_INSTR_R4000ALLEGREX_PACK_imm3(word, value) (BITREPACK((word), (value), 18, 3))
#define RAB_INSTR_R4000ALLEGREX_PACK_offset14(word, value) (BITREPACK((word), (value), 2, 14))
#define RAB_INSTR_R4000ALLEGREX_PACK_wb(word, value) (BITREPACK((word), (value), 1, 1))
#define RAB_INSTR_R4000ALLEGREX_PACK_tp(word, value) (BITREPACK(BITREPACK((word), (value) >> 1, 15, 1), (value), 7, 1))
#define RAB_INSTR_R4000ALLEGREX_PACK_vfpu0_fmt(word, value) (RAB_INSTR_R4000ALLEGREX_PACK_tp(BITREPACK((word), (value) >> 2, 23, 3), (value)))
#define RAB_INSTR_R4000ALLEGREX_PACK_vfpu4_fmt(word, value) (RAB_INSTR_R4000ALLEGREX_PACK_tp(BITREPACK((word), (value) >> 2, 24, 2), (value)))
#define RAB_INSTR_R4000ALLEGREX_PACK_vfpu4_fmt0_fmt(word, value) (BITREPACK((word), (value), 19, 5))
#define RAB_INSTR_R4000ALLEGREX_PACK_vfpu4_fmt0_fmt0_fmt(word, value) (RAB_INSTR_R4000ALLEGREX_PACK_tp(BITREPACK((word), (value) >> 2, 16, 3), (value)))
#define RAB_INSTR_R4000ALLEGREX_PACK_vfpu4_fmt2_fmt(word, value) (RAB_INSTR_R4000ALLEGREX_PACK_tp(BITREPACK((word), (value) >> 2, 21, 3), (value)))
#define RAB_INSTR_R4000ALLEGREX_PACK_vfpu4_fmt2_cndmove_fmt(word, value) (RAB_INSTR_R4000ALLEGREX_PACK_tp(BITREPACK((word), (value) >> 2, 19, 2), (value)))
#define RAB_INSTR_R4000ALLEGREX_PACK_vfpu5_fmt(word, value) (BITREPACK((word), (value), 23, 3))
#define RAB_INSTR_R4000ALLEGREX_PACK_vfpu6_fmt(word, value) (RAB_INSTR_R4000ALLEGREX_PACK_tp(BITREPACK((word), (value) >> 2, 23, 3), (value)))
#define RAB_INSTR_R4000ALLEGREX_PACK_vfpu6_fmt7_fmt(word, value) (RAB_INSTR_R4000ALLEGREX_PACK_tp(BITREPACK((word), (value) >> 2, 21, 2), (value)))
#define RAB_INSTR_R4000ALLEGREX_PACK_vfpu6_fmt7_fmt0_fmt(word, value) (RAB_INSTR_R4000ALLEGREX_PACK_tp(BITREPACK((word), (value) >> 2, 16, 3), (value)))
#define RAB_INSTR_R4000ALLEGREX_PACK_vfpu7_fmt(word, value) (BITREPACK((word), (value), 0, 26))
#define RAB_INSTR_R4000ALLEGREX_PACK_vcmp_cond(word, value) (BITREPACK((word), (value), 0, 4))
#define RAB_INSTR_R4000ALLEGREX_PACK_vconstant(word, value) (BITREPACK((word), (value), 16, 5))
#define RAB_INSTR_R4000ALLEGREX_PACK_power_of_two(word, value) (BITREPACK((word), (value), 16, 5))
#define RAB_INSTR_R4000ALLEGREX_PACK_vfpu_cc_bit(word, value) (BITREPACK((word), (value), 16, 3))
#define RAB_INSTR_R4000ALLEGREX_PACK_bn(word, value) (BITREPACK((word), (value), 16, 8))
#define RAB_INSTR_R4000ALLEGREX_PACK_intfloat16(word, value) (BITREPACK((word), (value), 0, 16))
#define RAB_INSTR_R4000ALLEGREX_PACK_vrot_code(word, value) (BITREPACK((word), (value), 16, 5))
#define RAB_INSTR_R4000ALLEGREX_PACK_rpx(word, value) (BITREPACK(BITREPACK(BITREPACK(BITREPACK((word), (value) >> 4, 16, 1), (value) >> 3, 12, 1), (value) >> 2, 8, 1), (value), 0, 2))
#define RAB_INSTR_R4000ALLEGREX_PACK_rpy(word, value) (BITREPACK(BITREPACK(BITREPACK(BITREPACK((word), (value) >> 4, 17, 1), (value) >> 3, 13, 1), (value) >> 2, 9, 1), (value), 2, 2))
#define RAB_INSTR_R4000ALLEGREX_PACK_rpz(word, value) (BITREPACK(BITREPACK(BITREPACK(BITREPACK((word), (value) >> 4, 18, 1), (value) >> 3, 14, 1), (value) >> 2, 10, 1), (value), 4, 2))
#define RAB_INSTR_R4000ALLEGREX_PACK_rpw(word, value) (BITREPACK(BITREPACK(BITREPACK(BITREPACK((word), (value) >> 4, 19, 1), (value) >> 3, 15, 1), (value) >> 2, 11, 1), (value), 6, 2))
#define RAB_INSTR_R4000ALLEGREX_PACK_wpx(word, value) (BITREPACK(BITREPACK((word), (value) >> 2, 8, 1), (value), 0, 2))
#define RAB_INSTR_R4000ALLEGREX_PACK_wpy(word, value) (BITREPACK(BITREPACK((word), (value) >> 2, 9, 1), (value), 2, 2))
#define RAB_INSTR_R4000ALLEGREX_PACK_wpz(word, value) (BITREPACK(BITREPACK((word), (value) >> 2, 10, 1), (value), 4, 2))
#define RAB_INSTR_R4000ALLEGREX_PACK_wpw(word, value) (BITREPACK(BITREPACK((word), (value) >> 2, 11, 1), (value), 6, 2))
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_destroy(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Normal(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Special(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Special_Rs(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Special_Sa(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Regimm(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Special2(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Special3(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Special3_Bshfl(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Coprocessor0(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Coprocessor0_BC0(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Coprocessor0_Tlb(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Coprocessor1(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Coprocessor1_BC1(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Coprocessor1_FpuS(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Coprocessor1_FpuW(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Coprocessor2(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Coprocessor2_BC2(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Coprocessor2_MFHC2(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Coprocessor2_MFHC2_p(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Coprocessor2_MFHC2_p_s(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Coprocessor2_MTHC2(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu0(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu1(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu3(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4_Fmt0(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4_Fmt0_Fmt0(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4_Fmt0_Fmt2(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4_Fmt0_Fmt3(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4_Fmt0_Rnd(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4_Fmt0_CvtFlt(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4_Fmt0_CvtInt(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4_Fmt0_Fmt8(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4_Fmt0_Fmt9(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4_Fmt0_Control(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4_Fmt0_Color(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4_Fmt0_Cst(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4_Fmt2(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu4_Fmt2_CndMove(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu5(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu6(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu6_Fmt7(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu6_Fmt7_Fmt0(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Vfpu7(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId_Quadlr(RabbitizerInstruction *self);
NON_NULL(1)
void RabbitizerInstructionR4000Allegrex_processUniqueId(RabbitizerInstruction *self);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -31,6 +31,7 @@ extern const char *RabbitizerRegister_RspCop0_Names[][2];
extern const char *RabbitizerRegister_RspCop2_Names[][2];
extern const char *RabbitizerRegister_RspCop2Control_Names[][2];
extern const char *RabbitizerRegister_RspVector_Names[][2];
extern const char *RabbitizerRegister_R4000AllegrexS_Names[][2];
extern const char *RabbitizerRegister_R5900VF_Names[][2];
extern const char *RabbitizerRegister_R5900VI_Names[][2];
@ -57,6 +58,25 @@ 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_getNameR4000AllegrexS(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameR4000AllegrexV2D(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameR4000AllegrexV3D(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameR4000AllegrexV4D(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameR4000AllegrexM2x2(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameR4000AllegrexM3x3(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameR4000AllegrexM4x4(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameR4000AllegrexVfpuControl(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameR4000AllegrexVConstant(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const char *RabbitizerRegister_getNameR5900VF(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
@ -86,6 +106,25 @@ const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_RspCop2Cont
NODISCARD PURE RETURNS_NON_NULL
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_RspVector(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexS(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexV2D(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexV3D(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexV4D(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexM2x2(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexM3x3(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexM4x4(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexVfpuControl(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexVConstant(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R5900VF(uint8_t regValue);
NODISCARD PURE RETURNS_NON_NULL

View File

@ -51,6 +51,20 @@ extern const RabbitizerRegisterDescriptor RabbitizerRegister_RspVector_Descripto
/* RSP */
/* R4000ALLEGREX */
extern const RabbitizerRegisterDescriptor RabbitizerRegister_R4000AllegrexS_Descriptors[];
extern const RabbitizerRegisterDescriptor RabbitizerRegister_R4000AllegrexV2D_Descriptors[];
extern const RabbitizerRegisterDescriptor RabbitizerRegister_R4000AllegrexV3D_Descriptors[];
extern const RabbitizerRegisterDescriptor RabbitizerRegister_R4000AllegrexV4D_Descriptors[];
extern const RabbitizerRegisterDescriptor RabbitizerRegister_R4000AllegrexM2x2_Descriptors[];
extern const RabbitizerRegisterDescriptor RabbitizerRegister_R4000AllegrexM3x3_Descriptors[];
extern const RabbitizerRegisterDescriptor RabbitizerRegister_R4000AllegrexM4x4_Descriptors[];
extern const RabbitizerRegisterDescriptor RabbitizerRegister_R4000AllegrexVfpuControl_Descriptors[];
extern const RabbitizerRegisterDescriptor RabbitizerRegister_R4000AllegrexVConstant_Descriptors[];
/* R4000ALLEGREX */
/* R5900 */
extern const RabbitizerRegisterDescriptor RabbitizerRegister_R5900VF_Descriptors[];

View File

@ -18,6 +18,7 @@
#include "instructions/RabbitizerInstruction.h"
#include "instructions/RabbitizerInstructionRsp.h"
#include "instructions/RabbitizerInstructionR3000GTE.h"
#include "instructions/RabbitizerInstructionR4000Allegrex.h"
#include "instructions/RabbitizerInstructionR5900.h"
#include "analysis/RabbitizerTrackedRegisterState.h"

View File

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

View File

@ -15,6 +15,7 @@ class _RabbitizerConfig:
regNames_userFpcCsr: bool = True
regNames_vr4300Cop0NamedRegisters: bool = True
regNames_vr4300RspCop0NamedRegisters: bool = True
regNames_r4000AllegrexVfpuControlNamedRegisters: bool = False
pseudos_enablePseudos: bool = True
pseudos_pseudoBeqz: bool = True

View File

@ -11,6 +11,7 @@ class InstrCategory:
CPU: Enum
RSP: Enum
R3000GTE: Enum
R4000ALLEGREX: Enum
R5900: Enum
MAX: Enum
@staticmethod

294
rabbitizer/InstrId.pyi generated
View File

@ -401,6 +401,300 @@ class InstrId:
r3000gte_GPF: Enum
r3000gte_GPL: Enum
r3000gte_MAX: Enum
r4000allegrex_INVALID: Enum
r4000allegrex_lv_s: Enum
r4000allegrex_sv_s: Enum
r4000allegrex_lv_q: Enum
r4000allegrex_sv_q: Enum
r4000allegrex_clz: Enum
r4000allegrex_clo: Enum
r4000allegrex_madd: Enum
r4000allegrex_maddu: Enum
r4000allegrex_msub: Enum
r4000allegrex_msubu: Enum
r4000allegrex_max: Enum
r4000allegrex_min: Enum
r4000allegrex_srl: Enum
r4000allegrex_rotr: Enum
r4000allegrex_srlv: Enum
r4000allegrex_rotrv: Enum
r4000allegrex_sleep: Enum
r4000allegrex_mfie: Enum
r4000allegrex_mtie: Enum
r4000allegrex_ext: Enum
r4000allegrex_ins: Enum
r4000allegrex_wsbh: Enum
r4000allegrex_wsbw: Enum
r4000allegrex_seb: Enum
r4000allegrex_seh: Enum
r4000allegrex_bitrev: Enum
r4000allegrex_bvf: Enum
r4000allegrex_bvt: Enum
r4000allegrex_bvfl: Enum
r4000allegrex_bvtl: Enum
r4000allegrex_mfv: Enum
r4000allegrex_mfvc: Enum
r4000allegrex_vsync2: Enum
r4000allegrex_mtv: Enum
r4000allegrex_mtvc: Enum
r4000allegrex_vadd_s: Enum
r4000allegrex_vadd_p: Enum
r4000allegrex_vadd_t: Enum
r4000allegrex_vadd_q: Enum
r4000allegrex_vsub_s: Enum
r4000allegrex_vsub_p: Enum
r4000allegrex_vsub_t: Enum
r4000allegrex_vsub_q: Enum
r4000allegrex_vsbn_s: Enum
r4000allegrex_vdiv_s: Enum
r4000allegrex_vdiv_p: Enum
r4000allegrex_vdiv_t: Enum
r4000allegrex_vdiv_q: Enum
r4000allegrex_vmul_s: Enum
r4000allegrex_vmul_p: Enum
r4000allegrex_vmul_t: Enum
r4000allegrex_vmul_q: Enum
r4000allegrex_vdot_p: Enum
r4000allegrex_vdot_t: Enum
r4000allegrex_vdot_q: Enum
r4000allegrex_vscl_p: Enum
r4000allegrex_vscl_t: Enum
r4000allegrex_vscl_q: Enum
r4000allegrex_vhdp_p: Enum
r4000allegrex_vhdp_t: Enum
r4000allegrex_vhdp_q: Enum
r4000allegrex_vcrs_t: Enum
r4000allegrex_vdet_p: Enum
r4000allegrex_vcmp_s: Enum
r4000allegrex_vcmp_p: Enum
r4000allegrex_vcmp_t: Enum
r4000allegrex_vcmp_q: Enum
r4000allegrex_vmin_s: Enum
r4000allegrex_vmin_p: Enum
r4000allegrex_vmin_t: Enum
r4000allegrex_vmin_q: Enum
r4000allegrex_vmax_s: Enum
r4000allegrex_vmax_p: Enum
r4000allegrex_vmax_t: Enum
r4000allegrex_vmax_q: Enum
r4000allegrex_vscmp_s: Enum
r4000allegrex_vscmp_p: Enum
r4000allegrex_vscmp_t: Enum
r4000allegrex_vscmp_q: Enum
r4000allegrex_vsge_s: Enum
r4000allegrex_vsge_p: Enum
r4000allegrex_vsge_t: Enum
r4000allegrex_vsge_q: Enum
r4000allegrex_vslt_s: Enum
r4000allegrex_vslt_p: Enum
r4000allegrex_vslt_t: Enum
r4000allegrex_vslt_q: Enum
r4000allegrex_vwbn_s: Enum
r4000allegrex_vmov_s: Enum
r4000allegrex_vmov_p: Enum
r4000allegrex_vmov_t: Enum
r4000allegrex_vmov_q: Enum
r4000allegrex_vabs_s: Enum
r4000allegrex_vabs_p: Enum
r4000allegrex_vabs_t: Enum
r4000allegrex_vabs_q: Enum
r4000allegrex_vneg_s: Enum
r4000allegrex_vneg_p: Enum
r4000allegrex_vneg_t: Enum
r4000allegrex_vneg_q: Enum
r4000allegrex_vidt_p: Enum
r4000allegrex_vidt_q: Enum
r4000allegrex_vsat0_s: Enum
r4000allegrex_vsat0_p: Enum
r4000allegrex_vsat0_t: Enum
r4000allegrex_vsat0_q: Enum
r4000allegrex_vsat1_s: Enum
r4000allegrex_vsat1_p: Enum
r4000allegrex_vsat1_t: Enum
r4000allegrex_vsat1_q: Enum
r4000allegrex_vzero_s: Enum
r4000allegrex_vzero_p: Enum
r4000allegrex_vzero_t: Enum
r4000allegrex_vzero_q: Enum
r4000allegrex_vone_s: Enum
r4000allegrex_vone_p: Enum
r4000allegrex_vone_t: Enum
r4000allegrex_vone_q: Enum
r4000allegrex_vrcp_s: Enum
r4000allegrex_vrcp_p: Enum
r4000allegrex_vrcp_t: Enum
r4000allegrex_vrcp_q: Enum
r4000allegrex_vrsq_s: Enum
r4000allegrex_vrsq_p: Enum
r4000allegrex_vrsq_t: Enum
r4000allegrex_vrsq_q: Enum
r4000allegrex_vsin_s: Enum
r4000allegrex_vsin_p: Enum
r4000allegrex_vsin_t: Enum
r4000allegrex_vsin_q: Enum
r4000allegrex_vcos_s: Enum
r4000allegrex_vcos_p: Enum
r4000allegrex_vcos_t: Enum
r4000allegrex_vcos_q: Enum
r4000allegrex_vexp2_s: Enum
r4000allegrex_vexp2_p: Enum
r4000allegrex_vexp2_t: Enum
r4000allegrex_vexp2_q: Enum
r4000allegrex_vlog2_s: Enum
r4000allegrex_vlog2_p: Enum
r4000allegrex_vlog2_t: Enum
r4000allegrex_vlog2_q: Enum
r4000allegrex_vsqrt_s: Enum
r4000allegrex_vsqrt_p: Enum
r4000allegrex_vsqrt_t: Enum
r4000allegrex_vsqrt_q: Enum
r4000allegrex_vasin_s: Enum
r4000allegrex_vasin_p: Enum
r4000allegrex_vasin_t: Enum
r4000allegrex_vasin_q: Enum
r4000allegrex_vnrcp_s: Enum
r4000allegrex_vnrcp_p: Enum
r4000allegrex_vnrcp_t: Enum
r4000allegrex_vnrcp_q: Enum
r4000allegrex_vnsin_s: Enum
r4000allegrex_vnsin_p: Enum
r4000allegrex_vnsin_t: Enum
r4000allegrex_vnsin_q: Enum
r4000allegrex_vrexp2_s: Enum
r4000allegrex_vrexp2_p: Enum
r4000allegrex_vrexp2_t: Enum
r4000allegrex_vrexp2_q: Enum
r4000allegrex_vrnds_s: Enum
r4000allegrex_vrndi_s: Enum
r4000allegrex_vrndi_p: Enum
r4000allegrex_vrndi_t: Enum
r4000allegrex_vrndi_q: Enum
r4000allegrex_vrndf1_s: Enum
r4000allegrex_vrndf1_p: Enum
r4000allegrex_vrndf1_t: Enum
r4000allegrex_vrndf1_q: Enum
r4000allegrex_vrndf2_s: Enum
r4000allegrex_vrndf2_p: Enum
r4000allegrex_vrndf2_t: Enum
r4000allegrex_vrndf2_q: Enum
r4000allegrex_vf2h_p: Enum
r4000allegrex_vf2h_q: Enum
r4000allegrex_vh2f_s: Enum
r4000allegrex_vh2f_p: Enum
r4000allegrex_vsbz_s: Enum
r4000allegrex_vlgb_s: Enum
r4000allegrex_vuc2ifs_s: Enum
r4000allegrex_vc2i_s: Enum
r4000allegrex_vus2i_s: Enum
r4000allegrex_vus2i_p: Enum
r4000allegrex_vs2i_s: Enum
r4000allegrex_vs2i_p: Enum
r4000allegrex_vi2uc_q: Enum
r4000allegrex_vi2c_q: Enum
r4000allegrex_vi2us_p: Enum
r4000allegrex_vi2us_q: Enum
r4000allegrex_vi2s_p: Enum
r4000allegrex_vi2s_q: Enum
r4000allegrex_vsrt1_q: Enum
r4000allegrex_vsrt2_q: Enum
r4000allegrex_vbfy1_p: Enum
r4000allegrex_vbfy1_q: Enum
r4000allegrex_vbfy2_q: Enum
r4000allegrex_vocp_s: Enum
r4000allegrex_vocp_p: Enum
r4000allegrex_vocp_t: Enum
r4000allegrex_vocp_q: Enum
r4000allegrex_vsocp_s: Enum
r4000allegrex_vsocp_p: Enum
r4000allegrex_vfad_p: Enum
r4000allegrex_vfad_t: Enum
r4000allegrex_vfad_q: Enum
r4000allegrex_vavg_p: Enum
r4000allegrex_vavg_t: Enum
r4000allegrex_vavg_q: Enum
r4000allegrex_vsrt3_q: Enum
r4000allegrex_vsrt4_q: Enum
r4000allegrex_vsgn_s: Enum
r4000allegrex_vsgn_p: Enum
r4000allegrex_vsgn_t: Enum
r4000allegrex_vsgn_q: Enum
r4000allegrex_vmfvc: Enum
r4000allegrex_vmtvc: Enum
r4000allegrex_vt4444_q: Enum
r4000allegrex_vt5551_q: Enum
r4000allegrex_vt5650_q: Enum
r4000allegrex_vcst_s: Enum
r4000allegrex_vcst_p: Enum
r4000allegrex_vcst_t: Enum
r4000allegrex_vcst_q: Enum
r4000allegrex_vf2in_s: Enum
r4000allegrex_vf2in_p: Enum
r4000allegrex_vf2in_t: Enum
r4000allegrex_vf2in_q: Enum
r4000allegrex_vf2iz_s: Enum
r4000allegrex_vf2iz_p: Enum
r4000allegrex_vf2iz_t: Enum
r4000allegrex_vf2iz_q: Enum
r4000allegrex_vf2iu_s: Enum
r4000allegrex_vf2iu_p: Enum
r4000allegrex_vf2iu_t: Enum
r4000allegrex_vf2iu_q: Enum
r4000allegrex_vf2id_s: Enum
r4000allegrex_vf2id_p: Enum
r4000allegrex_vf2id_t: Enum
r4000allegrex_vf2id_q: Enum
r4000allegrex_vi2f_s: Enum
r4000allegrex_vi2f_p: Enum
r4000allegrex_vi2f_t: Enum
r4000allegrex_vi2f_q: Enum
r4000allegrex_vcmovt_s: Enum
r4000allegrex_vcmovt_p: Enum
r4000allegrex_vcmovt_t: Enum
r4000allegrex_vcmovt_q: Enum
r4000allegrex_vcmovf_s: Enum
r4000allegrex_vcmovf_p: Enum
r4000allegrex_vcmovf_t: Enum
r4000allegrex_vcmovf_q: Enum
r4000allegrex_vpfxs: Enum
r4000allegrex_vpfxt: Enum
r4000allegrex_vpfxd: Enum
r4000allegrex_viim_s: Enum
r4000allegrex_vfim_s: Enum
r4000allegrex_vmmul_p: Enum
r4000allegrex_vmmul_t: Enum
r4000allegrex_vmmul_q: Enum
r4000allegrex_vhtfm2_p: Enum
r4000allegrex_vtfm2_p: Enum
r4000allegrex_vhtfm3_t: Enum
r4000allegrex_vtfm3_t: Enum
r4000allegrex_vhtfm4_q: Enum
r4000allegrex_vtfm4_q: Enum
r4000allegrex_vmscl_p: Enum
r4000allegrex_vmscl_t: Enum
r4000allegrex_vmscl_q: Enum
r4000allegrex_vcrsp_t: Enum
r4000allegrex_vqmul_q: Enum
r4000allegrex_vrot_p: Enum
r4000allegrex_vrot_t: Enum
r4000allegrex_vrot_q: Enum
r4000allegrex_vmmov_p: Enum
r4000allegrex_vmmov_t: Enum
r4000allegrex_vmmov_q: Enum
r4000allegrex_vmidt_p: Enum
r4000allegrex_vmidt_t: Enum
r4000allegrex_vmidt_q: Enum
r4000allegrex_vmzero_p: Enum
r4000allegrex_vmzero_t: Enum
r4000allegrex_vmzero_q: Enum
r4000allegrex_vmone_p: Enum
r4000allegrex_vmone_t: Enum
r4000allegrex_vmone_q: Enum
r4000allegrex_vnop: Enum
r4000allegrex_vsync: Enum
r4000allegrex_vflush: Enum
r4000allegrex_svl_q: Enum
r4000allegrex_svr_q: Enum
r4000allegrex_MAX: Enum
r5900_INVALID: Enum
r5900_lq: Enum
r5900_sq: Enum

View File

@ -41,6 +41,52 @@ class InstrIdType:
R3000GTE_COP1: Enum
R3000GTE_COP2: Enum
R3000GTE_COP2_GTE: Enum
R4000ALLEGREX_INVALID: Enum
R4000ALLEGREX_NORMAL: Enum
R4000ALLEGREX_SPECIAL: Enum
R4000ALLEGREX_SPECIAL_RS: Enum
R4000ALLEGREX_SPECIAL_SA: Enum
R4000ALLEGREX_REGIMM: Enum
R4000ALLEGREX_SPECIAL2: Enum
R4000ALLEGREX_SPECIAL3: Enum
R4000ALLEGREX_SPECIAL3_BSHFL: Enum
R4000ALLEGREX_COP0: Enum
R4000ALLEGREX_COP0_BC0: Enum
R4000ALLEGREX_COP0_TLB: Enum
R4000ALLEGREX_COP1: Enum
R4000ALLEGREX_COP1_BC1: Enum
R4000ALLEGREX_COP1_FPUS: Enum
R4000ALLEGREX_COP1_FPUW: Enum
R4000ALLEGREX_COP2: Enum
R4000ALLEGREX_COP2_BC2: Enum
R4000ALLEGREX_COP2_MFHC2: Enum
R4000ALLEGREX_COP2_MFHC2_P: Enum
R4000ALLEGREX_COP2_MFHC2_P_S: Enum
R4000ALLEGREX_COP2_MTHC2: Enum
R4000ALLEGREX_VFPU0: Enum
R4000ALLEGREX_VFPU1: Enum
R4000ALLEGREX_VFPU3: Enum
R4000ALLEGREX_VFPU4: Enum
R4000ALLEGREX_VFPU4_FMT0: Enum
R4000ALLEGREX_VFPU4_FMT0_FMT0: Enum
R4000ALLEGREX_VFPU4_FMT0_FMT2: Enum
R4000ALLEGREX_VFPU4_FMT0_FMT3: Enum
R4000ALLEGREX_VFPU4_FMT0_RND: Enum
R4000ALLEGREX_VFPU4_FMT0_CVTFLT: Enum
R4000ALLEGREX_VFPU4_FMT0_CVTINT: Enum
R4000ALLEGREX_VFPU4_FMT0_FMT8: Enum
R4000ALLEGREX_VFPU4_FMT0_FMT9: Enum
R4000ALLEGREX_VFPU4_FMT0_CONTROL: Enum
R4000ALLEGREX_VFPU4_FMT0_COLOR: Enum
R4000ALLEGREX_VFPU4_FMT0_CST: Enum
R4000ALLEGREX_VFPU4_FMT2: Enum
R4000ALLEGREX_VFPU4_FMT2_CNDMOVE: Enum
R4000ALLEGREX_VFPU5: Enum
R4000ALLEGREX_VFPU6: Enum
R4000ALLEGREX_VFPU6_FMT7: Enum
R4000ALLEGREX_VFPU6_FMT7_FMT0: Enum
R4000ALLEGREX_VFPU7: Enum
R4000ALLEGREX_QUADLR: Enum
R5900_INVALID: Enum
R5900_NORMAL: Enum
R5900_SPECIAL: Enum

View File

@ -53,6 +53,63 @@ class OperandType:
r3000gte_v: Enum
r3000gte_cv: Enum
r3000gte_lm: Enum
r4000allegrex_s_vs: Enum
r4000allegrex_s_vt: Enum
r4000allegrex_s_vd: Enum
r4000allegrex_s_vt_imm: Enum
r4000allegrex_s_vd_imm: Enum
r4000allegrex_p_vs: Enum
r4000allegrex_p_vt: Enum
r4000allegrex_p_vd: Enum
r4000allegrex_t_vs: Enum
r4000allegrex_t_vt: Enum
r4000allegrex_t_vd: Enum
r4000allegrex_q_vs: Enum
r4000allegrex_q_vt: Enum
r4000allegrex_q_vd: Enum
r4000allegrex_q_vt_imm: Enum
r4000allegrex_mp_vs: Enum
r4000allegrex_mp_vt: Enum
r4000allegrex_mp_vd: Enum
r4000allegrex_mp_vs_transpose: Enum
r4000allegrex_mt_vs: Enum
r4000allegrex_mt_vt: Enum
r4000allegrex_mt_vd: Enum
r4000allegrex_mt_vs_transpose: Enum
r4000allegrex_mq_vs: Enum
r4000allegrex_mq_vt: Enum
r4000allegrex_mq_vd: Enum
r4000allegrex_mq_vs_transpose: Enum
r4000allegrex_cop2cs: Enum
r4000allegrex_cop2cd: Enum
r4000allegrex_pos: Enum
r4000allegrex_size: Enum
r4000allegrex_size_plus_pos: Enum
r4000allegrex_imm3: Enum
r4000allegrex_offset14_base: Enum
r4000allegrex_offset14_base_maybe_wb: Enum
r4000allegrex_vcmp_cond: Enum
r4000allegrex_vcmp_cond_s_maybe_vs_maybe_vt: Enum
r4000allegrex_vcmp_cond_p_maybe_vs_maybe_vt: Enum
r4000allegrex_vcmp_cond_t_maybe_vs_maybe_vt: Enum
r4000allegrex_vcmp_cond_q_maybe_vs_maybe_vt: Enum
r4000allegrex_vconstant: Enum
r4000allegrex_power_of_two: Enum
r4000allegrex_vfpu_cc_bit: Enum
r4000allegrex_bn: Enum
r4000allegrex_int16: Enum
r4000allegrex_float16: Enum
r4000allegrex_p_vrot_code: Enum
r4000allegrex_t_vrot_code: Enum
r4000allegrex_q_vrot_code: Enum
r4000allegrex_rpx: Enum
r4000allegrex_rpy: Enum
r4000allegrex_rpz: Enum
r4000allegrex_rpw: Enum
r4000allegrex_wpx: Enum
r4000allegrex_wpy: Enum
r4000allegrex_wpz: Enum
r4000allegrex_wpw: Enum
r5900_I: Enum
r5900_Q: Enum
r5900_R: Enum

View File

@ -12,3 +12,11 @@ class Utils:
@staticmethod
def escapeString(src: str) -> str: ...
@staticmethod
def floatRepr_32From16(hex_repr: int) -> int:
"""
Converts an unsigned 16 bits value representing a half precision
float to a unsigned 32 bits value representing a single precision
float.
"""

View File

@ -9,7 +9,7 @@
{ "RegCop1N32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL },
#define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric, ...) \
{ "RegCop1N32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL },
RABBITIZER_DEF_REG(prefix, name, numeric, __VARGS__)
RabbitizerEnumMetadata rabbitizer_enum_RegCop1N32_enumvalues[] = {
#include "tables/registers/RabbitizerRegister_Cop1N32.inc"

View File

@ -9,7 +9,7 @@
{ "RegCop1N64", #name, RABBITIZER_REG_##prefix##_##name, false, NULL },
#define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric, ...) \
{ "RegCop1N64", #name, RABBITIZER_REG_##prefix##_##name, false, NULL },
RABBITIZER_DEF_REG(prefix, name, numeric, __VARGS__)
RabbitizerEnumMetadata rabbitizer_enum_RegCop1N64_enumvalues[] = {
#include "tables/registers/RabbitizerRegister_Cop1N64.inc"

View File

@ -9,7 +9,7 @@
{ "RegCop1O32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL },
#define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric, ...) \
{ "RegCop1O32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL },
RABBITIZER_DEF_REG(prefix, name, numeric, __VARGS__)
RabbitizerEnumMetadata rabbitizer_enum_RegCop1O32_enumvalues[] = {
#include "tables/registers/RabbitizerRegister_Cop1O32.inc"

View File

@ -9,7 +9,7 @@
{ "RegGprN32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL },
#define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric, ...) \
{ "RegGprN32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL },
RABBITIZER_DEF_REG(prefix, name, numeric, __VARGS__)
RabbitizerEnumMetadata rabbitizer_enum_RegGprN32_enumvalues[] = {
#include "tables/registers/RabbitizerRegister_GprN32.inc"

View File

@ -9,7 +9,7 @@
{ "RegGprO32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL },
#define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric, ...) \
{ "RegGprO32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL },
RABBITIZER_DEF_REG(prefix, name, numeric, __VARGS__)
RabbitizerEnumMetadata rabbitizer_enum_RegGprO32_enumvalues[] = {
#include "tables/registers/RabbitizerRegister_GprO32.inc"

View File

@ -106,6 +106,7 @@ DEF_MEMBER_GET_SET_ABI(regNames, fprAbiNames)
DEF_MEMBER_GET_SET_BOOL(regNames, userFpcCsr)
DEF_MEMBER_GET_SET_BOOL(regNames, vr4300Cop0NamedRegisters)
DEF_MEMBER_GET_SET_BOOL(regNames, vr4300RspCop0NamedRegisters)
DEF_MEMBER_GET_SET_BOOL(regNames, r4000AllegrexVfpuControlNamedRegisters)
DEF_MEMBER_GET_SET_BOOL(pseudos, enablePseudos)
DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoBeqz)
@ -134,6 +135,7 @@ static PyGetSetDef rabbitizer_global_config_GetSets[] = {
MEMBER_GET_SET(regNames, userFpcCsr, "", NULL),
MEMBER_GET_SET(regNames, vr4300Cop0NamedRegisters, "", NULL),
MEMBER_GET_SET(regNames, vr4300RspCop0NamedRegisters, "", NULL),
MEMBER_GET_SET(regNames, r4000AllegrexVfpuControlNamedRegisters, "", NULL),
MEMBER_GET_SET(pseudos, enablePseudos, "", NULL),
MEMBER_GET_SET(pseudos, pseudoBeqz, "", NULL),

View File

@ -49,6 +49,17 @@ static PyObject *rabbitizer_submodule_Utils_escapeString(UNUSED PyObject *self,
return ret;
}
static PyObject *rabbitizer_submodule_Utils_floatRepr_32From16(UNUSED PyObject *self, PyObject *args, PyObject *kwds) {
static char *kwlist[] = { "hex_repr", NULL };
uint16_t hex_repr = 0;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "H", kwlist, &hex_repr)) {
return NULL;
}
return PyLong_FromLong(RabbitizerUtils_floatRepr_32From16(hex_repr));
}
#define METHOD_NO_ARGS(name, docs) { #name, (PyCFunction) (void *) rabbitizer_submodule_Utils_##name, METH_NOARGS, PyDoc_STR(docs) }
#define METHOD_ARGS(name, docs) { #name, (PyCFunction) (void *) rabbitizer_submodule_Utils_##name, METH_VARARGS | METH_KEYWORDS, PyDoc_STR(docs) }
@ -56,6 +67,7 @@ static PyObject *rabbitizer_submodule_Utils_escapeString(UNUSED PyObject *self,
static PyMethodDef rabbitizer_submodule_Utils_methods[] = {
METHOD_ARGS(from2Complement, ""),
METHOD_ARGS(escapeString, ""),
METHOD_ARGS(floatRepr_32From16, ""),
{ 0 },
};

View File

@ -5,6 +5,7 @@
#include "instructions/RabbitizerInstructionRsp.h"
#include "instructions/RabbitizerInstructionR3000GTE.h"
#include "instructions/RabbitizerInstructionR4000Allegrex.h"
#include "instructions/RabbitizerInstructionR5900.h"
#include "common/RabbitizerConfig.h"
@ -55,6 +56,11 @@ static int rabbitizer_type_Instruction_init(PyRabbitizerInstruction *self, PyObj
RabbitizerInstructionR5900_processUniqueId(&self->instr);
break;
case RABBITIZER_INSTRCAT_R4000ALLEGREX:
RabbitizerInstructionR4000Allegrex_init(&self->instr, word, vram);
RabbitizerInstructionR4000Allegrex_processUniqueId(&self->instr);
break;
case RABBITIZER_INSTRCAT_CPU:
case RABBITIZER_INSTRCAT_MAX:
RabbitizerInstruction_init(&self->instr, word, vram);

View File

@ -10,6 +10,7 @@ pub enum InstrCategory {
CPU,
RSP,
R3000GTE,
R4000ALLEGREX,
R5900,
MAX,
}

View File

@ -460,6 +460,320 @@ pub enum InstrId {
r3000gte_USERDEF_18,
r3000gte_USERDEF_19,
r3000gte_MAX,
r4000allegrex_INVALID,
r4000allegrex_lv_s,
r4000allegrex_sv_s,
r4000allegrex_lv_q,
r4000allegrex_sv_q,
r4000allegrex_clz,
r4000allegrex_clo,
r4000allegrex_madd,
r4000allegrex_maddu,
r4000allegrex_msub,
r4000allegrex_msubu,
r4000allegrex_max,
r4000allegrex_min,
r4000allegrex_srl,
r4000allegrex_rotr,
r4000allegrex_srlv,
r4000allegrex_rotrv,
r4000allegrex_sleep,
r4000allegrex_mfie,
r4000allegrex_mtie,
r4000allegrex_ext,
r4000allegrex_ins,
r4000allegrex_wsbh,
r4000allegrex_wsbw,
r4000allegrex_seb,
r4000allegrex_seh,
r4000allegrex_bitrev,
r4000allegrex_bvf,
r4000allegrex_bvt,
r4000allegrex_bvfl,
r4000allegrex_bvtl,
r4000allegrex_mfv,
r4000allegrex_mfvc,
r4000allegrex_vsync2,
r4000allegrex_mtv,
r4000allegrex_mtvc,
r4000allegrex_vadd_s,
r4000allegrex_vadd_p,
r4000allegrex_vadd_t,
r4000allegrex_vadd_q,
r4000allegrex_vsub_s,
r4000allegrex_vsub_p,
r4000allegrex_vsub_t,
r4000allegrex_vsub_q,
r4000allegrex_vsbn_s,
r4000allegrex_vdiv_s,
r4000allegrex_vdiv_p,
r4000allegrex_vdiv_t,
r4000allegrex_vdiv_q,
r4000allegrex_vmul_s,
r4000allegrex_vmul_p,
r4000allegrex_vmul_t,
r4000allegrex_vmul_q,
r4000allegrex_vdot_p,
r4000allegrex_vdot_t,
r4000allegrex_vdot_q,
r4000allegrex_vscl_p,
r4000allegrex_vscl_t,
r4000allegrex_vscl_q,
r4000allegrex_vhdp_p,
r4000allegrex_vhdp_t,
r4000allegrex_vhdp_q,
r4000allegrex_vcrs_t,
r4000allegrex_vdet_p,
r4000allegrex_vcmp_s,
r4000allegrex_vcmp_p,
r4000allegrex_vcmp_t,
r4000allegrex_vcmp_q,
r4000allegrex_vmin_s,
r4000allegrex_vmin_p,
r4000allegrex_vmin_t,
r4000allegrex_vmin_q,
r4000allegrex_vmax_s,
r4000allegrex_vmax_p,
r4000allegrex_vmax_t,
r4000allegrex_vmax_q,
r4000allegrex_vscmp_s,
r4000allegrex_vscmp_p,
r4000allegrex_vscmp_t,
r4000allegrex_vscmp_q,
r4000allegrex_vsge_s,
r4000allegrex_vsge_p,
r4000allegrex_vsge_t,
r4000allegrex_vsge_q,
r4000allegrex_vslt_s,
r4000allegrex_vslt_p,
r4000allegrex_vslt_t,
r4000allegrex_vslt_q,
r4000allegrex_vwbn_s,
r4000allegrex_vmov_s,
r4000allegrex_vmov_p,
r4000allegrex_vmov_t,
r4000allegrex_vmov_q,
r4000allegrex_vabs_s,
r4000allegrex_vabs_p,
r4000allegrex_vabs_t,
r4000allegrex_vabs_q,
r4000allegrex_vneg_s,
r4000allegrex_vneg_p,
r4000allegrex_vneg_t,
r4000allegrex_vneg_q,
r4000allegrex_vidt_p,
r4000allegrex_vidt_q,
r4000allegrex_vsat0_s,
r4000allegrex_vsat0_p,
r4000allegrex_vsat0_t,
r4000allegrex_vsat0_q,
r4000allegrex_vsat1_s,
r4000allegrex_vsat1_p,
r4000allegrex_vsat1_t,
r4000allegrex_vsat1_q,
r4000allegrex_vzero_s,
r4000allegrex_vzero_p,
r4000allegrex_vzero_t,
r4000allegrex_vzero_q,
r4000allegrex_vone_s,
r4000allegrex_vone_p,
r4000allegrex_vone_t,
r4000allegrex_vone_q,
r4000allegrex_vrcp_s,
r4000allegrex_vrcp_p,
r4000allegrex_vrcp_t,
r4000allegrex_vrcp_q,
r4000allegrex_vrsq_s,
r4000allegrex_vrsq_p,
r4000allegrex_vrsq_t,
r4000allegrex_vrsq_q,
r4000allegrex_vsin_s,
r4000allegrex_vsin_p,
r4000allegrex_vsin_t,
r4000allegrex_vsin_q,
r4000allegrex_vcos_s,
r4000allegrex_vcos_p,
r4000allegrex_vcos_t,
r4000allegrex_vcos_q,
r4000allegrex_vexp2_s,
r4000allegrex_vexp2_p,
r4000allegrex_vexp2_t,
r4000allegrex_vexp2_q,
r4000allegrex_vlog2_s,
r4000allegrex_vlog2_p,
r4000allegrex_vlog2_t,
r4000allegrex_vlog2_q,
r4000allegrex_vsqrt_s,
r4000allegrex_vsqrt_p,
r4000allegrex_vsqrt_t,
r4000allegrex_vsqrt_q,
r4000allegrex_vasin_s,
r4000allegrex_vasin_p,
r4000allegrex_vasin_t,
r4000allegrex_vasin_q,
r4000allegrex_vnrcp_s,
r4000allegrex_vnrcp_p,
r4000allegrex_vnrcp_t,
r4000allegrex_vnrcp_q,
r4000allegrex_vnsin_s,
r4000allegrex_vnsin_p,
r4000allegrex_vnsin_t,
r4000allegrex_vnsin_q,
r4000allegrex_vrexp2_s,
r4000allegrex_vrexp2_p,
r4000allegrex_vrexp2_t,
r4000allegrex_vrexp2_q,
r4000allegrex_vrnds_s,
r4000allegrex_vrndi_s,
r4000allegrex_vrndi_p,
r4000allegrex_vrndi_t,
r4000allegrex_vrndi_q,
r4000allegrex_vrndf1_s,
r4000allegrex_vrndf1_p,
r4000allegrex_vrndf1_t,
r4000allegrex_vrndf1_q,
r4000allegrex_vrndf2_s,
r4000allegrex_vrndf2_p,
r4000allegrex_vrndf2_t,
r4000allegrex_vrndf2_q,
r4000allegrex_vf2h_p,
r4000allegrex_vf2h_q,
r4000allegrex_vh2f_s,
r4000allegrex_vh2f_p,
r4000allegrex_vsbz_s,
r4000allegrex_vlgb_s,
r4000allegrex_vuc2ifs_s,
r4000allegrex_vc2i_s,
r4000allegrex_vus2i_s,
r4000allegrex_vus2i_p,
r4000allegrex_vs2i_s,
r4000allegrex_vs2i_p,
r4000allegrex_vi2uc_q,
r4000allegrex_vi2c_q,
r4000allegrex_vi2us_p,
r4000allegrex_vi2us_q,
r4000allegrex_vi2s_p,
r4000allegrex_vi2s_q,
r4000allegrex_vsrt1_q,
r4000allegrex_vsrt2_q,
r4000allegrex_vbfy1_p,
r4000allegrex_vbfy1_q,
r4000allegrex_vbfy2_q,
r4000allegrex_vocp_s,
r4000allegrex_vocp_p,
r4000allegrex_vocp_t,
r4000allegrex_vocp_q,
r4000allegrex_vsocp_s,
r4000allegrex_vsocp_p,
r4000allegrex_vfad_p,
r4000allegrex_vfad_t,
r4000allegrex_vfad_q,
r4000allegrex_vavg_p,
r4000allegrex_vavg_t,
r4000allegrex_vavg_q,
r4000allegrex_vsrt3_q,
r4000allegrex_vsrt4_q,
r4000allegrex_vsgn_s,
r4000allegrex_vsgn_p,
r4000allegrex_vsgn_t,
r4000allegrex_vsgn_q,
r4000allegrex_vmfvc,
r4000allegrex_vmtvc,
r4000allegrex_vt4444_q,
r4000allegrex_vt5551_q,
r4000allegrex_vt5650_q,
r4000allegrex_vcst_s,
r4000allegrex_vcst_p,
r4000allegrex_vcst_t,
r4000allegrex_vcst_q,
r4000allegrex_vf2in_s,
r4000allegrex_vf2in_p,
r4000allegrex_vf2in_t,
r4000allegrex_vf2in_q,
r4000allegrex_vf2iz_s,
r4000allegrex_vf2iz_p,
r4000allegrex_vf2iz_t,
r4000allegrex_vf2iz_q,
r4000allegrex_vf2iu_s,
r4000allegrex_vf2iu_p,
r4000allegrex_vf2iu_t,
r4000allegrex_vf2iu_q,
r4000allegrex_vf2id_s,
r4000allegrex_vf2id_p,
r4000allegrex_vf2id_t,
r4000allegrex_vf2id_q,
r4000allegrex_vi2f_s,
r4000allegrex_vi2f_p,
r4000allegrex_vi2f_t,
r4000allegrex_vi2f_q,
r4000allegrex_vcmovt_s,
r4000allegrex_vcmovt_p,
r4000allegrex_vcmovt_t,
r4000allegrex_vcmovt_q,
r4000allegrex_vcmovf_s,
r4000allegrex_vcmovf_p,
r4000allegrex_vcmovf_t,
r4000allegrex_vcmovf_q,
r4000allegrex_vpfxs,
r4000allegrex_vpfxt,
r4000allegrex_vpfxd,
r4000allegrex_viim_s,
r4000allegrex_vfim_s,
r4000allegrex_vmmul_p,
r4000allegrex_vmmul_t,
r4000allegrex_vmmul_q,
r4000allegrex_vhtfm2_p,
r4000allegrex_vtfm2_p,
r4000allegrex_vhtfm3_t,
r4000allegrex_vtfm3_t,
r4000allegrex_vhtfm4_q,
r4000allegrex_vtfm4_q,
r4000allegrex_vmscl_p,
r4000allegrex_vmscl_t,
r4000allegrex_vmscl_q,
r4000allegrex_vcrsp_t,
r4000allegrex_vqmul_q,
r4000allegrex_vrot_p,
r4000allegrex_vrot_t,
r4000allegrex_vrot_q,
r4000allegrex_vmmov_p,
r4000allegrex_vmmov_t,
r4000allegrex_vmmov_q,
r4000allegrex_vmidt_p,
r4000allegrex_vmidt_t,
r4000allegrex_vmidt_q,
r4000allegrex_vmzero_p,
r4000allegrex_vmzero_t,
r4000allegrex_vmzero_q,
r4000allegrex_vmone_p,
r4000allegrex_vmone_t,
r4000allegrex_vmone_q,
r4000allegrex_vnop,
r4000allegrex_vsync,
r4000allegrex_vflush,
r4000allegrex_svl_q,
r4000allegrex_svr_q,
r4000allegrex_USERDEF_00,
r4000allegrex_USERDEF_01,
r4000allegrex_USERDEF_02,
r4000allegrex_USERDEF_03,
r4000allegrex_USERDEF_04,
r4000allegrex_USERDEF_05,
r4000allegrex_USERDEF_06,
r4000allegrex_USERDEF_07,
r4000allegrex_USERDEF_08,
r4000allegrex_USERDEF_09,
r4000allegrex_USERDEF_10,
r4000allegrex_USERDEF_11,
r4000allegrex_USERDEF_12,
r4000allegrex_USERDEF_13,
r4000allegrex_USERDEF_14,
r4000allegrex_USERDEF_15,
r4000allegrex_USERDEF_16,
r4000allegrex_USERDEF_17,
r4000allegrex_USERDEF_18,
r4000allegrex_USERDEF_19,
r4000allegrex_MAX,
r5900_INVALID,
r5900_lq,
r5900_sq,

View File

@ -40,6 +40,52 @@ pub enum InstrIdType {
R3000GTE_COP1,
R3000GTE_COP2,
R3000GTE_COP2_GTE,
R4000ALLEGREX_INVALID,
R4000ALLEGREX_NORMAL,
R4000ALLEGREX_SPECIAL,
R4000ALLEGREX_SPECIAL_RS,
R4000ALLEGREX_SPECIAL_SA,
R4000ALLEGREX_REGIMM,
R4000ALLEGREX_SPECIAL2,
R4000ALLEGREX_SPECIAL3,
R4000ALLEGREX_SPECIAL3_BSHFL,
R4000ALLEGREX_COP0,
R4000ALLEGREX_COP0_BC0,
R4000ALLEGREX_COP0_TLB,
R4000ALLEGREX_COP1,
R4000ALLEGREX_COP1_BC1,
R4000ALLEGREX_COP1_FPUS,
R4000ALLEGREX_COP1_FPUW,
R4000ALLEGREX_COP2,
R4000ALLEGREX_COP2_BC2,
R4000ALLEGREX_COP2_MFHC2,
R4000ALLEGREX_COP2_MFHC2_P,
R4000ALLEGREX_COP2_MFHC2_P_S,
R4000ALLEGREX_COP2_MTHC2,
R4000ALLEGREX_VFPU0,
R4000ALLEGREX_VFPU1,
R4000ALLEGREX_VFPU3,
R4000ALLEGREX_VFPU4,
R4000ALLEGREX_VFPU4_FMT0,
R4000ALLEGREX_VFPU4_FMT0_FMT0,
R4000ALLEGREX_VFPU4_FMT0_FMT2,
R4000ALLEGREX_VFPU4_FMT0_FMT3,
R4000ALLEGREX_VFPU4_FMT0_RND,
R4000ALLEGREX_VFPU4_FMT0_CVTFLT,
R4000ALLEGREX_VFPU4_FMT0_CVTINT,
R4000ALLEGREX_VFPU4_FMT0_FMT8,
R4000ALLEGREX_VFPU4_FMT0_FMT9,
R4000ALLEGREX_VFPU4_FMT0_CONTROL,
R4000ALLEGREX_VFPU4_FMT0_COLOR,
R4000ALLEGREX_VFPU4_FMT0_CST,
R4000ALLEGREX_VFPU4_FMT2,
R4000ALLEGREX_VFPU4_FMT2_CNDMOVE,
R4000ALLEGREX_VFPU5,
R4000ALLEGREX_VFPU6,
R4000ALLEGREX_VFPU6_FMT7,
R4000ALLEGREX_VFPU6_FMT7_FMT0,
R4000ALLEGREX_VFPU7,
R4000ALLEGREX_QUADLR,
R5900_INVALID,
R5900_NORMAL,
R5900_SPECIAL,

View File

@ -62,6 +62,13 @@ extern "C" {
fn RabbitizerInstructionR5900_processUniqueId(self_: *mut Instruction);
}
extern "C" {
fn RabbitizerInstructionR4000Allegrex_init(self_: *mut Instruction, word: u32, vram: u32);
fn RabbitizerInstructionR4000Allegrex_destroy(self_: *mut Instruction);
fn RabbitizerInstructionR4000Allegrex_processUniqueId(self_: *mut Instruction);
}
extern "C" {
fn RabbitizerInstruction_getRaw(self_: *const Instruction) -> u32;
fn RabbitizerInstruction_getProcessedImmediate(self_: *const Instruction) -> i32;
@ -209,6 +216,9 @@ impl Drop for Instruction {
instr_category_enum::InstrCategory::R5900 => {
RabbitizerInstructionR5900_destroy(self);
}
instr_category_enum::InstrCategory::R4000ALLEGREX => {
RabbitizerInstructionR4000Allegrex_destroy(self);
}
instr_category_enum::InstrCategory::MAX => {
core::panic!();
}
@ -238,6 +248,10 @@ impl Instruction {
RabbitizerInstructionR5900_init(instr.as_mut_ptr(), word, vram);
RabbitizerInstructionR5900_processUniqueId(instr.as_mut_ptr());
}
instr_category_enum::InstrCategory::R4000ALLEGREX => {
RabbitizerInstructionR4000Allegrex_init(instr.as_mut_ptr(), word, vram);
RabbitizerInstructionR4000Allegrex_processUniqueId(instr.as_mut_ptr());
}
instr_category_enum::InstrCategory::MAX => {
core::panic!();
} // _ => not used in purpose

View File

@ -52,6 +52,63 @@ pub enum OperandType {
r3000gte_v,
r3000gte_cv,
r3000gte_lm,
r4000allegrex_s_vs,
r4000allegrex_s_vt,
r4000allegrex_s_vd,
r4000allegrex_s_vt_imm,
r4000allegrex_s_vd_imm,
r4000allegrex_p_vs,
r4000allegrex_p_vt,
r4000allegrex_p_vd,
r4000allegrex_t_vs,
r4000allegrex_t_vt,
r4000allegrex_t_vd,
r4000allegrex_q_vs,
r4000allegrex_q_vt,
r4000allegrex_q_vd,
r4000allegrex_q_vt_imm,
r4000allegrex_mp_vs,
r4000allegrex_mp_vt,
r4000allegrex_mp_vd,
r4000allegrex_mp_vs_transpose,
r4000allegrex_mt_vs,
r4000allegrex_mt_vt,
r4000allegrex_mt_vd,
r4000allegrex_mt_vs_transpose,
r4000allegrex_mq_vs,
r4000allegrex_mq_vt,
r4000allegrex_mq_vd,
r4000allegrex_mq_vs_transpose,
r4000allegrex_cop2cs,
r4000allegrex_cop2cd,
r4000allegrex_pos,
r4000allegrex_size,
r4000allegrex_size_plus_pos,
r4000allegrex_imm3,
r4000allegrex_offset14_base,
r4000allegrex_offset14_base_maybe_wb,
r4000allegrex_vcmp_cond,
r4000allegrex_vcmp_cond_s_maybe_vs_maybe_vt,
r4000allegrex_vcmp_cond_p_maybe_vs_maybe_vt,
r4000allegrex_vcmp_cond_t_maybe_vs_maybe_vt,
r4000allegrex_vcmp_cond_q_maybe_vs_maybe_vt,
r4000allegrex_vconstant,
r4000allegrex_power_of_two,
r4000allegrex_vfpu_cc_bit,
r4000allegrex_bn,
r4000allegrex_int16,
r4000allegrex_float16,
r4000allegrex_p_vrot_code,
r4000allegrex_t_vrot_code,
r4000allegrex_q_vrot_code,
r4000allegrex_rpx,
r4000allegrex_rpy,
r4000allegrex_rpz,
r4000allegrex_rpw,
r4000allegrex_wpx,
r4000allegrex_wpy,
r4000allegrex_wpz,
r4000allegrex_wpw,
r5900_I,
r5900_Q,
r5900_R,

File diff suppressed because it is too large Load Diff

View File

@ -19,6 +19,24 @@ extern "C" {
pub static mut RabbitizerRegister_RspCop2Control_Names:
[[*const core::ffi::c_char; 2usize]; 0usize];
pub static mut RabbitizerRegister_RspVector_Names: [[*const core::ffi::c_char; 2usize]; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexS_Names:
[[*const core::ffi::c_char; 2usize]; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexV2D_Names:
[[*const core::ffi::c_char; 2usize]; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexV3D_Names:
[[*const core::ffi::c_char; 2usize]; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexV4D_Names:
[[*const core::ffi::c_char; 2usize]; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexM2x2_Names:
[[*const core::ffi::c_char; 2usize]; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexM3x3_Names:
[[*const core::ffi::c_char; 2usize]; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexM4x4_Names:
[[*const core::ffi::c_char; 2usize]; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexVfpuControl_Names:
[[*const core::ffi::c_char; 2usize]; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexVConstant_Names:
[[*const core::ffi::c_char; 2usize]; 0usize];
pub static mut RabbitizerRegister_R5900VF_Names: [[*const core::ffi::c_char; 2usize]; 0usize];
pub static mut RabbitizerRegister_R5900VI_Names: [[*const core::ffi::c_char; 2usize]; 0usize];
@ -58,6 +76,18 @@ extern "C" {
/* RSP */
pub static mut RabbitizerRegister_R4000AllegrexS_Descriptors: [RegisterDescriptor; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexV2D_Descriptors: [RegisterDescriptor; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexV3D_Descriptors: [RegisterDescriptor; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexV4D_Descriptors: [RegisterDescriptor; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexM2x2_Descriptors: [RegisterDescriptor; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexM3x3_Descriptors: [RegisterDescriptor; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexM4x4_Descriptors: [RegisterDescriptor; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexVfpuControl_Descriptors:
[RegisterDescriptor; 0usize];
pub static mut RabbitizerRegister_R4000AllegrexVConstant_Descriptors:
[RegisterDescriptor; 0usize];
/* R5900 */
pub static mut RabbitizerRegister_R5900VF_Descriptors: [RegisterDescriptor; 0usize];
@ -300,6 +330,195 @@ impl registers_enum::registers::RspVector {
}
}
impl registers_enum::registers::R4000AllegrexS {
pub fn name(self) -> &'static str {
let reg_value: u32 = self.into();
unsafe {
std::ffi::CStr::from_ptr(RabbitizerRegister_R4000AllegrexS_Names[reg_value as usize][1])
.to_str()
.unwrap()
}
}
pub fn descriptor(&self) -> &RegisterDescriptor {
let reg_value: u32 = (*self).into();
unsafe { RabbitizerRegister_R4000AllegrexS_Descriptors.get_unchecked(reg_value as usize) }
}
}
impl registers_enum::registers::R4000AllegrexV2D {
pub fn name(self) -> &'static str {
let reg_value: u32 = self.into();
unsafe {
std::ffi::CStr::from_ptr(
RabbitizerRegister_R4000AllegrexV2D_Names[reg_value as usize][1],
)
.to_str()
.unwrap()
}
}
pub fn descriptor(&self) -> &RegisterDescriptor {
let reg_value: u32 = (*self).into();
unsafe { RabbitizerRegister_R4000AllegrexV2D_Descriptors.get_unchecked(reg_value as usize) }
}
}
impl registers_enum::registers::R4000AllegrexV3D {
pub fn name(self) -> &'static str {
let reg_value: u32 = self.into();
unsafe {
std::ffi::CStr::from_ptr(
RabbitizerRegister_R4000AllegrexV3D_Names[reg_value as usize][1],
)
.to_str()
.unwrap()
}
}
pub fn descriptor(&self) -> &RegisterDescriptor {
let reg_value: u32 = (*self).into();
unsafe { RabbitizerRegister_R4000AllegrexV3D_Descriptors.get_unchecked(reg_value as usize) }
}
}
impl registers_enum::registers::R4000AllegrexV4D {
pub fn name(self) -> &'static str {
let reg_value: u32 = self.into();
unsafe {
std::ffi::CStr::from_ptr(
RabbitizerRegister_R4000AllegrexV4D_Names[reg_value as usize][1],
)
.to_str()
.unwrap()
}
}
pub fn descriptor(&self) -> &RegisterDescriptor {
let reg_value: u32 = (*self).into();
unsafe { RabbitizerRegister_R4000AllegrexV4D_Descriptors.get_unchecked(reg_value as usize) }
}
}
impl registers_enum::registers::R4000AllegrexM2x2 {
pub fn name(self) -> &'static str {
let reg_value: u32 = self.into();
unsafe {
std::ffi::CStr::from_ptr(
RabbitizerRegister_R4000AllegrexM2x2_Names[reg_value as usize][1],
)
.to_str()
.unwrap()
}
}
pub fn descriptor(&self) -> &RegisterDescriptor {
let reg_value: u32 = (*self).into();
unsafe {
RabbitizerRegister_R4000AllegrexM2x2_Descriptors.get_unchecked(reg_value as usize)
}
}
}
impl registers_enum::registers::R4000AllegrexM3x3 {
pub fn name(self) -> &'static str {
let reg_value: u32 = self.into();
unsafe {
std::ffi::CStr::from_ptr(
RabbitizerRegister_R4000AllegrexM3x3_Names[reg_value as usize][1],
)
.to_str()
.unwrap()
}
}
pub fn descriptor(&self) -> &RegisterDescriptor {
let reg_value: u32 = (*self).into();
unsafe {
RabbitizerRegister_R4000AllegrexM3x3_Descriptors.get_unchecked(reg_value as usize)
}
}
}
impl registers_enum::registers::R4000AllegrexM4x4 {
pub fn name(self) -> &'static str {
let reg_value: u32 = self.into();
unsafe {
std::ffi::CStr::from_ptr(
RabbitizerRegister_R4000AllegrexM4x4_Names[reg_value as usize][1],
)
.to_str()
.unwrap()
}
}
pub fn descriptor(&self) -> &RegisterDescriptor {
let reg_value: u32 = (*self).into();
unsafe {
RabbitizerRegister_R4000AllegrexM4x4_Descriptors.get_unchecked(reg_value as usize)
}
}
}
impl registers_enum::registers::R4000AllegrexVfpuControl {
pub fn name(self) -> &'static str {
let reg_value: u32 = self.into();
unsafe {
std::ffi::CStr::from_ptr(
RabbitizerRegister_R4000AllegrexVfpuControl_Names[reg_value as usize][1],
)
.to_str()
.unwrap()
}
}
pub fn descriptor(&self) -> &RegisterDescriptor {
let reg_value: u32 = (*self).into();
unsafe {
RabbitizerRegister_R4000AllegrexVfpuControl_Descriptors
.get_unchecked(reg_value as usize)
}
}
}
impl registers_enum::registers::R4000AllegrexVConstant {
pub fn name(self) -> &'static str {
let reg_value: u32 = self.into();
unsafe {
std::ffi::CStr::from_ptr(
RabbitizerRegister_R4000AllegrexVConstant_Names[reg_value as usize][1],
)
.to_str()
.unwrap()
}
}
pub fn descriptor(&self) -> &RegisterDescriptor {
let reg_value: u32 = (*self).into();
unsafe {
RabbitizerRegister_R4000AllegrexVConstant_Descriptors.get_unchecked(reg_value as usize)
}
}
}
impl registers_enum::registers::R5900VF {
pub fn name(self) -> &'static str {
let reg_value: u32 = self.into();

View File

@ -26,6 +26,7 @@ RabbitizerConfig RabbitizerConfig_Cfg = {
.userFpcCsr = true,
.vr4300Cop0NamedRegisters = true,
.vr4300RspCop0NamedRegisters = true,
.r4000AllegrexVfpuControlNamedRegisters = false,
},
.pseudos = {
.enablePseudos = true,

View File

@ -76,3 +76,79 @@ size_t RabbitizerUtils_escapeString(char *dst, size_t dstSize, const char *src,
return dstpos;
}
uint32_t RabbitizerUtils_floatRepr_32From16(uint16_t arg) {
// IEEE754 16-bit floats are encoded in 16 bits as follows:
// Sign bit: 1 bit (bit 15)
// Encoded exponent: 5 bits (bits 10 ~ 15)
// Fraction/Mantissa: 10 bits (bits 0 ~ 9)
uint32_t ret;
int32_t sign;
int32_t encodedExponent;
int32_t realExponent;
bool mantissaIsZero;
// arg.d = a;
ret = 0;
sign = arg >> 15;
// If parameter is zero, then return zero
if ((arg & ~(1ULL << 15)) == 0) {
// Preserve the sign
ret |= (sign << 31);
return ret;
}
// Clear up the sign
arg &= ~(1ULL << 15);
encodedExponent = arg >> 10;
// Clear up the encoded exponent
arg &= ~0x7C00ULL;
// Exponent bias: 0xF
realExponent = encodedExponent - 0xF;
mantissaIsZero = (arg == 0);
if (encodedExponent == 0) {
// subnormals
ret |= ((uint32_t)sign) << 31;
// no need to set the exponent part since it was already zero'd
// Set the mantissa
ret |= arg >> (23 - 10);
return ret;
}
if (encodedExponent == 0x1F) {
// Infinity and NaN
ret |= ((uint32_t)sign) << 31;
ret |= 0x7F800000ULL;
if (!mantissaIsZero) {
// NaN
// Set the mantissa to any non-zero value
ret |= arg << (23 - 10);
}
return ret;
}
ret |= ((uint32_t)sign) << 31;
// re-encode the exponent
ret |= ((uint32_t)(realExponent + 0x7F)) << 23;
// Set the mantissa
ret |= arg << (23 - 10);
return ret;
}

View File

@ -43,6 +43,12 @@ bool RabbitizerInstrDescriptor_hasOperandAlias(const RabbitizerInstrDescriptor *
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_rsp_maybe_rd_rs)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_offset14_base)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_offset14_base_maybe_wb)) {
return true;
}
break;
case RAB_OPERAND_cpu_immediate:
@ -264,6 +270,149 @@ bool RabbitizerInstrDescriptor_hasOperandAlias(const RabbitizerInstrDescriptor *
break;
/* r3000gte */
/* r4000allegrex */
case RAB_OPERAND_r4000allegrex_s_vs:
case RAB_OPERAND_r4000allegrex_s_vt:
case RAB_OPERAND_r4000allegrex_s_vd:
case RAB_OPERAND_r4000allegrex_s_vt_imm:
case RAB_OPERAND_r4000allegrex_s_vd_imm:
case RAB_OPERAND_r4000allegrex_p_vs:
case RAB_OPERAND_r4000allegrex_p_vt:
case RAB_OPERAND_r4000allegrex_p_vd:
case RAB_OPERAND_r4000allegrex_t_vs:
case RAB_OPERAND_r4000allegrex_t_vt:
case RAB_OPERAND_r4000allegrex_t_vd:
case RAB_OPERAND_r4000allegrex_q_vs:
case RAB_OPERAND_r4000allegrex_q_vt:
case RAB_OPERAND_r4000allegrex_q_vd:
case RAB_OPERAND_r4000allegrex_q_vt_imm:
case RAB_OPERAND_r4000allegrex_mp_vs:
case RAB_OPERAND_r4000allegrex_mp_vt:
case RAB_OPERAND_r4000allegrex_mp_vd:
case RAB_OPERAND_r4000allegrex_mp_vs_transpose:
case RAB_OPERAND_r4000allegrex_mt_vs:
case RAB_OPERAND_r4000allegrex_mt_vt:
case RAB_OPERAND_r4000allegrex_mt_vd:
case RAB_OPERAND_r4000allegrex_mt_vs_transpose:
case RAB_OPERAND_r4000allegrex_mq_vs:
case RAB_OPERAND_r4000allegrex_mq_vt:
case RAB_OPERAND_r4000allegrex_mq_vd:
case RAB_OPERAND_r4000allegrex_mq_vs_transpose:
case RAB_OPERAND_r4000allegrex_cop2cs:
case RAB_OPERAND_r4000allegrex_cop2cd:
break;
case RAB_OPERAND_r4000allegrex_pos:
case RAB_OPERAND_r4000allegrex_size:
case RAB_OPERAND_r4000allegrex_size_plus_pos:
case RAB_OPERAND_r4000allegrex_imm3:
break;
case RAB_OPERAND_r4000allegrex_offset14_base:
if (RabbitizerInstrDescriptor_hasOperandAlias(self, RAB_OPERAND_cpu_rs)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_offset14_base_maybe_wb)) {
return true;
}
break;
case RAB_OPERAND_r4000allegrex_offset14_base_maybe_wb:
if (RabbitizerInstrDescriptor_hasOperandAlias(self, RAB_OPERAND_cpu_rs)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_offset14_base)) {
return true;
}
break;
case RAB_OPERAND_r4000allegrex_vcmp_cond:
if (RabbitizerInstrDescriptor_hasSpecificOperand(self,
RAB_OPERAND_r4000allegrex_vcmp_cond_s_maybe_vs_maybe_vt)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self,
RAB_OPERAND_r4000allegrex_vcmp_cond_p_maybe_vs_maybe_vt)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self,
RAB_OPERAND_r4000allegrex_vcmp_cond_t_maybe_vs_maybe_vt)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self,
RAB_OPERAND_r4000allegrex_vcmp_cond_q_maybe_vs_maybe_vt)) {
return true;
}
break;
case RAB_OPERAND_r4000allegrex_vcmp_cond_s_maybe_vs_maybe_vt:
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_vcmp_cond)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_s_vs)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_s_vt)) {
return true;
}
break;
case RAB_OPERAND_r4000allegrex_vcmp_cond_p_maybe_vs_maybe_vt:
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_vcmp_cond)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_p_vs)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_p_vt)) {
return true;
}
break;
case RAB_OPERAND_r4000allegrex_vcmp_cond_t_maybe_vs_maybe_vt:
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_vcmp_cond)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_t_vs)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_t_vt)) {
return true;
}
break;
case RAB_OPERAND_r4000allegrex_vcmp_cond_q_maybe_vs_maybe_vt:
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_vcmp_cond)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_q_vs)) {
return true;
}
if (RabbitizerInstrDescriptor_hasSpecificOperand(self, RAB_OPERAND_r4000allegrex_q_vt)) {
return true;
}
break;
case RAB_OPERAND_r4000allegrex_vconstant:
case RAB_OPERAND_r4000allegrex_power_of_two:
case RAB_OPERAND_r4000allegrex_vfpu_cc_bit:
case RAB_OPERAND_r4000allegrex_bn:
case RAB_OPERAND_r4000allegrex_int16:
case RAB_OPERAND_r4000allegrex_float16:
case RAB_OPERAND_r4000allegrex_p_vrot_code:
case RAB_OPERAND_r4000allegrex_t_vrot_code:
case RAB_OPERAND_r4000allegrex_q_vrot_code:
case RAB_OPERAND_r4000allegrex_rpx:
case RAB_OPERAND_r4000allegrex_rpy:
case RAB_OPERAND_r4000allegrex_rpz:
case RAB_OPERAND_r4000allegrex_rpw:
case RAB_OPERAND_r4000allegrex_wpx:
case RAB_OPERAND_r4000allegrex_wpy:
case RAB_OPERAND_r4000allegrex_wpz:
case RAB_OPERAND_r4000allegrex_wpw:
break;
/* r4000allegrex */
/* r5900 */
case RAB_OPERAND_r5900_I:
case RAB_OPERAND_r5900_Q:

View File

@ -16,10 +16,12 @@ bool RabbitizerInstrId_isValid(RabbitizerInstrId uniqueId) {
case RABBITIZER_INSTR_ID_rsp_INVALID:
case RABBITIZER_INSTR_ID_r3000gte_INVALID:
case RABBITIZER_INSTR_ID_r5900_INVALID:
case RABBITIZER_INSTR_ID_r4000allegrex_INVALID:
case RABBITIZER_INSTR_ID_cpu_MAX:
case RABBITIZER_INSTR_ID_rsp_MAX:
case RABBITIZER_INSTR_ID_r3000gte_MAX:
case RABBITIZER_INSTR_ID_r5900_MAX:
case RABBITIZER_INSTR_ID_r4000allegrex_MAX:
// case RABBITIZER_INSTR_ID_ALL_MAX: Same as last MAX
return false;

View File

@ -9,6 +9,7 @@
#include "instructions/RabbitizerRegister.h"
#include "instructions/RabbitizerInstructionRsp.h"
#include "instructions/RabbitizerInstructionR3000GTE.h"
#include "instructions/RabbitizerInstructionR4000Allegrex.h"
#include "instructions/RabbitizerInstructionR5900.h"
void RabbitizerInstruction_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram) {
@ -355,6 +356,155 @@ void RabbitizerInstruction_blankOut(RabbitizerInstruction *self) {
break;
/* r3000gte */
/* r4000allegrex */
case RAB_OPERAND_r4000allegrex_s_vs:
case RAB_OPERAND_r4000allegrex_p_vs:
case RAB_OPERAND_r4000allegrex_t_vs:
case RAB_OPERAND_r4000allegrex_q_vs:
case RAB_OPERAND_r4000allegrex_mp_vs:
case RAB_OPERAND_r4000allegrex_mt_vs:
case RAB_OPERAND_r4000allegrex_mq_vs:
case RAB_OPERAND_r4000allegrex_mp_vs_transpose:
case RAB_OPERAND_r4000allegrex_mt_vs_transpose:
case RAB_OPERAND_r4000allegrex_mq_vs_transpose:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_vs(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_s_vt:
case RAB_OPERAND_r4000allegrex_p_vt:
case RAB_OPERAND_r4000allegrex_t_vt:
case RAB_OPERAND_r4000allegrex_q_vt:
case RAB_OPERAND_r4000allegrex_mp_vt:
case RAB_OPERAND_r4000allegrex_mt_vt:
case RAB_OPERAND_r4000allegrex_mq_vt:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_vt(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_s_vd:
case RAB_OPERAND_r4000allegrex_p_vd:
case RAB_OPERAND_r4000allegrex_t_vd:
case RAB_OPERAND_r4000allegrex_q_vd:
case RAB_OPERAND_r4000allegrex_mp_vd:
case RAB_OPERAND_r4000allegrex_mt_vd:
case RAB_OPERAND_r4000allegrex_mq_vd:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_vd(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_s_vt_imm:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_vt_imm(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_s_vd_imm:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_vd_imm(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_q_vt_imm:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_vt_6_imm(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_cop2cd:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_cop2cd(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_cop2cs:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_cop2cs(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_pos:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_pos(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_size:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_size(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_size_plus_pos:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_size_plus_pos(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_imm3:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_imm3(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_offset14_base_maybe_wb:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_wb(self->word, 0);
FALLTHROUGH;
case RAB_OPERAND_r4000allegrex_offset14_base:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_offset14(self->word, 0);
self->word = RAB_INSTR_PACK_rs(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_vcmp_cond_s_maybe_vs_maybe_vt:
case RAB_OPERAND_r4000allegrex_vcmp_cond_p_maybe_vs_maybe_vt:
case RAB_OPERAND_r4000allegrex_vcmp_cond_t_maybe_vs_maybe_vt:
case RAB_OPERAND_r4000allegrex_vcmp_cond_q_maybe_vs_maybe_vt:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_vs(self->word, 0);
self->word = RAB_INSTR_R4000ALLEGREX_PACK_vt(self->word, 0);
FALLTHROUGH;
case RAB_OPERAND_r4000allegrex_vcmp_cond:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_vcmp_cond(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_vconstant:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_vconstant(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_power_of_two:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_power_of_two(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_vfpu_cc_bit:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_vfpu_cc_bit(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_bn:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_bn(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_int16:
case RAB_OPERAND_r4000allegrex_float16:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_intfloat16(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_p_vrot_code:
case RAB_OPERAND_r4000allegrex_t_vrot_code:
case RAB_OPERAND_r4000allegrex_q_vrot_code:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_vrot_code(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_rpx:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_rpx(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_rpy:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_rpy(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_rpz:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_rpz(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_rpw:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_rpw(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_wpx:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_wpx(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_wpy:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_wpy(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_wpz:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_wpz(self->word, 0);
break;
case RAB_OPERAND_r4000allegrex_wpw:
self->word = RAB_INSTR_R4000ALLEGREX_PACK_wpw(self->word, 0);
break;
/* r4000allegrex */
/* r5900 */
case RAB_OPERAND_r5900_I:
case RAB_OPERAND_r5900_Q:

View File

@ -8,6 +8,7 @@
#include "common/RabbitizerConfig.h"
#include "instructions/RabbitizerInstructionRsp.h"
#include "instructions/RabbitizerInstructionR3000GTE.h"
#include "instructions/RabbitizerInstructionR4000Allegrex.h"
#include "instructions/RabbitizerInstructionR5900.h"
#include "instructions/RabbitizerRegister.h"
@ -401,6 +402,155 @@ uint32_t RabbitizerInstruction_getValidBits(const RabbitizerInstruction *self) {
break;
/* r3000gte */
/* r4000allegrex */
case RAB_OPERAND_r4000allegrex_s_vs:
case RAB_OPERAND_r4000allegrex_p_vs:
case RAB_OPERAND_r4000allegrex_t_vs:
case RAB_OPERAND_r4000allegrex_q_vs:
case RAB_OPERAND_r4000allegrex_mp_vs:
case RAB_OPERAND_r4000allegrex_mt_vs:
case RAB_OPERAND_r4000allegrex_mq_vs:
case RAB_OPERAND_r4000allegrex_mp_vs_transpose:
case RAB_OPERAND_r4000allegrex_mt_vs_transpose:
case RAB_OPERAND_r4000allegrex_mq_vs_transpose:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_vs(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_s_vt:
case RAB_OPERAND_r4000allegrex_p_vt:
case RAB_OPERAND_r4000allegrex_t_vt:
case RAB_OPERAND_r4000allegrex_q_vt:
case RAB_OPERAND_r4000allegrex_mp_vt:
case RAB_OPERAND_r4000allegrex_mt_vt:
case RAB_OPERAND_r4000allegrex_mq_vt:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_vt(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_s_vd:
case RAB_OPERAND_r4000allegrex_p_vd:
case RAB_OPERAND_r4000allegrex_t_vd:
case RAB_OPERAND_r4000allegrex_q_vd:
case RAB_OPERAND_r4000allegrex_mp_vd:
case RAB_OPERAND_r4000allegrex_mt_vd:
case RAB_OPERAND_r4000allegrex_mq_vd:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_vd(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_s_vt_imm:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_vt_imm(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_s_vd_imm:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_vd_imm(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_q_vt_imm:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_vt_6_imm(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_cop2cs:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_cop2cs(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_cop2cd:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_cop2cd(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_pos:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_pos(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_size:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_size(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_size_plus_pos:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_size_plus_pos(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_imm3:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_imm3(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_offset14_base_maybe_wb:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_wb(validbits, ~0);
FALLTHROUGH;
case RAB_OPERAND_r4000allegrex_offset14_base:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_offset14(validbits, ~0);
validbits = RAB_INSTR_PACK_rs(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_vcmp_cond_s_maybe_vs_maybe_vt:
case RAB_OPERAND_r4000allegrex_vcmp_cond_p_maybe_vs_maybe_vt:
case RAB_OPERAND_r4000allegrex_vcmp_cond_t_maybe_vs_maybe_vt:
case RAB_OPERAND_r4000allegrex_vcmp_cond_q_maybe_vs_maybe_vt:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_vs(validbits, ~0);
validbits = RAB_INSTR_R4000ALLEGREX_PACK_vt(validbits, ~0);
FALLTHROUGH;
case RAB_OPERAND_r4000allegrex_vcmp_cond:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_vcmp_cond(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_vconstant:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_vconstant(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_power_of_two:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_power_of_two(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_vfpu_cc_bit:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_vfpu_cc_bit(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_bn:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_bn(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_int16:
case RAB_OPERAND_r4000allegrex_float16:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_intfloat16(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_p_vrot_code:
case RAB_OPERAND_r4000allegrex_t_vrot_code:
case RAB_OPERAND_r4000allegrex_q_vrot_code:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_vrot_code(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_rpx:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_rpx(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_rpy:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_rpy(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_rpz:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_rpz(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_rpw:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_rpw(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_wpx:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_wpx(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_wpy:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_wpy(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_wpz:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_wpz(validbits, ~0);
break;
case RAB_OPERAND_r4000allegrex_wpw:
validbits = RAB_INSTR_R4000ALLEGREX_PACK_wpw(validbits, ~0);
break;
/* r4000allegrex */
/* r5900 */
case RAB_OPERAND_r5900_I:
case RAB_OPERAND_r5900_Q:

View File

@ -166,6 +166,8 @@ void RabbitizerInstruction_processUniqueId_Coprocessor0_BC0(RabbitizerInstructio
switch (fmt) {
#include "tables/instr_id/cpu/cpu_cop0_bc0.inc"
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
void RabbitizerInstruction_processUniqueId_Coprocessor0_Tlb(RabbitizerInstruction *self) {
@ -177,6 +179,8 @@ void RabbitizerInstruction_processUniqueId_Coprocessor0_Tlb(RabbitizerInstructio
switch (function) {
#include "tables/instr_id/cpu/cpu_cop0_tlb.inc"
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
void RabbitizerInstruction_processUniqueId_Coprocessor0(RabbitizerInstruction *self) {
@ -210,6 +214,8 @@ void RabbitizerInstruction_processUniqueId_Coprocessor1_BC1(RabbitizerInstructio
switch (fmt) {
#include "tables/instr_id/cpu/cpu_cop1_bc1.inc"
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuS(RabbitizerInstruction *self) {
@ -221,6 +227,8 @@ void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuS(RabbitizerInstructi
switch (function) {
#include "tables/instr_id/cpu/cpu_cop1_fpu_s.inc"
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuD(RabbitizerInstruction *self) {
@ -232,6 +240,8 @@ void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuD(RabbitizerInstructi
switch (function) {
#include "tables/instr_id/cpu/cpu_cop1_fpu_d.inc"
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuW(RabbitizerInstruction *self) {
@ -243,6 +253,8 @@ void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuW(RabbitizerInstructi
switch (function) {
#include "tables/instr_id/cpu/cpu_cop1_fpu_w.inc"
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuL(RabbitizerInstruction *self) {
@ -254,6 +266,8 @@ void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuL(RabbitizerInstructi
switch (function) {
#include "tables/instr_id/cpu/cpu_cop1_fpu_l.inc"
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
}
void RabbitizerInstruction_processUniqueId_Coprocessor1(RabbitizerInstruction *self) {

View File

@ -0,0 +1,17 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
#include "instructions/RabbitizerInstructionR4000Allegrex.h"
void RabbitizerInstructionR4000Allegrex_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram) {
RabbitizerInstruction_init(self, word, vram);
self->uniqueId = RABBITIZER_INSTR_ID_r4000allegrex_INVALID;
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];
self->category = RABBITIZER_INSTRCAT_R4000ALLEGREX;
}
void RabbitizerInstructionR4000Allegrex_destroy(RabbitizerInstruction *self) {
RabbitizerInstruction_destroy(self);
}

View File

@ -101,6 +101,65 @@ const char *RabbitizerRegister_getNameRspVector(uint8_t regValue) {
return RabbitizerRegister_RspVector_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0];
}
const char *RabbitizerRegister_getNameR4000AllegrexS(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexS_Names));
return RabbitizerRegister_R4000AllegrexS_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0];
}
const char *RabbitizerRegister_getNameR4000AllegrexV2D(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexV2D_Names));
return RabbitizerRegister_R4000AllegrexV2D_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0];
}
const char *RabbitizerRegister_getNameR4000AllegrexV3D(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexV3D_Names));
return RabbitizerRegister_R4000AllegrexV3D_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0];
}
const char *RabbitizerRegister_getNameR4000AllegrexV4D(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexV4D_Names));
return RabbitizerRegister_R4000AllegrexV4D_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0];
}
const char *RabbitizerRegister_getNameR4000AllegrexM2x2(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexM2x2_Names));
return RabbitizerRegister_R4000AllegrexM2x2_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0];
}
const char *RabbitizerRegister_getNameR4000AllegrexM3x3(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexM3x3_Names));
return RabbitizerRegister_R4000AllegrexM3x3_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0];
}
const char *RabbitizerRegister_getNameR4000AllegrexM4x4(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexM4x4_Names));
return RabbitizerRegister_R4000AllegrexM4x4_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0];
}
const char *RabbitizerRegister_getNameR4000AllegrexVfpuControl(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexVfpuControl_Names));
return RabbitizerRegister_R4000AllegrexVfpuControl_Names
[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters &&
RabbitizerConfig_Cfg.regNames.r4000AllegrexVfpuControlNamedRegisters
? 1
: 0];
}
const char *RabbitizerRegister_getNameR4000AllegrexVConstant(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexVConstant_Names));
return RabbitizerRegister_R4000AllegrexVConstant_Names[regValue]
[RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0];
}
const char *RabbitizerRegister_getNameR5900VF(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R5900VF_Names));
@ -186,6 +245,60 @@ const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_RspVector(u
return &RabbitizerRegister_RspVector_Descriptors[regValue];
}
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexS(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexS_Names));
return &RabbitizerRegister_R4000AllegrexS_Descriptors[regValue];
}
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexV2D(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexV2D_Names));
return &RabbitizerRegister_R4000AllegrexV2D_Descriptors[regValue];
}
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexV3D(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexV3D_Names));
return &RabbitizerRegister_R4000AllegrexV3D_Descriptors[regValue];
}
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexV4D(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexV4D_Names));
return &RabbitizerRegister_R4000AllegrexV4D_Descriptors[regValue];
}
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexM2x2(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexM2x2_Names));
return &RabbitizerRegister_R4000AllegrexM2x2_Descriptors[regValue];
}
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexM3x3(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexM3x3_Names));
return &RabbitizerRegister_R4000AllegrexM3x3_Descriptors[regValue];
}
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexM4x4(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexM4x4_Names));
return &RabbitizerRegister_R4000AllegrexM4x4_Descriptors[regValue];
}
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexVfpuControl(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexVfpuControl_Names));
return &RabbitizerRegister_R4000AllegrexVfpuControl_Descriptors[regValue];
}
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R4000AllegrexVConstant(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R4000AllegrexVConstant_Names));
return &RabbitizerRegister_R4000AllegrexVConstant_Descriptors[regValue];
}
const RabbitizerRegisterDescriptor *RabbitizerRegister_getDescriptor_R5900VF(uint8_t regValue) {
assert(regValue < ARRAY_COUNT(RabbitizerRegister_R5900VF_Names));

View File

@ -4,4 +4,5 @@
RABBITIZER_DEF_INSTR_CATEGORY(CPU)
RABBITIZER_DEF_INSTR_CATEGORY(RSP) // N64
RABBITIZER_DEF_INSTR_CATEGORY(R3000GTE) // R3000 CPU with PS1's Geometry Transformation Engine extension
RABBITIZER_DEF_INSTR_CATEGORY(R4000ALLEGREX) // PSP's CPU
RABBITIZER_DEF_INSTR_CATEGORY(R5900) // PS2's Emotion Engine

View File

@ -6,6 +6,7 @@
#include "instr_id_types/InstrIdType_cpu.inc"
#include "instr_id_types/InstrIdType_rsp.inc"
#include "instr_id_types/InstrIdType_r3000gte.inc"
#include "instr_id_types/InstrIdType_r4000allegrex.inc"
#include "instr_id_types/InstrIdType_r5900.inc"
RABBITIZER_DEF_INSTR_ID_TYPE(ALL, MAX)

View File

@ -4,4 +4,5 @@
#include "instr_id/RabbitizerInstrId_cpu.inc"
#include "instr_id/RabbitizerInstrId_rsp.inc"
#include "instr_id/RabbitizerInstrId_r3000gte.inc"
#include "instr_id/RabbitizerInstrId_r4000allegrex.inc"
#include "instr_id/RabbitizerInstrId_r5900.inc"

View File

@ -4,4 +4,5 @@
#include "operands/RabbitizerOperandType_cpu.inc"
#include "operands/RabbitizerOperandType_rsp.inc"
#include "operands/RabbitizerOperandType_r3000gte.inc"
#include "operands/RabbitizerOperandType_r4000allegrex.inc"
#include "operands/RabbitizerOperandType_r5900.inc"

View File

@ -9,15 +9,18 @@
#include "cpu/cpu_normal.inc"
#include "cpu/cpu_special.inc"
#include "cpu/cpu_regimm.inc"
#include "cpu/cpu_cop0.inc"
#include "cpu/cpu_cop0_bc0.inc"
#include "cpu/cpu_cop0_tlb.inc"
#include "cpu/cpu_cop1.inc"
#include "cpu/cpu_cop1_bc1.inc"
#include "cpu/cpu_cop1_fpu_s.inc"
#include "cpu/cpu_cop1_fpu_d.inc"
#include "cpu/cpu_cop1_fpu_w.inc"
#include "cpu/cpu_cop1_fpu_l.inc"
#include "cpu/cpu_cop2.inc"
#ifndef INSTRID_AVOID_USERDEF

View File

@ -0,0 +1,155 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , INVALID,
.operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate},
.instrType=RABBITIZER_INSTR_TYPE_UNKNOWN
)
#include "r4000allegrex/r4000allegrex_normal.inc"
#include "r4000allegrex/r4000allegrex_special.inc"
#include "r4000allegrex/r4000allegrex_special_rs.inc"
#include "r4000allegrex/r4000allegrex_special_sa.inc"
#include "r4000allegrex/r4000allegrex_regimm.inc"
#include "r4000allegrex/r4000allegrex_special2.inc"
#include "r4000allegrex/r4000allegrex_special3.inc"
#include "r4000allegrex/r4000allegrex_special3_bshfl.inc"
#include "r4000allegrex/r4000allegrex_cop0.inc"
#include "r4000allegrex/r4000allegrex_cop0_bc0.inc"
#include "r4000allegrex/r4000allegrex_cop0_tlb.inc"
#include "r4000allegrex/r4000allegrex_cop1.inc"
#include "r4000allegrex/r4000allegrex_cop1_bc1.inc"
#include "r4000allegrex/r4000allegrex_cop1_fpu_s.inc"
#include "r4000allegrex/r4000allegrex_cop1_fpu_w.inc"
#include "r4000allegrex/r4000allegrex_cop2.inc"
#include "r4000allegrex/r4000allegrex_cop2_bc2.inc"
#include "r4000allegrex/r4000allegrex_cop2_mfhc2.inc"
#include "r4000allegrex/r4000allegrex_cop2_mfhc2_p.inc"
#include "r4000allegrex/r4000allegrex_cop2_mfhc2_p_s.inc"
#include "r4000allegrex/r4000allegrex_cop2_mthc2.inc"
#include "r4000allegrex/r4000allegrex_vfpu0.inc"
#include "r4000allegrex/r4000allegrex_vfpu1.inc"
#include "r4000allegrex/r4000allegrex_vfpu3.inc"
#include "r4000allegrex/r4000allegrex_vfpu4.inc"
#include "r4000allegrex/r4000allegrex_vfpu4_fmt0.inc"
#include "r4000allegrex/r4000allegrex_vfpu4_fmt0_fmt0.inc"
#include "r4000allegrex/r4000allegrex_vfpu4_fmt0_fmt2.inc"
#include "r4000allegrex/r4000allegrex_vfpu4_fmt0_fmt3.inc"
#include "r4000allegrex/r4000allegrex_vfpu4_fmt0_rnd.inc"
#include "r4000allegrex/r4000allegrex_vfpu4_fmt0_cvtflt.inc"
#include "r4000allegrex/r4000allegrex_vfpu4_fmt0_cvtint.inc"
#include "r4000allegrex/r4000allegrex_vfpu4_fmt0_fmt8.inc"
#include "r4000allegrex/r4000allegrex_vfpu4_fmt0_fmt9.inc"
#include "r4000allegrex/r4000allegrex_vfpu4_fmt0_control.inc"
#include "r4000allegrex/r4000allegrex_vfpu4_fmt0_color.inc"
#include "r4000allegrex/r4000allegrex_vfpu4_fmt0_cst.inc"
#include "r4000allegrex/r4000allegrex_vfpu4_fmt2.inc"
#include "r4000allegrex/r4000allegrex_vfpu4_fmt2_cndmove.inc"
#include "r4000allegrex/r4000allegrex_vfpu5.inc"
#include "r4000allegrex/r4000allegrex_vfpu6.inc"
#include "r4000allegrex/r4000allegrex_vfpu6_fmt7.inc"
#include "r4000allegrex/r4000allegrex_vfpu6_fmt7_fmt0.inc"
#include "r4000allegrex/r4000allegrex_vfpu7.inc"
#include "r4000allegrex/r4000allegrex_quadlr.inc"
#ifndef INSTRID_AVOID_USERDEF
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_00,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_01,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_02,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_03,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_04,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_05,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_06,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_07,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_08,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_09,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_10,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_11,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_12,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_13,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_14,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_15,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_16,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_17,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_18,
.operands={0}
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , USERDEF_19,
.operands={0}
)
#endif
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, , MAX,
.operands={0}
)

View File

@ -16,6 +16,7 @@
111 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
// OP
RABBITIZER_DEF_INSTR_ID(
cpu, 0x01, tlbr,

View File

@ -11,8 +11,10 @@
10 | *2 | *3 | --- | --- | *4 | *5 | --- | --- |
11 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*1 = BC instructions, see BC1 list *2 = S instr, see FPU S list
*3 = D instr, see FPU D list *4 = W instr, see FPU W list
*1 = BC instructions, see BC1 list
*2 = S instr, see FPU S list
*3 = D instr, see FPU D list
*4 = W instr, see FPU W list
*5 = L instr, see FPU L list
*/

View File

@ -3,7 +3,7 @@
/*
31----------26-25--------21 -----------------------------------------5----------0
| = COP1 | = S | | function |
| = COP1 | = D | | function |
-------6------------5-----------------------------------------------------6------
|---000---|---001---|---010---|---011---|---100---|---101---|---110---|---111---| lo
000 | ADD.D | SUB.D | MUL.D | DIV.D | SQRT.D | ABS.D | MOV.D | NEG.D |

View File

@ -3,7 +3,7 @@
/*
31----------26-25--------21 -----------------------------------------5----------0
| = COP1 | = S | | function |
| = COP1 | = L | | function |
-------6------------5-----------------------------------------------------6------
|---000---|---001---|---010---|---011---|---100---|---101---|---110---|---111---| lo
000 | --- | --- | --- | --- | --- | --- | --- | --- |

View File

@ -3,7 +3,7 @@
/*
31----------26-25--------21 -----------------------------------------5----------0
| = COP1 | = S | | function |
| = COP1 | = W | | function |
-------6------------5-----------------------------------------------------6------
|---000---|---001---|---010---|---011---|---100---|---101---|---110---|---111---| lo
000 | --- | --- | --- | --- | --- | --- | --- | --- |

View File

@ -6,7 +6,7 @@
| = COP0 | fmt | |
------6----------5-----------------------------------------------
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
00 | MFC2 | --- | CFC0 | --- | MTC2 | --- | CTC2 | --- |
00 | MFC2 | --- | CFC2 | --- | MTC2 | --- | CTC2 | --- |
01 | --- | --- | --- | --- | --- | --- | --- | --- |
10 | --- | --- | --- | --- | --- | --- | --- | --- |
11 | --- | --- | --- | --- | --- | --- | --- | --- |

View File

@ -9,7 +9,7 @@
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 | --- | --- | --- | --- |
011 | DADDI | DADDIU| LDL | LDR | --- | --- | --- | --- |
100 | LB | LH | LWL | LW | LBU | LHU | LWR | LWU |
101 | SB | SH | SWL | SW | SDL | SDR | SWR | CACHE |
110 | LL | LWC1 | LWC2 | PREF | LLD | LDC1 | LDC2 | LD |

View File

@ -0,0 +1,17 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25------21 ----------------------------------------0
| = COP0 | fmt | |
------6----------5-----------------------------------------------
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
00 | MFC0 | --- | --- | --- | MTC0 | --- | --- | --- |
01 | *1 | --- | --- | --- | --- | --- | --- | --- |
10 | --- | --- | --- | --- | --- | --- | --- | --- |
11 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*1=BC See BC0 list
*/
// The other instructions are implemented using the main CPU table

View File

@ -0,0 +1,16 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25------21-20------16------------------------------0
| = COP0 | BC0 | fmt | |
------6----------5----------5------------------------------------
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
00 | BC0F | BC0T | BC0FL | BC0TL | --- | --- | --- | --- |
01 | --- | --- | --- | --- | --- | --- | --- | --- |
10 | --- | --- | --- | --- | --- | --- | --- | --- |
11 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
// The other instructions are implemented using the main CPU table

View File

@ -0,0 +1,20 @@
/* SPDX-FileCopyrightText: © 2024 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 | --- | --- | --- | --- | --- | --- | --- | --- |
001 | --- | --- | --- | --- | --- | --- | --- | --- |
010 | --- | --- | --- | --- | --- | --- | --- | --- |
011 | ERET | --- | --- | --- | --- | --- | --- | --- |
100 | --- | --- | --- | --- | --- | --- | --- | --- |
101 | --- | --- | --- | --- | --- | --- | --- | --- |
110 | --- | --- | --- | --- | --- | --- | --- | --- |
111 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
// The other instructions are implemented using the main CPU table

View File

@ -0,0 +1,25 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25------21 ----------------------------------------0
| = COP1 | fmt | |
------6----------5-----------------------------------------------
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
00 | MFC1 | --- | CFC1 | MFHC1 | MTC1 | --- | CTC1 | MTHC1 |
01 | *1 | --- | --- | --- | --- | --- | --- | --- |
10 | *2 | --- | --- | --- | *3 | --- | --- | --- |
11 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*1 = BC See BC1 list
*2 = S instr, see FPU S list
*3 = W instr, see FPU W list
*/
/*
TODO:
- MFHC1
- MTHC1
*/
// The other instructions are implemented using the main CPU table

View File

@ -0,0 +1,16 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25------21-20------16------------------------------0
| = COP1 | BC1 | fmt | |
------6----------5----------5------------------------------------
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
00 | BC1F | BC1T | BC1FL | BC1TL | --- | --- | --- | --- |
01 | --- | --- | --- | --- | --- | --- | --- | --- |
10 | --- | --- | --- | --- | --- | --- | --- | --- |
11 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
// The other instructions are implemented using the main CPU table

View File

@ -0,0 +1,20 @@
/* SPDX-FileCopyrightText: © 2024 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 | --- | --- | --- | --- |ROUND.W.S|TRUNC.W.S| CEIL.W.S|FLOOR.W.S|
010 | --- | --- | --- | --- | --- | --- | --- | --- |
011 | --- | --- | --- | --- | --- | --- | --- | --- |
100 | --- | --- | --- | --- | CVT.W.S | --- | --- | --- |
101 | --- | --- | --- | --- | --- | --- | --- | --- |
110 | C.F.S | C.UN.S | C.EQ.S | C.UEQ.S | C.OLT.S | C.ULT.S | C.OLE.S | C.ULE.S |
111 | C.SF.S | C.NGLE.S| C.SEQ.S | C.NGL.S | C.LT.S | C.NGE.S | C.LE.S | C.NGT.S |
hi |---------|---------|---------|---------|---------|---------|---------|---------|
*/
// The other instructions are implemented using the main CPU table

View File

@ -0,0 +1,20 @@
/* SPDX-FileCopyrightText: © 2022-2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31----------26-25--------21 -----------------------------------------5----------0
| = COP1 | = W | | function |
-------6------------5-----------------------------------------------------6------
|---000---|---001---|---010---|---011---|---100---|---101---|---110---|---111---| lo
000 | --- | --- | --- | --- | --- | --- | --- | --- |
001 | --- | --- | --- | --- | --- | --- | --- | --- |
010 | --- | --- | --- | --- | --- | --- | --- | --- |
011 | --- | --- | --- | --- | --- | --- | --- | --- |
100 | CVT.S.W | --- | --- | --- | --- | --- | --- | --- |
101 | --- | --- | --- | --- | --- | --- | --- | --- |
110 | --- | --- | --- | --- | --- | --- | --- | --- |
111 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |---------|---------|---------|---------|---------|---------|---------|---------|
*/
// The other instructions are implemented using the main CPU table

View File

@ -0,0 +1,19 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25------21 ----------------------------------------0
| = COP2 | fmt | |
------6----------5-----------------------------------------------
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
00 | MFC2 | --- | CFC2 | *2 | MTC2 | --- | CTC2 | *3 |
01 | *1 | --- | --- | --- | --- | --- | --- | --- |
10 | --- | --- | --- | --- | --- | --- | --- | --- |
11 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*1 = See BC2 table
*2 = See MFHC2 table
*3 = See MTHC2 table
*/
// The other instructions are implemented using the main CPU table

View File

@ -0,0 +1,40 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25-----21------17-16-------------------------------0
| = COP2 | BC2 | |fmt| |
------6----------5------------2----------------------------------
|---------------0---------------|---------------1---------------| lo
0 | BVF | BVT |
1 | BVFL | BVTL |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
// OP IMM
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x00, bvf,
.operands={RAB_OPERAND_r4000allegrex_imm3, RAB_OPERAND_cpu_branch_target_label},
.instrType=RABBITIZER_INSTR_TYPE_UNKNOWN,
.isBranch=true
) // Branch on Vfpu False
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x01, bvt,
.operands={RAB_OPERAND_r4000allegrex_imm3, RAB_OPERAND_cpu_branch_target_label},
.instrType=RABBITIZER_INSTR_TYPE_UNKNOWN,
.isBranch=true
) // Branch on Vfpu True
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x02, bvfl,
.operands={RAB_OPERAND_r4000allegrex_imm3, RAB_OPERAND_cpu_branch_target_label},
.instrType=RABBITIZER_INSTR_TYPE_UNKNOWN,
.isBranch=true,
.isBranchLikely=true
) // Branch on Vfpu False Likely
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x03, bvtl,
.operands={RAB_OPERAND_r4000allegrex_imm3, RAB_OPERAND_cpu_branch_target_label},
.instrType=RABBITIZER_INSTR_TYPE_UNKNOWN,
.isBranch=true,
.isBranchLikely=true
) // Branch on Vfpu True Likely

View File

@ -0,0 +1,26 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25------21 -------------------------7--------------0
| = COP2 | MFHC2 | |p| |
------6----------5-------------------------------1---------------
|---------------0---------------|---------------1---------------| p
| mfv | *1 |
|-------------------------------|-------------------------------|
*1 = See P table
*/
/*
mfv
31--------26-25-----21-20-----16-----------------7-6------------0
| COP2 |0 0 0 1 1| rt |0 0 0 0 0 0 0 0|0| vd |
------6----------5---------5---------------------1-------7-------
*/
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0, mfv,
.operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r4000allegrex_s_vd},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRt=true
) // Move word From Vfpu

View File

@ -0,0 +1,26 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25------21 -------------------------7-6---4--------0
| = COP2 | MFHC2 | |1| fmt | |
------6----------5-------------------------------1---3-----------
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| fmt
| mfvc | --- | --- | --- | --- | --- | --- | *1 |
|-------|-------|-------|-------|-------|-------|-------|-------|
*1 See S list
*/
/*
mfvc
31--------26-25-----21-20-----16-----------------7-6------------0
| COP2 |0 0 0 1 1| rt |0 0 0 0 0 0 0 0|1| cop2cd |
------6----------5---------5---------------------1-------7-------
*/
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x0, mfvc,
.operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r4000allegrex_cop2cd},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRt=true
) // Move word From Vfpu Control

View File

@ -0,0 +1,25 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25------21 -------------------------7-6---4--------0
| = COP2 | MFHC2 | |1|1 1 1| fmt |
------6----------5-------------------------------1---3------4----
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
0 | --- | --- | --- | --- | --- | --- | --- | --- |
1 | --- | --- | --- | --- | --- | --- | --- | vsync2|
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
/*
vsync2
31--------26-25-----21---------------------------7-6---4-3------0
| COP2 |0 0 0 1 1| |1|1 1 1|1 1 1 1|
------6----------5---------5---------------------1---3------4----
*/
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0xF, vsync2,
.operands={0},
.instrType=RABBITIZER_INSTR_TYPE_R
) // SYNChronize2

View File

@ -0,0 +1,39 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25------21 -------------------------7--------------0
| = COP2 | MFHC2 | |p| |
------6----------5-------------------------------1---------------
|---------------0---------------|---------------1---------------| p
| mtv | mtvc |
|-------------------------------|-------------------------------|
*/
/*
mtv
31--------26-25-----21-20-----16-----------------7-6------------0
| COP2 |0 0 1 1 1| rt |0 0 0 0 0 0 0 0|0| vd |
------6----------5---------5---------------------1-------7-------
*/
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x0, mtv,
.operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r4000allegrex_s_vd},
.instrType=RABBITIZER_INSTR_TYPE_R,
.readsRt=true
) // Move word To Vfpu
/*
mtvc
31--------26-25-----21-20-----16-----------------7-6------------0
| COP2 |0 0 1 1 1| rt |0 0 0 0 0 0 0 0|1| cop2cd |
------6----------5---------5---------------------1-------7-------
*/
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x1, mtvc,
.operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r4000allegrex_cop2cd},
.instrType=RABBITIZER_INSTR_TYPE_R,
.readsRt=true
) // Move word To Vfpu Control

View File

@ -0,0 +1,67 @@
/* SPDX-FileCopyrightText: © 2024 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 | *6 | *7 | --- | *8 | *9 | --- | --- | *10 |
100 | LB | LH | LWL | LW | LBU | LHU | LWR | --- |
101 | SB | SH | SWL | SW | --- | --- | SWR | CACHE |
110 | LL | LWC1 | LV.S | --- | *11 | --- | LV.Q | *12 |
111 | SC | SWC1 | SV.S | --- | *13 | *14 | SV.Q | *15 |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*1 = SPECIAL, see SPECIAL list
*2 = REGIMM, see REGIMM list
*3 = COP0
*4 = COP1
*5 = COP2
*6 = VFPU0
*7 = VFPU1
*8 = VFPU3
*9 = SPECIAL2
*10 = SPECIAL3
*11 = VFPU4
*12 = VFPU5
*13 = VFPU6 (Matrix operations)
*14 = QUADLR
*15 = VFPU7
*/
// The other instructions are implemented using the main CPU table
// OP vt, offset_14(base)
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r4000allegrex, 0x32, lv_s, lv.s,
.operands={RAB_OPERAND_r4000allegrex_s_vt_imm, RAB_OPERAND_r4000allegrex_offset14_base},
.instrType=RABBITIZER_INSTR_TYPE_I,
.readsRs=true
) // Load Single word to Vfpu
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r4000allegrex, 0x3A, sv_s, sv.s,
.operands={RAB_OPERAND_r4000allegrex_s_vt_imm, RAB_OPERAND_r4000allegrex_offset14_base},
.instrType=RABBITIZER_INSTR_TYPE_I,
.modifiesRs=true
) // Store Single word to Vfpu
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r4000allegrex, 0x36, lv_q, lv.q,
.operands={RAB_OPERAND_r4000allegrex_q_vt_imm, RAB_OPERAND_r4000allegrex_offset14_base},
.instrType=RABBITIZER_INSTR_TYPE_I,
.readsRs=true
) // Load Single word to Vfpu
// OP vt, offset_14(base), maybe_wb
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r4000allegrex, 0x3E, sv_q, sv.q,
.operands={RAB_OPERAND_r4000allegrex_q_vt_imm, RAB_OPERAND_r4000allegrex_offset14_base_maybe_wb},
.instrType=RABBITIZER_INSTR_TYPE_I,
.modifiesRs=true
) // Store Single word to Vfpu

View File

@ -0,0 +1,25 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26-----------------------------------------------2-1-0
| = QUADLR | |Z| |
------6------------------------------------------------------1---
|---------------0---------------|---------------1---------------| lo
| SVL.Q | SVR.Q |
|-------------------------------|-------------------------------|
*/
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r4000allegrex, 0, svl_q, svl.q,
.operands={RAB_OPERAND_r4000allegrex_q_vt_imm, RAB_OPERAND_r4000allegrex_offset14_base},
.instrType=RABBITIZER_INSTR_TYPE_I,
.readsRs=true
) // Store Quad word Left from Vfpu
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r4000allegrex, 1, svr_q, svr.q,
.operands={RAB_OPERAND_r4000allegrex_q_vt_imm, RAB_OPERAND_r4000allegrex_offset14_base},
.instrType=RABBITIZER_INSTR_TYPE_I,
.readsRs=true
) // Store Quad word Right from Vfpu

View File

@ -0,0 +1,16 @@
/* SPDX-FileCopyrightText: © 2024 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 | --- | --- | --- | --- | --- | --- | --- | --- |
10 | BLTZAL| BGEZAL|BLTZALL|BGEZALL| --- | --- | --- | --- |
11 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
// The other instructions are implemented using the main CPU table

View File

@ -0,0 +1,102 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26------------------------------------------5--------0
| = SPECIAL | | function|
------6----------------------------------------------------6-----
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
000 | SLL | --- | *1 | SRA | SLLV | --- | *2 | SRAV |
001 | JR | JALR | MOVZ | MOVN |SYSCALL| BREAK | --- | SYNC |
010 | MFHI | MTHI | MFLO | MTLO | --- | --- | CLZ | CLO |
011 | MULT | MULTU | DIV | DIVU | MADD | MADDU | --- | --- |
100 | ADD | ADDU | SUB | SUBU | AND | OR | XOR | NOR |
101 | --- | --- | SLT | SLTU | MAX | MIN | MSUB | MSUBU |
110 | --- | --- | --- | --- | --- | --- | --- | --- |
111 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*1 = SPECIAL rs, see SPECIAL rs list
*2 = SPECIAL sa, see SPECIAL sa list
*/
// The other instructions are implemented using the main CPU table
// OP rd, rs
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x16, clz,
.operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRd=true,
.readsRs=true
) // Count Leading Zero
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x17, clo,
.operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRd=true,
.readsRs=true
) // Count Leading One
// OP rs, rt
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x1C, madd,
.operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
.instrType=RABBITIZER_INSTR_TYPE_R,
.readsRs=true,
.readsRt=true,
.modifiesHI=true,
.modifiesLO=true
) // Multiply ADD
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x1D, maddu,
.operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
.instrType=RABBITIZER_INSTR_TYPE_R,
.readsRs=true,
.readsRt=true,
.modifiesHI=true,
.modifiesLO=true
) // Multiply ADD Unsigned
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x2E, msub,
.operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
.instrType=RABBITIZER_INSTR_TYPE_R,
.readsRs=true,
.readsRt=true,
.modifiesHI=true,
.modifiesLO=true
) // Multiply SUBtract
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x2F, msubu,
.operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
.instrType=RABBITIZER_INSTR_TYPE_R,
.readsRs=true,
.readsRt=true,
.modifiesHI=true,
.modifiesLO=true
) // Multiply SUBtract Unsigned
// OP rd, rs, rt
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x2C, max,
.operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRd=true,
.readsRs=true,
.readsRt=true
) // select MAX
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x2D, min,
.operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRd=true,
.readsRs=true,
.readsRt=true
) // select MIN

View File

@ -0,0 +1,40 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26------------------------------------------5--------0
| =SPECIAL2 | | function|
------6----------------------------------------------------6-----
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
000 | SLEEP | --- | --- | --- | --- | --- | --- | --- |
001 | --- | --- | --- | --- | --- | --- | --- | --- |
010 | --- | --- | --- | --- | --- | --- | --- | --- |
011 | --- | --- | --- | --- | --- | --- | --- | --- |
100 | --- | --- | --- | --- | MFIE | --- | MTIE | --- |
101 | --- | --- | --- | --- | --- | --- | --- | --- |
110 | --- | --- | --- | --- | --- | --- | --- | --- |
111 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
// OP
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x00, sleep,
.operands={0},
.instrType=RABBITIZER_INSTR_TYPE_R
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x24, mfie,
.operands={RAB_OPERAND_cpu_rt},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRt=true
)
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x26, mtie,
.operands={RAB_OPERAND_cpu_rt},
.instrType=RABBITIZER_INSTR_TYPE_R,
.readsRt=true
)

View File

@ -0,0 +1,35 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26------------------------------------------5--------0
| =SPECIAL3 | | function|
------6----------------------------------------------------6-----
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
000 | EXT | --- | --- | --- | INS | --- | --- | --- |
001 | --- | --- | --- | --- | --- | --- | --- | --- |
010 | --- | --- | --- | --- | --- | --- | --- | --- |
011 | --- | --- | --- | --- | --- | --- | --- | --- |
100 | *1 | --- | --- | --- | --- | --- | --- | --- |
101 | --- | --- | --- | --- | --- | --- | --- | --- |
110 | --- | --- | --- | --- | --- | --- | --- | --- |
111 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*1 = SPECIAL3 BSHFL
*/
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x00, ext,
.operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_r4000allegrex_pos, RAB_OPERAND_r4000allegrex_size},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRt=true,
.readsRs=true
) // EXTract bit field
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x04, ins,
.operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_r4000allegrex_pos, RAB_OPERAND_r4000allegrex_size_plus_pos},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRt=true,
.readsRs=true
) // INSert bit field

View File

@ -0,0 +1,56 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26--------------------------------10------6-5--------0
| =SPECIAL3 | | sa | = BSHFL |
------6------------------------------------------5---------6-----
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
00 | --- | --- | WSBH | WSBW | --- | --- | --- | --- |
01 | --- | --- | --- | --- | --- | --- | --- | --- |
10 | SEB | --- | --- | --- | BITREV| --- | --- | --- |
11 | SEH | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
// OP rd, rt
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x02, wsbh,
.operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRd=true,
.readsRt=true
) // Word Swap Bytes within Halfword
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x03, wsbw,
.operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRd=true,
.readsRt=true
) // Word Swap Bytes within Word
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x10, seb,
.operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRd=true,
.readsRt=true
) // Sign-Extend Byte
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x18, seh,
.operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRd=true,
.readsRt=true
) // Sign-Extend Halfword
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x14, bitrev,
.operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRd=true,
.readsRt=true
) // BIT REVerse

View File

@ -0,0 +1,30 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31--------26-25-----21---------------------------------5--------0
| = SPECIAL | rs | | 0x02 |
------6----------5-----------------------------------------6-----
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
00 | srl | rotr | --- | --- | --- | --- | --- | --- |
01 | --- | --- | --- | --- | --- | --- | --- | --- |
10 | --- | --- | --- | --- | --- | --- | --- | --- |
11 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x00, srl,
.operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRd=true,
.readsRt=true
) // Shift word Right Logical
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x01, rotr,
.operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRd=true,
.readsRt=true
) // ROTate word Right

View File

@ -0,0 +1,32 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26--------------------------------10------6-5--------0
| = SPECIAL | | sa | 0x06 |
------6------------------------------------------5---------6-----
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo
00 | srlv | rotrv | --- | --- | --- | --- | --- | --- |
01 | --- | --- | --- | --- | --- | --- | --- | --- |
10 | --- | --- | --- | --- | --- | --- | --- | --- |
11 | --- | --- | --- | --- | --- | --- | --- | --- |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*/
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x00, srlv,
.operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRd=true,
.readsRs=true,
.readsRt=true
) // Shift word Right Logical Variable
RABBITIZER_DEF_INSTR_ID(
r4000allegrex, 0x01, rotrv,
.operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs},
.instrType=RABBITIZER_INSTR_TYPE_R,
.modifiesRd=true,
.readsRs=true,
.readsRt=true
) // ROTate word Right Variable

Some files were not shown because too many files have changed in this diff Show More