From 6615d69a5bac6b3d668120096c52ed75606be49f Mon Sep 17 00:00:00 2001 From: Fredrik Robertsen Date: Tue, 28 Apr 2026 23:25:11 +0200 Subject: [PATCH] ps6: task 4 --- ps6/src/generator.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/ps6/src/generator.c b/ps6/src/generator.c index ee7a502..404c807 100644 --- a/ps6/src/generator.c +++ b/ps6/src/generator.c @@ -240,12 +240,37 @@ static const char* generate_array_access(node_t* node) return MEM(RCX); } +int ternary_counter = 0; + // Generates code to evaluate expressions on the form A ? B : C // If A is non-zero, B is evaluated. Otherwise C is evaluated. // The final result is placed in %rax static void generate_ternary_operator(node_t* op) { // TODO (Task 4): Implement the ternary operator + assert(op->n_children == 3); + + node_t *a, *b, *c; + a = op->children[0]; + b = op->children[1]; + c = op->children[2]; + + char endif_label[8]; + snprintf(endif_label, 8, "ENDTY%d", ternary_counter); + char else_label[8]; + snprintf(else_label, 8, "ELSY%d", ternary_counter); + + ternary_counter++; + + generate_expression(a); + CMPQ("$0", RAX); + JE(else_label); + generate_expression(b); + JMP(endif_label); + + LABEL("%s", else_label); + generate_expression(c); + LABEL("%s", endif_label); } // Generates code to evaluate the expression, and place the result in %rax