summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw44@gmail.com>2016-01-03 19:41:47 +0800
committerTing-Wei Lan <lantw44@gmail.com>2016-01-03 19:41:47 +0800
commit6b39babe8a2d498cb35de7e470143a81ef032b65 (patch)
tree85d5511b1d3352a0caa18370e4755e1fa863a13b
parenta43e0f1a061de5a00ab9a3ee912bbc08e53e48ef (diff)
downloadcompiler2015-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.c10
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,