From 2ee3eacd01ad83eedb2a46ec0f2c6d42499917c2 Mon Sep 17 00:00:00 2001 From: Merry Date: Mon, 29 Jan 2024 22:40:49 +0000 Subject: [PATCH] emit_x64_crc32: Correct use of x64 crc32 instruction CRC32 r32, r/m64 variant does not exist, but CRC r64, r/m64 does what we want. --- src/dynarmic/backend/x64/emit_x64_crc32.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/dynarmic/backend/x64/emit_x64_crc32.cpp b/src/dynarmic/backend/x64/emit_x64_crc32.cpp index 6ad4c489..842a8612 100644 --- a/src/dynarmic/backend/x64/emit_x64_crc32.cpp +++ b/src/dynarmic/backend/x64/emit_x64_crc32.cpp @@ -22,7 +22,13 @@ static void EmitCRC32Castagnoli(BlockOfCode& code, EmitContext& ctx, IR::Inst* i if (code.HasHostFeature(HostFeature::SSE42)) { const Xbyak::Reg32 crc = ctx.reg_alloc.UseScratchGpr(args[0]).cvt32(); const Xbyak::Reg value = ctx.reg_alloc.UseGpr(args[1]).changeBit(data_size); - code.crc32(crc, value); + + if (data_size != 64) { + code.crc32(crc, value); + } else { + code.crc32(crc.cvt64(), value); + } + ctx.reg_alloc.DefineValue(inst, crc); return; }