Просмотр исходного кода

Do not clear the rejit queue when overlaps count is equal to 0. (#3721)

* Do not clear the rejit queue when overlaps count is equal to 0.

* Ptc and PtcProfiler must be invalidated.

* Revert "Ptc and PtcProfiler must be invalidated."

This reverts commit f5b0ad9d7dc3c0b3a0da184de4d04d7234939c81.

* Fix #3710 slow path due to #3701.
LDj3SNuD 3 лет назад
Родитель
Сommit
62585755fd

+ 8 - 2
ARMeilleure/Instructions/InstEmitSimdCvt32.cs

@@ -296,27 +296,33 @@ namespace ARMeilleure.Instructions
             {
                 if (op.Op)
                 {
-                    // Convert to half
+                    // Convert to half.
 
                     Operand src = ExtractScalar(context, op.Size == 1 ? OperandType.FP64 : OperandType.FP32, op.Vm);
 
                     MethodInfo method = op.Size == 1
                         ? typeof(SoftFloat64_16).GetMethod(nameof(SoftFloat64_16.FPConvert))
                         : typeof(SoftFloat32_16).GetMethod(nameof(SoftFloat32_16.FPConvert));
+
+                    context.StoreToContext();
                     Operand res = context.Call(method, src);
+                    context.LoadFromContext();
 
                     InsertScalar16(context, op.Vd, op.T, res);
                 }
                 else
                 {
-                    // Convert from half
+                    // Convert from half.
 
                     Operand src = ExtractScalar16(context, op.Vm, op.T);
 
                     MethodInfo method = op.Size == 1
                         ? typeof(SoftFloat16_64).GetMethod(nameof(SoftFloat16_64.FPConvert))
                         : typeof(SoftFloat16_32).GetMethod(nameof(SoftFloat16_32.FPConvert));
+
+                    context.StoreToContext();
                     Operand res = context.Call(method, src);
+                    context.LoadFromContext();
 
                     InsertScalar(context, op.Vd, res);
                 }

+ 6 - 3
ARMeilleure/Translation/Translator.cs

@@ -455,13 +455,16 @@ namespace ARMeilleure.Translation
 
         public void InvalidateJitCacheRegion(ulong address, ulong size)
         {
-            // If rejit is running, stop it as it may be trying to rejit a function on the invalidated region.
-            ClearRejitQueue(allowRequeue: true);
-
             ulong[] overlapAddresses = Array.Empty<ulong>();
 
             int overlapsCount = Functions.GetOverlaps(address, size, ref overlapAddresses);
 
+            if (overlapsCount != 0)
+            {
+                // If rejit is running, stop it as it may be trying to rejit a function on the invalidated region.
+                ClearRejitQueue(allowRequeue: true);
+            }
+
             for (int index = 0; index < overlapsCount; index++)
             {
                 ulong overlapAddress = overlapAddresses[index];