ref: decc7ec5183715bcd268dd6d6674ff0a94665c27
parent: 4cb032442a1598611c684ca16f58950358502935
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Wed Sep 24 16:45:16 EDT 2014
6c/8c: eleminate moves by swaping source and destination operands in peephole pass
--- a/sys/src/cmd/6c/peep.c
+++ b/sys/src/cmd/6c/peep.c
@@ -407,6 +407,30 @@
case AMOVQL:
return 0;
+ case AORL:
+ case AORQ:
+ case AANDL:
+ case AANDQ:
+ case AXORL:
+ case AXORQ:
+ case AADDL:
+ case AADDQ:
+ case AADCL:
+ case AADCQ:
+ /*
+ * 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:
case AMOVQ:
if(p->to.type == v1->type)
--- a/sys/src/cmd/8c/peep.c
+++ b/sys/src/cmd/8c/peep.c
@@ -315,6 +315,25 @@
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)
goto gotit;