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

This commit is contained in:
gdkchan 2018-06-28 20:52:32 -03:00 committed by GitHub
parent bc26aa558a
commit 4c7c21634e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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();
}