diff options
author | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-02 22:04:15 +0800 |
---|---|---|
committer | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-02 22:07:33 +0800 |
commit | de3449ab73f251353cf301e6e585cc007ee761e5 (patch) | |
tree | 3b2177e91500169b89c305e0847a33b2125ac0e4 | |
parent | 7ac17bcf455713fbaf44437ba6f632f0f3077691 (diff) | |
download | compiler2015-de3449ab73f251353cf301e6e585cc007ee761e5.tar compiler2015-de3449ab73f251353cf301e6e585cc007ee761e5.tar.gz compiler2015-de3449ab73f251353cf301e6e585cc007ee761e5.tar.bz2 compiler2015-de3449ab73f251353cf301e6e585cc007ee761e5.tar.lz compiler2015-de3449ab73f251353cf301e6e585cc007ee761e5.tar.xz compiler2015-de3449ab73f251353cf301e6e585cc007ee761e5.tar.zst compiler2015-de3449ab73f251353cf301e6e585cc007ee761e5.zip |
Floating-point return value is in s0
-rw-r--r-- | src/code-generation.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/code-generation.c b/src/code-generation.c index 8abd72e..b90d00b 100644 --- a/src/code-generation.c +++ b/src/code-generation.c @@ -148,10 +148,17 @@ static void generate_expression(CcmmcAst *expr, CcmmcState *state, if (expr->type_node == CCMMC_AST_NODE_STMT && expr->value_stmt.kind == CCMMC_KIND_STMT_FUNCTION_CALL) { + const char *func_name = expr->child->value_id.name; + 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", expr->child->value_id.name); + fprintf(state->asm_output, "\tbl\t%s\n", func_name); ccmmc_register_caller_load(state->reg_pool); - fprintf(state->asm_output, "\tmov\t%s, w0\n", result); + if (func_type == CCMMC_AST_VALUE_FLOAT) + fprintf(state->asm_output, "\tfmov\t%s, s0\n", result); + else + fprintf(state->asm_output, "\tmov\t%s, w0\n", result); return ; } |