7

YMMレジスタが呼び出し元と呼び出し先によってどのように処理されるかを定義するドキュメントが見つかりませんでした。

私の質問に焦点を合わせるために、これが私が知りたいことです:

  1. 呼び出し元に戻る前に、呼び出し先が復元する必要があるYMMレジスタはどれですか。
  2. LinuxとWindowsではXMMレジスタに違いがあるので、YMMレジスタも同じルールに従わないと思います。各OSのルールは何ですか?

編集:以下の回答のおかげで、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 に答える