uops – Micro‑Operaciones del Backend JIT
Archivo: src/uops.rs
Este módulo define la unidad mínima de trabajo que la capa JIT del compilador Forja traduce a código máquina nativo. Cada Uop (micro‑operation) representa una instrucción de nivel muy bajo que a su vez puede mapearse a una o más instrucciones ensamblador reales según la arquitectura objetivo.
Motivación
- Permite que el optimizador de alto nivel (
optimizer.rs) trabaje sobre una representación más cercana al hardware sin depender de la sintaxis de ensamblador específica. - Facilita la generación de código para varias arquitecturas manteniendo una única lógica de transformación (
uops → asm). - Ofrece un punto de extensión donde se pueden añadir nuevas optimizaciones de peephole antes de la emisión final.
Enum Uop
The Uop enum defines the micro‑operations used by the JIT compiler. It includes variants for loading and storing registers, immediate values, arithmetic operations, comparisons, logical operations, control‑flow constructs (jumps, labels), function calls, and other miscellaneous actions. See the source file src/uops.rs for the full list.
Flujo de generación
- El compilador de alto nivel (
compiler_asm.rs) genera una lista deUopa partir del AST. - El pass de optimización de
uops.rsrecorre la secuencia y aplica transformaciones como constant folding, dead‑code elimination y instruction merging (p. ej. combinarLoadImmI64+StoreRegen una solaMovRegImmdel backend). - Finalmente, la fase de emitter (
compiler_asm.rsmétodoemit_uops) traduce cadaUopa la sintaxis de ensamblador específica de la arquitectura (x86‑64, ARM64).
Extensibilidad
Para añadir una nueva micro‑operación:
- Agregar la variante al enum
Uop. - Actualizar el match de
emit_uopspara generar la sintaxis correspondiente segúnTargetArch. - Si la operación requiere optimizaciones, incluir lógica dentro del pass
optimize_uops.