memcpy vs memmove

https://flak.tedunangst.com/post/memcpy-vs-memmove

Wvoid *Wmemcpy(Wvoid * __restrict s1, const Wvoid * __restrict s2, size_t n)
{
    register Wchar *r1 = s1;
    register const Wchar *r2 = s2;

    while (n) {
        *r1++ = *r2++;
        --n;
    }

    return s1;
}

Wvoid *Wmemmove(Wvoid *s1, const Wvoid *s2, size_t n)
{
    register Wchar *s = (Wchar *) s1;
    register const Wchar *p = (const Wchar *) s2;

    if (p >= s) {
        while (n) {
            *s++ = *p++;
            --n;
        }
    } else {
        while (n) {
            --n;
            s[n] = p[n];
        }
    }

    return s1;
}