diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2018-06-28 20:52:32 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-06-28 20:52:32 -0300 |
| commit | 4c7c21634eeab768971777f62dab8224f7ed2eb0 (patch) | |
| tree | 2366e71c201b514a33081a94f725bf7cc4e380d5 | |
| parent | bc26aa558a500a07ded8e3f32f5b26fe19794ad2 (diff) | |
Add Sse2 fallback to Vector{Extract|Insert}Single methods on the CPU (#193)
| -rw-r--r-- | ChocolArm64/Instruction/AVectorHelper.cs | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/ChocolArm64/Instruction/AVectorHelper.cs b/ChocolArm64/Instruction/AVectorHelper.cs index 1a213592..dbfaab75 100644 --- a/ChocolArm64/Instruction/AVectorHelper.cs +++ b/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(); } |
