diff options
author | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-03 19:41:47 +0800 |
---|---|---|
committer | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-03 19:41:47 +0800 |
commit | 6b39babe8a2d498cb35de7e470143a81ef032b65 (patch) | |
tree | 85d5511b1d3352a0caa18370e4755e1fa863a13b | |
parent | a43e0f1a061de5a00ab9a3ee912bbc08e53e48ef (diff) | |
download | compiler2015-6b39babe8a2d498cb35de7e470143a81ef032b65.tar.gz compiler2015-6b39babe8a2d498cb35de7e470143a81ef032b65.tar.zst compiler2015-6b39babe8a2d498cb35de7e470143a81ef032b65.zip |
Use adrp and add to address global variables
This allows using large global arrays.
-rw-r--r-- | src/code-generation.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/code-generation.c b/src/code-generation.c index 072ba7a..4025d99 100644 --- a/src/code-generation.c +++ b/src/code-generation.c @@ -91,8 +91,9 @@ static inline void load_variable(CcmmcAst *id, CcmmcState *state, const char *r) // TODO: array if (ccmmc_symbol_attr_is_global(&var_sym->attr)) { fprintf(state->asm_output, - "\tadr\t" REG_TMP ", %s\n" - "\tldr\t%s, [" REG_TMP "]\n", var_name, r); + "\tadrp\t" REG_TMP ", %s\n" + "\tadd\t" REG_TMP ", " REG_TMP ", #:lo12:%s\n" + "\tldr\t%s, [" REG_TMP "]\n", var_name, var_name, r); } else { if (safe_immediate(var_sym->attr.addr)) { fprintf(state->asm_output, @@ -114,8 +115,9 @@ static inline void store_variable(CcmmcAst *id, CcmmcState *state, const char *r // TODO: array if (ccmmc_symbol_attr_is_global(&var_sym->attr)) { fprintf(state->asm_output, - "\tadr\t" REG_TMP ", %s\n" - "\tstr\t%s, [" REG_TMP "]\n", var_name, r); + "\tadrp\t" REG_TMP ", %s\n" + "\tadd\t" REG_TMP ", " REG_TMP ", #:lo12:%s\n" + "\tstr\t%s, [" REG_TMP "]\n", var_name, var_name, r); } else { if (safe_immediate(var_sym->attr.addr)) { fprintf(state->asm_output, |