mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-11 18:06:12 +02:00
+ removal of "lea (reg), reg)", "imul $1, reg", change "mov reg1, reg2; mov (reg2), reg2" to "mov (reg1), reg2"
This commit is contained in:
parent
8b104e763e
commit
3bf7d9a724
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user