From 3cfe211bf6a6b7c406e424f315b9ac8da34a32de Mon Sep 17 00:00:00 2001 From: Laborratte5 Date: Mon, 12 May 2025 16:32:45 +0200 Subject: [PATCH] Add outline for x68 asm code generation --- .../backend/x86asm/X86CodeGenerator.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/main/java/edu/kit/kastel/vads/compiler/backend/x86asm/X86CodeGenerator.java diff --git a/src/main/java/edu/kit/kastel/vads/compiler/backend/x86asm/X86CodeGenerator.java b/src/main/java/edu/kit/kastel/vads/compiler/backend/x86asm/X86CodeGenerator.java new file mode 100644 index 0000000..ca37a80 --- /dev/null +++ b/src/main/java/edu/kit/kastel/vads/compiler/backend/x86asm/X86CodeGenerator.java @@ -0,0 +1,64 @@ +package edu.kit.kastel.vads.compiler.backend.x86asm; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import edu.kit.kastel.vads.compiler.backend.CodeGenerator; +import edu.kit.kastel.vads.compiler.backend.aasm.AasmRegisterAllocator; +import edu.kit.kastel.vads.compiler.backend.regalloc.Register; +import edu.kit.kastel.vads.compiler.backend.regalloc.RegisterAllocator; +import edu.kit.kastel.vads.compiler.ir.IrGraph; +import edu.kit.kastel.vads.compiler.ir.node.Node; + + +public class X86CodeGenerator implements CodeGenerator { + + private static final String MAIN_ASM = """ + .global main + .global _main + .text + main: + call _main + # move the return value into the first argument for the syscall + movq %rax, %rdi + # move the exit syscall number into rax + movq $0x3C, %rax + syscall + _main: + # your generated code here + """; + + public String generateCode(List program) { + StringBuilder builder = new StringBuilder(); + for (IrGraph graph : program) { + RegisterAllocator allocator = new AasmRegisterAllocator(); + Map registers = allocator.allocateRegisters(graph); + + builder.append(MAIN_ASM); + generateForGraph(graph, builder, registers); + } + return builder.toString(); + } + + private void generateForGraph(IrGraph graph, StringBuilder builder, Map registers) { + Set visited = new HashSet<>(); + scan(graph.endBlock(), visited, builder, registers); + } + + private void scan(Node node, Set visited, StringBuilder builder, Map registers) { + for (Node predecessor : node.predecessors()) { + if (visited.add(predecessor)) { + scan(predecessor, visited, builder, registers); + } + } + + // TODO: implement code generation + switch (node) { + default: + throw new UnsupportedOperationException("Codegeneration for '" + node.toString() + "' is not implemented."); + } + } + +}