diff options
author | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-02 04:11:05 +0800 |
---|---|---|
committer | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-02 04:11:05 +0800 |
commit | a3f2020bf16150c32939e894ab5fa49dafc6fc48 (patch) | |
tree | bf2237177f0f4901a278a838221d305034c4de95 /src/code-generation.c | |
parent | 2cb8d9fe7244aa59fdf501b5b990f511394f3ec9 (diff) | |
download | compiler2015-a3f2020bf16150c32939e894ab5fa49dafc6fc48.tar.gz compiler2015-a3f2020bf16150c32939e894ab5fa49dafc6fc48.tar.zst compiler2015-a3f2020bf16150c32939e894ab5fa49dafc6fc48.zip |
Add function prologue and epilogue
Diffstat (limited to 'src/code-generation.c')
-rw-r--r-- | src/code-generation.c | 10 |
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; |