コード例 #1
0
ファイル: tv_max.cs プロジェクト: 0xCM/arrows
        public void max128_i32()
        {
            var blocklen = Span128 <int> .BlockLength;
            var lhs      = Random.ReadOnlySpan128 <int>(SampleSize);
            var rhs      = Random.ReadOnlySpan128 <int>(SampleSize);
            var expect   = Span128.AllocBlocks <int>(SampleSize);
            var actual   = Span128.AllocBlocks <int>(SampleSize);

            for (var block = 0; block < SampleSize; block++)
            {
                var offset = block * blocklen;

                Span <int> tmp = stackalloc int[blocklen];
                for (var i = 0; i < blocklen; i++)
                {
                    tmp[i] = gmath.max(lhs[offset + i], rhs[offset + i]);
                }
                var vExpect = Vec128.LoadVector(ref tmp[0]);

                var vX      = lhs.LoadVec128(block);
                var vY      = rhs.LoadVec128(block);
                var vActual = ginx.max <int>(vX, vY);

                Claim.eq(vExpect, vActual);

                vstore(vExpect, ref expect.Block(block));
                vstore(vActual, ref actual.Block(block));
            }
            Claim.eq(expect, actual);
        }
コード例 #2
0
        public void CreateScalars()
        {
            {
                var vec1   = Vec128.FromParts(2, 0, 3, 0);
                var vec2   = Vec128.FromParts(5, 0, 7, 0);
                var expect = Vec128.FromParts(10L, 21L);
                var result = Vec128 <long> .Zero;
                result = dinx.mul(vec1, vec2);
                Claim.eq(expect, result);
            }

            {
                var vec1   = Vec128.FromParts(2, 0, 3, 0);
                var vec2   = Vec128.FromParts(5, 0, 7, 0);
                var result = Vec128 <long> .Zero;
                result = dinx.mul(vec1, vec2);
                var expect = Vec128.FromParts(vec1.ToScalar128(0) * vec2.ToScalar128(0), vec1.ToScalar128(2) * vec2.ToScalar128(2));
                Claim.eq(expect, result);
            }

            {
                var vec1   = Vec128.FromParts(2.0f, 3.0f, 4.0f, 5.0f);
                var vec2   = Vec128.FromParts(5.0f, 2.0f, 8.0f, 4.0f);
                var expect = Vec128.FromParts(10.0f, 6.0f, 32.0f, 20.0f);
                var result = Vec128 <float> .Zero;
                result = dfp.fmul(vec1, vec2);
                Claim.eq(expect, result);
            }
        }
コード例 #3
0
        public void permute128i32()
        {
            var id = Vec128.FromParts(0, 1, 2, 3);

            Claim.eq(dinx.permute(id, Perm4.ADCB), Vec128.FromParts(0, 3, 2, 1));
            Claim.eq(dinx.permute(id, Perm4.DBCA), Vec128.FromParts(3, 1, 2, 0));
            Permute4i32();
        }
コード例 #4
0
        public void increments_128x16u()
        {
            var v1 = Vec128.Increments((ushort)0);
            var v2 = Vec128.Decrements((ushort)7);
            var v3 = reverse_check(v1);

            Claim.eq(v2, v3);
        }
コード例 #5
0
        public void shuffle_128x8u()
        {
            var mask = Vec128.Fill((byte)0b10000000);
            var src  = Random.CpuVec128 <byte>();
            var dst  = dinx.shuffle(in src, in mask);
            var zed  = Vec128.Fill((byte)0);

            Claim.eq(dst, zed);
        }
コード例 #6
0
        // Test case taken from https://docs.microsoft.com/en-us/previous-versions/bb514073(v=vs.120)
        public void testz128i32()
        {
            var a = Vec128.FromParts(0x55550000BBBB9999ul, 0x0123456789ABCDEFul);
            var b = Vec128.FromParts(0xAAAAFFFF44446666ul, 0xFEDCBA9876543210ul);
            var c = Vec128.FromParts(0x55550000BBCB9999ul, 0x0123456789ABCDEFul);

            Claim.yea(dinx.testz(a, b));
            Claim.nea(dinx.testz(c, b));
        }
