summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkugwa <kugwa2000@gmail.com>2016-01-03 22:31:12 +0800
committerkugwa <kugwa2000@gmail.com>2016-01-03 22:31:12 +0800
commitbf5b41b17a1cc31e2f6c280c49456512fa6773c7 (patch)
tree04e22408120eb4a6567563cbabafc45ccd0d0d40
parent1b0f0c141eafffc917a5d3e367585535f78d3987 (diff)
downloadcompiler2015-bf5b41b17a1cc31e2f6c280c49456512fa6773c7.tar
compiler2015-bf5b41b17a1cc31e2f6c280c49456512fa6773c7.tar.gz
compiler2015-bf5b41b17a1cc31e2f6c280c49456512fa6773c7.tar.bz2
compiler2015-bf5b41b17a1cc31e2f6c280c49456512fa6773c7.tar.lz
compiler2015-bf5b41b17a1cc31e2f6c280c49456512fa6773c7.tar.xz
compiler2015-bf5b41b17a1cc31e2f6c280c49456512fa6773c7.tar.zst
compiler2015-bf5b41b17a1cc31e2f6c280c49456512fa6773c7.zip
Add a function to get the name of 64 bit registers
-rw-r--r--src/code-generation.c16
-rw-r--r--src/register.c12
-rw-r--r--src/register.h1
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);