diff options
author | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-21 22:12:56 +0800 |
---|---|---|
committer | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-21 22:14:26 +0800 |
commit | 6904cd09658f4678e6529e951a64a005580568f1 (patch) | |
tree | 81d6eebe57d2519197d839166e1fcbf8debd0e7c | |
parent | c7a5c6b3d3fd2f5495f104892e15d784fb04a902 (diff) | |
download | compiler2015-6904cd09658f4678e6529e951a64a005580568f1.tar compiler2015-6904cd09658f4678e6529e951a64a005580568f1.tar.gz compiler2015-6904cd09658f4678e6529e951a64a005580568f1.tar.bz2 compiler2015-6904cd09658f4678e6529e951a64a005580568f1.tar.lz compiler2015-6904cd09658f4678e6529e951a64a005580568f1.tar.xz compiler2015-6904cd09658f4678e6529e951a64a005580568f1.tar.zst compiler2015-6904cd09658f4678e6529e951a64a005580568f1.zip |
Don't call ccmmc_register_alloc() after saving registers for write functionHW6
-rw-r--r-- | src/code-generation.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/code-generation.c b/src/code-generation.c index 725ee54..d49281c 100644 --- a/src/code-generation.c +++ b/src/code-generation.c @@ -359,13 +359,15 @@ static void store_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *src, #undef REG_TMP static const char *call_write(CcmmcAst *id, CcmmcState *state, - uint64_t *current_offset) + size_t stored_param_count, uint64_t *current_offset) { CcmmcAst *arg = id->right_sibling->child; CcmmcTmp *dist; const char *dist_reg; if (arg->type_value == CCMMC_AST_VALUE_CONST_STRING) { + ccmmc_register_save_arguments(state->reg_pool, stored_param_count); + ccmmc_register_caller_save(state->reg_pool); size_t label_str = state->label_number++; fprintf(state->asm_output, "\t.section .rodata\n" @@ -381,6 +383,8 @@ static const char *call_write(CcmmcAst *id, CcmmcState *state, } else if (arg->type_value == CCMMC_AST_VALUE_INT) { dist = ccmmc_register_alloc(state->reg_pool, current_offset); generate_expression(arg, state, dist, current_offset); + ccmmc_register_save_arguments(state->reg_pool, stored_param_count); + ccmmc_register_caller_save(state->reg_pool); dist_reg = ccmmc_register_lock(state->reg_pool, dist); fprintf(state->asm_output, "\tmov\tw0, %s\n", @@ -391,6 +395,8 @@ static const char *call_write(CcmmcAst *id, CcmmcState *state, } else if (arg->type_value == CCMMC_AST_VALUE_FLOAT) { dist = ccmmc_register_alloc(state->reg_pool, current_offset); generate_expression(arg, state, dist, current_offset); + ccmmc_register_save_arguments(state->reg_pool, stored_param_count); + ccmmc_register_caller_save(state->reg_pool); dist_reg = ccmmc_register_lock(state->reg_pool, dist); fprintf(state->asm_output, "\tfmov\ts0, %s\n", @@ -417,9 +423,7 @@ static void call_function(CcmmcAst *id, CcmmcState *state, const char *func_name = id->value_id.name; if (strcmp(func_name, "write") == 0) { - ccmmc_register_save_arguments(state->reg_pool, stored_param_count); - ccmmc_register_caller_save(state->reg_pool); - func_name = call_write(id, state, current_offset); + func_name = call_write(id, state, stored_param_count, current_offset); } else if (strcmp(func_name, "read") == 0) { ccmmc_register_save_arguments(state->reg_pool, stored_param_count); ccmmc_register_caller_save(state->reg_pool); |