diff --git a/ps5/src/generator.c b/ps5/src/generator.c index c73bd2e..cbc06b2 100644 --- a/ps5/src/generator.c +++ b/ps5/src/generator.c @@ -214,8 +214,9 @@ static void generate_expression(node_t* expression) break; case ARRAY_INDEXING: generate_base_address(expression->children[0]); // identifier child - STASH(); + PUSHQ(RAX); generate_expression(expression->children[1]); // index expression + POPQ(RCX); EMIT("leaq (%s, %s, 8), %s", RCX, RAX, RAX); // rcx + 8*rax -> rax EMIT("movq (%s), %s", RAX, RAX); // deref rax break; @@ -288,8 +289,9 @@ static void generate_assignment_statement(node_t* statement) EMIT("movq %s, (%s)", RCX, RAX); } else if (child->type == ARRAY_INDEXING) { generate_base_address(child->children[0]); - STASH(); + PUSHQ(RAX); generate_expression(child->children[1]); + POPQ(RCX); EMIT("leaq (%s, %s, 8), %s", RCX, RAX, RCX); generate_expression(statement->children[1]); EMIT("movq %s, (%s)", RAX, RCX); // save the value in rax to the address of identifier[index]