From cecc302373f3f0211f5d120fffa513f7189d60f2 Mon Sep 17 00:00:00 2001 From: angie Date: Thu, 6 Feb 2025 16:26:37 -0300 Subject: [PATCH] R5900: Fix decoding the `imm5` operand of the `viaddi` instruction as a signed value instead of decoding it as an unsigned one. --- CHANGELOG.md | 5 +++++ cplusplus/include/instructions/InstructionR5900.hpp | 2 +- cplusplus/src/instructions/InstructionR5900.cpp | 4 ++-- .../RabbitizerInstructionR5900_OperandType.c | 2 +- tests/c/instruction_checks/r5900_disasm.c | 2 ++ 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fdeea2d..7ff6a48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- R5900: Fix decoding the `imm5` operand of the `viaddi` instruction as a signed + value instead of decoding it as an unsigned one. + ## [1.12.5] - 2024-12-16 ### Fixed diff --git a/cplusplus/include/instructions/InstructionR5900.hpp b/cplusplus/include/instructions/InstructionR5900.hpp index d481901..9030083 100644 --- a/cplusplus/include/instructions/InstructionR5900.hpp +++ b/cplusplus/include/instructions/InstructionR5900.hpp @@ -33,7 +33,7 @@ namespace rabbitizer { uint8_t GetR5900_l() const; uint8_t GetR5900_m() const; - uint8_t GetR5900_imm5() const; + int8_t GetR5900_imm5() const; }; }; diff --git a/cplusplus/src/instructions/InstructionR5900.cpp b/cplusplus/src/instructions/InstructionR5900.cpp index 0ef07c1..5a72994 100644 --- a/cplusplus/src/instructions/InstructionR5900.cpp +++ b/cplusplus/src/instructions/InstructionR5900.cpp @@ -113,6 +113,6 @@ uint8_t InstructionR5900::GetR5900_m() const { return RAB_INSTR_R5900_GET_m(&this->instr); } -uint8_t InstructionR5900::GetR5900_imm5() const { - return RAB_INSTR_R5900_GET_imm5(&this->instr); +int8_t InstructionR5900::GetR5900_imm5() const { + return RabbitizerUtils_From2Complement(RAB_INSTR_R5900_GET_imm5(&this->instr), 5); } diff --git a/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_OperandType.c b/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_OperandType.c index 36398a3..e9bf5f7 100644 --- a/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_OperandType.c +++ b/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_OperandType.c @@ -515,7 +515,7 @@ size_t RabbitizerOperandType_process_r5900_immediate5(const RabbitizerInstructio return immOverrideLength; } - number = RAB_INSTR_R5900_GET_imm5(self); + number = RabbitizerUtils_From2Complement(RAB_INSTR_R5900_GET_imm5(self), 5); if (RabbitizerConfig_Cfg.misc.omit0XOnSmallImm) { if (number > -10 && number < 10) { RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", number); diff --git a/tests/c/instruction_checks/r5900_disasm.c b/tests/c/instruction_checks/r5900_disasm.c index fa8c033..336ec13 100644 --- a/tests/c/instruction_checks/r5900_disasm.c +++ b/tests/c/instruction_checks/r5900_disasm.c @@ -40,6 +40,8 @@ const TestEntry test_entries[] = { TEST_ENTRY_C(0x4A820BFF, NULL, "viswr.y $vi2, ($vi1)"), TEST_ENTRY_C(0x4A420BFF, NULL, "viswr.z $vi2, ($vi1)"), TEST_ENTRY_C(0x4A220BFF, NULL, "viswr.w $vi2, ($vi1)"), + + TEST_ENTRY_C(0x4A0307B2, NULL, "viaddi $vi3, $vi0, -0x2"), }; size_t test_entries_len = ARRAY_COUNT(test_entries);