Fix pmfhl and pmthl missing the .fmt specifier

This commit is contained in:
Angie 2024-07-15 16:05:53 -04:00
parent 2c5e2cfc26
commit ef2598d2c7
20 changed files with 187 additions and 27 deletions

View File

@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Implement the `rfe` ("Restore From Exception") instruction.
### Fixed
- Fix `pmfhl` and `pmthl` missing the `.fmt` specifier.
## [1.11.1] - 2024-07-12
### Added

View File

@ -103,6 +103,8 @@ enum class IdType {
R5900_MMI_1,
R5900_MMI_2,
R5900_MMI_3,
R5900_MMI_PMFHL,
R5900_MMI_PMTHL,
ALL_MAX,
};

View File

@ -799,8 +799,6 @@ enum class UniqueId {
r5900_divu1,
r5900_madd1,
r5900_maddu1,
r5900_pmfhl,
r5900_pmthl,
r5900_psllh,
r5900_psrlh,
r5900_psrah,
@ -885,6 +883,12 @@ enum class UniqueId {
r5900_pexch,
r5900_pcpyh,
r5900_pexcw,
r5900_pmfhl_lw,
r5900_pmfhl_uw,
r5900_pmfhl_slw,
r5900_pmfhl_lh,
r5900_pmfhl_sh,
r5900_pmthl_lw,
r5900_ei,
r5900_di,
r5900_c1__sqrt_s,

View File

@ -799,8 +799,6 @@ const RabbitizerInstrDescriptor RabbitizerInstrDescriptor_Descriptors[] = {
[RABBITIZER_INSTR_ID_r5900_divu1] = { .operands={RAB_OPERAND_cpu_zero, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .readsRs=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r5900_madd1] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true, .readsRs=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r5900_maddu1] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true, .readsRs=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r5900_pmfhl] = { .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true },
[RABBITIZER_INSTR_ID_r5900_pmthl] = { .operands={RAB_OPERAND_cpu_rs}, .readsRs=true },
[RABBITIZER_INSTR_ID_r5900_psllh] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r5900_psrlh] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r5900_psrah] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true, .readsRt=true },
@ -885,6 +883,12 @@ const RabbitizerInstrDescriptor RabbitizerInstrDescriptor_Descriptors[] = {
[RABBITIZER_INSTR_ID_r5900_pexch] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r5900_pcpyh] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r5900_pexcw] = { .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true, .readsRt=true },
[RABBITIZER_INSTR_ID_r5900_pmfhl_lw] = { .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true },
[RABBITIZER_INSTR_ID_r5900_pmfhl_uw] = { .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true },
[RABBITIZER_INSTR_ID_r5900_pmfhl_slw] = { .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true },
[RABBITIZER_INSTR_ID_r5900_pmfhl_lh] = { .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true },
[RABBITIZER_INSTR_ID_r5900_pmfhl_sh] = { .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true },
[RABBITIZER_INSTR_ID_r5900_pmthl_lw] = { .operands={RAB_OPERAND_cpu_rs}, .readsRs=true },
[RABBITIZER_INSTR_ID_r5900_ei] = { .operands={0} },
[RABBITIZER_INSTR_ID_r5900_di] = { .operands={0} },
[RABBITIZER_INSTR_ID_r5900_c1__sqrt_s] = { .operands={RAB_OPERAND_cpu_copraw} },

View File

@ -103,6 +103,8 @@ const char *RabInstrIdType_Names[] = {
[RAB_INSTR_ID_TYPE_R5900_MMI_1] = "R5900" "_" "MMI_1",
[RAB_INSTR_ID_TYPE_R5900_MMI_2] = "R5900" "_" "MMI_2",
[RAB_INSTR_ID_TYPE_R5900_MMI_3] = "R5900" "_" "MMI_3",
[RAB_INSTR_ID_TYPE_R5900_MMI_PMFHL] = "R5900" "_" "MMI_PMFHL",
[RAB_INSTR_ID_TYPE_R5900_MMI_PMTHL] = "R5900" "_" "MMI_PMTHL",
[RAB_INSTR_ID_TYPE_ALL_MAX] = "ALL" "_" "MAX",
};

View File

@ -103,6 +103,8 @@ typedef enum RabInstrIdType {
RAB_INSTR_ID_TYPE_R5900_MMI_1,
RAB_INSTR_ID_TYPE_R5900_MMI_2,
RAB_INSTR_ID_TYPE_R5900_MMI_3,
RAB_INSTR_ID_TYPE_R5900_MMI_PMFHL,
RAB_INSTR_ID_TYPE_R5900_MMI_PMTHL,
RAB_INSTR_ID_TYPE_ALL_MAX,
} RabInstrIdType;

