32x, improve poll detection

This commit is contained in:
kub 2021-06-28 22:58:04 +02:00
parent 3368c27707
commit bd07808352
6 changed files with 17 additions and 4 deletions

View file

@ -4417,6 +4417,7 @@ static void REGPARM(2) *sh2_translate(SH2 *sh2, int tcache_id)
EMITH_HINT_COND(DCOND_EQ);
emith_subf_r_r_imm(tmp, tmp2, 1);
emith_set_t_cond(sr, DCOND_EQ);
emith_or_r_imm(sr, SH2_NO_POLLING);
goto end_op;
}
goto default_;

View file

@ -800,6 +800,7 @@ INLINE void DT(sh2_state *sh2, UINT32 n)
sh2->sr |= T;
else
sh2->sr &= ~T;
sh2->no_polling = SH2_NO_POLLING;
#if BUSY_LOOP_HACKS
{
UINT32 next_opcode = (UINT32)(UINT16)RW( sh2, sh2->ppc & AM );

View file

@ -24,9 +24,10 @@ typedef u8 UINT8;
static __inline unsigned int name(SH2 *sh2, unsigned int a) \
{ \
unsigned int ret; \
sh2->sr |= sh2->icount << 12; \
sh2->sr |= (sh2->icount << 12) | (sh2->no_polling); \
ret = cname(a, sh2); \
sh2->icount = (signed int)sh2->sr >> 12; \
sh2->no_polling = (sh2->sr & SH2_NO_POLLING); \
sh2->sr &= 0x3f3; \
return ret; \
}
@ -34,9 +35,10 @@ static __inline unsigned int name(SH2 *sh2, unsigned int a) \
#define MAKE_WRITEFUNC(name, cname) \
static __inline void name(SH2 *sh2, unsigned int a, unsigned int d) \
{ \
sh2->sr |= sh2->icount << 12; \
sh2->sr |= (sh2->icount << 12) | (sh2->no_polling); \
cname(a, d, sh2); \
sh2->icount = (signed int)sh2->sr >> 12; \
sh2->no_polling = (sh2->sr & SH2_NO_POLLING); \
sh2->sr &= 0x3f3; \
}

View file

@ -56,6 +56,9 @@ typedef struct SH2_
uint32_t poll_addr;
int poll_cycles;
int poll_cnt;
// NB MUST be a bit unused in SH2 SR, see also cpu/sh2/compiler.c!
#define SH2_NO_POLLING (1 << 10) // poll detection control
int no_polling;
// DRC branch cache. size must be 2^n and <=128
int rts_cache_idx;