From 8201269c73a723c392a5fc5dabfdcfb4a96b3210 Mon Sep 17 00:00:00 2001 From: Fredrik Robertsen Date: Tue, 31 Mar 2026 13:18:45 +0200 Subject: [PATCH] ps5: generate_expression --- ps5/src/emit.h | 1 + ps5/src/generator.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/ps5/src/emit.h b/ps5/src/emit.h index f096467..b70f7c0 100644 --- a/ps5/src/emit.h +++ b/ps5/src/emit.h @@ -29,6 +29,7 @@ #define EMIT(fmt, ...) printf("\t" fmt "\n" __VA_OPT__(, ) __VA_ARGS__) #define MOVQ(src, dst) EMIT("movq %s, %s", (src), (dst)) +#define MOVQ_IMM(imm, dst) EMIT("movq $%ld, %s", (int64_t)(imm), (dst)) #define PUSHQ(src) EMIT("pushq %s", (src)) #define POPQ(src) EMIT("popq %s", (src)) diff --git a/ps5/src/generator.c b/ps5/src/generator.c index 6227a55..86ea78c 100644 --- a/ps5/src/generator.c +++ b/ps5/src/generator.c @@ -1,3 +1,4 @@ +#include "symbol_table.h" #include "vslc.h" // This header defines a bunch of macros we can use to emit assembly to stdout @@ -168,9 +169,12 @@ static void generate_expression(node_t* expression) // (The candidates are NUMBER_LITERAL, IDENTIFIER, ARRAY_INDEXING, OPERATOR and FUNCTION_CALL) switch (expression->type) { case NUMBER_LITERAL: - + MOVQ_IMM(expression->data.number_literal, RAX); break; case IDENTIFIER: + symbol_t *sym = expression->symbol; + symbol_t *value = symbol_hashmap_lookup(sym->function_symtable->hashmap, sym->name); + MOVQ_IMM(value->node->data.number_literal, RAX); break; case ARRAY_INDEXING: break;