diff options
author | Teddy <ted.sybil@gmail.com> | 2014-05-05 00:21:20 +0800 |
---|---|---|
committer | Teddy <ted.sybil@gmail.com> | 2014-05-05 00:21:20 +0800 |
commit | 7bf7dcbefc89fd67e62c0bb625089c1d53e8e878 (patch) | |
tree | 3607fd8981b33ee7518600e1f9cbb3489a8106f5 /mips.c | |
parent | 230b90822e0e5e2598f3b40fed19a712097d5908 (diff) |
...
Diffstat (limited to 'mips.c')
-rw-r--r-- | mips.c | 25 |
1 files changed, 18 insertions, 7 deletions
@@ -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); } } |