コード例 #7
0
ファイル: tv_sllv.cs プロジェクト: 0xCM/arrows
        public void Nonzero()
        {
            Claim.yea(gbits.nonz(Vec256.FromParts(1ul, 2ul, 3ul, 4ul)));
            Claim.yea(gbits.nonz(Vec256.FromParts(1ul, 0ul, 0ul, 0ul)));
            Claim.nea(gbits.nonz(Vec256.FromParts(0ul, 0ul, 0ul, 0ul)));

            Claim.yea(gbits.nonz(Vec128.FromParts(1u, 2u, 3u, 4u)));
            Claim.yea(gbits.nonz(Vec128.FromParts(1u, 0u, 0u, 0u)));
            Claim.nea(gbits.nonz(Vec128.FromParts(0u, 0u, 0u, 0u)));
        }
コード例 #8
0
        public void arrange_128_i32()
        {
            var u = Vec128Pattern.Increments <int>();

            Claim.eq(Vec128.FromParts(0, 1, 2, 3), u);

            var v = Vec128Pattern.Decrements <int>(3);

            Claim.eq(Vec128.FromParts(3, 2, 1, 0), v);

            Claim.eq(v, Arrange.shuffle(u, Perm4.DCBA));
            Claim.eq(u, Arrange.shuffle(v, Perm4.DCBA));
        }
コード例 #9
0
 void Flip128 <T>()
     where T : unmanaged
 {
     TypeCaseStart <T>();
     for (var i = 0; i < Pow2.T06; i++)
     {
         var src     = Random.CpuVec128 <T>();
         var srcData = src.ToSpan();
         var expect  = Vec128.Load(ref mathspan.flip(srcData)[0]);
         var actual  = gbits.flip(in src);
         Claim.yea(expect.Equals(actual));
     }
     TypeCaseEnd <T>();
 }
コード例 #10
0
        void nonzero128_check <T>()
            where T : unmanaged
        {
            TypeCaseStart <T>();
            var src = Random.Span128 <T>(blocks: SampleSize);

            for (var i = 0; i < src.BlockCount; i++)
            {
                var v = Vec128.Load(ref src.Block(i));
                Claim.yea(gbits.nonz(v));
            }

            Claim.nea(gbits.nonz(Vec128.Zero <T>()));
            TypeCaseEnd <T>();
        }
コード例 #11
0
ファイル: vstore.cs プロジェクト: 0xCM/arrows
 public static void vstore <T>(Vec128 <T> src, ref T dst)
     where T : struct
 {
     if (typeof(T) == typeof(sbyte))
     {
         vstore(int8(src), ref int8(ref dst));
     }
     else if (typeof(T) == typeof(byte))
     {
         vstore(uint8(src), ref uint8(ref dst));
     }
     else if (typeof(T) == typeof(short))
     {
         vstore(int16(src), ref int16(ref dst));
     }
     else if (typeof(T) == typeof(ushort))
     {
         vstore(uint16(src), ref uint16(ref dst));
     }
     else if (typeof(T) == typeof(int))
     {
         vstore(int32(src), ref int32(ref dst));
     }
     else if (typeof(T) == typeof(uint))
     {
         vstore(uint32(src), ref uint32(ref dst));
     }
     else if (typeof(T) == typeof(long))
     {
         vstore(int64(src), ref int64(ref dst));
     }
     else if (typeof(T) == typeof(ulong))
     {
         vstore(uint64(src), ref uint64(ref dst));
     }
     else if (typeof(T) == typeof(float))
     {
         vstore(float32(src), ref float32(ref dst));
     }
     else if (typeof(T) == typeof(double))
     {
         vstore(float64(src), ref float64(ref dst));
     }
     else
     {
         throw unsupported <T>();
     }
 }
