From b9eb8006cc36bb2f1ae00ba562006a9623541dfc Mon Sep 17 00:00:00 2001 From: Zhijin Zeng Date: Thu, 13 Aug 2026 16:15:07 +0800 Subject: [PATCH] [RV64_DYNAREC] Support some VBROADCAST opcode --- src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c | 61 +++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c b/src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c index 5a72843db0..4e8a482511 100644 --- a/src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c +++ b/src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c @@ -620,6 +620,53 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i } } break; + case 0x18: + INST_NAME("VBROADCASTSS Gx, Ex"); + nextop = F8; + GETGX(); + GETEX(x2, 0, 1); + GETGY(); + LWU(x4, wback, fixedaddress); + for (int i = 0; i < 4; ++i) { + SW(x4, gback, gdoffset + i * 4); + } + if (vex.l) { + for (int i = 0; i < 4; ++i) { + SW(x4, gback, gyoffset + i * 4); + } + } else { + YMM0(gd); + } + break; + case 0x19: + INST_NAME("VBROADCASTSD Gx, Ex"); + nextop = F8; + GETGX(); + GETEX(x2, 0, 1); + GETGY(); + if (!vex.l) UDF(); + LD(x4, wback, fixedaddress); + for (int i = 0; i < 2; ++i) { + SD(x4, gback, gdoffset + i * 8); + } + for (int i = 0; i < 2; ++i) { + SD(x4, gback, gyoffset + i * 8); + } + break; + case 0x1A: + INST_NAME("VBROADCASTF128 Gx, Ex"); + nextop = F8; + GETGX(); + GETEX(x2, 0, 8); + GETGY(); + if (!vex.l || MODREG) UDF(); + LD(x4, wback, fixedaddress); + LD(x5, wback, fixedaddress + 8); + SD(x4, gback, gdoffset); + SD(x5, gback, gdoffset + 8); + SD(x4, gback, gyoffset); + SD(x5, gback, gyoffset + 8); + break; case 0x1C: INST_NAME("VPABSB Gx, Ex"); nextop = F8; @@ -975,6 +1022,20 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i } else YMM0(gd); break; + case 0x5A: + INST_NAME("VBROADCASTI128 Gx, Ex"); + nextop = F8; + GETGX(); + GETEX(x2, 0, 8); + GETGY(); + if (!vex.l || MODREG) UDF(); + LD(x4, wback, fixedaddress); + LD(x5, wback, fixedaddress + 8); + SD(x4, gback, gdoffset); + SD(x5, gback, gdoffset + 8); + SD(x4, gback, gyoffset); + SD(x5, gback, gyoffset + 8); + break; default: DEFAULT; }