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

Do not inline the scalar vector load methods as a workaround to a .net JIT bug

gdkchan 7 лет назад
Родитель
Сommit
9136897d4a
1 измененных файлов с 10 добавлено и 6 удалено
  1. 10 6
      ChocolArm64/Memory/AMemory.cs

+ 10 - 6
ChocolArm64/Memory/AMemory.cs

@@ -387,12 +387,14 @@ namespace ChocolArm64.Memory
             }
             }
         }
         }
 
 
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        [MethodImpl(MethodImplOptions.NoInlining)]
         public Vector128<float> ReadVector32Unchecked(long Position)
         public Vector128<float> ReadVector32Unchecked(long Position)
         {
         {
             if (Sse.IsSupported)
             if (Sse.IsSupported)
             {
             {
-                return Sse.LoadScalarVector128((float*)(RamPtr + (uint)Position));
+                byte* Address = RamPtr + (uint)Position;
+
+                return Sse.LoadScalarVector128((float*)Address);
             }
             }
             else
             else
             {
             {
@@ -400,7 +402,7 @@ namespace ChocolArm64.Memory
             }
             }
         }
         }
 
 
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        [MethodImpl(MethodImplOptions.NoInlining)]
         public Vector128<float> ReadVector64Unchecked(long Position)
         public Vector128<float> ReadVector64Unchecked(long Position)
         {
         {
             if (Sse2.IsSupported)
             if (Sse2.IsSupported)
@@ -418,7 +420,9 @@ namespace ChocolArm64.Memory
         {
         {
             if (Sse.IsSupported)
             if (Sse.IsSupported)
             {
             {
-                return Sse.LoadVector128((float*)(RamPtr + (uint)Position));
+                byte* Address = RamPtr + (uint)Position;
+
+                return Sse.LoadVector128((float*)Address);
             }
             }
             else
             else
             {
             {
@@ -620,7 +624,7 @@ namespace ChocolArm64.Memory
             }
             }
         }
         }
 
 
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        [MethodImpl(MethodImplOptions.NoInlining)]
         public void WriteVector32Unchecked(long Position, Vector128<float> Value)
         public void WriteVector32Unchecked(long Position, Vector128<float> Value)
         {
         {
             if (Sse.IsSupported)
             if (Sse.IsSupported)
@@ -633,7 +637,7 @@ namespace ChocolArm64.Memory
             }
             }
         }
         }
 
 
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        [MethodImpl(MethodImplOptions.NoInlining)]
         public void WriteVector64Unchecked(long Position, Vector128<float> Value)
         public void WriteVector64Unchecked(long Position, Vector128<float> Value)
         {
         {
             if (Sse2.IsSupported)
             if (Sse2.IsSupported)