Commit 5080d761 authored by Ken Thompson's avatar Ken Thompson

cgen64: dont use MVN instruction

R=r
CC=golang-dev
https://golang.org/cl/4154043
parent dc331e65
...@@ -64,17 +64,21 @@ cgen64(Node *n, Node *res) ...@@ -64,17 +64,21 @@ cgen64(Node *n, Node *res)
return; return;
case OCOM: case OCOM:
regalloc(&t1, lo1.type, N);
gmove(ncon(-1), &t1);
split64(res, &lo2, &hi2); split64(res, &lo2, &hi2);
regalloc(&n1, lo1.type, N); regalloc(&n1, lo1.type, N);
gins(AMOVW, &lo1, &n1); gins(AMOVW, &lo1, &n1);
gins(AMVN, &n1, &n1); gins(AEOR, &t1, &n1);
gins(AMOVW, &n1, &lo2); gins(AMOVW, &n1, &lo2);
gins(AMOVW, &hi1, &n1); gins(AMOVW, &hi1, &n1);
gins(AMVN, &n1, &n1); gins(AEOR, &t1, &n1);
gins(AMOVW, &n1, &hi2); gins(AMOVW, &n1, &hi2);
regfree(&t1);
regfree(&n1); regfree(&n1);
splitclean(); splitclean();
splitclean(); splitclean();
......
...@@ -133,20 +133,20 @@ loop1: ...@@ -133,20 +133,20 @@ loop1:
switch(p->as) { switch(p->as) {
default: default:
continue; continue;
case AEOR: // case AEOR:
/* // /*
* EOR -1,x,y => MVN x,y // * EOR -1,x,y => MVN x,y
*/ // */
if(isdconst(&p->from) && p->from.offset == -1) { // if(isdconst(&p->from) && p->from.offset == -1) {
p->as = AMVN; // p->as = AMVN;
p->from.type = D_REG; // p->from.type = D_REG;
if(p->reg != NREG) // if(p->reg != NREG)
p->from.reg = p->reg; // p->from.reg = p->reg;
else // else
p->from.reg = p->to.reg; // p->from.reg = p->to.reg;
p->reg = NREG; // p->reg = NREG;
} // }
continue; // continue;
case AMOVH: case AMOVH:
case AMOVHU: case AMOVHU:
case AMOVB: case AMOVB:
...@@ -337,7 +337,7 @@ subprop(Reg *r0) ...@@ -337,7 +337,7 @@ subprop(Reg *r0)
case AMULLU: case AMULLU:
case AMULA: case AMULA:
case AMVN: // case AMVN:
case ACMN: case ACMN:
case AADD: case AADD:
...@@ -666,7 +666,7 @@ shiftprop(Reg *r) ...@@ -666,7 +666,7 @@ shiftprop(Reg *r)
FAIL("can't swap"); FAIL("can't swap");
if(p1->reg == NREG && p1->to.reg == n) if(p1->reg == NREG && p1->to.reg == n)
FAIL("shift result used twice"); FAIL("shift result used twice");
case AMVN: // case AMVN:
if(p1->from.type == D_SHIFT) if(p1->from.type == D_SHIFT)
FAIL("shift result used in shift"); FAIL("shift result used in shift");
if(p1->from.type != D_REG || p1->from.reg != n) if(p1->from.type != D_REG || p1->from.reg != n)
...@@ -1018,7 +1018,7 @@ copyu(Prog *p, Adr *v, Adr *s) ...@@ -1018,7 +1018,7 @@ copyu(Prog *p, Adr *v, Adr *s)
case AMULLU: /* read, read, write, write */ case AMULLU: /* read, read, write, write */
case AMULA: case AMULA:
case AMVN: // case AMVN:
return 2; return 2;
case AADD: /* read, read, write */ case AADD: /* read, read, write */
...@@ -1176,7 +1176,7 @@ a2type(Prog *p) ...@@ -1176,7 +1176,7 @@ a2type(Prog *p)
case AORR: case AORR:
case AAND: case AAND:
case AEOR: case AEOR:
case AMVN: // case AMVN:
case AMUL: case AMUL:
case AMULU: case AMULU:
case ADIV: case ADIV:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment