(view as text)
diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp
index 394c7bc..87fb248 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp
@@ -276,7 +276,7 @@ void Jit64::Cleanup()
 		ABI_CallFunctionCCC((void *)&PowerPC::UpdatePerformanceMonitor, js.downcountAmount, jit->js.numLoadStoreInst, jit->js.numFloatingPointInst);
 }
 
-void Jit64::WriteExit(u32 destination, int exit_num)
+void Jit64::WriteExit(u32 destination)
 {
 	Cleanup();
 
@@ -284,8 +284,9 @@ void Jit64::WriteExit(u32 destination, int exit_num)
 
 	//If nobody has taken care of this yet (this can be removed when all branches are done)
 	JitBlock *b = js.curBlock;
-	b->exitAddress[exit_num] = destination;
-	b->exitPtrs[exit_num] = GetWritableCodePtr();
+	JitBlock::LinkData linkData;
+	linkData.exitAddress = destination;
+	linkData.exitPtrs = GetWritableCodePtr();
 
 	// Link opportunity!
 	if (jo.enableBlocklink)
@@ -295,12 +296,14 @@ void Jit64::WriteExit(u32 destination, int exit_num)
 		{
 			// It exists! Joy of joy!
 			JMP(blocks.GetBlock(block)->checkedEntry, true);
-			b->linkStatus[exit_num] = true;
+			linkData.linkStatus = true;
 			return;
 		}
 	}
 	MOV(32, M(&PC), Imm32(destination));
 	JMP(asm_routines.dispatcher, true);
+
+	b->linkData.push_back(linkData);
 }
 
 void Jit64::WriteExitDestInEAX()
@@ -625,7 +628,7 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
 				TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF));
 				FixupBranch noBreakpoint = J_CC(CC_Z);
 
-				WriteExit(ops[i].address, 0);
+				WriteExit(ops[i].address);
 				SetJumpTarget(noBreakpoint);
 			}
 
@@ -707,7 +710,7 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
 	{
 		gpr.Flush(FLUSH_ALL);
 		fpr.Flush(FLUSH_ALL);
-		WriteExit(nextPC, 0);
+		WriteExit(nextPC);
 	}
 
 	b->flags = js.block_flags;
diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit.h b/Source/Core/Core/Src/PowerPC/Jit64/Jit.h
index 8676b1c..b4997be 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64/Jit.h
+++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit.h
@@ -99,7 +99,7 @@ public:
 
 	// Utilities for use by opcodes
 
-	void WriteExit(u32 destination, int exit_num);
+	void WriteExit(u32 destination);
 	void WriteExitDestInEAX();
 	void WriteExceptionExit();
 	void WriteExternalExceptionExit();
diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Branch.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Branch.cpp
index b0f3f1c..a1e28ac 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Branch.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Branch.cpp
@@ -91,7 +91,7 @@ void Jit64::bx(UGeckoInstruction inst)
 		// make idle loops go faster
 		js.downcountAmount += 8;
 	}
-	WriteExit(destination, 0);
+	WriteExit(destination);
 }
 
 // TODO - optimize to hell and beyond
@@ -136,13 +136,13 @@ void Jit64::bcx(UGeckoInstruction inst)
 		destination = SignExt16(inst.BD << 2);
 	else
 		destination = js.compilerPC + SignExt16(inst.BD << 2);
-	WriteExit(destination, 0);
+	WriteExit(destination);
 
 	if ((inst.BO & BO_DONT_CHECK_CONDITION) == 0)
 		SetJumpTarget( pConditionDontBranch );
 	if ((inst.BO & BO_DONT_DECREMENT_FLAG) == 0)
 		SetJumpTarget( pCTRDontBranch );
-	WriteExit(js.compilerPC + 4, 1);
+	WriteExit(js.compilerPC + 4);
 }
 
 void Jit64::bcctrx(UGeckoInstruction inst)
@@ -190,7 +190,7 @@ void Jit64::bcctrx(UGeckoInstruction inst)
 		WriteExitDestInEAX();
 		// Would really like to continue the block here, but it ends. TODO.
 		SetJumpTarget(b);
