mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 17:59:25 +02:00
* fixed bug where "imul 12,reg" was replaced with a wrong lea sequence
This commit is contained in:
parent
9b14f1f183
commit
2938e014d2
@ -406,6 +406,10 @@ Var LoLab, HiLab, LabDif: Longint;
|
|||||||
TmpRef^.offset := 0;
|
TmpRef^.offset := 0;
|
||||||
Case Longint(Pai386(p)^.op1) Of
|
Case Longint(Pai386(p)^.op1) Of
|
||||||
3: Begin
|
3: Begin
|
||||||
|
{imul 3, reg1, reg2 to
|
||||||
|
lea (reg1,reg1,2), reg2
|
||||||
|
imul 3, reg1 to
|
||||||
|
lea (reg1,reg1,2), reg1}
|
||||||
TmpRef^.base := TRegister(Pai386(p)^.op2);
|
TmpRef^.base := TRegister(Pai386(p)^.op2);
|
||||||
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
||||||
TmpRef^.ScaleFactor := 2;
|
TmpRef^.ScaleFactor := 2;
|
||||||
@ -419,6 +423,10 @@ Var LoLab, HiLab, LabDif: Longint;
|
|||||||
p := hp1;
|
p := hp1;
|
||||||
End;
|
End;
|
||||||
5: Begin
|
5: Begin
|
||||||
|
{imul 5, reg1, reg2 to
|
||||||
|
lea (reg1,reg1,4), reg2
|
||||||
|
imul 5, reg1 to
|
||||||
|
lea (reg1,reg1,4), reg1}
|
||||||
TmpRef^.base := TRegister(Pai386(p)^.op2);
|
TmpRef^.base := TRegister(Pai386(p)^.op2);
|
||||||
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
||||||
TmpRef^.ScaleFactor := 4;
|
TmpRef^.ScaleFactor := 4;
|
||||||
@ -432,6 +440,12 @@ Var LoLab, HiLab, LabDif: Longint;
|
|||||||
p := hp1;
|
p := hp1;
|
||||||
End;
|
End;
|
||||||
6: Begin
|
6: Begin
|
||||||
|
{imul 6, reg1, reg2 to
|
||||||
|
lea (,reg1,2), reg2
|
||||||
|
lea (reg2,reg1,4), reg2
|
||||||
|
imul 6, reg1 to
|
||||||
|
lea (reg1,reg1,2), reg1
|
||||||
|
add reg1, reg1}
|
||||||
If (Opt_Processors <= i486) Then
|
If (Opt_Processors <= i486) Then
|
||||||
Begin
|
Begin
|
||||||
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
||||||
@ -445,10 +459,9 @@ Var LoLab, HiLab, LabDif: Longint;
|
|||||||
End
|
End
|
||||||
Else
|
Else
|
||||||
Begin
|
Begin
|
||||||
TmpRef^.base := R_NO;
|
Dispose(TmpRef);
|
||||||
TmpRef^.ScaleFactor := 2;
|
hp1 := New(Pai386, op_reg_reg(A_ADD, S_L,
|
||||||
hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef,
|
TRegister(Pai386(p)^.op2),TRegister(Pai386(p)^.op2)));
|
||||||
TRegister(Pai386(p)^.op2)));
|
|
||||||
End;
|
End;
|
||||||
hp1^.line := p^.line;
|
hp1^.line := p^.line;
|
||||||
InsertLLItem(p, p^.next, hp1);
|
InsertLLItem(p, p^.next, hp1);
|
||||||
@ -479,6 +492,10 @@ Var LoLab, HiLab, LabDif: Longint;
|
|||||||
Else Dispose(TmpRef);
|
Else Dispose(TmpRef);
|
||||||
End;
|
End;
|
||||||
9: Begin
|
9: Begin
|
||||||
|
{imul 9, reg1, reg2 to
|
||||||
|
lea (reg1,reg1,8), reg2
|
||||||
|
imul 9, reg1 to
|
||||||
|
lea (reg1,reg1,8), reg1}
|
||||||
TmpRef^.base := TRegister(Pai386(p)^.op2);
|
TmpRef^.base := TRegister(Pai386(p)^.op2);
|
||||||
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
||||||
TmpRef^.ScaleFactor := 8;
|
TmpRef^.ScaleFactor := 8;
|
||||||
@ -492,47 +509,33 @@ Var LoLab, HiLab, LabDif: Longint;
|
|||||||
p := hp1;
|
p := hp1;
|
||||||
End;
|
End;
|
||||||
10: Begin
|
10: Begin
|
||||||
|
{imul 10, reg1, reg2 to
|
||||||
|
lea (reg1,reg1,4), reg2
|
||||||
|
add reg2, reg2
|
||||||
|
imul 10, reg1 to
|
||||||
|
lea (reg1,reg1,4), reg1
|
||||||
|
add reg1, reg1}
|
||||||
If (Opt_Processors <= i486) Then
|
If (Opt_Processors <= i486) Then
|
||||||
Begin
|
Begin
|
||||||
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
|
||||||
If (Pai386(p)^.op3t = Top_Reg)
|
If (Pai386(p)^.op3t = Top_Reg)
|
||||||
Then
|
Then
|
||||||
Begin
|
hp1 := New(Pai386, op_reg_reg(A_ADD, S_L,
|
||||||
TmpRef^.base := TRegister(twowords(Pai386(p)^.op2).word2);
|
Tregister(twowords(Pai386(p)^.op2).word2),
|
||||||
TmpRef^.ScaleFactor := 8;
|
Tregister(twowords(Pai386(p)^.op2).word2)))
|
||||||
hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef,
|
Else hp1 := New(Pai386, op_reg_reg(A_ADD, S_L,
|
||||||
Tregister(twowords(Pai386(p)^.op2).word2)));
|
TRegister(Pai386(p)^.op2), TRegister(Pai386(p)^.op2)));
|
||||||
End
|
|
||||||
Else
|
|
||||||
Begin
|
|
||||||
TmpRef^.base := R_NO;
|
|
||||||
TmpRef^.ScaleFactor := 2;
|
|
||||||
hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef,
|
|
||||||
TRegister(Pai386(p)^.op2)));
|
|
||||||
End;
|
|
||||||
hp1^.line := p^.line;
|
hp1^.line := p^.line;
|
||||||
InsertLLItem(p, p^.next, hp1);
|
InsertLLItem(p, p^.next, hp1);
|
||||||
New(TmpRef);
|
TmpRef^.base := TRegister(Pai386(p)^.op2);
|
||||||
TmpRef^.segment := R_DEFAULT_SEG;
|
|
||||||
TmpRef^.symbol := nil;
|
|
||||||
TmpRef^.isintvalue := false;
|
|
||||||
TmpRef^.offset := 0;
|
|
||||||
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
||||||
|
TmpRef^.ScaleFactor := 4;
|
||||||
If (Pai386(p)^.op3t = Top_Reg)
|
If (Pai386(p)^.op3t = Top_Reg)
|
||||||
Then
|
Then
|
||||||
Begin
|
|
||||||
TmpRef^.ScaleFactor := 2;
|
|
||||||
TmpRef^.base := R_NO;
|
|
||||||
hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef,
|
hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef,
|
||||||
TRegister(twowords(Pai386(p)^.op2).word2)));
|
TRegister(twowords(Pai386(p)^.op2).word2)))
|
||||||
End
|
|
||||||
Else
|
Else
|
||||||
Begin
|
|
||||||
TmpRef^.ScaleFactor := 4;
|
|
||||||
TmpRef^.base := TRegister(Pai386(p)^.op2);
|
|
||||||
hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef,
|
hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef,
|
||||||
TRegister(Pai386(p)^.op2)));
|
TRegister(Pai386(p)^.op2)));
|
||||||
End;
|
|
||||||
hp1^.line := p^.line;
|
hp1^.line := p^.line;
|
||||||
InsertLLItem(p^.last, p^.next, hp1);
|
InsertLLItem(p^.last, p^.next, hp1);
|
||||||
Dispose(p, Done);
|
Dispose(p, Done);
|
||||||
@ -541,6 +544,12 @@ Var LoLab, HiLab, LabDif: Longint;
|
|||||||
Else Dispose(TmpRef);
|
Else Dispose(TmpRef);
|
||||||
End;
|
End;
|
||||||
12: Begin
|
12: Begin
|
||||||
|
{imul 12, reg1, reg2 to
|
||||||
|
lea (,reg1,4), reg2
|
||||||
|
lea (,reg1,8) reg2
|
||||||
|
imul 12, reg1 to
|
||||||
|
lea (reg1,reg1,2), reg1
|
||||||
|
lea (,reg1,4), reg1}
|
||||||
If (Opt_Processors <= i486) Then
|
If (Opt_Processors <= i486) Then
|
||||||
Begin
|
Begin
|
||||||
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
||||||
@ -567,17 +576,18 @@ Var LoLab, HiLab, LabDif: Longint;
|
|||||||
TmpRef^.isintvalue := false;
|
TmpRef^.isintvalue := false;
|
||||||
TmpRef^.offset := 0;
|
TmpRef^.offset := 0;
|
||||||
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
TmpRef^.Index := TRegister(Pai386(p)^.op2);
|
||||||
TmpRef^.ScaleFactor := 4;
|
|
||||||
If (Pai386(p)^.op3t = Top_Reg)
|
If (Pai386(p)^.op3t = Top_Reg)
|
||||||
Then
|
Then
|
||||||
Begin
|
Begin
|
||||||
TmpRef^.base := R_NO;
|
TmpRef^.base := R_NO;
|
||||||
|
TmpRef^.ScaleFactor := 4;
|
||||||
hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef,
|
hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef,
|
||||||
TRegister(twowords(Pai386(p)^.op2).word2)));
|
TRegister(twowords(Pai386(p)^.op2).word2)));
|
||||||
End
|
End
|
||||||
Else
|
Else
|
||||||
Begin
|
Begin
|
||||||
TmpRef^.base := TRegister(Pai386(p)^.op2);
|
TmpRef^.base := TRegister(Pai386(p)^.op2);
|
||||||
|
TmpRef^.ScaleFactor := 2;
|
||||||
hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef,
|
hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef,
|
||||||
TRegister(Pai386(p)^.op2)));
|
TRegister(Pai386(p)^.op2)));
|
||||||
End;
|
End;
|
||||||
@ -1478,7 +1488,10 @@ end;
|
|||||||
End.
|
End.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.3 1998-03-29 17:27:58 florian
|
Revision 1.4 1998-04-08 19:12:28 jonas
|
||||||
|
* fixed bug where "imul 12,reg" was replaced with a wrong lea sequence
|
||||||
|
|
||||||
|
Revision 1.3 1998/03/29 17:27:58 florian
|
||||||
* aopt386 compiles with TP
|
* aopt386 compiles with TP
|
||||||
* correct line number is displayed, if a #0 is in the input
|
* correct line number is displayed, if a #0 is in the input
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user