diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2018-08-14 23:54:12 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-08-14 23:54:12 -0300 |
| commit | 55374ebba0ed49bc4624e47cc971b1e63f644583 (patch) | |
| tree | 1a9f0df633dcd3c8db80f419849bbfdf2a29e395 /ChocolArm64/Instruction/AVectorHelper.cs | |
| parent | 0673dc183a03f58ff558e85054db456e83184df7 (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.cs | 23 |
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) |
