apf_disassembler: nicer syntax for [x+0] and [x+-1]
turns out:
lddw r0, [r1+0]
add r0, 1
stdw r0, [r1+0]
is a very common sequence.
After this change it becomes:
lddw r0, [r1]
add r0, 1
stdw r0, [r1]
This also more accurately reflects that 0 takes 0 bytes to store.
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I39f5079ad332be5d3d3a5ebac2bebf8f73e4d758
diff --git a/disassembler.c b/disassembler.c
index 96ac4b1..9c03dc6 100644
--- a/disassembler.c
+++ b/disassembler.c
@@ -104,7 +104,11 @@
case LDHX_OPCODE:
case LDWX_OPCODE:
PRINT_OPCODE();
- printf("r%d, [r1+%u]", reg_num, imm);
+ if (imm) {
+ printf("r%d, [r1+%u]", reg_num, imm);
+ } else {
+ printf("r%d, [r1]", reg_num);
+ }
break;
case JMP_OPCODE:
PRINT_OPCODE();
@@ -204,7 +208,13 @@
case LDDW_OPCODE:
case STDW_OPCODE:
PRINT_OPCODE();
- printf("r%u, [r%u+%d]", reg_num, reg_num ^ 1, signed_imm);
+ if (signed_imm > 0) {
+ printf("r%u, [r%u+%d]", reg_num, reg_num ^ 1, signed_imm);
+ } else if (signed_imm < 0) {
+ printf("r%u, [r%u-%d]", reg_num, reg_num ^ 1, -signed_imm);
+ } else {
+ printf("r%u, [r%u]", reg_num, reg_num ^ 1);
+ }
break;
// Unknown opcode