diff --git a/src/cmd/5g/cgen64.c b/src/cmd/5g/cgen64.c index e5604e2394..4da8db2ae2 100644 --- a/src/cmd/5g/cgen64.c +++ b/src/cmd/5g/cgen64.c @@ -64,17 +64,21 @@ cgen64(Node *n, Node *res) return; case OCOM: + regalloc(&t1, lo1.type, N); + gmove(ncon(-1), &t1); + split64(res, &lo2, &hi2); regalloc(&n1, lo1.type, N); gins(AMOVW, &lo1, &n1); - gins(AMVN, &n1, &n1); + gins(AEOR, &t1, &n1); gins(AMOVW, &n1, &lo2); gins(AMOVW, &hi1, &n1); - gins(AMVN, &n1, &n1); + gins(AEOR, &t1, &n1); gins(AMOVW, &n1, &hi2); + regfree(&t1); regfree(&n1); splitclean(); splitclean(); diff --git a/src/cmd/5g/peep.c b/src/cmd/5g/peep.c index 32d5d2bd80..b4421a1b42 100644 --- a/src/cmd/5g/peep.c +++ b/src/cmd/5g/peep.c @@ -133,20 +133,20 @@ loop1: switch(p->as) { default: continue; - case AEOR: - /* - * EOR -1,x,y => MVN x,y - */ - if(isdconst(&p->from) && p->from.offset == -1) { - p->as = AMVN; - p->from.type = D_REG; - if(p->reg != NREG) - p->from.reg = p->reg; - else - p->from.reg = p->to.reg; - p->reg = NREG; - } - continue; +// case AEOR: +// /* +// * EOR -1,x,y => MVN x,y +// */ +// if(isdconst(&p->from) && p->from.offset == -1) { +// p->as = AMVN; +// p->from.type = D_REG; +// if(p->reg != NREG) +// p->from.reg = p->reg; +// else +// p->from.reg = p->to.reg; +// p->reg = NREG; +// } +// continue; case AMOVH: case AMOVHU: case AMOVB: @@ -337,7 +337,7 @@ subprop(Reg *r0) case AMULLU: case AMULA: - case AMVN: +// case AMVN: case ACMN: case AADD: @@ -666,7 +666,7 @@ shiftprop(Reg *r) FAIL("can't swap"); if(p1->reg == NREG && p1->to.reg == n) FAIL("shift result used twice"); - case AMVN: +// case AMVN: if(p1->from.type == D_SHIFT) FAIL("shift result used in shift"); if(p1->from.type != D_REG || p1->from.reg != n) @@ -1018,7 +1018,7 @@ copyu(Prog *p, Adr *v, Adr *s) case AMULLU: /* read, read, write, write */ case AMULA: - case AMVN: +// case AMVN: return 2; case AADD: /* read, read, write */ @@ -1176,7 +1176,7 @@ a2type(Prog *p) case AORR: case AAND: case AEOR: - case AMVN: +// case AMVN: case AMUL: case AMULU: case ADIV: