Ejemplo n.º 1
0
        public void RunClsVarScenario()
        {
            var result = Sse41.Insert(
                _clsVar,
                (uint)2,
                1
                );

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(_clsVar, _dataTable.outArrayPtr);
        }
Ejemplo n.º 2
0
        public void RunBasicScenario_UnsafeRead()
        {
            var result = Sse41.Insert(
                Unsafe.Read <Vector128 <Single> >(_dataTable.inArray1Ptr),
                Unsafe.Read <Vector128 <Single> >(_dataTable.inArray2Ptr),
                2
                );

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
        }
Ejemplo n.º 3
0
        public void RunBasicScenario_UnsafeRead()
        {
            var result = Sse41.Insert(
                Unsafe.Read <Vector128 <UInt32> >(_dataTable.inArrayPtr),
                (uint)2,
                1
                );

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(_dataTable.inArrayPtr, _dataTable.outArrayPtr);
        }
Ejemplo n.º 4
0
        public void RunBasicScenario_LoadAligned()
        {
            var result = Sse41.Insert(
                Sse2.LoadAlignedVector128((UInt32 *)(_dataTable.inArrayPtr)),
                (uint)2,
                1
                );

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(_dataTable.inArrayPtr, _dataTable.outArrayPtr);
        }
        public void RunLclVarScenario_LoadAligned()
        {
            TestLibrary.TestFramework.BeginScenario(nameof(RunLclVarScenario_LoadAligned));

            var left   = Sse.LoadAlignedVector128((Single *)(_dataTable.inArray1Ptr));
            var right  = LoadAlignedVector128((Single *)(_dataTable.inArray2Ptr));
            var result = Sse41.Insert(left, right, 129);

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(left, right, _dataTable.outArrayPtr);
        }
        public void RunLclVarScenario_UnsafeRead()
        {
            TestLibrary.TestFramework.BeginScenario(nameof(RunLclVarScenario_UnsafeRead));

            var left   = Unsafe.Read <Vector128 <Single> >(_dataTable.inArray1Ptr);
            var right  = Unsafe.Read <Vector128 <Single> >(_dataTable.inArray2Ptr);
            var result = Sse41.Insert(left, right, 129);

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(left, right, _dataTable.outArrayPtr);
        }
Ejemplo n.º 7
0
        public void RunBasicScenario_LoadAligned()
        {
            var result = Sse41.Insert(
                Sse.LoadAlignedVector128((Single *)(_dataTable.inArrayPtr)),
                (float)2,
                217
                );

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(_dataTable.inArrayPtr, _dataTable.outArrayPtr);
        }
Ejemplo n.º 8
0
        public void RunBasicScenario_Load()
        {
            var result = Sse41.Insert(
                Sse2.LoadVector128((UInt64 *)(_dataTable.inArrayPtr)),
                (ulong)2,
                129
                );

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(_dataTable.inArrayPtr, _dataTable.outArrayPtr);
        }
Ejemplo n.º 9
0
        public void RunBasicScenario_Load()
        {
            var result = Sse41.Insert(
                Sse.LoadVector128((Single *)(_dataTable.inArray1Ptr)),
                LoadVector128((Single *)(_dataTable.inArray2Ptr)),
                2
                );

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
        }
Ejemplo n.º 10
0
        public void RunLclVarScenario_LoadAligned()
        {
            TestLibrary.TestFramework.BeginScenario(nameof(RunLclVarScenario_LoadAligned));

            Byte localData = (byte)2;

            var firstOp = Sse2.LoadAlignedVector128((Byte *)(_dataTable.inArrayPtr));
            var result  = Sse41.Insert(firstOp, localData, 129);

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(firstOp, localData, _dataTable.outArrayPtr);
        }
Ejemplo n.º 11
0
        public void RunLclVarScenario()
        {
            TestLibrary.TestFramework.BeginScenario(nameof(RunLclVarScenario));

            Byte localData = (byte)2;

            var firstOp = Unsafe.Read <Vector128 <Byte> >(_dataTable.inArrayPtr);
            var result  = Sse41.Insert(firstOp, localData, 129);

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(firstOp, localData, _dataTable.outArrayPtr);
        }
