diff options
author | Maciej Żenczykowski <maze@google.com> | 2024-04-26 18:10:36 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-04-26 18:10:36 +0000 |
commit | a13437415fa9f39a0a5389ce4b4de35563bb4fce (patch) | |
tree | f9d43b51808c2594f71e32545c42fddec933af7d | |
parent | 80b60d05a1e96dd1b60bfb634293c742042db107 (diff) | |
parent | 6df7e7b215c7573cd2b1160bf6711717e1f8d489 (diff) | |
download | apf-a13437415fa9f39a0a5389ce4b4de35563bb4fce.tar.gz |
Merge "Extend disassembler's JBSMATCH support for multi-byte sequences" into main
-rw-r--r-- | disassembler.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/disassembler.c b/disassembler.c index 2de62e2..0929333 100644 --- a/disassembler.c +++ b/disassembler.c @@ -196,13 +196,26 @@ const char* apf_disassemble(const uint8_t* program, uint32_t program_len, uint32 print_opcode("jbseq"); } bprintf("r0, "); - uint32_t cmp_imm = DECODE_IMM(1 << (len_field - 1)); - bprintf("0x%x, ", cmp_imm); - print_jump_target(*ptr2pc + imm + cmp_imm, program_len); + const uint32_t cmp_imm = DECODE_IMM(1 << (len_field - 1)); + const uint32_t cnt = (cmp_imm >> 11) + 1; // 1+, up to 32 fits in u16 + const uint32_t len = cmp_imm & 2047; // 0..2047 + bprintf("0x%x, ", len); + print_jump_target(*ptr2pc + imm + cnt * len, program_len); bprintf(", "); - while (cmp_imm--) { - uint8_t byte = program[(*ptr2pc)++]; - bprintf("%02x", byte); + if (cnt > 1) { + bprintf("{ "); + } + for (uint32_t i = 0; i < cnt; ++i) { + for (uint32_t j = 0; j < len; ++j) { + uint8_t byte = program[(*ptr2pc)++]; + bprintf("%02x", byte); + } + if (i != cnt - 1) { + bprintf(", "); + } + } + if (cnt > 1) { + bprintf(" }"); } break; } |