小编Kha*_*roo的帖子

为什么gcc -O3自动矢量分解?很多额外的指令看起来更糟

这是一个非常简单的阶乘函数。

int factorial(int num) {
    if (num == 0)
        return 1;
    return num*factorial(num-1);
}
Run Code Online (Sandbox Code Playgroud)

GCC在-O2上为此功能进行的组装是合理的。

factorial(int):
        mov     eax, 1
        test    edi, edi
        je      .L1
.L2:
        imul    eax, edi
        sub     edi, 1
        jne     .L2
.L1:
        ret
Run Code Online (Sandbox Code Playgroud)

但是,在-O3或-Ofast上,它决定使事情变得更复杂(几乎100行!):

factorial(int):
        test    edi, edi
        je      .L28
        lea     edx, [rdi-1]
        mov     ecx, edi
        cmp     edx, 6
        jbe     .L8
        mov     DWORD PTR [rsp-12], edi
        movd    xmm5, DWORD PTR [rsp-12]
        mov     edx, edi
        xor     eax, eax
        movdqa  xmm0, XMMWORD PTR .LC0[rip]
        movdqa  xmm4, XMMWORD PTR .LC2[rip]
        shr …
Run Code Online (Sandbox Code Playgroud)

x86 gcc x86-64 compiler-optimization auto-vectorization

2
推荐指数
1
解决办法
185
查看次数