-		WriteExit(js.compilerPC + 4, 1);
+		WriteExit(js.compilerPC + 4);
 	}
 }
 
@@ -245,5 +245,5 @@ void Jit64::bclrx(UGeckoInstruction inst)
 		SetJumpTarget( pConditionDontBranch );
 	if ((inst.BO & BO_DONT_DECREMENT_FLAG) == 0)
 		SetJumpTarget( pCTRDontBranch );
-	WriteExit(js.compilerPC + 4, 1);
+	WriteExit(js.compilerPC + 4);
 }
diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp
index 244a051..8299f2b 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp
@@ -400,7 +400,7 @@ void Jit64::cmpXX(UGeckoInstruction inst)
 						destination = SignExt16(js.next_inst.BD << 2);
 					else
 						destination = js.next_compilerPC + SignExt16(js.next_inst.BD << 2);
-					WriteExit(destination, 0);
+					WriteExit(destination);
 				}
 				else if ((js.next_inst.OPCD == 19) && (js.next_inst.SUBOP10 == 528)) // bcctrx
 				{
@@ -424,7 +424,7 @@ void Jit64::cmpXX(UGeckoInstruction inst)
 			}
 			else
 			{
-				WriteExit(js.next_compilerPC + 4, 0);
+				WriteExit(js.next_compilerPC + 4);
 			}
 
 			js.cancel = true;
@@ -507,7 +507,7 @@ void Jit64::cmpXX(UGeckoInstruction inst)
 					destination = SignExt16(js.next_inst.BD << 2);
 				else
 					destination = js.next_compilerPC + SignExt16(js.next_inst.BD << 2);
-				WriteExit(destination, 0);
+				WriteExit(destination);
 			}
 			else if ((js.next_inst.OPCD == 19) && (js.next_inst.SUBOP10 == 528)) // bcctrx
 			{
@@ -534,7 +534,7 @@ void Jit64::cmpXX(UGeckoInstruction inst)
 			if (!!(4 & test_bit) == condition) SetJumpTarget(continue2);
 			if (!!(2 & test_bit) == condition) SetJumpTarget(continue1);
 
-			WriteExit(js.next_compilerPC + 4, 1);
+			WriteExit(js.next_compilerPC + 4);
 
 			js.cancel = true;
 		}
@@ -2221,5 +2221,5 @@ void Jit64::twx(UGeckoInstruction inst)
 	SetJumpTarget(exit3);
 	SetJumpTarget(exit4);
 	SetJumpTarget(exit5);
-	WriteExit(js.compilerPC + 4, 1);
+	WriteExit(js.compilerPC + 4);
 }
diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp
index a1c3bd9..1b41c2f 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp
@@ -480,5 +480,5 @@ void Jit64::stmw(UGeckoInstruction inst)
 void Jit64::icbi(UGeckoInstruction inst)
 {
 	Default(inst);
-	WriteExit(js.compilerPC + 4, 0);
+	WriteExit(js.compilerPC + 4);
 }
diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_SystemRegisters.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_SystemRegisters.cpp
index 573feb3..8282758 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_SystemRegisters.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_SystemRegisters.cpp
@@ -137,7 +137,7 @@ void Jit64::mtmsr(UGeckoInstruction inst)
 	SetJumpTarget(noExceptionsPending);
 	SetJumpTarget(eeDisabled);
 
-	WriteExit(js.compilerPC + 4, 0);
+	WriteExit(js.compilerPC + 4);
 
 	js.firstFPInstructionFound = false;
 }
diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp
index 69dc1c2..b086c02 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp
@@ -552,7 +552,8 @@ static void regEmitICmpInst(RegInfo& RI, InstLoc I, CCFlags flag) {
 
 static void regWriteExit(RegInfo& RI, InstLoc dest) {
 	if (isImm(*dest)) {
-		RI.Jit->WriteExit(RI.Build->GetImmValue(dest), RI.exitNumber++);
+		RI.exitNumber++;
+		RI.Jit->WriteExit(RI.Build->GetImmValue(dest));
 	} else {
 		RI.Jit->WriteExitDestInOpArg(regLocForInst(RI, dest));
 	}
@@ -564,7 +565,7 @@ static bool checkIsSNAN() {
 	return MathUtil::IsSNAN(isSNANTemp[0][0]) || MathUtil::IsSNAN(isSNANTemp[1][0]);
 }
 
-static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit) {
+static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, u32 exitAddress) {
 	//printf("Writing block: %x\n", js.blockStart);
 	RegInfo RI(Jit, ibuild->getFirstInst(), ibuild->getNumInsts());
 	RI.Build = ibuild;
@@ -1791,7 +1792,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit) {
 			Jit->ABI_CallFunction(reinterpret_cast<void *>(&PowerPC::CheckBreakPoints));
 			Jit->TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF));
 			FixupBranch noBreakpoint = Jit->J_CC(CC_Z);
-			Jit->WriteExit(InstLoc, 0);
+			Jit->WriteExit(InstLoc);
 			Jit->SetJumpTarget(noBreakpoint);
 			break;
 		}
@@ -1819,10 +1820,10 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit) {
 		}
 	}
 
-	Jit->WriteExit(jit->js.curBlock->exitAddress[0], 0);
+	Jit->WriteExit(exitAddress);
 	Jit->UD2();
 }
 
-void JitIL::WriteCode() {
-	DoWriteCode(&ibuild, this);
+void JitIL::WriteCode(u32 exitAddress) {
+	DoWriteCode(&ibuild, this, exitAddress);
 }
diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp
index d7ccddb..088336c 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp
@@ -379,7 +379,7 @@ void JitIL::Cleanup()
 		ABI_CallFunctionCCC((void *)&PowerPC::UpdatePerformanceMonitor, js.downcountAmount, jit->js.numLoadStoreInst, jit->js.numFloatingPointInst);
 }
 
-void JitIL::WriteExit(u32 destination, int exit_num)
+void JitIL::WriteExit(u32 destination)
 {
 	Cleanup();
 	if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) {
@@ -389,8 +389,9 @@ void JitIL::WriteExit(u32 destination, int exit_num)
 
 	//If nobody has taken care of this yet (this can be removed when all branches are done)
 	JitBlock *b = js.curBlock;
-	b->exitAddress[exit_num] = destination;
-	b->exitPtrs[exit_num] = GetWritableCodePtr();
+	JitBlock::LinkData linkData;
+	linkData.exitAddress = destination;
+	linkData.exitPtrs = GetWritableCodePtr();
 
 	// Link opportunity!
 	int block = blocks.GetBlockNumberFromStartAddress(destination);
@@ -398,13 +399,14 @@ void JitIL::WriteExit(u32 destination, int exit_num)
 	{
 		// It exists! Joy of joy!
 		JMP(blocks.GetBlock(block)->checkedEntry, true);
-		b->linkStatus[exit_num] = true;
+		linkData.linkStatus = true;
 	}
 	else
 	{
 		MOV(32, M(&PC), Imm32(destination));
 		JMP(asm_routines.dispatcher, true);
 	}
+	b->linkData.push_back(linkData);
 }
 
 void JitIL::WriteExitDestInOpArg(const Gen::OpArg& arg)
@@ -539,14 +541,16 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
 
 	// Analyze the block, collect all instructions it is made of (including inlining,
 	// if that is enabled), reorder instructions for optimal performance, and join joinable instructions.
-	b->exitAddress[0] = em_address;
+	u32 exitAddress = em_address;
+	
 	u32 merged_addresses[32];
 	const int capacity_of_merged_addresses = sizeof(merged_addresses) / sizeof(merged_addresses[0]);
 	int size_of_merged_addresses = 0;
 	if (!memory_exception)
 	{
 		// If there is a memory exception inside a block (broken_block==true), compile up to that instruction.
-		b->exitAddress[0] = PPCAnalyst::Flatten(em_address, &size, &js.st, &js.gpa, &js.fpa, broken_block, code_buf, blockSize, merged_addresses, capacity_of_merged_addresses, size_of_merged_addresses);
+		// TODO
+		exitAddress = PPCAnalyst::Flatten(em_address, &size, &js.st, &js.gpa, &js.fpa, broken_block, code_buf, blockSize, merged_addresses, capacity_of_merged_addresses, size_of_merged_addresses);
 	}
 	PPCAnalyst::CodeOp *ops = code_buf->codebuffer;
 
