为什么ICC在x86上的汇编中产生“inc”而不是“add”?

在摆弄简单的C代码的同时,我发现了一些奇怪的东西。 为什么ICC在为增量生成的汇编代码中生成incl %eax而不是addl $1, %eax ? GCC的行为与预期的一样,使用add

示例代码(GCC和ICC上使用的-O3

 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 

例如,请看这里 。

因此,我想知道 – 这是一个预期的function,一个错误或某些特定设置产生的怪癖? 如果由于标志更新或效率(这是基于以下链接的结论), add (假设)更好 – 为什么ICC使用inc

有关:

x86 inc与add指令的相对性能

ADD 1真的比INC快吗? 86

海湾合作委员会没有使用公司

注意:

我明确地问了这个问题,因为我发现或者没有针对SO的问题确实解释了这种行为。 我之前关于这个问题的问题已经结束了,因为据说,它是微不足道的并且得到了回答 。 我觉得这很简单。 我没有在所有链接和答案中找到答案。 这不是另一个“如何将我的鼠标插入我的电脑”的问题。 所有问题都解释了为什么在新的x86处理器上add /可能更好或为什么GCC使用它,但没有一个与ICC有关。

对ICC设计选择的任何见解也将非常受欢迎。

PS我不认为“它做到了,因为它确实”是一个有效的答案。

在这一点上假设选择incl是不合理的,因为它只需要一个字节(0x40)而不是三个(0x83 0xc0 0x01)。