海湾合作委员会编译器
$ 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
为什么要这样做?
EDIT: 我用了gcc -O2
来编译这个。gcc -Os
确实生成了inc
操作说明。没有使用inc
更多的是速度优化而不是空间优化?
尝试一下-march=<your machine>
。结果可能会有所不同。
但请注意add $1, %reg
不一定是一个糟糕的选择。虽然inc
and dec
具有更小的编码,这很有吸引力,但它们只部分更新标志,导致错误的依赖问题。英特尔优化手册包含以下评论(我的重点):
INC 和DEC 指令仅修改标志寄存器中的部分位。这
创建对标志寄存器的所有先前写入的依赖。这尤其是
当这些指令位于关键路径上时会出现问题,因为它们用于
更改许多其他指令所依赖的负载的地址。
汇编/编译器编码规则 33。(M 影响,H 通用性)增量和减量
指令应替换为 ADD 或 SUB 指令,因为添加和
SUB 覆盖所有标志,而 INC 和 DEC 不会,因此创建 false
依赖于设置标志的早期指令。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)