6c/8c: eleminate moves by swaping source and destination operands in peephole pass

This commit is contained in:
cinap_lenrek 2014-09-24 20:45:16 +02:00
parent 4cb032442a
commit decc7ec518
2 changed files with 43 additions and 0 deletions

View file

@ -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)

View file

@ -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;