internal static unsafe void MemCopy()

in Source/Tx.Windows/EtwNative/TypeUtil.cs [58:105]


        internal static unsafe void MemCopy(byte* srcPtr, byte* destPtr, int bytesToCopy)
        {
            // AMD64 implementation uses longs instead of ints where possible
            if (bytesToCopy >= 16)
            {
                do
                {
                    ((int*) destPtr)[0] = ((int*) srcPtr)[0];
                    ((int*) destPtr)[1] = ((int*) srcPtr)[1];
                    ((int*) destPtr)[2] = ((int*) srcPtr)[2];
                    ((int*) destPtr)[3] = ((int*) srcPtr)[3];

                    destPtr += 16;
                    srcPtr += 16;
                } while ((bytesToCopy -= 16) >= 16);
            }

            if (bytesToCopy > 0) // protection against negative len and optimization for len==16*N
            {
                if ((bytesToCopy & 8) != 0)
                {
                    ((int*) destPtr)[0] = ((int*) srcPtr)[0];
                    ((int*) destPtr)[1] = ((int*) srcPtr)[1];

                    destPtr += 8;
                    srcPtr += 8;
                }

                if ((bytesToCopy & 4) != 0)
                {
                    ((int*) destPtr)[0] = ((int*) srcPtr)[0];
                    destPtr += 4;
                    srcPtr += 4;
                }

                if ((bytesToCopy & 2) != 0)
                {
                    ((short*) destPtr)[0] = ((short*) srcPtr)[0];
                    destPtr += 2;
                    srcPtr += 2;
                }

                if ((bytesToCopy & 1) != 0)
                {
                    *destPtr = *srcPtr;
                }
            }
        }