From 75235ffedb5a0eccfe31f58480c84187706e1ecb Mon Sep 17 00:00:00 2001 From: Merry Date: Wed, 31 Jan 2024 01:41:25 +0000 Subject: [PATCH] emit_x64_data_processing: Exclude edge case from lea path in EmitSub -0xffff'ffff'8000'0000 = 0x0000'0000'8000'0000 which is not a representable displacement --- src/dynarmic/backend/x64/emit_x64_data_processing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dynarmic/backend/x64/emit_x64_data_processing.cpp b/src/dynarmic/backend/x64/emit_x64_data_processing.cpp index e271317b..98197c2d 100644 --- a/src/dynarmic/backend/x64/emit_x64_data_processing.cpp +++ b/src/dynarmic/backend/x64/emit_x64_data_processing.cpp @@ -1014,7 +1014,7 @@ static void EmitSub(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, int bit const bool is_cmp = inst->UseCount() == size_t(!!carry_inst + !!overflow_inst + !!nzcv_inst) && carry_in.IsImmediate() && carry_in.GetImmediateU1(); // Consider using LEA. - if (!carry_inst && !overflow_inst && !nzcv_inst && carry_in.IsImmediate() && carry_in.GetImmediateU1() && args[1].IsImmediate() && args[1].FitsInImmediateS32()) { + if (!carry_inst && !overflow_inst && !nzcv_inst && carry_in.IsImmediate() && carry_in.GetImmediateU1() && args[1].IsImmediate() && args[1].FitsInImmediateS32() && args[1].GetImmediateS32() != 0xffff'ffff'8000'0000) { const Xbyak::Reg op1 = ctx.reg_alloc.UseGpr(args[0]).changeBit(bitsize); const Xbyak::Reg result = ctx.reg_alloc.ScratchGpr().changeBit(bitsize);