diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2023-04-24 14:08:42 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-24 08:08:42 +0200 |
| commit | 4f457e945a95ae3391bb7551287f0a5ad76706d4 (patch) | |
| tree | 9812421d8f2914800a736b3ab98c62afa8ea235f /src | |
| parent | 64f081009d31f48915ddad10f5bcd067328fa7d9 (diff) | |
| download | box64-4f457e945a95ae3391bb7551287f0a5ad76706d4.tar.gz box64-4f457e945a95ae3391bb7551287f0a5ad76706d4.zip | |
[RV64_DYNAREC] Added more opcodes (#736)
* Added 0F C3 MOVNTI opcode * Added 66 0F DA PMINUB opcode * Added 66 0F EA PMINSW opcode * Added 66 0F 5D MINPD opcode * Added 66 0F DE PMAXUB opcode * Added 66 0F 5F MAXPD opcode * Added 66 0F E5 PMULHW opcode * Added 66 0F D5 PMULLW opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_0f.c | 11 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_660f.c | 102 |
2 files changed, 113 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index c2d526cf..1031d6a0 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -1098,6 +1098,17 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni SW(x3, gback, i*4); } break; + case 0xC3: + INST_NAME("MOVNTI Ed, Gd"); + nextop = F8; + GETGD; + if(MODREG) { + MVxw(xRAX+(nextop&7)+(rex.b<<3), gd); + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); + SDxw(gd, ed, fixedaddress); + } + break; case 0xC6: // TODO: Optimize this! INST_NAME("SHUFPS Gx, Ex, Ib"); nextop = F8; diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c index 596c3218..4afeed13 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f.c +++ b/src/dynarec/rv64/dynarec_rv64_660f.c @@ -481,6 +481,44 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int GETGX(x2); SSE_LOOP_FQ(x3, x4, FSUBD(v0, v0, v1)); break; + case 0x5D: + INST_NAME("MINPD Gx, Ex"); + nextop = F8; + GETGX(x1); + GETEX(x2, 0); + d0 = fpu_get_scratch(dyn); + d1 = fpu_get_scratch(dyn); + for (int i=0; i<2; ++i) { + FLD(d0, gback, 8*i); + FLD(d1, wback, fixedaddress+8*i); + FEQD(x3, d0, d0); + FEQD(x4, d1, d1); + AND(x3, x3, x4); + BEQ(x3, xZR, 12); + FLTD(x3, d1, d0); + BEQ(x3, xZR, 8); // continue + FSD(d1, gback, 8*i); + } + break; + case 0x5F: + INST_NAME("MAXPD Gx, Ex"); + nextop = F8; + GETGX(x1); + GETEX(x2, 0); + d0 = fpu_get_scratch(dyn); + d1 = fpu_get_scratch(dyn); + for (int i=0; i<2; ++i) { + FLD(d0, gback, 8*i); + FLD(d1, wback, fixedaddress+8*i); + FEQD(x3, d0, d0); + FEQD(x4, d1, d1); + AND(x3, x3, x4); + BEQ(x3, xZR, 12); + FLTD(x3, d0, d1); + BEQ(x3, xZR, 8); // continue + FSD(d1, gback, 8*i); + } + break; case 0x60: INST_NAME("PUNPCKLBW Gx,Ex"); nextop = F8; @@ -1176,6 +1214,18 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int GETEX(x2, 0); SSE_LOOP_Q(x3, x4, ADD(x3, x3, x4)); break; + case 0xD5: + INST_NAME("PMULLW Gx,Ex"); + nextop = F8; + GETGX(x1); + GETEX(x2, 0); + for(int i=0; i<8; ++i) { + LH(x3, gback, 2*i); + LH(x4, wback, fixedaddress+2*i); + MULW(x3, x3, x4); + SH(x3, gback, 2*i); + } + break; case 0xD6: INST_NAME("MOVQ Ex, Gx"); nextop = F8; @@ -1223,6 +1273,19 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int GETEX(x2, 0); SSE_LOOP_W(x3, x4, SUB(x3, x3, x4); NOT(x4, x3); SRAI(x4, x4, 63); AND(x3, x3, x4)); break; + case 0xDA: + INST_NAME("PMINUB Gx, Ex"); + nextop = F8; + GETGX(x1); + GETEX(x2, 0); + for (int i=0; i<16; ++i) { + LBU(x3, gback, i); + LBU(x4, wback, fixedaddress+i); + BLTU(x3, x4, 8); + MV(x3, x4); + SB(x3, gback, i); + } + break; case 0xDB: INST_NAME("PAND Gx,Ex"); nextop = F8; @@ -1262,6 +1325,19 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int SH(x3, gback, i*2); } break; + case 0xDE: + INST_NAME("PMAXUB Gx, Ex"); + nextop = F8; + GETGX(x1); + GETEX(x2, 0); + for (int i=0; i<16; ++i) { + LBU(x3, gback, i); + LBU(x4, wback, fixedaddress+i); + BLTU(x4, x3, 8); + MV(x3, x4); + SB(x3, gback, i); + } + break; case 0xDF: INST_NAME("PANDN Gx,Ex"); nextop = F8; @@ -1340,6 +1416,19 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int SH(x3, gback, 2*i); } break; + case 0xE5: + INST_NAME("PMULHW Gx,Ex"); + nextop = F8; + GETGX(x1); + GETEX(x2, 0); + for(int i=0; i<8; ++i) { + LH(x3, gback, 2*i); + LH(x4, wback, fixedaddress+2*i); + MULW(x3, x3, x4); + SRAIW(x3, x3, 16); + SH(x3, gback, 2*i); + } + break; case 0xE7: INST_NAME("MOVNTDQ Ex, Gx"); nextop = F8; @@ -1392,6 +1481,19 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int SH(x3, gback, 2*i); } break; + case 0xEA: + INST_NAME("PMINSW Gx,Ex"); + nextop = F8; + GETGX(x1); + GETEX(x2, 0); + for (int i=0; i<8; ++i) { + LH(x3, gback, 2*i); + LH(x4, wback, fixedaddress+2*i); + BLT(x3, x4, 8); + MV(x3, x4); + SH(x3, gback, 2*i); + } + break; case 0xEB: INST_NAME("POR Gx,Ex"); nextop = F8; |