summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw44@gmail.com>2016-01-02 22:04:15 +0800
committerTing-Wei Lan <lantw44@gmail.com>2016-01-02 22:07:33 +0800
commitde3449ab73f251353cf301e6e585cc007ee761e5 (patch)
tree3b2177e91500169b89c305e0847a33b2125ac0e4
parent7ac17bcf455713fbaf44437ba6f632f0f3077691 (diff)
downloadcompiler2015-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.c11
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 ;
}