summaryrefslogtreecommitdiff
path: root/sys/src/cmd/8c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2014-09-24 20:45:16 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2014-09-24 20:45:16 +0200
commitdecc7ec5183715bcd268dd6d6674ff0a94665c27 (patch)
tree08ec5292d22c52a1ba807e37793470ae69e0640b /sys/src/cmd/8c
parent4cb032442a1598611c684ca16f58950358502935 (diff)
6c/8c: eleminate moves by swaping source and destination operands in peephole pass
Diffstat (limited to 'sys/src/cmd/8c')
-rw-r--r--sys/src/cmd/8c/peep.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/sys/src/cmd/8c/peep.c b/sys/src/cmd/8c/peep.c
index 06f668c56..8f0fae88a 100644
--- a/sys/src/cmd/8c/peep.c
+++ b/sys/src/cmd/8c/peep.c
@@ -315,6 +315,25 @@ subprop(Reg *r0)
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;