小编Ari*_*euz的帖子

为什么ICC以这种方式展开这个循环并使用lea进行算术运算?

看看ICC 17生成的用于迭代std :: unordered_map <>的代码(使用https://godbolt.org)让我非常困惑.

我把这个例子简化为:

long count(void** x)
{
  long i = 0;
  while (*x)
  {
    ++i;
    x = (void**)*x;
  }
  return i;
}
Run Code Online (Sandbox Code Playgroud)

使用-O3标志对ICC 17进行编译会导致以下反汇编:

count(void**):
        xor       eax, eax                                      #6.10
        mov       rcx, QWORD PTR [rdi]                          #7.11
        test      rcx, rcx                                      #7.11
        je        ..B1.6        # Prob 1%                       #7.11
        mov       rdx, rax                                      #7.3
..B1.3:                         # Preds ..B1.4 ..B1.2
        inc       rdx                                           #7.3
        mov       rcx, QWORD PTR [rcx]                          #7.11
        lea       rsi, QWORD PTR [rdx+rdx]                      #9.7
        lea       rax, QWORD PTR [-1+rdx*2]                     #9.7 …
Run Code Online (Sandbox Code Playgroud)

c++ assembly x86-64 icc

9
推荐指数
1
解决办法
323
查看次数

标签 统计

assembly ×1

c++ ×1

icc ×1

x86-64 ×1