7

我找不到任何定义调用者和被调用者如何处理 YMM 寄存器的文档。

为了集中我的问题,这是我想知道的:

  1. 在返回给调用者之前,被调用者必须恢复哪些 YMM 寄存器?
  2. 由于 Linux 和 Windows 中的 XMM 寄存器存在差异,我假设 YMM 寄存器也不遵循相同的规则。每个操作系统的规则是什么?

编辑:感谢下面的答案,我能够在提到的 Win64 文档中找到答案。我很确定 Linux 遵循类似的规则:

"...
The YMM registers do not have callee-save status, except for the lower half
of YMM6-YMM15 in 64-bit Windows, where XMM6-XMM15 have callee-save status.
Possible future extensions of the vector registers to 512 bits or more will not have calleesave
status.
..."
4

1 回答 1

4

您的两个问题的答案(假设您正在谈论 C++ 中的调用约定)在Agner Fog的出色优化指南中:

不同 C++ 编译器和操作系统的调用约定

请参阅第 10 页的第 6 节(寄存器用法)。第 22 页的第 7.2 节(传递和返回 SIMD 类型)也可能是相关的。

于 2012-01-13T08:31:37.543 回答