@@ -349,7 +349,6 @@ void jump_to_epilog(dynarec_la64_t* dyn, uintptr_t ip, int reg, int ninst)
349349 }
350350 TABLE64C (x2 , const_epilog );
351351 SMEND ();
352- CHECK_DFNONE (0 );
353352 BR (x2 );
354353}
355354
@@ -369,7 +368,6 @@ void jump_to_epilog_fast(dynarec_la64_t* dyn, uintptr_t ip, int reg, int ninst)
369368 }
370369 TABLE64C (x2 , const_epilog_fast );
371370 SMEND ();
372- CHECK_DFNONE (0 );
373371 BR (x2 );
374372}
375373
@@ -409,7 +407,6 @@ void jump_to_next(dynarec_la64_t* dyn, uintptr_t ip, int reg, int ninst, int is3
409407 if (is32bits )
410408 ip &= 0xffffffffLL ;
411409
412- CHECK_DFNONE (0 );
413410 int dest ;
414411 if (reg ) {
415412 if (reg != xRIP ) {
@@ -444,7 +441,6 @@ void ret_to_epilog(dynarec_la64_t* dyn, uintptr_t ip, int ninst, rex_t rex)
444441 MAYUSE (dyn );
445442 MAYUSE (ninst );
446443 MESSAGE (LOG_DUMP , "Ret to epilog\n" );
447- CHECK_DFNONE (0 );
448444 POP1z (xRIP );
449445 MVz (x1 , xRIP );
450446 SMEND ();
@@ -469,7 +465,6 @@ void retn_to_epilog(dynarec_la64_t* dyn, uintptr_t ip, int ninst, rex_t rex, int
469465 MAYUSE (dyn );
470466 MAYUSE (ninst );
471467 MESSAGE (LOG_DUMP , "Retn to epilog\n" );
472- CHECK_DFNONE (0 );
473468 POP1z (xRIP );
474469 if (n > 0x7ff ) {
475470 MOV64x (x1 , n );
@@ -518,7 +513,7 @@ void iret_to_epilog(dynarec_la64_t* dyn, uintptr_t ip, int ninst, int is64bits)
518513 AND (xFlags , xFlags , x1 );
519514 ORI (xFlags , xFlags , 0x2 );
520515 SPILL_EFLAGS ();
521- FORCE_DFNONE ();
516+ SET_DFNONE ();
522517 // POP RSP
523518 if (is64bits ) {
524519 POP1 (x3 ); // rsp
@@ -545,7 +540,6 @@ void iret_to_epilog(dynarec_la64_t* dyn, uintptr_t ip, int ninst, int is64bits)
545540void call_c (dynarec_la64_t * dyn , int ninst , la64_consts_t fnc , int reg , int ret , int saveflags , int savereg , int arg1 , int arg2 , int arg3 , int arg4 , int arg5 , int arg6 )
546541{
547542 MAYUSE (fnc );
548- CHECK_DFNONE (1 );
549543 if (savereg == 0 )
550544 savereg = x87pc ;
551545 if (saveflags ) {
@@ -614,7 +608,6 @@ void call_c(dynarec_la64_t* dyn, int ninst, la64_consts_t fnc, int reg, int ret,
614608void call_n (dynarec_la64_t * dyn , int ninst , void * fnc , int w )
615609{
616610 MAYUSE (fnc );
617- CHECK_DFNONE (1 );
618611 fpu_pushcache (dyn , ninst , x3 , 1 );
619612 ST_D (xRSP , xEmu , offsetof(x64emu_t , regs [_SP ]));
620613 ST_D (xRBP , xEmu , offsetof(x64emu_t , regs [_BP ]));
@@ -2276,44 +2269,31 @@ static void flagsCacheTransform(dynarec_la64_t* dyn, int ninst, int s1)
22762269 int jmp = dyn -> insts [ninst ].x64 .jmp_insts ;
22772270 if (jmp < 0 )
22782271 return ;
2279- if (dyn -> insts [jmp ].f_exit == dyn -> insts [jmp ].f_entry ) // flags will be fully known, nothing we can do more
2272+ if (dyn -> f . dfnone || (( dyn -> insts [jmp ].f_exit . dfnone && ! dyn -> insts [jmp ].f_entry . dfnone ) && ! dyn -> insts [ jmp ]. x64 . use_flags )) // flags are fully known, nothing we can do more
22802273 return ;
22812274 MESSAGE (LOG_DUMP , "\tFlags fetch ---- ninst=%d -> %d\n" , ninst , jmp );
2282- int go_fetch = 0 ;
2283- switch (dyn -> insts [jmp ].f_entry ) {
2284- case status_unk :
2285- if (dyn -> insts [ninst ].f_exit == status_none_pending ) {
2286- FORCE_DFNONE ();
2287- }
2275+ int go = (dyn -> insts [jmp ].f_entry .dfnone && !dyn -> f .dfnone && !dyn -> insts [jmp ].df_notneeded ) ? 1 : 0 ;
2276+ switch (dyn -> insts [jmp ].f_entry .pending ) {
2277+ case SF_UNKNOWN :
2278+ go = 0 ;
22882279 break ;
2289- case status_set :
2290- if (dyn -> insts [ninst ].f_exit == status_none_pending ) {
2291- FORCE_DFNONE ();
2280+ default :
2281+ if (go && !(dyn -> insts [jmp ].x64 .need_before & X_PEND ) && (dyn -> f .pending != SF_UNKNOWN )) {
2282+ // just clear df flags
2283+ go = 0 ;
2284+ ST_W (xZR , xEmu , offsetof(x64emu_t , df ));
22922285 }
2293- if (dyn -> insts [ninst ].f_exit == status_unk )
2294- go_fetch = 1 ;
2295- break ;
2296- case status_none_pending :
2297- if (dyn -> insts [ninst ].f_exit != status_none )
2298- go_fetch = 1 ;
2299- break ;
2300- case status_none :
2301- if (dyn -> insts [ninst ].f_exit == status_none_pending ) {
2302- FORCE_DFNONE ();
2303- } else
2304- go_fetch = 1 ;
23052286 break ;
23062287 }
2307- if (go_fetch ) {
2308- if (dyn -> f == status_unk ) {
2288+ if (go ) {
2289+ if (dyn -> f . pending != SF_PENDING ) {
23092290 LD_WU (s1 , xEmu , offsetof(x64emu_t , df ));
23102291 j64 = (GETMARKF2 ) - (dyn -> native_size );
23112292 BEQZ (s1 , j64 );
23122293 }
23132294 CALL_ (const_updateflags , -1 , 0 , 0 , 0 );
23142295 MARKF2 ;
23152296 }
2316- MESSAGE (LOG_DUMP , "\t---- Flags fetch\n" );
23172297}
23182298
23192299void CacheTransform (dynarec_la64_t * dyn , int ninst , int cacheupd , int s1 , int s2 , int s3 )
0 commit comments