From 0037c93433cdda1dccd35d5fc57682fe1c86eb6d Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Wed, 18 Feb 2015 23:34:33 +0100 Subject: 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. --- sys/src/cmd/6c/peep.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) (limited to 'sys/src/cmd') 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; -- cgit v1.2.3