diff options
author | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-03 05:47:24 +0800 |
---|---|---|
committer | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-03 05:47:24 +0800 |
commit | dcebd8a1b4c2f89ce779797bf5ba8d298fa8596c (patch) | |
tree | e839cd6a3525a2c418e4ab17f283e4adfcfca23a | |
parent | f3ca454b3ad56460e11a5e6367252d50792d0d40 (diff) | |
download | compiler2015-dcebd8a1b4c2f89ce779797bf5ba8d298fa8596c.tar compiler2015-dcebd8a1b4c2f89ce779797bf5ba8d298fa8596c.tar.gz compiler2015-dcebd8a1b4c2f89ce779797bf5ba8d298fa8596c.tar.bz2 compiler2015-dcebd8a1b4c2f89ce779797bf5ba8d298fa8596c.tar.lz compiler2015-dcebd8a1b4c2f89ce779797bf5ba8d298fa8596c.tar.xz compiler2015-dcebd8a1b4c2f89ce779797bf5ba8d298fa8596c.tar.zst compiler2015-dcebd8a1b4c2f89ce779797bf5ba8d298fa8596c.zip |
Temporarily workaround the wrong return label
-rw-r--r-- | src/code-generation.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/code-generation.c b/src/code-generation.c index c9067c4..16b3dde 100644 --- a/src/code-generation.c +++ b/src/code-generation.c @@ -634,6 +634,16 @@ static void generate_statement( state, current_offset, "w0"); if (func_type == CCMMC_AST_VALUE_FLOAT) fputs("\tfmov\ts0, w0\n", state->asm_output); + // XXX: We should fix the location of the return label + // instead of copying code and modifying sp here. + if (safe_immediate(current_offset)) { + fprintf(state->asm_output, "\tadd\tsp, sp, #%" PRIu64 "\n", + current_offset); + } else { + fprintf(state->asm_output, + "\tldr\t%s, =%" PRIu64 "\n" + "\tadd\tsp, sp, %s\n", "x9", current_offset, "x9"); + } fprintf(state->asm_output, "\tb\t.LR_%s\n", func_name); break; } |