diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-09-04 15:35:12 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-04 09:35:12 +0200 |
| commit | 4edba2e67a01e7baad3669111044143f3721b61f (patch) | |
| tree | 679f33b1d83b603c8ebd8ad69e10ed06941a3b35 /src | |
| parent | 6b41f28e2b3410b9c5b5883dffb4576193a82925 (diff) | |
| download | box64-4edba2e67a01e7baad3669111044143f3721b61f.tar.gz box64-4edba2e67a01e7baad3669111044143f3721b61f.zip | |
[RV64_DYNAREC] Added more scalar avx opcodes (#3005)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_avx_0f.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_avx_0f.c b/src/dynarec/rv64/dynarec_rv64_avx_0f.c index 104ffe22..987bf036 100644 --- a/src/dynarec/rv64/dynarec_rv64_avx_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_avx_0f.c @@ -367,6 +367,135 @@ uintptr_t dynarec64_AVX_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, in } else YMM0(gd); break; + case 0x54: + INST_NAME("VANDPS Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 24 : 8); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + LD(x3, vback, vxoffset + 0); + LD(x4, wback, fixedaddress + 0); + AND(x5, x3, x4); + SD(x5, gback, gdoffset + 0); + LD(x3, vback, vxoffset + 8); + LD(x4, wback, fixedaddress + 8); + AND(x5, x3, x4); + SD(x5, gback, gdoffset + 8); + if (vex.l) { + GETEY(); + LD(x3, vback, vyoffset + 0); + LD(x4, wback, fixedaddress + 0); + AND(x5, x3, x4); + SD(x5, gback, gyoffset + 0); + LD(x3, vback, vyoffset + 8); + LD(x4, wback, fixedaddress + 8); + AND(x5, x3, x4); + SD(x5, gback, gyoffset + 8); + } else + YMM0(gd); + break; + case 0x55: + INST_NAME("VANDNPS Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 24 : 8); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + LD(x3, vback, vxoffset + 0); + LD(x4, wback, fixedaddress + 0); + NOT(x3, x3); + AND(x5, x3, x4); + SD(x5, gback, gdoffset + 0); + LD(x3, vback, vxoffset + 8); + LD(x4, wback, fixedaddress + 8); + NOT(x3, x3); + AND(x5, x3, x4); + SD(x5, gback, gdoffset + 8); + if (vex.l) { + GETEY(); + LD(x3, vback, vyoffset + 0); + LD(x4, wback, fixedaddress + 0); + NOT(x3, x3); + AND(x5, x3, x4); + SD(x5, gback, gyoffset + 0); + LD(x3, vback, vyoffset + 8); + LD(x4, wback, fixedaddress + 8); + NOT(x3, x3); + AND(x5, x3, x4); + SD(x5, gback, gyoffset + 8); + } else + YMM0(gd); + break; + case 0x56: + INST_NAME("VORPS Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 24 : 8); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + LD(x3, vback, vxoffset + 0); + LD(x4, wback, fixedaddress + 0); + OR(x5, x3, x4); + SD(x5, gback, gdoffset + 0); + LD(x3, vback, vxoffset + 8); + LD(x4, wback, fixedaddress + 8); + OR(x5, x3, x4); + SD(x5, gback, gdoffset + 8); + if (vex.l) { + GETEY(); + LD(x3, vback, vyoffset + 0); + LD(x4, wback, fixedaddress + 0); + OR(x5, x3, x4); + SD(x5, gback, gyoffset + 0); + LD(x3, vback, vyoffset + 8); + LD(x4, wback, fixedaddress + 8); + OR(x5, x3, x4); + SD(x5, gback, gyoffset + 8); + } else + YMM0(gd); + break; + case 0x57: + INST_NAME("VXORPS Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 24 : 8); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + if (vex.v == ed) { + SD(xZR, gback, gdoffset + 0); + SD(xZR, gback, gdoffset + 8); + } else { + LD(x3, vback, vxoffset + 0); + LD(x4, wback, fixedaddress + 0); + XOR(x5, x3, x4); + SD(x5, gback, gdoffset + 0); + LD(x3, vback, vxoffset + 8); + LD(x4, wback, fixedaddress + 8); + XOR(x5, x3, x4); + SD(x5, gback, gdoffset + 8); + } + if (vex.l) { + GETEY(); + if (vex.v == ed) { + YMM0(gd); + } else { + LD(x3, vback, vyoffset + 0); + LD(x4, wback, fixedaddress + 0); + XOR(x5, x3, x4); + SD(x5, gback, gyoffset + 0); + LD(x3, vback, vyoffset + 8); + LD(x4, wback, fixedaddress + 8); + XOR(x5, x3, x4); + SD(x5, gback, gyoffset + 8); + } + } else + YMM0(gd); + break; case 0x5A: INST_NAME("VCVTPS2PD Gx, Ex"); nextop = F8; |