Frage

Ich konnte kein Dokument finden, das definierte, wie YMM -Register vom Anrufer und vom Callee behandelt werden.

Um meine Frage zu konzentrieren, möchte ich hier wissen:

  1. Welche YMM -Register müssen von den Callee wiederhergestellt werden, bevor sie zum Anrufer zurückkehren?
  2. Da es Unterschiede für XMM -Register in Linux und Windows gibt, gehe ich davon aus, dass auch YMM -Register nicht die gleichen Regeln befolgen. Was sind die Regeln für jeden der Osen?

EDIT: Dank der Antwort unten konnte ich die Antwort im erwähnten Doc für Win64 skaven. Ich bin mir ziemlich sicher, dass Linux ähnliche Regeln befolgt:

"...
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.
..."
War es hilfreich?

Lösung

Die Antwort auf Ihre beiden Fragen (vorausgesetzt, Sie sprechen über die Aufruf von Konvents in C ++) ist im Großen Optimierungshandbuch von Agner Fog:

Rufen Sie Konventionen für verschiedene C ++ - Compiler und Betriebssysteme an.

Siehe Abschnitt 6 (Registrierungsnutzung) auf Seite 10. Auch Abschnitt 7.2 (Übergabe und Rückgabe von SIMD -Typen) auf Seite 22 kann relevant sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top