Domanda

Nella progettazione del compilatore, perché invece di disporre di un arrangiamento di salvataggio del registro chiamante o del chiamante, il chiamante non è riuscito a passare l'elenco dei registri utilizzati (che spingerebbe in caso di un accordo di salvataggio del chiamante) al chiamante in modo che il chiamante può confrontare la sua lista di registri usati con i registri usati dal chiamante. Quindi verrebbero spinti solo i registri che necessitano davvero di essere spinti. Mi sto perdendo qualcosa?

È stato utile?

Soluzione

È un'idea interessante. Penso che ci siano due cose che lo rendono poco attraente:

  • La chiamata deve riservare spazio di stack per il caso peggiore, indipendentemente.
  • Per renderlo efficiente, occorrono istruzioni speciali per la memorizzazione e il caricamento di set di registri in una sola volta. Tali istruzioni erano sul Motorola 68000 (e forse anche PowerPC), ma non sono state popolari.

Ecco una piccola elaborazione di come dovrebbe funzionare: Vorresti che il chiamante comprimesse l'elenco in una parola macchina come un vettore bit. Avresti quindi bisogno del chiamato per bit a bit - e con il suo elenco, hanno un'istruzione che salva tutti i registri nominati dal vettore bit risultante.

Poiché dovrai riservare spazio nello stack per il caso peggiore, non risparmi molto --- su un moderno processore superscalare e fuori servizio, le scritture nella stessa riga della cache sono quasi gratuito.

È anche vero che se quello che vuoi davvero è minimizzare il numero di carichi e archivi in ??fase di esecuzione, vai semplicemente con tutti i registri di salvataggio dei chiamanti. Questa strategia rende anche molto economico sollevare un'eccezione e cambiare preventivamente thread e molti compilatori (come OCaml ) usalo per quel motivo. I registri di salvataggio delle chiamate sono una specie di hack per cercare di ridurre le dimensioni del codice per le istruzioni di versamento e ricarica. Funzionano in molte situazioni e risparmiano spazio perché i siti di chiamata superano di molto le definizioni delle procedure (in media, una procedura contiene più chiamate).

Per ulteriori informazioni sui compromessi tra i registri dei salvataggi e dei salvataggi, c'è un bel documento di Jack Davidson e David Whalley .

Altri suggerimenti

è molto inefficiente ... dovrai analizzare l'elenco (per ogni funzione!) che è totalmente inutile.

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