diff options
author | kugwa <kugwa2000@gmail.com> | 2016-01-18 17:14:38 +0800 |
---|---|---|
committer | kugwa <kugwa2000@gmail.com> | 2016-01-18 17:14:38 +0800 |
commit | 3f7afe9f13b43a6153d0740d2a2f912a6f85560a (patch) | |
tree | 81ab545205a36dd3e4271123382339e9d7b72db0 /src | |
parent | 319b052cc343070f81aa7c61f7fa26918890cb03 (diff) | |
download | compiler2015-3f7afe9f13b43a6153d0740d2a2f912a6f85560a.tar compiler2015-3f7afe9f13b43a6153d0740d2a2f912a6f85560a.tar.gz compiler2015-3f7afe9f13b43a6153d0740d2a2f912a6f85560a.tar.bz2 compiler2015-3f7afe9f13b43a6153d0740d2a2f912a6f85560a.tar.lz compiler2015-3f7afe9f13b43a6153d0740d2a2f912a6f85560a.tar.xz compiler2015-3f7afe9f13b43a6153d0740d2a2f912a6f85560a.tar.zst compiler2015-3f7afe9f13b43a6153d0740d2a2f912a6f85560a.zip |
Complete global array reference
Diffstat (limited to 'src')
-rw-r--r-- | src/code-generation.c | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/src/code-generation.c b/src/code-generation.c index 7d09368..2aee268 100644 --- a/src/code-generation.c +++ b/src/code-generation.c @@ -141,7 +141,32 @@ static void load_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *dist, ccmmc_register_unlock(state->reg_pool, dist); } else { - // TODO: global array + CcmmcTmp *offset; + const char *offset_reg; + char extend[8]; + + offset = ccmmc_register_alloc(state->reg_pool, current_offset); + calc_array_offset(id, &var_sym->type, state, offset, current_offset); + + dist_reg = ccmmc_register_lock(state->reg_pool, dist); + offset_reg = ccmmc_register_lock(state->reg_pool, offset); + + ccmmc_register_extend_name(offset, extend); + fprintf(state->asm_output, + "\tadrp\t" REG_TMP ", %s\n" + "\tadd\t" REG_TMP ", " REG_TMP ", #:lo12:%s\n" + "\tsxtw\t%s, %s\n" + "\tadd\t" REG_TMP ", " REG_TMP ", %s\n" + "\tldr\t%s, [" REG_TMP "]\n", + var_name, + var_name, + extend, offset_reg, + extend, + dist_reg); + + ccmmc_register_unlock(state->reg_pool, dist); + ccmmc_register_unlock(state->reg_pool, offset); + ccmmc_register_free(state->reg_pool, offset, current_offset); } } else { if (id->value_id.kind != CCMMC_KIND_ID_ARRAY) { @@ -206,7 +231,32 @@ static void store_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *src, ccmmc_register_unlock(state->reg_pool, src); } else { - // TODO: global array + CcmmcTmp *offset; + const char *offset_reg; + char extend[8]; + + offset = ccmmc_register_alloc(state->reg_pool, current_offset); + calc_array_offset(id, &var_sym->type, state, offset, current_offset); + + src_reg = ccmmc_register_lock(state->reg_pool, src); + offset_reg = ccmmc_register_lock(state->reg_pool, offset); + + ccmmc_register_extend_name(offset, extend); + fprintf(state->asm_output, + "\tadrp\t" REG_TMP ", %s\n" + "\tadd\t" REG_TMP ", " REG_TMP ", #:lo12:%s\n" + "\tsxtw\t%s, %s\n" + "\tadd\t" REG_TMP ", " REG_TMP ", %s\n" + "\tstr\t%s, [" REG_TMP "]\n", + var_name, + var_name, + extend, offset_reg, + extend, + src_reg); + + ccmmc_register_unlock(state->reg_pool, src); + ccmmc_register_unlock(state->reg_pool, offset); + ccmmc_register_free(state->reg_pool, offset, current_offset); } } else { if (id->value_id.kind != CCMMC_KIND_ID_ARRAY) { |