summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw44@gmail.com>2016-01-03 04:37:28 +0800
committerTing-Wei Lan <lantw44@gmail.com>2016-01-03 04:37:56 +0800
commit94906666d33ae6b5218e7e15578c37baba7882b8 (patch)
treee227996ebea6f746ec1c44c10fc18a8626b6e7c2
parentad147f510185dc8d8a1af52ac5b983a9536b0287 (diff)
downloadcompiler2015-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.c15
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) {