diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-05-13 15:50:14 +0000 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-05-13 15:50:14 +0000 |
| commit | 7b9e6a57afb649b377a3200be73ea9b9c19647c8 (patch) | |
| tree | 16ca30de930c4318b88217e847a7c54c44b10bb4 /src | |
| parent | 7e9cab2b7dd47a86010806d2daf99b8ea8223605 (diff) | |
| download | box64-7b9e6a57afb649b377a3200be73ea9b9c19647c8.tar.gz box64-7b9e6a57afb649b377a3200be73ea9b9c19647c8.zip | |
[RV64_DYNAREC] Added 66 0F 63 opcode (for dav1d)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_660f.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c index bb80f08c..6423672d 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f.c +++ b/src/dynarec/rv64/dynarec_rv64_660f.c @@ -1088,6 +1088,43 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int LWU(x3, x1, fixedaddress+0*4); SW(x3, x2, 1*4); break; + case 0x63: + INST_NAME("PACKSSWB Gx, Ex"); + nextop = F8; + GETGX(x1); + GETEX(x2, 0); + MOV64x(x5, 127); + MOV64x(x6, -128); + for(int i=0; i<8; ++i) { + LH(x3, gback, i*2); + if(rv64_zbb) { + MIN(x3, x3, x5); + MAX(x3, x3, x6); + } else { + BLT(x3, x6, 4+4); + MV(x3, x6); + BGE(x3, x5, 4+4); + MV(x3, x5); + } + SB(x3, gback, i); + } + if(MODREG && gd==ed) { + LD(x3, gback, 0); + SD(x3, gback, 8); + } else for(int i=0; i<8; ++i) { + LH(x3, wback, fixedaddress+i*2); + if(rv64_zbb) { + MIN(x3, x3, x5); + MAX(x3, x3, x6); + } else { + BLT(x3, x6, 4+4); + MV(x3, x6); + BGE(x3, x5, 4+4); + MV(x3, x5); + } + SB(x3, gback, 8+i); + } + break; case 0x64: INST_NAME("PCMPGTB Gx,Ex"); nextop = F8; |