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

Add Sse2 fallback to Vector{Extract|Insert}Single methods on the CPU (#193)

gdkchan 7 лет назад
Родитель
Сommit
4c7c21634e
1 измененных файлов с 23 добавлено и 0 удалено
  1. 23 0
      ChocolArm64/Instruction/AVectorHelper.cs

+ 23 - 0
ChocolArm64/Instruction/AVectorHelper.cs

@@ -422,6 +422,15 @@ namespace ChocolArm64.Instruction
             {
                 return Sse41.Extract(Vector, Index);
             }
+            else if (Sse2.IsSupported)
+            {
+                Vector128<ushort> ShortVector = Sse.StaticCast<float, ushort>(Vector);
+
+                int Low  = Sse2.Extract(ShortVector, (byte)(Index * 2 + 0));
+                int High = Sse2.Extract(ShortVector, (byte)(Index * 2 + 1));
+
+                return BitConverter.Int32BitsToSingle(Low | (High << 16));
+            }
 
             throw new PlatformNotSupportedException();
         }
@@ -509,6 +518,20 @@ namespace ChocolArm64.Instruction
             {
                 return Sse41.Insert(Vector, Value, (byte)(Index << 4));
             }
+            else if (Sse2.IsSupported)
+            {
+                int IntValue = BitConverter.SingleToInt32Bits(Value);
+
+                ushort Low  = (ushort)(IntValue >> 0);
+                ushort High = (ushort)(IntValue >> 16);
+
+                Vector128<ushort> ShortVector = Sse.StaticCast<float, ushort>(Vector);
+
+                ShortVector = Sse2.Insert(ShortVector, Low,  (byte)(Index * 2 + 0));
+                ShortVector = Sse2.Insert(ShortVector, High, (byte)(Index * 2 + 1));
+
+                return Sse.StaticCast<ushort, float>(ShortVector);
+            }
 
             throw new PlatformNotSupportedException();
         }