View File

@ -799,8 +799,6 @@ const char *RabbitizerInstrId_Names[] = {
[RABBITIZER_INSTR_ID_r5900_divu1] = "divu1",
[RABBITIZER_INSTR_ID_r5900_madd1] = "madd1",
[RABBITIZER_INSTR_ID_r5900_maddu1] = "maddu1",
[RABBITIZER_INSTR_ID_r5900_pmfhl] = "pmfhl",
[RABBITIZER_INSTR_ID_r5900_pmthl] = "pmthl",
[RABBITIZER_INSTR_ID_r5900_psllh] = "psllh",
[RABBITIZER_INSTR_ID_r5900_psrlh] = "psrlh",
[RABBITIZER_INSTR_ID_r5900_psrah] = "psrah",
@ -885,6 +883,12 @@ const char *RabbitizerInstrId_Names[] = {
[RABBITIZER_INSTR_ID_r5900_pexch] = "pexch",
[RABBITIZER_INSTR_ID_r5900_pcpyh] = "pcpyh",
[RABBITIZER_INSTR_ID_r5900_pexcw] = "pexcw",
[RABBITIZER_INSTR_ID_r5900_pmfhl_lw] = "pmfhl.lw",
[RABBITIZER_INSTR_ID_r5900_pmfhl_uw] = "pmfhl.uw",
[RABBITIZER_INSTR_ID_r5900_pmfhl_slw] = "pmfhl.slw",
[RABBITIZER_INSTR_ID_r5900_pmfhl_lh] = "pmfhl.lh",
[RABBITIZER_INSTR_ID_r5900_pmfhl_sh] = "pmfhl.sh",
[RABBITIZER_INSTR_ID_r5900_pmthl_lw] = "pmthl.lw",
[RABBITIZER_INSTR_ID_r5900_ei] = "ei",
[RABBITIZER_INSTR_ID_r5900_di] = "di",
[RABBITIZER_INSTR_ID_r5900_c1__sqrt_s] = "c1",

View File

@ -799,8 +799,6 @@ typedef enum RabbitizerInstrId {
RABBITIZER_INSTR_ID_r5900_divu1,
RABBITIZER_INSTR_ID_r5900_madd1,
RABBITIZER_INSTR_ID_r5900_maddu1,
RABBITIZER_INSTR_ID_r5900_pmfhl,
RABBITIZER_INSTR_ID_r5900_pmthl,
RABBITIZER_INSTR_ID_r5900_psllh,
RABBITIZER_INSTR_ID_r5900_psrlh,
RABBITIZER_INSTR_ID_r5900_psrah,
@ -885,6 +883,12 @@ typedef enum RabbitizerInstrId {
RABBITIZER_INSTR_ID_r5900_pexch,
RABBITIZER_INSTR_ID_r5900_pcpyh,
RABBITIZER_INSTR_ID_r5900_pexcw,
RABBITIZER_INSTR_ID_r5900_pmfhl_lw,
RABBITIZER_INSTR_ID_r5900_pmfhl_uw,
RABBITIZER_INSTR_ID_r5900_pmfhl_slw,
RABBITIZER_INSTR_ID_r5900_pmfhl_lh,
RABBITIZER_INSTR_ID_r5900_pmfhl_sh,
RABBITIZER_INSTR_ID_r5900_pmthl_lw,
RABBITIZER_INSTR_ID_r5900_ei,
RABBITIZER_INSTR_ID_r5900_di,
RABBITIZER_INSTR_ID_r5900_c1__sqrt_s,

View File

@ -720,8 +720,6 @@ class InstrId:
r5900_divu1: Enum
r5900_madd1: Enum
r5900_maddu1: Enum
r5900_pmfhl: Enum
r5900_pmthl: Enum
r5900_psllh: Enum
r5900_psrlh: Enum
r5900_psrah: Enum
@ -806,6 +804,12 @@ class InstrId:
r5900_pexch: Enum
r5900_pcpyh: Enum
r5900_pexcw: Enum
r5900_pmfhl_lw: Enum
r5900_pmfhl_uw: Enum
r5900_pmfhl_slw: Enum
r5900_pmfhl_lh: Enum
r5900_pmfhl_sh: Enum
r5900_pmthl_lw: Enum
r5900_ei: Enum
r5900_di: Enum
r5900_c1__sqrt_s: Enum

View File

@ -104,4 +104,6 @@ class InstrIdType:
R5900_MMI_1: Enum
R5900_MMI_2: Enum
R5900_MMI_3: Enum
R5900_MMI_PMFHL: Enum
R5900_MMI_PMTHL: Enum
ALL_MAX: Enum

View File

@ -799,8 +799,6 @@ pub enum InstrId {
r5900_divu1,
r5900_madd1,
r5900_maddu1,
r5900_pmfhl,
r5900_pmthl,
r5900_psllh,
r5900_psrlh,
r5900_psrah,
@ -885,6 +883,12 @@ pub enum InstrId {
r5900_pexch,
r5900_pcpyh,
r5900_pexcw,
r5900_pmfhl_lw,
r5900_pmfhl_uw,
r5900_pmfhl_slw,
r5900_pmfhl_lh,
r5900_pmfhl_sh,
r5900_pmthl_lw,
r5900_ei,
r5900_di,
r5900_c1__sqrt_s,

View File

@ -103,5 +103,7 @@ pub enum InstrIdType {
R5900_MMI_1,
R5900_MMI_2,
R5900_MMI_3,
R5900_MMI_PMFHL,
R5900_MMI_PMTHL,
ALL_MAX,
}

View File

@ -286,6 +286,28 @@ void RabbitizerInstructionR5900_processUniqueId_MMI_3(RabbitizerInstruction *sel
}
}
void RabbitizerInstructionR5900_processUniqueId_MMI_PMFHL(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_R5900_GET_mmi_function(self);
self->_mandatorybits = RAB_INSTR_R5900_PACK_mmi_function(self->_mandatorybits, function);
self->instrIdType = RAB_INSTR_ID_TYPE_R5900_MMI_PMFHL;
switch (function) {
#include "tables/instr_id/r5900/r5900_mmi_pmfhl.inc"
}
}
void RabbitizerInstructionR5900_processUniqueId_MMI_PMTHL(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_R5900_GET_mmi_function(self);
self->_mandatorybits = RAB_INSTR_R5900_PACK_mmi_function(self->_mandatorybits, function);
self->instrIdType = RAB_INSTR_ID_TYPE_R5900_MMI_PMTHL;
switch (function) {
#include "tables/instr_id/r5900/r5900_mmi_pmthl.inc"
}
}
void RabbitizerInstructionR5900_processUniqueId_MMI(RabbitizerInstruction *self) {
uint32_t function = RAB_INSTR_GET_function(self);
@ -307,6 +329,13 @@ void RabbitizerInstructionR5900_processUniqueId_MMI(RabbitizerInstruction *self)
case 0x29:
RabbitizerInstructionR5900_processUniqueId_MMI_3(self);
break;
case 0x30:
RabbitizerInstructionR5900_processUniqueId_MMI_PMFHL(self);
break;
case 0x31:
RabbitizerInstructionR5900_processUniqueId_MMI_PMTHL(self);
break;
}
self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId];

View File

@ -16,6 +16,8 @@
#include "r5900/r5900_mmi_1.inc"
#include "r5900/r5900_mmi_2.inc"
#include "r5900/r5900_mmi_3.inc"
#include "r5900/r5900_mmi_pmfhl.inc"
#include "r5900/r5900_mmi_pmthl.inc"
#include "r5900/r5900_cop0_tlb.inc"

View File

@ -12,11 +12,15 @@
011 | MULT1 | MULTU1| DIV1 | DIVU1 | --- | --- | --- | --- |
100 | MADD1 | MADDU1| --- | --- | --- | --- | --- | --- |
101 | *3 | *4 | --- | --- | --- | --- | --- | --- |
110 | PMFHL | PMTHL | --- | --- | PSLLH | --- | PSRLH | PSRAH |
110 | *5 | *6 | --- | --- | PSLLH | --- | PSRLH | PSRAH |
111 | --- | --- | --- | --- | PSLLW | --- | PSRLW | PSRAW |
hi |-------|-------|-------|-------|-------|-------|-------|-------|
*1 = MMI0 list *2 = MMI2 list
*3 = MMI1 list *4 = MMI3 list
*1 = MMI0 list
*2 = MMI2 list
*3 = MMI1 list
*4 = MMI3 list
*5 = PMFHL list
*6 = PMTHL list
*/
RABBITIZER_DEF_INSTR_ID(
@ -103,18 +107,6 @@
.readsRt=true
) // Multiply-ADD Unsigned word pipeline 1
// TODO: check this two instruction, it is supposed to have an extra .fmt
RABBITIZER_DEF_INSTR_ID(
r5900, 0x30, pmfhl,
.operands={RAB_OPERAND_cpu_rd},
.modifiesRd=true
) // Parallel Move From Hi/Lo register
RABBITIZER_DEF_INSTR_ID(
r5900, 0x31, pmthl,
.operands={RAB_OPERAND_cpu_rs},
.readsRs=true
) // Parallel Move To Hi/Lo register
RABBITIZER_DEF_INSTR_ID(
r5900, 0x34, psllh,
.operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa},

View File

@ -0,0 +1,48 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26------------------------------10------6-5----------0
|0 1 1 1 0 0| | fmt |1 1 0 0 0 0|
------6----------------------------------------5----------6------
|-------00------|-------01------|-------10------|-------11------|
000 | PMFHL.LW | PMFHL.UW | PMFHL.SLW | PMFHL.LH |
001 | PMFHL.SH | --- | --- | --- |
010 | --- | --- | --- | --- |
011 | --- | --- | --- | --- |
100 | --- | --- | --- | --- |
101 | --- | --- | --- | --- |
110 | --- | --- | --- | --- |
111 | --- | --- | --- | --- |
hi |---------------|---------------|---------------|---------------|
*/
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r5900, 0x00, pmfhl_lw, pmfhl.lw,
.operands={RAB_OPERAND_cpu_rd},
.modifiesRd=true
) // Parallel Move From Hi/Lo register
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r5900, 0x01, pmfhl_uw, pmfhl.uw,
.operands={RAB_OPERAND_cpu_rd},
.modifiesRd=true
) // Parallel Move From Hi/Lo register
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r5900, 0x02, pmfhl_slw, pmfhl.slw,
.operands={RAB_OPERAND_cpu_rd},
.modifiesRd=true
) // Parallel Move From Hi/Lo register
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r5900, 0x03, pmfhl_lh, pmfhl.lh,
.operands={RAB_OPERAND_cpu_rd},
.modifiesRd=true
) // Parallel Move From Hi/Lo register
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r5900, 0x04, pmfhl_sh, pmfhl.sh,
.operands={RAB_OPERAND_cpu_rd},
.modifiesRd=true
) // Parallel Move From Hi/Lo register

