diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2023-04-14 17:32:35 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-14 11:32:35 +0200 |
| commit | 27f3ba941f32586160f55aa3f2082c864e78d5f2 (patch) | |
| tree | e3c4a27177ed7c320e46a62827f04877bb19fe6d /src | |
| parent | 9413d5deb4ef1223dedc9b650885abb47e7077b1 (diff) | |
| download | box64-27f3ba941f32586160f55aa3f2082c864e78d5f2.tar.gz box64-27f3ba941f32586160f55aa3f2082c864e78d5f2.zip | |
[RV64_DYNAREC] Added more opcodes for SV (#700)
* [RV64_DYNAREC] Added 66 0F F8 PSUBB opcode * [RV64_DYNAREC] Added 66 0F FB PSUBQ opcode * [RV64_DYNAREC] Added 66 0F 68 PUNPCKHBW opcode * [RV64_DYNAREC] Added F2 0F 5A CVTSD2SS opcode * [RV64_DYNAREC] Added F2 0F 12 MOVDDUP opcode * [RV64_DYNAREC] Fixed F2 0F 5A CVTSD2SS opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_660f.c | 44 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f20f.c | 16 |
2 files changed, 60 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c index f3e6d2cc..9c102d01 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f.c +++ b/src/dynarec/rv64/dynarec_rv64_660f.c @@ -409,6 +409,30 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int } } break; + case 0x68: + INST_NAME("PUNPCKHBW Gx,Ex"); + nextop = F8; + GETGX(x1); + for(int i=0; i<8; ++i) { + // GX->ub[2 * i] = GX->ub[i + 8]; + LBU(x3, gback, i+8); + SB(x3, gback, 2*i); + } + if (MODREG && gd==(nextop&7)+(rex.b<<3)) { + for(int i=0; i<8; ++i) { + // GX->ub[2 * i + 1] = GX->ub[2 * i]; + LBU(x3, gback, 2*i); + SB(x3, gback, 2*i+1); + } + } else { + GETEX(x2, 0); + for(int i=0; i<8; ++i) { + // GX->ub[2 * i + 1] = EX->ub[i + 8]; + LBU(x3, wback, fixedaddress+i+8); + SB(x3, gback, 2*i+1); + } + } + break; case 0x69: INST_NAME("PUNPCKHWD Gx,Ex"); nextop = F8; @@ -990,6 +1014,19 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int SD(x4, gback, 0); SD(x5, gback, 8); break; + case 0xF8: + INST_NAME("PSUBB Gx,Ex"); + nextop = F8; + GETGX(x1); + GETEX(x2, 0); + for(int i=0; i<16; ++i) { + // GX->sb[i] -= EX->sb[i]; + LB(x3, wback, fixedaddress+i); + LB(x4, gback, i); + SUB(x3, x4, x3); + SB(x3, gback, i); + } + break; case 0xFA: INST_NAME("PSUBD Gx,Ex"); nextop = F8; @@ -997,6 +1034,13 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int GETEX(x2, 0); SSE_LOOP_D(x3, x4, SUBW(x3, x3, x4)); break; + case 0xFB: + INST_NAME("PSUBQ Gx,Ex"); + nextop = F8; + GETGX(x1); + GETEX(x2, 0); + SSE_LOOP_Q(x3, x4, SUB(x3, x3, x4)); + break; case 0xFC: INST_NAME("PADDB Gx,Ex"); nextop = F8; diff --git a/src/dynarec/rv64/dynarec_rv64_f20f.c b/src/dynarec/rv64/dynarec_rv64_f20f.c index ee1e14ca..34e471b6 100644 --- a/src/dynarec/rv64/dynarec_rv64_f20f.c +++ b/src/dynarec/rv64/dynarec_rv64_f20f.c @@ -79,6 +79,15 @@ uintptr_t dynarec64_F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int SMWRITE2(); } break; + case 0x12: + INST_NAME("MOVDDUP Gx, Ex"); + nextop = F8; + GETGX(x1); + GETEX(x2, 0); + LD(x3, wback, fixedaddress+0); + SD(x3, gback, 0); + SD(x3, gback, 8); + break; case 0x2A: INST_NAME("CVTSI2SD Gx, Ed"); nextop = F8; @@ -149,6 +158,13 @@ uintptr_t dynarec64_F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int GETEXSD(v1, 0); FMULD(v0, v0, v1); break; + case 0x5A: + INST_NAME("CVTSD2SS Gx, Ex"); + nextop = F8; + GETEXSD(v1, 0); + GETGXSS_empty(v0); + FCVTSD(v0, v1); + break; case 0x5C: INST_NAME("SUBSD Gx, Ex"); nextop = F8; |