diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-02-18 23:34:33 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-02-18 23:34:33 +0100 |
commit | 0037c93433cdda1dccd35d5fc57682fe1c86eb6d (patch) | |
tree | c0e588e02678b88866ab4278a2540e50934e6948 /sys/src/cmd | |
parent | 8210f857f1a35ec285c972c2951e80ce8807f736 (diff) |
6c: eleminate more MOV instructions
convert:
x = B || W
MOVxLZX a, r; MOVxQZX r, b -> MOVxQZX a, r; MOVQ r, b
MOVxLSX a, r; MOVxQSX r, r -> MOVxQSX a, r; MOVQ r, r
the MOVQ can then be eleminated by copy propagation.
improve subprop() by accepting other mov and lea
instructions as the source op.
Diffstat (limited to 'sys/src/cmd')
-rw-r--r-- | sys/src/cmd/6c/peep.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/sys/src/cmd/6c/peep.c b/sys/src/cmd/6c/peep.c index e8be730a3..64f13b771 100644 --- a/sys/src/cmd/6c/peep.c +++ b/sys/src/cmd/6c/peep.c @@ -121,7 +121,17 @@ loop1: r1 = rnops(uniqs(r)); if(r1 != R) { p1 = r1->prog; - if(p->as == p1->as && p->to.type == p1->from.type){ + if(p->to.type != p1->from.type) + break; + if((p->as == AMOVBLZX && p1->as == AMOVBQZX) + || (p->as == AMOVWLZX && p1->as == AMOVWQZX) + || (p->as == AMOVBLSX && p1->as == AMOVBQSX && p1->to.type == p->to.type) + || (p->as == AMOVWLSX && p1->as == AMOVWQSX && p1->to.type == p->to.type)) { + p->as = p1->as; + p1->as = AMOVQ; + t++; + } else + if(p->as == p1->as) { p1->as = AMOVL; t++; } @@ -401,10 +411,6 @@ subprop(Reg *r0) case ACWD: case ACDQ: case ACQO: - - case AMOVSL: - case AMOVSQ: - case AMOVQL: return 0; case AORL: @@ -432,7 +438,23 @@ subprop(Reg *r0) break; case AMOVL: + case ALEAL: + case AMOVSL: + case AMOVBLZX: + case AMOVBLSX: + case AMOVWLZX: + case AMOVWLSX: + case AMOVQL: + case AMOVQ: + case ALEAQ: + case AMOVSQ: + case AMOVBQZX: + case AMOVBQSX: + case AMOVWQZX: + case AMOVWQSX: + case AMOVLQZX: + case AMOVLQSX: if(p->to.type == v1->type) goto gotit; break; |