summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkugwa <kugwa2000@gmail.com>2016-01-18 16:13:26 +0800
committerkugwa <kugwa2000@gmail.com>2016-01-18 16:13:26 +0800
commit266d16765321ed3424cbc9b355dbe2c0f56b24e2 (patch)
tree9116d44d653855ae6667c34f31e1af0338b25dcd
parent1ff62f8ff85b32fc92ee1be0f1e61f1bee1a7ef7 (diff)
downloadcompiler2015-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]
-rw-r--r--src/code-generation.c32
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);
}