diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_660f.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_avx_66_0f.c | 225 |
2 files changed, 226 insertions, 1 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c index a4c929dd..0a37495c 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f.c +++ b/src/dynarec/rv64/dynarec_rv64_660f.c @@ -305,7 +305,7 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int nextop = F8; GETGD; GETEX(x1, 0, 8); - MV(gd, xZR); + XOR(gd, gd, gd); for (int i = 0; i < 2; ++i) { // GD->dword[0] |= ((EX->q[i]>>63)&1)<<i; LD(x2, wback, fixedaddress + 8 * i); diff --git a/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c b/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c index e16e54b0..4acef003 100644 --- a/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c @@ -67,6 +67,231 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, SD(xZR, gback, gyoffset + 8); } break; + case 0x29: + INST_NAME("VMOVAPD Ex, Gx"); + nextop = F8; + GETEX(x2, 0, vex.l ? 24 : 8); + GETGX(); + GETGY(); + LD(x3, gback, gdoffset + 0); + LD(x4, gback, gdoffset + 8); + SD(x3, wback, fixedaddress + 0); + SD(x4, wback, fixedaddress + 8); + if (vex.l) { + GETEY(); + LD(x3, gback, gyoffset + 0); + LD(x4, gback, gyoffset + 8); + SD(x3, wback, fixedaddress + 0); + SD(x4, wback, fixedaddress + 8); + } else if (MODREG) { + GETEY(); + SD(xZR, wback, fixedaddress + 0); + SD(xZR, wback, fixedaddress + 8); + } + if (!MODREG) SMWRITE2(); + break; + case 0x50: + INST_NAME("VMOVMSKPD Gd, Ex"); + nextop = F8; + GETGD; + GETEX(x1, 0, vex.l ? 24 : 8); + XOR(gd, gd, gd); + for (int i = 0; i < 2; ++i) { + // GD->dword[0] |= ((EX->q[i]>>63)&1)<<i; + LD(x2, wback, fixedaddress + 8 * i); + SRLI(x2, x2, 63); + if (i) SLLI(x2, x2, 1); + OR(gd, gd, x2); + } + if (vex.l) { + GETEY(); + for (int i = 0; i < 2; ++i) { + LD(x2, wback, fixedaddress + 8 * i); + SRLI(x2, x2, 63); + SLLI(x2, x2, i + 2); + OR(gd, gd, x2); + } + } + break; + case 0x51: + INST_NAME("VSQRTPD Gx, Ex"); + nextop = F8; + GETGX(); + GETEX(x2, 0, 8); + d0 = fpu_get_scratch(dyn); + if (!BOX64ENV(dynarec_fastnan)) { + d1 = fpu_get_scratch(dyn); + FMVDX(d1, xZR); + } + for (int i = 0; i < 2; ++i) { + FLD(d0, wback, fixedaddress + i * 8); + if (!BOX64ENV(dynarec_fastnan)) { + FLTD(x3, d0, d1); + } + FSQRTD(d0, d0); + if (!BOX64ENV(dynarec_fastnan)) { + BEQ(x3, xZR, 8); + FNEGD(d0, d0); + } + FSD(d0, gback, gdoffset + i * 8); + } + if (vex.l) { + GETEY(); + for (int i = 0; i < 2; ++i) { + FLD(d0, wback, fixedaddress + i * 8); + if (!BOX64ENV(dynarec_fastnan)) { + FLTD(x3, d0, d1); + } + FSQRTD(d0, d0); + if (!BOX64ENV(dynarec_fastnan)) { + BEQ(x3, xZR, 8); + FNEGD(d0, d0); + } + FSD(d0, gback, gyoffset + i * 8); + } + } else { + SD(xZR, gback, gyoffset + 0); + SD(xZR, gback, gyoffset + 8); + } + break; + case 0x54: + INST_NAME("VANDPD Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 24 : 8); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + LD(x3, wback, fixedaddress + 0); + LD(x4, wback, fixedaddress + 8); + LD(x5, vback, vxoffset + 0); + LD(x6, vback, vxoffset + 8); + AND(x5, x5, x3); + AND(x6, x6, x4); + SD(x5, gback, gdoffset + 0); + SD(x6, gback, gdoffset + 8); + if (vex.l) { + GETEY(); + LD(x3, wback, fixedaddress + 0); + LD(x4, wback, fixedaddress + 8); + LD(x5, vback, vyoffset + 0); + LD(x6, vback, vyoffset + 8); + AND(x5, x5, x3); + AND(x6, x6, x4); + SD(x5, gback, gyoffset + 0); + SD(x6, gback, gyoffset + 8); + } else { + SD(xZR, gback, gyoffset); + SD(xZR, gback, gyoffset + 8); + } + break; + case 0x55: + INST_NAME("VANDNPD Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 24 : 8); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + LD(x3, wback, fixedaddress + 0); + LD(x4, wback, fixedaddress + 8); + LD(x5, vback, vxoffset + 0); + LD(x6, vback, vxoffset + 8); + if (cpuext.zbb) { + ANDN(x5, x3, x5); + ANDN(x6, x4, x6); + } else { + NOT(x5, x5); + NOT(x6, x6); + AND(x5, x5, x3); + AND(x6, x6, x4); + } + SD(x5, gback, gdoffset + 0); + SD(x6, gback, gdoffset + 8); + if (vex.l) { + GETEY(); + LD(x3, wback, fixedaddress + 0); + LD(x4, wback, fixedaddress + 8); + LD(x5, vback, vyoffset + 0); + LD(x6, vback, vyoffset + 8); + if (cpuext.zbb) { + ANDN(x5, x3, x5); + ANDN(x6, x4, x6); + } else { + NOT(x5, x5); + NOT(x6, x6); + AND(x5, x5, x3); + AND(x6, x6, x4); + } + SD(x5, gback, gyoffset + 0); + SD(x6, gback, gyoffset + 8); + } else { + SD(xZR, gback, gyoffset); + SD(xZR, gback, gyoffset + 8); + } + break; + case 0x56: + INST_NAME("VORPD Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 24 : 8); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + LD(x3, wback, fixedaddress + 0); + LD(x4, wback, fixedaddress + 8); + LD(x5, vback, vxoffset + 0); + LD(x6, vback, vxoffset + 8); + OR(x5, x5, x3); + OR(x6, x6, x4); + SD(x5, gback, gdoffset + 0); + SD(x6, gback, gdoffset + 8); + if (vex.l) { + GETEY(); + LD(x3, wback, fixedaddress + 0); + LD(x4, wback, fixedaddress + 8); + LD(x5, vback, vyoffset + 0); + LD(x6, vback, vyoffset + 8); + OR(x5, x5, x3); + OR(x6, x6, x4); + SD(x5, gback, gyoffset + 0); + SD(x6, gback, gyoffset + 8); + } else { + SD(xZR, gback, gyoffset); + SD(xZR, gback, gyoffset + 8); + } + break; + case 0x57: + INST_NAME("VXORPD Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 24 : 8); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + LD(x3, wback, fixedaddress + 0); + LD(x4, wback, fixedaddress + 8); + LD(x5, vback, vxoffset + 0); + LD(x6, vback, vxoffset + 8); + XOR(x5, x5, x3); + XOR(x6, x6, x4); + SD(x5, gback, gdoffset + 0); + SD(x6, gback, gdoffset + 8); + if (vex.l) { + GETEY(); + LD(x3, wback, fixedaddress + 0); + LD(x4, wback, fixedaddress + 8); + LD(x5, vback, vyoffset + 0); + LD(x6, vback, vyoffset + 8); + XOR(x5, x5, x3); + XOR(x6, x6, x4); + SD(x5, gback, gyoffset + 0); + SD(x6, gback, gyoffset + 8); + } else { + SD(xZR, gback, gyoffset); + SD(xZR, gback, gyoffset + 8); + } + break; case 0x66: INST_NAME("VPCMPGTD Gx, Vx, Ex"); nextop = F8; |