Skip to content

fix(codegen): corrige e completa suporte a double (XMM)#178

Merged
Phill-Chill merged 5 commits into
developerfrom
feat/issue172-float/double-support-in-codegen
Jun 25, 2026
Merged

fix(codegen): corrige e completa suporte a double (XMM)#178
Phill-Chill merged 5 commits into
developerfrom
feat/issue172-float/double-support-in-codegen

Conversation

@Bappoz

@Bappoz Bappoz commented Jun 25, 2026

Copy link
Copy Markdown
Owner

Resumo

A branch original do colaborador (commits a4e4b25..381a4dc) introduzia a estrutura para suporte a double no codegen x86-64, mas não compilava: o campo ty foi adicionado às variantes de TacInstr sem atualizar todos os call sites correspondentes, e as assinaturas de load_op/store_op mudaram sem ajustar todos os chamadores.

Este PR revisa, corrige e completa a implementação:

  • src/ir/lower.rs: adiciona expr_type_for_codegen, que infere o tipo (double ou não) de literais, variáveis locais, expressões aritméticas e casts, e usa essa inferência para popular ty corretamente em todos os pontos de construção de TacInstr (antes ausente/quebrado).
  • src/codegen/last/x86_64.rs:
    • corrige load_op/store_op, que calculavam mov_insn (movsd vs movq) mas nunca usavam a variável — sempre emitiam movq, o que por acaso funciona para mover bits brutos, mas não correspondia à intenção do código;
    • corrige bug real: o mapeamento de setcc para comparações double estava invertido (LessGreater e LeqGeq trocados) — a < b retornava falso e vice-versa;
    • literal double usado em contexto não-double (ex.: float, fora do escopo desta issue) agora produz um erro de codegen claro em vez de assembly inválido que falha silenciosamente no gcc.
  • src/codegen/inter/optimizations.rs / src/ir/cfg.rs: ajusta matches exaustivos e construções para o novo campo ty.
  • Registra src/tests/tac_test.rs (existia no working tree mas não estava listado em mod.rs, então nunca era compilado/rodado).
  • Novo tests/double_codegen_test.rs: cobre o critério de aceite da issue (double x = 1.5; return x + 2.5;, verificado via gcc), aritmética completa (+ - * /), comparações double (via exit code, já que resultam em inteiro), e uma checagem de que o assembly emitido realmente usa movsd/addsd/.double.

Escopo

Mantido conforme sugerido na própria issue: apenas double (não float), literais, variáveis locais, aritmética básica, comparações e return. Argumentos/parâmetros e retorno de double por chamadas feitas pelo próprio codegen (callsite, não callee) permanecem fora de escopo — exigiriam estender codegen/last/abi.rs para xmm0..xmm7.

Test plan

  • cargo build --all
  • cargo test --all (357 testes, incluindo os 7 novos de double)
  • cargo clippy --all -- -D warnings
  • cargo fmt --check
  • Critério de aceite da issue verificado manualmente via gcc (função double isolada + harness C)

Refs #172

Phill-Chill and others added 5 commits June 24, 2026 22:45
…do colaborador

A branch original (a4e4b25..381a4dc) nao compilava: o campo 'ty' foi
adicionado a TacInstr::{BinOp,UnOp,Copy,Return} mas varios call sites em
lower.rs, optimizations.rs, cfg.rs e nos modulos de teste nao foram
atualizados, e load_op/store_op em x86_64.rs ganharam o parametro 'ty' sem
que todos os chamadores fossem ajustados.

Correcoes e trabalho completado:
- lower.rs: tipo de cada expressao agora e inferido (literais, variaveis
  locais, aritmetica, cast) para popular 'ty' corretamente em vez de um
  valor fixo; cobre VarDecl, Assign, CompoundAssign, Ternary, prefix/postfix
  e Return.
- x86_64.rs: load_op/store_op passam a usar 'movsd' de fato para double
  (antes computavam 'mov_insn' mas ignoravam a variavel); corrige bug de
  comparacao double com mapeamento de setcc invertido (Less/Greater e
  Leq/Geq trocados — 'a < b' retornava falso e vice-versa); literal double
  usado em contexto nao-double (ex.: 'float', fora de escopo) agora produz
  erro de codegen claro em vez de assembly invalido.
- optimizations.rs/cfg.rs: matches exaustivos e construcoes ajustados para
  o novo campo.
- registra src/tests/tac_test.rs (existia mas nao estava no mod.rs).
- novo tests/double_codegen_test.rs: cobre o criterio de aceite da issue
  (double local + aritmetica + return, verificado via gcc), comparacoes
  double->int via exit code, e checagem do assembly emitido.

Escopo mantido conforme sugerido na issue: apenas 'double' (nao 'float'),
literais/variaveis locais/aritmetica basica/comparacoes/return. Argumentos,
parametros e retorno de double atraves de chamada feita pelo proprio
codegen permanecem fora de escopo (exigem estender abi.rs para xmm0..xmm7).

cargo build --all, cargo test --all (357 testes), cargo clippy -- -D
warnings e cargo fmt --check passam limpos.

Refs #172
…oat/double-support-in-codegen

# Conflicts:
#	src/codegen/last/x86_64.rs
#	src/ir/lower.rs
@Bappoz Bappoz requested a review from guxvr June 25, 2026 02:19
@Bappoz Bappoz added the documentation Improvements or additions to documentation label Jun 25, 2026
@Bappoz Bappoz linked an issue Jun 25, 2026 that may be closed by this pull request
2 tasks
@Phill-Chill Phill-Chill merged commit 0ac1684 into developer Jun 25, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

2 participants