diff options
author | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-02 22:31:07 +0800 |
---|---|---|
committer | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-02 22:33:11 +0800 |
commit | 5ae27f1f64d92bde51ca6e084093c2eda222d0eb (patch) | |
tree | 451752ec2da4c8f25cbf3244e6bc84a40e64d9e4 | |
parent | cdff6776fc37b52a8dbd3f4fcad7daa3447ddce9 (diff) | |
download | compiler2015-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.c | 16 |
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) |