@@ -705,7 +709,7 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
 	}
 
 	// Perform actual code generation
-	WriteCode();
+	WriteCode(exitAddress);
 
 	b->codeSize = (u32)(GetCodePtr() - normalEntry);
 	b->originalSize = size;
diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h
index 3f0e847..8dfbcd5 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h
+++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h
@@ -109,7 +109,7 @@ public:
 
 	// Utilities for use by opcodes
 
-	void WriteExit(u32 destination, int exit_num);
+	void WriteExit(u32 destination);
 	void WriteExitDestInOpArg(const Gen::OpArg& arg);
 	void WriteExceptionExit();
 	void WriteRfiExitDestInOpArg(const Gen::OpArg& arg);
@@ -125,7 +125,7 @@ public:
 	void regimmop(int d, int a, bool binary, u32 value, Operation doop, void (Gen::XEmitter::*op)(int, const Gen::OpArg&, const Gen::OpArg&), bool Rc = false, bool carry = false);
 	void fp_tri_op(int d, int a, int b, bool reversible, bool dupe, void (Gen::XEmitter::*op)(Gen::X64Reg, Gen::OpArg));
 
-	void WriteCode();
+	void WriteCode(u32 exitAddress);
 
 	// OPCODES
 	void unknown_instruction(UGeckoInstruction _inst) override;
diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/Jit.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/Jit.cpp
index 4083a38..eab7f37 100644
--- a/Source/Core/Core/Src/PowerPC/JitArm32/Jit.cpp
+++ b/Source/Core/Core/Src/PowerPC/JitArm32/Jit.cpp
@@ -186,15 +186,16 @@ void JitArm::WriteExceptionExit()
 	MOVI2R(A, (u32)asm_routines.testExceptions);
 	B(A);
 }
-void JitArm::WriteExit(u32 destination, int exit_num)
+void JitArm::WriteExit(u32 destination)
 {
 	Cleanup();
 
 	DoDownCount();
 	//If nobody has taken care of this yet (this can be removed when all branches are done)
 	JitBlock *b = js.curBlock;
-	b->exitAddress[exit_num] = destination;
-	b->exitPtrs[exit_num] = GetWritableCodePtr();
+	JitBlock::LinkData linkData;
+	linkData.exitAddress = destination;
+	linkData.exitPtrs = GetWritableCodePtr();
 
 	// Link opportunity!
 	int block = blocks.GetBlockNumberFromStartAddress(destination);
@@ -202,7 +203,7 @@ void JitArm::WriteExit(u32 destination, int exit_num)
 	{
 		// It exists! Joy of joy!
 		B(blocks.GetBlock(block)->checkedEntry);
-		b->linkStatus[exit_num] = true;
+		linkData.linkStatus = true;
 	}
 	else
 	{
@@ -212,6 +213,8 @@ void JitArm::WriteExit(u32 destination, int exit_num)
 		MOVI2R(A, (u32)asm_routines.dispatcher);
 		B(A);
 	}
+
+	b->linkData.push_back(linkData);
 }
 
 void STACKALIGN JitArm::Run()
@@ -496,7 +499,7 @@ const u8* JitArm::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBlo
 	if	(broken_block)
 	{
 		printf("Broken Block going to 0x%08x\n", nextPC);
-		WriteExit(nextPC, 0);
+		WriteExit(nextPC);
 	}
 
 	b->flags = js.block_flags;
diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/Jit.h b/Source/Core/Core/Src/PowerPC/JitArm32/Jit.h
index fc1911c..4d1d2d8 100644
--- a/Source/Core/Core/Src/PowerPC/JitArm32/Jit.h
+++ b/Source/Core/Core/Src/PowerPC/JitArm32/Jit.h
@@ -109,7 +109,7 @@ public:
 
 	// Utilities for use by opcodes
 
