From 7bf7dcbefc89fd67e62c0bb625089c1d53e8e878 Mon Sep 17 00:00:00 2001 From: Teddy Date: Mon, 5 May 2014 00:21:20 +0800 Subject: ... --- mips.c | 25 ++++++++++++++++++------- run.sh | 18 ++++++++++++++++++ ssa.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 7 deletions(-) create mode 100755 run.sh 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); } } diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..a3f67c3 --- /dev/null +++ b/run.sh @@ -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." diff --git a/ssa.c b/ssa.c index 2df04be..1c43920 100644 --- a/ssa.c +++ b/ssa.c @@ -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(); -- cgit v1.2.3