+ support for inc/dec/imul in foldarithops

This commit is contained in:
Jonas Maebe 2000-06-14 06:05:06 +00:00
parent 8742406bdd
commit 18dd1f715b

View File

@ -1606,13 +1606,23 @@ Begin
end; end;
{$ifdef foldArithOps} {$ifdef foldArithOps}
Function IsArithOp(opcode: TAsmOp): Boolean; function isFoldableArithOp(hp1: paicpu; reg: tregister): boolean;
Begin begin
IsArithOp := False; IsFoldableArithOp := False;
Case opcode Of case hp1^.opcode of
A_ADD,A_SUB,A_OR,A_XOR,A_AND,A_SHL,A_SHR,A_SAR: IsArithOp := True A_ADD,A_SUB,A_OR,A_XOR,A_AND,A_SHL,A_SHR,A_SAR,A_IMUL:
End; isFoldableArithOp :=
End; ((paicpu(hp1)^.oper[0].typ = top_reg) or
((paicpu(hp1)^.oper[0].typ = top_const) and
(hp1^.opcode <> A_IMUL))) and
(paicpu(hp1)^.oper[1].typ = top_reg) and
(paicpu(hp1)^.oper[1].reg = reg);
A_INC,A_DEC:
isFoldableArithOp :=
(paicpu(hp1)^.oper[0].typ = top_reg) and
(paicpu(hp1)^.oper[0].reg = reg);
end;
end;
{$endif foldArithOps} {$endif foldArithOps}
@ -1823,10 +1833,7 @@ Begin
Else If (Paicpu(p)^.oper[0].typ = top_ref) And Else If (Paicpu(p)^.oper[0].typ = top_ref) And
GetNextInstruction(p,hp1) And GetNextInstruction(p,hp1) And
(hp1^.typ = ait_instruction) And (hp1^.typ = ait_instruction) And
IsArithOp(Paicpu(hp1)^.opcode) And IsFoldableArithOp(paicpu(hp1),Paicpu(p)^.oper[1].reg) And
(Paicpu(hp1)^.oper[0].typ in [top_reg,top_const]) And
(Paicpu(hp1)^.oper[1].typ = top_reg) And
(Paicpu(hp1)^.oper[1].reg = Paicpu(p)^.oper[1].reg) And
GetNextInstruction(hp1,hp2) And GetNextInstruction(hp1,hp2) And
(hp2^.typ = ait_instruction) And (hp2^.typ = ait_instruction) And
(Paicpu(hp2)^.opcode = A_MOV) And (Paicpu(hp2)^.opcode = A_MOV) And
@ -1842,11 +1849,16 @@ Begin
Then Then
{ change mov (ref), reg } { change mov (ref), reg }
{ add/sub/or/... reg2/$const, reg } { add/sub/or/... reg2/$const, reg }
{ mov (reg), ref } { mov reg, (ref) }
{ # release reg } { # release reg }
{ to add/sub/or/... reg2/$const, (ref) } { to add/sub/or/... reg2/$const, (ref) }
Begin Begin
Paicpu(hp1)^.LoadRef(1,newreference(Paicpu(p)^.oper[0].ref^)); case paicpu(hp1)^.opcode of
A_INC,A_DEC:
paicpu(hp1)^.LoadRef(0,newreference(Paicpu(p)^.oper[0].ref^))
else
paicpu(hp1)^.LoadRef(1,newreference(Paicpu(p)^.oper[0].ref^));
end;
AsmL^.Remove(p); AsmL^.Remove(p);
AsmL^.Remove(hp2); AsmL^.Remove(hp2);
Dispose(p,done); Dispose(p,done);
@ -1920,7 +1932,10 @@ End.
{ {
$Log$ $Log$
Revision 1.93 2000-05-23 10:58:46 jonas Revision 1.94 2000-06-14 06:05:06 jonas
+ support for inc/dec/imul in foldarithops
Revision 1.93 2000/05/23 10:58:46 jonas
* fixed bug in "subl $2,%esp; .. ; pushw mem" optimization when the * fixed bug in "subl $2,%esp; .. ; pushw mem" optimization when the
sub comes from setting up the stack frame instead of from aligning sub comes from setting up the stack frame instead of from aligning
esp (I hope) esp (I hope)