From 83d4d62358e396bfd807bdc860742c2e25476a63 Mon Sep 17 00:00:00 2001 From: Zhijin Zeng Date: Wed, 28 Oct 2026 11:09:58 +0800 Subject: [PATCH] [RV64_DYNAREC] Fix POPCNT/TZCNT/LZCNT with 66h and rex.w prefix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For POPCNT/TZCNT/LZCNT, if both the 66H operand-size prefix and REX.W=1 are present, the effective operand width is 64 bits. The `dynarec64_F30F` routine handles translation of 64‑bit POPCNT. --- src/dynarec/rv64/dynarec_rv64_66f30f.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dynarec/rv64/dynarec_rv64_66f30f.c b/src/dynarec/rv64/dynarec_rv64_66f30f.c index b9be7b9b21..4c32645427 100644 --- a/src/dynarec/rv64/dynarec_rv64_66f30f.c +++ b/src/dynarec/rv64/dynarec_rv64_66f30f.c @@ -51,6 +51,7 @@ uintptr_t dynarec64_66F30F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, in switch (opcode) { case 0xB8: + if (rex.w) return dynarec64_F30F(dyn, addr - 1, ip, ninst, rex, ok, need_epilog); INST_NAME("POPCNT Gw, Ew"); SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); SET_DFNONE(); @@ -91,6 +92,7 @@ uintptr_t dynarec64_66F30F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, in GWBACK; break; case 0xBC: + if (rex.w) return dynarec64_F30F(dyn, addr - 1, ip, ninst, rex, ok, need_epilog); INST_NAME("TZCNT Gw, Ew"); if (!BOX64DRENV(dynarec_safeflags)) { SETFLAGS(X_CF | X_ZF, SF_SUBSET, NAT_FLAGS_NOFUSION); @@ -123,6 +125,7 @@ uintptr_t dynarec64_66F30F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, in GWBACK; break; case 0xBD: + if (rex.w) return dynarec64_F30F(dyn, addr - 1, ip, ninst, rex, ok, need_epilog); INST_NAME("LZCNT Gw, Ew"); if (!BOX64DRENV(dynarec_safeflags)) { SETFLAGS(X_CF | X_ZF, SF_SUBSET, NAT_FLAGS_NOFUSION);