summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/code-generation.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/code-generation.c b/src/code-generation.c
index 19c23e1..d569dd3 100644
--- a/src/code-generation.c
+++ b/src/code-generation.c
@@ -208,7 +208,9 @@ static void generate_function(CcmmcAst *function, CcmmcState *state)
fprintf(state->asm_output,
"\t.type\t%s, %%function\n"
"\t.global\t%s\n"
- "%s:\n",
+ "%s:\n"
+ "\tstp\tlr, fp, [sp, -16]!\n"
+ "\tmov\tfp, sp\n",
function->child->right_sibling->value_id.name,
function->child->right_sibling->value_id.name,
function->child->right_sibling->value_id.name);
@@ -216,6 +218,8 @@ static void generate_function(CcmmcAst *function, CcmmcState *state)
CcmmcAst *block_node = param_node->right_sibling;
generate_block(block_node, state, 0);
fprintf(state->asm_output,
+ "\tldp\tlr, fp, [sp], 16\n"
+ "\tret\tlr\n"
"\t.size\t%s, .-%s\n",
function->child->right_sibling->value_id.name,
function->child->right_sibling->value_id.name);
@@ -246,7 +250,9 @@ void ccmmc_code_generation(CcmmcState *state)
state->table->current = NULL;
ccmmc_symbol_table_reopen_scope(state->table);
state->reg_pool = ccmmc_register_init(state->asm_output);
- fputs("fp\t.req\tx30\n", state->asm_output);
+ fputs(
+ "fp\t.req\tx29\n"
+ "lr\t.req\tx30\n", state->asm_output);
generate_program(state);
ccmmc_register_fini(state->reg_pool);
state->reg_pool = NULL;