aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/Instruction
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-03-04 14:09:59 -0300
committerGitHub <noreply@github.com>2018-03-04 14:09:59 -0300
commit3edb66f389ac279bdcde26c5682aa39b9bf5f853 (patch)
treeb3082b45648417a289ba10c2b40f6c134b93fa98 /ChocolArm64/Instruction
parentee9df32e3e13fe982c8154a6454566c8edfa13d3 (diff)
Improve CPU initial translation speeds (#50)
* Add background translation to the CPU * Do not use a separate thread for translation, implement 2 tiers translation * Remove unnecessary usings * Lower MinCallCountForReJit * Remove unused variable
Diffstat (limited to 'ChocolArm64/Instruction')
-rw-r--r--ChocolArm64/Instruction/AInstEmitException.cs13
-rw-r--r--ChocolArm64/Instruction/AInstEmitFlow.cs81
2 files changed, 86 insertions, 8 deletions
diff --git a/ChocolArm64/Instruction/AInstEmitException.cs b/ChocolArm64/Instruction/AInstEmitException.cs
index 209ba56f..fe348edd 100644
--- a/ChocolArm64/Instruction/AInstEmitException.cs
+++ b/ChocolArm64/Instruction/AInstEmitException.cs
@@ -2,6 +2,7 @@ using ChocolArm64.Decoder;
using ChocolArm64.State;
using ChocolArm64.Translation;
using System.Reflection;
+using System.Reflection.Emit;
namespace ChocolArm64.Instruction
{
@@ -37,6 +38,12 @@ namespace ChocolArm64.Instruction
{
Context.EmitLoadState(Context.CurrBlock.Next);
}
+ else
+ {
+ Context.EmitLdc_I8(Op.Position + 4);
+
+ Context.Emit(OpCodes.Ret);
+ }
}
public static void Und(AILEmitterCtx Context)
@@ -60,6 +67,12 @@ namespace ChocolArm64.Instruction
{
Context.EmitLoadState(Context.CurrBlock.Next);
}
+ else
+ {
+ Context.EmitLdc_I8(Op.Position + 4);
+
+ Context.Emit(OpCodes.Ret);
+ }
}
}
} \ No newline at end of file
diff --git a/ChocolArm64/Instruction/AInstEmitFlow.cs b/ChocolArm64/Instruction/AInstEmitFlow.cs
index be68aa6c..91262834 100644
--- a/ChocolArm64/Instruction/AInstEmitFlow.cs
+++ b/ChocolArm64/Instruction/AInstEmitFlow.cs
@@ -11,14 +11,24 @@ namespace ChocolArm64.Instruction
{
AOpCodeBImmAl Op = (AOpCodeBImmAl)Context.CurrOp;
- Context.Emit(OpCodes.Br, Context.GetLabel(Op.Imm));
+ if (Context.CurrBlock.Branch != null)
+ {
+ Context.Emit(OpCodes.Br, Context.GetLabel(Op.Imm));
+ }
+ else
+ {
+ Context.EmitStoreState();
+ Context.EmitLdc_I8(Op.Imm);
+
+ Context.Emit(OpCodes.Ret);
+ }
}
public static void B_Cond(AILEmitterCtx Context)
{
AOpCodeBImmCond Op = (AOpCodeBImmCond)Context.CurrOp;
- Context.EmitCondBranch(Context.GetLabel(Op.Imm), Op.Cond);
+ EmitBranch(Context, Op.Cond);
}
public static void Bl(AILEmitterCtx Context)
@@ -48,10 +58,7 @@ namespace ChocolArm64.Instruction
Context.Emit(OpCodes.Pop);
- if (Context.CurrBlock.Next != null)
- {
- Context.EmitLoadState(Context.CurrBlock.Next);
- }
+ Context.EmitLoadState(Context.CurrBlock.Next);
}
else
{
@@ -93,7 +100,7 @@ namespace ChocolArm64.Instruction
Context.EmitLdintzr(Op.Rt);
Context.EmitLdc_I(0);
- Context.Emit(ILOp, Context.GetLabel(Op.Imm));
+ EmitBranch(Context, ILOp);
}
public static void Ret(AILEmitterCtx Context)
@@ -118,7 +125,65 @@ namespace ChocolArm64.Instruction
Context.EmitLdc_I(0);
- Context.Emit(ILOp, Context.GetLabel(Op.Imm));
+ EmitBranch(Context, ILOp);
+ }
+
+ private static void EmitBranch(AILEmitterCtx Context, ACond Cond)
+ {
+ AOpCodeBImm Op = (AOpCodeBImm)Context.CurrOp;
+
+ if (Context.CurrBlock.Next != null &&
+ Context.CurrBlock.Branch != null)
+ {
+ Context.EmitCondBranch(Context.GetLabel(Op.Imm), Cond);
+ }
+ else
+ {
+ Context.EmitStoreState();
+
+ AILLabel LblTaken = new AILLabel();
+
+ Context.EmitCondBranch(LblTaken, Cond);
+
+ Context.EmitLdc_I8(Op.Position + 4);
+
+ Context.Emit(OpCodes.Ret);
+
+ Context.MarkLabel(LblTaken);
+
+ Context.EmitLdc_I8(Op.Imm);
+
+ Context.Emit(OpCodes.Ret);
+ }
+ }
+
+ private static void EmitBranch(AILEmitterCtx Context, OpCode ILOp)
+ {
+ AOpCodeBImm Op = (AOpCodeBImm)Context.CurrOp;
+
+ if (Context.CurrBlock.Next != null &&
+ Context.CurrBlock.Branch != null)
+ {
+ Context.Emit(ILOp, Context.GetLabel(Op.Imm));
+ }
+ else
+ {
+ Context.EmitStoreState();
+
+ AILLabel LblTaken = new AILLabel();
+
+ Context.Emit(ILOp, LblTaken);
+
+ Context.EmitLdc_I8(Op.Position + 4);
+
+ Context.Emit(OpCodes.Ret);
+
+ Context.MarkLabel(LblTaken);
+
+ Context.EmitLdc_I8(Op.Imm);
+
+ Context.Emit(OpCodes.Ret);
+ }
}
}
} \ No newline at end of file