Pergunta

No projeto de compilador, porque em vez de ter um chamador ou callee registar arranjo de poupança, não poderia o chamador passar sua lista de registros usados ??(que iria empurrar em caso de um arranjo de poupança chamador) para o chamado para que o receptor pode comparar a sua lista de registros usados ??para os registros utilizados pelo chamador. Em seguida, apenas os registros que realmente precisam de ser empurrado, seria empurrado. Estou faltando alguma coisa?

Foi útil?

Solução

É uma ideia interessante. Eu acho que há duas coisas que o tornam menos atraentes:

  • O receptor tem de espaço de pilha de reserva para o pior caso, independentemente.
  • Para tornar mais eficiente, seria necessário instruções especiais para o armazenamento e conjuntos de carga de registros de uma só vez. Tais instruções foram no Motorola 68000 (e talvez também PowerPC), mas eles não têm sido muito populares.

Aqui está um pouco de elaboração de como ele teria que trabalhar: Você gostaria que o chamador para embalar a lista em uma palavra máquina como um vetor de bits. Você, então, precisa o receptor para bitwise, e com a sua própria lista, a ter uma instrução que salva todos os registros nomeados pelo vetor de bits resultante.

Porque você vai ter que reservar espaço na pilha para o pior caso, você não economizar muito --- em um moderno, superscalar, out-of-order processador, escreve na mesma linha de cache são quase livre.

Também é verdade que, se o que você realmente quer é minimizar o número de cargas e lojas em tempo de execução, é só ir com toda chamador-salva registros. Esta estratégia também faz com que seja realmente barato para levantar uma exceção e preventivamente tópicos do interruptor, e abundância de compiladores (como OCaml ) usá-lo por esse motivo. Callee-salva registros são uma espécie de um truque para tentar reduzir o tamanho do código para as instruções de derramamento e de recarga. Eles trabalham em muitas situações, e eles economizam espaço, porque sites de chamada superam em muito as definições de procedimento (em média, um procedimento contém várias chamadas).

Para mais informações sobre compensações entre chamador-salva e callee-salva registros, há um papel agradável por Jack Davidson e David Whalley .

Outras dicas

isso é muito ineficiente ... você terá de analisar a lista (para cada função!) Que é totalmente desnecessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top