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.
This commit is contained in:
parent
8210f857f1
commit
0037c93433
1 changed files with 27 additions and 5 deletions
|
@ -121,7 +121,17 @@ loop1:
|
||||||
r1 = rnops(uniqs(r));
|
r1 = rnops(uniqs(r));
|
||||||
if(r1 != R) {
|
if(r1 != R) {
|
||||||
p1 = r1->prog;
|
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;
|
p1->as = AMOVL;
|
||||||
t++;
|
t++;
|
||||||
}
|
}
|
||||||
|
@ -401,10 +411,6 @@ subprop(Reg *r0)
|
||||||
case ACWD:
|
case ACWD:
|
||||||
case ACDQ:
|
case ACDQ:
|
||||||
case ACQO:
|
case ACQO:
|
||||||
|
|
||||||
case AMOVSL:
|
|
||||||
case AMOVSQ:
|
|
||||||
case AMOVQL:
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case AORL:
|
case AORL:
|
||||||
|
@ -432,7 +438,23 @@ subprop(Reg *r0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AMOVL:
|
case AMOVL:
|
||||||
|
case ALEAL:
|
||||||
|
case AMOVSL:
|
||||||
|
case AMOVBLZX:
|
||||||
|
case AMOVBLSX:
|
||||||
|
case AMOVWLZX:
|
||||||
|
case AMOVWLSX:
|
||||||
|
case AMOVQL:
|
||||||
|
|
||||||
case AMOVQ:
|
case AMOVQ:
|
||||||
|
case ALEAQ:
|
||||||
|
case AMOVSQ:
|
||||||
|
case AMOVBQZX:
|
||||||
|
case AMOVBQSX:
|
||||||
|
case AMOVWQZX:
|
||||||
|
case AMOVWQSX:
|
||||||
|
case AMOVLQZX:
|
||||||
|
case AMOVLQSX:
|
||||||
if(p->to.type == v1->type)
|
if(p->to.type == v1->type)
|
||||||
goto gotit;
|
goto gotit;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue