summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkugwa <kugwa2000@gmail.com>2016-01-03 23:08:05 +0800
committerkugwa <kugwa2000@gmail.com>2016-01-03 23:08:05 +0800
commit1ff62f8ff85b32fc92ee1be0f1e61f1bee1a7ef7 (patch)
treec778b3f64a37747ee9da4a714ef6e4ca22f4e534
parent5a93f4abe8d95738eee01f461e2a157c34affb94 (diff)
downloadcompiler2015-1ff62f8ff85b32fc92ee1be0f1e61f1bee1a7ef7.tar
compiler2015-1ff62f8ff85b32fc92ee1be0f1e61f1bee1a7ef7.tar.gz
compiler2015-1ff62f8ff85b32fc92ee1be0f1e61f1bee1a7ef7.tar.bz2
compiler2015-1ff62f8ff85b32fc92ee1be0f1e61f1bee1a7ef7.tar.lz
compiler2015-1ff62f8ff85b32fc92ee1be0f1e61f1bee1a7ef7.tar.xz
compiler2015-1ff62f8ff85b32fc92ee1be0f1e61f1bee1a7ef7.tar.zst
compiler2015-1ff62f8ff85b32fc92ee1be0f1e61f1bee1a7ef7.zip
Callers have to pass extend_name[]HW5
-rw-r--r--src/code-generation.c10
-rw-r--r--src/register.c6
-rw-r--r--src/register.h2
3 files changed, 9 insertions, 9 deletions
diff --git a/src/code-generation.c b/src/code-generation.c
index f304cf8..41272e5 100644
--- a/src/code-generation.c
+++ b/src/code-generation.c
@@ -144,6 +144,7 @@ static void load_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *dist,
ccmmc_register_unlock(state->reg_pool, dist);
}
else {
+ // TODO: global array
}
} else {
if (id->value_id.kind != CCMMC_KIND_ID_ARRAY) {
@@ -164,7 +165,7 @@ static void load_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *dist,
else {
CcmmcTmp *offset;
const char *offset_reg;
- char *extend;
+ char extend[8];
offset = ccmmc_register_alloc(state->reg_pool, current_offset);
calc_array_offset(id, &var_sym->type, state, offset, current_offset);
@@ -172,7 +173,7 @@ 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);
+ ccmmc_register_extend_name(offset, extend);
fprintf(state->asm_output,
"\tldr\t" REG_TMP ", =%" PRIu64 "\n"
"\tsub\t" REG_TMP ", fp, " REG_TMP "\n"
@@ -208,6 +209,7 @@ static void store_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *src,
ccmmc_register_unlock(state->reg_pool, src);
}
else {
+ // TODO: global array
}
} else {
if (id->value_id.kind != CCMMC_KIND_ID_ARRAY) {
@@ -227,7 +229,7 @@ static void store_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *src,
else {
CcmmcTmp *offset;
const char *offset_reg;
- char *extend;
+ char extend[8];
offset = ccmmc_register_alloc(state->reg_pool, current_offset);
calc_array_offset(id, &var_sym->type, state, offset, current_offset);
@@ -235,7 +237,7 @@ 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);
+ ccmmc_register_extend_name(offset, extend);
fprintf(state->asm_output,
"\tldr\t" REG_TMP ", =%" PRIu64 "\n"
"\tsub\t" REG_TMP ", fp, " REG_TMP "\n"
diff --git a/src/register.c b/src/register.c
index 77571fe..00280c0 100644
--- a/src/register.c
+++ b/src/register.c
@@ -13,7 +13,6 @@
#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"};
@@ -192,14 +191,13 @@ void ccmmc_register_free(CcmmcRegPool *pool, CcmmcTmp *tmp, uint64_t *offset)
}
}
-char *ccmmc_register_extend_name(CcmmcTmp *tmp)
+void ccmmc_register_extend_name(CcmmcTmp *tmp, char *extend_name)
{
if (tmp->reg != NULL) {
strcpy(extend_name, tmp->reg->name);
extend_name[0] = 'x';
- return extend_name;
}
- return NULL;
+ else extend_name[0] = '\0';
}
void ccmmc_register_caller_save(CcmmcRegPool *pool)
diff --git a/src/register.h b/src/register.h
index 6589438..e218b66 100644
--- a/src/register.h
+++ b/src/register.h
@@ -36,7 +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_extend_name (CcmmcTmp *tmp, char *extend_name);
void ccmmc_register_caller_save (CcmmcRegPool *pool);
void ccmmc_register_caller_load (CcmmcRegPool *pool);
void ccmmc_register_fini (CcmmcRegPool *pool);