我在Windows下玩LLVM,只是想通过构建一些示例程序来更好地理解它。目前,我在看HowToUseJIT。我注意到,当我运行64位时,我得到一个入口点似乎是一些非常疯狂的代码。它将rsi,rdi和xmm6-xmm15保存在堆栈中;然后设置rax和rcx;然后在最终调用调用链中的下一个函数之前恢复所有先前保存的值。
这有充分的理由吗?或者它是否表明Windows x64上的LLVM还没有为黄金时段做好准备?
编辑:这是LLVM 2.8。我刚刚下载了当前2.9分支上的内容,但它没有显示相同的行为。
答案 0 :(得分:2)
这取决于。所有寄存器保存都是由Win64 ABI引起的,当它们被被保存时,因此应该正确保存/恢复。
没有消除noop加载/存储的原因可能是由于JIT默认使用了快速指令选择器。它会非常快速地为您提供二进制代码但却牺牲了质量。
尝试切换到普通的codegen以检查问题是否仍然存在。