From 5bc4780a7d280bc0c58c3e1568a5056a4dfad080 Mon Sep 17 00:00:00 2001 From: Fredrik Robertsen Date: Tue, 28 Apr 2026 22:10:46 +0200 Subject: [PATCH] ps6: task 1 --- ps6/src/emit.h | 1 + ps6/src/generator.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/ps6/src/emit.h b/ps6/src/emit.h index f096467..0100e79 100644 --- a/ps6/src/emit.h +++ b/ps6/src/emit.h @@ -65,6 +65,7 @@ EMIT("movzbq %s, %s", (byte_reg), (full_reg)) // full_reg <- byte_reg #define JNE(label) EMIT("jne %s", (label)) // Conditional jump (not equal) +#define JE(label) EMIT("je %s", (label)) // Conditional jump (equal) #define JMP(label) EMIT("jmp %s", (label)) // Unconditional jump // Bitwise and diff --git a/ps6/src/generator.c b/ps6/src/generator.c index dd46ed5..494b992 100644 --- a/ps6/src/generator.c +++ b/ps6/src/generator.c @@ -445,6 +445,8 @@ static void generate_return_statement(node_t* statement) EMIT("jmp .%s.epilogue", current_function->name); } +int if_counter = 0; + static void generate_if_statement(node_t* statement) { // TODO (Task 1): @@ -453,6 +455,32 @@ static void generate_if_statement(node_t* statement) // You will need to define your own unique labels for this if statement, // so consider using a global variable as a counter to give each label a suffix unique to this if. + int arity = statement->n_children; + assert(arity == 2 || arity == 3); + bool do_else = arity == 3; + + node_t *condition = statement->children[0]; + node_t *then_body = statement->children[1]; + + char endif_label[8]; + snprintf(endif_label, 8, "ENDIF%d", if_counter); + char else_label[8]; + snprintf(else_label, 8, "ELSE%d", if_counter); + + if_counter++; + + generate_expression(condition); + CMPQ("$0", RAX); + JE(else_label); + generate_statement(then_body); + JMP(endif_label); + + LABEL("%s", else_label); + if (do_else) { + node_t *else_body = statement->children[2]; + generate_statement(else_body); + } + LABEL("%s", endif_label); } static void generate_while_statement(node_t* statement)