View File

@ -0,0 +1,24 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
/*
31---------26------------------------------10------6-5----------0
|0 1 1 1 0 0| | fmt |1 1 0 0 0 1|
------6----------------------------------------5----------6------
|-------00------|-------01------|-------10------|-------11------|
000 | PMTHL.LW | --- | --- | --- |
001 | --- | --- | --- | --- |
010 | --- | --- | --- | --- |
011 | --- | --- | --- | --- |
100 | --- | --- | --- | --- |
101 | --- | --- | --- | --- |
110 | --- | --- | --- | --- |
111 | --- | --- | --- | --- |
hi |---------------|---------------|---------------|---------------|
*/
RABBITIZER_DEF_INSTR_ID_ALTNAME(
r5900, 0x00, pmthl_lw, pmthl.lw,
.operands={RAB_OPERAND_cpu_rs},
.readsRs=true
) // Parallel Move To Hi/Lo register

View File

@ -25,3 +25,5 @@
RABBITIZER_DEF_INSTR_ID_TYPE(R5900, MMI_1)
RABBITIZER_DEF_INSTR_ID_TYPE(R5900, MMI_2)
RABBITIZER_DEF_INSTR_ID_TYPE(R5900, MMI_3)
RABBITIZER_DEF_INSTR_ID_TYPE(R5900, MMI_PMFHL)
RABBITIZER_DEF_INSTR_ID_TYPE(R5900, MMI_PMTHL)

