@@ -349,6 +349,7 @@ 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 );
352353 BR (x2 );
353354}
354355
@@ -368,6 +369,7 @@ void jump_to_epilog_fast(dynarec_la64_t* dyn, uintptr_t ip, int reg, int ninst)
368369 }
369370 TABLE64C (x2 , const_epilog_fast );
370371 SMEND ();
372+ CHECK_DFNONE (0 );
371373 BR (x2 );
372374}
373375
@@ -407,6 +409,7 @@ void jump_to_next(dynarec_la64_t* dyn, uintptr_t ip, int reg, int ninst, int is3
407409 if (is32bits )
408410 ip &= 0xffffffffLL ;
409411
412+ CHECK_DFNONE (0 );
410413 int dest ;
411414 if (reg ) {
412415 if (reg != xRIP ) {
@@ -441,6 +444,7 @@ void ret_to_epilog(dynarec_la64_t* dyn, uintptr_t ip, int ninst, rex_t rex)
441444 MAYUSE (dyn );
442445 MAYUSE (ninst );
443446 MESSAGE (LOG_DUMP , "Ret to epilog\n" );
447+ CHECK_DFNONE (0 );
444448 POP1z (xRIP );
445449 MVz (x1 , xRIP );
446450 SMEND ();
@@ -465,6 +469,7 @@ void retn_to_epilog(dynarec_la64_t* dyn, uintptr_t ip, int ninst, rex_t rex, int
465469 MAYUSE (dyn );
466470 MAYUSE (ninst );
467471 MESSAGE (LOG_DUMP , "Retn to epilog\n" );
472+ CHECK_DFNONE (0 );
468473 POP1z (xRIP );
469474 if (n > 0x7ff ) {
470475 MOV64x (x1 , n );
@@ -513,7 +518,7 @@ void iret_to_epilog(dynarec_la64_t* dyn, uintptr_t ip, int ninst, int is64bits)
513518 AND (xFlags , xFlags , x1 );
514519 ORI (xFlags , xFlags , 0x2 );
515520 SPILL_EFLAGS ();
516- SET_DFNONE ();
521+ FORCE_DFNONE ();
517522 // POP RSP
518523 if (is64bits ) {
519524 POP1 (x3 ); // rsp
@@ -540,6 +545,7 @@ void iret_to_epilog(dynarec_la64_t* dyn, uintptr_t ip, int ninst, int is64bits)
540545void 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 )
541546{
542547 MAYUSE (fnc );
548+ CHECK_DFNONE (1 );
543549 if (savereg == 0 )
544550 savereg = x87pc ;
545551 if (saveflags ) {
@@ -608,6 +614,7 @@ void call_c(dynarec_la64_t* dyn, int ninst, la64_consts_t fnc, int reg, int ret,
608614void call_n (dynarec_la64_t * dyn , int ninst , void * fnc , int w )
609615{
610616 MAYUSE (fnc );
617+ CHECK_DFNONE (1 );
611618 fpu_pushcache (dyn , ninst , x3 , 1 );
612619 ST_D (xRSP , xEmu , offsetof(x64emu_t , regs [_SP ]));
613620 ST_D (xRBP , xEmu , offsetof(x64emu_t , regs [_BP ]));
@@ -2269,31 +2276,44 @@ static void flagsCacheTransform(dynarec_la64_t* dyn, int ninst, int s1)
22692276 int jmp = dyn -> insts [ninst ].x64 .jmp_insts ;
22702277 if (jmp < 0 )
22712278 return ;
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
2279+ if (dyn -> insts [jmp ].f_exit == dyn -> insts [jmp ].f_entry ) // flags will be fully known, nothing we can do more
22732280 return ;
22742281 MESSAGE (LOG_DUMP , "\tFlags fetch ---- ninst=%d -> %d\n" , ninst , jmp );
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 ;
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+ }
22792288 break ;
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 ));
2289+ case status_set :
2290+ if (dyn -> insts [ninst ].f_exit == status_none_pending ) {
2291+ FORCE_DFNONE ();
22852292 }
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 ;
22862305 break ;
22872306 }
2288- if (go ) {
2289- if (dyn -> f . pending != SF_PENDING ) {
2307+ if (go_fetch ) {
2308+ if (dyn -> f == status_unk ) {
22902309 LD_WU (s1 , xEmu , offsetof(x64emu_t , df ));
22912310 j64 = (GETMARKF2 ) - (dyn -> native_size );
22922311 BEQZ (s1 , j64 );
22932312 }
22942313 CALL_ (const_updateflags , -1 , 0 , 0 , 0 );
22952314 MARKF2 ;
22962315 }
2316+ MESSAGE (LOG_DUMP , "\t---- Flags fetch\n" );
22972317}
22982318
22992319void CacheTransform (dynarec_la64_t * dyn , int ninst , int cacheupd , int s1 , int s2 , int s3 )
0 commit comments