首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >臂组件memset更换

臂组件memset更换
EN

Stack Overflow用户
提问于 2012-02-23 19:40:37
回答 2查看 3.7K关注 0票数 2

我正在为Android编写一个音乐可视化应用程序。我已经到了想做优化的时候了,所以现在我还在做一些实验。下面是我尝试的一个8位memset的ASM和C混合实现。

在某个地方,它正在导致崩溃。我无法将gdb附加到进程中,因为应用程序在gdb启动之前就退出了,所以我无法逐步完成操作。

这样看起来对吗?我从来没有完全被内存对齐所困扰,但我知道ARM是4字节对齐的。我不确定这是不是一个解决方案的提示。我认为,将大部分操作堆叠在汇编循环中,然后在每次传递8字节时完成它的混合方法可以解决任何对齐问题。我这样想对吗?我对哪里出了问题感到困惑。这真的很像memcpy函数,我当时唯一的问题是clobber列表是空的。将这些寄存器添加到clobber列表完成了该函数,我就是找不出这个memset函数遗漏了什么。

代码语言:javascript
运行
复制
* 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;
}
EN

回答 2

Stack Overflow用户

发布于 2012-02-23 21:13:17

具有四个寄存器的stmia写入16个字节,因此执行两次写入32个字节。您将向指向32位值的指针添加16,每次有效地添加64,因此将存在空洞。

此外,ARM没有32位即时数,但许多汇编程序通过在函数后面的特殊区域生成数据字段并将mov转换为PC相关的ldr来解决这一问题。检查生成的汇编程序输出是否可能是在指令流中间生成的字段。

此外,您可以只在汇编程序中生成32位的值:

代码语言:javascript
运行
复制
mov r4, %[mask]
orr r4, r4, r4 lsl #16
orr r4, r4, r4 lsl #8

因为这是一个8位的立即数,所以它适合,并且不需要生成ldr

在此过程中,只需将整个循环放入汇编程序中,以便可以重用地址寄存器。众所周知,gcc在优化包含内联汇编程序的例程方面做得很差。

票数 3
EN

Stack Overflow用户

发布于 2012-02-23 19:57:17

这是打字错误吗:

代码语言:javascript
运行
复制
:: [dst] "r" (d), [flag] "r" (&setflag32) : "r4", "r4", "r6", "r7");

你刚才不是说"r4", "r5", "r6" ...吗?

你的自制memset真的会比原来的memset快吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9412321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档