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:
parent
f034ce348e
commit
ea64838273
3 changed files with 32 additions and 4 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 _);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue