Index: pcsx2/x86/ix86-32/iR5900-32.cpp =================================================================== --- pcsx2/x86/ix86-32/iR5900-32.cpp (revision 1088) +++ pcsx2/x86/ix86-32/iR5900-32.cpp (working copy) @@ -751,6 +751,14 @@ return; addr = HWADDR(addr); + addr -= addr % 16; + size += 3; + size -= size % 3; + + for (u32 a = addr / 16; a < addr / 16 + size / 4; a++) + //vtlb_private::vtlbdata.alloc_bits[a / 32] &= ~(1 << (a & 31)); + vtlb_private::vtlbdata.alloc_bits[a / 32] = 0; + int blockidx = recBlocks.LastIndex(addr + size * 4 - 4); if (blockidx == -1) @@ -1544,66 +1552,29 @@ } else { - // import the vtlbdata (alloc_bits and alloc_base and stuff): using namespace vtlb_private; - + MOV32ItoR(ECX, inpage_ptr); - MOV32ItoR(EDX, pgsz); - - u32 mask=0; - u32 writen=0; - u32 writen_start=0; + MOV32ItoR(EDX, pgsz / 4); - u32 lpc=inpage_ptr; - u32 stg=pgsz; + u32 index = (psM - vtlbdata.alloc_base + inpage_ptr) / 512; + u32 mask = 0; - while(stg>0) - { - u32 bit = (lpc>>4) & 7; - if (mask==0) - { - //writen=bit; - writen_start=(((u8*)PSM(lpc)-vtlbdata.alloc_base)>>4)/8; - } - mask |= 1 << bit; - - if (bit==31) - { - vtlbdata.alloc_bits[writen_start]&=~mask; - xTEST( ptr32[&vtlbdata.alloc_bits[writen_start]], mask ); // auto-optimizes to imm8 when applicable. - xJNZ( dyna_block_discard ); - //SysPrintf("%08X %d %d\n",mask,pgsz,pgsz>>4); + for (u32 bitpos = inpage_ptr / 16, bit = 0; bitpos < (inpage_ptr + pgsz + 15) / 16; bitpos++, bit++) { + if (bit == 32) { + bit = 0; mask = 0; + xTEST(ptr32[&vtlbdata.alloc_bits[index]], mask); + xJNZ(dyna_block_discard); + index++; } - - //writen++; - - if (stg<=16) - { - lpc += stg; - stg = 0; - } - else - { - lpc += 16; - stg -= 16; - } + mask |= 1 << bit; } + xTEST(ptr32[&vtlbdata.alloc_bits[index]], mask); + xJNZ(dyna_block_discard); - if (mask) + if (manual_counter[inpage_ptr >> 12] <= 4) { - vtlbdata.alloc_bits[writen_start] &= ~mask; - xTEST( ptr32[&vtlbdata.alloc_bits[writen_start]], mask ); // auto-optimizes to imm8 when applicable. - xJNZ( dyna_block_discard ); - //SysPrintf("%08X %d %d\n",mask,pgsz,pgsz>>4); - mask = 0; - } - - if( startpc != 0x81fc0 && manual_counter[inpage_ptr >> 12] <= 4 ) - { - // Commented out until we replace it with a smarter algo that only - // recompiles blocks a limited number of times. - xADD(ptr16[&manual_page[inpage_ptr >> 12]], 1); xJC( dyna_page_reset ); }