我正在编写一个 JIT 编译器,我惊讶地发现在 Win64 调用约定中,如此多的 x86-64 寄存器是非 volatile 的(被调用者保留的)。在我看来,非 volatile 寄存器只是在所有可以使用这些寄存器的函数中做更多的工作。在数值计算的情况下尤其如此,您希望在叶函数中使用许多寄存器,例如某种高度优化的矩阵乘法。但是,例如,16 个 SSE 寄存器中只有 6 个是 volatile 的,因此如果您需要使用更多,您将有很多溢出要做。
所以是的,我不明白。这里有什么权衡?
最佳答案
如果寄存器是调用者保存的,那么调用者总是必须围绕函数调用保存或重新加载这些寄存器。但是如果寄存器是被调用者保存的,那么被调用者只需要保存它使用的寄存器,并且只有当它知道它们将被使用时(即在早期退出场景中可能根本不会)。这个约定的缺点是被调用者不知道调用者,所以它可能会保存无论如何都死了的寄存器,但我想这被视为一个较小的问题。
关于cpu-registers - 在调用约定中使用非 volatile 寄存器有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10392895/