コード例 #12
0
        public void shuffle128i32()
        {
            var v1 = Vec128.FromParts(0, 1, 2, 3);

            //Produces the identity permutation
            var m1 = (byte)0b11_10_01_00;

            //Reversal
            var m2 = (byte)0b00_01_10_11;

            //RotL(1)
            var m3 = (byte)0b10_01_00_11;

            var s1 = dinx.shuffle(v1, m1);
            var s2 = dinx.shuffle(v1, m2);
            var s3 = dinx.shuffle(v1, m3);
        }
コード例 #13
0
ファイル: t_perm.cs プロジェクト: 0xCM/arrows
        public void perm_swaps()
        {
            var src = Vec128.Increments((byte)0);

            Swap s  = (0, 1);
            var  x1 = dinx.swap(src, s);
            var  x2 = dinx.swap(x1, s);

            Claim.eq(x2, src);

            //Shuffle the first element all the way through to the last element
            var chain = Swap.Chain((0, 1), 15);
            var x3    = dinx.swap(src, chain);

            //Trace($"{chain.Format()} |> {src.FormatHex()} = {x3.FormatHex()}");
            Claim.eq(x3[15], (byte)0);
        }
コード例 #14
0
        void Permute4i32(int cycles = DefaltCycleCount, bool trace = false)
        {
            var pSrc = Random.EnumStream <Perm4>(x => (byte)x > 5);

            for (var i = 0; i < cycles; i++)
            {
                var v1 = Random.CpuVec128 <int>();
                var p  = pSrc.First();

                // Disassemble the spec
                var p0 = Bits.gather((byte)p, (byte)0b11);
                var p1 = Bits.gather((byte)p, (byte)0b1100);
                var p2 = Bits.gather((byte)p, (byte)0b110000);
                var p3 = Bits.gather((byte)p, (byte)0b11000000);

                // Reassemble the spec
                Perm4 q = (Perm4)(p0 | p1 << 2 | p2 << 4 | p3 << 6);

                // Same?
                Claim.eq(p, q);

                // Permute vector via api
                var v2 = dinx.permute(v1, p);

                // Permute vector manually
                var v3 = Vec128.FromParts(v1[p0], v1[p1], v1[p2], v1[p3]);

                // Same?
                Claim.eq(v3, v2);

                if (trace)
                {
                    Trace("v1", v1.FormatHex());
                    Trace("p", p.Format());
                    Trace("perm(v1,p)", v2.FormatHex());
                }
            }
        }
コード例 #15
0
ファイル: vstore.cs プロジェクト: 0xCM/arrows
 static unsafe void vstore(Vec128 <byte> src, ref byte dst)
 => Store(refptr(ref dst), src);
コード例 #16
0
        public void shuffle_128x16u()
        {
            var id = Vec128.FromParts(0, 1, 2, 3, 6, 7, 8, 9);

            Claim.eq(Arrange.shuffle(id, Perm4.ADCB, Perm4.ADCB), Vec128.FromParts(0, 3, 2, 1, 6, 9, 8, 7));
        }
コード例 #17
0
ファイル: vstore.cs プロジェクト: 0xCM/arrows
 static unsafe void vstore(Vec128 <short> src, ref short dst)
 => Store(refptr(ref dst), src);
コード例 #18
0
ファイル: vstore.cs プロジェクト: 0xCM/arrows
 static unsafe void vstore(Vec128 <uint> src, ref uint dst)
 => Store(refptr(ref dst), src);
コード例 #19
0
ファイル: vstore.cs プロジェクト: 0xCM/arrows
 static unsafe void vstore(Vec128 <ulong> src, ref ulong dst)
 => Store(refptr(ref dst), src);
コード例 #20
0
ファイル: vstore.cs プロジェクト: 0xCM/arrows
 static unsafe void vstore(Vec128 <float> src, ref float dst)
 => Store(refptr(ref dst), src);
コード例 #21
0
ファイル: vstore.cs プロジェクト: 0xCM/arrows
 static unsafe void vstore(Vec128 <double> src, ref double dst)
 => Store(refptr(ref dst), src);