aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/TranslatedSub.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2019-02-04 18:26:05 -0300
committerGitHub <noreply@github.com>2019-02-04 18:26:05 -0300
commita694420d11ef74e4f0bf473be2b6f64635bc89c7 (patch)
tree6c44e7a0633dca7b54d99ac3f01f0648fa602559 /ChocolArm64/TranslatedSub.cs
parentf5b4f6ccc4815cfac1fa3c103d8941a26d152d8a (diff)
Implement speculative translation on the CPU (#515)
* Implement speculative translation on the cpu, and change the way how branches to unknown or untranslated addresses works * Port t0opt changes and other cleanups * Change namespace from translation related classes to ChocolArm64.Translation, other minor tweaks * Fix typo * Translate higher quality code for indirect jumps aswell, and on some cases that were missed when lower quality (tier 0) code was available * Remove debug print * Remove direct argument passing optimization, and enable tail calls for BR instructions * Call delegates directly with Callvirt rather than calling Execute, do not emit calls for tier 0 code * Remove unused property * Rename argument on ArmSubroutine delegate
Diffstat (limited to 'ChocolArm64/TranslatedSub.cs')
-rw-r--r--ChocolArm64/TranslatedSub.cs140
1 files changed, 0 insertions, 140 deletions
diff --git a/ChocolArm64/TranslatedSub.cs b/ChocolArm64/TranslatedSub.cs
deleted file mode 100644
index 653abcca..00000000
--- a/ChocolArm64/TranslatedSub.cs
+++ /dev/null
@@ -1,140 +0,0 @@
-using ChocolArm64.Memory;
-using ChocolArm64.State;
-using System;
-using System.Collections.Generic;
-using System.Collections.ObjectModel;
-using System.Linq;
-using System.Reflection;
-using System.Reflection.Emit;
-
-namespace ChocolArm64
-{
- class TranslatedSub
- {
- private delegate long Aa64Subroutine(CpuThreadState register, MemoryManager memory);
-
- private const int MinCallCountForReJit = 250;
-
- private Aa64Subroutine _execDelegate;
-
- public static int StateArgIdx { get; private set; }
- public static int MemoryArgIdx { get; private set; }
-
- public static Type[] FixedArgTypes { get; private set; }
-
- public DynamicMethod Method { get; private set; }
-
- public ReadOnlyCollection<Register> SubArgs { get; private set; }
-
- private HashSet<long> _callers;
-
- private TranslatedSubType _type;
-
- private int _callCount;
-
- private bool _needsReJit;
-
- public TranslatedSub(DynamicMethod method, List<Register> subArgs)
- {
- Method = method ?? throw new ArgumentNullException(nameof(method));;
- SubArgs = subArgs?.AsReadOnly() ?? throw new ArgumentNullException(nameof(subArgs));
-
- _callers = new HashSet<long>();
-
- PrepareDelegate();
- }
-
- static TranslatedSub()
- {
- MethodInfo mthdInfo = typeof(Aa64Subroutine).GetMethod("Invoke");
-
- ParameterInfo[] Params = mthdInfo.GetParameters();
-
- FixedArgTypes = new Type[Params.Length];
-
- for (int index = 0; index < Params.Length; index++)
- {
- Type paramType = Params[index].ParameterType;
-
- FixedArgTypes[index] = paramType;
-
- if (paramType == typeof(CpuThreadState))
- {
- StateArgIdx = index;
- }
- else if (paramType == typeof(MemoryManager))
- {
- MemoryArgIdx = index;
- }
- }
- }
-
- private void PrepareDelegate()
- {
- string name = $"{Method.Name}_Dispatch";
-
- DynamicMethod mthd = new DynamicMethod(name, typeof(long), FixedArgTypes);
-
- ILGenerator generator = mthd.GetILGenerator();
-
- generator.EmitLdargSeq(FixedArgTypes.Length);
-
- foreach (Register reg in SubArgs)
- {
- generator.EmitLdarg(StateArgIdx);
-
- generator.Emit(OpCodes.Ldfld, reg.GetField());
- }
-
- generator.Emit(OpCodes.Call, Method);
- generator.Emit(OpCodes.Ret);
-
- _execDelegate = (Aa64Subroutine)mthd.CreateDelegate(typeof(Aa64Subroutine));
- }
-
- public bool ShouldReJit()
- {
- if (_needsReJit && _callCount < MinCallCountForReJit)
- {
- _callCount++;
-
- return false;
- }
-
- return _needsReJit;
- }
-
- public long Execute(CpuThreadState threadState, MemoryManager memory)
- {
- return _execDelegate(threadState, memory);
- }
-
- public void AddCaller(long position)
- {
- lock (_callers)
- {
- _callers.Add(position);
- }
- }
-
- public long[] GetCallerPositions()
- {
- lock (_callers)
- {
- return _callers.ToArray();
- }
- }
-
- public void SetType(TranslatedSubType type)
- {
- _type = type;
-
- if (type == TranslatedSubType.SubTier0)
- {
- _needsReJit = true;
- }
- }
-
- public void MarkForReJit() => _needsReJit = true;
- }
-} \ No newline at end of file