为什么在64位Windows下LLVM JIT生成的入口点如此冗长?

时间:2011-03-15 03:57:10

标签: windows llvm

我在Windows下玩LLVM,只是想通过构建一些示例程序来更好地理解它。目前,我在看HowToUseJIT。我注意到,当我运行64位时,我得到一个入口点似乎是一些非常疯狂的代码。它将rsi,rdi和xmm6-xmm15保存在堆栈中;然后设置rax和rcx;然后在最终调用调用链中的下一个函数之前恢复所有先前保存的值。

这有充分的理由吗?或者它是否表明Windows x64上的LLVM还没有为黄金时段做好准备?

编辑:这是LLVM 2.8。我刚刚下载了当前2.9分支上的内容,但它没有显示相同的行为。

1 个答案:

答案 0 :(得分:2)

这取决于。所有寄存器保存都是由Win64 ABI引起的,当它们被被保存时,因此应该正确保存/恢复。

没有消除noop加载/存储的原因可能是由于JIT默认使用了快速指令选择器。它会非常快速地为您提供二进制代码但却牺牲了质量。

尝试切换到普通的codegen以检查问题是否仍然存在。