]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/8c/peep.c
8c, 6c: native ROL (cyclic shift) instruction support, improve peephole optimizers
[plan9front.git] / sys / src / cmd / 8c / peep.c
index 06f668c569c23f8dc3f8d53c2b541c48e86d068d..482f17a65c835adce7c1b8e027d5313d5e1a4017 100644 (file)
@@ -264,9 +264,6 @@ subprop(Reg *r0)
                        break;
                p = r->prog;
                switch(p->as) {
-               case ACALL:
-                       return 0;
-
                case AIMULL:
                case AIMULW:
                        if(p->to.type != D_NONE)
@@ -283,6 +280,23 @@ subprop(Reg *r0)
                case AMULL:
                case AMULW:
 
+               case AREP:
+               case AREPN:
+               case ALOOP:
+               case ALOOPNE:
+
+               case ACWD:
+               case ACDQ:
+
+               case ASTOSB:
+               case ASTOSL:
+               case AMOVSB:
+               case AMOVSL:
+               case AFSTSW:
+
+               case ACALL:
+                       return 0;
+
                case AROLB:
                case AROLL:
                case AROLW:
@@ -301,19 +315,28 @@ subprop(Reg *r0)
                case ASHRB:
                case ASHRL:
                case ASHRW:
+                       if(p->from.type == D_CX && v1->type == D_CX)
+                               return 0;
+                       break;
 
-               case AREP:
-               case AREPN:
-
-               case ACWD:
-               case ACDQ:
-
-               case ASTOSB:
-               case ASTOSL:
-               case AMOVSB:
-               case AMOVSL:
-               case AFSTSW:
-                       return 0;
+               case AORL:
+               case AANDL:
+               case AXORL:
+               case AADDL:
+               case AADCL:
+                       /*
+                        * can swap when:
+                        *  ADD R2, R1
+                        *  MOV R1, R2
+                        * convert to:
+                        *  ADD R1, R2
+                        *  MOV R2, R1  / no use for R1
+                        */
+                       if(p->to.type == v1->type && p->from.type == v2->type){
+                               copysub(&p->from, v2, v1, 1);
+                               goto gotit;
+                       }
+                       break;
 
                case AMOVL:
                        if(p->to.type == v1->type)