在摆弄简单的 C 代码时,我注意到一些奇怪的事情。 ICC为何产生incl %eax
在为增量生成的汇编代码中而不是addl $1, %eax
?不过,GCC 的行为符合预期,使用add
.
示例代码(-O3
用于 GCC 和 ICC)
int A, B, C, D, E;
void foo()
{
A = B + 1;
B = 0;
C++;
D++;
D++;
E += 2;
}
ICC 结果
L__routine_start_foo_0:
foo:
movl B(%rip), %eax #5.13
movl D(%rip), %edx #8.9
incl %eax #5.17
movl E(%rip), %ecx #10.9
addl $2, %edx #9.9
addl $2, %ecx #10.9
movl %eax, A(%rip) #5.9
movl $0, B(%rip) #6.9
incl C(%rip) #7.9
movl %edx, D(%rip) #9.9
movl %ecx, E(%rip) #10.9
ret
例如,参见here http://goo.gl/WThWRw.
因此,我想知道 - 这是一个预期的功能、一个错误还是某些特定设置导致的一些怪癖?如果add
(据说)由于标志更新或效率更好(这是基于下面链接的结论) - 为什么 ICC 使用inc
?
Related:
x86 inc 与 add 指令的相对性能 https://stackoverflow.com/questions/5993326/relative-performance-of-x86-inc-vs-add-instruction
ADD 1 真的比 INC 快吗? x86 https://stackoverflow.com/questions/13383407/is-add-1-really-faster-than-inc-x86
GCC 不使用 inc https://stackoverflow.com/questions/19890157/gcc-doesnt-make-use-of-inc
Note:
我明确地问这个问题是因为我发现的或针对的问题都没有解释这种行为。我之前关于此事的问题已经结束,因为据推测,它是trivial and 已得到答复。我不认为这微不足道。我没有在给出的所有链接和答案中找到答案。这不是另一个“如何将鼠标插入电脑”的问题。所有的问题都解释了原因add
在新的 x86 处理器上是否/可能会更好或者为什么 GCC 使用它,但没有涉及 ICC。
任何有关 ICC 设计选择的见解也将受到欢迎。
PS 我不认为“它这样做是因为它确实如此”是一个有效的答案。