diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-08-26 16:19:51 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-26 10:19:51 +0200 |
| commit | 709a526217e6e495f8a5b8bb8566036f4f7ddf41 (patch) | |
| tree | fa57997108dd605567dd568a5d88991a12dc2448 | |
| parent | 1cddcad20a1c5c167c9be1576841605bc063737f (diff) | |
| download | box64-709a526217e6e495f8a5b8bb8566036f4f7ddf41.tar.gz box64-709a526217e6e495f8a5b8bb8566036f4f7ddf41.zip | |
[RV64_DYNAREC] Added more scalar avx opcodes (#2973)
* [RV64_DYNAREC] Added more scalar avx opcodes * fix
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_avx_66_0f.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c b/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c index 88005608..bea96f73 100644 --- a/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c @@ -1105,6 +1105,103 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, } else YMM0(gd); break; + case 0x74: + INST_NAME("VPCMPEQB Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 31 : 15); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + for (int i = 0; i < 16; ++i) { + LBU(x3, vback, vxoffset + i); + LBU(x4, wback, fixedaddress + i); + if (cpuext.xtheadbb) { + XOR(x3, x3, x4); + TH_TSTNBZ(x3, x3); + } else { + SUB(x3, x3, x4); + SEQZ(x3, x3); + NEG(x3, x3); + } + SB(x3, gback, gdoffset + i); + } + if (vex.l) { + GETEY(); + for (int i = 0; i < 16; ++i) { + LBU(x3, vback, vyoffset + i); + LBU(x4, wback, fixedaddress + i); + if (cpuext.xtheadbb) { + XOR(x3, x3, x4); + TH_TSTNBZ(x3, x3); + } else { + SUB(x3, x3, x4); + SEQZ(x3, x3); + NEG(x3, x3); + } + SB(x3, gback, gyoffset + i); + } + } else + YMM0(gd); + break; + case 0x75: + INST_NAME("VPCMPEQW Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 30 : 14); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + for (int i = 0; i < 8; ++i) { + LHU(x3, vback, vxoffset + i * 2); + LHU(x4, wback, fixedaddress + i * 2); + SUB(x3, x3, x4); + SEQZ(x3, x3); + NEG(x3, x3); + SH(x3, gback, gdoffset + i * 2); + } + if (vex.l) { + GETEY(); + for (int i = 0; i < 8; ++i) { + LHU(x3, vback, vyoffset + i * 2); + LHU(x4, wback, fixedaddress + i * 2); + SUB(x3, x3, x4); + SEQZ(x3, x3); + NEG(x3, x3); + SH(x3, gback, gyoffset + i * 2); + } + } else + YMM0(gd); + break; + case 0x76: + INST_NAME("VPCMPEQD Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 28 : 12); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + for (int i = 0; i < 4; ++i) { + LWU(x3, vback, vxoffset + i * 4); + LWU(x4, wback, fixedaddress + i * 4); + SUB(x3, x3, x4); + SEQZ(x3, x3); + NEG(x3, x3); + SW(x3, gback, gdoffset + i * 4); + } + if (vex.l) { + GETEY(); + for (int i = 0; i < 4; ++i) { + LWU(x3, vback, vyoffset + i * 4); + LWU(x4, wback, fixedaddress + i * 4); + SUB(x3, x3, x4); + SEQZ(x3, x3); + NEG(x3, x3); + SW(x3, gback, gyoffset + i * 4); + } + } else + YMM0(gd); + break; case 0x7E: INST_NAME("VMOVD Ed, Gx"); nextop = F8; |