Ejemplo n.º 12
0
        public void RunLclVarScenario_Load()
        {
            TestLibrary.TestFramework.BeginScenario(nameof(RunLclVarScenario_Load));

            UInt32 localData = (uint)2;

            var firstOp = Sse2.LoadVector128((UInt32 *)(_dataTable.inArrayPtr));
            var result  = Sse41.Insert(firstOp, localData, 1);

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(firstOp, localData, _dataTable.outArrayPtr);
        }
Ejemplo n.º 13
0
        public void RunBasicScenario()
        {
            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario));

            var result = Sse41.Insert(
                Unsafe.Read <Vector128 <Byte> >(_dataTable.inArrayPtr),
                (byte)2,
                129
                );

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(_dataTable.inArrayPtr, (byte)2, _dataTable.outArrayPtr);
        }
Ejemplo n.º 14
0
        public void RunClsVarScenario()
        {
            TestLibrary.TestFramework.BeginScenario(nameof(RunClsVarScenario));

            var result = Sse41.Insert(
                _clsVar1,
                _clsVar2,
                4
                );

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(_clsVar1, _clsVar2, _dataTable.outArrayPtr);
        }
Ejemplo n.º 15
0
        public void RunBasicScenario_Load()
        {
            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_Load));

            var result = Sse41.Insert(
                Sse2.LoadVector128((UInt32 *)(_dataTable.inArrayPtr)),
                (uint)2,
                129
                );

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(_dataTable.inArrayPtr, _dataTable.outArrayPtr);
        }
Ejemplo n.º 16
0
        public void RunBasicScenario_UnsafeRead()
        {
            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_UnsafeRead));

            var result = Sse41.Insert(
                Unsafe.Read <Vector128 <Single> >(_dataTable.inArray1Ptr),
                Unsafe.Read <Vector128 <Single> >(_dataTable.inArray2Ptr),
                4
                );

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
        }
Ejemplo n.º 17
0
        public void RunBasicScenario_LoadAligned()
        {
            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_LoadAligned));

            var result = Sse41.Insert(
                Sse.LoadAlignedVector128((Single *)(_dataTable.inArray1Ptr)),
                LoadAlignedVector128((Single *)(_dataTable.inArray2Ptr)),
                4
                );

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
        }
Ejemplo n.º 18
0
        public unsafe void RunBasicScenario_LoadAligned()
        {
            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_LoadAligned));

            Byte  localData = (byte)2;
            Byte *ptr       = &localData;

            var result = Sse41.Insert(
                Sse2.LoadAlignedVector128((Byte *)(_dataTable.inArrayPtr)),
                *ptr,
                129
                );

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(_dataTable.inArrayPtr, *ptr, _dataTable.outArrayPtr);
        }
Ejemplo n.º 19
0
        public unsafe void RunBasicScenario_Load()
        {
            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_Load));

            Int32  localData = (int)2;
            Int32 *ptr       = &localData;

            var result = Sse41.Insert(
                Sse2.LoadVector128((Int32 *)(_dataTable.inArrayPtr)),
                *ptr,
                1
                );

            Unsafe.Write(_dataTable.outArrayPtr, result);
            ValidateResult(_dataTable.inArrayPtr, *ptr, _dataTable.outArrayPtr);
        }
Ejemplo n.º 20
0
        public static Vector128 <float> VectorInsertSingle(float value, Vector128 <float> vector, byte index)
        {
            if (Sse41.IsSupported)
            {
                //Note: The if/else if is necessary to enable the JIT to
                //produce a single INSERTPS instruction instead of the
                //jump table fallback.
                if (index == 0)
                {
                    return(Sse41.Insert(vector, value, 0x00));
                }
                else if (index == 1)
                {
                    return(Sse41.Insert(vector, value, 0x10));
                }
                else if (index == 2)
                {
                    return(Sse41.Insert(vector, value, 0x20));
                }
                else if (index == 3)
                {
                    return(Sse41.Insert(vector, value, 0x30));
                }
                else
                {
                    throw new ArgumentOutOfRangeException(nameof(index));
                }
            }
            else if (Sse2.IsSupported)
            {
                int intValue = BitConverter.SingleToInt32Bits(value);

                ushort low  = (ushort)(intValue >> 0);
                ushort high = (ushort)(intValue >> 16);

                Vector128 <ushort> shortVector = Sse.StaticCast <float, ushort>(vector);

                shortVector = Sse2.Insert(shortVector, low, (byte)(index * 2 + 0));
                shortVector = Sse2.Insert(shortVector, high, (byte)(index * 2 + 1));

                return(Sse.StaticCast <ushort, float>(shortVector));
            }

            throw new PlatformNotSupportedException();
        }
