cpu-registers - 在调用约定中使用非 volatile 寄存器有什么好处?

标签 cpu-registers calling-convention

我正在编写一个 JIT 编译器,我惊讶地发现在 Win64 调用约定中,如此多的 x86-64 寄存器是非 volatile 的(被调用者保留的)。在我看来,非 volatile 寄存器只是在所有可以使用这些寄存器的函数中做更多的工作。在数值计算的情况下尤其如此,您希望在叶函数中使用许多寄存器,例如某种高度优化的矩阵乘法。但是,例如,16 个 SSE 寄存器中只有 6 个是 volatile 的,因此如果您需要使用更多,您将有很多溢出要做。

所以是的,我不明白。这里有什么权衡?

最佳答案

如果寄存器是调用者保存的,那么调用者总是必须围绕函数调用保存或重新加载这些寄存器。但是如果寄存器是被调用者保存的,那么被调用者只需要保存它使用的寄存器,并且只有当它知道它们将被使用时(即在早期退出场景中可能根本不会)。这个约定的缺点是被调用者不知道调用者,所以它可能会保存无论如何都死了的寄存器,但我想这被视为一个较小的问题。

关于cpu-registers - 在调用约定中使用非 volatile 寄存器有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10392895/

相关文章:

c - x86 调用约定 : should arguments passed by stack be read-only?

c# - 64 位 .NET 应用程序中是否忽略了 CallingConvention?

c# - 非托管函数 Hook ,调用约定的堆栈/注册问题?

c# - 将 C 编写的 DLL 调用到 C# 时,vshost32-clr2.exe 出错

x86 - i386 中的哪个寄存器存储 CPL?

assembly - eax 如何存储大于 4 个字节的返回值?

windows - 为什么 Windows x64 调用约定不使用 XMM 寄存器来传递超过 4 个整数参数?

c - MSP430 - 在结构中混合端口寄存器

c - 在堆栈上查找函数的根

在保存和检索机制之间拥抱命令的代码