summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorkugwa <kugwa2000@gmail.com>2016-01-18 17:14:38 +0800
committerkugwa <kugwa2000@gmail.com>2016-01-18 17:14:38 +0800
commit3f7afe9f13b43a6153d0740d2a2f912a6f85560a (patch)
tree81ab545205a36dd3e4271123382339e9d7b72db0 /src
parent319b052cc343070f81aa7c61f7fa26918890cb03 (diff)
downloadcompiler2015-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.c54
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) {