summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw44@gmail.com>2016-01-02 22:31:07 +0800
committerTing-Wei Lan <lantw44@gmail.com>2016-01-02 22:33:11 +0800
commit5ae27f1f64d92bde51ca6e084093c2eda222d0eb (patch)
tree451752ec2da4c8f25cbf3244e6bc84a40e64d9e4
parentcdff6776fc37b52a8dbd3f4fcad7daa3447ddce9 (diff)
downloadcompiler2015-5ae27f1f64d92bde51ca6e084093c2eda222d0eb.tar
compiler2015-5ae27f1f64d92bde51ca6e084093c2eda222d0eb.tar.gz
compiler2015-5ae27f1f64d92bde51ca6e084093c2eda222d0eb.tar.bz2
compiler2015-5ae27f1f64d92bde51ca6e084093c2eda222d0eb.tar.lz
compiler2015-5ae27f1f64d92bde51ca6e084093c2eda222d0eb.tar.xz
compiler2015-5ae27f1f64d92bde51ca6e084093c2eda222d0eb.tar.zst
compiler2015-5ae27f1f64d92bde51ca6e084093c2eda222d0eb.zip
Workaround large immediate by loading constant offsets from memory
-rw-r--r--src/code-generation.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/code-generation.c b/src/code-generation.c
index c9ac5cc..e735e57 100644
--- a/src/code-generation.c
+++ b/src/code-generation.c
@@ -82,6 +82,7 @@ static inline bool safe_immediate(uint64_t imm) {
return imm <= 4096;
}
+#define REG_TMP "x9"
static inline void load_variable(CcmmcAst *id, CcmmcState *state, const char *r) {
fprintf(state->asm_output, "\t/* var load, line %zu */\n", id->line_number);
const char *var_name = id->value_id.name;
@@ -95,8 +96,11 @@ static inline void load_variable(CcmmcAst *id, CcmmcState *state, const char *r)
fprintf(state->asm_output,
"\tldr\t%s, [fp, #-%" PRIu64 "]\n", r, var_sym->attr.addr);
} else {
- // TODO: large offset
- assert(false);
+ fprintf(state->asm_output,
+ "\tldr\t" REG_TMP ", =%" PRIu64 "\n"
+ "\tsub\t" REG_TMP ", fp, " REG_TMP "\n"
+ "\tldr\t%s, [" REG_TMP "]\n",
+ var_sym->attr.addr, r);
}
}
}
@@ -114,11 +118,15 @@ static inline void store_variable(CcmmcAst *id, CcmmcState *state, const char *r
fprintf(state->asm_output,
"\tstr\t%s, [fp, #-%" PRIu64 "]\n", r, var_sym->attr.addr);
} else {
- // TODO: large offset
- assert(false);
+ fprintf(state->asm_output,
+ "\tldr\t" REG_TMP ", =%" PRIu64 "\n"
+ "\tsub\t" REG_TMP ", fp, " REG_TMP "\n"
+ "\tstr\t%s, [" REG_TMP "]\n",
+ var_sym->attr.addr, r);
}
}
}
+#undef REG_TMP
static void generate_expression(CcmmcAst *expr, CcmmcState *state,
const char *result, const char *op1, const char *op2)