diff options
author | Marek Safar <marek.safar@gmail.com> | 2016-12-16 17:43:58 +0300 |
---|---|---|
committer | Marek Safar <marek.safar@gmail.com> | 2016-12-16 17:43:58 +0300 |
commit | c221a745327ffc7eaf0159c862d8e8e796af4999 (patch) | |
tree | 845d56741b499317114cedad9297be1fa3993b06 /mcs/class/System.Numerics.Vectors | |
parent | e048a727702ccfab4f24f73dd657acb9556d3b80 (diff) |
[System.Numerics.Vectors] Update to the latest CoreFX version
Diffstat (limited to 'mcs/class/System.Numerics.Vectors')
10 files changed, 22 insertions, 6227 deletions
diff --git a/mcs/class/System.Numerics.Vectors/Makefile b/mcs/class/System.Numerics.Vectors/Makefile index 42fb194dbfb..6500f93995c 100644 --- a/mcs/class/System.Numerics.Vectors/Makefile +++ b/mcs/class/System.Numerics.Vectors/Makefile @@ -6,6 +6,8 @@ LIBRARY = System.Numerics.Vectors.dll LIB_REFS = System System.Numerics LIB_MCS_FLAGS = -unsafe +RESX_RESOURCE_STRING = ../../../external/corefx/src/System.Numerics.Vectors/src/Resources/Strings.resx + EXTRA_DISTFILES = include ../../build/library.make diff --git a/mcs/class/System.Numerics.Vectors/SR.cs b/mcs/class/System.Numerics.Vectors/SR.cs index 72e9cfb0ac1..bd6a06aa484 100644 --- a/mcs/class/System.Numerics.Vectors/SR.cs +++ b/mcs/class/System.Numerics.Vectors/SR.cs @@ -1,15 +1,20 @@ -// generated from Strings.resx in corefx +// +// This file was generated by resx2sr tool +// partial class SR { - public const string Arg_ArgumentOutOfRangeException="Index was out of bounds:"; - public const string Arg_ElementsInSourceIsGreaterThanDestination="Number of elements in source vector is greater than the destination array"; - public const string Arg_MultiDimArrayNotSupported="Only one-dimensional arrays are supported"; - public const string Arg_NullArgumentNullRef="The method was called with a null array argument."; - public const string Arg_RegisterLengthOfRangeException="length must be less than"; - public const string Arg_TypeNotSupported="Specified type is not supported"; - public const string Reflection_MethodNotSupported="Vector<T>.Count cannot be called via reflection when intrinsics are enabled."; + public const string Arg_ArgumentOutOfRangeException = "Index was out of bounds:"; + public const string Arg_ElementsInSourceIsGreaterThanDestination = "Number of elements in source vector is greater than the destination array"; + public const string Arg_MultiDimArrayNotSupported = "Only one-dimensional arrays are supported"; + public const string Arg_NullArgumentNullRef = "The method was called with a null array argument."; + public const string Arg_RegisterLengthOfRangeException = "length must be less than"; + public const string Arg_TypeNotSupported = "Specified type is not supported"; + public const string Reflection_MethodNotSupported = "Vector<T>.Count cannot be called via reflection when intrinsics are enabled."; +} +partial class SR +{ public static string Format (string message, object data) { return string.Format (message, data); diff --git a/mcs/class/System.Numerics.Vectors/System.Numerics.Vectors.dll.sources b/mcs/class/System.Numerics.Vectors/System.Numerics.Vectors.dll.sources index 01bdfc1724e..a5f261e85ca 100644 --- a/mcs/class/System.Numerics.Vectors/System.Numerics.Vectors.dll.sources +++ b/mcs/class/System.Numerics.Vectors/System.Numerics.Vectors.dll.sources @@ -3,9 +3,10 @@ Assembly/AssemblyInfo.cs Assembly/TypeForwarders.cs SR.cs -System.Numerics/ConstantHelper.cs -System.Numerics/HashCodeHelper.cs -System.Numerics/JitIntrinsicAttribute.cs -System.Numerics/Register.cs -System.Numerics/Vector_Operations.cs -System.Numerics/Vector.cs + +../../../external/corefx/src/Common/src/System/Numerics/Hashing/HashHelpers.cs +../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/ConstantHelper.cs +../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics//JitIntrinsicAttribute.cs +../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics//Register.cs +../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics//Vector_Operations.cs +../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics//Vector.cs diff --git a/mcs/class/System.Numerics.Vectors/System.Numerics/ConstantHelper.cs b/mcs/class/System.Numerics.Vectors/System.Numerics/ConstantHelper.cs deleted file mode 100644 index ea32ed3803f..00000000000 --- a/mcs/class/System.Numerics.Vectors/System.Numerics/ConstantHelper.cs +++ /dev/null @@ -1,142 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Runtime.CompilerServices; - -namespace System.Numerics -{ - internal class ConstantHelper - { - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Byte GetByteWithAllBitsSet() - { - Byte value = 0; - unsafe - { - unchecked - { - *((Byte*)&value) = (Byte)0xff; - } - } - return value; - } - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static SByte GetSByteWithAllBitsSet() - { - SByte value = 0; - unsafe - { - unchecked - { - *((SByte*)&value) = (SByte)0xff; - } - } - return value; - } - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static UInt16 GetUInt16WithAllBitsSet() - { - UInt16 value = 0; - unsafe - { - unchecked - { - *((UInt16*)&value) = (UInt16)0xffff; - } - } - return value; - } - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Int16 GetInt16WithAllBitsSet() - { - Int16 value = 0; - unsafe - { - unchecked - { - *((Int16*)&value) = (Int16)0xffff; - } - } - return value; - } - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static UInt32 GetUInt32WithAllBitsSet() - { - UInt32 value = 0; - unsafe - { - unchecked - { - *((UInt32*)&value) = (UInt32)0xffffffff; - } - } - return value; - } - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Int32 GetInt32WithAllBitsSet() - { - Int32 value = 0; - unsafe - { - unchecked - { - *((Int32*)&value) = (Int32)0xffffffff; - } - } - return value; - } - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static UInt64 GetUInt64WithAllBitsSet() - { - UInt64 value = 0; - unsafe - { - unchecked - { - *((UInt64*)&value) = (UInt64)0xffffffffffffffff; - } - } - return value; - } - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Int64 GetInt64WithAllBitsSet() - { - Int64 value = 0; - unsafe - { - unchecked - { - *((Int64*)&value) = (Int64)0xffffffffffffffff; - } - } - return value; - } - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Single GetSingleWithAllBitsSet() - { - Single value = 0; - unsafe - { - unchecked - { - *((Int32*)&value) = (Int32)0xffffffff; - } - } - return value; - } - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Double GetDoubleWithAllBitsSet() - { - Double value = 0; - unsafe - { - unchecked - { - *((Int64*)&value) = (Int64)0xffffffffffffffff; - } - } - return value; - } - } -} diff --git a/mcs/class/System.Numerics.Vectors/System.Numerics/HashCodeHelper.cs b/mcs/class/System.Numerics.Vectors/System.Numerics/HashCodeHelper.cs deleted file mode 100644 index 1467e2f68f8..00000000000 --- a/mcs/class/System.Numerics.Vectors/System.Numerics/HashCodeHelper.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -namespace System.Numerics -{ - internal static class HashCodeHelper - { - /// <summary> - /// Combines two hash codes, useful for combining hash codes of individual vector elements - /// </summary> - internal static int CombineHashCodes(int h1, int h2) - { - return (((h1 << 5) + h1) ^ h2); - } - } -} diff --git a/mcs/class/System.Numerics.Vectors/System.Numerics/JitIntrinsicAttribute.cs b/mcs/class/System.Numerics.Vectors/System.Numerics/JitIntrinsicAttribute.cs deleted file mode 100644 index 741041222f8..00000000000 --- a/mcs/class/System.Numerics.Vectors/System.Numerics/JitIntrinsicAttribute.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -namespace System.Numerics -{ - /// <summary> - /// An attribute that can be attached to JIT Intrinsic methods/properties - /// </summary> - [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Property)] - internal class JitIntrinsicAttribute : Attribute - { - } -} diff --git a/mcs/class/System.Numerics.Vectors/System.Numerics/Register.cs b/mcs/class/System.Numerics.Vectors/System.Numerics/Register.cs deleted file mode 100644 index a27e922b9d8..00000000000 --- a/mcs/class/System.Numerics.Vectors/System.Numerics/Register.cs +++ /dev/null @@ -1,172 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Runtime.InteropServices; - -namespace System.Numerics -{ - /// <summary> - /// A structure describing the layout of an SSE2-sized register. - /// Contains overlapping fields representing the set of valid numeric types. - /// Allows the generic Vector'T struct to contain an explicit field layout. - /// </summary> - [StructLayout(LayoutKind.Explicit)] - internal struct Register - { - #region Internal Storage Fields - // Internal System.Byte Fields - [FieldOffset(0)] - internal Byte byte_0; - [FieldOffset(1)] - internal Byte byte_1; - [FieldOffset(2)] - internal Byte byte_2; - [FieldOffset(3)] - internal Byte byte_3; - [FieldOffset(4)] - internal Byte byte_4; - [FieldOffset(5)] - internal Byte byte_5; - [FieldOffset(6)] - internal Byte byte_6; - [FieldOffset(7)] - internal Byte byte_7; - [FieldOffset(8)] - internal Byte byte_8; - [FieldOffset(9)] - internal Byte byte_9; - [FieldOffset(10)] - internal Byte byte_10; - [FieldOffset(11)] - internal Byte byte_11; - [FieldOffset(12)] - internal Byte byte_12; - [FieldOffset(13)] - internal Byte byte_13; - [FieldOffset(14)] - internal Byte byte_14; - [FieldOffset(15)] - internal Byte byte_15; - - // Internal System.SByte Fields - [FieldOffset(0)] - internal SByte sbyte_0; - [FieldOffset(1)] - internal SByte sbyte_1; - [FieldOffset(2)] - internal SByte sbyte_2; - [FieldOffset(3)] - internal SByte sbyte_3; - [FieldOffset(4)] - internal SByte sbyte_4; - [FieldOffset(5)] - internal SByte sbyte_5; - [FieldOffset(6)] - internal SByte sbyte_6; - [FieldOffset(7)] - internal SByte sbyte_7; - [FieldOffset(8)] - internal SByte sbyte_8; - [FieldOffset(9)] - internal SByte sbyte_9; - [FieldOffset(10)] - internal SByte sbyte_10; - [FieldOffset(11)] - internal SByte sbyte_11; - [FieldOffset(12)] - internal SByte sbyte_12; - [FieldOffset(13)] - internal SByte sbyte_13; - [FieldOffset(14)] - internal SByte sbyte_14; - [FieldOffset(15)] - internal SByte sbyte_15; - - // Internal System.UInt16 Fields - [FieldOffset(0)] - internal UInt16 uint16_0; - [FieldOffset(2)] - internal UInt16 uint16_1; - [FieldOffset(4)] - internal UInt16 uint16_2; - [FieldOffset(6)] - internal UInt16 uint16_3; - [FieldOffset(8)] - internal UInt16 uint16_4; - [FieldOffset(10)] - internal UInt16 uint16_5; - [FieldOffset(12)] - internal UInt16 uint16_6; - [FieldOffset(14)] - internal UInt16 uint16_7; - - // Internal System.Int16 Fields - [FieldOffset(0)] - internal Int16 int16_0; - [FieldOffset(2)] - internal Int16 int16_1; - [FieldOffset(4)] - internal Int16 int16_2; - [FieldOffset(6)] - internal Int16 int16_3; - [FieldOffset(8)] - internal Int16 int16_4; - [FieldOffset(10)] - internal Int16 int16_5; - [FieldOffset(12)] - internal Int16 int16_6; - [FieldOffset(14)] - internal Int16 int16_7; - - // Internal System.UInt32 Fields - [FieldOffset(0)] - internal UInt32 uint32_0; - [FieldOffset(4)] - internal UInt32 uint32_1; - [FieldOffset(8)] - internal UInt32 uint32_2; - [FieldOffset(12)] - internal UInt32 uint32_3; - - // Internal System.Int32 Fields - [FieldOffset(0)] - internal Int32 int32_0; - [FieldOffset(4)] - internal Int32 int32_1; - [FieldOffset(8)] - internal Int32 int32_2; - [FieldOffset(12)] - internal Int32 int32_3; - - // Internal System.UInt64 Fields - [FieldOffset(0)] - internal UInt64 uint64_0; - [FieldOffset(8)] - internal UInt64 uint64_1; - - // Internal System.Int64 Fields - [FieldOffset(0)] - internal Int64 int64_0; - [FieldOffset(8)] - internal Int64 int64_1; - - // Internal System.Single Fields - [FieldOffset(0)] - internal Single single_0; - [FieldOffset(4)] - internal Single single_1; - [FieldOffset(8)] - internal Single single_2; - [FieldOffset(12)] - internal Single single_3; - - // Internal System.Double Fields - [FieldOffset(0)] - internal Double double_0; - [FieldOffset(8)] - internal Double double_1; - - #endregion Internal Storage Fields - } -} diff --git a/mcs/class/System.Numerics.Vectors/System.Numerics/Vector.cs b/mcs/class/System.Numerics.Vectors/System.Numerics/Vector.cs deleted file mode 100644 index 13785ed5cfe..00000000000 --- a/mcs/class/System.Numerics.Vectors/System.Numerics/Vector.cs +++ /dev/null @@ -1,5002 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Diagnostics.Contracts; -using System.Globalization; -using System.Runtime.CompilerServices; -using System.Text; - -namespace System.Numerics -{ - /* Note: The following patterns are used throughout the code here and are described here - * - * PATTERN: - * if (typeof(T) == typeof(Int32)) { ... } - * else if (typeof(T) == typeof(Single)) { ... } - * EXPLANATION: - * At runtime, each instantiation of Vector<T> will be type-specific, and each of these typeof blocks will be eliminated, - * as typeof(T) is a (JIT) compile-time constant for each instantiation. This design was chosen to eliminate any overhead from - * delegates and other patterns. - * - * PATTERN: - * if (Vector.IsHardwareAccelerated) { ... } - * else { ... } - * EXPLANATION - * This pattern solves two problems: - * 1. Allows us to unroll loops when we know the size (when no hardware acceleration is present) - * 2. Allows reflection to work: - * - If a method is called via reflection, it will not be "intrinsified", which would cause issues if we did - * not provide an implementation for that case (i.e. if it only included a case which assumed 16-byte registers) - * (NOTE: It is assumed that Vector.IsHardwareAccelerated will be a compile-time constant, eliminating these checks - * from the JIT'd code.) - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - /// <summary> - /// A structure that represents a single Vector. The count of this Vector is fixed but CPU register dependent. - /// This struct only supports numerical types. This type is intended to be used as a building block for vectorizing - /// large algorithms. This type is immutable, individual elements cannot be modified. - /// </summary> - public struct Vector<T> : IEquatable<Vector<T>>, IFormattable where T : struct - { - #region Fields - private Register register; - #endregion Fields - - #region Static Members - /// <summary> - /// Returns the number of elements stored in the vector. This value is hardware dependent. - /// </summary> - [JitIntrinsic] - public static int Count - { - get - { - return s_count; - } - } - private static readonly int s_count = InitializeCount(); - - /// <summary> - /// Returns a vector containing all zeroes. - /// </summary> - [JitIntrinsic] - public static Vector<T> Zero { get { return zero; } } - private static readonly Vector<T> zero = new Vector<T>(GetZeroValue()); - - /// <summary> - /// Returns a vector containing all ones. - /// </summary> - [JitIntrinsic] - public static Vector<T> One { get { return one; } } - private static readonly Vector<T> one = new Vector<T>(GetOneValue()); - - internal static Vector<T> AllOnes { get { return allOnes; } } - private static readonly Vector<T> allOnes = new Vector<T>(GetAllBitsSetValue()); - #endregion Static Members - - #region Static Initialization - private struct VectorSizeHelper - { - internal Vector<T> _placeholder; - internal byte _byte; - } - - // Calculates the size of this struct in bytes, by computing the offset of a field in a structure - private static unsafe int InitializeCount() - { - VectorSizeHelper vsh; - byte* vectorBase = &vsh._placeholder.register.byte_0; - byte* byteBase = &vsh._byte; - int vectorSizeInBytes = (int)(byteBase - vectorBase); - - int typeSizeInBytes = -1; - if (typeof(T) == typeof(Byte)) - { - typeSizeInBytes = sizeof(Byte); - } - else if (typeof(T) == typeof(SByte)) - { - typeSizeInBytes = sizeof(SByte); - } - else if (typeof(T) == typeof(UInt16)) - { - typeSizeInBytes = sizeof(UInt16); - } - else if (typeof(T) == typeof(Int16)) - { - typeSizeInBytes = sizeof(Int16); - } - else if (typeof(T) == typeof(UInt32)) - { - typeSizeInBytes = sizeof(UInt32); - } - else if (typeof(T) == typeof(Int32)) - { - typeSizeInBytes = sizeof(Int32); - } - else if (typeof(T) == typeof(UInt64)) - { - typeSizeInBytes = sizeof(UInt64); - } - else if (typeof(T) == typeof(Int64)) - { - typeSizeInBytes = sizeof(Int64); - } - else if (typeof(T) == typeof(Single)) - { - typeSizeInBytes = sizeof(Single); - } - else if (typeof(T) == typeof(Double)) - { - typeSizeInBytes = sizeof(Double); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - - return vectorSizeInBytes / typeSizeInBytes; - } - #endregion Static Initialization - - #region Constructors - /// <summary> - /// Constructs a vector whose components are all <code>value</code> - /// </summary> - [JitIntrinsic] - public unsafe Vector(T value) - : this() - { - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(Byte)) - { - fixed (Byte* basePtr = &this.register.byte_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (Byte)(object)value; - } - } - } - else if (typeof(T) == typeof(SByte)) - { - fixed (SByte* basePtr = &this.register.sbyte_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (SByte)(object)value; - } - } - } - else if (typeof(T) == typeof(UInt16)) - { - fixed (UInt16* basePtr = &this.register.uint16_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (UInt16)(object)value; - } - } - } - else if (typeof(T) == typeof(Int16)) - { - fixed (Int16* basePtr = &this.register.int16_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (Int16)(object)value; - } - } - } - else if (typeof(T) == typeof(UInt32)) - { - fixed (UInt32* basePtr = &this.register.uint32_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (UInt32)(object)value; - } - } - } - else if (typeof(T) == typeof(Int32)) - { - fixed (Int32* basePtr = &this.register.int32_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (Int32)(object)value; - } - } - } - else if (typeof(T) == typeof(UInt64)) - { - fixed (UInt64* basePtr = &this.register.uint64_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (UInt64)(object)value; - } - } - } - else if (typeof(T) == typeof(Int64)) - { - fixed (Int64* basePtr = &this.register.int64_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (Int64)(object)value; - } - } - } - else if (typeof(T) == typeof(Single)) - { - fixed (Single* basePtr = &this.register.single_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (Single)(object)value; - } - } - } - else if (typeof(T) == typeof(Double)) - { - fixed (Double* basePtr = &this.register.double_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (Double)(object)value; - } - } - } - } - else - { - if (typeof(T) == typeof(Byte)) - { - register.byte_0 = (Byte)(object)value; - register.byte_1 = (Byte)(object)value; - register.byte_2 = (Byte)(object)value; - register.byte_3 = (Byte)(object)value; - register.byte_4 = (Byte)(object)value; - register.byte_5 = (Byte)(object)value; - register.byte_6 = (Byte)(object)value; - register.byte_7 = (Byte)(object)value; - register.byte_8 = (Byte)(object)value; - register.byte_9 = (Byte)(object)value; - register.byte_10 = (Byte)(object)value; - register.byte_11 = (Byte)(object)value; - register.byte_12 = (Byte)(object)value; - register.byte_13 = (Byte)(object)value; - register.byte_14 = (Byte)(object)value; - register.byte_15 = (Byte)(object)value; - } - else if (typeof(T) == typeof(SByte)) - { - register.sbyte_0 = (SByte)(object)value; - register.sbyte_1 = (SByte)(object)value; - register.sbyte_2 = (SByte)(object)value; - register.sbyte_3 = (SByte)(object)value; - register.sbyte_4 = (SByte)(object)value; - register.sbyte_5 = (SByte)(object)value; - register.sbyte_6 = (SByte)(object)value; - register.sbyte_7 = (SByte)(object)value; - register.sbyte_8 = (SByte)(object)value; - register.sbyte_9 = (SByte)(object)value; - register.sbyte_10 = (SByte)(object)value; - register.sbyte_11 = (SByte)(object)value; - register.sbyte_12 = (SByte)(object)value; - register.sbyte_13 = (SByte)(object)value; - register.sbyte_14 = (SByte)(object)value; - register.sbyte_15 = (SByte)(object)value; - } - else if (typeof(T) == typeof(UInt16)) - { - register.uint16_0 = (UInt16)(object)value; - register.uint16_1 = (UInt16)(object)value; - register.uint16_2 = (UInt16)(object)value; - register.uint16_3 = (UInt16)(object)value; - register.uint16_4 = (UInt16)(object)value; - register.uint16_5 = (UInt16)(object)value; - register.uint16_6 = (UInt16)(object)value; - register.uint16_7 = (UInt16)(object)value; - } - else if (typeof(T) == typeof(Int16)) - { - register.int16_0 = (Int16)(object)value; - register.int16_1 = (Int16)(object)value; - register.int16_2 = (Int16)(object)value; - register.int16_3 = (Int16)(object)value; - register.int16_4 = (Int16)(object)value; - register.int16_5 = (Int16)(object)value; - register.int16_6 = (Int16)(object)value; - register.int16_7 = (Int16)(object)value; - } - else if (typeof(T) == typeof(UInt32)) - { - register.uint32_0 = (UInt32)(object)value; - register.uint32_1 = (UInt32)(object)value; - register.uint32_2 = (UInt32)(object)value; - register.uint32_3 = (UInt32)(object)value; - } - else if (typeof(T) == typeof(Int32)) - { - register.int32_0 = (Int32)(object)value; - register.int32_1 = (Int32)(object)value; - register.int32_2 = (Int32)(object)value; - register.int32_3 = (Int32)(object)value; - } - else if (typeof(T) == typeof(UInt64)) - { - register.uint64_0 = (UInt64)(object)value; - register.uint64_1 = (UInt64)(object)value; - } - else if (typeof(T) == typeof(Int64)) - { - register.int64_0 = (Int64)(object)value; - register.int64_1 = (Int64)(object)value; - } - else if (typeof(T) == typeof(Single)) - { - register.single_0 = (Single)(object)value; - register.single_1 = (Single)(object)value; - register.single_2 = (Single)(object)value; - register.single_3 = (Single)(object)value; - } - else if (typeof(T) == typeof(Double)) - { - register.double_0 = (Double)(object)value; - register.double_1 = (Double)(object)value; - } - } - } - - /// <summary> - /// Constructs a vector from the given array. The size of the given array must be at least Vector'T.Count. - /// </summary> - [JitIntrinsic] - public unsafe Vector(T[] values) : this(values, 0) { } - - /// <summary> - /// Constructs a vector from the given array, starting from the given index. - /// The array must contain at least Vector'T.Count from the given index. - /// </summary> - public unsafe Vector(T[] values, int index) - : this() - { - if (values == null) - { - // Match the JIT's exception type here. For perf, a NullReference is thrown instead of an ArgumentNull. - throw new NullReferenceException(SR.Arg_NullArgumentNullRef); - } - if (index < 0 || (values.Length - index) < Count) - { - throw new IndexOutOfRangeException(); - } - - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(Byte)) - { - fixed (Byte* basePtr = &this.register.byte_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (Byte)(object)values[g + index]; - } - } - } - else if (typeof(T) == typeof(SByte)) - { - fixed (SByte* basePtr = &this.register.sbyte_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (SByte)(object)values[g + index]; - } - } - } - else if (typeof(T) == typeof(UInt16)) - { - fixed (UInt16* basePtr = &this.register.uint16_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (UInt16)(object)values[g + index]; - } - } - } - else if (typeof(T) == typeof(Int16)) - { - fixed (Int16* basePtr = &this.register.int16_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (Int16)(object)values[g + index]; - } - } - } - else if (typeof(T) == typeof(UInt32)) - { - fixed (UInt32* basePtr = &this.register.uint32_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (UInt32)(object)values[g + index]; - } - } - } - else if (typeof(T) == typeof(Int32)) - { - fixed (Int32* basePtr = &this.register.int32_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (Int32)(object)values[g + index]; - } - } - } - else if (typeof(T) == typeof(UInt64)) - { - fixed (UInt64* basePtr = &this.register.uint64_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (UInt64)(object)values[g + index]; - } - } - } - else if (typeof(T) == typeof(Int64)) - { - fixed (Int64* basePtr = &this.register.int64_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (Int64)(object)values[g + index]; - } - } - } - else if (typeof(T) == typeof(Single)) - { - fixed (Single* basePtr = &this.register.single_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (Single)(object)values[g + index]; - } - } - } - else if (typeof(T) == typeof(Double)) - { - fixed (Double* basePtr = &this.register.double_0) - { - for (int g = 0; g < Count; g++) - { - *(basePtr + g) = (Double)(object)values[g + index]; - } - } - } - } - else - { - if (typeof(T) == typeof(Byte)) - { - fixed (Byte* basePtr = &this.register.byte_0) - { - *(basePtr + 0) = (Byte)(object)values[0 + index]; - *(basePtr + 1) = (Byte)(object)values[1 + index]; - *(basePtr + 2) = (Byte)(object)values[2 + index]; - *(basePtr + 3) = (Byte)(object)values[3 + index]; - *(basePtr + 4) = (Byte)(object)values[4 + index]; - *(basePtr + 5) = (Byte)(object)values[5 + index]; - *(basePtr + 6) = (Byte)(object)values[6 + index]; - *(basePtr + 7) = (Byte)(object)values[7 + index]; - *(basePtr + 8) = (Byte)(object)values[8 + index]; - *(basePtr + 9) = (Byte)(object)values[9 + index]; - *(basePtr + 10) = (Byte)(object)values[10 + index]; - *(basePtr + 11) = (Byte)(object)values[11 + index]; - *(basePtr + 12) = (Byte)(object)values[12 + index]; - *(basePtr + 13) = (Byte)(object)values[13 + index]; - *(basePtr + 14) = (Byte)(object)values[14 + index]; - *(basePtr + 15) = (Byte)(object)values[15 + index]; - } - } - else if (typeof(T) == typeof(SByte)) - { - fixed (SByte* basePtr = &this.register.sbyte_0) - { - *(basePtr + 0) = (SByte)(object)values[0 + index]; - *(basePtr + 1) = (SByte)(object)values[1 + index]; - *(basePtr + 2) = (SByte)(object)values[2 + index]; - *(basePtr + 3) = (SByte)(object)values[3 + index]; - *(basePtr + 4) = (SByte)(object)values[4 + index]; - *(basePtr + 5) = (SByte)(object)values[5 + index]; - *(basePtr + 6) = (SByte)(object)values[6 + index]; - *(basePtr + 7) = (SByte)(object)values[7 + index]; - *(basePtr + 8) = (SByte)(object)values[8 + index]; - *(basePtr + 9) = (SByte)(object)values[9 + index]; - *(basePtr + 10) = (SByte)(object)values[10 + index]; - *(basePtr + 11) = (SByte)(object)values[11 + index]; - *(basePtr + 12) = (SByte)(object)values[12 + index]; - *(basePtr + 13) = (SByte)(object)values[13 + index]; - *(basePtr + 14) = (SByte)(object)values[14 + index]; - *(basePtr + 15) = (SByte)(object)values[15 + index]; - } - } - else if (typeof(T) == typeof(UInt16)) - { - fixed (UInt16* basePtr = &this.register.uint16_0) - { - *(basePtr + 0) = (UInt16)(object)values[0 + index]; - *(basePtr + 1) = (UInt16)(object)values[1 + index]; - *(basePtr + 2) = (UInt16)(object)values[2 + index]; - *(basePtr + 3) = (UInt16)(object)values[3 + index]; - *(basePtr + 4) = (UInt16)(object)values[4 + index]; - *(basePtr + 5) = (UInt16)(object)values[5 + index]; - *(basePtr + 6) = (UInt16)(object)values[6 + index]; - *(basePtr + 7) = (UInt16)(object)values[7 + index]; - } - } - else if (typeof(T) == typeof(Int16)) - { - fixed (Int16* basePtr = &this.register.int16_0) - { - *(basePtr + 0) = (Int16)(object)values[0 + index]; - *(basePtr + 1) = (Int16)(object)values[1 + index]; - *(basePtr + 2) = (Int16)(object)values[2 + index]; - *(basePtr + 3) = (Int16)(object)values[3 + index]; - *(basePtr + 4) = (Int16)(object)values[4 + index]; - *(basePtr + 5) = (Int16)(object)values[5 + index]; - *(basePtr + 6) = (Int16)(object)values[6 + index]; - *(basePtr + 7) = (Int16)(object)values[7 + index]; - } - } - else if (typeof(T) == typeof(UInt32)) - { - fixed (UInt32* basePtr = &this.register.uint32_0) - { - *(basePtr + 0) = (UInt32)(object)values[0 + index]; - *(basePtr + 1) = (UInt32)(object)values[1 + index]; - *(basePtr + 2) = (UInt32)(object)values[2 + index]; - *(basePtr + 3) = (UInt32)(object)values[3 + index]; - } - } - else if (typeof(T) == typeof(Int32)) - { - fixed (Int32* basePtr = &this.register.int32_0) - { - *(basePtr + 0) = (Int32)(object)values[0 + index]; - *(basePtr + 1) = (Int32)(object)values[1 + index]; - *(basePtr + 2) = (Int32)(object)values[2 + index]; - *(basePtr + 3) = (Int32)(object)values[3 + index]; - } - } - else if (typeof(T) == typeof(UInt64)) - { - fixed (UInt64* basePtr = &this.register.uint64_0) - { - *(basePtr + 0) = (UInt64)(object)values[0 + index]; - *(basePtr + 1) = (UInt64)(object)values[1 + index]; - } - } - else if (typeof(T) == typeof(Int64)) - { - fixed (Int64* basePtr = &this.register.int64_0) - { - *(basePtr + 0) = (Int64)(object)values[0 + index]; - *(basePtr + 1) = (Int64)(object)values[1 + index]; - } - } - else if (typeof(T) == typeof(Single)) - { - fixed (Single* basePtr = &this.register.single_0) - { - *(basePtr + 0) = (Single)(object)values[0 + index]; - *(basePtr + 1) = (Single)(object)values[1 + index]; - *(basePtr + 2) = (Single)(object)values[2 + index]; - *(basePtr + 3) = (Single)(object)values[3 + index]; - } - } - else if (typeof(T) == typeof(Double)) - { - fixed (Double* basePtr = &this.register.double_0) - { - *(basePtr + 0) = (Double)(object)values[0 + index]; - *(basePtr + 1) = (Double)(object)values[1 + index]; - } - } - } - } - -#pragma warning disable 3001 // void* is not a CLS-Compliant argument type - private unsafe Vector(void* dataPointer) : this(dataPointer, 0) { } -#pragma warning restore 3001 // void* is not a CLS-Compliant argument type - -#pragma warning disable 3001 // void* is not a CLS-Compliant argument type - // Implemented with offset if this API ever becomes public; an offset of 0 is used internally. - private unsafe Vector(void* dataPointer, int offset) - : this() - { - if (typeof(T) == typeof(Byte)) - { - Byte* castedPtr = (Byte*)dataPointer; - castedPtr += offset; - fixed (Byte* registerBase = &this.register.byte_0) - { - for (int g = 0; g < Count; g++) - { - registerBase[g] = castedPtr[g]; - } - } - } - else if (typeof(T) == typeof(SByte)) - { - SByte* castedPtr = (SByte*)dataPointer; - castedPtr += offset; - fixed (SByte* registerBase = &this.register.sbyte_0) - { - for (int g = 0; g < Count; g++) - { - registerBase[g] = castedPtr[g]; - } - } - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16* castedPtr = (UInt16*)dataPointer; - castedPtr += offset; - fixed (UInt16* registerBase = &this.register.uint16_0) - { - for (int g = 0; g < Count; g++) - { - registerBase[g] = castedPtr[g]; - } - } - } - else if (typeof(T) == typeof(Int16)) - { - Int16* castedPtr = (Int16*)dataPointer; - castedPtr += offset; - fixed (Int16* registerBase = &this.register.int16_0) - { - for (int g = 0; g < Count; g++) - { - registerBase[g] = castedPtr[g]; - } - } - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32* castedPtr = (UInt32*)dataPointer; - castedPtr += offset; - fixed (UInt32* registerBase = &this.register.uint32_0) - { - for (int g = 0; g < Count; g++) - { - registerBase[g] = castedPtr[g]; - } - } - } - else if (typeof(T) == typeof(Int32)) - { - Int32* castedPtr = (Int32*)dataPointer; - castedPtr += offset; - fixed (Int32* registerBase = &this.register.int32_0) - { - for (int g = 0; g < Count; g++) - { - registerBase[g] = castedPtr[g]; - } - } - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64* castedPtr = (UInt64*)dataPointer; - castedPtr += offset; - fixed (UInt64* registerBase = &this.register.uint64_0) - { - for (int g = 0; g < Count; g++) - { - registerBase[g] = castedPtr[g]; - } - } - } - else if (typeof(T) == typeof(Int64)) - { - Int64* castedPtr = (Int64*)dataPointer; - castedPtr += offset; - fixed (Int64* registerBase = &this.register.int64_0) - { - for (int g = 0; g < Count; g++) - { - registerBase[g] = castedPtr[g]; - } - } - } - else if (typeof(T) == typeof(Single)) - { - Single* castedPtr = (Single*)dataPointer; - castedPtr += offset; - fixed (Single* registerBase = &this.register.single_0) - { - for (int g = 0; g < Count; g++) - { - registerBase[g] = castedPtr[g]; - } - } - } - else if (typeof(T) == typeof(Double)) - { - Double* castedPtr = (Double*)dataPointer; - castedPtr += offset; - fixed (Double* registerBase = &this.register.double_0) - { - for (int g = 0; g < Count; g++) - { - registerBase[g] = castedPtr[g]; - } - } - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } -#pragma warning restore 3001 // void* is not a CLS-Compliant argument type - - private Vector(ref Register existingRegister) - { - this.register = existingRegister; - } - #endregion Constructors - - #region Public Instance Methods - /// <summary> - /// Copies the vector to the given destination array. The destination array must be at least size Vector'T.Count. - /// </summary> - /// <param name="destination">The destination array which the values are copied into</param> - /// <exception cref="ArgumentNullException">If the destination array is null</exception> - /// <exception cref="ArgumentException">If number of elements in source vector is greater than those available in destination array</exception> - [JitIntrinsic] - public unsafe void CopyTo(T[] destination) - { - CopyTo(destination, 0); - } - - /// <summary> - /// Copies the vector to the given destination array. The destination array must be at least size Vector'T.Count. - /// </summary> - /// <param name="destination">The destination array which the values are copied into</param> - /// <param name="startIndex">The index to start copying to</param> - /// <exception cref="ArgumentNullException">If the destination array is null</exception> - /// <exception cref="ArgumentOutOfRangeException">If index is greater than end of the array or index is less than zero</exception> - /// <exception cref="ArgumentException">If number of elements in source vector is greater than those available in destination array</exception> - [JitIntrinsic] - public unsafe void CopyTo(T[] destination, int startIndex) - { - if (destination == null) - { - // Match the JIT's exception type here. For perf, a NullReference is thrown instead of an ArgumentNull. - throw new NullReferenceException(SR.Arg_NullArgumentNullRef); - } - if (startIndex < 0 || startIndex >= destination.Length) - { - throw new ArgumentOutOfRangeException(nameof(startIndex), SR.Format(SR.Arg_ArgumentOutOfRangeException, startIndex)); - } - if ((destination.Length - startIndex) < Count) - { - throw new ArgumentException(SR.Format(SR.Arg_ElementsInSourceIsGreaterThanDestination, startIndex)); - } - - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(Byte)) - { - Byte[] byteArray = (Byte[])(object)destination; - fixed (Byte* destinationBase = byteArray) - { - for (int g = 0; g < Count; g++) - { - destinationBase[startIndex + g] = (Byte)(object)this[g]; - } - } - } - else if (typeof(T) == typeof(SByte)) - { - SByte[] sbyteArray = (SByte[])(object)destination; - fixed (SByte* destinationBase = sbyteArray) - { - for (int g = 0; g < Count; g++) - { - destinationBase[startIndex + g] = (SByte)(object)this[g]; - } - } - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16[] uint16Array = (UInt16[])(object)destination; - fixed (UInt16* destinationBase = uint16Array) - { - for (int g = 0; g < Count; g++) - { - destinationBase[startIndex + g] = (UInt16)(object)this[g]; - } - } - } - else if (typeof(T) == typeof(Int16)) - { - Int16[] int16Array = (Int16[])(object)destination; - fixed (Int16* destinationBase = int16Array) - { - for (int g = 0; g < Count; g++) - { - destinationBase[startIndex + g] = (Int16)(object)this[g]; - } - } - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32[] uint32Array = (UInt32[])(object)destination; - fixed (UInt32* destinationBase = uint32Array) - { - for (int g = 0; g < Count; g++) - { - destinationBase[startIndex + g] = (UInt32)(object)this[g]; - } - } - } - else if (typeof(T) == typeof(Int32)) - { - Int32[] int32Array = (Int32[])(object)destination; - fixed (Int32* destinationBase = int32Array) - { - for (int g = 0; g < Count; g++) - { - destinationBase[startIndex + g] = (Int32)(object)this[g]; - } - } - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64[] uint64Array = (UInt64[])(object)destination; - fixed (UInt64* destinationBase = uint64Array) - { - for (int g = 0; g < Count; g++) - { - destinationBase[startIndex + g] = (UInt64)(object)this[g]; - } - } - } - else if (typeof(T) == typeof(Int64)) - { - Int64[] int64Array = (Int64[])(object)destination; - fixed (Int64* destinationBase = int64Array) - { - for (int g = 0; g < Count; g++) - { - destinationBase[startIndex + g] = (Int64)(object)this[g]; - } - } - } - else if (typeof(T) == typeof(Single)) - { - Single[] singleArray = (Single[])(object)destination; - fixed (Single* destinationBase = singleArray) - { - for (int g = 0; g < Count; g++) - { - destinationBase[startIndex + g] = (Single)(object)this[g]; - } - } - } - else if (typeof(T) == typeof(Double)) - { - Double[] doubleArray = (Double[])(object)destination; - fixed (Double* destinationBase = doubleArray) - { - for (int g = 0; g < Count; g++) - { - destinationBase[startIndex + g] = (Double)(object)this[g]; - } - } - } - } - else - { - if (typeof(T) == typeof(Byte)) - { - Byte[] byteArray = (Byte[])(object)destination; - fixed (Byte* destinationBase = byteArray) - { - destinationBase[startIndex + 0] = this.register.byte_0; - destinationBase[startIndex + 1] = this.register.byte_1; - destinationBase[startIndex + 2] = this.register.byte_2; - destinationBase[startIndex + 3] = this.register.byte_3; - destinationBase[startIndex + 4] = this.register.byte_4; - destinationBase[startIndex + 5] = this.register.byte_5; - destinationBase[startIndex + 6] = this.register.byte_6; - destinationBase[startIndex + 7] = this.register.byte_7; - destinationBase[startIndex + 8] = this.register.byte_8; - destinationBase[startIndex + 9] = this.register.byte_9; - destinationBase[startIndex + 10] = this.register.byte_10; - destinationBase[startIndex + 11] = this.register.byte_11; - destinationBase[startIndex + 12] = this.register.byte_12; - destinationBase[startIndex + 13] = this.register.byte_13; - destinationBase[startIndex + 14] = this.register.byte_14; - destinationBase[startIndex + 15] = this.register.byte_15; - } - } - else if (typeof(T) == typeof(SByte)) - { - SByte[] sbyteArray = (SByte[])(object)destination; - fixed (SByte* destinationBase = sbyteArray) - { - destinationBase[startIndex + 0] = this.register.sbyte_0; - destinationBase[startIndex + 1] = this.register.sbyte_1; - destinationBase[startIndex + 2] = this.register.sbyte_2; - destinationBase[startIndex + 3] = this.register.sbyte_3; - destinationBase[startIndex + 4] = this.register.sbyte_4; - destinationBase[startIndex + 5] = this.register.sbyte_5; - destinationBase[startIndex + 6] = this.register.sbyte_6; - destinationBase[startIndex + 7] = this.register.sbyte_7; - destinationBase[startIndex + 8] = this.register.sbyte_8; - destinationBase[startIndex + 9] = this.register.sbyte_9; - destinationBase[startIndex + 10] = this.register.sbyte_10; - destinationBase[startIndex + 11] = this.register.sbyte_11; - destinationBase[startIndex + 12] = this.register.sbyte_12; - destinationBase[startIndex + 13] = this.register.sbyte_13; - destinationBase[startIndex + 14] = this.register.sbyte_14; - destinationBase[startIndex + 15] = this.register.sbyte_15; - } - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16[] uint16Array = (UInt16[])(object)destination; - fixed (UInt16* destinationBase = uint16Array) - { - destinationBase[startIndex + 0] = this.register.uint16_0; - destinationBase[startIndex + 1] = this.register.uint16_1; - destinationBase[startIndex + 2] = this.register.uint16_2; - destinationBase[startIndex + 3] = this.register.uint16_3; - destinationBase[startIndex + 4] = this.register.uint16_4; - destinationBase[startIndex + 5] = this.register.uint16_5; - destinationBase[startIndex + 6] = this.register.uint16_6; - destinationBase[startIndex + 7] = this.register.uint16_7; - } - } - else if (typeof(T) == typeof(Int16)) - { - Int16[] int16Array = (Int16[])(object)destination; - fixed (Int16* destinationBase = int16Array) - { - destinationBase[startIndex + 0] = this.register.int16_0; - destinationBase[startIndex + 1] = this.register.int16_1; - destinationBase[startIndex + 2] = this.register.int16_2; - destinationBase[startIndex + 3] = this.register.int16_3; - destinationBase[startIndex + 4] = this.register.int16_4; - destinationBase[startIndex + 5] = this.register.int16_5; - destinationBase[startIndex + 6] = this.register.int16_6; - destinationBase[startIndex + 7] = this.register.int16_7; - } - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32[] uint32Array = (UInt32[])(object)destination; - fixed (UInt32* destinationBase = uint32Array) - { - destinationBase[startIndex + 0] = this.register.uint32_0; - destinationBase[startIndex + 1] = this.register.uint32_1; - destinationBase[startIndex + 2] = this.register.uint32_2; - destinationBase[startIndex + 3] = this.register.uint32_3; - } - } - else if (typeof(T) == typeof(Int32)) - { - Int32[] int32Array = (Int32[])(object)destination; - fixed (Int32* destinationBase = int32Array) - { - destinationBase[startIndex + 0] = this.register.int32_0; - destinationBase[startIndex + 1] = this.register.int32_1; - destinationBase[startIndex + 2] = this.register.int32_2; - destinationBase[startIndex + 3] = this.register.int32_3; - } - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64[] uint64Array = (UInt64[])(object)destination; - fixed (UInt64* destinationBase = uint64Array) - { - destinationBase[startIndex + 0] = this.register.uint64_0; - destinationBase[startIndex + 1] = this.register.uint64_1; - } - } - else if (typeof(T) == typeof(Int64)) - { - Int64[] int64Array = (Int64[])(object)destination; - fixed (Int64* destinationBase = int64Array) - { - destinationBase[startIndex + 0] = this.register.int64_0; - destinationBase[startIndex + 1] = this.register.int64_1; - } - } - else if (typeof(T) == typeof(Single)) - { - Single[] singleArray = (Single[])(object)destination; - fixed (Single* destinationBase = singleArray) - { - destinationBase[startIndex + 0] = this.register.single_0; - destinationBase[startIndex + 1] = this.register.single_1; - destinationBase[startIndex + 2] = this.register.single_2; - destinationBase[startIndex + 3] = this.register.single_3; - } - } - else if (typeof(T) == typeof(Double)) - { - Double[] doubleArray = (Double[])(object)destination; - fixed (Double* destinationBase = doubleArray) - { - destinationBase[startIndex + 0] = this.register.double_0; - destinationBase[startIndex + 1] = this.register.double_1; - } - } - } - } - - /// <summary> - /// Returns the element at the given index. - /// </summary> - [JitIntrinsic] - public unsafe T this[int index] - { - get - { - if (index >= Count || index < 0) - { - throw new IndexOutOfRangeException(SR.Format(SR.Arg_ArgumentOutOfRangeException, index)); - } - if (typeof(T) == typeof(Byte)) - { - fixed (Byte* basePtr = &this.register.byte_0) - { - return (T)(object)*(basePtr + index); - } - } - else if (typeof(T) == typeof(SByte)) - { - fixed (SByte* basePtr = &this.register.sbyte_0) - { - return (T)(object)*(basePtr + index); - } - } - else if (typeof(T) == typeof(UInt16)) - { - fixed (UInt16* basePtr = &this.register.uint16_0) - { - return (T)(object)*(basePtr + index); - } - } - else if (typeof(T) == typeof(Int16)) - { - fixed (Int16* basePtr = &this.register.int16_0) - { - return (T)(object)*(basePtr + index); - } - } - else if (typeof(T) == typeof(UInt32)) - { - fixed (UInt32* basePtr = &this.register.uint32_0) - { - return (T)(object)*(basePtr + index); - } - } - else if (typeof(T) == typeof(Int32)) - { - fixed (Int32* basePtr = &this.register.int32_0) - { - return (T)(object)*(basePtr + index); - } - } - else if (typeof(T) == typeof(UInt64)) - { - fixed (UInt64* basePtr = &this.register.uint64_0) - { - return (T)(object)*(basePtr + index); - } - } - else if (typeof(T) == typeof(Int64)) - { - fixed (Int64* basePtr = &this.register.int64_0) - { - return (T)(object)*(basePtr + index); - } - } - else if (typeof(T) == typeof(Single)) - { - fixed (Single* basePtr = &this.register.single_0) - { - return (T)(object)*(basePtr + index); - } - } - else if (typeof(T) == typeof(Double)) - { - fixed (Double* basePtr = &this.register.double_0) - { - return (T)(object)*(basePtr + index); - } - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - } - - /// <summary> - /// Returns a boolean indicating whether the given Object is equal to this vector instance. - /// </summary> - /// <param name="obj">The Object to compare against.</param> - /// <returns>True if the Object is equal to this vector; False otherwise.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public override bool Equals(object obj) - { - if (!(obj is Vector<T>)) - { - return false; - } - return Equals((Vector<T>)obj); - } - - /// <summary> - /// Returns a boolean indicating whether the given vector is equal to this vector instance. - /// </summary> - /// <param name="other">The vector to compare this instance to.</param> - /// <returns>True if the other vector is equal to this instance; False otherwise.</returns> - [JitIntrinsic] - public bool Equals(Vector<T> other) - { - if (Vector.IsHardwareAccelerated) - { - for (int g = 0; g < Count; g++) - { - if (!ScalarEquals(this[g], other[g])) - { - return false; - } - } - return true; - } - else - { - if (typeof(T) == typeof(Byte)) - { - return - this.register.byte_0 == other.register.byte_0 - && this.register.byte_1 == other.register.byte_1 - && this.register.byte_2 == other.register.byte_2 - && this.register.byte_3 == other.register.byte_3 - && this.register.byte_4 == other.register.byte_4 - && this.register.byte_5 == other.register.byte_5 - && this.register.byte_6 == other.register.byte_6 - && this.register.byte_7 == other.register.byte_7 - && this.register.byte_8 == other.register.byte_8 - && this.register.byte_9 == other.register.byte_9 - && this.register.byte_10 == other.register.byte_10 - && this.register.byte_11 == other.register.byte_11 - && this.register.byte_12 == other.register.byte_12 - && this.register.byte_13 == other.register.byte_13 - && this.register.byte_14 == other.register.byte_14 - && this.register.byte_15 == other.register.byte_15; - } - else if (typeof(T) == typeof(SByte)) - { - return - this.register.sbyte_0 == other.register.sbyte_0 - && this.register.sbyte_1 == other.register.sbyte_1 - && this.register.sbyte_2 == other.register.sbyte_2 - && this.register.sbyte_3 == other.register.sbyte_3 - && this.register.sbyte_4 == other.register.sbyte_4 - && this.register.sbyte_5 == other.register.sbyte_5 - && this.register.sbyte_6 == other.register.sbyte_6 - && this.register.sbyte_7 == other.register.sbyte_7 - && this.register.sbyte_8 == other.register.sbyte_8 - && this.register.sbyte_9 == other.register.sbyte_9 - && this.register.sbyte_10 == other.register.sbyte_10 - && this.register.sbyte_11 == other.register.sbyte_11 - && this.register.sbyte_12 == other.register.sbyte_12 - && this.register.sbyte_13 == other.register.sbyte_13 - && this.register.sbyte_14 == other.register.sbyte_14 - && this.register.sbyte_15 == other.register.sbyte_15; - } - else if (typeof(T) == typeof(UInt16)) - { - return - this.register.uint16_0 == other.register.uint16_0 - && this.register.uint16_1 == other.register.uint16_1 - && this.register.uint16_2 == other.register.uint16_2 - && this.register.uint16_3 == other.register.uint16_3 - && this.register.uint16_4 == other.register.uint16_4 - && this.register.uint16_5 == other.register.uint16_5 - && this.register.uint16_6 == other.register.uint16_6 - && this.register.uint16_7 == other.register.uint16_7; - } - else if (typeof(T) == typeof(Int16)) - { - return - this.register.int16_0 == other.register.int16_0 - && this.register.int16_1 == other.register.int16_1 - && this.register.int16_2 == other.register.int16_2 - && this.register.int16_3 == other.register.int16_3 - && this.register.int16_4 == other.register.int16_4 - && this.register.int16_5 == other.register.int16_5 - && this.register.int16_6 == other.register.int16_6 - && this.register.int16_7 == other.register.int16_7; - } - else if (typeof(T) == typeof(UInt32)) - { - return - this.register.uint32_0 == other.register.uint32_0 - && this.register.uint32_1 == other.register.uint32_1 - && this.register.uint32_2 == other.register.uint32_2 - && this.register.uint32_3 == other.register.uint32_3; - } - else if (typeof(T) == typeof(Int32)) - { - return - this.register.int32_0 == other.register.int32_0 - && this.register.int32_1 == other.register.int32_1 - && this.register.int32_2 == other.register.int32_2 - && this.register.int32_3 == other.register.int32_3; - } - else if (typeof(T) == typeof(UInt64)) - { - return - this.register.uint64_0 == other.register.uint64_0 - && this.register.uint64_1 == other.register.uint64_1; - } - else if (typeof(T) == typeof(Int64)) - { - return - this.register.int64_0 == other.register.int64_0 - && this.register.int64_1 == other.register.int64_1; - } - else if (typeof(T) == typeof(Single)) - { - return - this.register.single_0 == other.register.single_0 - && this.register.single_1 == other.register.single_1 - && this.register.single_2 == other.register.single_2 - && this.register.single_3 == other.register.single_3; - } - else if (typeof(T) == typeof(Double)) - { - return - this.register.double_0 == other.register.double_0 - && this.register.double_1 == other.register.double_1; - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - } - - /// <summary> - /// Returns the hash code for this instance. - /// </summary> - /// <returns>The hash code.</returns> - public override int GetHashCode() - { - int hash = 0; - - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(Byte)) - { - for (int g = 0; g < Count; g++) - { - hash = HashCodeHelper.CombineHashCodes(hash, ((Byte)(object)this[g]).GetHashCode()); - } - return hash; - } - else if (typeof(T) == typeof(SByte)) - { - for (int g = 0; g < Count; g++) - { - hash = HashCodeHelper.CombineHashCodes(hash, ((SByte)(object)this[g]).GetHashCode()); - } - return hash; - } - else if (typeof(T) == typeof(UInt16)) - { - for (int g = 0; g < Count; g++) - { - hash = HashCodeHelper.CombineHashCodes(hash, ((UInt16)(object)this[g]).GetHashCode()); - } - return hash; - } - else if (typeof(T) == typeof(Int16)) - { - for (int g = 0; g < Count; g++) - { - hash = HashCodeHelper.CombineHashCodes(hash, ((Int16)(object)this[g]).GetHashCode()); - } - return hash; - } - else if (typeof(T) == typeof(UInt32)) - { - for (int g = 0; g < Count; g++) - { - hash = HashCodeHelper.CombineHashCodes(hash, ((UInt32)(object)this[g]).GetHashCode()); - } - return hash; - } - else if (typeof(T) == typeof(Int32)) - { - for (int g = 0; g < Count; g++) - { - hash = HashCodeHelper.CombineHashCodes(hash, ((Int32)(object)this[g]).GetHashCode()); - } - return hash; - } - else if (typeof(T) == typeof(UInt64)) - { - for (int g = 0; g < Count; g++) - { - hash = HashCodeHelper.CombineHashCodes(hash, ((UInt64)(object)this[g]).GetHashCode()); - } - return hash; - } - else if (typeof(T) == typeof(Int64)) - { - for (int g = 0; g < Count; g++) - { - hash = HashCodeHelper.CombineHashCodes(hash, ((Int64)(object)this[g]).GetHashCode()); - } - return hash; - } - else if (typeof(T) == typeof(Single)) - { - for (int g = 0; g < Count; g++) - { - hash = HashCodeHelper.CombineHashCodes(hash, ((Single)(object)this[g]).GetHashCode()); - } - return hash; - } - else if (typeof(T) == typeof(Double)) - { - for (int g = 0; g < Count; g++) - { - hash = HashCodeHelper.CombineHashCodes(hash, ((Double)(object)this[g]).GetHashCode()); - } - return hash; - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - else - { - if (typeof(T) == typeof(Byte)) - { - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_0.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_1.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_2.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_3.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_4.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_5.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_6.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_7.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_8.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_9.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_10.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_11.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_12.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_13.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_14.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.byte_15.GetHashCode()); - return hash; - } - else if (typeof(T) == typeof(SByte)) - { - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_0.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_1.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_2.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_3.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_4.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_5.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_6.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_7.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_8.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_9.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_10.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_11.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_12.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_13.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_14.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.sbyte_15.GetHashCode()); - return hash; - } - else if (typeof(T) == typeof(UInt16)) - { - hash = HashCodeHelper.CombineHashCodes(hash, this.register.uint16_0.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.uint16_1.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.uint16_2.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.uint16_3.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.uint16_4.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.uint16_5.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.uint16_6.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.uint16_7.GetHashCode()); - return hash; - } - else if (typeof(T) == typeof(Int16)) - { - hash = HashCodeHelper.CombineHashCodes(hash, this.register.int16_0.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.int16_1.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.int16_2.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.int16_3.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.int16_4.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.int16_5.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.int16_6.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.int16_7.GetHashCode()); - return hash; - } - else if (typeof(T) == typeof(UInt32)) - { - hash = HashCodeHelper.CombineHashCodes(hash, this.register.uint32_0.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.uint32_1.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.uint32_2.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.uint32_3.GetHashCode()); - return hash; - } - else if (typeof(T) == typeof(Int32)) - { - hash = HashCodeHelper.CombineHashCodes(hash, this.register.int32_0.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.int32_1.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.int32_2.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.int32_3.GetHashCode()); - return hash; - } - else if (typeof(T) == typeof(UInt64)) - { - hash = HashCodeHelper.CombineHashCodes(hash, this.register.uint64_0.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.uint64_1.GetHashCode()); - return hash; - } - else if (typeof(T) == typeof(Int64)) - { - hash = HashCodeHelper.CombineHashCodes(hash, this.register.int64_0.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.int64_1.GetHashCode()); - return hash; - } - else if (typeof(T) == typeof(Single)) - { - hash = HashCodeHelper.CombineHashCodes(hash, this.register.single_0.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.single_1.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.single_2.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.single_3.GetHashCode()); - return hash; - } - else if (typeof(T) == typeof(Double)) - { - hash = HashCodeHelper.CombineHashCodes(hash, this.register.double_0.GetHashCode()); - hash = HashCodeHelper.CombineHashCodes(hash, this.register.double_1.GetHashCode()); - return hash; - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - } - - /// <summary> - /// Returns a String representing this vector. - /// </summary> - /// <returns>The string representation.</returns> - public override string ToString() - { - return ToString("G", CultureInfo.CurrentCulture); - } - - /// <summary> - /// Returns a String representing this vector, using the specified format string to format individual elements. - /// </summary> - /// <param name="format">The format of individual elements.</param> - /// <returns>The string representation.</returns> - public string ToString(string format) - { - return ToString(format, CultureInfo.CurrentCulture); - } - - /// <summary> - /// Returns a String representing this vector, using the specified format string to format individual elements - /// and the given IFormatProvider. - /// </summary> - /// <param name="format">The format of individual elements.</param> - /// <param name="formatProvider">The format provider to use when formatting elements.</param> - /// <returns>The string representation.</returns> - public string ToString(string format, IFormatProvider formatProvider) - { - StringBuilder sb = new StringBuilder(); - string separator = NumberFormatInfo.GetInstance(formatProvider).NumberGroupSeparator; - sb.Append('<'); - for (int g = 0; g < Count - 1; g++) - { - sb.Append(((IFormattable)this[g]).ToString(format, formatProvider)); - sb.Append(separator); - sb.Append(' '); - } - // Append last element w/out separator - sb.Append(((IFormattable)this[Count - 1]).ToString(format, formatProvider)); - sb.Append('>'); - return sb.ToString(); - } - #endregion Public Instance Methods - - #region Arithmetic Operators - /// <summary> - /// Adds two vectors together. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The summed vector.</returns> - public static unsafe Vector<T> operator +(Vector<T> left, Vector<T> right) - { - unchecked - { - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(Byte)) - { - Byte* dataPtr = stackalloc Byte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Byte)(object)ScalarAdd(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(SByte)) - { - SByte* dataPtr = stackalloc SByte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (SByte)(object)ScalarAdd(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16* dataPtr = stackalloc UInt16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt16)(object)ScalarAdd(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int16)) - { - Int16* dataPtr = stackalloc Int16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int16)(object)ScalarAdd(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32* dataPtr = stackalloc UInt32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt32)(object)ScalarAdd(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int32)) - { - Int32* dataPtr = stackalloc Int32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int32)(object)ScalarAdd(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64* dataPtr = stackalloc UInt64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt64)(object)ScalarAdd(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int64)) - { - Int64* dataPtr = stackalloc Int64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int64)(object)ScalarAdd(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Single)) - { - Single* dataPtr = stackalloc Single[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Single)(object)ScalarAdd(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Double)) - { - Double* dataPtr = stackalloc Double[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Double)(object)ScalarAdd(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - else - { - Vector<T> sum = new Vector<T>(); - if (typeof(T) == typeof(Byte)) - { - sum.register.byte_0 = (Byte)(left.register.byte_0 + right.register.byte_0); - sum.register.byte_1 = (Byte)(left.register.byte_1 + right.register.byte_1); - sum.register.byte_2 = (Byte)(left.register.byte_2 + right.register.byte_2); - sum.register.byte_3 = (Byte)(left.register.byte_3 + right.register.byte_3); - sum.register.byte_4 = (Byte)(left.register.byte_4 + right.register.byte_4); - sum.register.byte_5 = (Byte)(left.register.byte_5 + right.register.byte_5); - sum.register.byte_6 = (Byte)(left.register.byte_6 + right.register.byte_6); - sum.register.byte_7 = (Byte)(left.register.byte_7 + right.register.byte_7); - sum.register.byte_8 = (Byte)(left.register.byte_8 + right.register.byte_8); - sum.register.byte_9 = (Byte)(left.register.byte_9 + right.register.byte_9); - sum.register.byte_10 = (Byte)(left.register.byte_10 + right.register.byte_10); - sum.register.byte_11 = (Byte)(left.register.byte_11 + right.register.byte_11); - sum.register.byte_12 = (Byte)(left.register.byte_12 + right.register.byte_12); - sum.register.byte_13 = (Byte)(left.register.byte_13 + right.register.byte_13); - sum.register.byte_14 = (Byte)(left.register.byte_14 + right.register.byte_14); - sum.register.byte_15 = (Byte)(left.register.byte_15 + right.register.byte_15); - } - else if (typeof(T) == typeof(SByte)) - { - sum.register.sbyte_0 = (SByte)(left.register.sbyte_0 + right.register.sbyte_0); - sum.register.sbyte_1 = (SByte)(left.register.sbyte_1 + right.register.sbyte_1); - sum.register.sbyte_2 = (SByte)(left.register.sbyte_2 + right.register.sbyte_2); - sum.register.sbyte_3 = (SByte)(left.register.sbyte_3 + right.register.sbyte_3); - sum.register.sbyte_4 = (SByte)(left.register.sbyte_4 + right.register.sbyte_4); - sum.register.sbyte_5 = (SByte)(left.register.sbyte_5 + right.register.sbyte_5); - sum.register.sbyte_6 = (SByte)(left.register.sbyte_6 + right.register.sbyte_6); - sum.register.sbyte_7 = (SByte)(left.register.sbyte_7 + right.register.sbyte_7); - sum.register.sbyte_8 = (SByte)(left.register.sbyte_8 + right.register.sbyte_8); - sum.register.sbyte_9 = (SByte)(left.register.sbyte_9 + right.register.sbyte_9); - sum.register.sbyte_10 = (SByte)(left.register.sbyte_10 + right.register.sbyte_10); - sum.register.sbyte_11 = (SByte)(left.register.sbyte_11 + right.register.sbyte_11); - sum.register.sbyte_12 = (SByte)(left.register.sbyte_12 + right.register.sbyte_12); - sum.register.sbyte_13 = (SByte)(left.register.sbyte_13 + right.register.sbyte_13); - sum.register.sbyte_14 = (SByte)(left.register.sbyte_14 + right.register.sbyte_14); - sum.register.sbyte_15 = (SByte)(left.register.sbyte_15 + right.register.sbyte_15); - } - else if (typeof(T) == typeof(UInt16)) - { - sum.register.uint16_0 = (UInt16)(left.register.uint16_0 + right.register.uint16_0); - sum.register.uint16_1 = (UInt16)(left.register.uint16_1 + right.register.uint16_1); - sum.register.uint16_2 = (UInt16)(left.register.uint16_2 + right.register.uint16_2); - sum.register.uint16_3 = (UInt16)(left.register.uint16_3 + right.register.uint16_3); - sum.register.uint16_4 = (UInt16)(left.register.uint16_4 + right.register.uint16_4); - sum.register.uint16_5 = (UInt16)(left.register.uint16_5 + right.register.uint16_5); - sum.register.uint16_6 = (UInt16)(left.register.uint16_6 + right.register.uint16_6); - sum.register.uint16_7 = (UInt16)(left.register.uint16_7 + right.register.uint16_7); - } - else if (typeof(T) == typeof(Int16)) - { - sum.register.int16_0 = (Int16)(left.register.int16_0 + right.register.int16_0); - sum.register.int16_1 = (Int16)(left.register.int16_1 + right.register.int16_1); - sum.register.int16_2 = (Int16)(left.register.int16_2 + right.register.int16_2); - sum.register.int16_3 = (Int16)(left.register.int16_3 + right.register.int16_3); - sum.register.int16_4 = (Int16)(left.register.int16_4 + right.register.int16_4); - sum.register.int16_5 = (Int16)(left.register.int16_5 + right.register.int16_5); - sum.register.int16_6 = (Int16)(left.register.int16_6 + right.register.int16_6); - sum.register.int16_7 = (Int16)(left.register.int16_7 + right.register.int16_7); - } - else if (typeof(T) == typeof(UInt32)) - { - sum.register.uint32_0 = (UInt32)(left.register.uint32_0 + right.register.uint32_0); - sum.register.uint32_1 = (UInt32)(left.register.uint32_1 + right.register.uint32_1); - sum.register.uint32_2 = (UInt32)(left.register.uint32_2 + right.register.uint32_2); - sum.register.uint32_3 = (UInt32)(left.register.uint32_3 + right.register.uint32_3); - } - else if (typeof(T) == typeof(Int32)) - { - sum.register.int32_0 = (Int32)(left.register.int32_0 + right.register.int32_0); - sum.register.int32_1 = (Int32)(left.register.int32_1 + right.register.int32_1); - sum.register.int32_2 = (Int32)(left.register.int32_2 + right.register.int32_2); - sum.register.int32_3 = (Int32)(left.register.int32_3 + right.register.int32_3); - } - else if (typeof(T) == typeof(UInt64)) - { - sum.register.uint64_0 = (UInt64)(left.register.uint64_0 + right.register.uint64_0); - sum.register.uint64_1 = (UInt64)(left.register.uint64_1 + right.register.uint64_1); - } - else if (typeof(T) == typeof(Int64)) - { - sum.register.int64_0 = (Int64)(left.register.int64_0 + right.register.int64_0); - sum.register.int64_1 = (Int64)(left.register.int64_1 + right.register.int64_1); - } - else if (typeof(T) == typeof(Single)) - { - sum.register.single_0 = (Single)(left.register.single_0 + right.register.single_0); - sum.register.single_1 = (Single)(left.register.single_1 + right.register.single_1); - sum.register.single_2 = (Single)(left.register.single_2 + right.register.single_2); - sum.register.single_3 = (Single)(left.register.single_3 + right.register.single_3); - } - else if (typeof(T) == typeof(Double)) - { - sum.register.double_0 = (Double)(left.register.double_0 + right.register.double_0); - sum.register.double_1 = (Double)(left.register.double_1 + right.register.double_1); - } - return sum; - } - } - } - - /// <summary> - /// Subtracts the second vector from the first. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The difference vector.</returns> - public static unsafe Vector<T> operator -(Vector<T> left, Vector<T> right) - { - unchecked - { - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(Byte)) - { - Byte* dataPtr = stackalloc Byte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Byte)(object)ScalarSubtract(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(SByte)) - { - SByte* dataPtr = stackalloc SByte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (SByte)(object)ScalarSubtract(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16* dataPtr = stackalloc UInt16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt16)(object)ScalarSubtract(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int16)) - { - Int16* dataPtr = stackalloc Int16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int16)(object)ScalarSubtract(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32* dataPtr = stackalloc UInt32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt32)(object)ScalarSubtract(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int32)) - { - Int32* dataPtr = stackalloc Int32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int32)(object)ScalarSubtract(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64* dataPtr = stackalloc UInt64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt64)(object)ScalarSubtract(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int64)) - { - Int64* dataPtr = stackalloc Int64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int64)(object)ScalarSubtract(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Single)) - { - Single* dataPtr = stackalloc Single[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Single)(object)ScalarSubtract(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Double)) - { - Double* dataPtr = stackalloc Double[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Double)(object)ScalarSubtract(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - else - { - Vector<T> difference = new Vector<T>(); - if (typeof(T) == typeof(Byte)) - { - difference.register.byte_0 = (Byte)(left.register.byte_0 - right.register.byte_0); - difference.register.byte_1 = (Byte)(left.register.byte_1 - right.register.byte_1); - difference.register.byte_2 = (Byte)(left.register.byte_2 - right.register.byte_2); - difference.register.byte_3 = (Byte)(left.register.byte_3 - right.register.byte_3); - difference.register.byte_4 = (Byte)(left.register.byte_4 - right.register.byte_4); - difference.register.byte_5 = (Byte)(left.register.byte_5 - right.register.byte_5); - difference.register.byte_6 = (Byte)(left.register.byte_6 - right.register.byte_6); - difference.register.byte_7 = (Byte)(left.register.byte_7 - right.register.byte_7); - difference.register.byte_8 = (Byte)(left.register.byte_8 - right.register.byte_8); - difference.register.byte_9 = (Byte)(left.register.byte_9 - right.register.byte_9); - difference.register.byte_10 = (Byte)(left.register.byte_10 - right.register.byte_10); - difference.register.byte_11 = (Byte)(left.register.byte_11 - right.register.byte_11); - difference.register.byte_12 = (Byte)(left.register.byte_12 - right.register.byte_12); - difference.register.byte_13 = (Byte)(left.register.byte_13 - right.register.byte_13); - difference.register.byte_14 = (Byte)(left.register.byte_14 - right.register.byte_14); - difference.register.byte_15 = (Byte)(left.register.byte_15 - right.register.byte_15); - } - else if (typeof(T) == typeof(SByte)) - { - difference.register.sbyte_0 = (SByte)(left.register.sbyte_0 - right.register.sbyte_0); - difference.register.sbyte_1 = (SByte)(left.register.sbyte_1 - right.register.sbyte_1); - difference.register.sbyte_2 = (SByte)(left.register.sbyte_2 - right.register.sbyte_2); - difference.register.sbyte_3 = (SByte)(left.register.sbyte_3 - right.register.sbyte_3); - difference.register.sbyte_4 = (SByte)(left.register.sbyte_4 - right.register.sbyte_4); - difference.register.sbyte_5 = (SByte)(left.register.sbyte_5 - right.register.sbyte_5); - difference.register.sbyte_6 = (SByte)(left.register.sbyte_6 - right.register.sbyte_6); - difference.register.sbyte_7 = (SByte)(left.register.sbyte_7 - right.register.sbyte_7); - difference.register.sbyte_8 = (SByte)(left.register.sbyte_8 - right.register.sbyte_8); - difference.register.sbyte_9 = (SByte)(left.register.sbyte_9 - right.register.sbyte_9); - difference.register.sbyte_10 = (SByte)(left.register.sbyte_10 - right.register.sbyte_10); - difference.register.sbyte_11 = (SByte)(left.register.sbyte_11 - right.register.sbyte_11); - difference.register.sbyte_12 = (SByte)(left.register.sbyte_12 - right.register.sbyte_12); - difference.register.sbyte_13 = (SByte)(left.register.sbyte_13 - right.register.sbyte_13); - difference.register.sbyte_14 = (SByte)(left.register.sbyte_14 - right.register.sbyte_14); - difference.register.sbyte_15 = (SByte)(left.register.sbyte_15 - right.register.sbyte_15); - } - else if (typeof(T) == typeof(UInt16)) - { - difference.register.uint16_0 = (UInt16)(left.register.uint16_0 - right.register.uint16_0); - difference.register.uint16_1 = (UInt16)(left.register.uint16_1 - right.register.uint16_1); - difference.register.uint16_2 = (UInt16)(left.register.uint16_2 - right.register.uint16_2); - difference.register.uint16_3 = (UInt16)(left.register.uint16_3 - right.register.uint16_3); - difference.register.uint16_4 = (UInt16)(left.register.uint16_4 - right.register.uint16_4); - difference.register.uint16_5 = (UInt16)(left.register.uint16_5 - right.register.uint16_5); - difference.register.uint16_6 = (UInt16)(left.register.uint16_6 - right.register.uint16_6); - difference.register.uint16_7 = (UInt16)(left.register.uint16_7 - right.register.uint16_7); - } - else if (typeof(T) == typeof(Int16)) - { - difference.register.int16_0 = (Int16)(left.register.int16_0 - right.register.int16_0); - difference.register.int16_1 = (Int16)(left.register.int16_1 - right.register.int16_1); - difference.register.int16_2 = (Int16)(left.register.int16_2 - right.register.int16_2); - difference.register.int16_3 = (Int16)(left.register.int16_3 - right.register.int16_3); - difference.register.int16_4 = (Int16)(left.register.int16_4 - right.register.int16_4); - difference.register.int16_5 = (Int16)(left.register.int16_5 - right.register.int16_5); - difference.register.int16_6 = (Int16)(left.register.int16_6 - right.register.int16_6); - difference.register.int16_7 = (Int16)(left.register.int16_7 - right.register.int16_7); - } - else if (typeof(T) == typeof(UInt32)) - { - difference.register.uint32_0 = (UInt32)(left.register.uint32_0 - right.register.uint32_0); - difference.register.uint32_1 = (UInt32)(left.register.uint32_1 - right.register.uint32_1); - difference.register.uint32_2 = (UInt32)(left.register.uint32_2 - right.register.uint32_2); - difference.register.uint32_3 = (UInt32)(left.register.uint32_3 - right.register.uint32_3); - } - else if (typeof(T) == typeof(Int32)) - { - difference.register.int32_0 = (Int32)(left.register.int32_0 - right.register.int32_0); - difference.register.int32_1 = (Int32)(left.register.int32_1 - right.register.int32_1); - difference.register.int32_2 = (Int32)(left.register.int32_2 - right.register.int32_2); - difference.register.int32_3 = (Int32)(left.register.int32_3 - right.register.int32_3); - } - else if (typeof(T) == typeof(UInt64)) - { - difference.register.uint64_0 = (UInt64)(left.register.uint64_0 - right.register.uint64_0); - difference.register.uint64_1 = (UInt64)(left.register.uint64_1 - right.register.uint64_1); - } - else if (typeof(T) == typeof(Int64)) - { - difference.register.int64_0 = (Int64)(left.register.int64_0 - right.register.int64_0); - difference.register.int64_1 = (Int64)(left.register.int64_1 - right.register.int64_1); - } - else if (typeof(T) == typeof(Single)) - { - difference.register.single_0 = (Single)(left.register.single_0 - right.register.single_0); - difference.register.single_1 = (Single)(left.register.single_1 - right.register.single_1); - difference.register.single_2 = (Single)(left.register.single_2 - right.register.single_2); - difference.register.single_3 = (Single)(left.register.single_3 - right.register.single_3); - } - else if (typeof(T) == typeof(Double)) - { - difference.register.double_0 = (Double)(left.register.double_0 - right.register.double_0); - difference.register.double_1 = (Double)(left.register.double_1 - right.register.double_1); - } - return difference; - } - } - } - - // This method is intrinsic only for certain types. It cannot access fields directly unless we are sure the context is unaccelerated. - /// <summary> - /// Multiplies two vectors together. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The product vector.</returns> - public static unsafe Vector<T> operator *(Vector<T> left, Vector<T> right) - { - unchecked - { - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(Byte)) - { - Byte* dataPtr = stackalloc Byte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Byte)(object)ScalarMultiply(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(SByte)) - { - SByte* dataPtr = stackalloc SByte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (SByte)(object)ScalarMultiply(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16* dataPtr = stackalloc UInt16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt16)(object)ScalarMultiply(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int16)) - { - Int16* dataPtr = stackalloc Int16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int16)(object)ScalarMultiply(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32* dataPtr = stackalloc UInt32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt32)(object)ScalarMultiply(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int32)) - { - Int32* dataPtr = stackalloc Int32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int32)(object)ScalarMultiply(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64* dataPtr = stackalloc UInt64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt64)(object)ScalarMultiply(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int64)) - { - Int64* dataPtr = stackalloc Int64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int64)(object)ScalarMultiply(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Single)) - { - Single* dataPtr = stackalloc Single[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Single)(object)ScalarMultiply(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Double)) - { - Double* dataPtr = stackalloc Double[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Double)(object)ScalarMultiply(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - else - { - Vector<T> product = new Vector<T>(); - if (typeof(T) == typeof(Byte)) - { - product.register.byte_0 = (Byte)(left.register.byte_0 * right.register.byte_0); - product.register.byte_1 = (Byte)(left.register.byte_1 * right.register.byte_1); - product.register.byte_2 = (Byte)(left.register.byte_2 * right.register.byte_2); - product.register.byte_3 = (Byte)(left.register.byte_3 * right.register.byte_3); - product.register.byte_4 = (Byte)(left.register.byte_4 * right.register.byte_4); - product.register.byte_5 = (Byte)(left.register.byte_5 * right.register.byte_5); - product.register.byte_6 = (Byte)(left.register.byte_6 * right.register.byte_6); - product.register.byte_7 = (Byte)(left.register.byte_7 * right.register.byte_7); - product.register.byte_8 = (Byte)(left.register.byte_8 * right.register.byte_8); - product.register.byte_9 = (Byte)(left.register.byte_9 * right.register.byte_9); - product.register.byte_10 = (Byte)(left.register.byte_10 * right.register.byte_10); - product.register.byte_11 = (Byte)(left.register.byte_11 * right.register.byte_11); - product.register.byte_12 = (Byte)(left.register.byte_12 * right.register.byte_12); - product.register.byte_13 = (Byte)(left.register.byte_13 * right.register.byte_13); - product.register.byte_14 = (Byte)(left.register.byte_14 * right.register.byte_14); - product.register.byte_15 = (Byte)(left.register.byte_15 * right.register.byte_15); - } - else if (typeof(T) == typeof(SByte)) - { - product.register.sbyte_0 = (SByte)(left.register.sbyte_0 * right.register.sbyte_0); - product.register.sbyte_1 = (SByte)(left.register.sbyte_1 * right.register.sbyte_1); - product.register.sbyte_2 = (SByte)(left.register.sbyte_2 * right.register.sbyte_2); - product.register.sbyte_3 = (SByte)(left.register.sbyte_3 * right.register.sbyte_3); - product.register.sbyte_4 = (SByte)(left.register.sbyte_4 * right.register.sbyte_4); - product.register.sbyte_5 = (SByte)(left.register.sbyte_5 * right.register.sbyte_5); - product.register.sbyte_6 = (SByte)(left.register.sbyte_6 * right.register.sbyte_6); - product.register.sbyte_7 = (SByte)(left.register.sbyte_7 * right.register.sbyte_7); - product.register.sbyte_8 = (SByte)(left.register.sbyte_8 * right.register.sbyte_8); - product.register.sbyte_9 = (SByte)(left.register.sbyte_9 * right.register.sbyte_9); - product.register.sbyte_10 = (SByte)(left.register.sbyte_10 * right.register.sbyte_10); - product.register.sbyte_11 = (SByte)(left.register.sbyte_11 * right.register.sbyte_11); - product.register.sbyte_12 = (SByte)(left.register.sbyte_12 * right.register.sbyte_12); - product.register.sbyte_13 = (SByte)(left.register.sbyte_13 * right.register.sbyte_13); - product.register.sbyte_14 = (SByte)(left.register.sbyte_14 * right.register.sbyte_14); - product.register.sbyte_15 = (SByte)(left.register.sbyte_15 * right.register.sbyte_15); - } - else if (typeof(T) == typeof(UInt16)) - { - product.register.uint16_0 = (UInt16)(left.register.uint16_0 * right.register.uint16_0); - product.register.uint16_1 = (UInt16)(left.register.uint16_1 * right.register.uint16_1); - product.register.uint16_2 = (UInt16)(left.register.uint16_2 * right.register.uint16_2); - product.register.uint16_3 = (UInt16)(left.register.uint16_3 * right.register.uint16_3); - product.register.uint16_4 = (UInt16)(left.register.uint16_4 * right.register.uint16_4); - product.register.uint16_5 = (UInt16)(left.register.uint16_5 * right.register.uint16_5); - product.register.uint16_6 = (UInt16)(left.register.uint16_6 * right.register.uint16_6); - product.register.uint16_7 = (UInt16)(left.register.uint16_7 * right.register.uint16_7); - } - else if (typeof(T) == typeof(Int16)) - { - product.register.int16_0 = (Int16)(left.register.int16_0 * right.register.int16_0); - product.register.int16_1 = (Int16)(left.register.int16_1 * right.register.int16_1); - product.register.int16_2 = (Int16)(left.register.int16_2 * right.register.int16_2); - product.register.int16_3 = (Int16)(left.register.int16_3 * right.register.int16_3); - product.register.int16_4 = (Int16)(left.register.int16_4 * right.register.int16_4); - product.register.int16_5 = (Int16)(left.register.int16_5 * right.register.int16_5); - product.register.int16_6 = (Int16)(left.register.int16_6 * right.register.int16_6); - product.register.int16_7 = (Int16)(left.register.int16_7 * right.register.int16_7); - } - else if (typeof(T) == typeof(UInt32)) - { - product.register.uint32_0 = (UInt32)(left.register.uint32_0 * right.register.uint32_0); - product.register.uint32_1 = (UInt32)(left.register.uint32_1 * right.register.uint32_1); - product.register.uint32_2 = (UInt32)(left.register.uint32_2 * right.register.uint32_2); - product.register.uint32_3 = (UInt32)(left.register.uint32_3 * right.register.uint32_3); - } - else if (typeof(T) == typeof(Int32)) - { - product.register.int32_0 = (Int32)(left.register.int32_0 * right.register.int32_0); - product.register.int32_1 = (Int32)(left.register.int32_1 * right.register.int32_1); - product.register.int32_2 = (Int32)(left.register.int32_2 * right.register.int32_2); - product.register.int32_3 = (Int32)(left.register.int32_3 * right.register.int32_3); - } - else if (typeof(T) == typeof(UInt64)) - { - product.register.uint64_0 = (UInt64)(left.register.uint64_0 * right.register.uint64_0); - product.register.uint64_1 = (UInt64)(left.register.uint64_1 * right.register.uint64_1); - } - else if (typeof(T) == typeof(Int64)) - { - product.register.int64_0 = (Int64)(left.register.int64_0 * right.register.int64_0); - product.register.int64_1 = (Int64)(left.register.int64_1 * right.register.int64_1); - } - else if (typeof(T) == typeof(Single)) - { - product.register.single_0 = (Single)(left.register.single_0 * right.register.single_0); - product.register.single_1 = (Single)(left.register.single_1 * right.register.single_1); - product.register.single_2 = (Single)(left.register.single_2 * right.register.single_2); - product.register.single_3 = (Single)(left.register.single_3 * right.register.single_3); - } - else if (typeof(T) == typeof(Double)) - { - product.register.double_0 = (Double)(left.register.double_0 * right.register.double_0); - product.register.double_1 = (Double)(left.register.double_1 * right.register.double_1); - } - return product; - } - } - } - - // This method is intrinsic only for certain types. It cannot access fields directly unless we are sure the context is unaccelerated. - /// <summary> - /// Multiplies a vector by the given scalar. - /// </summary> - /// <param name="value">The source vector.</param> - /// <param name="factor">The scalar value.</param> - /// <returns>The scaled vector.</returns> - public static Vector<T> operator *(Vector<T> value, T factor) - { - unchecked - { - if (Vector.IsHardwareAccelerated) - { - return new Vector<T>(factor) * value; - } - else - { - Vector<T> product = new Vector<T>(); - if (typeof(T) == typeof(Byte)) - { - product.register.byte_0 = (Byte)(value.register.byte_0 * (Byte)(object)factor); - product.register.byte_1 = (Byte)(value.register.byte_1 * (Byte)(object)factor); - product.register.byte_2 = (Byte)(value.register.byte_2 * (Byte)(object)factor); - product.register.byte_3 = (Byte)(value.register.byte_3 * (Byte)(object)factor); - product.register.byte_4 = (Byte)(value.register.byte_4 * (Byte)(object)factor); - product.register.byte_5 = (Byte)(value.register.byte_5 * (Byte)(object)factor); - product.register.byte_6 = (Byte)(value.register.byte_6 * (Byte)(object)factor); - product.register.byte_7 = (Byte)(value.register.byte_7 * (Byte)(object)factor); - product.register.byte_8 = (Byte)(value.register.byte_8 * (Byte)(object)factor); - product.register.byte_9 = (Byte)(value.register.byte_9 * (Byte)(object)factor); - product.register.byte_10 = (Byte)(value.register.byte_10 * (Byte)(object)factor); - product.register.byte_11 = (Byte)(value.register.byte_11 * (Byte)(object)factor); - product.register.byte_12 = (Byte)(value.register.byte_12 * (Byte)(object)factor); - product.register.byte_13 = (Byte)(value.register.byte_13 * (Byte)(object)factor); - product.register.byte_14 = (Byte)(value.register.byte_14 * (Byte)(object)factor); - product.register.byte_15 = (Byte)(value.register.byte_15 * (Byte)(object)factor); - } - else if (typeof(T) == typeof(SByte)) - { - product.register.sbyte_0 = (SByte)(value.register.sbyte_0 * (SByte)(object)factor); - product.register.sbyte_1 = (SByte)(value.register.sbyte_1 * (SByte)(object)factor); - product.register.sbyte_2 = (SByte)(value.register.sbyte_2 * (SByte)(object)factor); - product.register.sbyte_3 = (SByte)(value.register.sbyte_3 * (SByte)(object)factor); - product.register.sbyte_4 = (SByte)(value.register.sbyte_4 * (SByte)(object)factor); - product.register.sbyte_5 = (SByte)(value.register.sbyte_5 * (SByte)(object)factor); - product.register.sbyte_6 = (SByte)(value.register.sbyte_6 * (SByte)(object)factor); - product.register.sbyte_7 = (SByte)(value.register.sbyte_7 * (SByte)(object)factor); - product.register.sbyte_8 = (SByte)(value.register.sbyte_8 * (SByte)(object)factor); - product.register.sbyte_9 = (SByte)(value.register.sbyte_9 * (SByte)(object)factor); - product.register.sbyte_10 = (SByte)(value.register.sbyte_10 * (SByte)(object)factor); - product.register.sbyte_11 = (SByte)(value.register.sbyte_11 * (SByte)(object)factor); - product.register.sbyte_12 = (SByte)(value.register.sbyte_12 * (SByte)(object)factor); - product.register.sbyte_13 = (SByte)(value.register.sbyte_13 * (SByte)(object)factor); - product.register.sbyte_14 = (SByte)(value.register.sbyte_14 * (SByte)(object)factor); - product.register.sbyte_15 = (SByte)(value.register.sbyte_15 * (SByte)(object)factor); - } - else if (typeof(T) == typeof(UInt16)) - { - product.register.uint16_0 = (UInt16)(value.register.uint16_0 * (UInt16)(object)factor); - product.register.uint16_1 = (UInt16)(value.register.uint16_1 * (UInt16)(object)factor); - product.register.uint16_2 = (UInt16)(value.register.uint16_2 * (UInt16)(object)factor); - product.register.uint16_3 = (UInt16)(value.register.uint16_3 * (UInt16)(object)factor); - product.register.uint16_4 = (UInt16)(value.register.uint16_4 * (UInt16)(object)factor); - product.register.uint16_5 = (UInt16)(value.register.uint16_5 * (UInt16)(object)factor); - product.register.uint16_6 = (UInt16)(value.register.uint16_6 * (UInt16)(object)factor); - product.register.uint16_7 = (UInt16)(value.register.uint16_7 * (UInt16)(object)factor); - } - else if (typeof(T) == typeof(Int16)) - { - product.register.int16_0 = (Int16)(value.register.int16_0 * (Int16)(object)factor); - product.register.int16_1 = (Int16)(value.register.int16_1 * (Int16)(object)factor); - product.register.int16_2 = (Int16)(value.register.int16_2 * (Int16)(object)factor); - product.register.int16_3 = (Int16)(value.register.int16_3 * (Int16)(object)factor); - product.register.int16_4 = (Int16)(value.register.int16_4 * (Int16)(object)factor); - product.register.int16_5 = (Int16)(value.register.int16_5 * (Int16)(object)factor); - product.register.int16_6 = (Int16)(value.register.int16_6 * (Int16)(object)factor); - product.register.int16_7 = (Int16)(value.register.int16_7 * (Int16)(object)factor); - } - else if (typeof(T) == typeof(UInt32)) - { - product.register.uint32_0 = (UInt32)(value.register.uint32_0 * (UInt32)(object)factor); - product.register.uint32_1 = (UInt32)(value.register.uint32_1 * (UInt32)(object)factor); - product.register.uint32_2 = (UInt32)(value.register.uint32_2 * (UInt32)(object)factor); - product.register.uint32_3 = (UInt32)(value.register.uint32_3 * (UInt32)(object)factor); - } - else if (typeof(T) == typeof(Int32)) - { - product.register.int32_0 = (Int32)(value.register.int32_0 * (Int32)(object)factor); - product.register.int32_1 = (Int32)(value.register.int32_1 * (Int32)(object)factor); - product.register.int32_2 = (Int32)(value.register.int32_2 * (Int32)(object)factor); - product.register.int32_3 = (Int32)(value.register.int32_3 * (Int32)(object)factor); - } - else if (typeof(T) == typeof(UInt64)) - { - product.register.uint64_0 = (UInt64)(value.register.uint64_0 * (UInt64)(object)factor); - product.register.uint64_1 = (UInt64)(value.register.uint64_1 * (UInt64)(object)factor); - } - else if (typeof(T) == typeof(Int64)) - { - product.register.int64_0 = (Int64)(value.register.int64_0 * (Int64)(object)factor); - product.register.int64_1 = (Int64)(value.register.int64_1 * (Int64)(object)factor); - } - else if (typeof(T) == typeof(Single)) - { - product.register.single_0 = (Single)(value.register.single_0 * (Single)(object)factor); - product.register.single_1 = (Single)(value.register.single_1 * (Single)(object)factor); - product.register.single_2 = (Single)(value.register.single_2 * (Single)(object)factor); - product.register.single_3 = (Single)(value.register.single_3 * (Single)(object)factor); - } - else if (typeof(T) == typeof(Double)) - { - product.register.double_0 = (Double)(value.register.double_0 * (Double)(object)factor); - product.register.double_1 = (Double)(value.register.double_1 * (Double)(object)factor); - } - return product; - } - } - } - - // This method is intrinsic only for certain types. It cannot access fields directly unless we are sure the context is unaccelerated. - /// <summary> - /// Multiplies a vector by the given scalar. - /// </summary> - /// <param name="factor">The scalar value.</param> - /// <param name="value">The source vector.</param> - /// <returns>The scaled vector.</returns> - public static Vector<T> operator *(T factor, Vector<T> value) - { - unchecked - { - if (Vector.IsHardwareAccelerated) - { - return new Vector<T>(factor) * value; - } - else - { - Vector<T> product = new Vector<T>(); - if (typeof(T) == typeof(Byte)) - { - product.register.byte_0 = (Byte)(value.register.byte_0 * (Byte)(object)factor); - product.register.byte_1 = (Byte)(value.register.byte_1 * (Byte)(object)factor); - product.register.byte_2 = (Byte)(value.register.byte_2 * (Byte)(object)factor); - product.register.byte_3 = (Byte)(value.register.byte_3 * (Byte)(object)factor); - product.register.byte_4 = (Byte)(value.register.byte_4 * (Byte)(object)factor); - product.register.byte_5 = (Byte)(value.register.byte_5 * (Byte)(object)factor); - product.register.byte_6 = (Byte)(value.register.byte_6 * (Byte)(object)factor); - product.register.byte_7 = (Byte)(value.register.byte_7 * (Byte)(object)factor); - product.register.byte_8 = (Byte)(value.register.byte_8 * (Byte)(object)factor); - product.register.byte_9 = (Byte)(value.register.byte_9 * (Byte)(object)factor); - product.register.byte_10 = (Byte)(value.register.byte_10 * (Byte)(object)factor); - product.register.byte_11 = (Byte)(value.register.byte_11 * (Byte)(object)factor); - product.register.byte_12 = (Byte)(value.register.byte_12 * (Byte)(object)factor); - product.register.byte_13 = (Byte)(value.register.byte_13 * (Byte)(object)factor); - product.register.byte_14 = (Byte)(value.register.byte_14 * (Byte)(object)factor); - product.register.byte_15 = (Byte)(value.register.byte_15 * (Byte)(object)factor); - } - else if (typeof(T) == typeof(SByte)) - { - product.register.sbyte_0 = (SByte)(value.register.sbyte_0 * (SByte)(object)factor); - product.register.sbyte_1 = (SByte)(value.register.sbyte_1 * (SByte)(object)factor); - product.register.sbyte_2 = (SByte)(value.register.sbyte_2 * (SByte)(object)factor); - product.register.sbyte_3 = (SByte)(value.register.sbyte_3 * (SByte)(object)factor); - product.register.sbyte_4 = (SByte)(value.register.sbyte_4 * (SByte)(object)factor); - product.register.sbyte_5 = (SByte)(value.register.sbyte_5 * (SByte)(object)factor); - product.register.sbyte_6 = (SByte)(value.register.sbyte_6 * (SByte)(object)factor); - product.register.sbyte_7 = (SByte)(value.register.sbyte_7 * (SByte)(object)factor); - product.register.sbyte_8 = (SByte)(value.register.sbyte_8 * (SByte)(object)factor); - product.register.sbyte_9 = (SByte)(value.register.sbyte_9 * (SByte)(object)factor); - product.register.sbyte_10 = (SByte)(value.register.sbyte_10 * (SByte)(object)factor); - product.register.sbyte_11 = (SByte)(value.register.sbyte_11 * (SByte)(object)factor); - product.register.sbyte_12 = (SByte)(value.register.sbyte_12 * (SByte)(object)factor); - product.register.sbyte_13 = (SByte)(value.register.sbyte_13 * (SByte)(object)factor); - product.register.sbyte_14 = (SByte)(value.register.sbyte_14 * (SByte)(object)factor); - product.register.sbyte_15 = (SByte)(value.register.sbyte_15 * (SByte)(object)factor); - } - else if (typeof(T) == typeof(UInt16)) - { - product.register.uint16_0 = (UInt16)(value.register.uint16_0 * (UInt16)(object)factor); - product.register.uint16_1 = (UInt16)(value.register.uint16_1 * (UInt16)(object)factor); - product.register.uint16_2 = (UInt16)(value.register.uint16_2 * (UInt16)(object)factor); - product.register.uint16_3 = (UInt16)(value.register.uint16_3 * (UInt16)(object)factor); - product.register.uint16_4 = (UInt16)(value.register.uint16_4 * (UInt16)(object)factor); - product.register.uint16_5 = (UInt16)(value.register.uint16_5 * (UInt16)(object)factor); - product.register.uint16_6 = (UInt16)(value.register.uint16_6 * (UInt16)(object)factor); - product.register.uint16_7 = (UInt16)(value.register.uint16_7 * (UInt16)(object)factor); - } - else if (typeof(T) == typeof(Int16)) - { - product.register.int16_0 = (Int16)(value.register.int16_0 * (Int16)(object)factor); - product.register.int16_1 = (Int16)(value.register.int16_1 * (Int16)(object)factor); - product.register.int16_2 = (Int16)(value.register.int16_2 * (Int16)(object)factor); - product.register.int16_3 = (Int16)(value.register.int16_3 * (Int16)(object)factor); - product.register.int16_4 = (Int16)(value.register.int16_4 * (Int16)(object)factor); - product.register.int16_5 = (Int16)(value.register.int16_5 * (Int16)(object)factor); - product.register.int16_6 = (Int16)(value.register.int16_6 * (Int16)(object)factor); - product.register.int16_7 = (Int16)(value.register.int16_7 * (Int16)(object)factor); - } - else if (typeof(T) == typeof(UInt32)) - { - product.register.uint32_0 = (UInt32)(value.register.uint32_0 * (UInt32)(object)factor); - product.register.uint32_1 = (UInt32)(value.register.uint32_1 * (UInt32)(object)factor); - product.register.uint32_2 = (UInt32)(value.register.uint32_2 * (UInt32)(object)factor); - product.register.uint32_3 = (UInt32)(value.register.uint32_3 * (UInt32)(object)factor); - } - else if (typeof(T) == typeof(Int32)) - { - product.register.int32_0 = (Int32)(value.register.int32_0 * (Int32)(object)factor); - product.register.int32_1 = (Int32)(value.register.int32_1 * (Int32)(object)factor); - product.register.int32_2 = (Int32)(value.register.int32_2 * (Int32)(object)factor); - product.register.int32_3 = (Int32)(value.register.int32_3 * (Int32)(object)factor); - } - else if (typeof(T) == typeof(UInt64)) - { - product.register.uint64_0 = (UInt64)(value.register.uint64_0 * (UInt64)(object)factor); - product.register.uint64_1 = (UInt64)(value.register.uint64_1 * (UInt64)(object)factor); - } - else if (typeof(T) == typeof(Int64)) - { - product.register.int64_0 = (Int64)(value.register.int64_0 * (Int64)(object)factor); - product.register.int64_1 = (Int64)(value.register.int64_1 * (Int64)(object)factor); - } - else if (typeof(T) == typeof(Single)) - { - product.register.single_0 = (Single)(value.register.single_0 * (Single)(object)factor); - product.register.single_1 = (Single)(value.register.single_1 * (Single)(object)factor); - product.register.single_2 = (Single)(value.register.single_2 * (Single)(object)factor); - product.register.single_3 = (Single)(value.register.single_3 * (Single)(object)factor); - } - else if (typeof(T) == typeof(Double)) - { - product.register.double_0 = (Double)(value.register.double_0 * (Double)(object)factor); - product.register.double_1 = (Double)(value.register.double_1 * (Double)(object)factor); - } - return product; - } - } - } - - // This method is intrinsic only for certain types. It cannot access fields directly unless we are sure the context is unaccelerated. - /// <summary> - /// Divides the first vector by the second. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The vector resulting from the division.</returns> - public static unsafe Vector<T> operator /(Vector<T> left, Vector<T> right) - { - unchecked - { - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(Byte)) - { - Byte* dataPtr = stackalloc Byte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Byte)(object)ScalarDivide(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(SByte)) - { - SByte* dataPtr = stackalloc SByte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (SByte)(object)ScalarDivide(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16* dataPtr = stackalloc UInt16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt16)(object)ScalarDivide(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int16)) - { - Int16* dataPtr = stackalloc Int16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int16)(object)ScalarDivide(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32* dataPtr = stackalloc UInt32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt32)(object)ScalarDivide(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int32)) - { - Int32* dataPtr = stackalloc Int32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int32)(object)ScalarDivide(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64* dataPtr = stackalloc UInt64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt64)(object)ScalarDivide(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int64)) - { - Int64* dataPtr = stackalloc Int64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int64)(object)ScalarDivide(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Single)) - { - Single* dataPtr = stackalloc Single[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Single)(object)ScalarDivide(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Double)) - { - Double* dataPtr = stackalloc Double[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Double)(object)ScalarDivide(left[g], right[g]); - } - return new Vector<T>(dataPtr); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - else - { - Vector<T> quotient = new Vector<T>(); - if (typeof(T) == typeof(Byte)) - { - quotient.register.byte_0 = (Byte)(left.register.byte_0 / right.register.byte_0); - quotient.register.byte_1 = (Byte)(left.register.byte_1 / right.register.byte_1); - quotient.register.byte_2 = (Byte)(left.register.byte_2 / right.register.byte_2); - quotient.register.byte_3 = (Byte)(left.register.byte_3 / right.register.byte_3); - quotient.register.byte_4 = (Byte)(left.register.byte_4 / right.register.byte_4); - quotient.register.byte_5 = (Byte)(left.register.byte_5 / right.register.byte_5); - quotient.register.byte_6 = (Byte)(left.register.byte_6 / right.register.byte_6); - quotient.register.byte_7 = (Byte)(left.register.byte_7 / right.register.byte_7); - quotient.register.byte_8 = (Byte)(left.register.byte_8 / right.register.byte_8); - quotient.register.byte_9 = (Byte)(left.register.byte_9 / right.register.byte_9); - quotient.register.byte_10 = (Byte)(left.register.byte_10 / right.register.byte_10); - quotient.register.byte_11 = (Byte)(left.register.byte_11 / right.register.byte_11); - quotient.register.byte_12 = (Byte)(left.register.byte_12 / right.register.byte_12); - quotient.register.byte_13 = (Byte)(left.register.byte_13 / right.register.byte_13); - quotient.register.byte_14 = (Byte)(left.register.byte_14 / right.register.byte_14); - quotient.register.byte_15 = (Byte)(left.register.byte_15 / right.register.byte_15); - } - else if (typeof(T) == typeof(SByte)) - { - quotient.register.sbyte_0 = (SByte)(left.register.sbyte_0 / right.register.sbyte_0); - quotient.register.sbyte_1 = (SByte)(left.register.sbyte_1 / right.register.sbyte_1); - quotient.register.sbyte_2 = (SByte)(left.register.sbyte_2 / right.register.sbyte_2); - quotient.register.sbyte_3 = (SByte)(left.register.sbyte_3 / right.register.sbyte_3); - quotient.register.sbyte_4 = (SByte)(left.register.sbyte_4 / right.register.sbyte_4); - quotient.register.sbyte_5 = (SByte)(left.register.sbyte_5 / right.register.sbyte_5); - quotient.register.sbyte_6 = (SByte)(left.register.sbyte_6 / right.register.sbyte_6); - quotient.register.sbyte_7 = (SByte)(left.register.sbyte_7 / right.register.sbyte_7); - quotient.register.sbyte_8 = (SByte)(left.register.sbyte_8 / right.register.sbyte_8); - quotient.register.sbyte_9 = (SByte)(left.register.sbyte_9 / right.register.sbyte_9); - quotient.register.sbyte_10 = (SByte)(left.register.sbyte_10 / right.register.sbyte_10); - quotient.register.sbyte_11 = (SByte)(left.register.sbyte_11 / right.register.sbyte_11); - quotient.register.sbyte_12 = (SByte)(left.register.sbyte_12 / right.register.sbyte_12); - quotient.register.sbyte_13 = (SByte)(left.register.sbyte_13 / right.register.sbyte_13); - quotient.register.sbyte_14 = (SByte)(left.register.sbyte_14 / right.register.sbyte_14); - quotient.register.sbyte_15 = (SByte)(left.register.sbyte_15 / right.register.sbyte_15); - } - else if (typeof(T) == typeof(UInt16)) - { - quotient.register.uint16_0 = (UInt16)(left.register.uint16_0 / right.register.uint16_0); - quotient.register.uint16_1 = (UInt16)(left.register.uint16_1 / right.register.uint16_1); - quotient.register.uint16_2 = (UInt16)(left.register.uint16_2 / right.register.uint16_2); - quotient.register.uint16_3 = (UInt16)(left.register.uint16_3 / right.register.uint16_3); - quotient.register.uint16_4 = (UInt16)(left.register.uint16_4 / right.register.uint16_4); - quotient.register.uint16_5 = (UInt16)(left.register.uint16_5 / right.register.uint16_5); - quotient.register.uint16_6 = (UInt16)(left.register.uint16_6 / right.register.uint16_6); - quotient.register.uint16_7 = (UInt16)(left.register.uint16_7 / right.register.uint16_7); - } - else if (typeof(T) == typeof(Int16)) - { - quotient.register.int16_0 = (Int16)(left.register.int16_0 / right.register.int16_0); - quotient.register.int16_1 = (Int16)(left.register.int16_1 / right.register.int16_1); - quotient.register.int16_2 = (Int16)(left.register.int16_2 / right.register.int16_2); - quotient.register.int16_3 = (Int16)(left.register.int16_3 / right.register.int16_3); - quotient.register.int16_4 = (Int16)(left.register.int16_4 / right.register.int16_4); - quotient.register.int16_5 = (Int16)(left.register.int16_5 / right.register.int16_5); - quotient.register.int16_6 = (Int16)(left.register.int16_6 / right.register.int16_6); - quotient.register.int16_7 = (Int16)(left.register.int16_7 / right.register.int16_7); - } - else if (typeof(T) == typeof(UInt32)) - { - quotient.register.uint32_0 = (UInt32)(left.register.uint32_0 / right.register.uint32_0); - quotient.register.uint32_1 = (UInt32)(left.register.uint32_1 / right.register.uint32_1); - quotient.register.uint32_2 = (UInt32)(left.register.uint32_2 / right.register.uint32_2); - quotient.register.uint32_3 = (UInt32)(left.register.uint32_3 / right.register.uint32_3); - } - else if (typeof(T) == typeof(Int32)) - { - quotient.register.int32_0 = (Int32)(left.register.int32_0 / right.register.int32_0); - quotient.register.int32_1 = (Int32)(left.register.int32_1 / right.register.int32_1); - quotient.register.int32_2 = (Int32)(left.register.int32_2 / right.register.int32_2); - quotient.register.int32_3 = (Int32)(left.register.int32_3 / right.register.int32_3); - } - else if (typeof(T) == typeof(UInt64)) - { - quotient.register.uint64_0 = (UInt64)(left.register.uint64_0 / right.register.uint64_0); - quotient.register.uint64_1 = (UInt64)(left.register.uint64_1 / right.register.uint64_1); - } - else if (typeof(T) == typeof(Int64)) - { - quotient.register.int64_0 = (Int64)(left.register.int64_0 / right.register.int64_0); - quotient.register.int64_1 = (Int64)(left.register.int64_1 / right.register.int64_1); - } - else if (typeof(T) == typeof(Single)) - { - quotient.register.single_0 = (Single)(left.register.single_0 / right.register.single_0); - quotient.register.single_1 = (Single)(left.register.single_1 / right.register.single_1); - quotient.register.single_2 = (Single)(left.register.single_2 / right.register.single_2); - quotient.register.single_3 = (Single)(left.register.single_3 / right.register.single_3); - } - else if (typeof(T) == typeof(Double)) - { - quotient.register.double_0 = (Double)(left.register.double_0 / right.register.double_0); - quotient.register.double_1 = (Double)(left.register.double_1 / right.register.double_1); - } - return quotient; - } - } - } - - /// <summary> - /// Negates a given vector. - /// </summary> - /// <param name="value">The source vector.</param> - /// <returns>The negated vector.</returns> - public static Vector<T> operator -(Vector<T> value) - { - return Zero - value; - } - #endregion Arithmetic Operators - - #region Bitwise Operators - /// <summary> - /// Returns a new vector by performing a bitwise-and operation on each of the elements in the given vectors. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The resultant vector.</returns> - [JitIntrinsic] - public static unsafe Vector<T> operator &(Vector<T> left, Vector<T> right) - { - Vector<T> result = new Vector<T>(); - unchecked - { - if (Vector.IsHardwareAccelerated) - { - Int64* resultBase = &result.register.int64_0; - Int64* leftBase = &left.register.int64_0; - Int64* rightBase = &right.register.int64_0; - for (int g = 0; g < Vector<Int64>.Count; g++) - { - resultBase[g] = leftBase[g] & rightBase[g]; - } - } - else - { - result.register.int64_0 = left.register.int64_0 & right.register.int64_0; - result.register.int64_1 = left.register.int64_1 & right.register.int64_1; - } - } - return result; - } - - /// <summary> - /// Returns a new vector by performing a bitwise-or operation on each of the elements in the given vectors. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The resultant vector.</returns> - [JitIntrinsic] - public static unsafe Vector<T> operator |(Vector<T> left, Vector<T> right) - { - Vector<T> result = new Vector<T>(); - unchecked - { - if (Vector.IsHardwareAccelerated) - { - Int64* resultBase = &result.register.int64_0; - Int64* leftBase = &left.register.int64_0; - Int64* rightBase = &right.register.int64_0; - for (int g = 0; g < Vector<Int64>.Count; g++) - { - resultBase[g] = leftBase[g] | rightBase[g]; - } - } - else - { - result.register.int64_0 = left.register.int64_0 | right.register.int64_0; - result.register.int64_1 = left.register.int64_1 | right.register.int64_1; - } - } - return result; - } - - /// <summary> - /// Returns a new vector by performing a bitwise-exclusive-or operation on each of the elements in the given vectors. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The resultant vector.</returns> - [JitIntrinsic] - public static unsafe Vector<T> operator ^(Vector<T> left, Vector<T> right) - { - Vector<T> result = new Vector<T>(); - unchecked - { - if (Vector.IsHardwareAccelerated) - { - Int64* resultBase = &result.register.int64_0; - Int64* leftBase = &left.register.int64_0; - Int64* rightBase = &right.register.int64_0; - for (int g = 0; g < Vector<Int64>.Count; g++) - { - resultBase[g] = leftBase[g] ^ rightBase[g]; - } - } - else - { - result.register.int64_0 = left.register.int64_0 ^ right.register.int64_0; - result.register.int64_1 = left.register.int64_1 ^ right.register.int64_1; - } - } - return result; - } - - /// <summary> - /// Returns a new vector whose elements are obtained by taking the one's complement of the given vector's elements. - /// </summary> - /// <param name="value">The source vector.</param> - /// <returns>The one's complement vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> operator ~(Vector<T> value) - { - return allOnes ^ value; - } - #endregion Bitwise Operators - - #region Logical Operators - /// <summary> - /// Returns a boolean indicating whether each pair of elements in the given vectors are equal. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The first vector to compare.</param> - /// <returns>True if all elements are equal; False otherwise.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static bool operator ==(Vector<T> left, Vector<T> right) - { - return left.Equals(right); - } - - /// <summary> - /// Returns a boolean indicating whether any single pair of elements in the given vectors are equal. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>True if any element pairs are equal; False if no element pairs are equal.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static bool operator !=(Vector<T> left, Vector<T> right) - { - return !(left == right); - } - #endregion Logical Operators - - #region Conversions - /// <summary> - /// Reinterprets the bits of the given vector into those of another type. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [JitIntrinsic] - public static explicit operator Vector<Byte>(Vector<T> value) - { - return new Vector<Byte>(ref value.register); - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of another type. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [CLSCompliant(false)] - [JitIntrinsic] - public static explicit operator Vector<SByte>(Vector<T> value) - { - return new Vector<SByte>(ref value.register); - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of another type. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [CLSCompliant(false)] - [JitIntrinsic] - public static explicit operator Vector<UInt16>(Vector<T> value) - { - return new Vector<UInt16>(ref value.register); - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of another type. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [JitIntrinsic] - public static explicit operator Vector<Int16>(Vector<T> value) - { - return new Vector<Int16>(ref value.register); - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of another type. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [CLSCompliant(false)] - [JitIntrinsic] - public static explicit operator Vector<UInt32>(Vector<T> value) - { - return new Vector<UInt32>(ref value.register); - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of another type. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [JitIntrinsic] - public static explicit operator Vector<Int32>(Vector<T> value) - { - return new Vector<Int32>(ref value.register); - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of another type. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [CLSCompliant(false)] - [JitIntrinsic] - public static explicit operator Vector<UInt64>(Vector<T> value) - { - return new Vector<UInt64>(ref value.register); - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of another type. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [JitIntrinsic] - public static explicit operator Vector<Int64>(Vector<T> value) - { - return new Vector<Int64>(ref value.register); - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of another type. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [JitIntrinsic] - public static explicit operator Vector<Single>(Vector<T> value) - { - return new Vector<Single>(ref value.register); - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of another type. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [JitIntrinsic] - public static explicit operator Vector<Double>(Vector<T> value) - { - return new Vector<Double>(ref value.register); - } - - #endregion Conversions - - #region Internal Comparison Methods - [JitIntrinsic] - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - internal static unsafe Vector<T> Equals(Vector<T> left, Vector<T> right) - { - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(Byte)) - { - Byte* dataPtr = stackalloc Byte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarEquals(left[g], right[g]) ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(SByte)) - { - SByte* dataPtr = stackalloc SByte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarEquals(left[g], right[g]) ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16* dataPtr = stackalloc UInt16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarEquals(left[g], right[g]) ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int16)) - { - Int16* dataPtr = stackalloc Int16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarEquals(left[g], right[g]) ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32* dataPtr = stackalloc UInt32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarEquals(left[g], right[g]) ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int32)) - { - Int32* dataPtr = stackalloc Int32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarEquals(left[g], right[g]) ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64* dataPtr = stackalloc UInt64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarEquals(left[g], right[g]) ? ConstantHelper.GetUInt64WithAllBitsSet() : (UInt64)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int64)) - { - Int64* dataPtr = stackalloc Int64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarEquals(left[g], right[g]) ? ConstantHelper.GetInt64WithAllBitsSet() : (Int64)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Single)) - { - Single* dataPtr = stackalloc Single[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarEquals(left[g], right[g]) ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Double)) - { - Double* dataPtr = stackalloc Double[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarEquals(left[g], right[g]) ? ConstantHelper.GetDoubleWithAllBitsSet() : (Double)0; - } - return new Vector<T>(dataPtr); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - else - { - Register register = new Register(); - if (typeof(T) == typeof(Byte)) - { - register.byte_0 = left.register.byte_0 == right.register.byte_0 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_1 = left.register.byte_1 == right.register.byte_1 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_2 = left.register.byte_2 == right.register.byte_2 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_3 = left.register.byte_3 == right.register.byte_3 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_4 = left.register.byte_4 == right.register.byte_4 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_5 = left.register.byte_5 == right.register.byte_5 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_6 = left.register.byte_6 == right.register.byte_6 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_7 = left.register.byte_7 == right.register.byte_7 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_8 = left.register.byte_8 == right.register.byte_8 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_9 = left.register.byte_9 == right.register.byte_9 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_10 = left.register.byte_10 == right.register.byte_10 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_11 = left.register.byte_11 == right.register.byte_11 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_12 = left.register.byte_12 == right.register.byte_12 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_13 = left.register.byte_13 == right.register.byte_13 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_14 = left.register.byte_14 == right.register.byte_14 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_15 = left.register.byte_15 == right.register.byte_15 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(SByte)) - { - register.sbyte_0 = left.register.sbyte_0 == right.register.sbyte_0 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_1 = left.register.sbyte_1 == right.register.sbyte_1 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_2 = left.register.sbyte_2 == right.register.sbyte_2 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_3 = left.register.sbyte_3 == right.register.sbyte_3 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_4 = left.register.sbyte_4 == right.register.sbyte_4 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_5 = left.register.sbyte_5 == right.register.sbyte_5 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_6 = left.register.sbyte_6 == right.register.sbyte_6 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_7 = left.register.sbyte_7 == right.register.sbyte_7 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_8 = left.register.sbyte_8 == right.register.sbyte_8 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_9 = left.register.sbyte_9 == right.register.sbyte_9 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_10 = left.register.sbyte_10 == right.register.sbyte_10 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_11 = left.register.sbyte_11 == right.register.sbyte_11 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_12 = left.register.sbyte_12 == right.register.sbyte_12 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_13 = left.register.sbyte_13 == right.register.sbyte_13 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_14 = left.register.sbyte_14 == right.register.sbyte_14 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_15 = left.register.sbyte_15 == right.register.sbyte_15 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(UInt16)) - { - register.uint16_0 = left.register.uint16_0 == right.register.uint16_0 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_1 = left.register.uint16_1 == right.register.uint16_1 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_2 = left.register.uint16_2 == right.register.uint16_2 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_3 = left.register.uint16_3 == right.register.uint16_3 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_4 = left.register.uint16_4 == right.register.uint16_4 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_5 = left.register.uint16_5 == right.register.uint16_5 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_6 = left.register.uint16_6 == right.register.uint16_6 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_7 = left.register.uint16_7 == right.register.uint16_7 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Int16)) - { - register.int16_0 = left.register.int16_0 == right.register.int16_0 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_1 = left.register.int16_1 == right.register.int16_1 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_2 = left.register.int16_2 == right.register.int16_2 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_3 = left.register.int16_3 == right.register.int16_3 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_4 = left.register.int16_4 == right.register.int16_4 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_5 = left.register.int16_5 == right.register.int16_5 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_6 = left.register.int16_6 == right.register.int16_6 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_7 = left.register.int16_7 == right.register.int16_7 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(UInt32)) - { - register.uint32_0 = left.register.uint32_0 == right.register.uint32_0 ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - register.uint32_1 = left.register.uint32_1 == right.register.uint32_1 ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - register.uint32_2 = left.register.uint32_2 == right.register.uint32_2 ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - register.uint32_3 = left.register.uint32_3 == right.register.uint32_3 ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Int32)) - { - register.int32_0 = left.register.int32_0 == right.register.int32_0 ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - register.int32_1 = left.register.int32_1 == right.register.int32_1 ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - register.int32_2 = left.register.int32_2 == right.register.int32_2 ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - register.int32_3 = left.register.int32_3 == right.register.int32_3 ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(UInt64)) - { - register.uint64_0 = left.register.uint64_0 == right.register.uint64_0 ? ConstantHelper.GetUInt64WithAllBitsSet() : (UInt64)0; - register.uint64_1 = left.register.uint64_1 == right.register.uint64_1 ? ConstantHelper.GetUInt64WithAllBitsSet() : (UInt64)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Int64)) - { - register.int64_0 = left.register.int64_0 == right.register.int64_0 ? ConstantHelper.GetInt64WithAllBitsSet() : (Int64)0; - register.int64_1 = left.register.int64_1 == right.register.int64_1 ? ConstantHelper.GetInt64WithAllBitsSet() : (Int64)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Single)) - { - register.single_0 = left.register.single_0 == right.register.single_0 ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - register.single_1 = left.register.single_1 == right.register.single_1 ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - register.single_2 = left.register.single_2 == right.register.single_2 ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - register.single_3 = left.register.single_3 == right.register.single_3 ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Double)) - { - register.double_0 = left.register.double_0 == right.register.double_0 ? ConstantHelper.GetDoubleWithAllBitsSet() : (Double)0; - register.double_1 = left.register.double_1 == right.register.double_1 ? ConstantHelper.GetDoubleWithAllBitsSet() : (Double)0; - return new Vector<T>(ref register); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - } - - [JitIntrinsic] - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - internal static unsafe Vector<T> LessThan(Vector<T> left, Vector<T> right) - { - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(Byte)) - { - Byte* dataPtr = stackalloc Byte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(SByte)) - { - SByte* dataPtr = stackalloc SByte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16* dataPtr = stackalloc UInt16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int16)) - { - Int16* dataPtr = stackalloc Int16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32* dataPtr = stackalloc UInt32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int32)) - { - Int32* dataPtr = stackalloc Int32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64* dataPtr = stackalloc UInt64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? ConstantHelper.GetUInt64WithAllBitsSet() : (UInt64)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int64)) - { - Int64* dataPtr = stackalloc Int64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? ConstantHelper.GetInt64WithAllBitsSet() : (Int64)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Single)) - { - Single* dataPtr = stackalloc Single[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Double)) - { - Double* dataPtr = stackalloc Double[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? ConstantHelper.GetDoubleWithAllBitsSet() : (Double)0; - } - return new Vector<T>(dataPtr); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - else - { - Register register = new Register(); - if (typeof(T) == typeof(Byte)) - { - register.byte_0 = left.register.byte_0 < right.register.byte_0 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_1 = left.register.byte_1 < right.register.byte_1 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_2 = left.register.byte_2 < right.register.byte_2 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_3 = left.register.byte_3 < right.register.byte_3 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_4 = left.register.byte_4 < right.register.byte_4 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_5 = left.register.byte_5 < right.register.byte_5 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_6 = left.register.byte_6 < right.register.byte_6 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_7 = left.register.byte_7 < right.register.byte_7 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_8 = left.register.byte_8 < right.register.byte_8 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_9 = left.register.byte_9 < right.register.byte_9 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_10 = left.register.byte_10 < right.register.byte_10 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_11 = left.register.byte_11 < right.register.byte_11 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_12 = left.register.byte_12 < right.register.byte_12 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_13 = left.register.byte_13 < right.register.byte_13 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_14 = left.register.byte_14 < right.register.byte_14 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_15 = left.register.byte_15 < right.register.byte_15 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(SByte)) - { - register.sbyte_0 = left.register.sbyte_0 < right.register.sbyte_0 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_1 = left.register.sbyte_1 < right.register.sbyte_1 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_2 = left.register.sbyte_2 < right.register.sbyte_2 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_3 = left.register.sbyte_3 < right.register.sbyte_3 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_4 = left.register.sbyte_4 < right.register.sbyte_4 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_5 = left.register.sbyte_5 < right.register.sbyte_5 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_6 = left.register.sbyte_6 < right.register.sbyte_6 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_7 = left.register.sbyte_7 < right.register.sbyte_7 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_8 = left.register.sbyte_8 < right.register.sbyte_8 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_9 = left.register.sbyte_9 < right.register.sbyte_9 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_10 = left.register.sbyte_10 < right.register.sbyte_10 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_11 = left.register.sbyte_11 < right.register.sbyte_11 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_12 = left.register.sbyte_12 < right.register.sbyte_12 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_13 = left.register.sbyte_13 < right.register.sbyte_13 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_14 = left.register.sbyte_14 < right.register.sbyte_14 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_15 = left.register.sbyte_15 < right.register.sbyte_15 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(UInt16)) - { - register.uint16_0 = left.register.uint16_0 < right.register.uint16_0 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_1 = left.register.uint16_1 < right.register.uint16_1 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_2 = left.register.uint16_2 < right.register.uint16_2 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_3 = left.register.uint16_3 < right.register.uint16_3 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_4 = left.register.uint16_4 < right.register.uint16_4 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_5 = left.register.uint16_5 < right.register.uint16_5 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_6 = left.register.uint16_6 < right.register.uint16_6 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_7 = left.register.uint16_7 < right.register.uint16_7 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Int16)) - { - register.int16_0 = left.register.int16_0 < right.register.int16_0 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_1 = left.register.int16_1 < right.register.int16_1 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_2 = left.register.int16_2 < right.register.int16_2 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_3 = left.register.int16_3 < right.register.int16_3 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_4 = left.register.int16_4 < right.register.int16_4 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_5 = left.register.int16_5 < right.register.int16_5 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_6 = left.register.int16_6 < right.register.int16_6 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_7 = left.register.int16_7 < right.register.int16_7 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(UInt32)) - { - register.uint32_0 = left.register.uint32_0 < right.register.uint32_0 ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - register.uint32_1 = left.register.uint32_1 < right.register.uint32_1 ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - register.uint32_2 = left.register.uint32_2 < right.register.uint32_2 ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - register.uint32_3 = left.register.uint32_3 < right.register.uint32_3 ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Int32)) - { - register.int32_0 = left.register.int32_0 < right.register.int32_0 ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - register.int32_1 = left.register.int32_1 < right.register.int32_1 ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - register.int32_2 = left.register.int32_2 < right.register.int32_2 ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - register.int32_3 = left.register.int32_3 < right.register.int32_3 ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(UInt64)) - { - register.uint64_0 = left.register.uint64_0 < right.register.uint64_0 ? ConstantHelper.GetUInt64WithAllBitsSet() : (UInt64)0; - register.uint64_1 = left.register.uint64_1 < right.register.uint64_1 ? ConstantHelper.GetUInt64WithAllBitsSet() : (UInt64)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Int64)) - { - register.int64_0 = left.register.int64_0 < right.register.int64_0 ? ConstantHelper.GetInt64WithAllBitsSet() : (Int64)0; - register.int64_1 = left.register.int64_1 < right.register.int64_1 ? ConstantHelper.GetInt64WithAllBitsSet() : (Int64)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Single)) - { - register.single_0 = left.register.single_0 < right.register.single_0 ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - register.single_1 = left.register.single_1 < right.register.single_1 ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - register.single_2 = left.register.single_2 < right.register.single_2 ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - register.single_3 = left.register.single_3 < right.register.single_3 ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Double)) - { - register.double_0 = left.register.double_0 < right.register.double_0 ? ConstantHelper.GetDoubleWithAllBitsSet() : (Double)0; - register.double_1 = left.register.double_1 < right.register.double_1 ? ConstantHelper.GetDoubleWithAllBitsSet() : (Double)0; - return new Vector<T>(ref register); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - } - - [JitIntrinsic] - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - internal static unsafe Vector<T> GreaterThan(Vector<T> left, Vector<T> right) - { - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(Byte)) - { - Byte* dataPtr = stackalloc Byte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(SByte)) - { - SByte* dataPtr = stackalloc SByte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16* dataPtr = stackalloc UInt16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int16)) - { - Int16* dataPtr = stackalloc Int16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32* dataPtr = stackalloc UInt32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int32)) - { - Int32* dataPtr = stackalloc Int32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64* dataPtr = stackalloc UInt64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? ConstantHelper.GetUInt64WithAllBitsSet() : (UInt64)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int64)) - { - Int64* dataPtr = stackalloc Int64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? ConstantHelper.GetInt64WithAllBitsSet() : (Int64)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Single)) - { - Single* dataPtr = stackalloc Single[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Double)) - { - Double* dataPtr = stackalloc Double[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? ConstantHelper.GetDoubleWithAllBitsSet() : (Double)0; - } - return new Vector<T>(dataPtr); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - else - { - Register register = new Register(); - if (typeof(T) == typeof(Byte)) - { - register.byte_0 = left.register.byte_0 > right.register.byte_0 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_1 = left.register.byte_1 > right.register.byte_1 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_2 = left.register.byte_2 > right.register.byte_2 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_3 = left.register.byte_3 > right.register.byte_3 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_4 = left.register.byte_4 > right.register.byte_4 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_5 = left.register.byte_5 > right.register.byte_5 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_6 = left.register.byte_6 > right.register.byte_6 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_7 = left.register.byte_7 > right.register.byte_7 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_8 = left.register.byte_8 > right.register.byte_8 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_9 = left.register.byte_9 > right.register.byte_9 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_10 = left.register.byte_10 > right.register.byte_10 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_11 = left.register.byte_11 > right.register.byte_11 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_12 = left.register.byte_12 > right.register.byte_12 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_13 = left.register.byte_13 > right.register.byte_13 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_14 = left.register.byte_14 > right.register.byte_14 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - register.byte_15 = left.register.byte_15 > right.register.byte_15 ? ConstantHelper.GetByteWithAllBitsSet() : (Byte)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(SByte)) - { - register.sbyte_0 = left.register.sbyte_0 > right.register.sbyte_0 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_1 = left.register.sbyte_1 > right.register.sbyte_1 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_2 = left.register.sbyte_2 > right.register.sbyte_2 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_3 = left.register.sbyte_3 > right.register.sbyte_3 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_4 = left.register.sbyte_4 > right.register.sbyte_4 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_5 = left.register.sbyte_5 > right.register.sbyte_5 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_6 = left.register.sbyte_6 > right.register.sbyte_6 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_7 = left.register.sbyte_7 > right.register.sbyte_7 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_8 = left.register.sbyte_8 > right.register.sbyte_8 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_9 = left.register.sbyte_9 > right.register.sbyte_9 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_10 = left.register.sbyte_10 > right.register.sbyte_10 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_11 = left.register.sbyte_11 > right.register.sbyte_11 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_12 = left.register.sbyte_12 > right.register.sbyte_12 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_13 = left.register.sbyte_13 > right.register.sbyte_13 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_14 = left.register.sbyte_14 > right.register.sbyte_14 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - register.sbyte_15 = left.register.sbyte_15 > right.register.sbyte_15 ? ConstantHelper.GetSByteWithAllBitsSet() : (SByte)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(UInt16)) - { - register.uint16_0 = left.register.uint16_0 > right.register.uint16_0 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_1 = left.register.uint16_1 > right.register.uint16_1 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_2 = left.register.uint16_2 > right.register.uint16_2 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_3 = left.register.uint16_3 > right.register.uint16_3 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_4 = left.register.uint16_4 > right.register.uint16_4 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_5 = left.register.uint16_5 > right.register.uint16_5 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_6 = left.register.uint16_6 > right.register.uint16_6 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - register.uint16_7 = left.register.uint16_7 > right.register.uint16_7 ? ConstantHelper.GetUInt16WithAllBitsSet() : (UInt16)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Int16)) - { - register.int16_0 = left.register.int16_0 > right.register.int16_0 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_1 = left.register.int16_1 > right.register.int16_1 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_2 = left.register.int16_2 > right.register.int16_2 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_3 = left.register.int16_3 > right.register.int16_3 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_4 = left.register.int16_4 > right.register.int16_4 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_5 = left.register.int16_5 > right.register.int16_5 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_6 = left.register.int16_6 > right.register.int16_6 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - register.int16_7 = left.register.int16_7 > right.register.int16_7 ? ConstantHelper.GetInt16WithAllBitsSet() : (Int16)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(UInt32)) - { - register.uint32_0 = left.register.uint32_0 > right.register.uint32_0 ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - register.uint32_1 = left.register.uint32_1 > right.register.uint32_1 ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - register.uint32_2 = left.register.uint32_2 > right.register.uint32_2 ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - register.uint32_3 = left.register.uint32_3 > right.register.uint32_3 ? ConstantHelper.GetUInt32WithAllBitsSet() : (UInt32)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Int32)) - { - register.int32_0 = left.register.int32_0 > right.register.int32_0 ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - register.int32_1 = left.register.int32_1 > right.register.int32_1 ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - register.int32_2 = left.register.int32_2 > right.register.int32_2 ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - register.int32_3 = left.register.int32_3 > right.register.int32_3 ? ConstantHelper.GetInt32WithAllBitsSet() : (Int32)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(UInt64)) - { - register.uint64_0 = left.register.uint64_0 > right.register.uint64_0 ? ConstantHelper.GetUInt64WithAllBitsSet() : (UInt64)0; - register.uint64_1 = left.register.uint64_1 > right.register.uint64_1 ? ConstantHelper.GetUInt64WithAllBitsSet() : (UInt64)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Int64)) - { - register.int64_0 = left.register.int64_0 > right.register.int64_0 ? ConstantHelper.GetInt64WithAllBitsSet() : (Int64)0; - register.int64_1 = left.register.int64_1 > right.register.int64_1 ? ConstantHelper.GetInt64WithAllBitsSet() : (Int64)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Single)) - { - register.single_0 = left.register.single_0 > right.register.single_0 ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - register.single_1 = left.register.single_1 > right.register.single_1 ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - register.single_2 = left.register.single_2 > right.register.single_2 ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - register.single_3 = left.register.single_3 > right.register.single_3 ? ConstantHelper.GetSingleWithAllBitsSet() : (Single)0; - return new Vector<T>(ref register); - } - else if (typeof(T) == typeof(Double)) - { - register.double_0 = left.register.double_0 > right.register.double_0 ? ConstantHelper.GetDoubleWithAllBitsSet() : (Double)0; - register.double_1 = left.register.double_1 > right.register.double_1 ? ConstantHelper.GetDoubleWithAllBitsSet() : (Double)0; - return new Vector<T>(ref register); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - } - - [JitIntrinsic] - internal static Vector<T> GreaterThanOrEqual(Vector<T> left, Vector<T> right) - { - return Equals(left, right) | GreaterThan(left, right); - } - - [JitIntrinsic] - internal static Vector<T> LessThanOrEqual(Vector<T> left, Vector<T> right) - { - return Equals(left, right) | LessThan(left, right); - } - - [JitIntrinsic] - internal static Vector<T> ConditionalSelect(Vector<T> condition, Vector<T> left, Vector<T> right) - { - return (left & condition) | (Vector.AndNot(right, condition)); - } - #endregion Comparison Methods - - #region Internal Math Methods - [JitIntrinsic] - internal static unsafe Vector<T> Abs(Vector<T> value) - { - if (typeof(T) == typeof(Byte)) - { - return value; - } - else if (typeof(T) == typeof(UInt16)) - { - return value; - } - else if (typeof(T) == typeof(UInt32)) - { - return value; - } - else if (typeof(T) == typeof(UInt64)) - { - return value; - } - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(SByte)) - { - SByte* dataPtr = stackalloc SByte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (SByte)(object)(Math.Abs((SByte)(object)value[g])); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int16)) - { - Int16* dataPtr = stackalloc Int16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int16)(object)(Math.Abs((Int16)(object)value[g])); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int32)) - { - Int32* dataPtr = stackalloc Int32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int32)(object)(Math.Abs((Int32)(object)value[g])); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int64)) - { - Int64* dataPtr = stackalloc Int64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int64)(object)(Math.Abs((Int64)(object)value[g])); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Single)) - { - Single* dataPtr = stackalloc Single[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Single)(object)(Math.Abs((Single)(object)value[g])); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Double)) - { - Double* dataPtr = stackalloc Double[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Double)(object)(Math.Abs((Double)(object)value[g])); - } - return new Vector<T>(dataPtr); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - else - { - if (typeof(T) == typeof(SByte)) - { - value.register.sbyte_0 = (SByte)(Math.Abs(value.register.sbyte_0)); - value.register.sbyte_1 = (SByte)(Math.Abs(value.register.sbyte_1)); - value.register.sbyte_2 = (SByte)(Math.Abs(value.register.sbyte_2)); - value.register.sbyte_3 = (SByte)(Math.Abs(value.register.sbyte_3)); - value.register.sbyte_4 = (SByte)(Math.Abs(value.register.sbyte_4)); - value.register.sbyte_5 = (SByte)(Math.Abs(value.register.sbyte_5)); - value.register.sbyte_6 = (SByte)(Math.Abs(value.register.sbyte_6)); - value.register.sbyte_7 = (SByte)(Math.Abs(value.register.sbyte_7)); - value.register.sbyte_8 = (SByte)(Math.Abs(value.register.sbyte_8)); - value.register.sbyte_9 = (SByte)(Math.Abs(value.register.sbyte_9)); - value.register.sbyte_10 = (SByte)(Math.Abs(value.register.sbyte_10)); - value.register.sbyte_11 = (SByte)(Math.Abs(value.register.sbyte_11)); - value.register.sbyte_12 = (SByte)(Math.Abs(value.register.sbyte_12)); - value.register.sbyte_13 = (SByte)(Math.Abs(value.register.sbyte_13)); - value.register.sbyte_14 = (SByte)(Math.Abs(value.register.sbyte_14)); - value.register.sbyte_15 = (SByte)(Math.Abs(value.register.sbyte_15)); - return value; - } - else if (typeof(T) == typeof(Int16)) - { - value.register.int16_0 = (Int16)(Math.Abs(value.register.int16_0)); - value.register.int16_1 = (Int16)(Math.Abs(value.register.int16_1)); - value.register.int16_2 = (Int16)(Math.Abs(value.register.int16_2)); - value.register.int16_3 = (Int16)(Math.Abs(value.register.int16_3)); - value.register.int16_4 = (Int16)(Math.Abs(value.register.int16_4)); - value.register.int16_5 = (Int16)(Math.Abs(value.register.int16_5)); - value.register.int16_6 = (Int16)(Math.Abs(value.register.int16_6)); - value.register.int16_7 = (Int16)(Math.Abs(value.register.int16_7)); - return value; - } - else if (typeof(T) == typeof(Int32)) - { - value.register.int32_0 = (Int32)(Math.Abs(value.register.int32_0)); - value.register.int32_1 = (Int32)(Math.Abs(value.register.int32_1)); - value.register.int32_2 = (Int32)(Math.Abs(value.register.int32_2)); - value.register.int32_3 = (Int32)(Math.Abs(value.register.int32_3)); - return value; - } - else if (typeof(T) == typeof(Int64)) - { - value.register.int64_0 = (Int64)(Math.Abs(value.register.int64_0)); - value.register.int64_1 = (Int64)(Math.Abs(value.register.int64_1)); - return value; - } - else if (typeof(T) == typeof(Single)) - { - value.register.single_0 = (Single)(Math.Abs(value.register.single_0)); - value.register.single_1 = (Single)(Math.Abs(value.register.single_1)); - value.register.single_2 = (Single)(Math.Abs(value.register.single_2)); - value.register.single_3 = (Single)(Math.Abs(value.register.single_3)); - return value; - } - else if (typeof(T) == typeof(Double)) - { - value.register.double_0 = (Double)(Math.Abs(value.register.double_0)); - value.register.double_1 = (Double)(Math.Abs(value.register.double_1)); - return value; - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - } - - [JitIntrinsic] - internal static unsafe Vector<T> Min(Vector<T> left, Vector<T> right) - { - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(Byte)) - { - Byte* dataPtr = stackalloc Byte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? (Byte)(object)left[g] : (Byte)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(SByte)) - { - SByte* dataPtr = stackalloc SByte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? (SByte)(object)left[g] : (SByte)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16* dataPtr = stackalloc UInt16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? (UInt16)(object)left[g] : (UInt16)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int16)) - { - Int16* dataPtr = stackalloc Int16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? (Int16)(object)left[g] : (Int16)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32* dataPtr = stackalloc UInt32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? (UInt32)(object)left[g] : (UInt32)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int32)) - { - Int32* dataPtr = stackalloc Int32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? (Int32)(object)left[g] : (Int32)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64* dataPtr = stackalloc UInt64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? (UInt64)(object)left[g] : (UInt64)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int64)) - { - Int64* dataPtr = stackalloc Int64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? (Int64)(object)left[g] : (Int64)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Single)) - { - Single* dataPtr = stackalloc Single[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? (Single)(object)left[g] : (Single)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Double)) - { - Double* dataPtr = stackalloc Double[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarLessThan(left[g], right[g]) ? (Double)(object)left[g] : (Double)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - else - { - Vector<T> vec = new Vector<T>(); - if (typeof(T) == typeof(Byte)) - { - vec.register.byte_0 = left.register.byte_0 < right.register.byte_0 ? left.register.byte_0 : right.register.byte_0; - vec.register.byte_1 = left.register.byte_1 < right.register.byte_1 ? left.register.byte_1 : right.register.byte_1; - vec.register.byte_2 = left.register.byte_2 < right.register.byte_2 ? left.register.byte_2 : right.register.byte_2; - vec.register.byte_3 = left.register.byte_3 < right.register.byte_3 ? left.register.byte_3 : right.register.byte_3; - vec.register.byte_4 = left.register.byte_4 < right.register.byte_4 ? left.register.byte_4 : right.register.byte_4; - vec.register.byte_5 = left.register.byte_5 < right.register.byte_5 ? left.register.byte_5 : right.register.byte_5; - vec.register.byte_6 = left.register.byte_6 < right.register.byte_6 ? left.register.byte_6 : right.register.byte_6; - vec.register.byte_7 = left.register.byte_7 < right.register.byte_7 ? left.register.byte_7 : right.register.byte_7; - vec.register.byte_8 = left.register.byte_8 < right.register.byte_8 ? left.register.byte_8 : right.register.byte_8; - vec.register.byte_9 = left.register.byte_9 < right.register.byte_9 ? left.register.byte_9 : right.register.byte_9; - vec.register.byte_10 = left.register.byte_10 < right.register.byte_10 ? left.register.byte_10 : right.register.byte_10; - vec.register.byte_11 = left.register.byte_11 < right.register.byte_11 ? left.register.byte_11 : right.register.byte_11; - vec.register.byte_12 = left.register.byte_12 < right.register.byte_12 ? left.register.byte_12 : right.register.byte_12; - vec.register.byte_13 = left.register.byte_13 < right.register.byte_13 ? left.register.byte_13 : right.register.byte_13; - vec.register.byte_14 = left.register.byte_14 < right.register.byte_14 ? left.register.byte_14 : right.register.byte_14; - vec.register.byte_15 = left.register.byte_15 < right.register.byte_15 ? left.register.byte_15 : right.register.byte_15; - return vec; - } - else if (typeof(T) == typeof(SByte)) - { - vec.register.sbyte_0 = left.register.sbyte_0 < right.register.sbyte_0 ? left.register.sbyte_0 : right.register.sbyte_0; - vec.register.sbyte_1 = left.register.sbyte_1 < right.register.sbyte_1 ? left.register.sbyte_1 : right.register.sbyte_1; - vec.register.sbyte_2 = left.register.sbyte_2 < right.register.sbyte_2 ? left.register.sbyte_2 : right.register.sbyte_2; - vec.register.sbyte_3 = left.register.sbyte_3 < right.register.sbyte_3 ? left.register.sbyte_3 : right.register.sbyte_3; - vec.register.sbyte_4 = left.register.sbyte_4 < right.register.sbyte_4 ? left.register.sbyte_4 : right.register.sbyte_4; - vec.register.sbyte_5 = left.register.sbyte_5 < right.register.sbyte_5 ? left.register.sbyte_5 : right.register.sbyte_5; - vec.register.sbyte_6 = left.register.sbyte_6 < right.register.sbyte_6 ? left.register.sbyte_6 : right.register.sbyte_6; - vec.register.sbyte_7 = left.register.sbyte_7 < right.register.sbyte_7 ? left.register.sbyte_7 : right.register.sbyte_7; - vec.register.sbyte_8 = left.register.sbyte_8 < right.register.sbyte_8 ? left.register.sbyte_8 : right.register.sbyte_8; - vec.register.sbyte_9 = left.register.sbyte_9 < right.register.sbyte_9 ? left.register.sbyte_9 : right.register.sbyte_9; - vec.register.sbyte_10 = left.register.sbyte_10 < right.register.sbyte_10 ? left.register.sbyte_10 : right.register.sbyte_10; - vec.register.sbyte_11 = left.register.sbyte_11 < right.register.sbyte_11 ? left.register.sbyte_11 : right.register.sbyte_11; - vec.register.sbyte_12 = left.register.sbyte_12 < right.register.sbyte_12 ? left.register.sbyte_12 : right.register.sbyte_12; - vec.register.sbyte_13 = left.register.sbyte_13 < right.register.sbyte_13 ? left.register.sbyte_13 : right.register.sbyte_13; - vec.register.sbyte_14 = left.register.sbyte_14 < right.register.sbyte_14 ? left.register.sbyte_14 : right.register.sbyte_14; - vec.register.sbyte_15 = left.register.sbyte_15 < right.register.sbyte_15 ? left.register.sbyte_15 : right.register.sbyte_15; - return vec; - } - else if (typeof(T) == typeof(UInt16)) - { - vec.register.uint16_0 = left.register.uint16_0 < right.register.uint16_0 ? left.register.uint16_0 : right.register.uint16_0; - vec.register.uint16_1 = left.register.uint16_1 < right.register.uint16_1 ? left.register.uint16_1 : right.register.uint16_1; - vec.register.uint16_2 = left.register.uint16_2 < right.register.uint16_2 ? left.register.uint16_2 : right.register.uint16_2; - vec.register.uint16_3 = left.register.uint16_3 < right.register.uint16_3 ? left.register.uint16_3 : right.register.uint16_3; - vec.register.uint16_4 = left.register.uint16_4 < right.register.uint16_4 ? left.register.uint16_4 : right.register.uint16_4; - vec.register.uint16_5 = left.register.uint16_5 < right.register.uint16_5 ? left.register.uint16_5 : right.register.uint16_5; - vec.register.uint16_6 = left.register.uint16_6 < right.register.uint16_6 ? left.register.uint16_6 : right.register.uint16_6; - vec.register.uint16_7 = left.register.uint16_7 < right.register.uint16_7 ? left.register.uint16_7 : right.register.uint16_7; - return vec; - } - else if (typeof(T) == typeof(Int16)) - { - vec.register.int16_0 = left.register.int16_0 < right.register.int16_0 ? left.register.int16_0 : right.register.int16_0; - vec.register.int16_1 = left.register.int16_1 < right.register.int16_1 ? left.register.int16_1 : right.register.int16_1; - vec.register.int16_2 = left.register.int16_2 < right.register.int16_2 ? left.register.int16_2 : right.register.int16_2; - vec.register.int16_3 = left.register.int16_3 < right.register.int16_3 ? left.register.int16_3 : right.register.int16_3; - vec.register.int16_4 = left.register.int16_4 < right.register.int16_4 ? left.register.int16_4 : right.register.int16_4; - vec.register.int16_5 = left.register.int16_5 < right.register.int16_5 ? left.register.int16_5 : right.register.int16_5; - vec.register.int16_6 = left.register.int16_6 < right.register.int16_6 ? left.register.int16_6 : right.register.int16_6; - vec.register.int16_7 = left.register.int16_7 < right.register.int16_7 ? left.register.int16_7 : right.register.int16_7; - return vec; - } - else if (typeof(T) == typeof(UInt32)) - { - vec.register.uint32_0 = left.register.uint32_0 < right.register.uint32_0 ? left.register.uint32_0 : right.register.uint32_0; - vec.register.uint32_1 = left.register.uint32_1 < right.register.uint32_1 ? left.register.uint32_1 : right.register.uint32_1; - vec.register.uint32_2 = left.register.uint32_2 < right.register.uint32_2 ? left.register.uint32_2 : right.register.uint32_2; - vec.register.uint32_3 = left.register.uint32_3 < right.register.uint32_3 ? left.register.uint32_3 : right.register.uint32_3; - return vec; - } - else if (typeof(T) == typeof(Int32)) - { - vec.register.int32_0 = left.register.int32_0 < right.register.int32_0 ? left.register.int32_0 : right.register.int32_0; - vec.register.int32_1 = left.register.int32_1 < right.register.int32_1 ? left.register.int32_1 : right.register.int32_1; - vec.register.int32_2 = left.register.int32_2 < right.register.int32_2 ? left.register.int32_2 : right.register.int32_2; - vec.register.int32_3 = left.register.int32_3 < right.register.int32_3 ? left.register.int32_3 : right.register.int32_3; - return vec; - } - else if (typeof(T) == typeof(UInt64)) - { - vec.register.uint64_0 = left.register.uint64_0 < right.register.uint64_0 ? left.register.uint64_0 : right.register.uint64_0; - vec.register.uint64_1 = left.register.uint64_1 < right.register.uint64_1 ? left.register.uint64_1 : right.register.uint64_1; - return vec; - } - else if (typeof(T) == typeof(Int64)) - { - vec.register.int64_0 = left.register.int64_0 < right.register.int64_0 ? left.register.int64_0 : right.register.int64_0; - vec.register.int64_1 = left.register.int64_1 < right.register.int64_1 ? left.register.int64_1 : right.register.int64_1; - return vec; - } - else if (typeof(T) == typeof(Single)) - { - vec.register.single_0 = left.register.single_0 < right.register.single_0 ? left.register.single_0 : right.register.single_0; - vec.register.single_1 = left.register.single_1 < right.register.single_1 ? left.register.single_1 : right.register.single_1; - vec.register.single_2 = left.register.single_2 < right.register.single_2 ? left.register.single_2 : right.register.single_2; - vec.register.single_3 = left.register.single_3 < right.register.single_3 ? left.register.single_3 : right.register.single_3; - return vec; - } - else if (typeof(T) == typeof(Double)) - { - vec.register.double_0 = left.register.double_0 < right.register.double_0 ? left.register.double_0 : right.register.double_0; - vec.register.double_1 = left.register.double_1 < right.register.double_1 ? left.register.double_1 : right.register.double_1; - return vec; - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - } - - [JitIntrinsic] - internal static unsafe Vector<T> Max(Vector<T> left, Vector<T> right) - { - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(Byte)) - { - Byte* dataPtr = stackalloc Byte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? (Byte)(object)left[g] : (Byte)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(SByte)) - { - SByte* dataPtr = stackalloc SByte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? (SByte)(object)left[g] : (SByte)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16* dataPtr = stackalloc UInt16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? (UInt16)(object)left[g] : (UInt16)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int16)) - { - Int16* dataPtr = stackalloc Int16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? (Int16)(object)left[g] : (Int16)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32* dataPtr = stackalloc UInt32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? (UInt32)(object)left[g] : (UInt32)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int32)) - { - Int32* dataPtr = stackalloc Int32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? (Int32)(object)left[g] : (Int32)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64* dataPtr = stackalloc UInt64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? (UInt64)(object)left[g] : (UInt64)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int64)) - { - Int64* dataPtr = stackalloc Int64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? (Int64)(object)left[g] : (Int64)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Single)) - { - Single* dataPtr = stackalloc Single[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? (Single)(object)left[g] : (Single)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Double)) - { - Double* dataPtr = stackalloc Double[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = ScalarGreaterThan(left[g], right[g]) ? (Double)(object)left[g] : (Double)(object)right[g]; - } - return new Vector<T>(dataPtr); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - else - { - Vector<T> vec = new Vector<T>(); - if (typeof(T) == typeof(Byte)) - { - vec.register.byte_0 = left.register.byte_0 > right.register.byte_0 ? left.register.byte_0 : right.register.byte_0; - vec.register.byte_1 = left.register.byte_1 > right.register.byte_1 ? left.register.byte_1 : right.register.byte_1; - vec.register.byte_2 = left.register.byte_2 > right.register.byte_2 ? left.register.byte_2 : right.register.byte_2; - vec.register.byte_3 = left.register.byte_3 > right.register.byte_3 ? left.register.byte_3 : right.register.byte_3; - vec.register.byte_4 = left.register.byte_4 > right.register.byte_4 ? left.register.byte_4 : right.register.byte_4; - vec.register.byte_5 = left.register.byte_5 > right.register.byte_5 ? left.register.byte_5 : right.register.byte_5; - vec.register.byte_6 = left.register.byte_6 > right.register.byte_6 ? left.register.byte_6 : right.register.byte_6; - vec.register.byte_7 = left.register.byte_7 > right.register.byte_7 ? left.register.byte_7 : right.register.byte_7; - vec.register.byte_8 = left.register.byte_8 > right.register.byte_8 ? left.register.byte_8 : right.register.byte_8; - vec.register.byte_9 = left.register.byte_9 > right.register.byte_9 ? left.register.byte_9 : right.register.byte_9; - vec.register.byte_10 = left.register.byte_10 > right.register.byte_10 ? left.register.byte_10 : right.register.byte_10; - vec.register.byte_11 = left.register.byte_11 > right.register.byte_11 ? left.register.byte_11 : right.register.byte_11; - vec.register.byte_12 = left.register.byte_12 > right.register.byte_12 ? left.register.byte_12 : right.register.byte_12; - vec.register.byte_13 = left.register.byte_13 > right.register.byte_13 ? left.register.byte_13 : right.register.byte_13; - vec.register.byte_14 = left.register.byte_14 > right.register.byte_14 ? left.register.byte_14 : right.register.byte_14; - vec.register.byte_15 = left.register.byte_15 > right.register.byte_15 ? left.register.byte_15 : right.register.byte_15; - return vec; - } - else if (typeof(T) == typeof(SByte)) - { - vec.register.sbyte_0 = left.register.sbyte_0 > right.register.sbyte_0 ? left.register.sbyte_0 : right.register.sbyte_0; - vec.register.sbyte_1 = left.register.sbyte_1 > right.register.sbyte_1 ? left.register.sbyte_1 : right.register.sbyte_1; - vec.register.sbyte_2 = left.register.sbyte_2 > right.register.sbyte_2 ? left.register.sbyte_2 : right.register.sbyte_2; - vec.register.sbyte_3 = left.register.sbyte_3 > right.register.sbyte_3 ? left.register.sbyte_3 : right.register.sbyte_3; - vec.register.sbyte_4 = left.register.sbyte_4 > right.register.sbyte_4 ? left.register.sbyte_4 : right.register.sbyte_4; - vec.register.sbyte_5 = left.register.sbyte_5 > right.register.sbyte_5 ? left.register.sbyte_5 : right.register.sbyte_5; - vec.register.sbyte_6 = left.register.sbyte_6 > right.register.sbyte_6 ? left.register.sbyte_6 : right.register.sbyte_6; - vec.register.sbyte_7 = left.register.sbyte_7 > right.register.sbyte_7 ? left.register.sbyte_7 : right.register.sbyte_7; - vec.register.sbyte_8 = left.register.sbyte_8 > right.register.sbyte_8 ? left.register.sbyte_8 : right.register.sbyte_8; - vec.register.sbyte_9 = left.register.sbyte_9 > right.register.sbyte_9 ? left.register.sbyte_9 : right.register.sbyte_9; - vec.register.sbyte_10 = left.register.sbyte_10 > right.register.sbyte_10 ? left.register.sbyte_10 : right.register.sbyte_10; - vec.register.sbyte_11 = left.register.sbyte_11 > right.register.sbyte_11 ? left.register.sbyte_11 : right.register.sbyte_11; - vec.register.sbyte_12 = left.register.sbyte_12 > right.register.sbyte_12 ? left.register.sbyte_12 : right.register.sbyte_12; - vec.register.sbyte_13 = left.register.sbyte_13 > right.register.sbyte_13 ? left.register.sbyte_13 : right.register.sbyte_13; - vec.register.sbyte_14 = left.register.sbyte_14 > right.register.sbyte_14 ? left.register.sbyte_14 : right.register.sbyte_14; - vec.register.sbyte_15 = left.register.sbyte_15 > right.register.sbyte_15 ? left.register.sbyte_15 : right.register.sbyte_15; - return vec; - } - else if (typeof(T) == typeof(UInt16)) - { - vec.register.uint16_0 = left.register.uint16_0 > right.register.uint16_0 ? left.register.uint16_0 : right.register.uint16_0; - vec.register.uint16_1 = left.register.uint16_1 > right.register.uint16_1 ? left.register.uint16_1 : right.register.uint16_1; - vec.register.uint16_2 = left.register.uint16_2 > right.register.uint16_2 ? left.register.uint16_2 : right.register.uint16_2; - vec.register.uint16_3 = left.register.uint16_3 > right.register.uint16_3 ? left.register.uint16_3 : right.register.uint16_3; - vec.register.uint16_4 = left.register.uint16_4 > right.register.uint16_4 ? left.register.uint16_4 : right.register.uint16_4; - vec.register.uint16_5 = left.register.uint16_5 > right.register.uint16_5 ? left.register.uint16_5 : right.register.uint16_5; - vec.register.uint16_6 = left.register.uint16_6 > right.register.uint16_6 ? left.register.uint16_6 : right.register.uint16_6; - vec.register.uint16_7 = left.register.uint16_7 > right.register.uint16_7 ? left.register.uint16_7 : right.register.uint16_7; - return vec; - } - else if (typeof(T) == typeof(Int16)) - { - vec.register.int16_0 = left.register.int16_0 > right.register.int16_0 ? left.register.int16_0 : right.register.int16_0; - vec.register.int16_1 = left.register.int16_1 > right.register.int16_1 ? left.register.int16_1 : right.register.int16_1; - vec.register.int16_2 = left.register.int16_2 > right.register.int16_2 ? left.register.int16_2 : right.register.int16_2; - vec.register.int16_3 = left.register.int16_3 > right.register.int16_3 ? left.register.int16_3 : right.register.int16_3; - vec.register.int16_4 = left.register.int16_4 > right.register.int16_4 ? left.register.int16_4 : right.register.int16_4; - vec.register.int16_5 = left.register.int16_5 > right.register.int16_5 ? left.register.int16_5 : right.register.int16_5; - vec.register.int16_6 = left.register.int16_6 > right.register.int16_6 ? left.register.int16_6 : right.register.int16_6; - vec.register.int16_7 = left.register.int16_7 > right.register.int16_7 ? left.register.int16_7 : right.register.int16_7; - return vec; - } - else if (typeof(T) == typeof(UInt32)) - { - vec.register.uint32_0 = left.register.uint32_0 > right.register.uint32_0 ? left.register.uint32_0 : right.register.uint32_0; - vec.register.uint32_1 = left.register.uint32_1 > right.register.uint32_1 ? left.register.uint32_1 : right.register.uint32_1; - vec.register.uint32_2 = left.register.uint32_2 > right.register.uint32_2 ? left.register.uint32_2 : right.register.uint32_2; - vec.register.uint32_3 = left.register.uint32_3 > right.register.uint32_3 ? left.register.uint32_3 : right.register.uint32_3; - return vec; - } - else if (typeof(T) == typeof(Int32)) - { - vec.register.int32_0 = left.register.int32_0 > right.register.int32_0 ? left.register.int32_0 : right.register.int32_0; - vec.register.int32_1 = left.register.int32_1 > right.register.int32_1 ? left.register.int32_1 : right.register.int32_1; - vec.register.int32_2 = left.register.int32_2 > right.register.int32_2 ? left.register.int32_2 : right.register.int32_2; - vec.register.int32_3 = left.register.int32_3 > right.register.int32_3 ? left.register.int32_3 : right.register.int32_3; - return vec; - } - else if (typeof(T) == typeof(UInt64)) - { - vec.register.uint64_0 = left.register.uint64_0 > right.register.uint64_0 ? left.register.uint64_0 : right.register.uint64_0; - vec.register.uint64_1 = left.register.uint64_1 > right.register.uint64_1 ? left.register.uint64_1 : right.register.uint64_1; - return vec; - } - else if (typeof(T) == typeof(Int64)) - { - vec.register.int64_0 = left.register.int64_0 > right.register.int64_0 ? left.register.int64_0 : right.register.int64_0; - vec.register.int64_1 = left.register.int64_1 > right.register.int64_1 ? left.register.int64_1 : right.register.int64_1; - return vec; - } - else if (typeof(T) == typeof(Single)) - { - vec.register.single_0 = left.register.single_0 > right.register.single_0 ? left.register.single_0 : right.register.single_0; - vec.register.single_1 = left.register.single_1 > right.register.single_1 ? left.register.single_1 : right.register.single_1; - vec.register.single_2 = left.register.single_2 > right.register.single_2 ? left.register.single_2 : right.register.single_2; - vec.register.single_3 = left.register.single_3 > right.register.single_3 ? left.register.single_3 : right.register.single_3; - return vec; - } - else if (typeof(T) == typeof(Double)) - { - vec.register.double_0 = left.register.double_0 > right.register.double_0 ? left.register.double_0 : right.register.double_0; - vec.register.double_1 = left.register.double_1 > right.register.double_1 ? left.register.double_1 : right.register.double_1; - return vec; - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - } - - [JitIntrinsic] - internal static T DotProduct(Vector<T> left, Vector<T> right) - { - if (Vector.IsHardwareAccelerated) - { - T product = GetZeroValue(); - for (int g = 0; g < Count; g++) - { - product = ScalarAdd(product, ScalarMultiply(left[g], right[g])); - } - return product; - } - else - { - if (typeof(T) == typeof(Byte)) - { - Byte product = 0; - product += (Byte)(left.register.byte_0 * right.register.byte_0); - product += (Byte)(left.register.byte_1 * right.register.byte_1); - product += (Byte)(left.register.byte_2 * right.register.byte_2); - product += (Byte)(left.register.byte_3 * right.register.byte_3); - product += (Byte)(left.register.byte_4 * right.register.byte_4); - product += (Byte)(left.register.byte_5 * right.register.byte_5); - product += (Byte)(left.register.byte_6 * right.register.byte_6); - product += (Byte)(left.register.byte_7 * right.register.byte_7); - product += (Byte)(left.register.byte_8 * right.register.byte_8); - product += (Byte)(left.register.byte_9 * right.register.byte_9); - product += (Byte)(left.register.byte_10 * right.register.byte_10); - product += (Byte)(left.register.byte_11 * right.register.byte_11); - product += (Byte)(left.register.byte_12 * right.register.byte_12); - product += (Byte)(left.register.byte_13 * right.register.byte_13); - product += (Byte)(left.register.byte_14 * right.register.byte_14); - product += (Byte)(left.register.byte_15 * right.register.byte_15); - return (T)(object)product; - } - else if (typeof(T) == typeof(SByte)) - { - SByte product = 0; - product += (SByte)(left.register.sbyte_0 * right.register.sbyte_0); - product += (SByte)(left.register.sbyte_1 * right.register.sbyte_1); - product += (SByte)(left.register.sbyte_2 * right.register.sbyte_2); - product += (SByte)(left.register.sbyte_3 * right.register.sbyte_3); - product += (SByte)(left.register.sbyte_4 * right.register.sbyte_4); - product += (SByte)(left.register.sbyte_5 * right.register.sbyte_5); - product += (SByte)(left.register.sbyte_6 * right.register.sbyte_6); - product += (SByte)(left.register.sbyte_7 * right.register.sbyte_7); - product += (SByte)(left.register.sbyte_8 * right.register.sbyte_8); - product += (SByte)(left.register.sbyte_9 * right.register.sbyte_9); - product += (SByte)(left.register.sbyte_10 * right.register.sbyte_10); - product += (SByte)(left.register.sbyte_11 * right.register.sbyte_11); - product += (SByte)(left.register.sbyte_12 * right.register.sbyte_12); - product += (SByte)(left.register.sbyte_13 * right.register.sbyte_13); - product += (SByte)(left.register.sbyte_14 * right.register.sbyte_14); - product += (SByte)(left.register.sbyte_15 * right.register.sbyte_15); - return (T)(object)product; - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16 product = 0; - product += (UInt16)(left.register.uint16_0 * right.register.uint16_0); - product += (UInt16)(left.register.uint16_1 * right.register.uint16_1); - product += (UInt16)(left.register.uint16_2 * right.register.uint16_2); - product += (UInt16)(left.register.uint16_3 * right.register.uint16_3); - product += (UInt16)(left.register.uint16_4 * right.register.uint16_4); - product += (UInt16)(left.register.uint16_5 * right.register.uint16_5); - product += (UInt16)(left.register.uint16_6 * right.register.uint16_6); - product += (UInt16)(left.register.uint16_7 * right.register.uint16_7); - return (T)(object)product; - } - else if (typeof(T) == typeof(Int16)) - { - Int16 product = 0; - product += (Int16)(left.register.int16_0 * right.register.int16_0); - product += (Int16)(left.register.int16_1 * right.register.int16_1); - product += (Int16)(left.register.int16_2 * right.register.int16_2); - product += (Int16)(left.register.int16_3 * right.register.int16_3); - product += (Int16)(left.register.int16_4 * right.register.int16_4); - product += (Int16)(left.register.int16_5 * right.register.int16_5); - product += (Int16)(left.register.int16_6 * right.register.int16_6); - product += (Int16)(left.register.int16_7 * right.register.int16_7); - return (T)(object)product; - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32 product = 0; - product += (UInt32)(left.register.uint32_0 * right.register.uint32_0); - product += (UInt32)(left.register.uint32_1 * right.register.uint32_1); - product += (UInt32)(left.register.uint32_2 * right.register.uint32_2); - product += (UInt32)(left.register.uint32_3 * right.register.uint32_3); - return (T)(object)product; - } - else if (typeof(T) == typeof(Int32)) - { - Int32 product = 0; - product += (Int32)(left.register.int32_0 * right.register.int32_0); - product += (Int32)(left.register.int32_1 * right.register.int32_1); - product += (Int32)(left.register.int32_2 * right.register.int32_2); - product += (Int32)(left.register.int32_3 * right.register.int32_3); - return (T)(object)product; - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64 product = 0; - product += (UInt64)(left.register.uint64_0 * right.register.uint64_0); - product += (UInt64)(left.register.uint64_1 * right.register.uint64_1); - return (T)(object)product; - } - else if (typeof(T) == typeof(Int64)) - { - Int64 product = 0; - product += (Int64)(left.register.int64_0 * right.register.int64_0); - product += (Int64)(left.register.int64_1 * right.register.int64_1); - return (T)(object)product; - } - else if (typeof(T) == typeof(Single)) - { - Single product = 0; - product += (Single)(left.register.single_0 * right.register.single_0); - product += (Single)(left.register.single_1 * right.register.single_1); - product += (Single)(left.register.single_2 * right.register.single_2); - product += (Single)(left.register.single_3 * right.register.single_3); - return (T)(object)product; - } - else if (typeof(T) == typeof(Double)) - { - Double product = 0; - product += (Double)(left.register.double_0 * right.register.double_0); - product += (Double)(left.register.double_1 * right.register.double_1); - return (T)(object)product; - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - } - - [JitIntrinsic] - internal static unsafe Vector<T> SquareRoot(Vector<T> value) - { - if (Vector.IsHardwareAccelerated) - { - if (typeof(T) == typeof(Byte)) - { - Byte* dataPtr = stackalloc Byte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Byte)Math.Sqrt((Byte)(object)value[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(SByte)) - { - SByte* dataPtr = stackalloc SByte[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (SByte)Math.Sqrt((SByte)(object)value[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16* dataPtr = stackalloc UInt16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt16)Math.Sqrt((UInt16)(object)value[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int16)) - { - Int16* dataPtr = stackalloc Int16[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int16)Math.Sqrt((Int16)(object)value[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32* dataPtr = stackalloc UInt32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt32)Math.Sqrt((UInt32)(object)value[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int32)) - { - Int32* dataPtr = stackalloc Int32[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int32)Math.Sqrt((Int32)(object)value[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64* dataPtr = stackalloc UInt64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (UInt64)Math.Sqrt((UInt64)(object)value[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Int64)) - { - Int64* dataPtr = stackalloc Int64[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Int64)Math.Sqrt((Int64)(object)value[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Single)) - { - Single* dataPtr = stackalloc Single[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Single)Math.Sqrt((Single)(object)value[g]); - } - return new Vector<T>(dataPtr); - } - else if (typeof(T) == typeof(Double)) - { - Double* dataPtr = stackalloc Double[Count]; - for (int g = 0; g < Count; g++) - { - dataPtr[g] = (Double)Math.Sqrt((Double)(object)value[g]); - } - return new Vector<T>(dataPtr); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - else - { - if (typeof(T) == typeof(Byte)) - { - value.register.byte_0 = (Byte)Math.Sqrt(value.register.byte_0); - value.register.byte_1 = (Byte)Math.Sqrt(value.register.byte_1); - value.register.byte_2 = (Byte)Math.Sqrt(value.register.byte_2); - value.register.byte_3 = (Byte)Math.Sqrt(value.register.byte_3); - value.register.byte_4 = (Byte)Math.Sqrt(value.register.byte_4); - value.register.byte_5 = (Byte)Math.Sqrt(value.register.byte_5); - value.register.byte_6 = (Byte)Math.Sqrt(value.register.byte_6); - value.register.byte_7 = (Byte)Math.Sqrt(value.register.byte_7); - value.register.byte_8 = (Byte)Math.Sqrt(value.register.byte_8); - value.register.byte_9 = (Byte)Math.Sqrt(value.register.byte_9); - value.register.byte_10 = (Byte)Math.Sqrt(value.register.byte_10); - value.register.byte_11 = (Byte)Math.Sqrt(value.register.byte_11); - value.register.byte_12 = (Byte)Math.Sqrt(value.register.byte_12); - value.register.byte_13 = (Byte)Math.Sqrt(value.register.byte_13); - value.register.byte_14 = (Byte)Math.Sqrt(value.register.byte_14); - value.register.byte_15 = (Byte)Math.Sqrt(value.register.byte_15); - return value; - } - else if (typeof(T) == typeof(SByte)) - { - value.register.sbyte_0 = (SByte)Math.Sqrt(value.register.sbyte_0); - value.register.sbyte_1 = (SByte)Math.Sqrt(value.register.sbyte_1); - value.register.sbyte_2 = (SByte)Math.Sqrt(value.register.sbyte_2); - value.register.sbyte_3 = (SByte)Math.Sqrt(value.register.sbyte_3); - value.register.sbyte_4 = (SByte)Math.Sqrt(value.register.sbyte_4); - value.register.sbyte_5 = (SByte)Math.Sqrt(value.register.sbyte_5); - value.register.sbyte_6 = (SByte)Math.Sqrt(value.register.sbyte_6); - value.register.sbyte_7 = (SByte)Math.Sqrt(value.register.sbyte_7); - value.register.sbyte_8 = (SByte)Math.Sqrt(value.register.sbyte_8); - value.register.sbyte_9 = (SByte)Math.Sqrt(value.register.sbyte_9); - value.register.sbyte_10 = (SByte)Math.Sqrt(value.register.sbyte_10); - value.register.sbyte_11 = (SByte)Math.Sqrt(value.register.sbyte_11); - value.register.sbyte_12 = (SByte)Math.Sqrt(value.register.sbyte_12); - value.register.sbyte_13 = (SByte)Math.Sqrt(value.register.sbyte_13); - value.register.sbyte_14 = (SByte)Math.Sqrt(value.register.sbyte_14); - value.register.sbyte_15 = (SByte)Math.Sqrt(value.register.sbyte_15); - return value; - } - else if (typeof(T) == typeof(UInt16)) - { - value.register.uint16_0 = (UInt16)Math.Sqrt(value.register.uint16_0); - value.register.uint16_1 = (UInt16)Math.Sqrt(value.register.uint16_1); - value.register.uint16_2 = (UInt16)Math.Sqrt(value.register.uint16_2); - value.register.uint16_3 = (UInt16)Math.Sqrt(value.register.uint16_3); - value.register.uint16_4 = (UInt16)Math.Sqrt(value.register.uint16_4); - value.register.uint16_5 = (UInt16)Math.Sqrt(value.register.uint16_5); - value.register.uint16_6 = (UInt16)Math.Sqrt(value.register.uint16_6); - value.register.uint16_7 = (UInt16)Math.Sqrt(value.register.uint16_7); - return value; - } - else if (typeof(T) == typeof(Int16)) - { - value.register.int16_0 = (Int16)Math.Sqrt(value.register.int16_0); - value.register.int16_1 = (Int16)Math.Sqrt(value.register.int16_1); - value.register.int16_2 = (Int16)Math.Sqrt(value.register.int16_2); - value.register.int16_3 = (Int16)Math.Sqrt(value.register.int16_3); - value.register.int16_4 = (Int16)Math.Sqrt(value.register.int16_4); - value.register.int16_5 = (Int16)Math.Sqrt(value.register.int16_5); - value.register.int16_6 = (Int16)Math.Sqrt(value.register.int16_6); - value.register.int16_7 = (Int16)Math.Sqrt(value.register.int16_7); - return value; - } - else if (typeof(T) == typeof(UInt32)) - { - value.register.uint32_0 = (UInt32)Math.Sqrt(value.register.uint32_0); - value.register.uint32_1 = (UInt32)Math.Sqrt(value.register.uint32_1); - value.register.uint32_2 = (UInt32)Math.Sqrt(value.register.uint32_2); - value.register.uint32_3 = (UInt32)Math.Sqrt(value.register.uint32_3); - return value; - } - else if (typeof(T) == typeof(Int32)) - { - value.register.int32_0 = (Int32)Math.Sqrt(value.register.int32_0); - value.register.int32_1 = (Int32)Math.Sqrt(value.register.int32_1); - value.register.int32_2 = (Int32)Math.Sqrt(value.register.int32_2); - value.register.int32_3 = (Int32)Math.Sqrt(value.register.int32_3); - return value; - } - else if (typeof(T) == typeof(UInt64)) - { - value.register.uint64_0 = (UInt64)Math.Sqrt(value.register.uint64_0); - value.register.uint64_1 = (UInt64)Math.Sqrt(value.register.uint64_1); - return value; - } - else if (typeof(T) == typeof(Int64)) - { - value.register.int64_0 = (Int64)Math.Sqrt(value.register.int64_0); - value.register.int64_1 = (Int64)Math.Sqrt(value.register.int64_1); - return value; - } - else if (typeof(T) == typeof(Single)) - { - value.register.single_0 = (Single)Math.Sqrt(value.register.single_0); - value.register.single_1 = (Single)Math.Sqrt(value.register.single_1); - value.register.single_2 = (Single)Math.Sqrt(value.register.single_2); - value.register.single_3 = (Single)Math.Sqrt(value.register.single_3); - return value; - } - else if (typeof(T) == typeof(Double)) - { - value.register.double_0 = (Double)Math.Sqrt(value.register.double_0); - value.register.double_1 = (Double)Math.Sqrt(value.register.double_1); - return value; - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - } - #endregion Internal Math Methods - - #region Helper Methods - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - private static bool ScalarEquals(T left, T right) - { - if (typeof(T) == typeof(Byte)) - { - return (Byte)(object)left == (Byte)(object)right; - } - else if (typeof(T) == typeof(SByte)) - { - return (SByte)(object)left == (SByte)(object)right; - } - else if (typeof(T) == typeof(UInt16)) - { - return (UInt16)(object)left == (UInt16)(object)right; - } - else if (typeof(T) == typeof(Int16)) - { - return (Int16)(object)left == (Int16)(object)right; - } - else if (typeof(T) == typeof(UInt32)) - { - return (UInt32)(object)left == (UInt32)(object)right; - } - else if (typeof(T) == typeof(Int32)) - { - return (Int32)(object)left == (Int32)(object)right; - } - else if (typeof(T) == typeof(UInt64)) - { - return (UInt64)(object)left == (UInt64)(object)right; - } - else if (typeof(T) == typeof(Int64)) - { - return (Int64)(object)left == (Int64)(object)right; - } - else if (typeof(T) == typeof(Single)) - { - return (Single)(object)left == (Single)(object)right; - } - else if (typeof(T) == typeof(Double)) - { - return (Double)(object)left == (Double)(object)right; - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - private static bool ScalarLessThan(T left, T right) - { - if (typeof(T) == typeof(Byte)) - { - return (Byte)(object)left < (Byte)(object)right; - } - else if (typeof(T) == typeof(SByte)) - { - return (SByte)(object)left < (SByte)(object)right; - } - else if (typeof(T) == typeof(UInt16)) - { - return (UInt16)(object)left < (UInt16)(object)right; - } - else if (typeof(T) == typeof(Int16)) - { - return (Int16)(object)left < (Int16)(object)right; - } - else if (typeof(T) == typeof(UInt32)) - { - return (UInt32)(object)left < (UInt32)(object)right; - } - else if (typeof(T) == typeof(Int32)) - { - return (Int32)(object)left < (Int32)(object)right; - } - else if (typeof(T) == typeof(UInt64)) - { - return (UInt64)(object)left < (UInt64)(object)right; - } - else if (typeof(T) == typeof(Int64)) - { - return (Int64)(object)left < (Int64)(object)right; - } - else if (typeof(T) == typeof(Single)) - { - return (Single)(object)left < (Single)(object)right; - } - else if (typeof(T) == typeof(Double)) - { - return (Double)(object)left < (Double)(object)right; - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - private static bool ScalarGreaterThan(T left, T right) - { - if (typeof(T) == typeof(Byte)) - { - return (Byte)(object)left > (Byte)(object)right; - } - else if (typeof(T) == typeof(SByte)) - { - return (SByte)(object)left > (SByte)(object)right; - } - else if (typeof(T) == typeof(UInt16)) - { - return (UInt16)(object)left > (UInt16)(object)right; - } - else if (typeof(T) == typeof(Int16)) - { - return (Int16)(object)left > (Int16)(object)right; - } - else if (typeof(T) == typeof(UInt32)) - { - return (UInt32)(object)left > (UInt32)(object)right; - } - else if (typeof(T) == typeof(Int32)) - { - return (Int32)(object)left > (Int32)(object)right; - } - else if (typeof(T) == typeof(UInt64)) - { - return (UInt64)(object)left > (UInt64)(object)right; - } - else if (typeof(T) == typeof(Int64)) - { - return (Int64)(object)left > (Int64)(object)right; - } - else if (typeof(T) == typeof(Single)) - { - return (Single)(object)left > (Single)(object)right; - } - else if (typeof(T) == typeof(Double)) - { - return (Double)(object)left > (Double)(object)right; - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - private static T ScalarAdd(T left, T right) - { - if (typeof(T) == typeof(Byte)) - { - return (T)(object)(Byte)((Byte)(object)left + (Byte)(object)right); - } - else if (typeof(T) == typeof(SByte)) - { - return (T)(object)(SByte)((SByte)(object)left + (SByte)(object)right); - } - else if (typeof(T) == typeof(UInt16)) - { - return (T)(object)(UInt16)((UInt16)(object)left + (UInt16)(object)right); - } - else if (typeof(T) == typeof(Int16)) - { - return (T)(object)(Int16)((Int16)(object)left + (Int16)(object)right); - } - else if (typeof(T) == typeof(UInt32)) - { - return (T)(object)(UInt32)((UInt32)(object)left + (UInt32)(object)right); - } - else if (typeof(T) == typeof(Int32)) - { - return (T)(object)(Int32)((Int32)(object)left + (Int32)(object)right); - } - else if (typeof(T) == typeof(UInt64)) - { - return (T)(object)(UInt64)((UInt64)(object)left + (UInt64)(object)right); - } - else if (typeof(T) == typeof(Int64)) - { - return (T)(object)(Int64)((Int64)(object)left + (Int64)(object)right); - } - else if (typeof(T) == typeof(Single)) - { - return (T)(object)(Single)((Single)(object)left + (Single)(object)right); - } - else if (typeof(T) == typeof(Double)) - { - return (T)(object)(Double)((Double)(object)left + (Double)(object)right); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - private static T ScalarSubtract(T left, T right) - { - if (typeof(T) == typeof(Byte)) - { - return (T)(object)(Byte)((Byte)(object)left - (Byte)(object)right); - } - else if (typeof(T) == typeof(SByte)) - { - return (T)(object)(SByte)((SByte)(object)left - (SByte)(object)right); - } - else if (typeof(T) == typeof(UInt16)) - { - return (T)(object)(UInt16)((UInt16)(object)left - (UInt16)(object)right); - } - else if (typeof(T) == typeof(Int16)) - { - return (T)(object)(Int16)((Int16)(object)left - (Int16)(object)right); - } - else if (typeof(T) == typeof(UInt32)) - { - return (T)(object)(UInt32)((UInt32)(object)left - (UInt32)(object)right); - } - else if (typeof(T) == typeof(Int32)) - { - return (T)(object)(Int32)((Int32)(object)left - (Int32)(object)right); - } - else if (typeof(T) == typeof(UInt64)) - { - return (T)(object)(UInt64)((UInt64)(object)left - (UInt64)(object)right); - } - else if (typeof(T) == typeof(Int64)) - { - return (T)(object)(Int64)((Int64)(object)left - (Int64)(object)right); - } - else if (typeof(T) == typeof(Single)) - { - return (T)(object)(Single)((Single)(object)left - (Single)(object)right); - } - else if (typeof(T) == typeof(Double)) - { - return (T)(object)(Double)((Double)(object)left - (Double)(object)right); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - private static T ScalarMultiply(T left, T right) - { - if (typeof(T) == typeof(Byte)) - { - return (T)(object)(Byte)((Byte)(object)left * (Byte)(object)right); - } - else if (typeof(T) == typeof(SByte)) - { - return (T)(object)(SByte)((SByte)(object)left * (SByte)(object)right); - } - else if (typeof(T) == typeof(UInt16)) - { - return (T)(object)(UInt16)((UInt16)(object)left * (UInt16)(object)right); - } - else if (typeof(T) == typeof(Int16)) - { - return (T)(object)(Int16)((Int16)(object)left * (Int16)(object)right); - } - else if (typeof(T) == typeof(UInt32)) - { - return (T)(object)(UInt32)((UInt32)(object)left * (UInt32)(object)right); - } - else if (typeof(T) == typeof(Int32)) - { - return (T)(object)(Int32)((Int32)(object)left * (Int32)(object)right); - } - else if (typeof(T) == typeof(UInt64)) - { - return (T)(object)(UInt64)((UInt64)(object)left * (UInt64)(object)right); - } - else if (typeof(T) == typeof(Int64)) - { - return (T)(object)(Int64)((Int64)(object)left * (Int64)(object)right); - } - else if (typeof(T) == typeof(Single)) - { - return (T)(object)(Single)((Single)(object)left * (Single)(object)right); - } - else if (typeof(T) == typeof(Double)) - { - return (T)(object)(Double)((Double)(object)left * (Double)(object)right); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - private static T ScalarDivide(T left, T right) - { - if (typeof(T) == typeof(Byte)) - { - return (T)(object)(Byte)((Byte)(object)left / (Byte)(object)right); - } - else if (typeof(T) == typeof(SByte)) - { - return (T)(object)(SByte)((SByte)(object)left / (SByte)(object)right); - } - else if (typeof(T) == typeof(UInt16)) - { - return (T)(object)(UInt16)((UInt16)(object)left / (UInt16)(object)right); - } - else if (typeof(T) == typeof(Int16)) - { - return (T)(object)(Int16)((Int16)(object)left / (Int16)(object)right); - } - else if (typeof(T) == typeof(UInt32)) - { - return (T)(object)(UInt32)((UInt32)(object)left / (UInt32)(object)right); - } - else if (typeof(T) == typeof(Int32)) - { - return (T)(object)(Int32)((Int32)(object)left / (Int32)(object)right); - } - else if (typeof(T) == typeof(UInt64)) - { - return (T)(object)(UInt64)((UInt64)(object)left / (UInt64)(object)right); - } - else if (typeof(T) == typeof(Int64)) - { - return (T)(object)(Int64)((Int64)(object)left / (Int64)(object)right); - } - else if (typeof(T) == typeof(Single)) - { - return (T)(object)(Single)((Single)(object)left / (Single)(object)right); - } - else if (typeof(T) == typeof(Double)) - { - return (T)(object)(Double)((Double)(object)left / (Double)(object)right); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - private static T GetZeroValue() - { - if (typeof(T) == typeof(Byte)) - { - Byte value = 0; - return (T)(object)value; - } - else if (typeof(T) == typeof(SByte)) - { - SByte value = 0; - return (T)(object)value; - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16 value = 0; - return (T)(object)value; - } - else if (typeof(T) == typeof(Int16)) - { - Int16 value = 0; - return (T)(object)value; - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32 value = 0; - return (T)(object)value; - } - else if (typeof(T) == typeof(Int32)) - { - Int32 value = 0; - return (T)(object)value; - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64 value = 0; - return (T)(object)value; - } - else if (typeof(T) == typeof(Int64)) - { - Int64 value = 0; - return (T)(object)value; - } - else if (typeof(T) == typeof(Single)) - { - Single value = 0; - return (T)(object)value; - } - else if (typeof(T) == typeof(Double)) - { - Double value = 0; - return (T)(object)value; - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - private static T GetOneValue() - { - if (typeof(T) == typeof(Byte)) - { - Byte value = 1; - return (T)(object)value; - } - else if (typeof(T) == typeof(SByte)) - { - SByte value = 1; - return (T)(object)value; - } - else if (typeof(T) == typeof(UInt16)) - { - UInt16 value = 1; - return (T)(object)value; - } - else if (typeof(T) == typeof(Int16)) - { - Int16 value = 1; - return (T)(object)value; - } - else if (typeof(T) == typeof(UInt32)) - { - UInt32 value = 1; - return (T)(object)value; - } - else if (typeof(T) == typeof(Int32)) - { - Int32 value = 1; - return (T)(object)value; - } - else if (typeof(T) == typeof(UInt64)) - { - UInt64 value = 1; - return (T)(object)value; - } - else if (typeof(T) == typeof(Int64)) - { - Int64 value = 1; - return (T)(object)value; - } - else if (typeof(T) == typeof(Single)) - { - Single value = 1; - return (T)(object)value; - } - else if (typeof(T) == typeof(Double)) - { - Double value = 1; - return (T)(object)value; - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - private static T GetAllBitsSetValue() - { - if (typeof(T) == typeof(Byte)) - { - return (T)(object)ConstantHelper.GetByteWithAllBitsSet(); - } - else if (typeof(T) == typeof(SByte)) - { - return (T)(object)ConstantHelper.GetSByteWithAllBitsSet(); - } - else if (typeof(T) == typeof(UInt16)) - { - return (T)(object)ConstantHelper.GetUInt16WithAllBitsSet(); - } - else if (typeof(T) == typeof(Int16)) - { - return (T)(object)ConstantHelper.GetInt16WithAllBitsSet(); - } - else if (typeof(T) == typeof(UInt32)) - { - return (T)(object)ConstantHelper.GetUInt32WithAllBitsSet(); - } - else if (typeof(T) == typeof(Int32)) - { - return (T)(object)ConstantHelper.GetInt32WithAllBitsSet(); - } - else if (typeof(T) == typeof(UInt64)) - { - return (T)(object)ConstantHelper.GetUInt64WithAllBitsSet(); - } - else if (typeof(T) == typeof(Int64)) - { - return (T)(object)ConstantHelper.GetInt64WithAllBitsSet(); - } - else if (typeof(T) == typeof(Single)) - { - return (T)(object)ConstantHelper.GetSingleWithAllBitsSet(); - } - else if (typeof(T) == typeof(Double)) - { - return (T)(object)ConstantHelper.GetDoubleWithAllBitsSet(); - } - else - { - throw new NotSupportedException(SR.Arg_TypeNotSupported); - } - } - #endregion - } -} diff --git a/mcs/class/System.Numerics.Vectors/System.Numerics/Vector_Operations.cs b/mcs/class/System.Numerics.Vectors/System.Numerics/Vector_Operations.cs deleted file mode 100644 index 83a5ad38cab..00000000000 --- a/mcs/class/System.Numerics.Vectors/System.Numerics/Vector_Operations.cs +++ /dev/null @@ -1,865 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Runtime.CompilerServices; - -namespace System.Numerics -{ - /// <summary> - /// Contains various methods useful for creating, manipulating, combining, and converting generic vectors with one another. - /// </summary> - public static class Vector - { - // JIT is not looking at the Vector class methods - // all methods here should be inlined and they must be implemented in terms of Vector<T> intrinsics - #region Select Methods - /// <summary> - /// Creates a new vector with elements selected between the two given source vectors, and based on a mask vector. - /// </summary> - /// <param name="condition">The integral mask vector used to drive selection.</param> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The new vector with elements selected based on the mask.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<Single> ConditionalSelect(Vector<int> condition, Vector<Single> left, Vector<Single> right) - { - return (Vector<Single>)Vector<Single>.ConditionalSelect((Vector<Single>)condition, left, right); - } - - /// <summary> - /// Creates a new vector with elements selected between the two given source vectors, and based on a mask vector. - /// </summary> - /// <param name="condition">The integral mask vector used to drive selection.</param> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The new vector with elements selected based on the mask.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<double> ConditionalSelect(Vector<long> condition, Vector<double> left, Vector<double> right) - { - return (Vector<double>)Vector<double>.ConditionalSelect((Vector<double>)condition, left, right); - } - - /// <summary> - /// Creates a new vector with elements selected between the two given source vectors, and based on a mask vector. - /// </summary> - /// <param name="condition">The mask vector used to drive selection.</param> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The new vector with elements selected based on the mask.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> ConditionalSelect<T>(Vector<T> condition, Vector<T> left, Vector<T> right) where T : struct - { - return Vector<T>.ConditionalSelect(condition, left, right); - } - #endregion Select Methods - - #region Comparison methods - #region Equals methods - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left and right were equal. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> Equals<T>(Vector<T> left, Vector<T> right) where T : struct - { - return Vector<T>.Equals(left, right); - } - - /// <summary> - /// Returns an integral vector whose elements signal whether elements in the left and right floating point vectors were equal. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<int> Equals(Vector<Single> left, Vector<Single> right) - { - return (Vector<int>)Vector<Single>.Equals(left, right); - } - - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left and right were equal. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<int> Equals(Vector<int> left, Vector<int> right) - { - return Vector<int>.Equals(left, right); - } - - /// <summary> - /// Returns an integral vector whose elements signal whether elements in the left and right floating point vectors were equal. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<long> Equals(Vector<double> left, Vector<double> right) - { - return (Vector<long>)Vector<double>.Equals(left, right); - } - - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left and right were equal. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<long> Equals(Vector<long> left, Vector<long> right) - { - return Vector<long>.Equals(left, right); - } - - /// <summary> - /// Returns a boolean indicating whether each pair of elements in the given vectors are equal. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The first vector to compare.</param> - /// <returns>True if all elements are equal; False otherwise.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static bool EqualsAll<T>(Vector<T> left, Vector<T> right) where T : struct - { - return left == right; - } - - /// <summary> - /// Returns a boolean indicating whether any single pair of elements in the given vectors are equal. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>True if any element pairs are equal; False if no element pairs are equal.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static bool EqualsAny<T>(Vector<T> left, Vector<T> right) where T : struct - { - return !Vector<T>.Equals(left, right).Equals(Vector<T>.Zero); - } - #endregion Equals methods - - #region Lessthan Methods - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left were less than their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> LessThan<T>(Vector<T> left, Vector<T> right) where T : struct - { - return Vector<T>.LessThan(left, right); - } - - /// <summary> - /// Returns an integral vector whose elements signal whether the elements in left were less than their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant integral vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<int> LessThan(Vector<Single> left, Vector<Single> right) - { - return (Vector<int>)Vector<Single>.LessThan(left, right); - } - - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left were less than their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<int> LessThan(Vector<int> left, Vector<int> right) - { - return Vector<int>.LessThan(left, right); - } - - /// <summary> - /// Returns an integral vector whose elements signal whether the elements in left were less than their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant integral vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<long> LessThan(Vector<double> left, Vector<double> right) - { - return (Vector<long>)Vector<double>.LessThan(left, right); - } - - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left were less than their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<long> LessThan(Vector<long> left, Vector<long> right) - { - return Vector<long>.LessThan(left, right); - } - - /// <summary> - /// Returns a boolean indicating whether all of the elements in left are less than their corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>True if all elements in left are less than their corresponding elements in right; False otherwise.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static bool LessThanAll<T>(Vector<T> left, Vector<T> right) where T : struct - { - Vector<int> cond = (Vector<int>)Vector<T>.LessThan(left, right); - return cond.Equals(Vector<int>.AllOnes); - } - - /// <summary> - /// Returns a boolean indicating whether any element in left is less than its corresponding element in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>True if any elements in left are less than their corresponding elements in right; False otherwise.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static bool LessThanAny<T>(Vector<T> left, Vector<T> right) where T : struct - { - Vector<int> cond = (Vector<int>)Vector<T>.LessThan(left, right); - return !cond.Equals(Vector<int>.Zero); - } - #endregion LessthanMethods - - #region Lessthanorequal methods - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left were less than or equal to their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> LessThanOrEqual<T>(Vector<T> left, Vector<T> right) where T : struct - { - return Vector<T>.LessThanOrEqual(left, right); - } - - /// <summary> - /// Returns an integral vector whose elements signal whether the elements in left were less than or equal to their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant integral vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<int> LessThanOrEqual(Vector<Single> left, Vector<Single> right) - { - return (Vector<int>)Vector<Single>.LessThanOrEqual(left, right); - } - - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left were less than or equal to their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<int> LessThanOrEqual(Vector<int> left, Vector<int> right) - { - return Vector<int>.LessThanOrEqual(left, right); - } - - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left were less than or equal to their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<long> LessThanOrEqual(Vector<long> left, Vector<long> right) - { - return Vector<long>.LessThanOrEqual(left, right); - } - - /// <summary> - /// Returns an integral vector whose elements signal whether the elements in left were less than or equal to their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant integral vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<long> LessThanOrEqual(Vector<double> left, Vector<double> right) - { - return (Vector<long>)Vector<double>.LessThanOrEqual(left, right); - } - - /// <summary> - /// Returns a boolean indicating whether all elements in left are less than or equal to their corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>True if all elements in left are less than or equal to their corresponding elements in right; False otherwise.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static bool LessThanOrEqualAll<T>(Vector<T> left, Vector<T> right) where T : struct - { - Vector<int> cond = (Vector<int>)Vector<T>.LessThanOrEqual(left, right); - return cond.Equals(Vector<int>.AllOnes); - } - - /// <summary> - /// Returns a boolean indicating whether any element in left is less than or equal to its corresponding element in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>True if any elements in left are less than their corresponding elements in right; False otherwise.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static bool LessThanOrEqualAny<T>(Vector<T> left, Vector<T> right) where T : struct - { - Vector<int> cond = (Vector<int>)Vector<T>.LessThanOrEqual(left, right); - return !cond.Equals(Vector<int>.Zero); - } - #endregion Lessthanorequal methods - - #region Greaterthan methods - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left were greater than their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> GreaterThan<T>(Vector<T> left, Vector<T> right) where T : struct - { - return Vector<T>.GreaterThan(left, right); - } - - /// <summary> - /// Returns an integral vector whose elements signal whether the elements in left were greater than their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant integral vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<int> GreaterThan(Vector<Single> left, Vector<Single> right) - { - return (Vector<int>)Vector<Single>.GreaterThan(left, right); - } - - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left were greater than their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<int> GreaterThan(Vector<int> left, Vector<int> right) - { - return Vector<int>.GreaterThan(left, right); - } - - /// <summary> - /// Returns an integral vector whose elements signal whether the elements in left were greater than their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant integral vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<long> GreaterThan(Vector<double> left, Vector<double> right) - { - return (Vector<long>)Vector<double>.GreaterThan(left, right); - } - - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left were greater than their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<long> GreaterThan(Vector<long> left, Vector<long> right) - { - return Vector<long>.GreaterThan(left, right); - } - - /// <summary> - /// Returns a boolean indicating whether all elements in left are greater than the corresponding elements in right. - /// elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>True if all elements in left are greater than their corresponding elements in right; False otherwise.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static bool GreaterThanAll<T>(Vector<T> left, Vector<T> right) where T : struct - { - Vector<int> cond = (Vector<int>)Vector<T>.GreaterThan(left, right); - return cond.Equals(Vector<int>.AllOnes); - } - - /// <summary> - /// Returns a boolean indicating whether any element in left is greater than its corresponding element in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>True if any elements in left are greater than their corresponding elements in right; False otherwise.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static bool GreaterThanAny<T>(Vector<T> left, Vector<T> right) where T : struct - { - Vector<int> cond = (Vector<int>)Vector<T>.GreaterThan(left, right); - return !cond.Equals(Vector<int>.Zero); - } - #endregion Greaterthan methods - - #region Greaterthanorequal methods - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left were greater than or equal to their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> GreaterThanOrEqual<T>(Vector<T> left, Vector<T> right) where T : struct - { - return Vector<T>.GreaterThanOrEqual(left, right); - } - - /// <summary> - /// Returns an integral vector whose elements signal whether the elements in left were greater than or equal to their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant integral vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<int> GreaterThanOrEqual(Vector<Single> left, Vector<Single> right) - { - return (Vector<int>)Vector<Single>.GreaterThanOrEqual(left, right); - } - - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left were greater than or equal to their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<int> GreaterThanOrEqual(Vector<int> left, Vector<int> right) - { - return Vector<int>.GreaterThanOrEqual(left, right); - } - - /// <summary> - /// Returns a new vector whose elements signal whether the elements in left were greater than or equal to their - /// corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<long> GreaterThanOrEqual(Vector<long> left, Vector<long> right) - { - return Vector<long>.GreaterThanOrEqual(left, right); - } - - /// <summary> - /// Returns an integral vector whose elements signal whether the elements in left were greater than or equal to - /// their corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>The resultant integral vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<long> GreaterThanOrEqual(Vector<double> left, Vector<double> right) - { - return (Vector<long>)Vector<double>.GreaterThanOrEqual(left, right); - } - - /// <summary> - /// Returns a boolean indicating whether all of the elements in left are greater than or equal to - /// their corresponding elements in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>True if all elements in left are greater than or equal to their corresponding elements in right; False otherwise.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static bool GreaterThanOrEqualAll<T>(Vector<T> left, Vector<T> right) where T : struct - { - Vector<int> cond = (Vector<int>)Vector<T>.GreaterThanOrEqual(left, right); - return cond.Equals(Vector<int>.AllOnes); - } - - /// <summary> - /// Returns a boolean indicating whether any element in left is greater than or equal to its corresponding element in right. - /// </summary> - /// <param name="left">The first vector to compare.</param> - /// <param name="right">The second vector to compare.</param> - /// <returns>True if any elements in left are greater than or equal to their corresponding elements in right; False otherwise.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static bool GreaterThanOrEqualAny<T>(Vector<T> left, Vector<T> right) where T : struct - { - Vector<int> cond = (Vector<int>)Vector<T>.GreaterThanOrEqual(left, right); - return !cond.Equals(Vector<int>.Zero); - } - #endregion Greaterthanorequal methods - #endregion Comparison methods - - #region Vector Math Methods - // Every operation must either be a JIT intrinsic or implemented over a JIT intrinsic - // as a thin wrapper - // Operations implemented over a JIT intrinsic should be inlined - // Methods that do not have a <T> type parameter are recognized as intrinsics - /// <summary> - /// Returns whether or not vector operations are subject to hardware acceleration through JIT intrinsic support. - /// </summary> - [JitIntrinsic] - public static bool IsHardwareAccelerated - { - get - { - return false; - } - } - - // Vector<T> - // Basic Math - // All Math operations for Vector<T> are aggressively inlined here - - /// <summary> - /// Returns a new vector whose elements are the absolute values of the given vector's elements. - /// </summary> - /// <param name="value">The source vector.</param> - /// <returns>The absolute value vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> Abs<T>(Vector<T> value) where T : struct - { - return Vector<T>.Abs(value); - } - - /// <summary> - /// Returns a new vector whose elements are the minimum of each pair of elements in the two given vectors. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The minimum vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> Min<T>(Vector<T> left, Vector<T> right) where T : struct - { - return Vector<T>.Min(left, right); - } - - /// <summary> - /// Returns a new vector whose elements are the maximum of each pair of elements in the two given vectors. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The maximum vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> Max<T>(Vector<T> left, Vector<T> right) where T : struct - { - return Vector<T>.Max(left, right); - } - - // Specialized vector operations - - /// <summary> - /// Returns the dot product of two vectors. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The dot product.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static T Dot<T>(Vector<T> left, Vector<T> right) where T : struct - { - return Vector<T>.DotProduct(left, right); - } - - /// <summary> - /// Returns a new vector whose elements are the square roots of the given vector's elements. - /// </summary> - /// <param name="value">The source vector.</param> - /// <returns>The square root vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> SquareRoot<T>(Vector<T> value) where T : struct - { - return Vector<T>.SquareRoot(value); - } - #endregion Vector Math Methods - - #region Named Arithmetic Operators - /// <summary> - /// Creates a new vector whose values are the sum of each pair of elements from the two given vectors. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The summed vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> Add<T>(Vector<T> left, Vector<T> right) where T : struct - { - return left + right; - } - - /// <summary> - /// Creates a new vector whose values are the difference between each pairs of elements in the given vectors. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The difference vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> Subtract<T>(Vector<T> left, Vector<T> right) where T : struct - { - return left - right; - } - - /// <summary> - /// Creates a new vector whose values are the product of each pair of elements from the two given vectors. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The summed vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> Multiply<T>(Vector<T> left, Vector<T> right) where T : struct - { - return left * right; - } - - /// <summary> - /// Returns a new vector whose values are the values of the given vector each multiplied by a scalar value. - /// </summary> - /// <param name="left">The source vector.</param> - /// <param name="right">The scalar factor.</param> - /// <returns>The scaled vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> Multiply<T>(Vector<T> left, T right) where T : struct - { - return left * right; - } - - /// <summary> - /// Returns a new vector whose values are the values of the given vector each multiplied by a scalar value. - /// </summary> - /// <param name="left">The scalar factor.</param> - /// <param name="right">The source vector.</param> - /// <returns>The scaled vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> Multiply<T>(T left, Vector<T> right) where T : struct - { - return left * right; - } - - /// <summary> - /// Returns a new vector whose values are the result of dividing the first vector's elements - /// by the corresponding elements in the second vector. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The divided vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> Divide<T>(Vector<T> left, Vector<T> right) where T : struct - { - return left / right; - } - - /// <summary> - /// Returns a new vector whose elements are the given vector's elements negated. - /// </summary> - /// <param name="value">The source vector.</param> - /// <returns>The negated vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> Negate<T>(Vector<T> value) where T : struct - { - return -value; - } - #endregion Named Arithmetic Operators - - #region Named Bitwise Operators - /// <summary> - /// Returns a new vector by performing a bitwise-and operation on each of the elements in the given vectors. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> BitwiseAnd<T>(Vector<T> left, Vector<T> right) where T : struct - { - return left & right; - } - - /// <summary> - /// Returns a new vector by performing a bitwise-or operation on each of the elements in the given vectors. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> BitwiseOr<T>(Vector<T> left, Vector<T> right) where T : struct - { - return left | right; - } - - /// <summary> - /// Returns a new vector whose elements are obtained by taking the one's complement of the given vector's elements. - /// </summary> - /// <param name="value">The source vector.</param> - /// <returns>The one's complement vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> OnesComplement<T>(Vector<T> value) where T : struct - { - return ~value; - } - - /// <summary> - /// Returns a new vector by performing a bitwise-exclusive-or operation on each of the elements in the given vectors. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> Xor<T>(Vector<T> left, Vector<T> right) where T : struct - { - return left ^ right; - } - - /// <summary> - /// Returns a new vector by performing a bitwise-and-not operation on each of the elements in the given vectors. - /// </summary> - /// <param name="left">The first source vector.</param> - /// <param name="right">The second source vector.</param> - /// <returns>The resultant vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<T> AndNot<T>(Vector<T> left, Vector<T> right) where T : struct - { - return left & ~right; - } - #endregion Named Bitwise Operators - - #region Conversion Methods - /// <summary> - /// Reinterprets the bits of the given vector into those of a vector of unsigned bytes. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<Byte> AsVectorByte<T>(Vector<T> value) where T : struct - { - return (Vector<Byte>)value; - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of a vector of signed bytes. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [CLSCompliant(false)] - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<SByte> AsVectorSByte<T>(Vector<T> value) where T : struct - { - return (Vector<SByte>)value; - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of a vector of 16-bit integers. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [CLSCompliant(false)] - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<UInt16> AsVectorUInt16<T>(Vector<T> value) where T : struct - { - return (Vector<UInt16>)value; - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of a vector of signed 16-bit integers. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<Int16> AsVectorInt16<T>(Vector<T> value) where T : struct - { - return (Vector<Int16>)value; - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of a vector of unsigned 32-bit integers. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [CLSCompliant(false)] - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<UInt32> AsVectorUInt32<T>(Vector<T> value) where T : struct - { - return (Vector<UInt32>)value; - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of a vector of signed 32-bit integers. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<Int32> AsVectorInt32<T>(Vector<T> value) where T : struct - { - return (Vector<Int32>)value; - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of a vector of unsigned 64-bit integers. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [CLSCompliant(false)] - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<UInt64> AsVectorUInt64<T>(Vector<T> value) where T : struct - { - return (Vector<UInt64>)value; - } - - - /// <summary> - /// Reinterprets the bits of the given vector into those of a vector of signed 64-bit integers. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<Int64> AsVectorInt64<T>(Vector<T> value) where T : struct - { - return (Vector<Int64>)value; - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of a vector of 32-bit floating point numbers. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<Single> AsVectorSingle<T>(Vector<T> value) where T : struct - { - return (Vector<Single>)value; - } - - /// <summary> - /// Reinterprets the bits of the given vector into those of a vector of 64-bit floating point numbers. - /// </summary> - /// <param name="value">The source vector</param> - /// <returns>The reinterpreted vector.</returns> - [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] - public static Vector<Double> AsVectorDouble<T>(Vector<T> value) where T : struct - { - return (Vector<Double>)value; - } - #endregion Conversion Methods - } -} diff --git a/mcs/class/System.Numerics.Vectors/net_4_x_System.Numerics.Vectors.dll.sources b/mcs/class/System.Numerics.Vectors/net_4_x_System.Numerics.Vectors.dll.sources deleted file mode 100644 index d4f1837d8ec..00000000000 --- a/mcs/class/System.Numerics.Vectors/net_4_x_System.Numerics.Vectors.dll.sources +++ /dev/null @@ -1 +0,0 @@ -#include System.Numerics.Vectors.dll.sources |