diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-03-10 14:41:40 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-03-10 14:41:40 +0100 |
| commit | ea01b564225a693efc3a59a9f647f4fcc0430d67 (patch) | |
| tree | 4113651e7e2504d61cf1c1d7053585e8c37e8de6 /src | |
| parent | 216cf51d4a3aaa9dacc58cdbc569d40ea64ac50e (diff) | |
| download | box64-ea01b564225a693efc3a59a9f647f4fcc0430d67.tar.gz box64-ea01b564225a693efc3a59a9f647f4fcc0430d67.zip | |
[RV64_DYNAREC] Reduce the number of false-positive for dynarec missing opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_pass0.h | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_pass0.h b/src/dynarec/rv64/dynarec_rv64_pass0.h index 3c675e33..8dc5d8a0 100644 --- a/src/dynarec/rv64/dynarec_rv64_pass0.h +++ b/src/dynarec/rv64/dynarec_rv64_pass0.h @@ -70,23 +70,24 @@ dyn->insts[ninst].vector_sew_exit = dyn->vector_sew; \ dyn->insts[ninst].x64.has_next = (ok > 0) ? 1 : 0; #define INST_NAME(name) -#define DEFAULT \ - --dyn->size; \ - *ok = -1; \ - if (ninst) { dyn->insts[ninst - 1].x64.size = ip - dyn->insts[ninst - 1].x64.addr; } \ - if (BOX64ENV(dynarec_log) >= LOG_INFO || BOX64DRENV(dynarec_dump) || BOX64ENV(dynarec_missing)) { \ - dynarec_log(LOG_NONE, "%p: Dynarec stopped because of %s Opcode ", (void*)ip, rex.is32bits ? "x86" : "x64"); \ - zydis_dec_t* dec = rex.is32bits ? my_context->dec32 : my_context->dec; \ - if (dec) { \ - dynarec_log_prefix(0, LOG_NONE, "%s", DecodeX64Trace(dec, dyn->insts[ninst].x64.addr, 1)); \ - } else { \ - dynarec_log_prefix(0, LOG_NONE, "%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \ - PKip(0), PKip(1), PKip(2), PKip(3), PKip(4), PKip(5), PKip(6), PKip(7), PKip(8), PKip(9), \ - PKip(10), PKip(11), PKip(12), PKip(13), PKip(14)); \ - } \ - printFunctionAddr(ip, " => "); \ - dynarec_log_prefix(0, LOG_NONE, "\n"); \ - } +#define DEFAULT \ + --dyn->size; \ + *ok = -1; \ + if (ninst) { dyn->insts[ninst - 1].x64.size = ip - dyn->insts[ninst - 1].x64.addr; } \ + if (BOX64ENV(dynarec_log) >= LOG_INFO || BOX64DRENV(dynarec_dump) || BOX64ENV(dynarec_missing) == 1) \ + if (!dyn->size || BOX64ENV(dynarec_log) > LOG_INFO || BOX64DRENV(dynarec_dump)) { \ + dynarec_log(LOG_NONE, "%p: Dynarec stopped because of %s Opcode ", (void*)ip, rex.is32bits ? "x86" : "x64"); \ + zydis_dec_t* dec = rex.is32bits ? my_context->dec32 : my_context->dec; \ + if (dec) { \ + dynarec_log_prefix(0, LOG_NONE, "%s", DecodeX64Trace(dec, dyn->insts[ninst].x64.addr, 1)); \ + } else { \ + dynarec_log_prefix(0, LOG_NONE, "%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \ + PKip(0), PKip(1), PKip(2), PKip(3), PKip(4), PKip(5), PKip(6), PKip(7), PKip(8), PKip(9), \ + PKip(10), PKip(11), PKip(12), PKip(13), PKip(14)); \ + } \ + printFunctionAddr(ip, " => "); \ + dynarec_log_prefix(0, LOG_NONE, "\n"); \ + } #define SET_ELEMENT_WIDTH(s1, sew, set) \ do { \ |