summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw44@gmail.com>2016-01-03 05:49:55 +0800
committerTing-Wei Lan <lantw44@gmail.com>2016-01-03 05:49:55 +0800
commit24aab16e756cee17d74a25940d1d94b296e56802 (patch)
tree0a9eb69a2e9efa20fdc930df8fb088305f48a1eb
parentdcebd8a1b4c2f89ce779797bf5ba8d298fa8596c (diff)
downloadcompiler2015-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
-rw-r--r--src/code-generation.c35
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);
}