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

为什么在64位Windows下LLVM JIT生成的入口点如此冗长?,windows,llvm,Windows,Llvm,我正在Windows下玩LLVM,只是想通过构建一些示例程序来更好地理解它。目前,我正在研究HowToUseJIT。我注意到,当我运行64位时,我得到了一个入口点,其中似乎有一些非常疯狂的代码。在堆栈上保存rsi、rdi和xmm6-xmm15;然后设置rax和rcx;然后,在最终调用调用链中的下一个函数之前,恢复以前保存的所有值 有什么好的理由吗?或者这是否意味着Windowsx64上的LLVM还没有准备好进入黄金时段 编辑:这是LLVM 2.8的版本。我刚刚下载了2.9分支上当前的内容,但它没

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

有什么好的理由吗?或者这是否意味着Windowsx64上的LLVM还没有准备好进入黄金时段


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

这取决于具体情况。当调用方保存时,所有寄存器保存都是由于Win64 ABI,因此应正确保存/还原

之所以没有消除noop加载/存储,可能是因为JIT默认使用快速指令选择器。它会让你的二进制代码非常快,但牺牲了质量

尝试切换到正常codegen以检查问题是否仍然存在