Enr*_*lis 8 c++ assembly x86-64 clang bitcount
观看时Matt Godbolt 的演讲时时,我惊讶地发现,如果指示 Clang 针对 Haswell\xc2\xb9 架构进行编译,则会得出以下代码
\nint foo(int a) {\n int count = 0;\n while (a) {\n ++count;\n a &= a - 1;\n }\n return count;\n}\nRun Code Online (Sandbox Code Playgroud)\n用于计算设置位int(我不知道我自己需要多长时间才能计算出来),所以它只使用该指令:
foo(int): # @foo(int)\n popcntl %edi, %eax\n retq\nRun Code Online (Sandbox Code Playgroud)\n我想自己尝试一下,但我发现生成的代码是
\nfoo(int): # @foo(int)\n popcntl %edi, %eax\n cmovel %edi, %eax\n retq\nRun Code Online (Sandbox Code Playgroud)\n事实证明,生成的代码在 Clang 10.0.1 和 Clang 11.0.0 之间发生了变化。
\n为什么较新的 Clang 又发出了一条以前不需要的指令?代码是如此简单,以至于我无法理解多一条指令除了使代码变慢之外还能做什么(即使速度可能非常小,我不知道)。
\n\xc2\xb9 作为一个附带问题,事实上不指定-march=haswell会导致更长、更人性化的代码这一事实是否仅仅意味着该选项所针对的物理 CPU 具有用于执行设置位计数和其他操作的电路(好吧,不管 clang 默认是什么)不?
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |