From 7400af773ae01b42576097816d0aed7865bfd0ae Mon Sep 17 00:00:00 2001 From: tingming Date: Fri, 22 May 2026 21:22:38 +0800 Subject: [PATCH] [RV64_DYNAREC] Fixed ANDNPS/ANDNPD/PANDN register reuse conflict in vector path --- src/dynarec/rv64/dynarec_rv64_0f_vector.c | 4 ++++ src/dynarec/rv64/dynarec_rv64_660f_vector.c | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/src/dynarec/rv64/dynarec_rv64_0f_vector.c b/src/dynarec/rv64/dynarec_rv64_0f_vector.c index f9a14c0dc6..27a84b0202 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f_vector.c +++ b/src/dynarec/rv64/dynarec_rv64_0f_vector.c @@ -569,6 +569,10 @@ uintptr_t dynarec64_0F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); GETEX_vector(q0, 0, 0, VECTOR_SEW32); GETGX_vector(v0, 1, VECTOR_SEW32); + if (v0 == q0) { + q0 = fpu_get_scratch(dyn); + VMV_V_V(q0, v0); + } VXOR_VI(v0, v0, 0x1f, VECTOR_UNMASKED); VAND_VV(v0, v0, q0, VECTOR_UNMASKED); break; diff --git a/src/dynarec/rv64/dynarec_rv64_660f_vector.c b/src/dynarec/rv64/dynarec_rv64_660f_vector.c index 8124b2c0df..07f1079c58 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f_vector.c +++ b/src/dynarec/rv64/dynarec_rv64_660f_vector.c @@ -1119,6 +1119,10 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i SET_ELEMENT_WIDTH(x1, VECTOR_SEWANY, 1); GETGX_vector(q0, 1, dyn->vector_eew); GETEX_vector(q1, 0, 0, dyn->vector_eew); + if (q0 == q1) { + q1 = fpu_get_scratch(dyn); + VMV_V_V(q1, q0); + } VXOR_VI(q0, q0, 0x1F, VECTOR_UNMASKED); VAND_VV(q0, q1, q0, VECTOR_UNMASKED); break; @@ -2034,6 +2038,10 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i SET_ELEMENT_WIDTH(x1, VECTOR_SEWANY, 1); GETGX_vector(q0, 1, dyn->vector_eew); GETEX_vector(q1, 0, 0, dyn->vector_eew); + if (q0 == q1) { + q1 = fpu_get_scratch(dyn); + VMV_V_V(q1, q0); + } VXOR_VI(q0, q0, 0x1F, VECTOR_UNMASKED); VAND_VV(q0, q1, q0, VECTOR_UNMASKED); break;