Skip to content

Suporte a float/double no codegen x86-64 (registradores XMM) #172

Description

@Bappoz

Contexto

Levantamento feito ao implementar switch/case, address-of/deref, sizeof(expr), indexação via ponteiro e acesso a membro de struct (commits 604c149..e111321 na developer). float/double continuam sem codegen: ConstValue::Double é um stub de erro em src/codegen/last/x86_64.rs (const_immediate), e toda a seleção de instruções (load_op, store_op, emit_binop, emit_unop, comparações) assume valores inteiros de 64 bits movidos com movq entre %rax/%rcx.

Por que é maior que as features vizinhas

Diferente de switch/ponteiros/structs (que reaproveitaram a infraestrutura inteira existente), double precisa de:

  • uma classe de registrador separada (XMM: movsd, addsd, subsd, mulsd, divsd, ucomisd/comisd para comparação);
  • conversão int↔double (cvtsi2sd/cvttsd2si);
  • mudança na convenção de chamada (argumentos/retorno de double vão em xmm0..xmm7, não em rdi..r9/rax — ver src/codegen/last/abi.rs, que hoje só cobre a parte inteira do ABI, de propósito);
  • decisão de design: como o Operand/TacInstr (hoje "tudo é i64") representa um valor de ponto flutuante sem contaminar o resto do pipeline inteiro.

Sugestão de escopo inicial

  • double apenas (sem float) como primeiro corte.
  • Literais, variáveis locais, aritmética básica e return.
  • Argumentos/parâmetros de função com double podem ficar para uma segunda etapa (evita tocar abi.rs já no primeiro corte).

Critério de aceite

  • double x = 1.5; return x + 2.5; compila e roda via gcc com resultado correto
  • cargo test --all, cargo clippy -- -D warnings e cargo fmt --check continuam passando

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions