diff --git a/core/rec-x64/rec_x64.cpp b/core/rec-x64/rec_x64.cpp index 70d15664b..6d00c91bc 100644 --- a/core/rec-x64/rec_x64.cpp +++ b/core/rec-x64/rec_x64.cpp @@ -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()) { diff --git a/core/rec-x64/xbyak_base.h b/core/rec-x64/xbyak_base.h index 8b27d28c6..1a8537e66 100644 --- a/core/rec-x64/xbyak_base.h +++ b/core/rec-x64/xbyak_base.h @@ -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)); diff --git a/core/rec-x86/x86_ops.cpp b/core/rec-x86/x86_ops.cpp index d76885a8a..6376feac3 100644 --- a/core/rec-x86/x86_ops.cpp +++ b/core/rec-x86/x86_ops.cpp @@ -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());