summaryrefslogtreecommitdiff
path: root/arch/powerpc/assembler.cpp
diff options
context:
space:
mode:
authorGalen Williamson <galen@vector35.com>2025-04-14 18:45:55 -0400
committerGalen Williamson <galen@vector35.com>2025-04-14 18:47:23 -0400
commit9b7b429106f16b5704cf27baf9f3d69ff4a0857a (patch)
tree438d3a60bef08a1e8c7faa25e4abd249d58286db /arch/powerpc/assembler.cpp
parent941b8b63c02184b4708d85391c5348b8d8913628 (diff)
[powerpc] Fix incorrect disassembly of LIS, ADDIS, ANDI, ANDIS; add assembly of subis
Diffstat (limited to 'arch/powerpc/assembler.cpp')
-rw-r--r--arch/powerpc/assembler.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/powerpc/assembler.cpp b/arch/powerpc/assembler.cpp
index 6ba26b97..bafc0686 100644
--- a/arch/powerpc/assembler.cpp
+++ b/arch/powerpc/assembler.cpp
@@ -225,6 +225,7 @@ map<string, info> lookup = {
{ "addi GPR , GPR , NUM",{0x38010000,0x03FFFFFF}}, // 001110xxxxxxxxxxxxxxxxxxxxxxxxxx addi r0, r1, 0
{ "lis GPR , NUM",{0x3C000000,0x03E0FFFF}}, // 001111xxxxx00000xxxxxxxxxxxxxxxx lis r0, 0
{ "addis GPR , GPR , NUM",{0x3C010000,0x03FFFFFF}}, // 001111xxxxxxxxxxxxxxxxxxxxxxxxxx addis r0, r1, 0
+{ "subis GPR , GPR , NUM",{0x3C010000,0x03FFFFFF}}, // 001111xxxxxxxxxxxxxxxxxxxxxxxxxx subis r0, r1, 0
{ "bdnzf FLAG",{0x40000000,0x00230000}}, // 0100000000x000xx0000000000000000 bdnzf lt
{ "bdnzfl FLAG",{0x40000001,0x00230000}}, // 0100000000x000xx0000000000000001 bdnzfl lt
{ "bdnzfa FLAG",{0x40000002,0x00230000}}, // 0100000000x000xx0000000000000010 bdnzfa lt
@@ -2799,6 +2800,11 @@ int assemble_single(string src, uint32_t addr, uint8_t *result, string& err,
toks_src.back().ival -= addr;
addr = 0;
}
+ else if(!strncmp("subis", toks_src[0].sval.c_str(), 6) &&
+ toks_src.back().type == TT_NUM) {
+ toks_src.back().ival = -toks_src.back().ival;
+ toks_src[0].sval = "addis";
+ }
/* start with the parent */
uint32_t parent = info.seed;