gpt4 book ai didi

c - C 编译器输出中的冗余移动

转载 作者:行者123 更新时间:2023-11-30 15:11:04 27 4
gpt4 key购买 nike

以下练习来自CSAPP 3.21:

int loop_while(int a, int b)
{
int result = 1;
while (a < b)
{
result *= (a+b);
a++;
}
return result;
}

gcc 生成以下汇编代码:

  ;a at %ebp+8, b at %ebp+12
movl 8(%ebp), %ecx
movl 12(%ebp), %ebx
movl $1, %eax ; this one
cmpl %ebx, %ecx
jge .L11
leal (%ebx,%ecx), %edx
movl $1, %eax ; and this one
.L12:
imull %edx, %eax
addl $1, %ecx
addl $1, %edx
cmpl %ecx, %ebx
jg .L12
.L11: ......

我对 movl $1, %eax 感到困惑第 3 行和第 7 行:%eax第4、5、6行没有被修改

cmpl %ebx, %ecx
jge .L11
leal (%ebx,%ecx), %edx

无需执行 movl再次。

我尝试在 x86_64-apple-darwin15.3.0 上生成汇编代码与 gcc 4.2.1

    movl    $1, %eax
cmpl %esi, %edi
jge LBB0_2
.align 4, 0x90
LBB0_1:

leal (%rsi,%rdi), %ecx
imull %ecx, %eax
incl %edi
cmpl %edi, %esi
jne LBB0_1
LBB0_2:
popq %rbp
retq
.cfi_endproc

无法找到与重复的 movl 等效的指令.

写第二个movl $1, %eax有什么意义? ?

最佳答案

自 OS X 10.8 起,Apple 一直将 gcc 符号链接(symbolic link)到 clang,因此第一个代码实际上是由 clang 生成的。

我的 Clang 3.7.1 也有 generates相同的代码,即使使用 -O2-O3 也是如此。正如您正确注意到的那样,第二个 movl 毫无意义。

您可能想要inform LLVM/Clang 团队对此的了解,如果您可以使用 trunk 中当前的版本重现它。 .

关于c - C 编译器输出中的冗余移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35828733/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com