Ejemplo n.º 21
0
        private Vector128 <byte> LongToUtf8_16(long value)
        {
            Vector128 <sbyte> v;

            if (Sse41.X64.IsSupported)
            {
                v = Vector128.CreateScalarUnsafe(value).AsSByte();
            }
            else
            {
                var value0 = (int)value;
                var value1 = (int)((ulong)value >> 32);
                v = Sse41.Insert(Vector128.CreateScalarUnsafe(value0), value1, 1).AsSByte();
            }
            var vector = Ssse3.Shuffle(v, ShuffleMask).AsInt16();

            return(Sse2.Add(Sse2.Or(Sse2.ShiftRightLogical(vector, 4), Sse2.ShiftLeftLogical(Sse2.And(vector, LowMask), 8)), ShortCharA).AsByte());
        }
Ejemplo n.º 22
0
        public static Vector128 <float> VectorInsertSingle(float Value, Vector128 <float> Vector, byte Index)
        {
            if (Sse41.IsSupported)
            {
                return(Sse41.Insert(Vector, Value, (byte)(Index << 4)));
            }
            else if (Sse2.IsSupported)
            {
                int IntValue = BitConverter.SingleToInt32Bits(Value);

                ushort Low  = (ushort)(IntValue >> 0);
                ushort High = (ushort)(IntValue >> 16);

                Vector128 <ushort> ShortVector = Sse.StaticCast <float, ushort>(Vector);

                ShortVector = Sse2.Insert(ShortVector, Low, (byte)(Index * 2 + 0));
                ShortVector = Sse2.Insert(ShortVector, High, (byte)(Index * 2 + 1));

                return(Sse.StaticCast <ushort, float>(ShortVector));
            }

            throw new PlatformNotSupportedException();
        }
Ejemplo n.º 23
0
        public static Vector128 <float> VectorInsertInt(ulong Value, Vector128 <float> Vector, byte Index, int Size)
        {
            if (Sse41.IsSupported)
            {
                switch (Size)
                {
                case 0:
                    return(Sse.StaticCast <byte, float>(Sse41.Insert(Sse.StaticCast <float, byte>(Vector), (byte)Value, Index)));

                case 1:
                    return(Sse.StaticCast <ushort, float>(Sse2.Insert(Sse.StaticCast <float, ushort>(Vector), (ushort)Value, Index)));

                case 2:
                    return(Sse.StaticCast <uint, float>(Sse41.Insert(Sse.StaticCast <float, uint>(Vector), (uint)Value, Index)));

                case 3:
                    return(Sse.StaticCast <ulong, float>(Sse41.Insert(Sse.StaticCast <float, ulong>(Vector), Value, Index)));
                }

                throw new ArgumentOutOfRangeException(nameof(Size));
            }
            else if (Sse2.IsSupported)
            {
                Vector128 <ushort> ShortVector = Sse.StaticCast <float, ushort>(Vector);

                int ShortIdx = Size == 0
                    ? Index >> 1
                    : Index << (Size - 1);

                switch (Size)
                {
                case 0:
                {
                    ushort ShortVal = Sse2.Extract(Sse.StaticCast <float, ushort>(Vector), (byte)ShortIdx);

                    int Shift = (Index & 1) * 8;

                    ShortVal &= (ushort)(0xff00 >> Shift);

                    ShortVal |= (ushort)((byte)Value << Shift);

                    return(Sse.StaticCast <ushort, float>(Sse2.Insert(ShortVector, ShortVal, (byte)ShortIdx)));
                }

                case 1:
                    return(Sse.StaticCast <ushort, float>(Sse2.Insert(Sse.StaticCast <float, ushort>(Vector), (ushort)Value, Index)));

                case 2:
                case 3:
                {
                    ShortVector = Sse2.Insert(ShortVector, (ushort)(Value >> 0), (byte)(ShortIdx + 0));
                    ShortVector = Sse2.Insert(ShortVector, (ushort)(Value >> 16), (byte)(ShortIdx + 1));

                    if (Size == 3)
                    {
                        ShortVector = Sse2.Insert(ShortVector, (ushort)(Value >> 32), (byte)(ShortIdx + 2));
                        ShortVector = Sse2.Insert(ShortVector, (ushort)(Value >> 48), (byte)(ShortIdx + 3));
                    }

                    return(Sse.StaticCast <ushort, float>(ShortVector));
                }
                }

                throw new ArgumentOutOfRangeException(nameof(Size));
            }

            throw new PlatformNotSupportedException();
        }
