[RV64_DYNAREC] Added more opcodes for Stardew Valley (#666)

* [RV64_DYNAREC] Added 66 0F 70 PSHUFD opcode

* [RV64_DYNAREC] Added F2 0F 5E DIVSD opcode

* [RV64_DYNAREC] Added F2 0F 2A CVTSI2SD opcode
This commit is contained in:
Yang Liu 2023-04-05 04:01:59 +08:00 committed by GitHub
parent 57eae464a3
commit e58ff89044
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 47 additions and 4 deletions

View File

@ -161,6 +161,22 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
SD(x3, gback, 0);
SD(x4, gback, 8);
break;
case 0x70: // TODO: Optimize this!
INST_NAME("PSHUFD Gx,Ex,Ib");
nextop = F8;
GETGX(x1);
GETEX(x2, 1);
u8 = F8;
i32 = -1;
for (int i=0; i<4; ++i) {
int32_t idx = (u8>>(i*2))&3;
if (idx!=i32) {
LWU(x4, wback, fixedaddress+idx*4);
i32 = idx;
}
SW(x4, gback, i*4);
}
break;
case 0x72:
nextop = F8;
switch((nextop>>3)&7) {

View File

@ -179,7 +179,7 @@ uintptr_t dynarec64_DB(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
v1 = x87_do_push(dyn, ninst, x1, EXT_CACHE_ST_D);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0);
LW(x1, ed, fixedaddress);
FCVTDW(v1, x1); // i32 -> double
FCVTDW(v1, x1, RD_RNE); // i32 -> double
break;
case 1:
INST_NAME("FISTTP Ed, ST0");

View File

@ -79,7 +79,17 @@ uintptr_t dynarec64_F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
SMWRITE2();
}
break;
case 0x2A:
INST_NAME("CVTSI2SD Gx, Ed");
nextop = F8;
GETGXSD(v0);
GETED(0);
if(rex.w) {
FCVTDL(v0, ed, RD_RNE);
} else {
FCVTDW(v0, ed, RD_RNE);
}
break;
case 0x38: // these are some more SSSE4.2+ opcodes
opcode = F8;
switch(opcode) {
@ -124,7 +134,24 @@ uintptr_t dynarec64_F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
GETEXSD(v1, 0);
FSUBD(v0, v0, v1);
break;
case 0x5E:
INST_NAME("DIVSD Gx, Ex");
nextop = F8;
GETGXSD(v0);
GETEXSD(v1, 0);
if(!box64_dynarec_fastnan) {
FEQD(x3, v0, v0);
FEQD(x4, v1, v1);
}
FDIVD(v0, v0, v1);
if(!box64_dynarec_fastnan) {
AND(x3, x3, x4);
CBZ_NEXT(x3);
FEQD(x3, v0, v0);
CBNZ_NEXT(x3);
FNEGD(v0, v0);
}
break;
case 0xC2:
INST_NAME("CMPSD Gx, Ex, Ib");
nextop = F8;

View File

@ -469,7 +469,7 @@ f2831 ft811 FP temporaries Caller
// |rs1| => rd
#define FABSD(rd, rs1) FSGNJXD(rd, rs1, rs1)
// Convert from signed 32bits to Double
#define FCVTDW(frd, rs1) EMIT(R_type(0b1101001, 0b00000, rs1, 0b000, frd, 0b1010011))
#define FCVTDW(frd, rs1, rm) EMIT(R_type(0b1101001, 0b00000, rs1, rm, frd, 0b1010011))
#define FEQD(rd, frs1, frs2) EMIT(R_type(0b1010001, frs2, frs1, 0b010, rd, 0b1010011))
#define FLTD(rd, frs1, frs2) EMIT(R_type(0b1010001, frs2, frs1, 0b001, rd, 0b1010011))