Domanda

Non sono riuscito a trovare alcun documento che definisce il modo in cui i registri YMM sono gestiti dal chiamante e dal Callee.

Per focalizzare la mia domanda, ecco cosa vorrei sapere:

  1. Quali registri YMM devono essere ripristinati dal Callee prima di tornare al chiamante?
  2. Poiché ci sono differenze per i registri XMM in Linux e Windows, suppongo che anche i registri YMM non seguano le stesse regole. Quali sono le regole per ciascuno dei sistemi operativi?

EDIT: grazie alla risposta qui sotto sono stato in grado di eliminare la risposta nel documento menzionato per Win64. Sono abbastanza sicuro che Linux segua regole simili:

"...
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.
..."
È stato utile?

Soluzione

La risposta a entrambe le tue domande (supponendo che tu stia parlando di chiamare la convenzione in C ++) è nel grande Guida all'ottimizzazione Di Agner Fog:

Chiamare le convenzioni per diversi compilatori C ++ e sistemi operativi.

Vedere la sezione 6 (utilizzo del registro) a pagina 10. Anche la sezione 7.2 (i tipi SIMD di passaggio e di ritorno) a pagina 22 potrebbe essere pertinente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top