diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-09-24 20:45:16 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-09-24 20:45:16 +0200 |
commit | decc7ec5183715bcd268dd6d6674ff0a94665c27 (patch) | |
tree | 08ec5292d22c52a1ba807e37793470ae69e0640b /sys/src/cmd/6c | |
parent | 4cb032442a1598611c684ca16f58950358502935 (diff) |
6c/8c: eleminate moves by swaping source and destination operands in peephole pass
Diffstat (limited to 'sys/src/cmd/6c')
-rw-r--r-- | sys/src/cmd/6c/peep.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/sys/src/cmd/6c/peep.c b/sys/src/cmd/6c/peep.c index e977b5c1f..e8be730a3 100644 --- a/sys/src/cmd/6c/peep.c +++ b/sys/src/cmd/6c/peep.c @@ -407,6 +407,30 @@ subprop(Reg *r0) 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) |