diff options
author | kugwa <kugwa2000@gmail.com> | 2016-01-02 20:30:08 +0800 |
---|---|---|
committer | kugwa <kugwa2000@gmail.com> | 2016-01-02 20:30:08 +0800 |
commit | 5268c4c6dceedf3df1c3e54969da6a0b248e79b9 (patch) | |
tree | 9c50a9dc17ba48787090bb48285ba613c9b99ab7 | |
parent | efb16c6e87bec51fbd81b7311bffb33f4c837665 (diff) | |
download | compiler2015-5268c4c6dceedf3df1c3e54969da6a0b248e79b9.tar compiler2015-5268c4c6dceedf3df1c3e54969da6a0b248e79b9.tar.gz compiler2015-5268c4c6dceedf3df1c3e54969da6a0b248e79b9.tar.bz2 compiler2015-5268c4c6dceedf3df1c3e54969da6a0b248e79b9.tar.lz compiler2015-5268c4c6dceedf3df1c3e54969da6a0b248e79b9.tar.xz compiler2015-5268c4c6dceedf3df1c3e54969da6a0b248e79b9.tar.zst compiler2015-5268c4c6dceedf3df1c3e54969da6a0b248e79b9.zip |
Generate code for function calls
-rw-r--r-- | src/code-generation.c | 3 | ||||
-rw-r--r-- | src/register.c | 12 |
2 files changed, 14 insertions, 1 deletions
diff --git a/src/code-generation.c b/src/code-generation.c index 4075822..4b10015 100644 --- a/src/code-generation.c +++ b/src/code-generation.c @@ -500,6 +500,9 @@ static void generate_statement( state, current_offset); break; case CCMMC_KIND_STMT_FUNCTION_CALL: + ccmmc_register_caller_save(state->reg_pool); + fprintf(state->asm_output, "\tbl\t%s\n", stmt->child->value_id.name); + ccmmc_register_caller_load(state->reg_pool); break; case CCMMC_KIND_STMT_RETURN: break; diff --git a/src/register.c b/src/register.c index 3054553..99257b0 100644 --- a/src/register.c +++ b/src/register.c @@ -9,7 +9,7 @@ #define REG_NUM 6 #define REG_RESERVED "x9" #define REG_LOCK_MAX 3 -#define REG_SIZE 8 +#define REG_SIZE 4 #define SPILL_MAX 64 static const char *reg_name[REG_NUM] = { @@ -184,10 +184,20 @@ void ccmmc_register_free(CcmmcRegPool *pool, CcmmcTmp *tmp, uint64_t *offset) void ccmmc_register_caller_save(CcmmcRegPool *pool) { + for (int i = 0; i < REG_NUM; i++) + fprintf(pool->asm_output, "\tstr\t%s, [sp - #%d]\n", + reg_name[i], + (i + 1) * REG_SIZE); + fprintf(pool->asm_output, "\tsub\tsp, sp, %d\n", REG_NUM * REG_SIZE); } void ccmmc_register_caller_load(CcmmcRegPool *pool) { + fprintf(pool->asm_output, "\tadd\tsp, sp, %d\n", REG_NUM * REG_SIZE); + for (int i = 0; i < REG_NUM; i++) + fprintf(pool->asm_output, "\tldr\t%s, [sp - #%d]\n", + reg_name[i], + (i + 1) * REG_SIZE); } void ccmmc_register_fini(CcmmcRegPool *pool) |