-	void WriteExit(u32 destination, int exit_num);
+	void WriteExit(u32 destination);
 	void WriteExitDestInR(ARMReg Reg);
 	void WriteRfiExitDestInR(ARMReg Reg);
 	void WriteExceptionExit();
diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Branch.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Branch.cpp
index 1879e4a..c70a2b2 100644
--- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Branch.cpp
+++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Branch.cpp
@@ -152,7 +152,7 @@ void JitArm::bx(UGeckoInstruction inst)
 		MOVI2R(R14, (u32)asm_routines.testExceptions);
 		B(R14);
 	}
-	WriteExit(destination, 0);
+	WriteExit(destination);
 }
 
 void JitArm::bcx(UGeckoInstruction inst)
@@ -207,14 +207,14 @@ void JitArm::bcx(UGeckoInstruction inst)
 		destination = SignExt16(inst.BD << 2);
 	else
 		destination = js.compilerPC + SignExt16(inst.BD << 2);
-	WriteExit(destination, 0);
+	WriteExit(destination);
 
 	if ((inst.BO & BO_DONT_CHECK_CONDITION) == 0)
 		SetJumpTarget( pConditionDontBranch );
 	if ((inst.BO & BO_DONT_DECREMENT_FLAG) == 0)
 		SetJumpTarget( pCTRDontBranch );
 
-	WriteExit(js.compilerPC + 4, 1);
+	WriteExit(js.compilerPC + 4);
 }
 void JitArm::bcctrx(UGeckoInstruction inst)
 {
@@ -276,7 +276,7 @@ void JitArm::bcctrx(UGeckoInstruction inst)
 		WriteExitDestInR(rA);
 
 		SetJumpTarget(b);
-		WriteExit(js.compilerPC + 4, 1);
+		WriteExit(js.compilerPC + 4);
 	}
 }
 void JitArm::bclrx(UGeckoInstruction inst)
@@ -350,5 +350,5 @@ void JitArm::bclrx(UGeckoInstruction inst)
 		SetJumpTarget( pConditionDontBranch );
 	if ((inst.BO & BO_DONT_DECREMENT_FLAG) == 0)
 		SetJumpTarget( pCTRDontBranch );
-	WriteExit(js.compilerPC + 4, 1);
+	WriteExit(js.compilerPC + 4);
 }
diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStore.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStore.cpp
index f04c88d..3983772 100644
--- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStore.cpp
+++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStore.cpp
@@ -531,6 +531,6 @@ void JitArm::dcbst(UGeckoInstruction inst)
 void JitArm::icbi(UGeckoInstruction inst)
 {
 	Default(inst);
-	WriteExit(js.compilerPC + 4, 0);
+	WriteExit(js.compilerPC + 4);
 }
 
diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_SystemRegisters.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_SystemRegisters.cpp
index e4ab630..62b15e1 100644
--- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_SystemRegisters.cpp
+++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_SystemRegisters.cpp
@@ -205,7 +205,7 @@ void JitArm::mtmsr(UGeckoInstruction inst)
 	gpr.Flush();
 	fpr.Flush();
 
-	WriteExit(js.compilerPC + 4, 0);
+	WriteExit(js.compilerPC + 4);
 }
 
 void JitArm::mfmsr(UGeckoInstruction inst)
