aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/Instruction/AVectorHelper.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-08-14 23:54:12 -0300
committerGitHub <noreply@github.com>2018-08-14 23:54:12 -0300
commit55374ebba0ed49bc4624e47cc971b1e63f644583 (patch)
tree1a9f0df633dcd3c8db80f419849bbfdf2a29e395 /ChocolArm64/Instruction/AVectorHelper.cs
parent0673dc183a03f58ff558e85054db456e83184df7 (diff)
Zero out bits 63:32 of scalar float operations with SSE intrinsics (#273)
Diffstat (limited to 'ChocolArm64/Instruction/AVectorHelper.cs')
-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 b2d53740..3e4452ab 100644
--- a/ChocolArm64/Instruction/AVectorHelper.cs
+++ b/ChocolArm64/Instruction/AVectorHelper.cs
@@ -9,6 +9,18 @@ namespace ChocolArm64.Instruction
{
static class AVectorHelper
{
+ private static readonly Vector128<float> Zero32_128Mask;
+
+ static AVectorHelper()
+ {
+ if (!Sse2.IsSupported)
+ {
+ throw new PlatformNotSupportedException();
+ }
+
+ Zero32_128Mask = Sse.StaticCast<uint, float>(Sse2.SetVector128(0, 0, 0, 0xffffffff));
+ }
+
public static void EmitCall(AILEmitterCtx Context, string Name64, string Name128)
{
bool IsSimd64 = Context.CurrOp.RegisterSize == ARegisterSize.SIMD64;
@@ -449,6 +461,17 @@ namespace ChocolArm64.Instruction
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static Vector128<float> VectorZero32_128(Vector128<float> Vector)
+ {
+ if (Sse.IsSupported)
+ {
+ return Sse.And(Vector, Zero32_128Mask);
+ }
+
+ throw new PlatformNotSupportedException();
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector128<sbyte> VectorSingleToSByte(Vector128<float> Vector)
{
if (Sse.IsSupported)