gsdx tc: use unsigned constant

Help the compiler to generate better code

C code:
uint32 addr = (i >> 3u) % MAX_BLOCKS;
uint32 row = addr >> 5u;
uint32 col = 1 << (addr & 31u);

ASM Before
     f48:	mov    eax,esi
     f4a:	mov    ecx,esi
     f4c:	mov    edx,DWORD PTR [ebp+0x8]
     f4f:	sar    eax,0x1f
     f52:	sar    ecx,0x3
     f55:	shr    eax,0x12
     f58:	add    ecx,eax
     f5a:	and    ecx,0x3fff
     f60:	sub    ecx,eax
     f62:	mov    eax,0x1
     f67:	shl    eax,cl
     f69:	shr    ecx,0x5
     f6c:	lea    edx,[edx+ecx*4]

ASM After
     f48:	mov    ecx,edi
     f4a:	mov    eax,0x1
     f4f:	sar    ecx,0x3
     f52:	shl    eax,cl
     f54:	shr    ecx,0x3
     f57:	and    ecx,0x7fc
     f5d:	add    ecx,DWORD PTR [ebp+0x8]
This commit is contained in:
Gregory Hainaut committed 2017-01-30 17:54:29 +01:00
1 parent da054a2aab
commit cf71049bd4
4 files changed
+17 -17

No files matched your search

+9 -9
View File
@@ -1654,18 +1654,18 @@ void GSTextureCache::Source::Update(const GSVector4i& rect, int layer)
{
for(int y = r.top; y < r.bottom; y += bs.y)
{
uint32 base = off->block.row[y >> 3];
uint32 base = off->block.row[y >> 3u];
for(int x = r.left, i = (y << 7) + x; x < r.right; x += bs.x, i += bs.x)
{
uint32 block = base + off->block.col[x >> 3];
uint32 block = base + off->block.col[x >> 3u];
if(block < MAX_BLOCKS || m_wrap_gs_mem)
{
uint32 addr = (i >> 3) % MAX_BLOCKS;
uint32 addr = (i >> 3u) % MAX_BLOCKS;
uint32 row = addr >> 5;
uint32 col = 1 << (addr & 31);
uint32 row = addr >> 5u;
uint32 col = 1 << (addr & 31u);
if((m_valid[row] & col) == 0)
{
@@ -1683,18 +1683,18 @@ void GSTextureCache::Source::Update(const GSVector4i& rect, int layer)
{
for(int y = r.top; y < r.bottom; y += bs.y)
{
uint32 base = off->block.row[y >> 3];
uint32 base = off->block.row[y >> 3u];
for(int x = r.left; x < r.right; x += bs.x)
{
uint32 block = base + off->block.col[x >> 3];
uint32 block = base + off->block.col[x >> 3u];
if(block < MAX_BLOCKS || m_wrap_gs_mem)
{
block %= MAX_BLOCKS;
uint32 row = block >> 5;
uint32 col = 1 << (block & 31);
uint32 row = block >> 5u;
uint32 col = 1 << (block & 31u);
if((m_valid[row] & col) == 0)
{