diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-04-30 17:50:11 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-04-30 17:50:11 +0200 |
| commit | 4f229629c007d65b505a72dbac66eb0e686ee312 (patch) | |
| tree | 90b0f855933725d4bf3848829b72666196233335 /src | |
| parent | f0fd2bc30c63baec32db3b5f3d9a29ed6edfb456 (diff) | |
| download | box64-4f229629c007d65b505a72dbac66eb0e686ee312.tar.gz box64-4f229629c007d65b505a72dbac66eb0e686ee312.zip | |
[RV64_DYNAREC] Improved/fixed flag handling (ported from ARM64_DYNAREC)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_1.c | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_3.c | 54 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_0f.c | 6 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_66.c | 18 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_660f.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 5 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_pass0.h | 4 |
8 files changed, 49 insertions, 46 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_1.c b/src/dynarec/rv64/dynarec_rv64_00_1.c index cab04708..08c39829 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_1.c +++ b/src/dynarec/rv64/dynarec_rv64_00_1.c @@ -266,7 +266,7 @@ uintptr_t dynarec64_00_1(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 0x6C: case 0x6D: INST_NAME(opcode == 0x6C ? "INSB" : "INSD"); - SETFLAGS(X_ALL, SF_SET); // Hack to set flags in "don't care" state + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state GETIP(ip); STORE_XEMU_CALL(x3); CALL(native_priv, -1); @@ -278,7 +278,7 @@ uintptr_t dynarec64_00_1(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 0x6E: case 0x6F: INST_NAME(opcode == 0x6C ? "OUTSB" : "OUTSD"); - SETFLAGS(X_ALL, SF_SET); // Hack to set flags in "don't care" state + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state GETIP(ip); STORE_XEMU_CALL(x3); CALL(native_priv, -1); diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c index 0294c944..d3593b6e 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_3.c +++ b/src/dynarec/rv64/dynarec_rv64_00_3.c @@ -59,7 +59,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 0: INST_NAME("ROL Eb, Ib"); MESSAGE(LOG_DUMP, "Need Optimization\n"); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEB(x1, 1); u8 = F8; MOV32w(x2, u8); @@ -69,7 +69,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 1: INST_NAME("ROR Eb, Ib"); MESSAGE(LOG_DUMP, "Need Optimization\n"); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEB(x1, 1); u8 = F8; MOV32w(x2, u8); @@ -79,7 +79,8 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 2: INST_NAME("RCL Eb, Ib"); MESSAGE(LOG_DUMP, "Need Optimization\n"); - SETFLAGS(X_OF|X_CF, SF_SET); + READFLAGS(X_CF); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEB(x1, 1); u8 = F8; MOV32w(x2, u8); @@ -89,7 +90,8 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 3: INST_NAME("RCR Eb, Ib"); MESSAGE(LOG_DUMP, "Need Optimization\n"); - SETFLAGS(X_OF|X_CF, SF_SET); + READFLAGS(X_CF); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEB(x1, 1); u8 = F8; MOV32w(x2, u8); @@ -190,7 +192,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int INST_NAME("RCL Ed, Ib"); MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); u8 = (F8)&(rex.w?0x3f:0x1f); MOV32w(x2, u8); GETEDW(x4, x1, 0); @@ -201,7 +203,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int INST_NAME("RCR Ed, Ib"); MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); u8 = (F8)&(rex.w?0x3f:0x1f); MOV32w(x2, u8); GETEDW(x4, x1, 0); @@ -275,7 +277,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int break; case 0xC2: INST_NAME("RETN"); - //SETFLAGS(X_ALL, SF_SET); // Hack, set all flags (to an unknown state...) + //SETFLAGS(X_ALL, SF_SET_NODF); // Hack, set all flags (to an unknown state...) if(box64_dynarec_safeflags) { READFLAGS(X_PEND); // lets play safe here too } @@ -287,7 +289,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int break; case 0xC3: INST_NAME("RET"); - // SETFLAGS(X_ALL, SF_SET); // Hack, set all flags (to an unknown state...) + // SETFLAGS(X_ALL, SF_SET_NODF); // Hack, set all flags (to an unknown state...) if(box64_dynarec_safeflags) { READFLAGS(X_PEND); // so instead, force the deferred flags, so it's not too slow, and flags are not lost } @@ -369,7 +371,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int break; case 0xCC: - SETFLAGS(X_ALL, SF_SET); // Hack, set all flags (to an unknown state...) + SETFLAGS(X_ALL, SF_SET_NODF); // Hack, set all flags (to an unknown state...) SKIPTEST(x1); if(PK(0)=='S' && PK(1)=='C') { addr+=2; @@ -460,7 +462,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int jump_to_epilog(dyn, 0, xRIP, ninst); } else { INST_NAME("INT n"); - SETFLAGS(X_ALL, SF_SET); // Hack to set flags in "don't care" state + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state GETIP(ip); STORE_XEMU_CALL(x3); CALL(native_priv, -1); @@ -472,7 +474,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int break; case 0xCF: INST_NAME("IRET"); - SETFLAGS(X_ALL, SF_SET); // Not a hack, EFLAGS are restored + SETFLAGS(X_ALL, SF_SET_NODF); // Not a hack, EFLAGS are restored BARRIER(BARRIER_FLOAT); iret_to_epilog(dyn, ninst, rex.w); *need_epilog = 0; @@ -492,7 +494,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int } MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEB(x1, 0); CALL_(rol8, ed, x3); EBBACK(x5, 0); @@ -507,7 +509,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int } MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEB(x1, 0); CALL_(ror8, ed, x3); EBBACK(x5, 0); @@ -522,7 +524,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int } MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEB(x1, 0); CALL_(rcl8, ed, x3); EBBACK(x5, 0); @@ -537,7 +539,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int } MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEB(x1, 0); CALL_(rcr8, ed, x3); EBBACK(x5, 0); @@ -618,7 +620,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int INST_NAME("RCL Ed, 1"); MESSAGE("LOG_DUMP", "Need optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); MOV32w(x2, 1); GETEDW(x4, x1, 0); CALL_(rex.w ? ((void*)rcl64) : ((void*)rcl32), ed, x4); @@ -628,7 +630,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int INST_NAME("RCR Ed, 1"); MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); MOV32w(x2, 1); GETEDW(x4, x1, 0); CALL_(rex.w?((void*)rcr64):((void*)rcr32), ed, x4); @@ -684,7 +686,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int INST_NAME("RCL Ed, CL"); MESSAGE("LOG_DUMP", "Need optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); ANDI(x2, xRCX, rex.w?0x3f:0x1f); GETEDW(x4, x1, 0); CALL_(rex.w ? ((void*)rcl64) : ((void*)rcl32), ed, x4); @@ -694,7 +696,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int INST_NAME("RCR Ed, CL"); MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); ANDI(x2, xRCX, rex.w?0x3f:0x1f); GETEDW(x4, x1, 0); CALL_(rex.w?((void*)rcr64):((void*)rcr32), ed, x4); @@ -841,7 +843,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int #endif switch(tmp) { case 3: - SETFLAGS(X_ALL, SF_SET); // Hack to set flags to "dont'care" state + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags to "dont'care" state SKIPTEST(x1); BARRIER(BARRIER_FULL); //BARRIER_NEXT(BARRIER_FULL); @@ -900,7 +902,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int if((box64_dynarec_safeflags>1) || (ninst && dyn->insts[ninst-1].x64.set_flags)) { READFLAGS(X_PEND); // that's suspicious } else { - SETFLAGS(X_ALL, SF_SET); // Hack to set flags to "dont'care" state + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags to "dont'care" state } // regular call /*if(box64_dynarec_callret && box64_dynarec_bigblock>1) { @@ -1038,7 +1040,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 6: INST_NAME("DIV Eb"); MESSAGE(LOG_DUMP, "Need Optimization\n"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_DF); GETEB(x1, 0); CALL(div8, -1); break; @@ -1046,7 +1048,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int INST_NAME("IDIV Eb"); SKIPTEST(x1); MESSAGE(LOG_DUMP, "Need Optimization\n"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_DF); GETEB(x1, 0); CALL(idiv8, -1); break; @@ -1123,8 +1125,8 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 6: INST_NAME("DIV Ed"); SETFLAGS(X_ALL, SF_SET); + SET_DFNONE(); if(!rex.w) { - SET_DFNONE(); GETED(0); if(ninst && (nextop==0xF0) && dyn->insts[ninst-1].x64.addr @@ -1164,7 +1166,6 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int && dyn->insts[ninst-1].x64.addr && *(uint8_t*)(dyn->insts[ninst-1].x64.addr)==0x31 && *(uint8_t*)(dyn->insts[ninst-1].x64.addr+1)==0xD2) { - SET_DFNONE(); GETED(0); if(box64_dynarec_div0) { BNE_MARK3(ed, xZR); @@ -1199,7 +1200,6 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int DIVU(x2, xRAX, ed); REMU(xRDX, xRAX, ed); MV(xRAX, x2); - SET_DFNONE(); } } break; @@ -1348,7 +1348,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int { READFLAGS(X_PEND); // that's suspicious } else { - SETFLAGS(X_ALL, SF_SET); //Hack to put flag in "don't care" state + SETFLAGS(X_ALL, SF_SET_NODF); //Hack to put flag in "don't care" state } GETEDz(0); if(box64_dynarec_callret && box64_dynarec_bigblock>1) { diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index d0cac627..13063c85 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -69,7 +69,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni INST_NAME("FAKE xgetbv"); nextop = F8; addr = fakeed(dyn, addr, ninst, nextop); - SETFLAGS(X_ALL, SF_SET); // Hack to set flags in "don't care" state + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state GETIP(ip); STORE_XEMU_CALL(x3); CALL(native_ud, -1); @@ -123,7 +123,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x09: INST_NAME("WBINVD"); - SETFLAGS(X_ALL, SF_SET); // Hack to set flags in "don't care" state + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state GETIP(ip); STORE_XEMU_CALL(x3); CALL(native_ud, -1); @@ -135,7 +135,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x0B: INST_NAME("UD2"); - SETFLAGS(X_ALL, SF_SET); // Hack to set flags in "don't care" state + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state GETIP(ip); STORE_XEMU_CALL(x3); CALL(native_ud, -1); diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c index c5ace2f5..59c216dc 100644 --- a/src/dynarec/rv64/dynarec_rv64_66.c +++ b/src/dynarec/rv64/dynarec_rv64_66.c @@ -965,7 +965,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0: INST_NAME("ROL Ew, Ib"); MESSAGE(LOG_DUMP, "Need Optimization\n"); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEW(x1, 1); u8 = F8; MOV32w(x2, u8); @@ -975,7 +975,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 1: INST_NAME("ROR Ew, Ib"); MESSAGE(LOG_DUMP, "Need Optimization\n"); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEW(x1, 1); u8 = F8; MOV32w(x2, u8); @@ -986,7 +986,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni INST_NAME("RCL Ew, Ib"); MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEW(x1, 1); u8 = F8; MOV32w(x2, u8); @@ -997,7 +997,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni INST_NAME("RCR Ew, Ib"); MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEW(x1, 1); u8 = F8; MOV32w(x2, u8); @@ -1078,7 +1078,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ANDI(x2, xRCX, 15); } MESSAGE(LOG_DUMP, "Need Optimization\n"); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEW(x1, 1); CALL_(rol16, x1, x3); EWBACK; @@ -1092,7 +1092,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ANDI(x2, xRCX, 15); } MESSAGE(LOG_DUMP, "Need Optimization\n"); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEW(x1, 1); CALL_(ror16, x1, x3); EWBACK; @@ -1107,7 +1107,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } MESSAGE("LOG_DUMP", "Need optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEW(x1, 1); CALL_(rcl16, x1, x3); EWBACK; @@ -1121,7 +1121,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } MESSAGE("LOG_DUMP", "Need optimization\n"); READFLAGS(X_CF); - SETFLAGS(X_OF|X_CF, SF_SET); + SETFLAGS(X_OF|X_CF, SF_SET_DF); GETEW(x1, 1); CALL_(rcr16, x1, x3); EWBACK; @@ -1210,6 +1210,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 6: INST_NAME("DIV Ew"); SETFLAGS(X_ALL, SF_SET); + SET_DFNONE(); GETEW(x1, 0); ZEXTH(x2, xRAX); SLLI(x3, xRDX, 48); @@ -1240,6 +1241,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni INST_NAME("IDIV Ew"); NOTEST(x1); SETFLAGS(X_ALL, SF_SET); + SET_DFNONE(); GETSEW(x1, 0); if(box64_dynarec_div0) { BNE_MARK3(ed, xZR); diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c index e1553d69..70200fed 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f.c +++ b/src/dynarec/rv64/dynarec_rv64_660f.c @@ -901,7 +901,7 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int break; case 0x61: INST_NAME("PCMPESTRI Gx, Ex, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_DF); nextop = F8; GETG; sse_reflect_reg(dyn, ninst, gd); diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index e3ae105f..87fe9448 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -738,8 +738,7 @@ void call_c(dynarec_rv64_t* dyn, int ninst, void* fnc, int reg, int ret, int sav LD(xFlags, xEmu, offsetof(x64emu_t, eflags)); FLAGS_ADJUST_FROM11(xFlags, xFlags, reg); } - SET_NODF(); - dyn->last_ip = 0; + //SET_NODF(); } void call_n(dynarec_rv64_t* dyn, int ninst, void* fnc, int w) @@ -800,7 +799,7 @@ void call_n(dynarec_rv64_t* dyn, int ninst, void* fnc, int w) fpu_popcache(dyn, ninst, x3, 1); LD(xFlags, xEmu, offsetof(x64emu_t, eflags)); FLAGS_ADJUST_FROM11(xFlags, xFlags, x3); - SET_NODF(); + //SET_NODF(); } void grab_segdata(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, int reg, int segment) diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index 1ed23785..e85ae435 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -950,6 +950,8 @@ if (dyn->insts[ninst].x64.gen_flags) switch (B) { \ case SF_SUBSET: \ case SF_SET: dyn->f.pending = SF_SET; break; \ + case SF_SET_DF: dyn->f.pending = SF_SET; dyn->f.dfnone = 1; break; \ + case SF_SET_NODF: dyn->f.pending = SF_SET; dyn->f.dfnone = 0; break; \ case SF_PENDING: dyn->f.pending = SF_PENDING; break; \ case SF_SUBSET_PENDING: \ case SF_SET_PENDING: \ diff --git a/src/dynarec/rv64/dynarec_rv64_pass0.h b/src/dynarec/rv64/dynarec_rv64_pass0.h index d5040d9b..3ee1685f 100644 --- a/src/dynarec/rv64/dynarec_rv64_pass0.h +++ b/src/dynarec/rv64/dynarec_rv64_pass0.h @@ -12,9 +12,9 @@ dyn->f.pending=SF_SET #define SETFLAGS(A,B) \ dyn->insts[ninst].x64.set_flags = A; \ - dyn->insts[ninst].x64.state_flags = B; \ + dyn->insts[ninst].x64.state_flags = (B)&~SF_DF; \ dyn->f.pending=(B)&SF_SET_PENDING; \ - dyn->f.dfnone=((B)&SF_SET)?1:0; + dyn->f.dfnone=((B)&SF_SET)?(((B)==SF_SET_NODF)?0:1):0; #define EMIT(A) dyn->native_size+=4 #define JUMP(A, C) add_jump(dyn, ninst); add_next(dyn, (uintptr_t)A); SMEND(); dyn->insts[ninst].x64.jmp = A; dyn->insts[ninst].x64.jmp_cond = C; dyn->insts[ninst].x64.jmp_insts = 0 #define BARRIER(A) if(A!=BARRIER_MAYBE) {fpu_purgecache(dyn, ninst, 0, x1, x2, x3); dyn->insts[ninst].x64.barrier = A;} else dyn->insts[ninst].barrier_maybe = 1 |