海湾合作委员会不使用公司

时间:2013-11-10 13:18:36

标签: optimization gcc assembly x86-64 gcc4.8

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速度优化而不是空间优化?

2 个答案:

答案 0 :(得分:12)

使用-march=<your machine>试用。结果可能不同。

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

  

INC和DEC指令仅修改标志寄存器中的一部分位。这个   创建对标志寄存器的所有先前写入的依赖。这是特别的   当这些指令处于关键路径上时会产生问题,因为它们已经习惯了   更改许多其他指令所依赖的负载的地址。   汇编/编译器编码规则33.(M影响,H一般性) INC和DEC   指令应替换为ADD或SUB指令,因为ADD和   SUB覆盖所有标志,而INC和DEC不覆盖,因此创建false   依赖于设置标志的早期指令。

答案 1 :(得分:4)

可能取决于您正在使用(或不使用)的确切优化设置。可以告诉GCC优化时间或空间(尽管优化空间有时可以是优化执行时间的有效方法!)

仅仅因为某项指令可用于专家任务,并不意味着它必然是最有效的指令。

一些旧的x86指令实际上是用微代码实现的,而不是硬件实现的,因为它们很少使用,不值得在硬件中实现。但这可能会让它们变慢。我不知道inc是否是这样的指示。

另外,如果您没有告诉GCC您将运行代码的x86处理器型号,则必须猜测通用的东西。