aboutsummaryrefslogtreecommitdiff
path: root/mips.c
diff options
context:
space:
mode:
authorTeddy <ted.sybil@gmail.com>2014-05-05 00:21:20 +0800
committerTeddy <ted.sybil@gmail.com>2014-05-05 00:21:20 +0800
commit7bf7dcbefc89fd67e62c0bb625089c1d53e8e878 (patch)
tree3607fd8981b33ee7518600e1f9cbb3489a8106f5 /mips.c
parent230b90822e0e5e2598f3b40fed19a712097d5908 (diff)
...
Diffstat (limited to 'mips.c')
-rw-r--r--mips.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/mips.c b/mips.c
index 4c23ecc..0ae3184 100644
--- a/mips.c
+++ b/mips.c
@@ -305,12 +305,13 @@ void mips_generate() {
case MOVE:
{
/* TODO: struct */
- int rs = mips_to_reg(i->src1, reg_v0);
+ int rs;
int rd = i->dest->reg;
CType_t type = i->dest->type;
- if (type->type == CSTRUCT || type->type == CUNION)
+ if ((type->type == CSTRUCT || type->type == CUNION) && i->dest->kind == VAR)
{
- assert(i->dest->kind == VAR);
+ rs = mips_to_reg(i->src1, reg_v0);
+ /* assert(i->dest->kind == VAR); */
printf("\tsw $%d, 4($sp)\n", rs);
if (rd < 0) rd = reg_v0;
mips_load(rd, i->dest);
@@ -323,13 +324,23 @@ void mips_generate() {
}
else
{
- if (rd > 0)
+ if (i->dest->reg > 0 && i->src1->kind == IMM)
{
- if (rd != rs) printf("\tmove $%d $%d\n", rd, rs);
+ printf("\tli $%d %d\n", i->dest->reg, i->src1->info.imm);
}
else
- rd = rs;
- if (i->dest->reg == -1 || i->dest->kind == VAR)
+ {
+ rs = mips_to_reg(i->src1, reg_v0);
+ if (rd > 0)
+ {
+ if (rd != rs) printf("\tmove $%d $%d\n", rd, rs);
+ }
+ else
+ rd = rs;
+ }
+ if (i->dest->reg == -1 ||
+ (i->dest->kind == VAR &&
+ i->dest->info.var->loc > 0))
mips_store(rd, i->dest);
}
}