aboutsummaryrefslogtreecommitdiff
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
parent230b90822e0e5e2598f3b40fed19a712097d5908 (diff)
...
-rw-r--r--mips.c25
-rwxr-xr-xrun.sh18
-rw-r--r--ssa.c31
3 files changed, 67 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);
}
}
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();