我正在为Android编写一个音乐可视化应用程序。我已经到了想做优化的时候了,所以现在我还在做一些实验。下面是我尝试的一个8位memset的ASM和C混合实现。
在某个地方,它正在导致崩溃。我无法将gdb附加到进程中,因为应用程序在gdb启动之前就退出了,所以我无法逐步完成操作。
这样看起来对吗?我从来没有完全被内存对齐所困扰,但我知道ARM是4字节对齐的。我不确定这是不是一个解决方案的提示。我认为,将大部分操作堆叠在汇编循环中,然后在每次传递8字节时完成它的混合方法可以解决任何对齐问题。我这样想对吗?我对哪里出了问题感到困惑。这真的很像memcpy函数,我当时唯一的问题是clobber列表是空的。将这些寄存器添加到clobber列表完成了该函数,我就是找不出这个memset函数遗漏了什么。
* Memset functions, 1 byte memset */
static void *mem_set8_arm (void *dest, int c, visual_size_t n)
{
    uint32_t *d = dest;
    uint8_t *dc = dest;
    uint32_t setflag32 =
        (c & 0xff) |
        ((c << 8) & 0xff00) |
        ((c << 16) & 0xff0000) |
        ((c << 24) & 0xff000000);
    uint8_t setflag8 = c & 0xff;
#if defined(VISUAL_ARCH_ARM)
    while (n >= 64) {
        __asm __volatile
        (
            "\n\t mov r4, %[flag]"
            "\n\t mov r5, r4"
            "\n\t mov r6, r4"
            "\n\t mov r7, r4"
            "\n\t stmia %[dst]!,{r4-r7}"
            "\n\t stmia %[dst]!,{r4-r7}"
        :: [dst] "r" (d), [flag] "r" (&setflag32) : "r4", "r4", "r6", "r7");
        d += 16;
        n -= 64;
    }
#endif /* VISUAL_ARCH_ARM */
    while (n >= 4) {
        *d++ = setflag32;
        n -= 4;
    }
    dc = (uint8_t *) d;
    while (n--)
        *dc++ = setflag8;
    return dest;
}发布于 2012-02-23 19:57:17
这是打字错误吗:
:: [dst] "r" (d), [flag] "r" (&setflag32) : "r4", "r4", "r6", "r7");你刚才不是说"r4", "r5", "r6" ...吗?
你的自制memset真的会比原来的memset快吗?
https://stackoverflow.com/questions/9412321
复制相似问题