Aula 26: Geração de Código de Máquina

Data de Publicação

25/03/2026

Data de Modificação

08/03/2026

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]
  1. Seleção de Instruções: Escolher quais instruções de máquina usar para implementar a IR.
  2. Alocação de Registradores: Já vimos (Chaitin).
  3. 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

De volta ao topo