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
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/doublecontinuam sem codegen:ConstValue::Doubleé um stub de erro emsrc/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 commovqentre%rax/%rcx.Por que é maior que as features vizinhas
Diferente de switch/ponteiros/structs (que reaproveitaram a infraestrutura inteira existente),
doubleprecisa de:movsd,addsd,subsd,mulsd,divsd,ucomisd/comisdpara comparação);cvtsi2sd/cvttsd2si);doublevão emxmm0..xmm7, não emrdi..r9/rax— versrc/codegen/last/abi.rs, que hoje só cobre a parte inteira do ABI, de propósito);Operand/TacInstr(hoje "tudo é i64") representa um valor de ponto flutuante sem contaminar o resto do pipeline inteiro.Sugestão de escopo inicial
doubleapenas (semfloat) como primeiro corte.return.doublepodem ficar para uma segunda etapa (evita tocarabi.rsjá no primeiro corte).Critério de aceite
double x = 1.5; return x + 2.5;compila e roda via gcc com resultado corretocargo test --all,cargo clippy -- -D warningsecargo fmt --checkcontinuam passando