Translate higher quality code for indirect jumps aswell, and on some cases that were missed when lower quality (tier 0) code was available

This commit is contained in:
gdkchan 2019-01-27 20:30:16 -02:00
commit ea64838273
3 changed files with 32 additions and 4 deletions

View file

@ -1,6 +1,7 @@
using ChocolArm64.Decoders; using ChocolArm64.Decoders;
using ChocolArm64.State; using ChocolArm64.State;
using ChocolArm64.Translation; using ChocolArm64.Translation;
using System.Reflection;
using System.Reflection.Emit; using System.Reflection.Emit;
namespace ChocolArm64.Instructions namespace ChocolArm64.Instructions
@ -61,6 +62,20 @@ namespace ChocolArm64.Instructions
context.EmitStoreState(); context.EmitStoreState();
context.EmitLdintzr(op.Rn); context.EmitLdintzr(op.Rn);
context.Emit(OpCodes.Dup);
context.EmitSttmp();
context.EmitLdarg(TranslatedSub.StateArgIdx);
context.EmitFieldLoad(typeof(CpuThreadState).GetField(nameof(CpuThreadState.CurrentTranslator),
BindingFlags.Instance |
BindingFlags.NonPublic));
context.EmitLdarg(TranslatedSub.StateArgIdx);
context.EmitLdtmp();
context.EmitPrivateCall(typeof(Translator), nameof(Translator.TranslateVirtualSubroutine));
context.Emit(OpCodes.Ret); context.Emit(OpCodes.Ret);
} }

View file

@ -72,16 +72,27 @@ namespace ChocolArm64.Translation
state.CurrentTranslator = null; state.CurrentTranslator = null;
} }
internal TranslatedSub GetOrTranslateVirtualSubroutine(CpuThreadState state, long position) internal void TranslateVirtualSubroutine(CpuThreadState state, long position)
{ {
if (!_cache.TryGetSubroutine(position, out TranslatedSub subroutine)) if (!_cache.TryGetSubroutine(position, out TranslatedSub sub) || sub.Tier == TranslationTier.Tier0)
{ {
_queue.Enqueue(new TranslatorQueueItem(position, state.GetExecutionMode(), TranslationTier.Tier1)); _queue.Enqueue(new TranslatorQueueItem(position, state.GetExecutionMode(), TranslationTier.Tier1));
}
}
subroutine = TranslateLowCq(position, state.GetExecutionMode()); internal TranslatedSub GetOrTranslateVirtualSubroutine(CpuThreadState state, long position)
{
if (!_cache.TryGetSubroutine(position, out TranslatedSub sub))
{
sub = TranslateLowCq(position, state.GetExecutionMode());
} }
return subroutine; if (sub.Tier == TranslationTier.Tier0)
{
_queue.Enqueue(new TranslatorQueueItem(position, state.GetExecutionMode(), TranslationTier.Tier1));
}
return sub;
} }
internal TranslatedSub GetOrTranslateSubroutine(CpuThreadState state, long position) internal TranslatedSub GetOrTranslateSubroutine(CpuThreadState state, long position)

View file

@ -31,6 +31,8 @@ namespace ChocolArm64.Translation
{ {
ConcurrentStack<TranslatorQueueItem> queue = _translationQueue[(int)item.Tier]; ConcurrentStack<TranslatorQueueItem> queue = _translationQueue[(int)item.Tier];
System.Console.WriteLine("qc " + queue.Count);
if (queue.Count >= MaxQueueSize) if (queue.Count >= MaxQueueSize)
{ {
queue.TryPop(out _); queue.TryPop(out _);