public static unsafe void BlockCopy()

in AmbrosiaLib/Ambrosia/xxHash.cs [45:268]


            public static unsafe void BlockCopy(byte[] src, int srcOffset, byte[] dst, int dstOffset, int count)
            {
                Debug.Assert(src != null);
                Debug.Assert(dst != null);
                Debug.Assert(srcOffset >= 0 && srcOffset < src.Length);
                Debug.Assert(dstOffset >= 0 && dstOffset < dst.Length);
                Debug.Assert(count >= 0);
                Debug.Assert(count + srcOffset <= src.Length);
                Debug.Assert(count + dstOffset <= dst.Length);

                fixed (byte* pSrc = &src[srcOffset])
                fixed (byte* pDst = &dst[dstOffset])
                {
                    byte* ptrSrc = pSrc;
                    byte* ptrDst = pDst;

                SMALLTABLE:
                    switch (count)
                    {
                        case 0:
                            return;
                        case 1:
                            *ptrDst = *ptrSrc;
                            return;
                        case 2:
                            *(short*)ptrDst = *(short*)ptrSrc;
                            return;
                        case 3:
                            *(short*)(ptrDst + 0) = *(short*)(ptrSrc + 0);
                            *(ptrDst + 2) = *(ptrSrc + 2);
                            return;
                        case 4:
                            *(int*)ptrDst = *(int*)ptrSrc;
                            return;
                        case 5:
                            *(int*)(ptrDst + 0) = *(int*)(ptrSrc + 0);
                            *(ptrDst + 4) = *(ptrSrc + 4);
                            return;
                        case 6:
                            *(int*)(ptrDst + 0) = *(int*)(ptrSrc + 0);
                            *(short*)(ptrDst + 4) = *(short*)(ptrSrc + 4);
                            return;
                        case 7:
                            *(int*)(ptrDst + 0) = *(int*)(ptrSrc + 0);
                            *(short*)(ptrDst + 4) = *(short*)(ptrSrc + 4);
                            *(ptrDst + 6) = *(ptrSrc + 6);
                            return;
                        case 8:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            return;
                        case 9:
                            *(long*)(ptrDst + 0) = *(long*)(ptrSrc + 0);
                            *(ptrDst + 8) = *(ptrSrc + 8);
                            return;
                        case 10:
                            *(long*)(ptrDst + 0) = *(long*)(ptrSrc + 0);
                            *(short*)(ptrDst + 8) = *(short*)(ptrSrc + 8);
                            return;
                        case 11:
                            *(long*)(ptrDst + 0) = *(long*)(ptrSrc + 0);
                            *(short*)(ptrDst + 8) = *(short*)(ptrSrc + 8);
                            *(ptrDst + 10) = *(ptrSrc + 10);
                            return;
                        case 12:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(int*)(ptrDst + 8) = *(int*)(ptrSrc + 8);
                            return;
                        case 13:
                            *(long*)(ptrDst + 0) = *(long*)(ptrSrc + 0);
                            *(int*)(ptrDst + 8) = *(int*)(ptrSrc + 8);
                            *(ptrDst + 12) = *(ptrSrc + 12);
                            return;
                        case 14:
                            *(long*)(ptrDst + 0) = *(long*)(ptrSrc + 0);
                            *(int*)(ptrDst + 8) = *(int*)(ptrSrc + 8);
                            *(short*)(ptrDst + 12) = *(short*)(ptrSrc + 12);
                            return;
                        case 15:
                            *(long*)(ptrDst + 0) = *(long*)(ptrSrc + 0);
                            *(int*)(ptrDst + 8) = *(int*)(ptrSrc + 8);
                            *(short*)(ptrDst + 12) = *(short*)(ptrSrc + 12);
                            *(ptrDst + 14) = *(ptrSrc + 14);
                            return;
                        case 16:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            return;
                        case 17:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(ptrDst + 16) = *(ptrSrc + 16);
                            return;
                        case 18:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(short*)(ptrDst + 16) = *(short*)(ptrSrc + 16);
                            return;
                        case 19:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(short*)(ptrDst + 16) = *(short*)(ptrSrc + 16);
                            *(ptrDst + 18) = *(ptrSrc + 18);
                            return;
                        case 20:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(int*)(ptrDst + 16) = *(int*)(ptrSrc + 16);
                            return;

                        case 21:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(int*)(ptrDst + 16) = *(int*)(ptrSrc + 16);
                            *(ptrDst + 20) = *(ptrSrc + 20);
                            return;
                        case 22:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(int*)(ptrDst + 16) = *(int*)(ptrSrc + 16);
                            *(short*)(ptrDst + 20) = *(short*)(ptrSrc + 20);
                            return;
                        case 23:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(int*)(ptrDst + 16) = *(int*)(ptrSrc + 16);
                            *(short*)(ptrDst + 20) = *(short*)(ptrSrc + 20);
                            *(ptrDst + 22) = *(ptrSrc + 22);
                            return;
                        case 24:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(long*)(ptrDst + 16) = *(long*)(ptrSrc + 16);
                            return;
                        case 25:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(long*)(ptrDst + 16) = *(long*)(ptrSrc + 16);
                            *(ptrDst + 24) = *(ptrSrc + 24);
                            return;
                        case 26:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(long*)(ptrDst + 16) = *(long*)(ptrSrc + 16);
                            *(short*)(ptrDst + 24) = *(short*)(ptrSrc + 24);
                            return;
                        case 27:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(long*)(ptrDst + 16) = *(long*)(ptrSrc + 16);
                            *(short*)(ptrDst + 24) = *(short*)(ptrSrc + 24);
                            *(ptrDst + 26) = *(ptrSrc + 26);
                            return;
                        case 28:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(long*)(ptrDst + 16) = *(long*)(ptrSrc + 16);
                            *(int*)(ptrDst + 24) = *(int*)(ptrSrc + 24);
                            return;
                        case 29:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(long*)(ptrDst + 16) = *(long*)(ptrSrc + 16);
                            *(int*)(ptrDst + 24) = *(int*)(ptrSrc + 24);
                            *(ptrDst + 28) = *(ptrSrc + 28);
                            return;
                        case 30:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(long*)(ptrDst + 16) = *(long*)(ptrSrc + 16);
                            *(int*)(ptrDst + 24) = *(int*)(ptrSrc + 24);
                            *(short*)(ptrDst + 28) = *(short*)(ptrSrc + 28);
                            return;
                        case 31:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(long*)(ptrDst + 16) = *(long*)(ptrSrc + 16);
                            *(int*)(ptrDst + 24) = *(int*)(ptrSrc + 24);
                            *(short*)(ptrDst + 28) = *(short*)(ptrSrc + 28);
                            *(ptrDst + 30) = *(ptrSrc + 30);
                            return;
                        case 32:
                            *(long*)ptrDst = *(long*)ptrSrc;
                            *(long*)(ptrDst + 8) = *(long*)(ptrSrc + 8);
                            *(long*)(ptrDst + 16) = *(long*)(ptrSrc + 16);
                            *(long*)(ptrDst + 24) = *(long*)(ptrSrc + 24);
                            return;
                        default:
                            break;
                    }

                    long* lpSrc = (long*)ptrSrc;
                    long* ldSrc = (long*)ptrDst;
                    while (count >= 64)
                    {
                        *(ldSrc + 0) = *(lpSrc + 0);
                        *(ldSrc + 1) = *(lpSrc + 1);
                        *(ldSrc + 2) = *(lpSrc + 2);
                        *(ldSrc + 3) = *(lpSrc + 3);
                        *(ldSrc + 4) = *(lpSrc + 4);
                        *(ldSrc + 5) = *(lpSrc + 5);
                        *(ldSrc + 6) = *(lpSrc + 6);
                        *(ldSrc + 7) = *(lpSrc + 7);
                        if (count == 64)
                            return;
                        count -= 64;
                        lpSrc += 8;
                        ldSrc += 8;
                    }
                    if (count > 32)
                    {
                        *(ldSrc + 0) = *(lpSrc + 0);
                        *(ldSrc + 1) = *(lpSrc + 1);
                        *(ldSrc + 2) = *(lpSrc + 2);
                        *(ldSrc + 3) = *(lpSrc + 3);
                        count -= 32;
                        lpSrc += 4;
                        ldSrc += 4;
                    }

                    ptrSrc = (byte*)lpSrc;
                    ptrDst = (byte*)ldSrc;
                    goto SMALLTABLE;
                }
            }