gpt4 book ai didi

optimization - GCC 不使用 inc

转载 作者:行者123 更新时间:2023-12-03 15:45:23 25 4
gpt4 key购买 nike

GCC 编译器

$ gcc --version
gcc (GCC) 4.8.2
...

不会生成 inc汇编指令,它实际上可能很有用,就像在这个 C 程序中一样:
int main(int argc, char **argv)
{
int sum = 0;
int i;
for(i = 0; i < 1000000000L; i++) <---- that "i++"
sum += i;
return sum;
}

相反,它生成一个 add操作说明:
0000000000000000 <main>:
0: 31 d2 xor %edx,%edx
2: 31 c0 xor %eax,%eax
4: 0f 1f 40 00 nopl 0x0(%rax)
8: 01 d0 add %edx,%eax
a: 83 c2 01 add $0x1,%edx <---- HERE
d: 81 fa 00 ca 9a 3b cmp $0x3b9aca00,%edx
13: 75 f3 jne 8 <main+0x8>
15: f3 c3 repz retq

它为什么这样做?

编辑 : 我用过 gcc -O2编译这个。 gcc -Os确实会生成 inc操作说明。不使用 inc与其说是空间优化,不如说是速度优化?

最佳答案

-march=<your machine> 试试.结果可能会有所不同。

但是,请注意 add $1, %reg不一定是一个糟糕的选择。虽然 incdec具有较小的编码,这很有吸引力,但它们仅部分更新标志,导致错误的依赖问题。英特尔优化手册包含此评论(我的重点):

The INC and DEC instructions modify only a subset of the bits in the flag register. This creates a dependence on all previous writes of the flag register. This is especially problematic when these instructions are on the critical path because they are used to change an address for a load on which many other instructions depend. Assembly/Compiler Coding Rule 33. (M impact, H generality) INC and DEC instructions should be replaced with ADD or SUB instructions, because ADD and SUB overwrite all flags, whereas INC and DEC do not, therefore creating false dependencies on earlier instructions that set the flags.

关于optimization - GCC 不使用 inc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19890157/

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