diff --git a/Source/Core/Core/Src/PowerPC/JitArmIL/IR_Arm.cpp b/Source/Core/Core/Src/PowerPC/JitArmIL/IR_Arm.cpp
index 10620d9..c1bee50 100644
--- a/Source/Core/Core/Src/PowerPC/JitArmIL/IR_Arm.cpp
+++ b/Source/Core/Core/Src/PowerPC/JitArmIL/IR_Arm.cpp
@@ -156,7 +156,8 @@ static ARMReg regEnsureInReg(RegInfo& RI, InstLoc I) {
 
 static void regWriteExit(RegInfo& RI, InstLoc dest) {
 	if (isImm(*dest)) {
-		RI.Jit->WriteExit(RI.Build->GetImmValue(dest), RI.exitNumber++);
+		RI.exitNumber++;
+		RI.Jit->WriteExit(RI.Build->GetImmValue(dest));
 	} else {
 		RI.Jit->WriteExitDestInReg(regLocForInst(RI, dest));
 	}
@@ -281,7 +282,7 @@ static void regEmitCmp(RegInfo& RI, InstLoc I) {
 	}
 }
 
-static void DoWriteCode(IRBuilder* ibuild, JitArmIL* Jit) {
+static void DoWriteCode(IRBuilder* ibuild, JitArmIL* Jit, u32 exitAddress) {
 	RegInfo RI(Jit, ibuild->getFirstInst(), ibuild->getNumInsts());
 	RI.Build = ibuild;
 
@@ -733,10 +734,10 @@ static void DoWriteCode(IRBuilder* ibuild, JitArmIL* Jit) {
 		}
 	}
 
-	Jit->WriteExit(jit->js.curBlock->exitAddress[0], 0);
+	Jit->WriteExit(exitAddress);
 	Jit->BKPT(0x111);
 
 }
-void JitArmIL::WriteCode() {
-	DoWriteCode(&ibuild, this);
+void JitArmIL::WriteCode(u32 exitAddress) {
+	DoWriteCode(&ibuild, this, exitAddress);
 }
diff --git a/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL.cpp b/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL.cpp
index 0aac4d6..44ebc8b 100644
--- a/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL.cpp
+++ b/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL.cpp
@@ -117,13 +117,14 @@ void JitArmIL::WriteExceptionExit()
 	MOVI2R(R14, (u32)asm_routines.testExceptions);
 	B(R14);
 }
-void JitArmIL::WriteExit(u32 destination, int exit_num)
+void JitArmIL::WriteExit(u32 destination)
 {
 	DoDownCount();
 	//If nobody has taken care of this yet (this can be removed when all branches are done)
 	JitBlock *b = js.curBlock;
-	b->exitAddress[exit_num] = destination;
-	b->exitPtrs[exit_num] = GetWritableCodePtr();
+	JitBlock::LinkData linkData;
+	linkData.exitAddress = destination;
+	linkData.exitPtrs = GetWritableCodePtr();
 
 	// Link opportunity!
 	int block = blocks.GetBlockNumberFromStartAddress(destination);
@@ -131,7 +132,7 @@ void JitArmIL::WriteExit(u32 destination, int exit_num)
 	{
 		// It exists! Joy of joy!
 		B(blocks.GetBlock(block)->checkedEntry);
-		b->linkStatus[exit_num] = true;
+		linkData.linkStatus = true;
 	}
 	else
 	{
@@ -140,6 +141,8 @@ void JitArmIL::WriteExit(u32 destination, int exit_num)
 		MOVI2R(R14, (u32)asm_routines.dispatcher);
 		B(R14);
 	}
+
+	b->linkData.push_back(linkData);
 }
 void JitArmIL::PrintDebug(UGeckoInstruction inst, u32 level)
 {
@@ -347,12 +350,12 @@ const u8* JitArmIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitB
 	if	(broken_block)
 	{
 		printf("Broken Block going to 0x%08x\n", nextPC);
-		WriteExit(nextPC, 0);
+		WriteExit(nextPC);
 	}
 
 	// Perform actual code generation
 
-	WriteCode();
+	WriteCode(nextPC);
 	b->flags = js.block_flags;
 	b->codeSize = (u32)(GetCodePtr() - normalEntry);
 	b->originalSize = size;
diff --git a/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL.h b/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL.h
index 4dec87d..71b09a3 100644
--- a/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL.h
+++ b/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL.h
@@ -64,8 +64,8 @@ public:
 	void Run();
 	void SingleStep();
 	//
-	void WriteCode();
-	void WriteExit(u32 destination, int exit_num);
+	void WriteCode(u32 exitAddress);
+	void WriteExit(u32 destination);
 	void WriteExitDestInReg(ARMReg Reg);
 	void WriteRfiExitDestInR(ARMReg Reg);
 	void WriteExceptionExit();
diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.cpp b/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.cpp
index d7c78d9..b81dadd 100644
--- a/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.cpp
+++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.cpp
@@ -35,8 +35,6 @@ op_agent_t agent;
 
 using namespace Gen;
 
-#define INVALID_EXIT 0xFFFFFFFF
-
 	bool JitBaseBlockCache::IsFull() const
 	{
 		return GetNumBlocks() >= MAX_NUM_BLOCKS - 1;
@@ -167,12 +165,6 @@ using namespace Gen;
 		JitBlock &b = blocks[num_blocks];
 		b.invalid = false;
 		b.originalAddress = em_address;
-		b.exitAddress[0] = INVALID_EXIT;
-		b.exitAddress[1] = INVALID_EXIT;
-		b.exitPtrs[0] = 0;
-		b.exitPtrs[1] = 0;
-		b.linkStatus[0] = false;
-		b.linkStatus[1] = false;
 		num_blocks++; //commit the current block
 		return num_blocks - 1;
 	}
@@ -193,10 +185,9 @@ using namespace Gen;
 		block_map[std::make_pair(pAddr + 4 * b.originalSize - 1, pAddr)] = block_num;
 		if (block_link)
 		{
-			for (int i = 0; i < 2; i++)
+			for (const auto& e : b.linkData)
 			{
-				if (b.exitAddress[i] != INVALID_EXIT)
-					links_to.insert(std::pair<u32, int>(b.exitAddress[i], block_num));
+				links_to.insert(std::pair<u32, int>(e.exitAddress, block_num));
 			}
 
 			LinkBlock(block_num);
@@ -275,15 +266,15 @@ using namespace Gen;
 			// This block is dead. Don't relink it.
 			return;
 		}
-		for (int e = 0; e < 2; e++)
+		for (auto& e : b.linkData)
 		{
-			if (b.exitAddress[e] != INVALID_EXIT && !b.linkStatus[e])
+			if (!e.linkStatus)
 			{
-				int destinationBlock = GetBlockNumberFromStartAddress(b.exitAddress[e]);
+				int destinationBlock = GetBlockNumberFromStartAddress(e.exitAddress);
 				if (destinationBlock != -1)
 				{
-					WriteLinkBlock(b.exitPtrs[e], blocks[destinationBlock].checkedEntry);
-					b.linkStatus[e] = true;
+					WriteLinkBlock(e.exitPtrs, blocks[destinationBlock].checkedEntry);
+					e.linkStatus = true;
 				}
 			}
 		}
@@ -316,10 +307,10 @@ using namespace Gen;
 			return;
 		for (multimap<u32, int>::iterator iter = ppp.first; iter != ppp.second; ++iter) {
 			JitBlock &sourceBlock = blocks[iter->second];
-			for (int e = 0; e < 2; e++)
+			for (auto& e : sourceBlock.linkData)
 			{
-				if (sourceBlock.exitAddress[e] == b.originalAddress)
-					sourceBlock.linkStatus[e] = false;
+				if (e.exitAddress == b.originalAddress)
+					e.linkStatus = false;
 			}
 		}
 	}
diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.h b/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.h
index b81c5d8..ffbffaa 100644
--- a/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.h
+++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.h
@@ -35,9 +35,6 @@ struct JitBlock
 	const u8 *checkedEntry;
 	const u8 *normalEntry;
 
-	u8 *exitPtrs[2];     // to be able to rewrite the exit jum
-	u32 exitAddress[2];  // 0xFFFFFFFF == unknown
-
 	u32 originalAddress;
 	u32 codeSize;
 	u32 originalSize;
@@ -45,7 +42,13 @@ struct JitBlock
 	int flags;
 
 	bool invalid;
-	bool linkStatus[2];
+
+	struct LinkData {
+		u8 *exitPtrs;    // to be able to rewrite the exit jum
+		u32 exitAddress;
+		bool linkStatus; // is it already linked?
+	};
+	std::vector<LinkData> linkData;
 
 #ifdef _WIN32
 	// we don't really need to save start and stop