* fixed bug where "imul 12,reg" was replaced with a wrong lea sequence

This commit is contained in:
Jonas Maebe 1998-04-08 19:12:28 +00:00
parent 9b14f1f183
commit 2938e014d2

View File

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