diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/code-generation.c | 16 | ||||
-rw-r--r-- | src/register.c | 12 | ||||
-rw-r--r-- | src/register.h | 1 |
3 files changed, 27 insertions, 2 deletions
diff --git a/src/code-generation.c b/src/code-generation.c index 5d623d6..5c96399 100644 --- a/src/code-generation.c +++ b/src/code-generation.c @@ -161,6 +161,7 @@ static void load_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *dist, else { CcmmcTmp *offset; const char *offset_reg; + char *extend; offset = ccmmc_register_alloc(state->reg_pool, current_offset); calc_array_offset(id, &var_sym->type, state, offset, current_offset); @@ -168,12 +169,17 @@ static void load_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *dist, dist_reg = ccmmc_register_lock(state->reg_pool, dist); offset_reg = ccmmc_register_lock(state->reg_pool, offset); + extend = ccmmc_register_extend_name(offset); fprintf(state->asm_output, "\tldr\t" REG_TMP ", =%" PRIu64 "\n" "\tsub\t" REG_TMP ", fp, " REG_TMP "\n" + "\tsxt\t%s, %s\n" "\tadd\t" REG_TMP ", " REG_TMP ", %s\n" "\tldr\t%s, [" REG_TMP "]\n", - var_sym->attr.addr, offset_reg, dist_reg); + var_sym->attr.addr, + extend, offset_reg, + extend, + dist_reg); ccmmc_register_unlock(state->reg_pool, dist); ccmmc_register_unlock(state->reg_pool, offset); @@ -215,6 +221,7 @@ static void store_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *src, else { CcmmcTmp *offset; const char *offset_reg; + char *extend; offset = ccmmc_register_alloc(state->reg_pool, current_offset); calc_array_offset(id, &var_sym->type, state, offset, current_offset); @@ -222,12 +229,17 @@ static void store_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *src, src_reg = ccmmc_register_lock(state->reg_pool, src); offset_reg = ccmmc_register_lock(state->reg_pool, offset); + extend = ccmmc_register_extend_name(offset); fprintf(state->asm_output, "\tldr\t" REG_TMP ", =%" PRIu64 "\n" "\tsub\t" REG_TMP ", fp, " REG_TMP "\n" + "\tsxt\t%s, %s\n" "\tadd\t" REG_TMP ", " REG_TMP ", %s\n" "\tstr\t%s, [" REG_TMP "]\n", - var_sym->attr.addr, offset_reg, src_reg); + var_sym->attr.addr, + extend, offset_reg, + extend, + src_reg); ccmmc_register_unlock(state->reg_pool, src); ccmmc_register_unlock(state->reg_pool, offset); diff --git a/src/register.c b/src/register.c index 0cf8a18..77571fe 100644 --- a/src/register.c +++ b/src/register.c @@ -5,6 +5,7 @@ #include <stdbool.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #define REG_NUM 6 #define REG_RESERVED "w9" @@ -12,6 +13,7 @@ #define REG_SIZE 4 #define SPILL_MAX 64 +static char extend_name[8]; static const char *reg_name[REG_NUM] = { "w10", "w11", "w12", "w13", "w14", "w15"}; @@ -190,6 +192,16 @@ void ccmmc_register_free(CcmmcRegPool *pool, CcmmcTmp *tmp, uint64_t *offset) } } +char *ccmmc_register_extend_name(CcmmcTmp *tmp) +{ + if (tmp->reg != NULL) { + strcpy(extend_name, tmp->reg->name); + extend_name[0] = 'x'; + return extend_name; + } + return NULL; +} + void ccmmc_register_caller_save(CcmmcRegPool *pool) { for (int i = 0; i < REG_NUM; i++) diff --git a/src/register.h b/src/register.h index 068f6d0..6589438 100644 --- a/src/register.h +++ b/src/register.h @@ -36,6 +36,7 @@ void ccmmc_register_unlock (CcmmcRegPool *pool, void ccmmc_register_free (CcmmcRegPool *pool, CcmmcTmp *tmp, uint64_t *offset); +char *ccmmc_register_extend_name (CcmmcTmp *tmp); void ccmmc_register_caller_save (CcmmcRegPool *pool); void ccmmc_register_caller_load (CcmmcRegPool *pool); void ccmmc_register_fini (CcmmcRegPool *pool); |