x64: use eax instead of ecx for mem reads return value

This commit is contained in:
Flyinghead 2019-06-10 14:48:54 +02:00
parent f81ff3fe21
commit 2c3b516341
1 changed files with 15 additions and 18 deletions

View File

@ -477,20 +477,20 @@ public:
u32 size = op.flags & 0x7f;
if (size != 8)
host_reg_to_shil_param(op.rd, ecx);
host_reg_to_shil_param(op.rd, eax);
else {
#ifdef EXPLODE_SPANS
if (op.rd.count() == 2 && regalloc.IsAllocf(op.rd, 0) && regalloc.IsAllocf(op.rd, 1))
{
movd(regalloc.MapXRegister(op.rd, 0), ecx);
shr(rcx, 32);
movd(regalloc.MapXRegister(op.rd, 1), ecx);
movd(regalloc.MapXRegister(op.rd, 0), eax);
shr(rax, 32);
movd(regalloc.MapXRegister(op.rd, 1), eax);
}
else
#endif
{
mov(rax, (uintptr_t)op.rd.reg_ptr());
mov(qword[rax], rcx);
mov(rcx, (uintptr_t)op.rd.reg_ptr());
mov(qword[rcx], rax);
}
}
}
@ -1260,14 +1260,14 @@ public:
GenCall(ReadMem8);
else
GenCall(ReadMemNoEx<u8>, true);
movsx(ecx, al);
movsx(eax, al);
break;
case 2:
if (!mmu_enabled())
GenCall(ReadMem16);
else
GenCall(ReadMemNoEx<u16>, true);
movsx(ecx, ax);
movsx(eax, ax);
break;
case 4:
@ -1275,14 +1275,12 @@ public:
GenCall(ReadMem32);
else
GenCall(ReadMemNoEx<u32>, true);
mov(ecx, eax);
break;
case 8:
if (!mmu_enabled())
GenCall(ReadMem64);
else
GenCall(ReadMemNoEx<u64>, true);
mov(rcx, rax);
break;
default:
die("1..8 bytes");
@ -1560,24 +1558,23 @@ private:
{
case 1:
GenCall((void (*)())ptr);
movsx(ecx, al);
movsx(eax, al);
break;
case 2:
GenCall((void (*)())ptr);
movsx(ecx, ax);
movsx(eax, ax);
break;
case 4:
GenCall((void (*)())ptr);
mov(ecx, eax);
break;
default:
die("Invalid immediate size");
break;
}
host_reg_to_shil_param(op.rd, ecx);
host_reg_to_shil_param(op.rd, eax);
}
return true;
@ -1722,19 +1719,19 @@ private:
switch (size)
{
case 1:
movsx(ecx, byte[rax + call_regs64[0]]);
movsx(eax, byte[rax + call_regs64[0]]);
break;
case 2:
movsx(ecx, word[rax + call_regs64[0]]);
movsx(eax, word[rax + call_regs64[0]]);
break;
case 4:
mov(ecx, dword[rax + call_regs64[0]]);
mov(eax, dword[rax + call_regs64[0]]);
break;
case 8:
mov(rcx, qword[rax + call_regs64[0]]);
mov(rax, qword[rax + call_regs64[0]]);
break;
default: