+ removal of "lea (reg), reg)", "imul $1, reg", change "mov reg1, reg2; mov (reg2), reg2" to "mov (reg1), reg2"

This commit is contained in:
Jonas Maebe 1998-10-02 17:29:56 +00:00
parent 8b104e763e
commit 3bf7d9a724

View File

@ -292,7 +292,28 @@ Begin
Begin
If (Pai386(p)^.op1t = Top_Const) And
(Pai386(p)^.op2t = Top_Reg) And
(Pai386(p)^.Size = S_L) And
(Pai386(p)^.Size = S_L) Then
If (Longint(Pai386(p)^.op1) = 1) Then
If (Pai386(p)^.op3t = Top_None) Then
{remove "imul $1, reg"}
Begin
hp1 := Pai(p^.Next);
AsmL^.Remove(p);
Dispose(p, Done);
p := hp1;
Continue;
End
Else
{change "imul $1, reg1, reg2" to "mov reg1, reg2"}
Begin
hp1 := New(Pai386, Op_Reg_Reg(A_MOV, S_L, TRegister(TwoWords(Pai386(p)^.op2).Word1),
TRegister(TwoWords(Pai386(p)^.op2).Word2)));
hp1^.fileinfo := p^.fileinfo;
InsertLLItem(AsmL, p^.previous, p^.next, hp1);
Dispose(p, Done);
p := hp1;
End
Else If
((Pai386(p)^.op3t = Top_Reg) or
(Pai386(p)^.op3t = Top_None)) And
(aktoptprocessor < ClassP6) And
@ -316,8 +337,8 @@ Begin
lea (reg1,reg1,2), reg2
imul 3, reg1 to
lea (reg1,reg1,2), reg1}
TmpRef^.base := TRegister(Pai386(p)^.op2);
TmpRef^.Index := TRegister(Pai386(p)^.op2);
TmpRef^.base := TRegister(twowords(Pai386(p)^.op2).Word1);
TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
TmpRef^.ScaleFactor := 2;
If (Pai386(p)^.op3t = Top_None)
Then hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef, TRegister(Pai386(p)^.op2)))
@ -333,8 +354,8 @@ Begin
lea (reg1,reg1,4), reg2
imul 5, reg1 to
lea (reg1,reg1,4), reg1}
TmpRef^.base := TRegister(Pai386(p)^.op2);
TmpRef^.Index := TRegister(Pai386(p)^.op2);
TmpRef^.base := TRegister(twowords(Pai386(p)^.op2).Word1);
TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
TmpRef^.ScaleFactor := 4;
If (Pai386(p)^.op3t = Top_None)
Then hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef, TRegister(Pai386(p)^.op2)))
@ -355,7 +376,7 @@ Begin
If (aktoptprocessor <= Class386)
Then
Begin
TmpRef^.Index := TRegister(Pai386(p)^.op2);
TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
If (Pai386(p)^.op3t = Top_Reg)
Then
Begin
@ -377,7 +398,7 @@ Begin
TmpRef^.symbol := nil;
TmpRef^.isintvalue := false;
TmpRef^.offset := 0;
TmpRef^.Index := TRegister(Pai386(p)^.op2);
TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
TmpRef^.ScaleFactor := 2;
If (Pai386(p)^.op3t = Top_Reg)
Then
@ -403,8 +424,8 @@ Begin
lea (reg1,reg1,8), reg2
imul 9, reg1 to
lea (reg1,reg1,8), reg1}
TmpRef^.base := TRegister(Pai386(p)^.op2);
TmpRef^.Index := TRegister(Pai386(p)^.op2);
TmpRef^.base := TRegister(twowords(Pai386(p)^.op2).Word1);
TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
TmpRef^.ScaleFactor := 8;
If (Pai386(p)^.op3t = Top_None)
Then hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef, TRegister(Pai386(p)^.op2)))
@ -433,8 +454,8 @@ Begin
TRegister(Pai386(p)^.op2), TRegister(Pai386(p)^.op2)));
hp1^.fileinfo := p^.fileinfo;
InsertLLItem(AsmL,p, p^.next, hp1);
TmpRef^.base := TRegister(Pai386(p)^.op2);
TmpRef^.Index := TRegister(Pai386(p)^.op2);
TmpRef^.base := TRegister(twowords(Pai386(p)^.op2).Word1);
TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
TmpRef^.ScaleFactor := 4;
If (Pai386(p)^.op3t = Top_Reg)
Then
@ -460,7 +481,7 @@ Begin
If (aktoptprocessor <= Class386)
Then
Begin
TmpRef^.Index := TRegister(Pai386(p)^.op2);
TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
If (Pai386(p)^.op3t = Top_Reg)
Then
Begin
@ -483,7 +504,7 @@ Begin
TmpRef^.symbol := nil;
TmpRef^.isintvalue := false;
TmpRef^.offset := 0;
TmpRef^.Index := TRegister(Pai386(p)^.op2);
TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
If (Pai386(p)^.op3t = Top_Reg)
Then
Begin
@ -517,15 +538,25 @@ Begin
(PReference(Pai386(p)^.op1)^.Index = R_NO) And
(PReference(Pai386(p)^.op1)^.Offset = 0) And
(Not(Assigned(PReference(Pai386(p)^.op1)^.Symbol))) Then
Begin
hp1 := New(Pai386, op_reg_reg(A_MOV, S_L,PReference(Pai386(p)^.op1)^.Base,
TRegister(Pai386(p)^.op2)));
hp1^.fileinfo := p^.fileinfo;
InsertLLItem(AsmL,p^.previous,p^.next, hp1);
Dispose(p, Done);
p := hp1;
Continue;
End;
If (PReference(Pai386(p)^.op1)^.Base <> TRegister(Pai386(p)^.op2))
Then
Begin
hp1 := New(Pai386, op_reg_reg(A_MOV, S_L,PReference(Pai386(p)^.op1)^.Base,
TRegister(Pai386(p)^.op2)));
hp1^.fileinfo := p^.fileinfo;
InsertLLItem(AsmL,p^.previous,p^.next, hp1);
Dispose(p, Done);
p := hp1;
Continue;
End
Else
Begin
hp1 := Pai(p^.Next);
AsmL^.Remove(p);
Dispose(p, Done);
p := hp1;
Continue;
End;
End;
A_MOV:
Begin
@ -1299,6 +1330,31 @@ Begin
Ait_Instruction:
Begin
Case Pai386(p)^._operator Of
A_MOV:
Begin
If (Pai386(p)^.op1t = top_reg) And
(Pai386(p)^.op2t = top_reg) And
GetNextInstruction(p, hp1) And
(hp1^.typ = ait_Instruction) And
(Pai386(hp1)^._operator = A_MOV) And
(Pai386(hp1)^.op1t = top_ref) And
(Pai386(hp1)^.op2t = top_reg) And
((TReference(Pai386(hp1)^.op1^).Base = TRegister(Pai386(p)^.op2)) Or
(TReference(Pai386(hp1)^.op1^).Index = TRegister(Pai386(p)^.op2))) And
(TRegister(Pai386(hp1)^.op2) = TRegister(Pai386(p)^.op2)) Then
{mov reg1, reg2
mov (reg2, ..), reg2 to mov (reg1, ..), reg2}
Begin
If (TReference(Pai386(hp1)^.op1^).Base = TRegister(Pai386(p)^.op2)) Then
TReference(Pai386(hp1)^.op1^).Base := TRegister(Pai386(p)^.op1);
If (TReference(Pai386(hp1)^.op1^).Index = TRegister(Pai386(p)^.op2)) Then
TReference(Pai386(hp1)^.op1^).Index := TRegister(Pai386(p)^.op1);
AsmL^.Remove(p);
Dispose(p, Done);
p := hp1;
Continue;
End;
End;
A_MOVZX:
Begin
If (Pai386(p)^.op2t = top_reg) Then
@ -1363,7 +1419,10 @@ End.
{
$Log$
Revision 1.16 1998-10-01 20:19:57 jonas
Revision 1.17 1998-10-02 17:29:56 jonas
+ removal of "lea (reg), reg)", "imul $1, reg", change "mov reg1, reg2; mov (reg2), reg2" to "mov (reg1), reg2"
Revision 1.16 1998/10/01 20:19:57 jonas
* moved UpdateUsedRegs (+ bugfix) to daopt386
Revision 1.15 1998/09/30 12:18:29 peter