diff options
author | kugwa <kugwa2000@gmail.com> | 2016-01-18 16:13:26 +0800 |
---|---|---|
committer | kugwa <kugwa2000@gmail.com> | 2016-01-18 16:13:26 +0800 |
commit | 266d16765321ed3424cbc9b355dbe2c0f56b24e2 (patch) | |
tree | 9116d44d653855ae6667c34f31e1af0338b25dcd /src | |
parent | 1ff62f8ff85b32fc92ee1be0f1e61f1bee1a7ef7 (diff) | |
download | compiler2015-266d16765321ed3424cbc9b355dbe2c0f56b24e2.tar compiler2015-266d16765321ed3424cbc9b355dbe2c0f56b24e2.tar.gz compiler2015-266d16765321ed3424cbc9b355dbe2c0f56b24e2.tar.bz2 compiler2015-266d16765321ed3424cbc9b355dbe2c0f56b24e2.tar.lz compiler2015-266d16765321ed3424cbc9b355dbe2c0f56b24e2.tar.xz compiler2015-266d16765321ed3424cbc9b355dbe2c0f56b24e2.tar.zst compiler2015-266d16765321ed3424cbc9b355dbe2c0f56b24e2.zip |
Fix calc_array_offset()
Don't use type->array_size[0]
Diffstat (limited to 'src')
-rw-r--r-- | src/code-generation.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/src/code-generation.c b/src/code-generation.c index 41272e5..e92d0d2 100644 --- a/src/code-generation.c +++ b/src/code-generation.c @@ -88,26 +88,17 @@ static void generate_expression(CcmmcAst *expr, CcmmcState *state, static void calc_array_offset(CcmmcAst *ref, CcmmcSymbolType *type, CcmmcState *state, CcmmcTmp *result, uint64_t *current_offset) { - size_t i, dim_mul; + size_t i; CcmmcAst *index_node; CcmmcTmp *index, *mul; const char *result_reg, *index_reg, *mul_reg; - dim_mul = 1; - for (i = 0; i < type->array_dimension; i++) - dim_mul *= type->array_size[i]; - - result_reg = ccmmc_register_lock(state->reg_pool, result); - fprintf(state->asm_output, "\tmov\t%s, #0\n", result_reg); - ccmmc_register_unlock(state->reg_pool, result); - + generate_expression(ref->child, state, result, current_offset); index = ccmmc_register_alloc(state->reg_pool, current_offset); mul = ccmmc_register_alloc(state->reg_pool, current_offset); - for (i = 0, index_node = ref->child; index_node != NULL; + for (i = 1, index_node = ref->child->right_sibling; index_node != NULL; i++, index_node = index_node->right_sibling) { generate_expression(index_node, state, index, current_offset); - dim_mul /= type->array_size[i]; - result_reg = ccmmc_register_lock(state->reg_pool, result); index_reg = ccmmc_register_lock(state->reg_pool, index); mul_reg = ccmmc_register_lock(state->reg_pool, mul); @@ -115,13 +106,26 @@ static void calc_array_offset(CcmmcAst *ref, CcmmcSymbolType *type, "\tldr\t%s, =%zu\n" "\tmul\t%s, %s, %s\n" "\tadd\t%s, %s, %s\n", - mul_reg, dim_mul * 4, - index_reg, index_reg, mul_reg, + mul_reg, type->array_size[i], + result_reg, result_reg, mul_reg, result_reg, result_reg, index_reg); ccmmc_register_unlock(state->reg_pool, result); ccmmc_register_unlock(state->reg_pool, index); ccmmc_register_unlock(state->reg_pool, mul); } + + result_reg = ccmmc_register_lock(state->reg_pool, result); + index_reg = ccmmc_register_lock(state->reg_pool, index); + mul_reg = ccmmc_register_lock(state->reg_pool, mul); + fprintf(state->asm_output, + "\tmov\t%s, #4\n" + "\tmul\t%s, %s, %s\n", + mul_reg, + result_reg, result_reg, mul_reg); + ccmmc_register_unlock(state->reg_pool, result); + ccmmc_register_unlock(state->reg_pool, index); + ccmmc_register_unlock(state->reg_pool, mul); + ccmmc_register_free(state->reg_pool, index, current_offset); ccmmc_register_free(state->reg_pool, mul, current_offset); } |