x64 rec: mul_s64 fix

GTA2 hang on start
This commit is contained in:
Flyinghead 2021-01-31 17:31:47 +01:00
parent a71c897d56
commit 3dfe4f96fa
3 changed files with 23 additions and 22 deletions

View File

@ -513,6 +513,18 @@ public:
}
break;
case shop_mul_s64:
movsxd(rax, regalloc.MapRegister(op.rs1));
if (op.rs2.is_reg())
movsxd(rcx, regalloc.MapRegister(op.rs2));
else
mov(rcx, (s64)(s32)op.rs2._imm);
mul(rcx);
mov(regalloc.MapRegister(op.rd), eax);
shr(rax, 32);
mov(regalloc.MapRegister(op.rd2), eax);
break;
case shop_pref:
if (op.rs1.is_imm())
{

View File

@ -432,28 +432,6 @@ protected:
mov(mapRegister(op.rd2), edx);
}
break;
case shop_mul_s64:
mov(eax, mapRegister(op.rs1));
if (op.rs2.is_reg())
mov(edx, mapRegister(op.rs2));
else
mov(edx, (s64)(s32)op.rs2._imm);
if (ArchX64)
{
#ifndef XBYAK32
mul(rdx);
mov(mapRegister(op.rd), eax);
shr(rax, 32);
mov(mapRegister(op.rd2), eax);
#endif
}
else
{
imul(edx);
mov(mapRegister(op.rd), eax);
mov(mapRegister(op.rd2), edx);
}
break;
case shop_ext_s8:
mov(eax, mapRegister(op.rs1));

View File

@ -400,6 +400,17 @@ void X86Compiler::genOpcode(RuntimeBlockInfo* block, bool optimise, shil_opcode&
}
break;
case shop_mul_s64:
mov(eax, mapRegister(op.rs1));
if (op.rs2.is_reg())
mov(edx, mapRegister(op.rs2));
else
mov(edx, (s64)(s32)op.rs2._imm);
imul(edx);
mov(mapRegister(op.rd), eax);
mov(mapRegister(op.rd2), edx);
break;
case shop_frswap:
mov(eax, (uintptr_t)op.rs1.reg_ptr());
mov(ecx, (uintptr_t)op.rd.reg_ptr());