ps5: generate_expression finish indexing
This commit is contained in:
@@ -18,6 +18,7 @@ static void generate_global_variables(void);
|
||||
static void generate_function(symbol_t* function);
|
||||
static void generate_expression(node_t* expression);
|
||||
static void generate_statement(node_t* node);
|
||||
static void generate_base_address(node_t *identifier);
|
||||
static void generate_main(symbol_t* first);
|
||||
|
||||
// Entry point for code generation
|
||||
@@ -175,11 +176,15 @@ static void generate_expression(node_t* expression)
|
||||
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);
|
||||
generate_base_address(expression);
|
||||
EMIT("movq (%s), %s", RAX, RAX);
|
||||
break;
|
||||
case ARRAY_INDEXING:
|
||||
generate_base_address(expression->children[0]); // identifier child
|
||||
STASH();
|
||||
generate_expression(expression->children[1]); // index expression
|
||||
EMIT("leaq (%s, %s, 8), %s", RCX, RAX, RAX); // rcx + 8*rax -> rax
|
||||
EMIT("movq (%s), %s", RAX, RAX); // deref rax
|
||||
break;
|
||||
case OPERATOR:
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user