Ejemplo n.º 24
0
 public static Vector128 <byte> _mm_insert_epi8(Vector128 <byte> value, byte data, byte index)
 {
     return(Sse41.Insert(value, data, index));
 }
Ejemplo n.º 25
0
 public static Vector128 <uint> _mm_insert_epi32(Vector128 <uint> value, uint data, byte index)
 {
     return(Sse41.Insert(value, data, index));
 }
Ejemplo n.º 26
0
 public static Vector128 <float> _mm_insert_ps(Vector128 <float> value, Vector128 <float> data, byte index)
 {
     return(Sse41.Insert(value, data, index));
 }
Ejemplo n.º 27
0
 public static Vector128 <float> Sse41VectorInsertScalarSingle(float value, Vector128 <float> vector)
 {
     //Note: 0b1110 is the mask to zero the upper bits.
     return(Sse41.Insert(vector, value, 0b1110));
 }
Ejemplo n.º 28
0
        public static Vector128 <float> VectorInsertInt(ulong value, Vector128 <float> vector, byte index, int size)
        {
            if (Sse41.IsSupported)
            {
                if (size == 0)
                {
                    return(Sse.StaticCast <byte, float>(Sse41.Insert(Sse.StaticCast <float, byte>(vector), (byte)value, index)));
                }
                else if (size == 1)
                {
                    return(Sse.StaticCast <ushort, float>(Sse2.Insert(Sse.StaticCast <float, ushort>(vector), (ushort)value, index)));
                }
                else if (size == 2)
                {
                    return(Sse.StaticCast <uint, float>(Sse41.Insert(Sse.StaticCast <float, uint>(vector), (uint)value, index)));
                }
                else if (size == 3)
                {
                    return(Sse.StaticCast <ulong, float>(Sse41.Insert(Sse.StaticCast <float, ulong>(vector), value, index)));
                }
                else
                {
                    throw new ArgumentOutOfRangeException(nameof(size));
                }
            }
            else if (Sse2.IsSupported)
            {
                Vector128 <ushort> shortVector = Sse.StaticCast <float, ushort>(vector);

                int shortIdx = size == 0
                    ? index >> 1
                    : index << (size - 1);

                if (size == 0)
                {
                    ushort shortVal = Sse2.Extract(Sse.StaticCast <float, ushort>(vector), (byte)shortIdx);

                    int shift = (index & 1) * 8;

                    shortVal &= (ushort)(0xff00 >> shift);

                    shortVal |= (ushort)((byte)value << shift);

                    return(Sse.StaticCast <ushort, float>(Sse2.Insert(shortVector, shortVal, (byte)shortIdx)));
                }
                else if (size == 1)
                {
                    return(Sse.StaticCast <ushort, float>(Sse2.Insert(Sse.StaticCast <float, ushort>(vector), (ushort)value, index)));
                }
                else if (size == 2 || size == 3)
                {
                    shortVector = Sse2.Insert(shortVector, (ushort)(value >> 0), (byte)(shortIdx + 0));
                    shortVector = Sse2.Insert(shortVector, (ushort)(value >> 16), (byte)(shortIdx + 1));

                    if (size == 3)
                    {
                        shortVector = Sse2.Insert(shortVector, (ushort)(value >> 32), (byte)(shortIdx + 2));
                        shortVector = Sse2.Insert(shortVector, (ushort)(value >> 48), (byte)(shortIdx + 3));
                    }

                    return(Sse.StaticCast <ushort, float>(shortVector));
                }
                else
                {
                    throw new ArgumentOutOfRangeException(nameof(size));
                }
            }

            throw new PlatformNotSupportedException();
        }