diff options
author | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-03 05:49:55 +0800 |
---|---|---|
committer | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-03 05:49:55 +0800 |
commit | 24aab16e756cee17d74a25940d1d94b296e56802 (patch) | |
tree | 0a9eb69a2e9efa20fdc930df8fb088305f48a1eb /src | |
parent | dcebd8a1b4c2f89ce779797bf5ba8d298fa8596c (diff) | |
download | compiler2015-24aab16e756cee17d74a25940d1d94b296e56802.tar compiler2015-24aab16e756cee17d74a25940d1d94b296e56802.tar.gz compiler2015-24aab16e756cee17d74a25940d1d94b296e56802.tar.bz2 compiler2015-24aab16e756cee17d74a25940d1d94b296e56802.tar.lz compiler2015-24aab16e756cee17d74a25940d1d94b296e56802.tar.xz compiler2015-24aab16e756cee17d74a25940d1d94b296e56802.tar.zst compiler2015-24aab16e756cee17d74a25940d1d94b296e56802.zip |
Rewrite names for read, fread, and the overloaded write function
Diffstat (limited to 'src')
-rw-r--r-- | src/code-generation.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/src/code-generation.c b/src/code-generation.c index 16b3dde..b783f10 100644 --- a/src/code-generation.c +++ b/src/code-generation.c @@ -129,10 +129,43 @@ static inline void store_variable(CcmmcAst *id, CcmmcState *state, const char *r } #undef REG_TMP +static const char *call_write(CcmmcAst *id, CcmmcState *state) +{ + CcmmcAst *arg = id->right_sibling->child; + if (arg->type_value == CCMMC_AST_VALUE_CONST_STRING) { + size_t label_str = state->label_number++; + fprintf(state->asm_output, + "\t.section .rodata\n" + "\t.align 2\n" + ".LC%zu:\n" + "\t.ascii \"%s\\n\\000\"\n" + "\t.text\n" + "\tadr\tx0, .LC%zu\n", + label_str, + arg->value_const.const_string, + label_str); + return "_write_str"; + } else if (arg->type_value == CCMMC_AST_VALUE_INT) { + load_variable(arg, state, "w0"); + return "_write_int"; + } else if (arg->type_value == CCMMC_AST_VALUE_FLOAT) { + load_variable(arg, state, "s0"); + return "_write_float"; + } + abort(); +} + static void call_function(CcmmcAst *id, CcmmcState *state) { + const char *func_name = id->value_id.name; ccmmc_register_caller_save(state->reg_pool); - fprintf(state->asm_output, "\tbl\t%s\n", id->value_id.name); + if (strcmp(func_name, "write") == 0) + func_name = call_write(id, state); + else if (strcmp(func_name, "read") == 0) + func_name = "_read_int"; + else if (strcmp(func_name, "fread") == 0) + func_name = "_read_float"; + fprintf(state->asm_output, "\tbl\t%s\n", func_name); ccmmc_register_caller_load(state->reg_pool); } |