aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-06-28 20:52:32 -0300
committerGitHub <noreply@github.com>2018-06-28 20:52:32 -0300
commit4c7c21634eeab768971777f62dab8224f7ed2eb0 (patch)
tree2366e71c201b514a33081a94f725bf7cc4e380d5
parentbc26aa558a500a07ded8e3f32f5b26fe19794ad2 (diff)
Add Sse2 fallback to Vector{Extract|Insert}Single methods on the CPU (#193)
-rw-r--r--ChocolArm64/Instruction/AVectorHelper.cs23
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();
}