]> Cypherpunks repositories - gostls13.git/commitdiff
cgen64: dont use MVN instruction
authorKen Thompson <ken@golang.org>
Wed, 9 Feb 2011 01:30:23 +0000 (17:30 -0800)
committerKen Thompson <ken@golang.org>
Wed, 9 Feb 2011 01:30:23 +0000 (17:30 -0800)
R=r
CC=golang-dev
https://golang.org/cl/4154043

src/cmd/5g/cgen64.c
src/cmd/5g/peep.c

index e5604e2394a47d1c83d45ced416d873b6e218c0d..4da8db2ae2042ecedf83696e3ea6b6dfb9f5376b 100644 (file)
@@ -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();
index 32d5d2bd8088b3d34fc80ad4704783ef31d03fc7..b4421a1b4227fa55129922d93c2eb82256dc2ab5 100644 (file)
@@ -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: