From 4d88f5410ec838c4eb287865f83a64611438a2b1 Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 27 Oct 2016 20:49:15 +0200 Subject: [PATCH] JitArm64: Store carry within the host carry flag. --- Source/Core/Core/PowerPC/JitArm64/Jit.cpp | 3 ++ Source/Core/Core/PowerPC/JitArm64/Jit.h | 1 + .../PowerPC/JitArm64/JitArm64_Integer.cpp | 28 +++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp index 977dda4867..4be9fb1a91 100644 --- a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp @@ -54,6 +54,7 @@ void JitArm64::Init() code_block.m_gpa = &js.gpa; code_block.m_fpa = &js.fpa; analyzer.SetOption(PPCAnalyst::PPCAnalyzer::OPTION_CONDITIONAL_CONTINUE); + analyzer.SetOption(PPCAnalyst::PPCAnalyzer::OPTION_CARRY_MERGE); m_supports_cycle_counter = HasCycleCounters(); } @@ -79,6 +80,7 @@ void JitArm64::Shutdown() void JitArm64::FallBackToInterpreter(UGeckoInstruction inst) { + FlushCarry(); gpr.Flush(FlushMode::FLUSH_ALL, js.op); fpr.Flush(FlushMode::FLUSH_ALL, js.op); @@ -419,6 +421,7 @@ const u8* JitArm64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer* code_buf, JitB js.downcountAmount = 0; js.skipInstructions = 0; js.curBlock = b; + js.carryFlagSet = false; PPCAnalyst::CodeOp* ops = code_buf->codebuffer; diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.h b/Source/Core/Core/PowerPC/JitArm64/Jit.h index 60746b580a..3393d12b0d 100644 --- a/Source/Core/Core/PowerPC/JitArm64/Jit.h +++ b/Source/Core/Core/PowerPC/JitArm64/Jit.h @@ -241,6 +241,7 @@ private: void ComputeRC(u64 imm, int crf = 0, bool needs_sext = true); void ComputeCarry(bool Carry); void ComputeCarry(); + void FlushCarry(); void reg_imm(u32 d, u32 a, u32 value, u32 (*do_op)(u32, u32), void (ARM64XEmitter::*op)(ARM64Reg, ARM64Reg, u64, ARM64Reg), bool Rc = false); diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp index 4882f82176..4c6347bb28 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -49,6 +49,8 @@ void JitArm64::ComputeRC(u64 imm, int crf, bool needs_sext) void JitArm64::ComputeCarry(bool Carry) { + js.carryFlagSet = false; + if (!js.op->wantsCA) return; @@ -66,13 +68,31 @@ void JitArm64::ComputeCarry(bool Carry) void JitArm64::ComputeCarry() { + js.carryFlagSet = false; + if (!js.op->wantsCA) return; + js.carryFlagSet = true; + if (MergeAllowedNextInstructions(1) && js.op[1].wantsCAInFlags) + { + return; + } + + FlushCarry(); +} + +void JitArm64::FlushCarry() +{ + if (!js.carryFlagSet) + return; + ARM64Reg WA = gpr.GetReg(); CSINC(WA, WSP, WSP, CC_CC); STRB(INDEX_UNSIGNED, WA, PPC_REG, PPCSTATE_OFF(xer_ca)); gpr.Unlock(WA); + + js.carryFlagSet = false; } void JitArm64::reg_imm(u32 d, u32 a, u32 value, u32 (*do_op)(u32, u32), @@ -732,6 +752,8 @@ void JitArm64::addzex(UGeckoInstruction inst) JITDISABLE(bJITIntegerOff); FALLBACK_IF(inst.OE); + FlushCarry(); + int a = inst.RA, d = inst.RD; if (d == a) @@ -784,6 +806,8 @@ void JitArm64::subfex(UGeckoInstruction inst) JITDISABLE(bJITIntegerOff); FALLBACK_IF(inst.OE); + FlushCarry(); + int a = inst.RA, b = inst.RB, d = inst.RD; if (gpr.IsImm(a) && gpr.IsImm(b)) @@ -875,6 +899,8 @@ void JitArm64::subfzex(UGeckoInstruction inst) JITDISABLE(bJITIntegerOff); FALLBACK_IF(inst.OE); + FlushCarry(); + int a = inst.RA, d = inst.RD; gpr.BindToRegister(d, d == a); @@ -926,6 +952,8 @@ void JitArm64::addex(UGeckoInstruction inst) JITDISABLE(bJITIntegerOff); FALLBACK_IF(inst.OE); + FlushCarry(); + int a = inst.RA, b = inst.RB, d = inst.RD; if (gpr.IsImm(a) && gpr.IsImm(b))