View File

@ -0,0 +1,24 @@
/* SPDX-FileCopyrightText: © 2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */
#include "rabbitizer.h"
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include "expected_disasm_utils.h"
#define TEST_ENTRY_C(word, imm, expected) TEST_ENTRY(RABBITIZER_INSTRCAT_R5900, word, imm, expected,)
// TODO: fill
const TestEntry test_entries[] = {
TEST_ENTRY_C(0x70001030, NULL, "pmfhl.lw $v0"),
TEST_ENTRY_C(0x70001070, NULL, "pmfhl.uw $v0"),
TEST_ENTRY_C(0x700010B0, NULL, "pmfhl.slw $v0"),
TEST_ENTRY_C(0x700010F0, NULL, "pmfhl.lh $v0"),
TEST_ENTRY_C(0x70001130, NULL, "pmfhl.sh $v0"),
TEST_ENTRY_C(0x70000031, NULL, "pmthl.lw $zero"),
};
size_t test_entries_len = ARRAY_COUNT(test_entries);

View File

@ -12,3 +12,4 @@ set -e
./build/tests/c/instruction_checks/r4000allegrex_vfpu_disasm.elf
./build/tests/c/instruction_checks/r5900_trunc_cvt.elf
./build/tests/c/instruction_checks/r5900_vcallms.elf
./build/tests/c/instruction_checks/r5900_disasm.elf