diff options
Diffstat (limited to 'src/cmd/5c/peep.c')
-rw-r--r-- | src/cmd/5c/peep.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/cmd/5c/peep.c b/src/cmd/5c/peep.c index 2f902e02a..22328c18c 100644 --- a/src/cmd/5c/peep.c +++ b/src/cmd/5c/peep.c @@ -127,8 +127,10 @@ loop1: } continue; case AMOVH: + case AMOVHS: case AMOVHU: case AMOVB: + case AMOVBS: case AMOVBU: if(p->to.type != D_REG) continue; @@ -152,6 +154,7 @@ loop1: switch(p->as) { case AMOVW: case AMOVB: + case AMOVBS: case AMOVBU: if(p->from.type == D_OREG && p->from.offset == 0) xtramodes(r, &p->from); @@ -462,7 +465,7 @@ copy1(Adr *v1, Adr *v2, Reg *r, int f) } t = copyu(p, v2, A); switch(t) { - case 2: /* rar, cant split */ + case 2: /* rar, can't split */ if(debug['P']) print("; %Drar; return 0\n", v2); return 0; @@ -824,7 +827,7 @@ xtramodes(Reg *r, Adr *a) Adr v; p = r->prog; - if(p->as == AMOVB && p->from.type == D_OREG) /* byte load */ + if((p->as == AMOVB || p->as == AMOVBS) && p->from.type == D_OREG) /* byte load */ return 0; v = *a; v.type = D_REG; @@ -836,7 +839,7 @@ xtramodes(Reg *r, Adr *a) case AADD: if(p1->from.type == D_REG || (p1->from.type == D_SHIFT && (p1->from.offset&(1<<4)) == 0 && - (p->as != AMOVB || (a == &p->from && (p1->from.offset&~0xf) == 0))) || + ((p->as != AMOVB && p->as != AMOVBS) || (a == &p->from && (p1->from.offset&~0xf) == 0))) || (p1->from.type == D_CONST && p1->from.offset > -4096 && p1->from.offset < 4096)) if(nochange(uniqs(r1), r, p1)) { @@ -961,8 +964,10 @@ copyu(Prog *p, Adr *v, Adr *s) case AMOVF: case AMOVD: case AMOVH: + case AMOVHS: case AMOVHU: case AMOVB: + case AMOVBS: case AMOVBU: case AMOVDW: case AMOVWD: |