摘:memcpy的实现

摘:memcpy的实现

https://baike.baidu.com/item/memcpy/659918?fr=aladdin

void *memcpy(void *to, const void *from, size_t n)
{
    void *xto = to;
    size_t temp, temp1;

    if (!n)
        return xto;
    if ((long)to & 1) {
        char *cto = to;
        const char *cfrom = from;
        *cto++ = *cfrom++;
        to = cto;
        from = cfrom;
        n--;
    }
    if (n > 2 && (long)to & 2) {
        short *sto = to;
        const short *sfrom = from;
        *sto++ = *sfrom++;
        to = sto;
        from = sfrom;
        n -= 2;
    }
    temp = n >> 2;
    if (temp) {
        long *lto = to;
        const long *lfrom = from;
#if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE)
        for (; temp; temp--)
            *lto++ = *lfrom++;
#else
        asm volatile (
            "    movel %2,%3
"
            "    andw  #7,%3
"
            "    lsrl  #3,%2
"
            "    negw  %3
"
            "    jmp   %%pc@(1f,%3:w:2)
"
            "4:    movel %0@+,%1@+
"
            "    movel %0@+,%1@+
"
            "    movel %0@+,%1@+
"
            "    movel %0@+,%1@+
"
            "    movel %0@+,%1@+
"
            "    movel %0@+,%1@+
"
            "    movel %0@+,%1@+
"
            "    movel %0@+,%1@+
"
            "1:    dbra  %2,4b
"
            "    clrw  %2
"
            "    subql #1,%2
"
            "    jpl   4b"
            : "=a" (lfrom), "=a" (lto), "=d" (temp), "=&d" (temp1)
            : "0" (lfrom), "1" (lto), "2" (temp));
#endif
        to = lto;
        from = lfrom;
    }
    if (n & 2) {
        short *sto = to;
        const short *sfrom = from;
        *sto++ = *sfrom++;
        to = sto;
        from = sfrom;
    }
    if (n & 1) {
        char *cto = to;
        const char *cfrom = from;
        *cto = *cfrom;
    }
    return xto;
}

2018-11-08

  汇编部分没有看懂。

原文地址:https://www.cnblogs.com/igfirstblog/p/9929978.html