diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-08-25 16:32:59 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-25 10:32:59 +0200 |
| commit | 8579ef84bd003de01f64257abbc1ee0544c85682 (patch) | |
| tree | 67c4589eacde6a0f5982dd354f610b87b4764ebc /src | |
| parent | 747882cb4ef5d90955de8b21f74b9fc7850cc39c (diff) | |
| download | box64-8579ef84bd003de01f64257abbc1ee0544c85682.tar.gz box64-8579ef84bd003de01f64257abbc1ee0544c85682.zip | |
[RV64_DYNAREC] Added more scalar avx opcodes (#2970)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_avx_66_0f.c | 171 |
1 files changed, 171 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 af0abf60..1e3e0227 100644 --- a/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c @@ -46,6 +46,48 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, rex_t rex = vex.rex; switch (opcode) { + case 0x14: + INST_NAME("VUNPCKLPD Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 16 : 0); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + LD(x3, vback, vxoffset); + LD(x4, wback, fixedaddress); + SD(x3, gback, gdoffset); + SD(x4, gback, gdoffset + 8); + if (vex.l) { + GETEY(); + LD(x3, vback, vyoffset); + LD(x4, wback, fixedaddress); + SD(x3, gback, gyoffset); + SD(x4, gback, gyoffset + 8); + } else + YMM0(gd); + break; + case 0x15: + INST_NAME("VUNPCKHPD Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 16 : 0); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + LD(x3, vback, vxoffset + 8); + LD(x4, wback, fixedaddress + 8); + SD(x3, gback, gdoffset); + SD(x4, gback, gdoffset + 8); + if (vex.l) { + GETEY(); + LD(x3, vback, vyoffset + 8); + LD(x4, wback, fixedaddress + 8); + SD(x3, gback, gyoffset); + SD(x4, gback, gyoffset + 8); + } else + YMM0(gd); + break; case 0x28: INST_NAME("VMOVAPD Gx, Ex"); nextop = F8; @@ -590,6 +632,135 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, } else YMM0(gd); break; + case 0x60: + INST_NAME("VPUNPCKLBW Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 23 : 7); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + for (int i = 7; i >= 0; --i) { + LBU(x3, wback, fixedaddress + i); + LBU(x4, vback, vxoffset + i); + SB(x3, gback, gdoffset + 2 * i + 1); + SB(x4, gback, gdoffset + 2 * i); + } + if (vex.l) { + GETEY(); + for (int i = 7; i >= 0; --i) { + LBU(x3, wback, fixedaddress + i); + LBU(x4, vback, vyoffset + i); + SB(x3, gback, gyoffset + 2 * i + 1); + SB(x4, gback, gyoffset + 2 * i); + } + } else + YMM0(gd); + break; + case 0x61: + INST_NAME("VPUNPCKLWD Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 22 : 6); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + for (int i = 3; i >= 0; --i) { + LHU(x3, wback, fixedaddress + i * 2); + LHU(x4, vback, vxoffset + i * 2); + SH(x3, gback, gdoffset + 4 * i + 2); + SH(x4, gback, gdoffset + 4 * i); + } + if (vex.l) { + GETEY(); + for (int i = 3; i >= 0; --i) { + LHU(x3, wback, fixedaddress + i * 2); + LHU(x4, vback, vyoffset + i * 2); + SH(x3, gback, gyoffset + 4 * i + 2); + SH(x4, gback, gyoffset + 4 * i); + } + } else + YMM0(gd); + break; + case 0x62: + INST_NAME("VPUNPCKLDQ Gx, Vx, Ex"); + nextop = F8; + GETEX(x1, 0, vex.l ? 20 : 4); + GETGX(); + GETGY(); + GETVX(); + GETVY(); + for (int i = 1; i >= 0; --i) { + LWU(x3, wback, fixedaddress + i * 4); + LWU(x4, vback, vxoffset + i * 4); + SW(x3, gback, gdoffset + 8 * i + 4); + SW(x4, gback, gdoffset + 8 * i); + } + if (vex.l) { + GETEY(); + for (int i = 1; i >= 0; --i) { + LWU(x3, wback, fixedaddress + i * 4); + LWU(x4, vback, vyoffset + i * 4); + SW(x3, gback, gyoffset + 8 * i + 4); + SW(x4, gback, gyoffset + 8 * i); + } + } else + YMM0(gd); + break; + case 0x64: + INST_NAME("VPCMPGTB Gx, Vx, Ex"); + nextop = F8; + GETEX(x2, 0, vex.l ? 31 : 15); + GETGX(); + GETVX(); + GETGY(); + GETVY(); + for (int i = 0; i < 16; ++i) { + LB(x3, vback, vxoffset + i); + LB(x4, wback, fixedaddress + i); + SLT(x4, x4, x3); + NEG(x3, x4); + SB(x3, gback, gdoffset + i); + } + if (vex.l) { + GETEY(); + for (int i = 0; i < 16; ++i) { + LB(x3, vback, vyoffset + i); + LB(x4, wback, fixedaddress + i); + SLT(x4, x4, x3); + NEG(x3, x4); + SB(x3, gback, gyoffset + i); + } + } else + YMM0(gd); + break; + case 0x65: + INST_NAME("VPCMPGTW Gx, Vx, Ex"); + nextop = F8; + GETEX(x2, 0, vex.l ? 30 : 14); + GETGX(); + GETVX(); + GETGY(); + GETVY(); + for (int i = 0; i < 8; ++i) { + LH(x3, vback, vxoffset + i * 2); + LH(x4, wback, fixedaddress + i * 2); + SLT(x4, x4, x3); + NEG(x3, x4); + SH(x3, gback, gdoffset + i * 2); + } + if (vex.l) { + GETEY(); + for (int i = 0; i < 8; ++i) { + LH(x3, vback, vyoffset + i * 2); + LH(x4, wback, fixedaddress + i * 2); + SLT(x4, x4, x3); + NEG(x3, x4); + SH(x3, gback, gyoffset + i * 2); + } + } else + YMM0(gd); + break; case 0x66: INST_NAME("VPCMPGTD Gx, Vx, Ex"); nextop = F8; |