diff --git a/src/dynarmic/backend/arm64/emit_arm64_data_processing.cpp b/src/dynarmic/backend/arm64/emit_arm64_data_processing.cpp index bd37b4c0..b03423f8 100644 --- a/src/dynarmic/backend/arm64/emit_arm64_data_processing.cpp +++ b/src/dynarmic/backend/arm64/emit_arm64_data_processing.cpp @@ -713,8 +713,16 @@ static void EmitAddSub(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* RegAlloc::Realize(Rresult, Ra); ctx.reg_alloc.ReadWriteFlags(args[2], nzcv_inst); - code.MOV(Rscratch0(), imm); - sub ? code.SBCS(Rresult, Ra, Rscratch0()) : code.ADCS(Rresult, Ra, Rscratch0()); + if (imm == 0) { + if constexpr (bitsize == 32) { + sub ? code.SBCS(Rresult, Ra, WZR) : code.ADCS(Rresult, Ra, WZR); + } else { + sub ? code.SBCS(Rresult, Ra, XZR) : code.ADCS(Rresult, Ra, XZR); + } + } else { + code.MOV(Rscratch0(), imm); + sub ? code.SBCS(Rresult, Ra, Rscratch0()) : code.ADCS(Rresult, Ra, Rscratch0()); + } } } else { auto Rb = ctx.reg_alloc.ReadReg(args[1]);