在gcc中,是否可以避免在堆栈初始化中从其他部分复制?

比如说

void f()
{
   wchar_t s[]=L"aaaaaaaaa";
}

被编译成类似

.section .rdata
LC0:.ascii "a\0a\0a\0a\0a\0a\0\0"
.section .text
movl LC0,%eax
movl %eax,0x888(%esp)
...

能否避免对另一节的依赖?如

movl $0x00610061,0x888(%esp);movl $0x00610061,0x88c(%esp);...

解决方案:

你忘了启用优化,所以坏的代码是可以预期的。 为什么clang用-O0产生低效的asm(对于这个简单的浮点和)?

gcc -O3 -m32 在这个问题上,clang确实使用了mov-immediate。

(使用 volatile 所以数组不会优化掉,当然。 或者把它的指针传给一个非内联函数)。)

# gcc9.3 -m32 -O3
f():
        sub     esp, 48
        mov     DWORD PTR [esp+8], 97
        mov     DWORD PTR [esp+12], 97
        mov     DWORD PTR [esp+16], 97
        mov     DWORD PTR [esp+20], 97
        mov     DWORD PTR [esp+24], 97
        mov     DWORD PTR [esp+28], 97
        mov     DWORD PTR [esp+32], 97
        mov     DWORD PTR [esp+36], 97
        mov     DWORD PTR [esp+40], 97
        mov     DWORD PTR [esp+44], 0
        add     esp, 48
        ret

64位代码以16字节为单位拷贝。 遗憾的是没有使用广播加载,即使有SSE3或AVX)。https:/godbolt.orgzAsdbWU

这很明显是值得的,虽然 movabs 与64位的立即和4个qword存储+1个dword本来就不可怕。

# gcc9.3 -O3 -march=skylake
# with the default tuning / arch options, same code but without "v"
f():
        vmovdqa xmm0, XMMWORD PTR .LC0[rip]      # should have used vpbroadcastd
        vmovaps XMMWORD PTR [rsp-56], xmm0         # it chooses two 16-byte stores
        vmovaps XMMWORD PTR [rsp-40], xmm0         # maybe to avoid a vzeroupper or alignment isn't known
        mov     QWORD PTR [rsp-24], 97           # scalar mov-immediate for the last one
        ret
.LC0:
        .quad   416611827809
        .quad   416611827809

给TA打赏
共{{data.count}}人
人已打赏
未分类

在Reactjs中使用fetch处理ajax请求时出错。

2022-9-8 14:29:46

未分类

如何在Jenkins作业中加入并行条件?

2022-9-8 14:40:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索