Question

Dans la conception du compilateur, pourquoi, au lieu d’avoir un arrangement de sauvegarde de registre d’appelant ou d’appelant, l’appelant ne pourrait-il pas transmettre sa liste de registres utilisés peut comparer sa liste de registres utilisés à ceux de l'appelant. Alors seuls les registres qui doivent vraiment être poussés le seraient. Est-ce que je manque quelque chose?

Était-ce utile?

La solution

C'est une idée intéressante. Je pense que deux choses la rendent moins attrayante:

  • L'appelant doit réserver de l'espace de pile pour le pire des cas, peu importe.
  • Pour que cela soit efficace, vous auriez besoin d'instructions spéciales pour le stockage et le chargement de jeux de registres en une fois. Ces instructions figuraient sur le Motorola 68000 (et peut-être aussi sur le PowerPC), mais elles n’ont pas été très populaires.

Voici une petite explication de la manière dont cela devrait fonctionner: Vous voudriez que l'appelant compresse la liste dans un mot machine en tant que vecteur de bits. Vous auriez alors besoin de l'appelé bitwise et, avec sa propre liste, une instruction qui enregistre tous les registres nommés par le vecteur de bits résultant.

Parce que vous allez devoir réserver de l’espace sur la pile pour le pire des cas, vous ne économisez pas beaucoup - sur un processeur moderne, superscalar et hors d’ordre, les écritures dans la même ligne de cache sont presque gratuit.

Il est également vrai que si vous voulez vraiment minimiser le nombre de charges et de magasins au moment de l'exécution, vous devez simplement utiliser tous les registres de sauvegarde des appelants. Cette stratégie rend également très peu coûteuse de lever une exception et de changer de threads de manière préventive, ainsi que de nombreux compilateurs (comme OCaml ) l'utiliser pour cette raison. Les registres de sauvegardes de locataires sont une sorte de bidouille pour tenter de réduire la taille du code pour les instructions de débordement et de rechargement. Ils fonctionnent dans de nombreuses situations et permettent de gagner de la place car les sites d’appel dépassent de loin le nombre de définitions de procédures (en moyenne, une procédure contient plusieurs appels).

Pour plus d'informations sur les compromis entre les registres de sauvegarde des appels et des registres d'appels, reportez-vous au beau document de Jack Davidson et David Whalley .

Autres conseils

c'est très inefficace ... vous devrez analyser la liste (pour chaque fonction!), ce qui est totalement inutile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top