aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/Instruction/AVectorHelper.cs
diff options
context:
space:
mode:
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)