summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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,