diff options
-rw-r--r-- | mips.c | 25 | ||||
-rwxr-xr-x | run.sh | 18 | ||||
-rw-r--r-- | ssa.c | 31 |
3 files changed, 67 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); } } @@ -0,0 +1,18 @@ +#! /bin/bash +cp cibic testbed/ +cp lib.s testbed/ +cd testbed/ +for f in *.c +do + echo $f + ./cibic $f > mips.s 2> /dev/null + gcc $f -m32 -std=c99 2> /dev/null + ./spim -stat -file mips.s > out + ./a.out > std + diff std out + if [[ "$?" != 0 ]]; then + echo "Wrong Answer!" + break; + fi +done +echo "OK." @@ -2229,6 +2229,36 @@ void const_propagation() { } } +void strength_reduction() { + int i; + for (i = bcnt - 1; i >= 0; i--) + { + CBlock_t b = blks[vis[i]]; + CInst_t i, ni, ih = b->insts; + for (i = ih->next; i != ih; i = ni) + { + ni = i->next; + switch (i->op) + { + case ADD: + if (i->src1->kind == IMM) + { + COpr_t t = i->src1; + i->src1 = i->src2; + i->src2 = t; + } + if (i->src2->kind == IMM && !i->src2->info.imm) + { + i->op = MOVE; + i->src2 = NULL; + } + break; + default: ; + } + } + } +} + void ssa_func(CType_t func) { #define OPRS_ADD(_opr) \ do { \ @@ -2304,6 +2334,7 @@ void ssa_func(CType_t func) { renaming_vars(oprs); /* optimization on SSA */ const_propagation(); + strength_reduction(); /* out of SSA */ mark_insts(); build_intervals(); |