diff options
author | Ondřej Surý <ondrej@sury.org> | 2011-02-14 13:23:51 +0100 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2011-02-14 13:23:51 +0100 |
commit | 758ff64c69e34965f8af5b2d6ffd65e8d7ab2150 (patch) | |
tree | 6d6b34f8c678862fe9b56c945a7b63f68502c245 /src/cmd/5g/peep.c | |
parent | 3e45412327a2654a77944249962b3652e6142299 (diff) | |
download | golang-upstream/2011-02-01.1.tar.gz |
Imported Upstream version 2011-02-01.1upstream/2011-02-01.1
Diffstat (limited to 'src/cmd/5g/peep.c')
-rw-r--r-- | src/cmd/5g/peep.c | 229 |
1 files changed, 129 insertions, 100 deletions
diff --git a/src/cmd/5g/peep.c b/src/cmd/5g/peep.c index 32333e8a9..f619a6206 100644 --- a/src/cmd/5g/peep.c +++ b/src/cmd/5g/peep.c @@ -89,11 +89,11 @@ loop1: /* * elide shift into D_SHIFT operand of subsequent instruction */ - if(shiftprop(r)) { - excise(r); - t++; - break; - } +// if(shiftprop(r)) { +// excise(r); +// t++; +// break; +// } break; case AMOVW: @@ -101,10 +101,10 @@ loop1: case AMOVD: if(!regtyp(&p->to)) break; - if(isdconst(&p->from)) { - constprop(&p->from, &p->to, r->s1); - break; - } +// if(isdconst(&p->from)) { +// constprop(&p->from, &p->to, r->s1); +// break; +// } if(!regtyp(&p->from)) break; if(p->from.type != p->to.type) @@ -166,87 +166,89 @@ loop1: excise(r1); } - for(r=firstr; r!=R; r=r->link) { - p = r->prog; - switch(p->as) { - case AMOVW: - case AMOVB: - case AMOVBU: - if(p->from.type == D_OREG && p->from.offset == 0) - xtramodes(r, &p->from); - else if(p->to.type == D_OREG && p->to.offset == 0) - xtramodes(r, &p->to); - else - continue; - break; - case ACMP: - /* - * elide CMP $0,x if calculation of x can set condition codes - */ - if(isdconst(&p->from) || p->from.offset != 0) - continue; - r2 = r->s1; - if(r2 == R) - continue; - t = r2->prog->as; - switch(t) { - default: - continue; - case ABEQ: - case ABNE: - case ABMI: - case ABPL: - break; - case ABGE: - t = ABPL; - break; - case ABLT: - t = ABMI; - break; - case ABHI: - t = ABNE; - break; - case ABLS: - t = ABEQ; - break; - } - r1 = r; - do - r1 = uniqp(r1); - while (r1 != R && r1->prog->as == ANOP); - if(r1 == R) - continue; - p1 = r1->prog; - if(p1->to.type != D_REG) - continue; - if(p1->to.reg != p->reg) - if(!(p1->as == AMOVW && p1->from.type == D_REG && p1->from.reg == p->reg)) - continue; - switch(p1->as) { - default: - continue; - case AMOVW: - if(p1->from.type != D_REG) - continue; - case AAND: - case AEOR: - case AORR: - case ABIC: - case AMVN: - case ASUB: - case ARSB: - case AADD: - case AADC: - case ASBC: - case ARSC: - break; - } - p1->scond |= C_SBIT; - r2->prog->as = t; - excise(r); - continue; - } - } +// for(r=firstr; r!=R; r=r->link) { +// p = r->prog; +// switch(p->as) { +// case AMOVW: +// case AMOVB: +// case AMOVBU: +// if(p->from.type == D_OREG && p->from.offset == 0) +// xtramodes(r, &p->from); +// else +// if(p->to.type == D_OREG && p->to.offset == 0) +// xtramodes(r, &p->to); +// else +// continue; +// break; +// case ACMP: +// /* +// * elide CMP $0,x if calculation of x can set condition codes +// */ +// if(isdconst(&p->from) || p->from.offset != 0) +// continue; +// r2 = r->s1; +// if(r2 == R) +// continue; +// t = r2->prog->as; +// switch(t) { +// default: +// continue; +// case ABEQ: +// case ABNE: +// case ABMI: +// case ABPL: +// break; +// case ABGE: +// t = ABPL; +// break; +// case ABLT: +// t = ABMI; +// break; +// case ABHI: +// t = ABNE; +// break; +// case ABLS: +// t = ABEQ; +// break; +// } +// r1 = r; +// do +// r1 = uniqp(r1); +// while (r1 != R && r1->prog->as == ANOP); +// if(r1 == R) +// continue; +// p1 = r1->prog; +// if(p1->to.type != D_REG) +// continue; +// if(p1->to.reg != p->reg) +// if(!(p1->as == AMOVW && p1->from.type == D_REG && p1->from.reg == p->reg)) +// continue; +// +// switch(p1->as) { +// default: +// continue; +// case AMOVW: +// if(p1->from.type != D_REG) +// continue; +// case AAND: +// case AEOR: +// case AORR: +// case ABIC: +// case AMVN: +// case ASUB: +// case ARSB: +// case AADD: +// case AADC: +// case ASBC: +// case ARSC: +// break; +// } +// p1->scond |= C_SBIT; +// r2->prog->as = t; +// excise(r); +// continue; +// } +// } predicate(); } @@ -331,10 +333,13 @@ subprop(Reg *r0) case ABL: return 0; - case ACMP: + case AMULLU: + case AMULA: + case ACMN: case AADD: case ASUB: + case ASBC: case ARSB: case ASLL: case ASRL: @@ -342,12 +347,14 @@ subprop(Reg *r0) case AORR: case AAND: case AEOR: + case AMVN: case AMUL: + case AMULU: case ADIV: case ADIVU: + case AMOD: + case AMODU: - case ACMPF: - case ACMPD: case AADDD: case AADDF: case ASUBD: @@ -622,8 +629,8 @@ shiftprop(Reg *r) case AADC: case AORR: case ASUB: - case ARSB: case ASBC: + case ARSB: case ARSC: if(p1->reg == n || (p1->reg == NREG && p1->to.type == D_REG && p1->to.reg == n)) { if(p1->from.type != D_REG) @@ -648,6 +655,7 @@ shiftprop(Reg *r) print("\t=>%P", p1); } case ABIC: + case ATST: case ACMP: case ACMN: if(p1->reg == n) @@ -922,8 +930,7 @@ copyu(Prog *p, Adr *v, Adr *s) switch(p->as) { default: - if(debug['P']) - print(" (?)"); + print("copyu: cant find %A\n", p->as); return 2; case AMOVM: @@ -983,7 +990,7 @@ copyu(Prog *p, Adr *v, Adr *s) return 2; } else { if(p->to.reg == v->reg) - return 2; + return 2; } } if(s != A) { @@ -1005,8 +1012,14 @@ copyu(Prog *p, Adr *v, Adr *s) return 1; return 0; + case AMULLU: /* read, read, write, write */ + case AMULA: + return 2; + case AADD: /* read, read, write */ + case AADC: case ASUB: + case ASBC: case ARSB: case ASLL: case ASRL: @@ -1014,9 +1027,13 @@ copyu(Prog *p, Adr *v, Adr *s) case AORR: case AAND: case AEOR: + case AMVN: case AMUL: + case AMULU: case ADIV: case ADIVU: + case AMOD: + case AMODU: case AADDF: case AADDD: case ASUBF: @@ -1028,6 +1045,7 @@ copyu(Prog *p, Adr *v, Adr *s) case ACMPF: case ACMPD: + case ATST: case ACMP: case ACMN: case ACASE: @@ -1138,9 +1156,13 @@ a2type(Prog *p) switch(p->as) { + case ATST: case ACMP: case ACMN: + case AMULLU: + case AMULA: + case AADD: case ASUB: case ARSB: @@ -1150,9 +1172,13 @@ a2type(Prog *p) case AORR: case AAND: case AEOR: + case AMVN: case AMUL: + case AMULU: case ADIV: case ADIVU: + case AMOD: + case AMODU: return D_REG; case ACMPF: @@ -1369,12 +1395,15 @@ int modifiescpsr(Prog *p) { switch(p->as) { - case ATST: + case AMULLU: + case AMULA: + case AMULU: + case ADIVU: + case ATEQ: case ACMN: + case ATST: case ACMP: - case AMULU: - case ADIVU: case AMUL: case ADIV: case AMOD: |