我正在使用LLVM框架(v3.3),clang前端,X86目标。 我注意到我总是在这里和那里得到一点点NOP,这显然是为了将部分代码对齐到16B(至少是循环,也是其他块)。
例如 - 这里的nopw为0x401495:
401489: 48 89 44 24 10 mov %rax,0x10(%rsp)
40148e: b9 e8 03 00 00 mov $0x3e8,%ecx
401493: eb 0f jmp 4014a4 <main+0x34>
401495: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1)
40149c: 00 00 00 00
4014a0: 48 8b 40 08 mov 0x8(%rax),%rax
4014a4: ff c9 dec %ecx
4014a6: 75 f8 jne 4014a0 <main+0x30>
4014a8: 8b 30 mov (%rax),%esi
我认为这有助于分支预测器或I-cache表现更好,但我现在不需要这种优化,我需要保持代码的某些部分简单明了。< / p>
有没有办法通过编译器标志禁用此代码填充?像gcc&#39; s -fno-align-loops(或类似的对齐标志)
我已经搜索了manual并通过LLVM代码浏览了与填充,对齐,nops等相关的任何内容。没有任何相关内容弹出。 我看到的唯一选择是使用-Os(它确实删除了这个填充)进行编译,但这会极大地改变代码的其余部分 - 我不想为空间进行优化,而是为了便于阅读。
答案 0 :(得分:1)
没有答案的老问题,所以只有几个与LLVM NOP填充相关的指针:
这个LLVM's RFC提到了类似于你的例子:在循环中插入NOP以通过将“2个分支移出相同的16B块(如果它们都转到同一目标”)来提高性能。它已经实施here。
在x86中生成实际的NOP指令,您可以在X86AsmBackend::writeNopData中找到它。该代码自创建以来已多次修改;在某些时候他们有些alternate NOP instructions。
我希望这有点帮助!