Aula 26: Geração de Código de Máquina
Objetivos
- Traduzir IR para Assembly.
- Seleção de Instruções Básica.
Motivação
Aqui o compilador finalmente "toca" a arquitetura real. Decisões de geração de código impactam:
- Latência de operações críticas (uso de instruções especializadas vs sequências genéricas).
- Consumo de registradores e pressão sobre o alocador.
- Uso de recursos específicos da plataforma (co-processadores, instruções vetoriais, etc.).
Conteúdo
O gerador de código traduz a IR (ou IR otimizada) para assembly ou código de máquina. Três responsabilidades principais:
flowchart LR
IR[IR] --> Sel[Seleção de instruções]
Sel --> Aloc[Alocação de registradores]
Aloc --> Sched[Escalonamento]
Sched --> Asm[Assembly]
- Seleção de Instruções: Escolher quais instruções de máquina usar para implementar a IR.
- Alocação de Registradores: Já vimos (Chaitin).
- Escalonamento (Scheduling): Reordenar para pipeline.
Expansão Macro (Template Matching)
A abordagem mais simples. Mapeamos cada instrução IR para um snippet de Assembly fixo. Ex (RISC fake): x = y + z
LW R1, offset_y(FP) ; Carrega y
LW R2, offset_z(FP) ; Carrega z
ADD R1, R1, R2 ; Soma
SW R1, offset_x(FP) ; Salva xÉ ineficiente (memory-heavy), mas funciona. O alocador de registradores e o otimizador posterior reduzem acessos à memória.
Resumo
- Seleção de instruções: mapear cada operação da IR para instruções da ISA (template ou tree covering). Alocação de registradores: mapear variáveis/temporários para registradores físicos. Escalonamento: reordenar instruções para reduzir stalls no pipeline.
- Expansão macro (template) é a forma mais simples; otimizações usam tree covering e custos por instrução.
Referências
- Aho et al. (2006); Cooper & Torczon (2011).
Materiais da aula
Última atualização: 08/03/2026