diff options
author | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-03 04:37:28 +0800 |
---|---|---|
committer | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-03 04:37:56 +0800 |
commit | 94906666d33ae6b5218e7e15578c37baba7882b8 (patch) | |
tree | e227996ebea6f746ec1c44c10fc18a8626b6e7c2 | |
parent | ad147f510185dc8d8a1af52ac5b983a9536b0287 (diff) | |
download | compiler2015-94906666d33ae6b5218e7e15578c37baba7882b8.tar compiler2015-94906666d33ae6b5218e7e15578c37baba7882b8.tar.gz compiler2015-94906666d33ae6b5218e7e15578c37baba7882b8.tar.bz2 compiler2015-94906666d33ae6b5218e7e15578c37baba7882b8.tar.lz compiler2015-94906666d33ae6b5218e7e15578c37baba7882b8.tar.xz compiler2015-94906666d33ae6b5218e7e15578c37baba7882b8.tar.zst compiler2015-94906666d33ae6b5218e7e15578c37baba7882b8.zip |
Add a function to handle function calls to reduce duplicate code
-rw-r--r-- | src/code-generation.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/code-generation.c b/src/code-generation.c index 7a2b6da..0d37f3d 100644 --- a/src/code-generation.c +++ b/src/code-generation.c @@ -128,6 +128,13 @@ static inline void store_variable(CcmmcAst *id, CcmmcState *state, const char *r } #undef REG_TMP +static void call_function(CcmmcAst *id, CcmmcState *state) +{ + ccmmc_register_caller_save(state->reg_pool); + fprintf(state->asm_output, "\tbl\t%s\n", id->value_id.name); + ccmmc_register_caller_load(state->reg_pool); +} + static void generate_expression(CcmmcAst *expr, CcmmcState *state, const char *result, const char *op1, const char *op2) { @@ -160,9 +167,7 @@ static void generate_expression(CcmmcAst *expr, CcmmcState *state, CcmmcSymbol *func_sym = ccmmc_symbol_table_retrieve( state->table, func_name); CcmmcAstValueType func_type = func_sym->type.type_base; - ccmmc_register_caller_save(state->reg_pool); - fprintf(state->asm_output, "\tbl\t%s\n", func_name); - ccmmc_register_caller_load(state->reg_pool); + call_function(expr->child, state); if (func_type == CCMMC_AST_VALUE_FLOAT) fprintf(state->asm_output, "\tfmov\t%s, s0\n", result); else @@ -614,9 +619,7 @@ static void generate_statement( } } break; case CCMMC_KIND_STMT_FUNCTION_CALL: - ccmmc_register_caller_save(state->reg_pool); - fprintf(state->asm_output, "\tbl\t%s\n", stmt->child->value_id.name); - ccmmc_register_caller_load(state->reg_pool); + call_function(stmt->child, state); break; case CCMMC_KIND_STMT_RETURN: for (CcmmcAst *func = stmt->parent; ; func = func->parent) { |