aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/Translation/TranslatedSub.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2019-02-27 23:03:31 -0300
committerjduncanator <1518948+jduncanator@users.noreply.github.com>2019-02-28 13:03:31 +1100
commite21ebbf666f10d39d44a0856e5a44143d3d69d0d (patch)
tree40d25d600ed121eeb397ff24ac7d7d7112b0a079 /ChocolArm64/Translation/TranslatedSub.cs
parent884b4e5fd3c2a54ebb796b7f995c0eda9c4d0038 (diff)
Misc. CPU optimizations (#575)
* Add optimizations related to caller/callee saved registers, thread synchronization and disable tier 0 * Refactoring * Add a config entry to enable or disable the reg load/store opt. * Remove unnecessary register state stores for calls when the callee is know * Rename IoType to VarType * Enable tier 0 while fixing some perf issues related to tier 0 * Small tweak -- Compile before adding to the cache, to avoid lags * Add required config entry
Diffstat (limited to 'ChocolArm64/Translation/TranslatedSub.cs')
-rw-r--r--ChocolArm64/Translation/TranslatedSub.cs55
1 files changed, 47 insertions, 8 deletions
diff --git a/ChocolArm64/Translation/TranslatedSub.cs b/ChocolArm64/Translation/TranslatedSub.cs
index 65d70351..8b599b7a 100644
--- a/ChocolArm64/Translation/TranslatedSub.cs
+++ b/ChocolArm64/Translation/TranslatedSub.cs
@@ -10,21 +10,41 @@ namespace ChocolArm64.Translation
class TranslatedSub
{
+ //This is the minimum amount of calls needed for the method
+ //to be retranslated with higher quality code. It's only worth
+ //doing that for hot code.
+ private const int MinCallCountForOpt = 30;
+
public ArmSubroutine Delegate { get; private set; }
- public static int StateArgIdx { get; private set; }
- public static int MemoryArgIdx { get; private set; }
+ public static int StateArgIdx { get; }
+ public static int MemoryArgIdx { get; }
+
+ public static Type[] FixedArgTypes { get; }
+
+ public DynamicMethod Method { get; }
+
+ public TranslationTier Tier { get; }
- public static Type[] FixedArgTypes { get; private set; }
+ public long IntNiRegsMask { get; }
+ public long VecNiRegsMask { get; }
- public DynamicMethod Method { get; private set; }
+ private bool _isWorthOptimizing;
- public TranslationTier Tier { get; private set; }
+ private int _callCount;
- public TranslatedSub(DynamicMethod method, TranslationTier tier)
+ public TranslatedSub(
+ DynamicMethod method,
+ long intNiRegsMask,
+ long vecNiRegsMask,
+ TranslationTier tier,
+ bool isWorthOptimizing)
{
- Method = method ?? throw new ArgumentNullException(nameof(method));;
- Tier = tier;
+ Method = method ?? throw new ArgumentNullException(nameof(method));;
+ IntNiRegsMask = intNiRegsMask;
+ VecNiRegsMask = vecNiRegsMask;
+ _isWorthOptimizing = isWorthOptimizing;
+ Tier = tier;
}
static TranslatedSub()
@@ -61,5 +81,24 @@ namespace ChocolArm64.Translation
{
return Delegate(threadState, memory);
}
+
+ public bool IsWorthOptimizing()
+ {
+ if (!_isWorthOptimizing)
+ {
+ return false;
+ }
+
+ if (_callCount++ < MinCallCountForOpt)
+ {
+ return false;
+ }
+
+ //Only return true once, so that it is
+ //added to the queue only once.
+ _isWorthOptimizing = false;
+
+ return true;
+ }
}
} \ No newline at end of file